Du bist nicht angemeldet.

Werbeanzeige

pip

Frischling

  • »pip« ist der Autor dieses Themas
  • Private Nachricht senden

1

16.06.2006, 15:01

D3DXSimplifyMesh

Hallo !

ich habe eine Frage zu D3DXSimplifyMesh:
Ich habe das Problem, dass diese Funktion anscheinend bei der Hälfte meiner Modelle nicht funktioniert. ich bekomme dauernd D3DXERR_INVALIDMESH als rueckgabewert.

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;



immer im letzten schritt, also bei D3DXSimplifyMesh funktioniert das ganze nicht mehr.
lg, pip

David Scherfgen

Administrator

Beiträge: 10 306

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.06.2006, 15:08

Dann ist dein Mesh wohl irgendwie "kaputt".

pip

Frischling

  • »pip« ist der Autor dieses Themas
  • Private Nachricht senden

3

16.06.2006, 15:12

Zitat von »"David Scherfgen"«

Dann ist dein Mesh wohl irgendwie "kaputt".


hallo!
nun ja, aber alle meshes werden ohne komplikationen gezeichnet, sogar die kollisionserkennung funktioniert wunderbar !

lg, pip

David Scherfgen

Administrator

Beiträge: 10 306

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

16.06.2006, 17:03

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.

Nox

Supermoderator

Beiträge: 5 280

Beruf: Student

  • Private Nachricht senden

5

16.06.2006, 17:11

Andere Frage. Hast du vorher ein D3DXCleanMesh gemacht?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

pip

Frischling

  • »pip« ist der Autor dieses Themas
  • Private Nachricht senden

6

18.06.2006, 11:30

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.


starte das programm sicherheitshalber immer im debug modus.

Zitat von »"Nox"«


Andere Frage. Hast du vorher ein D3DXCleanMesh gemacht?


hui, nein, werde das mal machen !!
vielen dank !!!!!

lg, pip

pip

Frischling

  • »pip« ist der Autor dieses Themas
  • Private Nachricht senden

7

18.06.2006, 14:34

Hallo !

habe jetzt folgendes 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);


funktioniert leider immer noch nicht

lg, pip

Nox

Supermoderator

Beiträge: 5 280

Beruf: Student

  • Private Nachricht senden

8

18.06.2006, 18:01

Tendenziell würde ich sagen du hast 2mal pdwAdjacenyOut angegeben. Sowohl als input als auch als output. Das geht zwar aber ich weiß nciht was du vorher mit denen gemacht hast.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

pip

Frischling

  • »pip« ist der Autor dieses Themas
  • Private Nachricht senden

9

19.06.2006, 06:34

hmm werde mal nachsehen, aber ich glaube nicht, dass es dadurch zu einem fehler kommt

lg, pip

soxx

Frischling

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

10

19.06.2006, 08:26

hmm... nur mal auf die schnelle:

dein gesaeubertes mesh ist ja tmptmpMesh, warum laesst du dann m_pmesh vereinfachen ? (es ist ja nicht gesaeubert worden).

mfg
soxx

Werbeanzeige