您的位置:首页 > Web前端

Ogre处理顶点/索引数据

2012-09-14 16:01 483 查看
原文摘自:http://blog.csdn.net/zhuxiaoyang2000/article/details/6565962

zhuxiaoyang2000的博客。

下面是我的应用:

void GameState::updateMesh(const Ogre::MeshPtr mesh)
{
bool added_shared=false;
size_t current_offset=0;
size_t shared_offset=0;
size_t next_offset=0;
for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
{
Ogre::SubMesh* submesh=mesh->getSubMesh(i);
Ogre::VertexData* vertex_data=submesh->useSharedVertices?mesh->sharedVertexData:submesh->vertexData;
if((!submesh->useSharedVertices)||(submesh->useSharedVertices&&!added_shared))
{
if(submesh->useSharedVertices)
{
added_shared=true;
shared_offset=current_offset;
}
const Ogre::VertexElement* posElem=vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr vbuf=vertex_data->vertexBufferBinding->getBuffer(posElem->getSource());
unsigned char* vertex=static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_NORMAL));
float *pReal;
for(size_t j=0;j<vertex_data->vertexCount;j++,vertex+=vbuf->getVertexSize())
{
//get vertex data
posElem->baseVertexPointerToElement(vertex,&pReal);
pReal[2]+=10;
}
vbuf->unlock();
next_offset+=vertex_data->vertexCount;
}
}
}
void GameState::getMeshInfo(const Ogre::MeshPtr mesh,
size_t &vertex_count,
Ogre::Vector3* &vertices,
size_t &index_count,
unsigned long* &indices,
const Ogre::Vector3& position,
const Ogre::Quaternion &orient,
const Ogre::Vector3& scale)
{
bool added_shared=false;
size_t current_offset=0;
size_t shared_offset=0;
size_t next_offset=0;
size_t index_offset=0;
vertex_count=index_count=0; //索引的总数和顶点的总数
//计算需要多少个索引顶点和顶点
for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
{
Ogre::SubMesh* submesh=mesh->getSubMesh(i);
//we only need to add the shared vertices once
if(submesh->useSharedVertices)
{
if(!added_shared)
{
vertex_count+=mesh->sharedVertexData->vertexCount;
added_shared=true;
}
}
else
{
vertex_count+=submesh->vertexData->vertexCount;
}
//Add the indices
index_count+=submesh->indexData->indexCount;
}
//为顶点和索引缓存申请内存空间
vertices=new Ogre::Vector3[vertex_count];
indices=new unsigned long[index_count];
added_shared=false;

//Run through the submeshes again adding the data into arrays
for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
{
Ogre::SubMesh* submesh=mesh->getSubMesh(i);
Ogre::VertexData* vertex_data=submesh->useSharedVertices?mesh->sharedVertexData:submesh->vertexData;
if((!submesh->useSharedVertices)||(submesh->useSharedVertices &&!added_shared))
{//没有使用共享顶点 或者是使用共享顶点并且added_shared==false

//如果是共享顶点的方式的
if(submesh->useSharedVertices)
{
added_shared=true;
shared_offset=current_offset;
}
const Ogre::VertexElement* posElem=vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr vbuf=vertex_data->vertexBufferBinding->getBuffer(posElem->getSource());
unsigned char* vertex=static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
float* pReal;
for(size_t j=0;j<vertex_data->vertexCount;++j,vertex+=vbuf->getVertexSize())
{
posElem->baseVertexPointerToElement(vertex,&pReal);
Ogre::Vector3 pt(pReal[0],pReal[1],pReal[2]);
vertices[current_offset+j]=(orient*(pt*scale))+position;
}
vbuf->unlock();
next_offset+=vertex_data->vertexCount;
}

Ogre::IndexData* index_data=submesh->indexData;//获得索引缓存
size_t numTris=index_data->indexCount/3;//三角形数目
Ogre::HardwareIndexBufferSharedPtr ibuf=index_data->indexBuffer;
bool use32bitindexes=(ibuf->getType()==Ogre::HardwareIndexBuffer::IT_32BIT);
unsigned long* pLong=static_cast<unsigned long*>(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
unsigned short* pShort=reinterpret_cast<unsigned short*>(pLong);//如果不是32位的话 使用
size_t offset=(submesh->useSharedVertices)?shared_offset:current_offset; //获得偏移量
if(use32bitindexes)
{
for(size_t k=0;k<numTris*3;++k)
{
indices[index_offset++]=pLong[k]+static_cast<unsigned long>(offset);
}
}
else
{
for(size_t k=0;k<numTris*3;++k)
{
indices[index_offset++]=static_cast<unsigned long>(pShort[k])+
static_cast<unsigned long>(offset);
}
}
ibuf->unlock();
current_offset=next_offset;
}
}
void GameState::createColourCube()
{
Ogre::MeshPtr msh=MeshManager::getSingleton().createManual(
"ColourCube","General");
//create one submesh
SubMesh* sub=msh->createSubMesh();
const float sqrt13=0.577350269f;
//定义顶点 ,8个顶点,每个顶点包含2组
const size_t nVertices=8;
const size_t nbufCount=3*2*nVertices;
float vertices[nbufCount]=
{
-100.0,100.0,-100.0, //0 position
-sqrt13,sqrt13,-sqrt13, //0 normal
100.0,100.0,-100.0, //1 position
sqrt13,sqrt13,-sqrt13, //1 normal
100.0,-100.0,-100.0, //2 position
sqrt13,-sqrt13,-sqrt13, //2 normal
-100.0,-100.0,-100.0, //3 position
-sqrt13,-sqrt13,-sqrt13, //3 normal
-100.0,100.0,100.0, //4 position
-sqrt13,sqrt13,sqrt13, //4 normal
100.0,100.0,100.0, //5 position
sqrt13,sqrt13,sqrt13, //5 normal
100.0,-100.0,100.0, //6 position
sqrt13,-sqrt13,sqrt13, //6 normal
-100.0,-100.0,100.0, //7 position
-sqrt13,-sqrt13,sqrt13, //7 normal

};
RenderSystem* rs=Root::getSingleton().getRenderSystem();
RGBA colours[nVertices];
RGBA *pColour=colours; //用于保存顶点的颜色 从 0到7
//
// Use render system to convert colour value since colour packing varies
rs->convertColourValue(ColourValue(1.0,0.0,0.0), pColour++); //0 colour
rs->convertColourValue(ColourValue(1.0,1.0,0.0), pColour++); //1 colour
rs->convertColourValue(ColourValue(0.0,1.0,0.0), pColour++); //2 colour
rs->convertColourValue(ColourValue(0.0,0.0,0.0), pColour++); //3 colour
rs->convertColourValue(ColourValue(1.0,0.0,1.0), pColour++); //4 colour
rs->convertColourValue(ColourValue(1.0,1.0,1.0), pColour++); //5 colour
rs->convertColourValue(ColourValue(0.0,1.0,1.0), pColour++); //6 colour
rs->convertColourValue(ColourValue(0.0,0.0,1.0), pColour++); //7 colour
//Define 12 个三角形
const size_t ibufCount=36;
unsigned short faces[ibufCount]=
{
0,2,3,
0,1,2,
1,6,2,
1,5,6,
4,6,5,
4,7,6,
0,7,4,
0,3,7,
0,5,1,
0,4,5,
2,7,3,
2,6,7
};
//create vertex data structure for 8 vertices shared between submeshes
msh->sharedVertexData=new VertexData();
msh->sharedVertexData->vertexCount=nVertices;

//创建顶点声明
VertexDeclaration* decl=msh->sharedVertexData->vertexDeclaration;
size_t offset=0;
decl->addElement(0,offset,VET_FLOAT3,VES_POSITION);
offset+=VertexElement::getTypeSize(VET_FLOAT3);
decl->addElement(0,offset,VET_FLOAT3,VES_NORMAL);
offset+=VertexElement::getTypeSize(VET_FLOAT3);
//decl->addElement(0,offset,VET_COLOUR,VES_DIFFUSE);
//offset+=VertexElement::getTypeSize(VET_COLOUR);

HardwareVertexBufferSharedPtr vbuf=
HardwareBufferManager::getSingleton().createVertexBuffer(
offset,msh->sharedVertexData->vertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
//upload the vertex data to the card
vbuf->writeData(0,vbuf->getSizeInBytes(),vertices,true);
//set vertex buffer binding so buffer 0 is bound to our vertex buffer
VertexBufferBinding* bind=msh->sharedVertexData->vertexBufferBinding;
bind->setBinding(0,vbuf);

////2nd buffer
offset=0;
decl->addElement(1,offset,VET_COLOUR,VES_DIFFUSE);
offset+=VertexElement::getTypeSize(VET_COLOUR);
vbuf=HardwareBufferManager::getSingleton().createVertexBuffer(
offset,msh->sharedVertexData->vertexCount,
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
vbuf->writeData(0,vbuf->getSizeInBytes(),pColour,true);
bind->setBinding(1,vbuf);

//Allocate index buffer of the requested number of vertices
HardwareIndexBufferSharedPtr ibuf=HardwareBufferManager::getSingleton().createIndexBuffer(
HardwareIndexBuffer::IT_16BIT,ibufCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
//upload the index data to the card
ibuf->writeData(0,ibuf->getSizeInBytes(),faces,true);
//set parameters of the submesh
sub->useSharedVertices=true;
sub->indexData->indexBuffer=ibuf;
sub->indexData->indexCount=ibufCount;
sub->indexData->indexStart=0;
msh->_setBounds(AxisAlignedBox(-100,-100,-100,100,100,100));
msh->_setBoundingSphereRadius(Math::Sqrt(3*100*100));
msh->load();
}

void GameState::createScene()
{
createColourCube();
MaterialPtr material = MaterialManager::getSingleton().create(
"Test/ColourTest", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
material->getTechnique(0)->getPass(0)->setVertexColourTracking(TVC_AMBIENT);
Entity* thisEntity = m_pSceneMgr->createEntity("hello", "ColourCube");
thisEntity->setMaterialName("Test/ColourTest");
updateMesh(thisEntity->getMesh());
SceneNode* thisSceneNode = m_pSceneMgr->getRootSceneNode()->createChildSceneNode();
thisSceneNode->attachObject(thisEntity);
size_t vertex_count,index_count;
Ogre::Vector3* vertices;
unsigned long* indices;
getMeshInfo(thisEntity->getMesh(),
vertex_count,vertices,index_count,indices);
Ogre::String output;
stringstream ss;
ss<<"*******************Vertices in mesh:";
ss<<vertices[0].x<<" "<<vertices[0].y<<" "<<vertices[0].z<<" ";
ss<<vertices[1].x<<" "<<vertices[1].y<<" "<<vertices[1].z<<" ";
ss<<vertices[2].x<<" "<<vertices[2].y<<" "<<vertices[2].z<<" ";
ss<<vertices[3].x<<" "<<vertices[3].y<<" "<<vertices[3].z<<" ";
ss<<vertices[4].x<<" "<<vertices[4].y<<" "<<vertices[4].z<<" ";
ss<<vertices[5].x<<" "<<vertices[5].y<<" "<<vertices[5].z<<" ";
ss<<vertices[6].x<<" "<<vertices[6].y<<" "<<vertices[6].z<<" ";
ss<<vertices[7].x<<" "<<vertices[7].y<<" "<<vertices[7].z<<" ";
ss<<"************************";
output=ss.str();
LogManager::getSingleton().logMessage(output);
}
在这之后,就可以查看Log文件打印出来的点的坐标了。


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息