Ogre处理顶点/索引数据

原文摘自:http://blog.csdn.net/zhuxiaoyang2000/article/details/6565962

zhuxiaoyang2000的博客。

下面是我的应用:

void GameState::updateMesh(const Ogre::MeshPtr mesh)
{
	bool added_shared=false;
	size_t current_offset=0;
	size_t shared_offset=0;
	size_t next_offset=0;
	for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
	{
		Ogre::SubMesh* submesh=mesh->getSubMesh(i);
		Ogre::VertexData* vertex_data=submesh->useSharedVertices?mesh->sharedVertexData:submesh->vertexData;
		if((!submesh->useSharedVertices)||(submesh->useSharedVertices&&!added_shared))
		{
			if(submesh->useSharedVertices)
			{
				added_shared=true;
				shared_offset=current_offset;
			}
			const Ogre::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_NORMAL));
			float *pReal;
			for(size_t j=0;j<vertex_data->vertexCount;j++,vertex+=vbuf->getVertexSize())
			{
				//get vertex data
				posElem->baseVertexPointerToElement(vertex,&pReal);
				pReal[2]+=10;
			}
			vbuf->unlock();
			next_offset+=vertex_data->vertexCount;
		}
	}
}
void GameState::getMeshInfo(const Ogre::MeshPtr mesh,
							size_t &vertex_count,
							Ogre::Vector3* &vertices,
							size_t &index_count,
							unsigned long* &indices,
							const Ogre::Vector3& position,
							const Ogre::Quaternion &orient,
							const Ogre::Vector3& scale)
{
	bool added_shared=false;
	size_t current_offset=0;
	size_t shared_offset=0;
	size_t next_offset=0;
	size_t index_offset=0;
	vertex_count=index_count=0; //索引的总数和顶点的总数
	//计算需要多少个索引顶点和顶点
	for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
	{
		Ogre::SubMesh* submesh=mesh->getSubMesh(i);
		//we only need to add the shared vertices once
		if(submesh->useSharedVertices)
		{
			if(!added_shared)
			{
				vertex_count+=mesh->sharedVertexData->vertexCount;
				added_shared=true;
			}
		}
		else
		{
			vertex_count+=submesh->vertexData->vertexCount;
		}
		//Add the indices
		index_count+=submesh->indexData->indexCount; 
	}
	//为顶点和索引缓存申请内存空间
	vertices=new Ogre::Vector3[vertex_count]; 
	indices=new unsigned long[index_count];
	added_shared=false;


	//Run through the submeshes again adding the data into arrays
	for(unsigned short i=0;i<mesh->getNumSubMeshes();++i)
	{
		Ogre::SubMesh* submesh=mesh->getSubMesh(i);
		Ogre::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 Ogre::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);
				Ogre::Vector3 pt(pReal[0],pReal[1],pReal[2]);
				vertices[current_offset+j]=(orient*(pt*scale))+position;
			}
			vbuf->unlock();
			next_offset+=vertex_data->vertexCount;
		}

		Ogre::IndexData* index_data=submesh->indexData;//获得索引缓存
		size_t numTris=index_data->indexCount/3;//三角形数目
		Ogre::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);//如果不是32位的话 使用
		size_t offset=(submesh->useSharedVertices)?shared_offset:current_offset; //获得偏移量
		if(use32bitindexes)
		{
			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;
	}
}
void GameState::createColourCube()
{
	Ogre::MeshPtr msh=MeshManager::getSingleton().createManual(
		"ColourCube","General");
	//create one submesh
	SubMesh* sub=msh->createSubMesh();
	const float sqrt13=0.577350269f;
	//定义顶点 ,8个顶点,每个顶点包含2组
	const size_t nVertices=8;
	const size_t nbufCount=3*2*nVertices;
	float vertices[nbufCount]=
	{
		  -100.0,100.0,-100.0, //0 position   
		-sqrt13,sqrt13,-sqrt13, //0 normal  
			 100.0,100.0,-100.0, //1 position   
			sqrt13,sqrt13,-sqrt13, //1 normal   
			100.0,-100.0,-100.0, //2 position   
			sqrt13,-sqrt13,-sqrt13, //2 normal   
			-100.0,-100.0,-100.0, //3 position  
			-sqrt13,-sqrt13,-sqrt13, //3 normal   
			-100.0,100.0,100.0, //4 position   
			-sqrt13,sqrt13,sqrt13, //4 normal   
			100.0,100.0,100.0, //5 position  
			 sqrt13,sqrt13,sqrt13, //5 normal   
			100.0,-100.0,100.0, //6 position   
			sqrt13,-sqrt13,sqrt13, //6 normal   
			-100.0,-100.0,100.0, //7 position  
			-sqrt13,-sqrt13,sqrt13, //7 normal  

	};
	RenderSystem* rs=Root::getSingleton().getRenderSystem();
	RGBA colours[nVertices];
	RGBA *pColour=colours; //用于保存顶点的颜色 从 0到7
	//
	    // Use render system to convert colour value since colour packing varies   
    rs->convertColourValue(ColourValue(1.0,0.0,0.0), pColour++); //0 colour  
   rs->convertColourValue(ColourValue(1.0,1.0,0.0), pColour++); //1 colour   
  rs->convertColourValue(ColourValue(0.0,1.0,0.0), pColour++); //2 colour   
   rs->convertColourValue(ColourValue(0.0,0.0,0.0), pColour++); //3 colour   
  rs->convertColourValue(ColourValue(1.0,0.0,1.0), pColour++); //4 colour  
  rs->convertColourValue(ColourValue(1.0,1.0,1.0), pColour++); //5 colour   
  rs->convertColourValue(ColourValue(0.0,1.0,1.0), pColour++); //6 colour   
  rs->convertColourValue(ColourValue(0.0,0.0,1.0), pColour++); //7 colour   
  //Define 12 个三角形
  const size_t ibufCount=36;
  unsigned short faces[ibufCount]=
  {
	  0,2,3,
	  0,1,2,
	  1,6,2,
	  1,5,6,
	  4,6,5,
	  4,7,6,
	  0,7,4,
	  0,3,7,   
      0,5,1,   
      0,4,5,   
      2,7,3,   
      2,6,7   
  };
  //create vertex data structure for 8 vertices shared between submeshes
  msh->sharedVertexData=new VertexData();
  msh->sharedVertexData->vertexCount=nVertices;

  //创建顶点声明
  VertexDeclaration* decl=msh->sharedVertexData->vertexDeclaration;
  size_t offset=0;
  decl->addElement(0,offset,VET_FLOAT3,VES_POSITION);
  offset+=VertexElement::getTypeSize(VET_FLOAT3);
  decl->addElement(0,offset,VET_FLOAT3,VES_NORMAL);
  offset+=VertexElement::getTypeSize(VET_FLOAT3);
  //decl->addElement(0,offset,VET_COLOUR,VES_DIFFUSE);
  //offset+=VertexElement::getTypeSize(VET_COLOUR);



  HardwareVertexBufferSharedPtr vbuf=
	  HardwareBufferManager::getSingleton().createVertexBuffer(
	  offset,msh->sharedVertexData->vertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
  //upload the vertex data to the card
  vbuf->writeData(0,vbuf->getSizeInBytes(),vertices,true);
  //set vertex buffer binding so buffer 0 is bound to our vertex buffer
  VertexBufferBinding* bind=msh->sharedVertexData->vertexBufferBinding;
  bind->setBinding(0,vbuf);
 

  2nd buffer
  offset=0;
  decl->addElement(1,offset,VET_COLOUR,VES_DIFFUSE);
  offset+=VertexElement::getTypeSize(VET_COLOUR);
  vbuf=HardwareBufferManager::getSingleton().createVertexBuffer(
	  offset,msh->sharedVertexData->vertexCount,
	  HardwareBuffer::HBU_STATIC_WRITE_ONLY);
  vbuf->writeData(0,vbuf->getSizeInBytes(),pColour,true);
  bind->setBinding(1,vbuf);

  //Allocate index buffer of the requested number of vertices
  HardwareIndexBufferSharedPtr ibuf=HardwareBufferManager::getSingleton().createIndexBuffer(
	  HardwareIndexBuffer::IT_16BIT,ibufCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
  //upload the index data to the card
  ibuf->writeData(0,ibuf->getSizeInBytes(),faces,true);
  //set parameters of the submesh
  sub->useSharedVertices=true;
  sub->indexData->indexBuffer=ibuf;
  sub->indexData->indexCount=ibufCount;
  sub->indexData->indexStart=0;
  msh->_setBounds(AxisAlignedBox(-100,-100,-100,100,100,100));
  msh->_setBoundingSphereRadius(Math::Sqrt(3*100*100));
  msh->load();
}

void GameState::createScene()
{
	createColourCube();
	MaterialPtr material = MaterialManager::getSingleton().create(
      "Test/ColourTest", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
	material->getTechnique(0)->getPass(0)->setVertexColourTracking(TVC_AMBIENT);
	Entity* thisEntity = m_pSceneMgr->createEntity("hello", "ColourCube");
	thisEntity->setMaterialName("Test/ColourTest");
	updateMesh(thisEntity->getMesh());
	SceneNode* thisSceneNode = m_pSceneMgr->getRootSceneNode()->createChildSceneNode();
	thisSceneNode->attachObject(thisEntity);
	size_t vertex_count,index_count;
	Ogre::Vector3* vertices;
	unsigned long* indices;
	getMeshInfo(thisEntity->getMesh(),
		vertex_count,vertices,index_count,indices);
	Ogre::String output;
	stringstream ss;
	ss<<"*******************Vertices in mesh:";
	ss<<vertices[0].x<<" "<<vertices[0].y<<" "<<vertices[0].z<<" ";
	ss<<vertices[1].x<<" "<<vertices[1].y<<" "<<vertices[1].z<<" ";
	ss<<vertices[2].x<<" "<<vertices[2].y<<" "<<vertices[2].z<<" ";
	ss<<vertices[3].x<<" "<<vertices[3].y<<" "<<vertices[3].z<<" ";
	ss<<vertices[4].x<<" "<<vertices[4].y<<" "<<vertices[4].z<<" ";
	ss<<vertices[5].x<<" "<<vertices[5].y<<" "<<vertices[5].z<<" ";
	ss<<vertices[6].x<<" "<<vertices[6].y<<" "<<vertices[6].z<<" ";
	ss<<vertices[7].x<<" "<<vertices[7].y<<" "<<vertices[7].z<<" ";
	ss<<"************************";
	output=ss.str();
	LogManager::getSingleton().logMessage(output);
}
在这之后,就可以查看Log文件打印出来的点的坐标了。


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值