Model3D.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. // Aktualisiert die Vertecies
  132. // zRObj: Das Objekt, mit dem die Grafikkarte verwaltet wird
  133. void Model3DData::aktualisiereVertecies( Render3D *zRObj )
  134. {
  135. vertexBuffer->copieren( zRObj );
  136. }
  137. // Zeichnet alle Polygons
  138. // world: Die Welt Matrix, die das Model in die Welt transformiert
  139. // zTxt: Eine Liste mit Texturen der einzelnen Polygone
  140. // zRObj: Das Objekt, mit dem gezeichnet werden soll
  141. void Model3DData::render( Mat4< float > &welt, const Model3DTextur *zTxt, Render3D *zRObj )
  142. {
  143. int ind = 0;
  144. for( auto *i = &polygons->getArray(); i && i->set; i = i->next )
  145. {
  146. i->var->indexBuffer->copieren( zRObj );
  147. Textur *t = zTxt->zPolygonTextur( ind );
  148. if( t && t->brauchtUpdate() )
  149. t->updateTextur( zRObj );
  150. zRObj->draw( i->var->indexBuffer, t );
  151. ind++;
  152. }
  153. }
  154. // Gibt die Anzahl an Polygonen zurück
  155. int Model3DData::getPolygonAnzahl()
  156. {
  157. return polygons->getEintragAnzahl();
  158. }
  159. // Gibt ein bestimmtes Polygon zurück
  160. // index: Der Index des Polygons
  161. Polygon3D *Model3DData::getPolygon( int index )
  162. {
  163. if( !polygons->hat( index ) )
  164. return 0;
  165. return polygons->get( index );
  166. }
  167. // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
  168. float Model3DData::getRadius() const
  169. {
  170. return radius;
  171. }
  172. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  173. int Model3DData::getId() const
  174. {
  175. return id;
  176. }
  177. // Gibt einen Buffer mit allen Vertecies des Models zurück
  178. const DXVertexBuffer *Model3DData::zVertexBuffer() const
  179. {
  180. return vertexBuffer;
  181. }
  182. // Erhöht den Reference Counting Zähler.
  183. // return: this.
  184. Model3DData *Model3DData::getThis()
  185. {
  186. ref++;
  187. return this;
  188. }
  189. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  190. // return: 0.
  191. Model3DData *Model3DData::release()
  192. {
  193. ref--;
  194. if( !ref )
  195. delete this;
  196. return 0;
  197. }
  198. // Inhalt der Model3DTextur
  199. // Konstruktor
  200. Model3DTextur::Model3DTextur()
  201. {
  202. textures = new RCArray< Textur >();
  203. ref = 1;
  204. }
  205. // Destruktor
  206. Model3DTextur::~Model3DTextur()
  207. {
  208. textures->release();
  209. }
  210. // Legt fest, welche Textur für welches Polygon ist
  211. // pI: Der Index des Polygons
  212. // txt: Die Textur des Polygons
  213. void Model3DTextur::setPolygonTextur( int pI, Textur *txt )
  214. {
  215. textures->set( txt, pI );
  216. }
  217. // Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
  218. // i: Der Index des Polygons
  219. Textur *Model3DTextur::zPolygonTextur( int i ) const
  220. {
  221. return textures->z( i );
  222. }
  223. // Erhöht den Reference Counting Zähler.
  224. // return: this.
  225. Model3DTextur *Model3DTextur::getThis()
  226. {
  227. ref++;
  228. return this;
  229. }
  230. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  231. // return: 0.
  232. Model3DTextur *Model3DTextur::release()
  233. {
  234. ref--;
  235. if( !ref )
  236. delete this;
  237. return 0;
  238. }
  239. // Inhalt der Model3D Klasse
  240. // Konstruktor
  241. Model3D::Model3D()
  242. : Zeichnung3D()
  243. {
  244. model = 0;
  245. textur = 0;
  246. ref = 1;
  247. }
  248. // Destruktor
  249. Model3D::~Model3D()
  250. {
  251. if( model )
  252. model->release();
  253. if( textur )
  254. textur->release();
  255. }
  256. // Setzt die Daten des Models
  257. // data: Die Daten
  258. void Model3D::setModelDaten( Model3DData *data )
  259. {
  260. if( model )
  261. model->release();
  262. model = data;
  263. }
  264. // Setzt die zum Zeichnen zu benutzenden Texturen
  265. // txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
  266. void Model3D::setModelTextur( Model3DTextur *txt )
  267. {
  268. if( textur )
  269. textur->release();
  270. textur = txt;
  271. }
  272. // Verarbeitet die vergangene Zeit
  273. // tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
  274. // return: true, wenn sich das Objekt verändert hat, false sonnst.
  275. bool Model3D::tick( double tickval )
  276. {
  277. radius = model ? model->getRadius() : 0;
  278. return __super::tick( tickval );
  279. }
  280. // Zeichnet das Model
  281. // zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
  282. void Model3D::render( Render3D *zRObj )
  283. {
  284. if( !model )
  285. return;
  286. zRObj->beginnModel( this );
  287. model->render( welt, textur, zRObj );
  288. }
  289. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  290. int Model3D::getDatenId() const
  291. {
  292. return model ? model->getId() : -1;
  293. }
  294. // Gibt einen Buffer mit allen Vertecies des Models zurück
  295. const DXVertexBuffer *Model3D::zVertexBuffer() const
  296. {
  297. return model ? model->zVertexBuffer() : 0;
  298. }
  299. // Erhöht den Reference Counting Zähler.
  300. // return: this.
  301. Model3D *Model3D::getThis()
  302. {
  303. ref++;
  304. return this;
  305. }
  306. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  307. // return: 0.
  308. Model3D *Model3D::release()
  309. {
  310. ref--;
  311. if( !ref )
  312. delete this;
  313. return 0;
  314. }