Ogre处理顶点/索引数据

来源:互联网 发布:php环境安装包 编辑:程序博客网 时间:2024/05/14 10:32

原文摘自: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 dataposElem->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 onceif(submesh->useSharedVertices){if(!added_shared){vertex_count+=mesh->sharedVertexData->vertexCount;added_shared=true;}}else{vertex_count+=submesh->vertexData->vertexCount;}//Add the indicesindex_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 arraysfor(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 submeshSubMesh* 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文件打印出来的点的坐标了。