Model3D.h 18 KB

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