i want to change the vertex of a mesh.
and i wrote code:
Code: Select all
Ogre::Entity* tE = mSceneMgr->getEntity("Head");
Ogre::MeshPtr headM = tE->getMesh();
for (int i = 0; i < headM->getNumSubMeshes(); i++)
{
Ogre::SubMesh* submesh = headM->getSubMesh(i);
Ogre::VertexData* vertex_data = submesh->useSharedVertices ? headM->sharedVertexData :
submesh->vertexData;
bool added_shared = false;
size_t current_offset = 0;
size_t shared_offset = 0;
size_t next_offset = 0;
if ((!submesh->useSharedVertices) || (submesh->useSharedVertices && !added_shared))
{
if (submesh->useSharedVertices)
{
added_shared = true;
shared_offset = current_offset;
}
// the real vertex data is wrapped into lots of classes
const Ogre::VertexElement* Elem = vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr vbuf = vertex_data->vertexBufferBinding->getBuffer(Elem->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
Elem->baseVertexPointerToElement(vertex, &pReal);
// translate to world space and scale, rota
pReal[0] = pReal[0] - 10;
pReal[1] = pReal[1] + 10;
pReal[2] = pReal[2] - 5;
}
vbuf->unlock();
next_offset += vertex_data->vertexCount;
}
}
it works well with NVIDIA graphics card.but crash in ATI graphics card.
and i found if i use mouse ray to pick up entity,it well crash too.
if somebody knows what happan,please tell me, thanks a lot!