Ogre 获取实体顶点和索引
2012-03-30 16:57
351 查看
bool added_shared = false;
size_t current_offset = 0;
size_t shared_offset = 0;
size_t next_offset = 0;
size_t index_offset = 0;
size_t index_count = 0;
size_t vertex_count = 0;
MeshPtr ogreHeadMesh = polacub1->getMesh();
for(unsigned short i = 0; i< ogreHeadMesh->getNumSubMeshes(); i++)
{
SubMesh * submesh = ogreHeadMesh->getSubMesh(i);
if(submesh->useSharedVertices)
{
if(!added_shared)
{
vertex_count += ogreHeadMesh->sharedVertexData->vertexCount;
added_shared = true;
}
}
else
{
vertex_count += submesh->vertexData->vertexCount;
}
index_count += submesh->indexData->indexCount;
}
Ogre::Vector3* vertices = new Vector3[vertex_count];
long* indices = new long[index_count];
for(unsigned short i = 0; i < ogreHeadMesh->getNumSubMeshes(); i++)
{
SubMesh* submesh = ogreHeadMesh->getSubMesh(i);
VertexData* vertex_data = submesh->useSharedVertices ? ogreHeadMesh->sharedVertexData : submesh->vertexData;
if((!submesh->useSharedVertices) || (submesh->useSharedVertices && !added_shared))
{
if(submesh->useSharedVertices)
{
added_shared = true;
shared_offset = current_offset;
}
const 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);
Vector3 pt(pReal[0],pReal[1],pReal[2]);
vertices[current_offset+j] = (Quaternion::IDENTITY * (pt * Vector3::UNIT_SCALE)) + Vector3::ZERO;
}
vbuf->unlock();
next_offset += vertex_data->vertexCount;
}
IndexData* index_data = submesh->indexData;
size_t numTris = index_data->indexCount / 3;
Ogre::HardwareIndexBufferSharedPtr ibuf = index_data->indexBuffer;
bool use32bitindexs = (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(use32bitindexs)
{
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;
}
size_t current_offset = 0;
size_t shared_offset = 0;
size_t next_offset = 0;
size_t index_offset = 0;
size_t index_count = 0;
size_t vertex_count = 0;
MeshPtr ogreHeadMesh = polacub1->getMesh();
for(unsigned short i = 0; i< ogreHeadMesh->getNumSubMeshes(); i++)
{
SubMesh * submesh = ogreHeadMesh->getSubMesh(i);
if(submesh->useSharedVertices)
{
if(!added_shared)
{
vertex_count += ogreHeadMesh->sharedVertexData->vertexCount;
added_shared = true;
}
}
else
{
vertex_count += submesh->vertexData->vertexCount;
}
index_count += submesh->indexData->indexCount;
}
Ogre::Vector3* vertices = new Vector3[vertex_count];
long* indices = new long[index_count];
for(unsigned short i = 0; i < ogreHeadMesh->getNumSubMeshes(); i++)
{
SubMesh* submesh = ogreHeadMesh->getSubMesh(i);
VertexData* vertex_data = submesh->useSharedVertices ? ogreHeadMesh->sharedVertexData : submesh->vertexData;
if((!submesh->useSharedVertices) || (submesh->useSharedVertices && !added_shared))
{
if(submesh->useSharedVertices)
{
added_shared = true;
shared_offset = current_offset;
}
const 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);
Vector3 pt(pReal[0],pReal[1],pReal[2]);
vertices[current_offset+j] = (Quaternion::IDENTITY * (pt * Vector3::UNIT_SCALE)) + Vector3::ZERO;
}
vbuf->unlock();
next_offset += vertex_data->vertexCount;
}
IndexData* index_data = submesh->indexData;
size_t numTris = index_data->indexCount / 3;
Ogre::HardwareIndexBufferSharedPtr ibuf = index_data->indexBuffer;
bool use32bitindexs = (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(use32bitindexs)
{
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;
}
相关文章推荐
- ogre 获取实体中的所有材质
- Ogre中mesh的顶点数据与索引数据
- ogre获取Mesh的顶点数组和索引数组
- Ogre中获取mesh顶点数据
- Ogre处理顶点/索引数据
- Ogre-获取场景中的所有实体
- Ogre 处理顶点/索引数据
- 鼠标经过datagrid,获取索引
- ogre 使用 shader 要自己做一些mesh 的顶点声明等操作
- Java获取数据库表列信息、索引信息、存储过程等信息
- 另一种获取对应图片索引的方法(不用name取名)
- 转载:OGRE一起学(一)获取OGRE
- Oracle获取建表、索引语句
- 获取GridView当前行的索引值的方法汇总
- 获取GridView中RowCommand的当前选中行的索引或主键Id《转》
- javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
- 用事件委托获取每一个LI的索引值 有问题
- java:retainAll获取俩个自定义实体对象集合的重叠数据
- 获取dbgrid的行索引
- 获取数据库表的信息(大小,索引大小,创建时间,行数)