Model3D.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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 DXBuffer; // DXBuffer.h
  13. class Render3D; // Render3D.h
  14. class Model3DTextur; // Model3D.h
  15. class Model3DList; // Model3DList.h
  16. class Animation3D; // Animation3D.h
  17. class Welt3D; // Welt3D.h
  18. // Repräsentiert einen Knochen eines 3D Models. Kann annimiert werden
  19. class Knochen
  20. {
  21. private:
  22. Vec3< float > pos;
  23. Vec3< float > winkel;
  24. Knochen *geschwister;
  25. Knochen *kinder;
  26. int id;
  27. // Fügt dem Knochen ein Geschwister Knochen hinzu
  28. // k: Der Knochen, der hinzugefügt werden soll
  29. void addGeschwisterKnochen( Knochen *k );
  30. public:
  31. // Konstruktor
  32. __declspec( dllexport ) Knochen( int id );
  33. // Destruktor
  34. __declspec( dllexport ) ~Knochen();
  35. // Setzt die Position des Knochens relativ zum Model Ursprung
  36. // pos: Die Position
  37. __declspec( dllexport ) void setPosition( Vec3< float > &pos );
  38. // Setzt die Drehung des Knochens relativ zum Model Ursprung
  39. // winkel: Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat
  40. __declspec( dllexport ) void setDrehung( Vec3< float > &winkel );
  41. // Fügt einem bestimmten Knochen ein Kind Knochen hinzu
  42. // id: Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll
  43. // k: Der Knochen, der hinzugefügt werden soll
  44. __declspec( dllexport ) void addKind( int id, Knochen *k );
  45. // Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen
  46. // elternMat: Die fertig berechnete Matrix des Elternknochens
  47. // matBuffer: Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen
  48. // scaleFactor: Die skallierung des Objektes
  49. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  50. __declspec( dllexport ) void kalkulateMatrix( Mat4< float > &elternMat, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMat );
  51. // Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen
  52. __declspec( dllexport ) Knochen *kopiereKnochen() const;
  53. // Gibt die Id des Knochens zurück
  54. __declspec( dllexport ) int getId() const;
  55. // Gibt die Drehung des Knochens zurück
  56. __declspec( dllexport ) Vec3< float > getDrehung() const;
  57. // Gibt die Position des Knochens zurück
  58. __declspec( dllexport ) Vec3< float > getPosition() const;
  59. // Gibt den Radius des Knochens zurück
  60. float getRadius() const;
  61. friend Animation3D;
  62. };
  63. // Repräsentiert alle Knochen eines Models, mit denen es Annimiert werden kann
  64. class Skelett
  65. {
  66. private:
  67. Knochen *k;
  68. int nextId;
  69. int ref;
  70. public:
  71. // Konstruktor
  72. __declspec( dllexport ) Skelett();
  73. // Destruktor
  74. __declspec( dllexport ) ~Skelett();
  75. // Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach
  76. // Es können maximal MAX_KNOCHEN_ANZ Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben
  77. __declspec( dllexport ) int getNextKnochenId();
  78. // Fügt dem Skellet einen Knochen hinzu
  79. // k: Der Knochen
  80. // elternId: Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden.
  81. __declspec( dllexport ) void addKnochen( Knochen *k, int elternId = -1 );
  82. // Berechnet die Matrizen der Knochen
  83. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  84. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  85. // scaleFactor: Die skallierung des Objektes
  86. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  87. // return: gibt die Anzahl der verwendeten Matrizen zurück
  88. __declspec( dllexport ) int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix );
  89. // Berechnet den Radius des Skeletts
  90. __declspec( dllexport ) float getRadius() const;
  91. // Kopiert das Skelett
  92. __declspec( dllexport ) Skelett *kopiereSkelett() const;
  93. // Erhöht den Reference Counting Zähler.
  94. // return: this.
  95. __declspec( dllexport ) Skelett *getThis();
  96. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  97. // return: 0.
  98. __declspec( dllexport ) Skelett *release();
  99. friend Animation3D;
  100. };
  101. // Eine struktor um für eine Ecke eines 3D Models die Raum Position, die Textur Koordinaten und den zugehörigen Knochen speichert
  102. struct Vertex3D
  103. {
  104. Vec3< float > pos; // Die Position der Ecke basierend zur Position des Knochens
  105. Vec2< float > tPos; // Die Textur Koordinaten der Ecke
  106. Vec3< float > normal; // Die Normale (zeigt nach außen und steht senkrecht auf der Oberfläche des models)
  107. int knochenId; // Die Id des Knochens, mit dem sich die Ecke bei einer Annimation mitbewegt
  108. };
  109. // Eine Struktur, die alle Dreiecke eines 3D Polygons speichert
  110. struct Polygon3D
  111. {
  112. int *indexList; // Die Liste mit den IDs der Ecken
  113. int indexAnz; // Die Länge der Liste mit den Ids der Ecken
  114. // Konstruktor
  115. __declspec( dllexport ) Polygon3D();
  116. // Destruktor
  117. __declspec( dllexport ) ~Polygon3D();
  118. };
  119. // Speichert alle Geometrischen Daten eines Modells, also
  120. // Raum - und Textur Koordinaten und Knochenzugehörigkeit aller Eckpunkte
  121. class Model3DData
  122. {
  123. private:
  124. Skelett *skelett;
  125. Vertex3D *vertexList;
  126. int vertexCount;
  127. Array< Polygon3D * > *polygons;
  128. float ambientFactor;
  129. float diffusFactor;
  130. float specularFactor;
  131. float radius;
  132. int id;
  133. int ref;
  134. public:
  135. // Konstruktor
  136. __declspec( dllexport ) Model3DData();
  137. // Destruktor
  138. __declspec( dllexport ) ~Model3DData();
  139. // Löscht alle Model daten
  140. __declspec( dllexport ) void clearModel();
  141. // Berechnet die normalen für die Eckpunkte des Modells
  142. __declspec( dllexport ) void calculateNormals();
  143. // Setzt den Zeiger auf ein standartmäßig verwendete Skelett
  144. // s: Das Skelett, das verwendet werden soll
  145. __declspec( dllexport ) void setSkelettZ( Skelett *s );
  146. // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
  147. // vertexList: Ein Array mit Vertecies
  148. // anz: Die Anzahl der Vertecies im Array
  149. __declspec( dllexport ) void setVertecies( Vertex3D *vertexList, int anz );
  150. // Fügt ein Polygon zum Model hinzu
  151. // polygon: Das Polygon, das hinzugefügt erden soll
  152. __declspec( dllexport ) void addPolygon( Polygon3D *polygon );
  153. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  154. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  155. __declspec( dllexport ) void setAmbientFactor( float f );
  156. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  157. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  158. __declspec( dllexport ) void setDiffusFactor( float f );
  159. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  160. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  161. __declspec( dllexport ) void setSpecularFactor( float f );
  162. // Konvertiert ein 2d Model zu 3D
  163. // model: Das 2d Model, das zu 3d konvertiert werden soll
  164. // z: Die z koordinate aller punkte des Models
  165. __declspec( dllexport ) void copyModel2D( Model2DData *model, float z );
  166. // Entfernt ein Polygon
  167. // index: Der Index des Polygons
  168. __declspec( dllexport ) void removePolygon( int index );
  169. // Berechnet die Matrizen der Knochen des Standart Skeletts
  170. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  171. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  172. // scaleFactor: Die Skallierung des Modells
  173. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  174. // return: gibt die Anzahl der verwendeten Matrizen zurück. 0, falls kein Standart Skelett gesetzt wurde
  175. int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix ) const;
  176. // Gibt die Anzahl an Polygonen zurück
  177. __declspec( dllexport ) int getPolygonAnzahl() const;
  178. // Gibt ein bestimmtes Polygon zurück
  179. // index: Der Index des Polygons
  180. __declspec( dllexport ) Polygon3D *getPolygon( int index ) const;
  181. // Gibt einen Iterator zurück, mit dem sich die Polygons auflisten lassen
  182. __declspec( dllexport ) Iterator< Polygon3D * > getPolygons() const;
  183. // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
  184. __declspec( dllexport ) float getRadius() const;
  185. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  186. __declspec( dllexport ) int getId() const;
  187. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  188. __declspec( dllexport ) float getAmbientFactor() const;
  189. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  190. __declspec( dllexport ) float getDiffusFactor() const;
  191. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  192. __declspec( dllexport ) float getSpecularFactor() const;
  193. // Gibt eine Kopie des Skeletts zurück, welches für annimationen verwendet werden kann
  194. __declspec( dllexport ) Skelett *copySkelett() const;
  195. // Gibt die Anzahl an Vertices zurück
  196. __declspec( dllexport ) int getVertexAnzahl() const;
  197. // Gibt einen Buffer mit allen Vertecies des Models zurück
  198. __declspec( dllexport ) const Vertex3D *zVertexBuffer() const;
  199. // Erhöht den Reference Counting Zähler.
  200. // return: this.
  201. __declspec( dllexport ) Model3DData *getThis();
  202. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  203. // return: 0.
  204. __declspec( dllexport ) Model3DData *release();
  205. friend Model3DList;
  206. };
  207. // Speichert eine Liste mit Texturen und für welche Polygone welche Textur benutzt werden soll
  208. class Model3DTextur
  209. {
  210. private:
  211. RCArray< Textur > *textures;
  212. int ref;
  213. public:
  214. // Konstruktor
  215. __declspec( dllexport ) Model3DTextur();
  216. // Destruktor
  217. __declspec( dllexport ) ~Model3DTextur();
  218. // Legt fest, welche Textur für welches Polygon ist
  219. // pI: Der Index des Polygons
  220. // txt: Die Textur des Polygons
  221. __declspec( dllexport ) void setPolygonTextur( int pI, Textur *txt );
  222. // Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
  223. // i: Der Index des Polygons
  224. __declspec( dllexport ) Textur *zPolygonTextur( int i ) const;
  225. // Erhöht den Reference Counting Zähler.
  226. // return: this.
  227. __declspec( dllexport ) Model3DTextur *getThis();
  228. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  229. // return: 0.
  230. __declspec( dllexport ) Model3DTextur *release();
  231. };
  232. // Eine Zeichnung des 3D Frameworks, die ein 3D Model mit Textur und Animation darstellen kann
  233. class Model3D : public Zeichnung3D
  234. {
  235. protected:
  236. struct AnimationData
  237. {
  238. Animation3D *a;
  239. double speed;
  240. double offset;
  241. AnimationData *getThis();
  242. AnimationData *release();
  243. };
  244. Skelett *skelett;
  245. Model3DData *model;
  246. Model3DTextur *textur;
  247. RCArray< AnimationData > *animations;
  248. public:
  249. // Konstruktor
  250. __declspec( dllexport ) Model3D();
  251. // Destruktor
  252. __declspec( dllexport ) virtual ~Model3D();
  253. // Fügt eine Animation hinzu
  254. // a: Die neue Animation
  255. __declspec( dllexport ) void addAnimation( Animation3D *a, double speed = 1 );
  256. // Entfernt eine Animation
  257. // zA: Die zu entfernende Animation
  258. __declspec( dllexport ) void removeAnimation( Animation3D *zA );
  259. // Setzt die Daten des Models
  260. // data: Die Daten
  261. __declspec( dllexport ) void setModelDaten( Model3DData *data );
  262. // Setzt die zum Zeichnen zu benutzenden Texturen
  263. // txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
  264. __declspec( dllexport ) void setModelTextur( Model3DTextur *txt );
  265. // Errechnet die Matrizen aller Knochen des Skeletts des Models
  266. // viewProj: Die miteinander multiplizierten Kameramatrizen
  267. // matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
  268. // return: Die Anzahl der Matrizen, die das Model benötigt
  269. __declspec( dllexport ) int errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer ) override;
  270. // Verarbeitet die vergangene Zeit
  271. // tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
  272. // return: true, wenn sich das Objekt verändert hat, false sonnst.
  273. __declspec( dllexport ) virtual bool tick( double tickval ) override;
  274. // Gibt die Textur zurück
  275. __declspec( dllexport ) Model3DTextur *getTextur();
  276. // Gibt die Textur zurück (ohne erhöhten Reference Counter)
  277. __declspec( dllexport ) Model3DTextur *zTextur();
  278. // Gibt die ModelDaten zurück
  279. __declspec( dllexport ) Model3DData *getModelData();
  280. // Gibt die ModelDaten zurück (ohne erhöhten Reference Counter)
  281. __declspec( dllexport ) Model3DData *zModelData();
  282. // prüft, ob ein Strahl dieses Objekt trifft
  283. // point: der startpunkt des Strahls in Weltkoordinaten
  284. // dir: die Richtung des Strahls in Weltkoordinaten
  285. // maxSqDist: Die maximale quadratische distanz die erlaubt ist
  286. // pId: die Id des Polygons, zu dem der Schnittpunkt gehört
  287. // return: den quadratischen Abstand des Schnittpunktes zum Ursprung des Strahls oder -1, wenn kein schnittpunkt existiert
  288. __declspec( dllexport ) virtual float traceRay( Vec3< float > &point, Vec3< float > &dir, float maxSqDist, int &pId ) const;
  289. // berechnet die Farbe des Schnittpunktes deines Strahls
  290. // point: der startpunkt des Strahls in Weltkoordinaten
  291. // dir: die Richtung des Strahls in Weltkoordinaten
  292. // zWelt: die Welt, aus der der Strahl kommt
  293. // return: die Farbe des Schnittpunktes
  294. __declspec( dllexport ) virtual int traceRay( Vec3< float > &point, Vec3< float > &dir, int pId, Welt3D *zWelt ) const;
  295. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  296. __declspec( dllexport ) int getDatenId() const;
  297. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  298. __declspec( dllexport ) float getAmbientFactor() const;
  299. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  300. __declspec( dllexport ) float getDiffusFactor() const;
  301. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  302. __declspec( dllexport ) float getSpecularFactor() const;
  303. // Gibt die Anzahl an Vertices zurück
  304. __declspec( dllexport ) int getVertexAnzahl() const;
  305. // Gibt einen Buffer mit allen Vertecies des Models zurück
  306. __declspec( dllexport ) const Vertex3D *zVertexBuffer() const;
  307. };
  308. }