Model3D.h 9.5 KB

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