Ogre中获取mesh顶点数据
2017-03-20 16:55
1171 查看
void getMeshInfo(Entity* ent) { MeshPtr mesh = ent->getMesh(); bool added_shared = false; size_t current_offset = 0; size_t shared_offset = 0; size_t index_offset = 0; size_t next_offset = 0; size_t vertex_count = 0; size_t index_count = 0; for(unsigned short i = 0; i < mesh->getNumSubMeshes(); ++i) { SubMesh* submesh = mesh->getSubMesh(i); if(submesh->useSharedVertices) { if(!added_shared) { vertex_count += mesh->sharedVertexData->vertexCount; added_shared = true; } } else { vertex_count += submesh->vertexData->vertexCount; } index_count += submesh->indexData->indexCount; } added_shared = false; std::vector<Vector3> vertices(vertex_count); std::vector<unsigned long> indices(index_count); for(unsigned int i = 0; i < mesh->getNumSubMeshes(); ++i) { SubMesh* submesh = mesh->getSubMesh(i); //get vertex info 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 VertexElement* posElem = vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION); 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(unsigned int j = 0; j < vertex_data->vertexCount; j++, vertex += vbuf->getVertexSize()) { posElem->baseVertexPointerToElement(vertex, &pReal); vertices[current_offset + j ] = Vector3(pReal[0], pReal[1], pReal[2]); } vbuf->unlock(); next_offset += vertex_data->vertexCount; } //get index info IndexData* index_data = submesh->indexData; size_t numTris = index_data->indexCount/3; 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); size_t offset = (submesh->useSharedVertices) ? shared_offset : current_offset; if(use32bitindexes) { for(unsigned int 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] 950c ) + static_cast<unsigned long>(offset); } } ibuf->unlock(); current_offset = next_offset; } vertexArr = vertices; indexArr = indices; }
相关文章推荐
- ogre获取Mesh的顶点数组和索引数组
- Ogre中mesh的顶点数据与索引数据
- Ogre 处理顶点/索引数据
- Ogre 获取实体顶点和索引
- 从mesh(.x文件)里获取指定格式的顶点,输出到文件中
- Ogre的mesh和skeleton文件数据格式分析
- Ogre的mesh和skeleton文件数据格式分析
- Ogre的mesh和skeleton数据格式分析
- Ogre的mesh和skeleton数据格式分析
- NodeVisitor的使用-遍历Geode节点下的Geometry并获取顶点、法向量等数据
- Ogre处理顶点/索引数据
- ogre 使用 shader 要自己做一些mesh 的顶点声明等操作
- Ogre中mesh共享顶点缓存的使用
- Ogre的mesh和skeleton文件数据格式分析
- 类似Xmlhttp获取数据的Flex方法~
- 自动获取表格数据添加,修改数据库数据的类
- (原创)自动获取表格数据添加,修改数据库数据的类
- 在Winform中,获取DataGrid当前选定行对应的数据
- 获取表的列信息,包括列名,列数据类型,主键列..
- XmlHttp异步获取网站数据的例子