Sign in to follow this  
amak

Retrieving polygon information from a Mesh (X file)

Recommended Posts

amak    122
Hi. I've a scene in X. I want to create a bsp tree of this scene. For that i need to retrieve information of the polygons from the scene. The information of the polygons are in the index buffer. With the index buffer i catch the vertex information from the vertex buffer. But the index buffer is giving me wrong index of the vertices that a polygon is formed. With that index i get a segmentation fault because is not within the vertex buffer memory bounds. To get an ideia i get a index above 1 million. I will post some code that i use to get the index and vertex buffer and how i read it. To retrieve the index buffer: <code> LPDIRECT3DINDEXBUFFER9 ppIB; m_Mesh->GetIndexBuffer(&ppIB); D3DINDEXBUFFER_DESC pDesc; ppIB->GetDesc(&pDesc); uint32 numBytesIndexBufferEntry = (pDesc.Format == D3DFMT_INDEX16) ? 2 : 4; uint32 size = m_Mesh->GetNumFaces() * 3 * numBytesIndexBufferEntry; void* memTempIndexBuffer; ppIB->Lock(0, size, &memTempIndexBuffer, D3DLOCK_READONLY); memIndexBuffer = malloc(size); memcpy(memIndexBuffer, memTempIndexBuffer, size); ppIB->Unlock(); </code> Retrieve the vertex buffer <code> LPDIRECT3DVERTEXBUFFER9 ppVB; m_Mesh->GetVertexBuffer(&ppVB); D3DVERTEXBUFFER_DESC pVertexDesc; ppVB->GetDesc(&pVertexDesc); void* memTempVertexBuffer; ppVB->Lock(0, pVertexDesc.Size, &memTempVertexBuffer, D3DLOCK_READONLY); memVertexBuffer = malloc(pVertexDesc.Size); memcpy(memVertexBuffer, memTempVertexBuffer, pVertexDesc.Size); ppVB->Unlock(); </code> Now a polygon is composed by three vertices. Read the vertex index and read the vertex information with that vertex index: <code> uint32 indexBufferFormat = model->GetSizeOfIndexBufferEntry(); uint32 m_NumFaces = model->GetNumFaces(); void* memIndexBuffer = model->GetMemIndexBuffer(); void* memVertexBuffer = model->GetMemVertexBuffer(); for(uint32 i = 0; i < m_NumFaces; i++) { uint32 vertice0, vertice1, vertice2; if(indexBufferFormat == 2) { vertice0 = *(((UINT16*) memIndexBuffer) + (i * 3) + 0); vertice1 = *(((UINT16*) memIndexBuffer) + (i * 3) + 1); vertice2 = *(((UINT16*) memIndexBuffer) + (i * 3) + 2); } else { vertice0 = *(((uint32*) memIndexBuffer) + (i * 3) + 0); vertice1 = *(((uint32*) memIndexBuffer) + (i * 3) + 1); vertice2 = *(((uint32*) memIndexBuffer) + (i * 3) + 2); } VertexPTN v0 = *((VertexPTN*) memVertexBuffer + vertice0); VertexPTN v1 = *((VertexPTN*) memVertexBuffer + vertice1); VertexPTN v2 = *((VertexPTN*) memVertexBuffer + vertice2); uint32 indice_material=0; polygons.push_back(BspPolygon(v0,v1,v2,indice_material)); </code>

Share this post


Link to post
Share on other sites
amak    122
I resolved the problem. The variable indexBufferFormat was wrong so it was giving odd indexes. Thanks to all.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this