Model3D.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. #include "Model3D.h"
  2. #include "Render3D.h"
  3. #include "Model2D.h"
  4. #include "DXBuffer.h"
  5. #include "Textur.h"
  6. #include <d3d11.h>
  7. using namespace Framework;
  8. // Inhalt des Polygon3D Struct
  9. // Konstruktor
  10. Polygon3D::Polygon3D()
  11. {
  12. indexAnz = 0;
  13. indexList = 0;
  14. indexBuffer = new DXIndexBuffer( sizeof( int ) );
  15. }
  16. // Destruktor
  17. Polygon3D::~Polygon3D()
  18. {
  19. indexBuffer->release();
  20. delete[] indexList;
  21. }
  22. // Inhalt der Model3DData Klasse
  23. // Konstruktor
  24. Model3DData::Model3DData()
  25. {
  26. id = -1;
  27. vertexList = 0;
  28. polygons = new Array< Polygon3D* >();
  29. vertexBuffer = new DXVertexBuffer( sizeof( Vertex3D ) );
  30. radius = 0;
  31. ref = 1;
  32. }
  33. // Destruktor
  34. Model3DData::~Model3DData()
  35. {
  36. clearModel();
  37. vertexBuffer->release();
  38. polygons->release();
  39. }
  40. // Löscht alle Model daten
  41. void Model3DData::clearModel()
  42. {
  43. delete[] vertexList;
  44. vertexList = 0;
  45. for( auto i = polygons->getArray(); i.set; i++ )
  46. delete i.var;
  47. polygons->leeren();
  48. }
  49. // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
  50. // vertexList: Ein Array mit Vertecies
  51. // anz: Die Anzahl der Vertecies im Array
  52. void Model3DData::setVertecies( Vertex3D *vertexList, int anz )
  53. {
  54. clearModel();
  55. this->vertexList = vertexList;
  56. vertexBuffer->setData( vertexList );
  57. vertexBuffer->setLänge( sizeof( Vertex3D ) * anz );
  58. radius = 0;
  59. for( int i = 0; i < anz; i++ )
  60. {
  61. float r = vertexList[ i ].pos.län();
  62. if( r > radius )
  63. radius = r;
  64. }
  65. }
  66. // Fügt ein Polygon zum Model hinzu
  67. // polygon: Das Polygon, das hinzugefügt erden soll
  68. void Model3DData::addPolygon( Polygon3D *polygon )
  69. {
  70. polygons->add( polygon );
  71. }
  72. // Konvertiert ein 2d Model zu 3D
  73. // model: Das 2d Model, das zu 3d konvertiert werden soll
  74. // z: Die z koordinate aller punkte des Models
  75. void Model3DData::copyModel2D( Model2DData *model, float z )
  76. {
  77. if( model && model->vListen && model->polygons )
  78. {
  79. clearModel();
  80. int vAnz = 0;
  81. for( auto i = model->polygons->getArray(); i.set; i++ )
  82. vAnz += i.var.vertex->getEintragAnzahl();
  83. vertexList = new Vertex3D[ vAnz ];
  84. vertexBuffer->setData( vertexList );
  85. vertexBuffer->setLänge( sizeof( Vertex3D ) * vAnz );
  86. int index = 0;
  87. for( auto i = model->vListen->getArray(); i.set; i++ )
  88. {
  89. Polygon3D *p = new Polygon3D();
  90. p->indexAnz = 0;
  91. for( auto j = i.var->getArray(); j.set; j++ )
  92. {
  93. for( auto *k = &j.var->zListe()->getArray(); k->next->next && k->next->next->set; k = k->next )
  94. p->indexAnz += 3;
  95. }
  96. p->indexList = new int[ p->indexAnz ];
  97. p->indexBuffer->setData( p->indexList );
  98. p->indexBuffer->setLänge( sizeof( int ) * p->indexAnz );
  99. p->indexAnz = 0;
  100. for( auto j = i.var->getArray(); j.set; j++ )
  101. {
  102. for( auto *k = &j.var->zListe()->getArray(); k && k->set; k = k->next )
  103. {
  104. vertexList[ index ].pos = Vec3< float >( k->var->punkt->x, k->var->punkt->y, z );
  105. vertexList[ index ].tPos = (Vec2< float >)*k->var->textur;
  106. if( k->next && k->next->set && k->next->next && k->next->next->set )
  107. {
  108. p->indexList[ p->indexAnz ] = index;
  109. p->indexAnz++;
  110. p->indexList[ p->indexAnz ] = index + 1;
  111. p->indexAnz++;
  112. p->indexList[ p->indexAnz ] = index + 2;
  113. p->indexAnz++;
  114. }
  115. index++;
  116. }
  117. }
  118. addPolygon( p );
  119. }
  120. }
  121. }
  122. // Entfernt ein Polygon
  123. // index: Der Index des Polygons
  124. void Model3DData::removePolygon( int index )
  125. {
  126. if( !polygons->hat( index ) )
  127. return;
  128. delete polygons->get( index );
  129. polygons->lösche( index );
  130. }
  131. // Zeichnet alle Polygons
  132. // world: Die Welt Matrix, die das Model in die Welt transformiert
  133. // zTxt: Eine Liste mit Texturen der einzelnen Polygone
  134. // zRObj: Das Objekt, mit dem gezeichnet werden soll
  135. void Model3DData::render( Mat4< float > &welt, const Model3DTextur *zTxt, Render3D *zRObj )
  136. {
  137. vertexBuffer->copieren( zRObj );
  138. zRObj->beginnModel( welt, vertexBuffer, id );
  139. int ind = 0;
  140. for( auto *i = &polygons->getArray(); i && i->set; i = i->next )
  141. {
  142. i->var->indexBuffer->copieren( zRObj );
  143. Textur *t = zTxt->zPolygonTextur( ind );
  144. if( t && t->brauchtUpdate() )
  145. t->updateTextur( zRObj );
  146. zRObj->draw( i->var->indexBuffer, t );
  147. ind++;
  148. }
  149. }
  150. // Gibt die Anzahl an Polygonen zurück
  151. int Model3DData::getPolygonAnzahl()
  152. {
  153. return polygons->getEintragAnzahl();
  154. }
  155. // Gibt ein bestimmtes Polygon zurück
  156. // index: Der Index des Polygons
  157. Polygon3D *Model3DData::getPolygon( int index )
  158. {
  159. if( !polygons->hat( index ) )
  160. return 0;
  161. return polygons->get( index );
  162. }
  163. // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
  164. float Model3DData::getRadius() const
  165. {
  166. return radius;
  167. }
  168. // Erhöht den Reference Counting Zähler.
  169. // return: this.
  170. Model3DData *Model3DData::getThis()
  171. {
  172. ref++;
  173. return this;
  174. }
  175. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  176. // return: 0.
  177. Model3DData *Model3DData::release()
  178. {
  179. ref--;
  180. if( !ref )
  181. delete this;
  182. return 0;
  183. }
  184. // Inhalt der Model3DTextur
  185. // Konstruktor
  186. Model3DTextur::Model3DTextur()
  187. {
  188. textures = new RCArray< Textur >();
  189. ref = 1;
  190. }
  191. // Destruktor
  192. Model3DTextur::~Model3DTextur()
  193. {
  194. textures->release();
  195. }
  196. // Legt fest, welche Textur für welches Polygon ist
  197. // pI: Der Index des Polygons
  198. // txt: Die Textur des Polygons
  199. void Model3DTextur::setPolygonTextur( int pI, Textur *txt )
  200. {
  201. textures->set( txt, pI );
  202. }
  203. // Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
  204. // i: Der Index des Polygons
  205. Textur *Model3DTextur::zPolygonTextur( int i ) const
  206. {
  207. return textures->z( i );
  208. }
  209. // Erhöht den Reference Counting Zähler.
  210. // return: this.
  211. Model3DTextur *Model3DTextur::getThis()
  212. {
  213. ref++;
  214. return this;
  215. }
  216. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  217. // return: 0.
  218. Model3DTextur *Model3DTextur::release()
  219. {
  220. ref--;
  221. if( !ref )
  222. delete this;
  223. return 0;
  224. }
  225. // Inhalt der Model3D Klasse
  226. // Konstruktor
  227. Model3D::Model3D()
  228. : Zeichnung3D()
  229. {
  230. model = 0;
  231. textur = 0;
  232. ref = 1;
  233. }
  234. // Destruktor
  235. Model3D::~Model3D()
  236. {
  237. if( model )
  238. model->release();
  239. if( textur )
  240. textur->release();
  241. }
  242. // Setzt die Daten des Models
  243. // data: Die Daten
  244. void Model3D::setModelDaten( Model3DData *data )
  245. {
  246. if( model )
  247. model->release();
  248. model = data;
  249. }
  250. // Setzt die zum Zeichnen zu benutzenden Texturen
  251. // txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
  252. void Model3D::setModelTextur( Model3DTextur *txt )
  253. {
  254. if( textur )
  255. textur->release();
  256. textur = txt;
  257. }
  258. // Verarbeitet die vergangene Zeit
  259. // tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
  260. // return: true, wenn sich das Objekt verändert hat, false sonnst.
  261. bool Model3D::tick( double tickval )
  262. {
  263. radius = model ? model->getRadius() : 0;
  264. return __super::tick( tickval );
  265. }
  266. // Zeichnet das Model
  267. // zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
  268. void Model3D::render( Render3D *zRObj )
  269. {
  270. if( !model )
  271. return;
  272. model->render( welt, textur, zRObj );
  273. }
  274. // Erhöht den Reference Counting Zähler.
  275. // return: this.
  276. Model3D *Model3D::getThis()
  277. {
  278. ref++;
  279. return this;
  280. }
  281. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  282. // return: 0.
  283. Model3D *Model3D::release()
  284. {
  285. ref--;
  286. if( !ref )
  287. delete this;
  288. return 0;
  289. }