Model3D.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. #include "Model3D.h"
  2. #include "Model2D.h"
  3. #include "DXBuffer.h"
  4. #include "Textur.h"
  5. #include "Animation3D.h"
  6. #ifdef WIN32
  7. #include "Render3D.h"
  8. #include <d3d11.h>
  9. #endif
  10. #include <stdexcept>
  11. using namespace Framework;
  12. // Inhalt der Knochen Klasse
  13. // Konstruktor
  14. Knochen::Knochen( int id )
  15. {
  16. pos = Vec3< float >( 0, 0, 0 );
  17. winkel = Vec3< float >( 0, 0, 0 );
  18. geschwister = 0;
  19. kinder = 0;
  20. this->id = id;
  21. }
  22. // Destruktor
  23. Knochen::~Knochen()
  24. {
  25. delete geschwister;
  26. delete kinder;
  27. }
  28. // private
  29. // Fügt dem Knochen ein Geschwister Knochen hinzu
  30. // k: Der Knochen, der hinzugefügt werden soll
  31. void Knochen::addGeschwisterKnochen( Knochen* k )
  32. {
  33. if( !geschwister )
  34. geschwister = k;
  35. else
  36. geschwister->addGeschwisterKnochen( k );
  37. }
  38. // public
  39. // Setzt die Position des Knochens relativ zum Model Ursprung
  40. // pos: Die Position
  41. void Knochen::setPosition( Vec3< float > & pos )
  42. {
  43. this->pos = pos;
  44. }
  45. // Setzt die Drehung des Knochens relativ zum Model Ursprung
  46. // winkel: Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat
  47. void Knochen::setDrehung( Vec3< float > & winkel )
  48. {
  49. this->winkel = winkel;
  50. }
  51. // Fügt einem bestimmten Knochen ein Kind Knochen hinzu
  52. // id: Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll
  53. // k: Der Knochen, der hinzugefügt werden soll
  54. void Knochen::addKind( int id, Knochen * k )
  55. {
  56. if( this->id == id )
  57. {
  58. if( !kinder )
  59. kinder = k;
  60. else
  61. kinder->addGeschwisterKnochen( k );
  62. }
  63. else
  64. {
  65. if( kinder )
  66. kinder->addKind( id, k );
  67. else
  68. {
  69. Text err = "Es wurde kein Knochen mit der Id: ";
  70. err += id;
  71. err += " im Skelett gefunden, um ein Kind Knochen hinzuzufügen. Datei:" __FILE__ ", Zeile: ";
  72. err += __LINE__;
  73. err += "!";
  74. delete k;
  75. throw std::out_of_range( (const char*)err );
  76. }
  77. }
  78. }
  79. // Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen
  80. // elternMat: Die fertig berechnete Matrix des Elternknochens
  81. // matBuffer: Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen
  82. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  83. void Knochen::kalkulateMatrix( Mat4< float > & elternMat, Mat4< float > * matBuffer, Mat4< float > & kamMat )
  84. {
  85. if( geschwister )
  86. geschwister->kalkulateMatrix( elternMat, matBuffer, kamMat );
  87. matBuffer[ id ] = matBuffer[ id ].translation( pos ) * matBuffer[ id ].rotationZ( winkel.z ) * matBuffer[ id ].rotationX( winkel.x ) * matBuffer[ id ].rotationY( winkel.y );
  88. matBuffer[ id ] = elternMat * matBuffer[ id ];
  89. if( kinder )
  90. kinder->kalkulateMatrix( matBuffer[ id ], matBuffer, kamMat );
  91. matBuffer[ id ] = kamMat * matBuffer[ id ];
  92. }
  93. // Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen
  94. Knochen * Knochen::kopiereKnochen() const
  95. {
  96. Knochen* ret = new Knochen( id );
  97. ret->pos = pos;
  98. ret->winkel = winkel;
  99. if( geschwister )
  100. ret->geschwister = geschwister->kopiereKnochen();
  101. if( kinder )
  102. ret->kinder = kinder->kopiereKnochen();
  103. return ret;
  104. }
  105. // Gibt die Id des Knochens zurück
  106. int Knochen::getId() const
  107. {
  108. return id;
  109. }
  110. // Gibt die Drehung des Knochens zurück
  111. Vec3< float > Knochen::getDrehung() const
  112. {
  113. return winkel;
  114. }
  115. // Gibt die Position des Knochens zurück
  116. Vec3< float > Knochen::getPosition() const
  117. {
  118. return pos;
  119. }
  120. // Gibt den Radius des Knochens zurück
  121. float Knochen::getRadius() const
  122. {
  123. float r = pos.getLength();
  124. if( geschwister )
  125. r = MAX( r, geschwister->getRadius() );
  126. if( kinder )
  127. r += kinder->getRadius();
  128. return r;
  129. }
  130. // Inhalt der Skelett Klasse
  131. // Konstruktor
  132. Skelett::Skelett()
  133. {
  134. k = 0;
  135. nextId = 0;
  136. ref = 1;
  137. }
  138. // Destruktor
  139. Skelett::~Skelett()
  140. {
  141. if( k )
  142. delete k;
  143. }
  144. // Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach
  145. // Es können maximal MAX_KNOCHEN_ANZ Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben
  146. int Skelett::getNextKnochenId()
  147. {
  148. return nextId++;
  149. }
  150. // Fügt dem Skellet einen Knochen hinzu
  151. // k: Der Knochen
  152. // elternId: Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden.
  153. void Skelett::addKnochen( Knochen * k, int elternId )
  154. {
  155. if( !this->k )
  156. this->k = k;
  157. else
  158. this->k->addKind( elternId, k );
  159. if( k->getId() >= nextId )
  160. nextId = k->getId() + 1;
  161. }
  162. // Berechnet die Matrizen der Knochen
  163. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  164. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  165. // return: gibt die Anzahl der verwendeten Matrizen zurück
  166. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  167. int Skelett::kalkulateMatrix( Mat4< float > & modelMatrix, Mat4< float > * matBuffer, Mat4< float > & kamMatrix )
  168. {
  169. k->kalkulateMatrix( modelMatrix, matBuffer, kamMatrix );
  170. return nextId;
  171. }
  172. // Berechnet den Radius des Skeletts
  173. float Skelett::getRadius() const
  174. {
  175. if( k )
  176. return k->getRadius();
  177. return 0;
  178. }
  179. // Kopiert das Skelett
  180. Skelett* Skelett::kopiereSkelett() const
  181. {
  182. Skelett* ret = new Skelett();
  183. ret->nextId = nextId;
  184. if( k )
  185. ret->addKnochen( k->kopiereKnochen() );
  186. return ret;
  187. }
  188. // Erhöht den Reference Counting Zähler.
  189. Skelett* Skelett::getThis()
  190. {
  191. ref++;
  192. return this;
  193. }
  194. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  195. // return: 0.
  196. Skelett* Skelett::release()
  197. {
  198. ref--;
  199. if( !ref )
  200. delete this;
  201. return 0;
  202. }
  203. // Inhalt des Polygon3D Struct
  204. // Konstruktor
  205. Polygon3D::Polygon3D()
  206. {
  207. indexAnz = 0;
  208. indexList = 0;
  209. indexBuffer = new DXIndexBuffer( sizeof( int ) );
  210. }
  211. // Destruktor
  212. Polygon3D::~Polygon3D()
  213. {
  214. indexBuffer->release();
  215. delete[] indexList;
  216. }
  217. // Inhalt der Model3DData Klasse
  218. // Konstruktor
  219. Model3DData::Model3DData()
  220. {
  221. id = -1;
  222. skelett = 0;
  223. vertexList = 0;
  224. vertexCount = 0;
  225. polygons = new Array< Polygon3D* >();
  226. vertexBuffer = new DXVertexBuffer( sizeof( Vertex3D ) );
  227. ambientFactor = 1.f;
  228. diffusFactor = 0.f;
  229. specularFactor = 0.f;
  230. radius = 0;
  231. ref = 1;
  232. }
  233. // Destruktor
  234. Model3DData::~Model3DData()
  235. {
  236. clearModel();
  237. vertexBuffer->release();
  238. polygons->release();
  239. }
  240. // Löscht alle Model daten
  241. void Model3DData::clearModel()
  242. {
  243. delete[] vertexList;
  244. vertexCount = 0;
  245. vertexList = 0;
  246. for( auto i = polygons->getIterator(); i; i++ )
  247. delete i;
  248. polygons->leeren();
  249. if( skelett )
  250. skelett->release();
  251. skelett = 0;
  252. radius = 0;
  253. }
  254. // Berechnet die normalen für die Eckpunkte des Modells
  255. void Model3DData::calculateNormals()
  256. {
  257. for( int i = 0; i < vertexCount; i++ )
  258. {
  259. Vec3< float > normal( 0, 0, 0 );
  260. for( auto p = polygons->getIterator(); p; p++ )
  261. {
  262. int begin = 0;
  263. for( int j = 0; j < p->indexAnz; j++ )
  264. {
  265. if( j % 3 == 0 )
  266. begin = j;
  267. if( p->indexList[ j ] == i )
  268. {
  269. Vec3< float > a = vertexList[ p->indexList[ begin ] ].pos;
  270. Vec3< float > b = vertexList[ p->indexList[ begin + 1 ] ].pos;
  271. Vec3< float > c = vertexList[ p->indexList[ begin + 2 ] ].pos;
  272. normal += ( b - a ).crossProduct( c - a ).normalize();
  273. normal.normalize();
  274. }
  275. }
  276. }
  277. vertexList[ i ].normal = normal;
  278. }
  279. }
  280. // Setzt den Zeiger auf ein standartmäßig verwendete Skelett
  281. // s: Das Skelett, das verwendet werden soll
  282. void Model3DData::setSkelettZ( Skelett * s )
  283. {
  284. if( skelett )
  285. skelett->release();
  286. skelett = s;
  287. }
  288. // Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models
  289. // vertexList: Ein Array mit Vertecies
  290. // anz: Die Anzahl der Vertecies im Array
  291. void Model3DData::setVertecies( Vertex3D * vertexList, int anz )
  292. {
  293. delete[] this->vertexList;
  294. this->vertexList = vertexList;
  295. vertexBuffer->setData( vertexList );
  296. vertexBuffer->setLength( ( int )sizeof( Vertex3D ) * anz );
  297. vertexCount = anz;
  298. radius = 0;
  299. for( int i = 0; i < anz; i++ )
  300. {
  301. float r = vertexList[ i ].pos.getLength();
  302. if( r > radius )
  303. radius = r;
  304. }
  305. }
  306. // Fügt ein Polygon zum Model hinzu
  307. // polygon: Das Polygon, das hinzugefügt erden soll
  308. void Model3DData::addPolygon( Polygon3D * polygon )
  309. {
  310. polygons->add( polygon );
  311. }
  312. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  313. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  314. void Model3DData::setAmbientFactor( float f )
  315. {
  316. ambientFactor = f;
  317. }
  318. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  319. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  320. void Model3DData::setDiffusFactor( float f )
  321. {
  322. diffusFactor = f;
  323. }
  324. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  325. // f: der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1)
  326. void Model3DData::setSpecularFactor( float f )
  327. {
  328. specularFactor = f;
  329. }
  330. // Konvertiert ein 2d Model zu 3D
  331. // model: Das 2d Model, das zu 3d konvertiert werden soll
  332. // z: Die z koordinate aller punkte des Models
  333. void Model3DData::copyModel2D( Model2DData * model, float z )
  334. {
  335. if( model && model->vListen && model->polygons )
  336. {
  337. clearModel();
  338. int vAnz = 0;
  339. for( auto i = model->polygons->getIterator(); i; i++ )
  340. vAnz += i._.vertex->getEintragAnzahl();
  341. vertexList = new Vertex3D[ vAnz ];
  342. vertexBuffer->setData( vertexList );
  343. vertexBuffer->setLength( ( int )sizeof( Vertex3D ) * vAnz );
  344. int index = 0;
  345. for( auto i = model->vListen->getIterator(); i; i++ )
  346. {
  347. Polygon3D* p = new Polygon3D();
  348. p->indexAnz = 0;
  349. for( auto j = i->getIterator(); j; j++ )
  350. {
  351. for( auto k = j->zListe()->getIterator(); k.hasNext() && k.next().hasNext(); k++ )
  352. p->indexAnz += 3;
  353. }
  354. p->indexList = new int[ p->indexAnz ];
  355. p->indexBuffer->setData( p->indexList );
  356. p->indexBuffer->setLength( ( int )sizeof( int ) * p->indexAnz );
  357. p->indexAnz = 0;
  358. for( auto j = i->getIterator(); j; j++ )
  359. {
  360. for( auto k = j->zListe()->getIterator(); k; k++ )
  361. {
  362. vertexList[ index ].pos = Vec3< float >( k->punkt->x, k->punkt->y, z );
  363. vertexList[ index ].tPos = ( Vec2< float > ) * k->textur;
  364. if( k.hasNext() && k.next().hasNext() )
  365. {
  366. p->indexList[ p->indexAnz ] = index;
  367. p->indexAnz++;
  368. p->indexList[ p->indexAnz ] = index + 1;
  369. p->indexAnz++;
  370. p->indexList[ p->indexAnz ] = index + 2;
  371. p->indexAnz++;
  372. }
  373. index++;
  374. }
  375. }
  376. addPolygon( p );
  377. }
  378. }
  379. }
  380. // Entfernt ein Polygon
  381. // index: Der Index des Polygons
  382. void Model3DData::removePolygon( int index )
  383. {
  384. if( !polygons->hat( index ) )
  385. return;
  386. delete polygons->get( index );
  387. polygons->remove( index );
  388. }
  389. // Aktualisiert die Vertecies
  390. // zRObj: Das Objekt, mit dem die Grafikkarte verwaltet wird
  391. void Model3DData::aktualisiereVertecies( Render3D * zRObj )
  392. {
  393. vertexBuffer->copieren( zRObj );
  394. }
  395. // Berechnet die Matrizen der Knochen
  396. // modelMatrix: Die Matrix, die das Skelett in den Raum der Welt transformiert
  397. // matBuffer: Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird
  398. // return: gibt die Anzahl der verwendeten Matrizen zurück
  399. // kamMatrix: Die vereiniegung der view und projektions Matrizen
  400. int Model3DData::kalkulateMatrix( Mat4< float > & modelMatrix, Mat4< float > * matBuffer, Mat4< float > & kamMatrix ) const
  401. {
  402. if( !skelett )
  403. return 0;
  404. return skelett->kalkulateMatrix( modelMatrix, matBuffer, kamMatrix );
  405. }
  406. // Zeichnet alle Polygons
  407. // world: Die Welt Matrix, die das Model in die Welt transformiert
  408. // zTxt: Eine Liste mit Texturen der einzelnen Polygone
  409. // zRObj: Das Objekt, mit dem gezeichnet werden soll
  410. void Model3DData::render( Mat4< float > & welt, const Model3DTextur * zTxt, Render3D * zRObj )
  411. {
  412. int ind = 0;
  413. for( auto i = polygons->getIterator(); i; i++ )
  414. {
  415. i->indexBuffer->copieren( zRObj );
  416. Textur* t = zTxt->zPolygonTextur( ind );
  417. if( t&& t->brauchtUpdate() )
  418. t->updateTextur( zRObj );
  419. #ifdef WIN32
  420. zRObj->draw( i->indexBuffer, t );
  421. #endif
  422. ind++;
  423. }
  424. }
  425. // Gibt die Anzahl an Polygonen zurück
  426. int Model3DData::getPolygonAnzahl() const
  427. {
  428. return polygons->getEintragAnzahl();
  429. }
  430. // Gibt ein bestimmtes Polygon zurück
  431. // index: Der Index des Polygons
  432. Polygon3D* Model3DData::getPolygon( int index ) const
  433. {
  434. if( !polygons->hat( index ) )
  435. return 0;
  436. return polygons->get( index );
  437. }
  438. // Gibt den radius einer Kugel zurück, die das gesammte Model umschließt
  439. float Model3DData::getRadius() const
  440. {
  441. return radius;
  442. }
  443. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  444. int Model3DData::getId() const
  445. {
  446. return id;
  447. }
  448. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  449. float Model3DData::getAmbientFactor() const
  450. {
  451. return ambientFactor;
  452. }
  453. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  454. float Model3DData::getDiffusFactor() const
  455. {
  456. return diffusFactor;
  457. }
  458. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  459. float Model3DData::getSpecularFactor() const
  460. {
  461. return specularFactor;
  462. }
  463. // Gibt einen Buffer mit allen Vertecies des Models zurück
  464. const DXVertexBuffer* Model3DData::zVertexBuffer() const
  465. {
  466. return vertexBuffer;
  467. }
  468. // Erhöht den Reference Counting Zähler.
  469. // return: this.
  470. Model3DData* Model3DData::getThis()
  471. {
  472. ref++;
  473. return this;
  474. }
  475. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  476. // return: 0.
  477. Model3DData* Model3DData::release()
  478. {
  479. ref--;
  480. if( !ref )
  481. delete this;
  482. return 0;
  483. }
  484. // Inhalt der Model3DTextur
  485. // Konstruktor
  486. Model3DTextur::Model3DTextur()
  487. {
  488. textures = new RCArray< Textur >();
  489. ref = 1;
  490. }
  491. // Destruktor
  492. Model3DTextur::~Model3DTextur()
  493. {
  494. textures->release();
  495. }
  496. // Legt fest, welche Textur für welches Polygon ist
  497. // pI: Der Index des Polygons
  498. // txt: Die Textur des Polygons
  499. void Model3DTextur::setPolygonTextur( int pI, Textur * txt )
  500. {
  501. textures->set( txt, pI );
  502. }
  503. // Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter
  504. // i: Der Index des Polygons
  505. Textur* Model3DTextur::zPolygonTextur( int i ) const
  506. {
  507. return textures->z( i );
  508. }
  509. // Erhöht den Reference Counting Zähler.
  510. // return: this.
  511. Model3DTextur* Model3DTextur::getThis()
  512. {
  513. ref++;
  514. return this;
  515. }
  516. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  517. // return: 0.
  518. Model3DTextur* Model3DTextur::release()
  519. {
  520. ref--;
  521. if( !ref )
  522. delete this;
  523. return 0;
  524. }
  525. // Inhalt der AnimationData Struktur
  526. Model3D::AnimationData* Model3D::AnimationData::getThis()
  527. {
  528. return this;
  529. }
  530. Model3D::AnimationData* Model3D::AnimationData::release()
  531. {
  532. a->release();
  533. delete this;
  534. return 0;
  535. }
  536. // Inhalt der Model3D Klasse
  537. // Konstruktor
  538. Model3D::Model3D()
  539. : Zeichnung3D()
  540. {
  541. model = 0;
  542. textur = 0;
  543. skelett = 0;
  544. animations = new RCArray< AnimationData >();
  545. }
  546. // Destruktor
  547. Model3D::~Model3D()
  548. {
  549. if( model )
  550. model->release();
  551. if( textur )
  552. textur->release();
  553. if( skelett )
  554. skelett->release();
  555. animations->release();
  556. }
  557. // Fügt eine Animation hinzu
  558. // a: Die neue Animation
  559. void Model3D::addAnimation( Animation3D * a, double speed )
  560. {
  561. AnimationData* d = new AnimationData();
  562. d->a = a;
  563. d->speed = speed;
  564. d->offset = 0;
  565. animations->add( d );
  566. }
  567. // Entfernt eine Animation
  568. // zA: Die zu entfernende Animation
  569. void Model3D::removeAnimation( Animation3D * zA )
  570. {
  571. for( int i = 0; i < animations->getEintragAnzahl(); i++ )
  572. {
  573. if( animations->z( i )->a == zA )
  574. {
  575. animations->remove( i );
  576. return;
  577. }
  578. }
  579. }
  580. // Setzt den Zeiger auf das zum Annimieren verwendete Skelett
  581. // s: Das Skelett, das verwendet werden soll
  582. void Model3D::setSkelettZ( Skelett * s )
  583. {
  584. if( skelett )
  585. skelett->release();
  586. skelett = s;
  587. }
  588. // Setzt die Daten des Models
  589. // data: Die Daten
  590. void Model3D::setModelDaten( Model3DData * data )
  591. {
  592. if( model )
  593. model->release();
  594. model = data;
  595. }
  596. // Setzt die zum Zeichnen zu benutzenden Texturen
  597. // txt: Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet
  598. void Model3D::setModelTextur( Model3DTextur * txt )
  599. {
  600. if( textur )
  601. textur->release();
  602. textur = txt;
  603. }
  604. // Errechnet die Matrizen aller Knochen des Skeletts des Models
  605. // viewProj: Die miteinander multiplizierten Kameramatrizen
  606. // matBuffer: Ein Array mit Matrizen, der gefüllt werden soll
  607. // return: Die Anzahl der Matrizen, die das Model benötigt
  608. int Model3D::errechneMatrizen( Mat4< float > & viewProj, Mat4< float > * matBuffer )
  609. {
  610. int ret = 0;
  611. if( skelett )
  612. ret = skelett->kalkulateMatrix( welt, matBuffer, viewProj );
  613. else if( model )
  614. ret = model->kalkulateMatrix( welt, matBuffer, viewProj );
  615. if( !ret )
  616. return Zeichnung3D::errechneMatrizen( viewProj, matBuffer );
  617. return ret;
  618. }
  619. // Verarbeitet die vergangene Zeit
  620. // tickval: Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist
  621. // return: true, wenn sich das Objekt verändert hat, false sonnst.
  622. bool Model3D::tick( double tickval )
  623. {
  624. radius = model ? model->getRadius() : 0;
  625. if( skelett )
  626. {
  627. radius += skelett->getRadius();
  628. for( auto i = animations->getIterator(); i && i._; i++ )
  629. {
  630. rend = i->speed > 0;
  631. i->a->apply( skelett, i->offset, tickval * i->speed );
  632. }
  633. }
  634. return Zeichnung3D::tick( tickval );
  635. }
  636. // Zeichnet das Model
  637. // zRObj: Ein Zeiger auf das Objekt, das zum Zeichnen verwendet werden soll (ohne erhöhten Reference Counter)
  638. void Model3D::render( Render3D * zRObj )
  639. {
  640. if( !model )
  641. return;
  642. model->aktualisiereVertecies( zRObj );
  643. #ifdef WIN32
  644. zRObj->beginnModel( this );
  645. #endif
  646. model->render( welt, textur, zRObj );
  647. }
  648. // Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister())
  649. int Model3D::getDatenId() const
  650. {
  651. return model ? model->getId() : -1;
  652. }
  653. // Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird
  654. float Model3D::getAmbientFactor() const
  655. {
  656. return model ? model->getAmbientFactor() : 0.f;
  657. }
  658. // Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird
  659. float Model3D::getDiffusFactor() const
  660. {
  661. return model ? model->getDiffusFactor() : 0.f;
  662. }
  663. // Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird
  664. float Model3D::getSpecularFactor() const
  665. {
  666. return model ? model->getSpecularFactor() : 0.f;
  667. }
  668. // Gibt einen Buffer mit allen Vertecies des Models zurück
  669. const DXVertexBuffer* Model3D::zVertexBuffer() const
  670. {
  671. return model ? model->zVertexBuffer() : 0;
  672. }