Operating System: :Win10:
Render System: :Directx11:
Hello guys,
I'm working on porting my app from 1.12 to 2.2.5.
So, For several reason I need to edit my mesh at request.
For 1.12.x this code works fine.
Code: Select all
Ogre::SubMesh* pSubMesh = mEntityMesh->getSubMesh(0);
mEntityMesh->_setBounds(Ogre::AxisAlignedBox(mMin, mMax));
const Ogre::VertexElement* VertexEle_POS = pSubMesh->vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
Ogre::HardwareVertexBufferSharedPtr VertexBufPOS = pSubMesh->vertexData->vertexBufferBinding->getBuffer(VertexEle_POS->getSource());
unsigned char* VertexPtrPOS = static_cast<unsigned char*>(VertexBufPOS->lock(Ogre::HardwareBuffer::LockOptions::HBL_NORMAL));
int VertSizePOS = VertexBufPOS->getVertexSize();
float * pElementPOS = NULL;
int nMaxVert = pSubMesh->vertexData->vertexCount;
int count = 0;
for (int nVert = 0; nVert < nMaxVert; nVert++)
{
VertexEle_POS->baseVertexPointerToElement(VertexPtrPOS, &pElementPOS);
pElementPOS[0] = mVertex[count].mPosition.x;
pElementPOS[1] = mVertex[count].mPosition.y;
pElementPOS[2] = mVertex[count].mPosition.z;
count++;
VertexPtrPOS += VertSizePOS;
}
VertexBufPOS->unlock();
First of all, I have v1-Mesh as input data.
I need to load v1-Mesh -> convert to v2-Mesh -> edit
I found 2 ways to convert it to v2-Mesh:
Code: Select all
Ogre::MeshPtr meshV2 = Ogre::MeshManager::getSingleton().createByImportingV1(name, group, meshV1.get(), false, false, true);
But when I use it:
Code: Select all
Ogre::MeshPtr meshV2 = Ogre::MeshManager::getSingleton().createManual(name, group);
meshV2->importV1(meshV1.get(), false, false, true);
and the code which I use for editing:
Code: Select all
Ogre::SubMesh* subMesh = mesh->getSubMesh(0);
Ogre::VertexArrayObjectArray vaos = subMesh->mVao[0];
if (!vaos.empty())
{
const Ogre::VertexBufferPackedVec& vertexBuffers = vaos[0]->getVertexBuffers();
Ogre::IndexBufferPacked* indexBuffer = vaos[0]->getIndexBuffer();
auto elems = vertexBuffers[0]->getVertexElements();
auto count = vertexBuffers[0]->getNumElements();
AsyncTicketPtr asyncTicket = vertexBuffers[0]->readRequest(0, vertexBuffers[0]->getNumElements());
const uint8* vertexData = static_cast<const uint8*>(asyncTicket->map());
void* data = malloc(vertexBuffers[0]->getTotalSizeBytes());
memcpy(data, vertexData, vertexBuffers[0]->getTotalSizeBytes());
asyncTicket->unmap();
struct Vertices {
float px, py, pz;
float nx, ny, nz;
float texx, texy;
};
//some temp manipulation with data
float* start = reinterpret_cast<float*>(data);
float px = *start++;
float py = *start++;
float pz = *start++;
py = 44;
vertexBuffers[0]->upload(data, 0, vertexBuffers[0]->getNumElements());
}
1. Why I cannot get inner data with createByImportingV1?
2. What is the best way to edit my mesh?
P.S. The final goal is hiding a part of model by mesh indices.
Best Regards