Model3D.cpp 19 KB

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