Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.12.2008, 23:43

D3DXLoadMeshHierarchyFromX

Hallo,

ich versuche momentan mit der Funktion D3DXLoadMeshHierarchyFromX benutzerdefinierte Daten aus einer X-Datei zu laden.
Dazu habe ich folgendes getan:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class CLoadUserData: public ID3DXLoadUserData{
public:
    STDMETHOD(LoadFrameChildData)(THIS_ LPD3DXFRAME pFrame, LPD3DXFILEDATA pXofChildData);
    STDMETHOD(LoadMeshChildData)(THIS_ LPD3DXMESHCONTAINER pMeshContainer, LPD3DXFILEDATA pXofChildData);
    STDMETHOD(LoadTopLevelData)(THIS_ LPD3DXFILEDATA pXofChildData);

    CLoadUserData(){}
};


Das Problem ist nun, ich drehe mich im Kreis. Ich weiß nicht, wie ich in der Methode LoadTopLevelData, die auch aufgerufen wird während des Parsens, an die Informationen rankomme.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
HRESULT CLoadUserData::LoadTopLevelData(LPD3DXFILEDATA pXofChildData){
    hr=pXofChildData->GetId(&pId);
    if(FAILED(hr)) return hr;

    hr = pXofChildData->GetType(&type);
    if(FAILED(hr)) return hr;
    
    hr=pXofChildData->GetName(NULL, &cchName);
    if(FAILED(hr)) return hr;
    
    hr=pXofChildData->Lock(&dwSize, (LPCVOID*)&pData);
    if(FAILED(hr)) return hr;

    // Daten auslesen

    MorphAnimationSet set = ((MorphAnimationSet)pData);
        // Um das zu casten, muss ich einen passenden Konstruktor anbieten und da die Daten auslesen. Das ist nur ein Versuch, der nicht funktioniert hat.

    hr = pXofChildData->Unlock();
    if(FAILED(hr)) return hr;

    return hr;
}


Mein Problem ist, dass egal was ich mache ich am Ende immer wieder ein Objekt von ID3DXFileData habe und wieder am Anfang stehe.

Über die Methode GetEnum bekommt man ja auch das ID3DXFile. Da gibt es aber nur Funktionen zum Registrieren von Templates, ich will die aber doch auslesen, die im X-File gespeichert sind.

Kann mir jemand sagen wie das funktioniert? Vielleicht muss ich meine Templates ja auch erst innerhalb der Anwendung registrieren, aber dann weiß ich trotzdem nicht viel weiter. :-/

Gruß, Michael


EDIT: der lesbarkeit halber code-tags eingebaut (by dot)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

15.12.2008, 09:23

Ich hab das Problem noch nicht so ganz verstanden... An welche Daten kommst du nicht ran? Wo endest du mit einem ID3DXFileData Objekt? Fragen über Fragen! ;)
@D13_Dreinig

3

15.12.2008, 19:33

Hallo,

also das eine problem habe ich gelöst. Nicht schlimm, wenn du es nicht verstanden hast.

Ich habe jetzt in der Methode
CLoadUserData::LoadTopLevelData(LPD3DXFILEDATA pXofChildData)
die Daten aus dem X-File in ein struct "gepackt".
hr=pXofChildData->Lock(&size, (const void**)&morphSet);


struct MorphAnimationSet{
DWORD NumKeys; // Anzahl der Key-Frames.
MorphAnimationKey Keys[255]; // Array der Key-Frames (Maximal 255).
char* name; // Name der Animation.
LPD3DXMESH *meshs; // Array mit Zeigern auf Meshs.
};


Mein Problem ist nun, nachdem in dieser Methode alles ohne Fehler abgelaufen ist, und die Methode D3DXLoadMeshHierarchyFromX beendet wurde, fehlen Daten in dem struct. NumKeys usw bleibt erhalten, jedoch bei allem was über Zeiger referenziert wird steht danach nur noch ein komisches Zeichen an der Adresse.

Hier mal der komplette relevante Code:

/* Lädt benutzerspezifische Daten auf Top-Level Ebene. */
HRESULT CLoadUserData::LoadTopLevelData(LPD3DXFILEDATA pXofChildData){
HRESULT hr = S_OK; // Returnvariable
GUID type; // GUID von pXofChildData

// Type
hr = pXofChildData->GetType(&type);
if(FAILED(hr)) goto e_Exit;

// Size
DWORD size = 0;
hr = pXofChildData->GetName(NULL, &size);
if(FAILED(hr)) goto e_Exit;

// Name
char buffer[255];
hr=pXofChildData->GetName(&buffer[0], &size);
if(FAILED(hr)) goto e_Exit;

// MorphAnimationSet
if(type == GUID_MORPHANIMATIONSET){

// MorphAnimationSet erstellen
hr=pXofChildData->Lock(&size, (const void**)&morphSet);
if(FAILED(hr)) goto e_Exit;

// Namen dem Set hinzufügen.
morphSet->name = buffer;

// Unlock()
hr = pXofChildData->Unlock();
if(FAILED(hr)) goto e_Exit;

// Hier wird das struct nochmal in einem globalen objekt gespeichert.
morphAnim->addAnimation(*morphSet);
}

e_Exit:
return hr;
}

Jemand vielleicht eine Ahnung woran das liegt? Muss ich eventuell nur die Daten in eine neue Variable kopieren per memcpy oder so? Aber was macht das allgemein für einen sinn? Jemand vielleicht auch schonmal das Problem gehabt?

Gruß

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

15.12.2008, 19:56

Zitat von »"michi84"«

Hallo,

also das eine problem habe ich gelöst. Nicht schlimm, wenn du es nicht verstanden hast.


Lol... das ist ja zu gütig! :shock:
@D13_Dreinig

5

16.12.2008, 00:14

Bitte vorher posten wenn du auch in anderen Foren die Frage gestellt hast, sonst tippt man noch alles doppelt und dreifach:

http://www.c-plusplus.de/forum/viewtopic-var-t-is-229671.html

6

16.12.2008, 00:31

Na wenigstens verwendet er dort auch keine Code-Tags. 8)

7

16.12.2008, 10:44

Ja, ich hatte die Frage auch wo anders noch gestellt und mich deswegen dort auch angemeldet. Beim nächsten mal werde ich es erwähnen.

Code Tags?! Ja okay, ich habe diesem BBCode oder man das nennt nicht verwendet. Habe ich ehrlich gesagt nicht darauf geachtet.

Es läuft nun übrigens alles und ich habe es allein hinbekommen. Ich möchte hier keinem zu nahe treten, aber manchmal wäre eine ernstgemeinte hilfreiche Antwort besser oder zumindest ein Hinweis, was man anders/besser machen kann.

Michael

8

16.12.2008, 11:00

Zitat von »"michi84"«

Ich möchte hier keinem zu nahe treten, aber manchmal wäre eine ernstgemeinte hilfreiche Antwort besser oder zumindest ein Hinweis, was man anders/besser machen kann.

Du kennst bestimmt den Spruch "Wie mans in den Wald hineinruft..."
Siehe dazu David_pb's Post.

Wenn du eine Lösung gefunden hast, bitte auch eine kleine Erläuterung dazu, wie du es gelöst hast.

Code ohne entsprechende Tags sind halt schwer zu lesen. Manch einer, so wie ich, wenden sich dann mit Grausen ab.
Aber das hat sich ja jetzt wohl erledigt. Nachdem es mal erwähnt wurde. ;)

Crosspostings sind halt auch so eine Sache. Aber auch hier hast du gesagt, dass du es demnächst erwähnen wirst.

Last but not least: Auf ein weiteres konstruktives Miteinander!

Werbeanzeige