Ogre 获取实体顶点和索引

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;

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值