您的位置:首页 > 其它

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;

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