Model3D.h 18 KB

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