Model3D.h 17 KB

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