Model3D.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #pragma once
  2. #include "vec2.h"
  3. #include "Array.h"
  4. #include "Mat4.h"
  5. #include "Zeichnung3D.h"
  6. struct ID3D11Buffer;
  7. namespace Framework
  8. {
  9. struct Polygon2D; // Model2D.h
  10. class Textur; // Textur.h
  11. class Model2DData; // Model2D.h
  12. class DXIndexBuffer; // DXBuffer.h
  13. class DXVertexBuffer; // DXBuffer.h
  14. class Render3D; // Render3D.h
  15. class Model3DTextur; // Model3D.h
  16. class Model3DList; // Model3DList.h
  17. // Repräsentiert einen Knochen eines 3D Models. Kann annimiert werden
  18. class Knochen
  19. {
  20. private:
  21. Vec3< float > pos;
  22. Vec3< float > winkel;
  23. Knochen *geschwister;
  24. Knochen *kinder;
  25. int id;
  26. // Fügt dem Knochen ein Geschwister Knochen hinzu
  27. // k: Der Knochen, der hinzugefügt werden soll
  28. void addGeschwisterKnochen( Knochen *k );
  29. public:
  30. // Konstruktor
  31. __declspec( dllexport ) Knochen( int id );
  32. // Destruktor
  33. __declspec( dllexport ) ~Knochen();
  34. // Setzt die Position des Knochens relativ zum Model Ursprung
  35. // pos: Die Position
  36. __declspec( dllexport ) void setPosition( Vec3< float > &pos );
  37. // Setzt die Drehung des Knochens relativ zum Model Ursprung
  38. // winkel: Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat
  39. __declspec( dllexport ) void setDrehung( Vec3< float > &winkel );
  40. // Fügt einem bestimmten Knochen ein Kind Knochen hinzu
  41. // id: Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll
  42. // k: Der Knochen, der hinzugefügt werden soll
  43. __declspec( dllexport ) void addKind( int id, Knochen *k );
  44. // Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen
  45. // elternMat: Die fertig berechnete Matrix des Elternknochens
  46. // matBuffer: Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen
  47. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  48. __declspec( dllexport ) void kalkulateMatrix( Mat4< float > &elternMat, Mat4< float > *matBuffer, Mat4< float > &kamMat );
  49. // Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen
  50. __declspec( dllexport ) Knochen *kopiereKnochen() const;
  51. // Gibt die Id des Knochens zurück
  52. __declspec( dllexport ) int getId() const;
  53. };
  54. // Repräsentiert alle Knochen eines Models, mit denen es Annimiert werden kann
  55. class Skelett
  56. {
  57. private:
  58. Knochen *k;
  59. int nextId;
  60. int ref;
  61. public:
  62. // Konstruktor
  63. __declspec( dllexport ) Skelett();
  64. // Destruktor
  65. __declspec( dllexport ) ~Skelett();
  66. // Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach
  67. // Es können maximal 128 Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben
  68. __declspec( dllexport ) int getNextKnochenId();
  69. // Fügt dem Skellet einen Knochen hinzu
  70. // k: Der Knochen
  71. // elternId: Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden.
  72. __declspec( dllexport ) void addKnochen( Knochen *k, int elternId = -1 );
  73. // Berechnet die Matrizen der Knochen
  74. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  75. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  76. // return: gibt die Anzahl der verwendeten Matrizen zurück
  77. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  78. __declspec( dllexport ) int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix );
  79. // Kopiert das Skelett
  80. __declspec( dllexport ) Skelett *kopiereSkelett() const;
  81. // Erhöht den Reference Counting Zähler.
  82. // return: this.
  83. __declspec( dllexport ) Skelett *getThis();
  84. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  85. // return: 0.
  86. __declspec( dllexport ) Skelett *release();
  87. };
  88. // Eine struktor um für eine Ecke eines 3D Models die Raum Position, die Textur Koordinaten und den zugehörigen Knochen speichert
  89. struct Vertex3D
  90. {
  91. Vec3< float > pos; // Die Position der Ecke basierend zur Position des Knochens
  92. Vec2< float > tPos; // Die Textur Koordinaten der Ecke
  93. int knochenId; // Die Id des Knochens, mit dem sich die Ecke bei einer Annimation mitbewegt
  94. };
  95. // Eine Struktur, die alle Dreiecke eines 3D Polygons speichert
  96. struct Polygon3D
  97. {
  98. int *indexList; // Die Liste mit den IDs der Ecken
  99. int indexAnz; // Die Länge der Liste mit den Ids der Ecken
  100. DXIndexBuffer *indexBuffer; // Die DirectX11 Struktur, die die Liste mit IDs der Ecken verwaltet
  101. // Konstruktor
  102. __declspec( dllexport ) Polygon3D();
  103. // Destruktor
  104. __declspec( dllexport ) ~Polygon3D();
  105. };
  106. // Speichert alle Geometrischen Daten eines Modells, also
  107. // Raum - und Textur Koordinaten und Knochenzugehörigkeit aller Eckpunkte
  108. class Model3DData
  109. {
  110. private:
  111. Skelett *skelett;
  112. Vertex3D *vertexList;
  113. DXVertexBuffer *vertexBuffer;
  114. Array< Polygon3D* > *polygons;
  115. float radius;
  116. int id;
  117. int ref;
  118. public:
  119. // Konstruktor
  120. __declspec( dllexport ) Model3DData();
  121. // Destruktor
  122. __declspec( dllexport ) ~Model3DData();
  123. // Löscht alle Model daten
  124. __declspec( dllexport ) void clearModel();
  125. // Setzt den Zeiger auf ein standartmäßig verwendete Skelett
  126. // s: Das Skelett, das verwendet werden soll
  127. __declspec( dllexport ) void setSkelettZ( Skelett *s );
  128. // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
  129. // vertexList: Ein Array mit Vertecies
  130. // anz: Die Anzahl der Vertecies im Array
  131. __declspec( dllexport ) void setVertecies( Vertex3D *vertexList, int anz );
  132. // Fügt ein Polygon zum Model hinzu
  133. // polygon: Das Polygon, das hinzugefügt erden soll
  134. __declspec( dllexport ) void addPolygon( Polygon3D *polygon );
  135. // Konvertiert ein 2d Model zu 3D
  136. // model: Das 2d Model, das zu 3d konvertiert werden soll
  137. // z: Die z koordinate aller punkte des Models
  138. __declspec( dllexport ) void copyModel2D( Model2DData *model, float z );
  139. // Entfernt ein Polygon
  140. // index: Der Index des Polygons
  141. __declspec( dllexport ) void removePolygon( int index );
  142. // Aktualisiert die Vertecies
  143. __declspec( dllexport ) void aktualisiereVertecies( Render3D *zRObj );
  144. // Berechnet die Matrizen der Knochen des Standart Skeletts
  145. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  146. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  147. // return: gibt die Anzahl der verwendeten Matrizen zurück. 0, falls kein Standart Skelett gesetzt wurde
  148. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  149. int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix ) const;
  150. // Zeichnet alle Polygons
  151. // world: Die Welt Matrix, die das Model in die Welt transformiert
  152. // zTxt: Eine Liste mit Texturen der einzelnen Polygone
  153. // zRObj: Das Objekt, mit dem gezeichnet werden soll
  154. __declspec( dllexport ) void render( Mat4< float > &welt, const Model3DTextur *zTxt, Render3D *zRObj );
  155. // Gibt die Anzahl an Polygonen zurück
  156. __declspec( dllexport ) int getPolygonAnzahl() const;
  157. // Gibt ein bestimmtes Polygon zurück
  158. // index: Der Index des Polygons
  159. __declspec( dllexport ) Polygon3D *getPolygon( int index ) const;
  160. // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
  161. __declspec( dllexport ) float getRadius() const;
  162. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  163. __declspec( dllexport ) int getId() const;
  164. // Gibt einen Buffer mit allen Vertecies des Models zurück
  165. __declspec( dllexport ) const DXVertexBuffer *zVertexBuffer() const;
  166. // Erhöht den Reference Counting Zähler.
  167. // return: this.
  168. __declspec( dllexport ) Model3DData *getThis();
  169. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  170. // return: 0.
  171. __declspec( dllexport ) Model3DData *release();
  172. friend Model3DList;
  173. };
  174. // Speichert eine Liste mit Texturen und für welche Polygone welche Textur benutzt werden soll
  175. class Model3DTextur
  176. {
  177. private:
  178. RCArray< Textur > *textures;
  179. int ref;
  180. public:
  181. // Konstruktor
  182. __declspec( dllexport ) Model3DTextur();
  183. // Destruktor
  184. __declspec( dllexport ) ~Model3DTextur();
  185. // Legt fest, welche Textur für welches Polygon ist
  186. // pI: Der Index des Polygons
  187. // txt: Die Textur des Polygons
  188. __declspec( dllexport ) void setPolygonTextur( int pI, Textur *txt );
  189. // Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
  190. // i: Der Index des Polygons
  191. __declspec( dllexport ) Textur *zPolygonTextur( int i ) const;
  192. // Erhöht den Reference Counting Zähler.
  193. // return: this.
  194. __declspec( dllexport ) Model3DTextur *getThis();
  195. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  196. // return: 0.
  197. __declspec( dllexport ) Model3DTextur *release();
  198. };
  199. // Eine Zeichnung des 3D Frameworks, die ein 3D Model mit Textur und Animation darstellen kann
  200. class Model3D : public Zeichnung3D
  201. {
  202. protected:
  203. Model3DData *model;
  204. Skelett *skelett;
  205. Model3DTextur *textur;
  206. int ref;
  207. public:
  208. // Konstruktor
  209. __declspec( dllexport ) Model3D();
  210. // Destruktor
  211. __declspec( dllexport ) ~Model3D();
  212. // Setzt den Zeiger auf das zum Annimieren verwendete Skelett
  213. // s: Das Skelett, das verwendet werden soll
  214. __declspec( dllexport ) void setSkelettZ( Skelett *s );
  215. // Setzt die Daten des Models
  216. // data: Die Daten
  217. __declspec( dllexport ) void setModelDaten( Model3DData *data );
  218. // Setzt die zum Zeichnen zu benutzenden Texturen
  219. // txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
  220. __declspec( dllexport ) void setModelTextur( Model3DTextur *txt );
  221. // Errechnet die Matrizen aller Knochen des Skeletts des Models
  222. // viewProj: Die miteinander multiplizierten Kameramatrizen
  223. // matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
  224. // return: Die Anzahl der Matrizen, die das Model benötigt
  225. __declspec( dllexport ) int errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer ) override;
  226. // Verarbeitet die vergangene Zeit
  227. // tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
  228. // return: true, wenn sich das Objekt verändert hat, false sonnst.
  229. __declspec( dllexport ) virtual bool tick( double tickval ) override;
  230. // Zeichnet das Model
  231. // zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
  232. __declspec( dllexport ) void render( Render3D *zRObj ) override;
  233. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  234. __declspec( dllexport ) int getDatenId() const;
  235. // Gibt einen Buffer mit allen Vertecies des Models zurück
  236. __declspec( dllexport ) const DXVertexBuffer *zVertexBuffer() const;
  237. // Erhöht den Reference Counting Zähler.
  238. // return: this.
  239. __declspec( dllexport ) Model3D *getThis();
  240. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  241. // return: 0.
  242. __declspec( dllexport ) virtual Model3D *release();
  243. };
  244. }