// Kl_3D_Objekt ermöglicht das laden & anzeigen (rendern) von 3D-Modellen // im X-File Format. // Sie ist größtenteils im Originalzustand (Quellcode), // und wurde nicht an die Öffentlichkeit angepaßt. // Programmierer & Autor: Daniel Opitz (www.GhostWorld3D.Beepworld.de) // Letzte Änderung: 22.04.2015 (Kl_3D_Objekt.h) & 26.05.2015 (Kl_3D_Objekt.cpp) // Entwicklungszeitraum // von Kl_3D_Objekt: 05.09.2012 (Rohe, leere Klasse) - 23.09.2012 (X-Files mit 1 oder 2 // Meshes werden angezeigt) #ifndef _Kl_3D_Objekth_ #define _Kl_3D_Objekth_ // Klassen, von denen Kl_3D_Objekt erbt #include "Private Klassen\Kl_DX\Kl_3D_Objekt_AnimDaten\Kl_3D_Objekt_AnimDaten.h" // --> SEHR Wichtige Nutzungshinweise incl.Einschränkungen siehe: // -Kommentare über "void Kl_3D_Objekt::lade_3D_Obj_aus_XFile()" // -Beschreibung Kl_3D_Objekt.txt (Teilweise nicht mehr aktuell) // // --> X-File Muster incl Erklärungen siehe Ende dieser Header-Datei! // Klassen bekanntmachen (Diese und weitere Klassen sind NICHT im Download enthalten, // sondern Bestandteil der Gameengine) #include "Private Klassen\Kl_DX\Kl_3D\Kl_3D.h" #include "Private Klassen\Kl_DX\Kl_2D_Bild\Kl_2D_Bild.h" #include "Private Klassen\Kl_DX\Kl_DX_KollisionsObj\Kl_DX_KollisionsObj.h" class Kl_3D_Objekt:public Kl_3D_Objekt_AnimDaten { public: Kl_3D_Objekt::Kl_3D_Objekt(); // Kopierkonstruktor // Kl_3D_Objekt::Kl_3D_Objekt(const Kl_3D_Objekt& Quellklasse); // Zuweisungsoperator (=) Kl_3D_Objekt& Kl_3D_Objekt::operator=(const Kl_3D_Objekt& Quellklasse); //const Kl_3D_Objekt& operator=(const Kl_3D_Objekt& Quellklasse); Kl_3D_Objekt::~Kl_3D_Objekt(); static void init_Kl_3D_Objekt(Kl_2D_Bild *z_Kl_2D_Bild, Kl_Debug *z_Kl_Debug); void lade_3D_Obj_aus_XFile(char *DatPfad_XDatei, bool verwendet_TexturMitTransparenz); void set_Datenstrom_3D_Objekt_VB(void); void set_3D_Objekt_xyzPos(float xPos, float yPos, float zPos); void set_3D_Objekt_yDrehung(float yDrehung); void set_3D_Objekt_yDrehung(unsigned char yDrehungsRichtung); void set_3D_Objekt_Textur(unsigned short int Textur_MeshNr, LPDIRECT3DTEXTURE9 Neue_Textur); float get_3D_Objekt_xPos(void); float get_3D_Objekt_yPos(void); float get_3D_Objekt_zPos(void); float get_3D_Objekt_Vertex_x_VtxNr(unsigned int Nr_Vertex); float get_3D_Objekt_Vertex_y_VtxNr(unsigned int Nr_Vertex); float get_3D_Objekt_Vertex_z_VtxNr(unsigned int Nr_Vertex); unsigned int get_AnzVertices_3D_Objekt(void); unsigned int get_AnzIndices_3D_Objekt(void); unsigned int get_AnzFaces_3D_Objekt(void); unsigned short int get_Anz_Meshes_3D_Objekt(void); unsigned int get_Anz_Vertices__MeshNr(short int MeshNr); unsigned int get_Anz_Faces__MeshNr(short int MeshNr); unsigned int get_3D_Obj_Vertice_AddWert__MeshNr(short int MeshNr); unsigned int get_3D_Obj_IndexbufferPos_Mesh__MeshNr(short int MeshNr); void get_3D_Objekt_Vertices(CUSTOMVERTEX_3D_Objekt_1* Array_Vertices); void get_3D_Objekt_Indices(short int *Array_Indices); void animiere_3D_Obj(void); static void set_aktMaterial_Mat_bBox_bSphere(void); void zeig_3D_Objekt(void); void zeig_3D_Objekt_Incl_yDrehung(void); void zeig_3D_Objekt_incl_Animation(void); void zeig_Bounding_Box_Sphere(void); protected: private: FILE *m_DateiInput_3D_Objekt; // Zum öffnen, schließen & arbeiten mit dem X-File char *m_akt_Datei_Zeile; // Enthält Text der aktuell gelesenen Dateizeile unsigned char m_Art_aktDatZeile; // Enthält je. Element aus "enum Inhalt_DatZeile" char *m_DateiPfad_XFile; // Enthält z.B. "3D Modelle\\Spielfeld\\", // damit Pfad incl. Dateiname für Textur // erzeugt werden kann char *m_DateiPfad_DatName_XFile; // Enthält z.B. "3D Modelle\\Spielfeld\\CUBE.X", // damit Meldungen dies anzeigen können LPDIRECT3DVERTEXBUFFER9 m_VertexBuffer_3D_Objekt; // Für Vertices ausm XFile LPDIRECT3DINDEXBUFFER9 m_Indexbuffer_3D_Objekt; LPDIRECT3DTEXTURE9 *m_3D_Objekt_Textur; D3DMATERIAL9 *m_3D_Objekt_Material; short int *m_3D_Objekt_Indices; // unsigned int *m_Anz_Vertices_MeshNr; // Wieviele Vertices der aktuelle Mesh // (z.B. m_Anz_Vertices_aktMesh[0]=der 1. Mesh), // enthält unsigned int *m_Anz_Faces_MeshNr; // Wieviele Faces der jeweilige Mesh hat unsigned int *m_Anz_NormalenVekt_MeshNr; // Wieviele Normalenvektoren der jeweilige Mesh hat unsigned int *m_Anz_Texturkoordin_MeshNr; // Wieviele Texturkoordinaten der jeweilige Mesh hat unsigned int *m_3D_Obj_Vertice_AddWert_Mesh; // Anzahl aller Vertices vor dem aktuellen Mesh // (Additionswert) // Wird für zeig_3D_Objekt() vorberechnet. // Ist nur bei Einsatz mehrerer Meshes erforderlich unsigned int *m_3D_Obj_IndexbufferPos_Mesh; // Für Position im Indexbuffer, ab der Dreiecke // für den aktuellen Mesh gerendert werden. // Wird für zeig_3D_Objekt() vorberechnet. // Ist nur bei Einsatz mehrerer Meshes erforderlich unsigned short int m_Anz_Meshes_3D_Obj; // 0=X-File enthält kein Mesh // 1, wenn X-File/3D-Objekt nur 1 Mesh enthält, // oder Menge der enthaltenen Meshes unsigned int m_Anz_Vertices_3D_Objekt; // Gesammt-Anzahl der Vertices // vom 3D-Objekt des X-Files unsigned int m_Anz_Indices_3D_Objekt; // Anzahl der Indices // vom 3D-Objekt des X-Files unsigned int m_Anz_Faces_3D_Objekt; // Anzahl der Faces // vom 3D-Objekt des X-Files // (1 Face hat jew. 3 Indizes) unsigned int m_Anz_Materialien_3D_Objekt; // Wieviel Materialien XFile enthält unsigned int m_Anz_Texturen_3D_Objekt; // Wieviel Texturen XFile enthält short int m_Nr_akt_Mesh; // Nr des Meshes, mit dem aktuell gearbeitet wird // -1=Kein Mesh, 0=Mesh Nr.1, 1=Mesh Nr.2, usw bool m_XFile_hatTextur; bool m_XFile_hatNormalen; bool m_XFile_hatTexturkoordinaten; bool m_XFile_istOK; // Ist false, falls X-Datei z.B. kein X-File ist, // & 3D-Objekt somit nicht angezeigt werden darf. // Ist außerdem auch dann false,wenns beim laden der daten // des X-Files Probleme gab (Um Prg-Abstürze zu vermeiden, // und Prg-Meldungen trotz Problemen lesen zu können) bool m_TexturAnzeigen_erlaubt; // Ist false, wenn Textur nicht geladen werden konnte, // (oder wenn X-File ohne Textur ist) // (wg. Prg-Absturz vermeidung) bool m_XFile_hatTransparenz; // Ist true, wenn X-File Transparenz verwendet // (Wenn der Alphawert der diffusen Farbe irgendeinen // Materials kleiner als 1.000000f ist, und/oder // mind.eine Textur Transparenz verwendet bool m_3D_Objekt_Matrix_gesetzt; // true, wenn sie bereits gesetzt wurde float m_3D_Objekt_xPos; // X-Position für Verschiebung in zeig_3D_Objekt() float m_3D_Objekt_yPos; // Y-Position für Verschiebung in zeig_3D_Objekt() float m_3D_Objekt_zPos; // Z-Position für Verschiebung in zeig_3D_Objekt() float m_3D_Objekt_yDrehung;// Y-Drehung für Y-Rotation (Drehung wie z.B. Kinderkarussel) Kl_DX_KollisionsObj *m_KollisionsObj; // Für Bounding Box des 3D Objekts // Für Zugriff auf andere Klassen static Kl_2D_Bild *m_z_Kl_2D_Bild; bool lade_Header_XFile(void); void lade_Template_XFile(void); void lade_Frame_XFile(void); //void lade_FrameTransformMatrix_XFile(void); void lade_Mesh_XFile(void); void lade_MeshNormals_XFile(void); void lade_VertexDuplicationIndices(void); void lade_MeshTextureCoords_XFile(void); void lade_MeshMaterialList(void); void lade_Material_XFile(void); void LeseNaechste_DatZeile(void); void LeseNaechste_DatZeile_NEU(void); void Lese_bis_StartKlammer(void); void Ueberspr_LeereOderKommentar_Zeile(void); bool Lese_MengenEintrag_DatZeile(unsigned int *Menge); void Lese_Vertices_Mesh(void); void Lese_Faces_Mesh(void); void pruefInhalt_DatZeile(void); void behandleInhalt_DatZeile(void); bool pruefe_XFile_Datei(void); bool pruefeAuf_Zeichenfolge(char *Zeichenfolge); bool pruefeAuf_LeereZeile(void); bool pruefeAuf_Kommentarzeile(void); void init_3D_Obj_aus_XFile(void); void verwandle_inName(char *Dateiname); void verwandle_inFrame_Referenzname(char *Frame_Referenzname); void verwandle_inKommentarlos(void); void berechne_Normalenvektoren(void); // void analysiere_XFile(void); void ueberspringe_Template_XFile(void); void analysiere_XFile_Meshes(void); void lese_Mesh__Mengen(void); void lese_MeshNormals__Mengen(void); void lese_MeshTextureCoords__Mengen(void); // Für Animation: void analysiere_XFile_Animationsdaten(void); unsigned short int lade_Anz_Bones_anim_XSkinMeshHeader(void); void analysiere_XFile_Animationsdaten2(void); void lade_anim_XSkinMeshHeader(void); void lade_anim_SkinWeights(void); void lade_anim_AnimationSet(void); void lade_anim_Animation(void); void lade_anim_AnimationKey_4(void); void lade_anim_AnimationKey_0(void); void lade_anim_AnimationKey_1(void); void lade_anim_AnimationKey_2(void); void lade_anim_Matrix_Keys(void); void lade_anim_Rotation_Keys(void); void lade_anim_Scale_Keys(void); void lade_anim_Position_Keys(void); void lade_anim_AnimationOptions(void); // Ein paar der möglichen Dateizeileninhalte // (Einige fehlen noch für später mal) // // inDz_... bedeutet: "In Dateizeile" enum Inhalt_DatZeile { inDz_LeereZeile =1, // 1=enthält nur Leerzeichen inDz_Kommentar =2, // 2=enthält Kommentar (beginnend mit // oder #) inDz_Template =10, // 10=enthält irgendein Template inDz_TemplateMesh =11, // 11=enthält "template Mesh {" inDz_Frame =20, // 20=enthält "Frame " // inDz_FrameTransformMatrix =30, // 30=enthält "FrameTransformMatrix {" inDz_Mesh_X =40, // 40=enthält "Mesh " inDz_Normals_X =43, // 43=enthält "MeshNormals {" inDz_MeshTextureCoords_X =45, // 45=enthält "MeshTextureCoords {" inDz_VertexDuplicationIndices_X =50, // 50=enthält "VertexDuplicationIndices {" inDz_MeshMaterialList_X =60, // 60=enthält "MeshMaterialList {" inDz_Material_X =63, // 63=enthält "Material " inDz_End_Klammer =69, // 69=enthält eine außerhalb eines durch // { } eingeschlossenen Dateiblocks // enthaltene "}" (="End-Klammer") inDz_XSkinMeshHeader =70, // 70=enthält "XSkinMeshHeader {" inDz_SkinWeights =72, // 72=enthält "SkinWeights {" inDz_AnimationSet =75, // 75=enthält "AnimationSet " inDz_Animation =80, // 80=enthält "Animation " // inDz_AnimationKey =82, // 82=enthält "AnimationKey" inDz_Sonstiges =99 // 99=enthält Etwas, was nicht behandelt/abgefragt wird }; }; // Zukünftig einbauen: Für Animation von X-Files /* //inDz_AnimationKey =82, // 82=enthält "AnimationKey" inDz_AnimationOptions =90, // 90=enthält "AnimationOptions" */ /* // Für zukünftige Zwecke noch einbauen: VertexDuplicationIndices { */ /* // Für zukünftige Zwecke noch einbauen: xof 0302txt 0032 Header { 1; 0; 1; } // und */ /* // Aus dem Buch/PDF "DirectX 9 Graphics - The Definitive Guide to Direct3D" S.159 Standard Templates Now that you’ve got an idea how the X file template system works, you’ll be interested to know what kind of premade templates DirectX provides for you. The standard templates and examples of their syntax are listed below. For now we won’t be examining how to use the standard templates specifically, although some are covered later. However, it’s good to know them and will provide further insight into how you can define your own templates, which is something we’ll do later in this chapter. Animation AnimationKey AnimationOptions AnimationSet AnimTicksPerSecond Boolean Boolean2d ColorRGB ColorRGBA Coords2d DeclData EffectDWord EffectFloats EffectInstance EffectParamDWord EffectParamFloats EffectParamString EffectString FaceAdjacency FloatKeys Frame FrameTransformMatrix FVFData Guid IndexedColor Material MaterialWrap Matrix4x4 Mesh MeshFace MeshFaceWraps MeshMaterialList MeshNormals MeshTextureCoords MeshVertexColors Patch PatchMesh PatchMesh9 PMAttributeRange PMInfo PMVSplitRecord SkinWeights TextureFilename TimedFloatKeys Vector VertexDuplicationIndices VertexElement XSkinMeshHeader */ #endif // *** X-File Muster incl Erklärungen *** // // ACHTUNG: Könnte Fehler enthalten, da einzeln zusammenkopiert! /* xof 0303txt 0032 Header { 1; 0; 1; } template XSkinMeshHeader { <3cf169ce-ff7c-44ab-93c0-f78f62d172e2> WORD nMaxSkinWeightsPerVertex; WORD nMaxSkinWeightsPerFace; WORD nBones; } template VertexDuplicationIndices { DWORD nIndices; DWORD nOriginalVertices; array DWORD indices[nIndices]; } template SkinWeights { <6f0d123b-bad2-4167-a0d0-80224f25fabb> STRING transformNodeName; DWORD nWeights; array DWORD vertexIndices[nWeights]; array FLOAT weights[nWeights]; Matrix4x4 matrixOffset; } Frame Scene_Root { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Frame Koerper { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Mesh { 5; // =Anzahl der Vertices dieses Mesh 0.000000;0.000000;1.000000;, // =Vertex 0 1.000000;0.000000;1.000000;, // =Vertex 1 1.000000;0.000000;0.000000;, // =Vertex 2 0.000000;0.000000;0.000000;, // =Vertex 3 0.500000;0.500000;0.500000;; // =Vertex 4 6; // =Anzahl der Faces dieses Mesh 3;0,2,1;, // =Face 0 aus Vertices 0,2,1. 1.Zahl(3)=Anzahl 3;3,2,0;, // Vertices im Face. Jedes Face hat je 3 Indices 3;4,0,1;, // =Face 2 aus Vertices 4,0,1 3;2,3,4;, // =Face 3 aus Vertices 2,3,4 3;3,0,4;, // =Face 4 aus Vertices 3,0,4 3;1,2,4;; // =Face 5 aus Vertices 1,2,4 MeshNormals { 5; // 5 Normale. Eine pro Vertex 0.610132;0.505449;0.610132;, // Normale 1 -0.653282;-0.382683;0.653282;, // Normale 2 -0.610132;0.505449;-0.610132;, // usw 0.653282;-0.382683;-0.653282;, 0.000000;-1.000000;0.000000;; 6; // 6 ?Faces? mit Normalen 3;0,2,1;, // ?Oberfläche 0 verwendet Normale 0? (=Fehler im Buch???) 3;3,2,0;, 3;4,0,1;, 3;2,3,4;, 3;3,0,4;, 3;1,2,4;; } MeshTextureCoords { 5; // Anzahl der Texturkoordinaten 0.000000;0.000000;, // Texturkoordinaten für Vertex 0 (tu, tv) 1.000000;0.000000;, // Texturkoordinaten für Vertex 1 (tu, tv) 1.000000;1.000000;, // Texturkoordinaten für Vertex 2 (tu, tv) 0.000000;1.000000;, // Texturkoordinaten für Vertex 3 (tu, tv) 0.500000;0.500000;; // Texturkoordinaten für Vertex 4 (tu, tv) } VertexDuplicationIndices { 71; 71; 0, 1, 2, ... 4, 70; } MeshMaterialList { 1; // Anzahl der genutzten Materialien 6; // Jedes Face erhält 1 Material 0, // Materialien an Faces zuweisen 0, 0, 0, 0, 0; Material PyramTextur { 0.800000;0.800000;0.800000;1.000000;; // ?Diffuse? Farbe RGBA 0.000000; // Spec. Exponent 0.000000;0.000000;0.000000;; // Specular (RGB) 0.000000;0.000000;0.000000;; // Emmisive (RGB) TextureFilename { // Optional noch Dateiname für Textur "Pyramiden Textur.bmp"; // } } } } } } Frame Gesicht { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Mesh { 12; -0.249305;0.284635;-0.142688;, -0.249305;0.563586;-0.142688;, -0.287396;0.563586;-0.000502;, -0.287396;0.284635;-0.000502;, -0.249305;0.284635;0.141683;, -0.249305;0.563586;0.141683;, -0.250036;0.561188;-0.143368;, -0.216938;0.725016;-0.124319;, -0.288256;0.561188;-0.001172;, -0.250036;0.725016;-0.001172;, -0.216938;0.725016;0.121975;, -0.250036;0.561188;0.141025;; 8; 3;0,2,1;, 3;0,3,2;, 3;3,4,2;, 3;2,4,5;, 3;6,8,7;, 3;7,8,9;, 3;8,10,9;, 3;8,11,10;; MeshNormals { ... */