Ogre中获取mesh顶点数据

本文介绍了一个用于从Ogre引擎中的实体获取网格信息的方法。该方法能够遍历网格的所有子网格,提取顶点和索引信息,并处理共享顶点的情况。通过锁定硬件缓冲区并读取顶点位置数据,最终收集所有必要的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	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]) + static_cast<unsigned long>(offset);
				}
			}
			ibuf->unlock();
			current_offset = next_offset;
		 }
		 vertexArr = vertices;
		 indexArr = indices;

	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值