[C++ - DirectX - Direct3D] Problema con Mesh

di il
4 risposte

[C++ - DirectX - Direct3D] Problema con Mesh

Vi posto la funzione che carica le mesh:

// [...]

struct XOBJECT {
    LPD3DXMESH pMesh;
    DWORD Num;
    LPDIRECT3DTEXTURE9* ppTex;
    D3DMATERIAL9* pMtrl;
};

// [...]

XOBJECT myMeshes[1];

// [...]

XOBJECT CreateMesh(const char* MeshPath, BOOL WithMaterials, BOOL WithTextures) {
    XOBJECT myXObj = {NULL, 0, NULL, NULL};
    LPD3DXMESH pMesh;
    DWORD Num, i;
    LPDIRECT3DTEXTURE9* ppTex;
    D3DMATERIAL9* pMtrl;
    LPD3DXBUFFER pMaterialBuffer;
    D3DXMATERIAL* pMeshMaterials;
    char MPath[999];
    char *TmpPath;

    if (FAILED(D3DXLoadMeshFromXA(MeshPath,
                                  D3DXMESH_SYSTEMMEM,
                                  pD3DD,
                                  NULL,
                                  &pMaterialBuffer,
                                  NULL,
                                  &Num,
                                  &pMesh))) {
        GetModuleFileNameA(GetModuleHandle(NULL), MPath, 999);
        TmpPath = strrchr(MshPath, '\\');
        MPath[(strlen(MshPath) - strlen(TmpPath)) + 1] = '\0';
        strcat(MPath, MeshPath);
        if (FAILED(D3DXLoadMeshFromXA(MPath,
                                      D3DXMESH_SYSTEMMEM,
                                      pD3DD,
                                      NULL,
                                      &pMaterialBuffer,
                                      NULL,
                                      &Num,
                                      &pMesh))) {
            MessageBox(0, "Impossibile aprire la Mesh.", "ERRORE", MB_ICONEXCLAMATION | MB_OK);
            return myXObj;
        }
    }

    pMeshMaterials = (D3DXMATERIAL*)pMaterialBuffer -> GetBufferPointer();
    pMtrl = new D3DMATERIAL9[Num];
    ppTex = new LPDIRECT3DTEXTURE9[Num];

    for (i = 0; i < Num; i++) {
        if (WithMaterials) {
            pMtrl[i] = pMeshMaterials[i].MatD3D;
            pMtrl[i].Ambient = pMtrl[i].Diffuse;
        }
        if (WithTextures) {
            if(FAILED(D3DXCreateTextureFromFileA(pD3DD,
                                                 pMeshMaterials[i].pTextureFilename,
                                                 &ppTex[i])))
                ppTex[i] = NULL;
        }
    }

    pMaterialBuffer -> Release();

    myXObj = {pMesh, Num, ppTex, pMtrl};

    return myXObj;
}
Richiamo la funzione in questo modo:
myMeshes[0] = CreateMesh("Tube.x", TRUE, FALSE); // Con materiali senza texture
La riga in questione va in crash sempre e gli errori che mi da il debugger non mi aiutano molto:
Nr: 0 Address: 00000000 Function: InitD3D(hWnd=0x1a03f0, width=640, height=480, fullscreenflag=0) File: C:\WINDOWS\sy... Line: 315
Nr: 1 Address: 0040208A Function: CreateD3DWindow(title=0x40717b "Le mesh in Direct3D", b_width=640, b_height=480, fullscreenflag=0) File: C:\WINDOWS\sy... Line: 385
Nr: 2 Address: 004024B5 Function: WinMain@16(hInstance=0x400000, hPrevInstance=0x0, lpCmdLine=0x241f25 "", nCmdShow=10) File: C:\WINDOWS\sy... Line: 484
Nr: 3 Address: 00000000 Function: 0x00404ad6 in main()
* InitD3D() è la funzione che contiene il richiamo della funzione CreateMesh()
* CreateD3DWindow() è la funzione che crea la finestra e richiama la funzione InitD3D()
* WinMain@16() è la funzione principale che richiama la funzione CreateD3DWindow()

Come posso risolvere? Grazie a tutti coloro che risponderanno

4 Risposte

Devi accedere o registrarti per scrivere nel forum
4 risposte