Model3D.h 16 KB

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