Werbeanzeige
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
HRESULT simplifyMesh(const float fSimplifyMeshFactor) { HRESULT hr; LPD3DXMESH pTmpMesh; // D3DFVF_MESHVERTEX == xyz | normal hr = this->m_pMesh->CloneMeshFVF(D3DXMESH_SYSTEMMEM, D3DFVF_MESHVERTEX, this->m_pDevice, &pTmpMesh); // memcpy(&pTmpMesh, &this->m_pMesh, sizeof(this->m_pMesh)); D3DXATTRIBUTEWEIGHTS d3daw; ZeroMemory(&d3daw, sizeof(D3DXATTRIBUTEWEIGHTS)); d3daw.Position = 1.0f; //d3daw.Boundary = 10000.0f; d3daw.Normal = 1.0f; DWORD* pdwAdjaceny = NULL; pdwAdjaceny = new DWORD[3* pTmpMesh->GetNumFaces()]; if (pdwAdjaceny == NULL) { return E_OUTOFMEMORY; } hr = pTmpMesh->GenerateAdjacency(0.01f, pdwAdjaceny); if (FAILED(hr)) return hr; DWORD* pdwAdjacenyOut = NULL; pdwAdjacenyOut = new DWORD[3* pTmpMesh->GetNumFaces()]; if (pdwAdjaceny == NULL) { return E_OUTOFMEMORY; } DWORD dwFlags = D3DXMESHOPT_VERTEXCACHE | D3DXMESHOPT_COMPACT; hr = pTmpMesh->OptimizeInplace(dwFlags, pdwAdjaceny, pdwAdjacenyOut, NULL, NULL); if (FAILED(hr)) { return hr; } SAFE_DELETE_ARRAY(pdwAdjaceny); pdwAdjaceny = pdwAdjacenyOut; hr = D3DXSimplifyMesh(pTmpMesh, pdwAdjaceny, &d3daw, NULL, (DWORD)(pTmpMesh->GetNumFaces() * fSimplifyMeshFactor), D3DXMESHSIMP_FACE, &this->m_pSimplifiedMesh); if (hr == E_OUTOFMEMORY) return E_OUTOFMEMORY; else if (hr == D3DXERR_INVALIDDATA) return D3DXERR_INVALIDDATA; else if (hr == D3DERR_INVALIDCALL) return D3DERR_INVALIDCALL; else if (hr == D3DXERR_INVALIDMESH) return D3DXERR_INVALIDMESH; SAFE_DELETE_ARRAY(pdwAdjaceny); assert(pTmpMesh != NULL); assert(this->m_pSimplifiedMesh != NULL); return hr; |
Zitat von »"David Scherfgen"«
Dann ist dein Mesh wohl irgendwie "kaputt".
Zitat von »"David Scherfgen"«
Link mal mit der Debug-D3DX-DLL und starte dein Programm im Debug-Modus. Dann kriegst du möglicherweise einen Hinweis darauf (in der Debug-Ausgabe), was mit dem Mesh nicht stimmt.
Zitat von »"Nox"«
Andere Frage. Hast du vorher ein D3DXCleanMesh gemacht?
![]() |
C-/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
LPD3DXMESH tmptmpMesh = NULL; hr = D3DXCleanMesh(D3DXCLEAN_SIMPLIFICATION, this->m_pMesh, pdwAdjacenyOut, &tmptmpMesh, pdwAdjacenyOut, NULL ); if (FAILED(hr)) return hr; SAFE_DELETE_ARRAY(pdwAdjaceny); pdwAdjaceny = pdwAdjacenyOut; hr = D3DXSimplifyMesh(this->m_pMesh, pdwAdjaceny, &d3daw, NULL, (DWORD)(this->m_pMesh->GetNumFaces() * fSimplifyMeshFactor), D3DXMESHSIMP_FACE, &this->m_pSimplifiedMesh); |
Werbeanzeige