void Object::Load(IDirect3DDevice9 *pd3dDevice, char* filename)
{
LPDIRECT3DVERTEXBUFFER9 pVB;
LPD3DXBUFFER pD3DXMtrlBuffer;
D3DXVECTOR3 min, max;
D3DXVECTOR3* pVertices;
short* pIndices;
if( FAILED( D3DXLoadMeshFromX( filename, D3DXMESH_SYSTEMMEM, pd3dDevice, NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh ) ) )
{
// If model is not in current folder, try parent folder
if( FAILED( D3DXLoadMeshFromX( filename, D3DXMESH_SYSTEMMEM, pd3dDevice, NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh ) ) )
{
MessageBox(NULL, "Error Loading X File", "Meshes.exe", MB_OK);
//return E_FAIL;
}
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
for (int i = 0; i < g_dwNumMaterials; i++)
{
g_pMeshMaterials = d3dxMaterials.MatD3D;
g_pMeshMaterials.Ambient = g_pMeshMaterials.Diffuse;
// Create the texture.
if( FAILED( D3DXCreateTextureFromFile( pd3dDevice, d3dxMaterials.pTextureFilename, &g_pMeshTextures ) ) ) {
g_pMeshTextures = NULL;
}
}
g_pMesh->GetVertexBuffer(&pVB);
pVB->Lock( 0, 0, (void**)&pVertices, 0 );
D3DXComputeBoundingBox((D3DXVECTOR3*) pVertices, g_pMesh->GetNumVertices(), g_pMesh->GetNumBytesPerVertex()-sizeof(D3DXVECTOR3), &min, &max);
bBox.Init(min, max, pd3dDevice);
char test[1000];
::OutputDebugString("Min Max Vektoren:\n");
sprintf(test,"%f %f %f\n", min.x, min.y, min.z);
::OutputDebugString(test);
sprintf(test,"%f %f %f\nBytes per Vertex: %i sizeof(float): %i\n\n", max.x, max.y, max.z, g_pMesh->GetNumBytesPerVertex()/4, sizeof(float));
::OutputDebugString(test);
for (int i =0; i < g_pMesh->GetNumVertices(); i++)
{
sprintf(test, "%i/%i x:%f y:%f z:%f\n", i, g_pMesh->GetNumVertices(), pVertices[0].x, pVertices[0].y, pVertices[0].z);
pVertices += g_pMesh->GetNumBytesPerVertex()/4;
::OutputDebugString(test);
}
pVB->Unlock();
pD3DXMtrlBuffer->Release();
}
Problem with LPD3DXMESH receiving correct VertexCount [solved]
Hi,
i'm currently trying to render a boundingbox for an *.x file. When accessing the vertexbuffer i read the vertex positions and use D3DXComputeBoundingBox to calculate the boundingbox. In my tests i used a cube and as the function requires the number of vertices i use g_pMesh->GetNumVertices() to receive it. Only problem is the Number is not correct and i dont know which factors to include to correct the value.
with the following debug output:
Min Max Vektoren:
-5.000000 -5.000000 -5.000000
15997507938632555000000000000000000.000000 76830814256935743000000000000000.000000 76818434856542890000000000000000.000000
Bytes per Vertex: 17 sizeof(float): 4
0/34 x:-5.000000 y:10.000000 z:5.000000
1/34 x:5.000000 y:0.000000 z:5.000000
2/34 x:5.000000 y:10.000000 z:5.000000
3/34 x:5.000000 y:0.000000 z:-5.000000
4/34 x:5.000000 y:10.000000 z:-5.000000
5/34 x:-5.000000 y:0.000000 z:-5.000000
6/34 x:5.000000 y:10.000000 z:5.000000
7/34 x:-5.000000 y:10.000000 z:-5.000000
8/34 x:5.000000 y:0.000000 z:5.000000
9/34 x:-5.000000 y:0.000000 z:-5.000000
10/34 x:-5.000000 y:10.000000 z:-5.000000
11/34 x:-5.000000 y:0.000000 z:-5.000000
12/34 x:0.000000 y:0.000000 z:0.000000
13/34 x:0.000000 y:0.000000 z:0.000000
14/34 x:0.000000 y:0.000000 z:0.000000
15/34 x:-0.000000 y:-0.000000 z:-158839966806181750000000000000000000000.000000
16/34 x:7153659904.000000 y:0.000000 z:0.000000
17/34 x:-158839966806181750000000000000000000000.000000 y:0.000000 z:0.000000
18/34 x:0.000000 y:0.000000 z:0.000000
19/34 x:0.000000 y:0.000000 z:0.000000
20/34 x:0.000000 y:0.000000 z:-0.000000
21/34 x:0.000000 y:0.000000 z:0.000000
22/34 x:0.000000 y:0.000000 z:0.000000
23/34 x:0.002930 y:0.000000 z:0.000000
24/34 x:0.000000 y:12583071.000000 z:0.000000
25/34 x:0.000000 y:0.000000 z:3145768.250000
26/34 x:0.000000 y:0.000000 z:0.000000
27/34 x:0.000000 y:0.000000 z:0.000000
28/34 x:0.000000 y:0.000000 z:0.000000
29/34 x:-158839966806181750000000000000000000000.000000 y:-158839966806181750000000000000000000000.000000 z:-158839966806181750000000000000000000000.000000
30/34 x:-158839966806181750000000000000000000000.000000 y:-158839966806181750000000000000000000000.000000 z:-158839966806181750000000000000000000000.000000
31/34 x:-158839966806181750000000000000000000000.000000 y:-158839966806181750000000000000000000000.000000 z:-158839966806181750000000000000000000000.000000
32/34 x:-158839966806181750000000000000000000000.000000 y:-158839966806181750000000000000000000000.000000 z:-158839966806181750000000000000000000000.000000
33/34 x:-158839966806181750000000000000000000000.000000 y:-158839966806181750000000000000000000000.000000 z:-158839966806181750000000000000000000000.000000
the problem is as you can see there should only be a vertex count of 8 as my cube consists only of 8 vertices. (the data for the first 8 vertices is correct)
any hints on how to calculate the negative offset to make in that case an 8 out of the 34 (which is the vertexcount received by g_pMesh->GetNumVertices()).
thanks
flery
[Edited by - flery on May 3, 2006 8:46:52 AM]
You're assuming that your incoming mesh is of a D3DFVF_XYZ vertex format. Generally speaking, assuming anything about external data is at best risky [wink]
Thus you're probably just stepping through a binary chunk of data and reading in effectively random position data...
Either decode the vertex declaration (easier and more reliable than an FVF) and/or use ::CloneMesh() or CloneMeshFVF() to get the data into a format that suits your algorithms.
hth
Jack
Quote:Bytes per Vertex: 17Now 17 bytes per vertex is not the same as the 12 bytes/vertex you'd expect from a standard float3/D3DXVECTOR3...
Thus you're probably just stepping through a binary chunk of data and reading in effectively random position data...
Either decode the vertex declaration (easier and more reliable than an FVF) and/or use ::CloneMesh() or CloneMeshFVF() to get the data into a format that suits your algorithms.
hth
Jack
For me i didn't minus the sizeof(D3DXVECTOR3) in the stride input of D3DXComputeBoundingBox, and it worked ok for me.
Quote:You're assuming that your incoming mesh is of a D3DFVF_XYZ vertex format.
actually i'm not. i know that the first 12 bytes are XYZ and everything that comes after that is unknown but i know that every vertex is 17 bytes "width". there is nothing wrong with reading the vertex data the problem is the count which without any of my code implementations returns something i dont understand. 17 (bytes per vertex) x 8 (actual vertices) < is what i'd expect. insted i get 17 (bytes per vertex) x 34 (g_pMesh->GetNumVertices()). without considering my code you should get 8 out of g_pMesh->GetNumVertices() not 34 or am i wrong ?
thanks so far
flery
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement