KEDModel2DEditor.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  1. #include "KEDModel2DEditor.h"
  2. #include <Rahmen.h>
  3. #include <MausEreignis.h>
  4. #include <Text.h>
  5. #include <Schrift.h>
  6. #include <Scroll.h>
  7. #include <Globals.h>
  8. #include <TastaturEreignis.h>
  9. #include "../../../../Global/Initialisierung.h"
  10. #include "../../../../Global/Variablen.h"
  11. using namespace Model2DEditor;
  12. // Inhalt der VertexData Klasse aus KEDModel2DEditor.h
  13. // Konstruktor
  14. VertexData::VertexData( Vec2< float > v, Punkt t )
  15. {
  16. vertex = v;
  17. textur = t;
  18. selected = 0;
  19. sichtbar = 1;
  20. ref = 1;
  21. }
  22. // nicht constant
  23. void VertexData::nachLinks( float num )
  24. {
  25. if( selected )
  26. vertex.x -= num;
  27. }
  28. void VertexData::nachOben( float num )
  29. {
  30. if( selected )
  31. vertex.y -= num;
  32. }
  33. void VertexData::saveTextur( Punkt tPos, Punkt tGr )
  34. {
  35. textur = vertex - tPos;
  36. textur.x /= tGr.x;
  37. textur.y /= tGr.y;
  38. }
  39. void VertexData::select( Punkt p1, Punkt p2 )
  40. {
  41. selected |= vertex.istInRegion( p1, p2 ) && sichtbar;
  42. }
  43. void VertexData::deSelect()
  44. {
  45. selected = 0;
  46. }
  47. void VertexData::setAuswahl( bool ausw )
  48. {
  49. selected = ausw;
  50. }
  51. void VertexData::setSichtbar( bool s )
  52. {
  53. sichtbar = s;
  54. selected &= sichtbar;
  55. }
  56. // constant
  57. bool VertexData::istSichtbar() const
  58. {
  59. return sichtbar;
  60. }
  61. bool VertexData::istAusgewählt() const
  62. {
  63. return selected;
  64. }
  65. Vec2< float > VertexData::getPos() const
  66. {
  67. return vertex;
  68. }
  69. Vertex VertexData::getTPos() const
  70. {
  71. return textur;
  72. }
  73. // Reference Counting
  74. VertexData *VertexData::getThis()
  75. {
  76. ref++;
  77. return this;
  78. }
  79. VertexData *VertexData::release()
  80. {
  81. ref--;
  82. if( !ref )
  83. delete this;
  84. return 0;
  85. }
  86. // Inhalt der PolygonData Klasse aus KEDModel2DEditor.h
  87. // Konstruktor
  88. PolygonData::PolygonData( Polygon2D &pg )
  89. {
  90. name = pg.name->getText();
  91. vd = new RCArray< VertexData >();
  92. sichtbar = 1;
  93. ref = 1;
  94. int anz = pg.vertex->getEintragAnzahl();
  95. for( int i = 0; i < anz; i++ )
  96. {
  97. Vec2< float > v( 0, 0 );
  98. Punkt t( 0, 0 );
  99. if( pg.vertex->hat( i ) )
  100. v = pg.vertex->get( i );
  101. if( pg.tKordinaten && pg.tKordinaten->hat( i ) )
  102. t = pg.tKordinaten->get( i );
  103. vd->add( new VertexData( v, t ) );
  104. }
  105. }
  106. // Destruktor
  107. PolygonData::~PolygonData()
  108. {
  109. vd->release();
  110. }
  111. // nicht constant
  112. void PolygonData::addVertex( Vec2< float >v, Punkt t )
  113. {
  114. vd->add( new VertexData( v, t ) );
  115. }
  116. void PolygonData::removeVertex( int num )
  117. {
  118. vd->remove( num );
  119. }
  120. void PolygonData::nachLinks( float num )
  121. {
  122. for( auto *i = &vd->getArray(); i && i->set; i = i->next )
  123. i->var->nachLinks( num );
  124. }
  125. void PolygonData::nachOben( float num )
  126. {
  127. for( auto *i = &vd->getArray(); i && i->set; i = i->next )
  128. i->var->nachOben( num );
  129. }
  130. void PolygonData::saveTextur( Punkt tPos, Punkt tGr )
  131. {
  132. for( auto *i = &vd->getArray(); i && i->set; i = i->next )
  133. i->var->saveTextur( tPos, tGr );
  134. }
  135. void PolygonData::select( Punkt p1, Punkt p2 )
  136. {
  137. for( auto *i = &vd->getArray(); i && i->set; i = i->next )
  138. i->var->select( p1, p2 );
  139. }
  140. void PolygonData::deSelect()
  141. {
  142. for( auto *i = &vd->getArray(); i && i->set; i = i->next )
  143. i->var->deSelect();
  144. }
  145. void PolygonData::setSichtbar( bool s )
  146. {
  147. sichtbar = s;
  148. }
  149. void PolygonData::setName( const char *name )
  150. {
  151. this->name = name;
  152. }
  153. // constant
  154. const char *PolygonData::getName() const
  155. {
  156. return name;
  157. }
  158. bool PolygonData::istSichtbar() const
  159. {
  160. return sichtbar;
  161. }
  162. VertexData *PolygonData::zVertex( int num ) const
  163. {
  164. return vd->z( num );
  165. }
  166. int PolygonData::getVertexAnzahl() const
  167. {
  168. return vd->getEintragAnzahl();
  169. }
  170. void PolygonData::getM2( Polygon2D &pd, bool textur ) const
  171. {
  172. int anz = vd->getEintragAnzahl();
  173. if( !pd.name )
  174. pd.name = new Text( name );
  175. if( !pd.vertex )
  176. pd.vertex = new Array< Vertex >();
  177. if( !pd.tKordinaten )
  178. pd.tKordinaten = new Array< Vertex >();
  179. for( int i = 0; i < anz; i++ )
  180. {
  181. pd.vertex->add( this->vd->z( i )->getPos() );
  182. if( textur )
  183. pd.tKordinaten->add( this->vd->z( i )->getTPos() );
  184. }
  185. }
  186. // Reference Counting
  187. PolygonData *PolygonData::getThis()
  188. {
  189. ref++;
  190. return this;
  191. }
  192. PolygonData *PolygonData::release()
  193. {
  194. ref--;
  195. if( !ref )
  196. delete this;
  197. return 0;
  198. }
  199. // Inhalt der Data Klasse aus KEDModel2DEditor.h
  200. // Konstruktor
  201. Data::Data( Model2DData *mdl )
  202. {
  203. pd = new RCArray< PolygonData >();
  204. tPos.x = 0;
  205. tPos.y = 0;
  206. textur = 0;
  207. rTextur = 0;
  208. sp = -1;
  209. ref = 1;
  210. int anz = ( mdl && mdl->polygons ) ? mdl->polygons->getEintragAnzahl() : 0;
  211. for( int i = 0; i < anz; i++ )
  212. {
  213. if( mdl->polygons->hat( i ) )
  214. {
  215. pd->add( new PolygonData( mdl->polygons->get( i ) ) );
  216. if( !tPos.x && !tPos.y )
  217. {
  218. if( mdl->polygons->get( i ).tKordinaten && mdl->polygons->get( i ).vertex
  219. && mdl->polygons->get( i ).tKordinaten->hat( 0 ) && mdl->polygons->get( i ).vertex->hat( 0 ) )
  220. {
  221. Punkt p = (Punkt)mdl->polygons->get( i ).vertex->get( 0 );
  222. Punkt tp = mdl->polygons->get( i ).tKordinaten->get( 0 );
  223. tPos = p - tp;
  224. }
  225. }
  226. }
  227. }
  228. if( mdl )
  229. mdl->release();
  230. }
  231. // Destruktor
  232. Data::~Data()
  233. {
  234. pd->release();
  235. if( textur )
  236. textur->release();
  237. }
  238. // nicht constant
  239. void Data::addPolygon()
  240. {
  241. Polygon2D p;
  242. p.name = new Text();
  243. p.vertex = new Array< Vertex >();
  244. pd->add( new PolygonData( p ) );
  245. p.vertex->release();
  246. p.name->release();
  247. }
  248. void Data::removePolygon( int num )
  249. {
  250. pd->remove( num );
  251. if( sp == num )
  252. sp = -1;
  253. }
  254. void Data::selectPolygon( int num )
  255. {
  256. sp = num;
  257. }
  258. void Data::nachLinks( float num )
  259. {
  260. for( auto *i = &pd->getArray(); i && i->set; i = i->next )
  261. i->var->nachLinks( num );
  262. }
  263. void Data::nachOben( float num )
  264. {
  265. for( auto *i = &pd->getArray(); i && i->set; i = i->next )
  266. i->var->nachOben( num );
  267. }
  268. void Data::tNachLinks( int num )
  269. {
  270. if( !rTextur )
  271. return;
  272. tPos.x -= num;
  273. }
  274. void Data::tNachOben( int num )
  275. {
  276. if( !rTextur )
  277. return;
  278. tPos.y -= num;
  279. }
  280. void Data::setRTextur( bool rt )
  281. {
  282. rTextur = rt;
  283. if( rt && !textur )
  284. {
  285. textur = new Bild();
  286. textur->neuBild( 500, 500, 0xFF505000 );
  287. }
  288. }
  289. void Data::saveTextur()
  290. {
  291. if( !rTextur )
  292. return;
  293. for( auto *i = &pd->getArray(); i && i->set; i = i->next )
  294. i->var->saveTextur( tPos, textur->getSize() );
  295. }
  296. void Data::setTextur( Bild *t )
  297. {
  298. if( textur )
  299. textur->release();
  300. textur = t;
  301. }
  302. void Data::select( Punkt p1, Punkt p2 )
  303. {
  304. for( auto *i = &pd->getArray(); i && i->set; i = i->next )
  305. i->var->select( p1, p2 );
  306. }
  307. void Data::deSelect()
  308. {
  309. for( auto *i = &pd->getArray(); i && i->set; i = i->next )
  310. i->var->deSelect();
  311. }
  312. // constant
  313. PolygonData *Data::zPolygon( int num ) const
  314. {
  315. return pd->z( num );
  316. }
  317. int Data::getPolygonAnzahl() const
  318. {
  319. return pd->getEintragAnzahl();
  320. }
  321. int Data::getSelectedPolygon() const
  322. {
  323. return sp;
  324. }
  325. Model2DData *Data::getM2() const
  326. {
  327. int anz = pd->getEintragAnzahl();
  328. Array< Polygon2D > *polygons = new Array< Polygon2D >();
  329. for( int i = 0; i < anz; i++ )
  330. {
  331. Polygon2D pd = { 0, 0, 0 };
  332. this->pd->z( i )->getM2( pd, rTextur );
  333. polygons->add( pd );
  334. }
  335. Model2DData *ret = new Model2DData();
  336. ret->erstelleModell( polygons );
  337. return ret;
  338. }
  339. Bild *Data::zTextur() const
  340. {
  341. return rTextur ? textur : 0;
  342. }
  343. Punkt Data::getTPos() const
  344. {
  345. return tPos;
  346. }
  347. // Reference Counting
  348. Data *Data::getThis()
  349. {
  350. ref++;
  351. return this;
  352. }
  353. Data *Data::release()
  354. {
  355. ref--;
  356. if( !ref )
  357. delete this;
  358. return 0;
  359. }
  360. // Inhalt der EditorListe Klasse aus KEDModel2DEditor.h
  361. // Konstruktor
  362. EditorListe::EditorListe( Schrift *zSchrift )
  363. {
  364. ram = new LRahmen();
  365. ram->setRamenBreite( 1 );
  366. ram->setFarbe( 0xFFFFFFFF );
  367. ram->setSize( 150, 480 );
  368. ram->setPosition( 720, 10 );
  369. scroll = new VScrollBar();
  370. schrift = zSchrift->getThis();
  371. pName = initTextFeld( 0, 0, 80, 20, schrift, TextFeld::Style::TextFeld, "" );
  372. data = 0;
  373. ref = 1;
  374. }
  375. // Destruktor
  376. EditorListe::~EditorListe()
  377. {
  378. pName->release();
  379. ram->release();
  380. scroll->release();
  381. if( data )
  382. data->release();
  383. schrift->release();
  384. }
  385. // nicht constant
  386. void EditorListe::setDataZ( Data *d )
  387. {
  388. if( data )
  389. data->release();
  390. data = d;
  391. }
  392. void EditorListe::doMausEreignis( MausEreignis &me )
  393. {
  394. me.mx -= ram->getX();
  395. me.my -= ram->getY();
  396. if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
  397. {
  398. me.mx += ram->getX();
  399. me.my += ram->getY();
  400. return;
  401. }
  402. scroll->doMausMessage( ram->getBreite() - 17, 1, 15, ram->getHeight() - 2, me );
  403. if( data->getSelectedPolygon() >= 0 )
  404. pName->doMausEreignis( me );
  405. rend |= scroll->getRend();
  406. if( me.id == ME_RLinks && !me.verarbeitet )
  407. {
  408. int pAnz = data->getPolygonAnzahl();
  409. int y = -scroll->getScroll();
  410. for( int i = 0; i < pAnz; i++ )
  411. {
  412. if( me.mx > 0 && me.my > y && me.mx < 20 && me.my < y + 20 )
  413. { // Ein und Ausklappen
  414. if( !ausgeklappt.hat( i ) )
  415. ausgeklappt.set( 0, i );
  416. ausgeklappt.set( !ausgeklappt.get( i ), i );
  417. rend = 1;
  418. }
  419. else if( me.mx > 115 && me.my > y + 1 && me.mx < 132 && me.my < y + 19 )
  420. { // Löschen
  421. data->removePolygon( i );
  422. rend = 1;
  423. break;
  424. }
  425. else if( me.mx > 0 && me.my > y && me.mx < 133 && me.my < y + 20 )
  426. { // Polygon Auswählen und Abwählen
  427. if( data->getSelectedPolygon() != i )
  428. data->selectPolygon( i );
  429. else
  430. data->selectPolygon( -1 );
  431. rend = 1;
  432. }
  433. PolygonData *pd = data->zPolygon( i );
  434. if( pd && ausgeklappt.hat( i ) && ausgeklappt.get( i ) )
  435. {
  436. int vAnz = pd->getVertexAnzahl();
  437. for( int j = 0; j < vAnz; j++ )
  438. {
  439. y += 20;
  440. if( me.mx > 115 && me.my > y + 1 && me.mx < 132 && me.my < y + 19 )
  441. { // Löschen
  442. pd->removeVertex( j );
  443. rend = 1;
  444. }
  445. else if( me.mx > 95 && me.my > y + 5 && me.mx < 105 && me.my < y + 15 )
  446. { // Sichtbar und Unsichtbar
  447. pd->zVertex( j )->setSichtbar( !pd->zVertex( j )->istSichtbar() );
  448. rend = 1;
  449. }
  450. else if( me.my > y && me.my < y + 20 && me.mx > 0 && me.mx < 133 )
  451. { // Auswählen und Abwählen
  452. pd->zVertex( j )->setAuswahl( !pd->zVertex( j )->istAusgewählt() );
  453. rend = 1;
  454. }
  455. }
  456. }
  457. y += 20;
  458. }
  459. }
  460. me.verarbeitet = 1;
  461. me.mx += ram->getX();
  462. me.my += ram->getY();
  463. }
  464. void EditorListe::doTastaturEreignis( TastaturEreignis &te )
  465. {
  466. if( data && data->getSelectedPolygon() >= 0 )
  467. pName->doTastaturEreignis( te );
  468. }
  469. bool EditorListe::tick( double zeit )
  470. {
  471. if( data && data->getSelectedPolygon() >= 0 )
  472. rend |= pName->tick( zeit );
  473. bool ret = rend;
  474. rend = 0;
  475. return ret;
  476. }
  477. void EditorListe::render( Bild &zRObj )
  478. {
  479. ram->render( zRObj );
  480. if( !zRObj.setDrawOptions( ram->getPosition() + Punkt( 1, 1 ), ram->getSize() - Punkt( 2, 2 ) ) )
  481. return;
  482. scroll->render( ram->getBreite() - 17, 1, 15, ram->getHeight() - 2, zRObj );
  483. int pAnz = data->getPolygonAnzahl();
  484. int y = -scroll->getScroll();
  485. int maxH = 0;
  486. schrift->lock();
  487. schrift->setSchriftSize( 12 );
  488. Text name;
  489. for( int i = 0; i < pAnz; i++ )
  490. {
  491. if( data->getSelectedPolygon() == i )
  492. {
  493. pName->setPosition( 20, y );
  494. pName->setText( data->zPolygon( data->getSelectedPolygon() )->getName() );
  495. Data *tmpData = data;
  496. pName->setNTastaturEreignis( [ tmpData ]( void *p, void *o, TastaturEreignis te ) -> bool {
  497. if( tmpData->getSelectedPolygon() >= 0 )
  498. tmpData->zPolygon( tmpData->getSelectedPolygon() )->setName( ( (TextFeld*)o )->zText()->getText() );
  499. return 1;
  500. } );
  501. zRObj.fillRegion( 0, y, 133, 20, 0xFF002000 );
  502. pName->render( zRObj );
  503. }
  504. else
  505. {
  506. if( textLength( data->zPolygon( i )->getName() ) > 0 )
  507. name = data->zPolygon( i )->getName();
  508. else
  509. {
  510. name = "Polygon ";
  511. name += i;
  512. }
  513. schrift->setDrawPosition( 20, y + 4 );
  514. schrift->renderText( &name, zRObj, 0xFFFFFFFF );
  515. }
  516. zRObj.drawLinie( Punkt( 115, y + 1 ), Punkt( 132, y + 18 ), 0xFFFF0000 );
  517. zRObj.drawLinie( Punkt( 132, y + 1 ), Punkt( 115, y + 18 ), 0xFFFF0000 );
  518. if( ausgeklappt.hat( i ) && ausgeklappt.get( i ) )
  519. {
  520. zRObj.drawDreieck( Punkt( 10, 4 + y ), Punkt( 4, 16 + y ), Punkt( 16, 16 + y ), 0xFFFFFFFF );
  521. PolygonData *pd = data->zPolygon( i );
  522. if( pd )
  523. {
  524. int vAnz = pd->getVertexAnzahl();
  525. for( int j = 0; j < vAnz; j++ )
  526. {
  527. maxH += 20;
  528. y += 20;
  529. if( pd->zVertex( j )->istAusgewählt() )
  530. zRObj.fillRegion( 0, y, 133, 20, 0xFF101010 );
  531. name = " Vertex ";
  532. name += j;
  533. schrift->setDrawPosition( 20, y + 4 );
  534. schrift->renderText( &name, zRObj, 0xFFFFFFFF );
  535. zRObj.drawLinie( Punkt( 115, y + 1 ), Punkt( 132, y + 18 ), 0xFFFF0000 );
  536. zRObj.drawLinie( Punkt( 132, y + 1 ), Punkt( 115, y + 18 ), 0xFFFF0000 );
  537. if( pd->zVertex( j )->istSichtbar() )
  538. {
  539. zRObj.drawKreis( 100, y + 10, 5, 0xFFFFFFFF );
  540. zRObj.drawKreis( 100, y + 10, 1, 0xFFFFFFFF );
  541. }
  542. else
  543. {
  544. zRObj.drawKreis( 100, y + 10, 5, 0xFF505050 );
  545. zRObj.drawKreis( 100, y + 10, 1, 0xFF505050 );
  546. }
  547. }
  548. }
  549. }
  550. else
  551. zRObj.drawDreieck( Punkt( 10, 16 + y ), Punkt( 4, 4 + y ), Punkt( 16, 4 + y ), 0xFFFFFFFF );
  552. maxH += 20;
  553. y += 20;
  554. }
  555. schrift->unlock();
  556. scroll->update( maxH, ram->getHeight() - 2 );
  557. zRObj.releaseDrawOptions();
  558. }
  559. // Reference Counting
  560. EditorListe *EditorListe::getThis()
  561. {
  562. ref++;
  563. return this;
  564. }
  565. EditorListe *EditorListe::release()
  566. {
  567. ref--;
  568. if( !ref )
  569. delete this;
  570. return 0;
  571. }
  572. // Inhalt der Editor2D Klasse aus KEDModel2DEditor.h
  573. // Konstruktor
  574. Editor2D::Editor2D( Schrift *zSchrift )
  575. {
  576. pos.x = 10;
  577. pos.y = 10;
  578. offs.x = -350;
  579. offs.y = -250;
  580. mausPos.x = 0;
  581. mausPos.y = 0;
  582. data = 0;
  583. ram = new LRahmen();
  584. ram->setFarbe( 0xFFFFFFFF );
  585. ram->setRamenBreite( 1 );
  586. ram->setSize( 700, 480 );
  587. select = new LRahmen();
  588. select->setFarbe( 0xFF5050FF );
  589. select->setRamenBreite( 1 );
  590. schrift = zSchrift->getThis();
  591. addV = Vertex( 0, 0 );
  592. mausIn = 0;
  593. größe = 1;
  594. ref = 1;
  595. }
  596. // Destruktor
  597. Editor2D::~Editor2D()
  598. {
  599. ram->release();
  600. select->release();
  601. schrift->release();
  602. if( data )
  603. data->release();
  604. }
  605. // nicht constant
  606. void Editor2D::setDataZ( Data *d )
  607. {
  608. if( data )
  609. data->release();
  610. data = d;
  611. }
  612. void Editor2D::doMausEreignis( MausEreignis &me )
  613. {
  614. me.mx -= pos.x;
  615. me.my -= pos.y;
  616. if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
  617. {
  618. me.mx += pos.x;
  619. me.my += pos.y;
  620. mausIn = 0;
  621. return;
  622. }
  623. mausIn = 1;
  624. rend = 1;
  625. addV = Vertex( (float)me.mx, (float)me.my ) / größe + offs;
  626. if( me.id == ME_UScroll )
  627. größe += 0.01f;
  628. if( me.id == ME_DScroll )
  629. größe -= 0.01f;
  630. if( me.id == ME_PLinks )
  631. {
  632. select->setPosition( me.mx, me.my );
  633. select->setSize( 0, 0 );
  634. }
  635. if( me.id == ME_PRechts || me.id == ME_PMitte )
  636. {
  637. mausPos.x = me.mx;
  638. mausPos.y = me.my;
  639. }
  640. if( me.id == ME_Bewegung )
  641. {
  642. if( getMausStand( M_Links ) )
  643. {
  644. select->setSize( me.mx - select->getX(), me.my - select->getY() );
  645. }
  646. if( getMausStand( M_Rechts ) )
  647. {
  648. data->nachLinks( ( mausPos.x - me.mx ) / größe );
  649. data->nachOben( ( mausPos.y - me.my ) / größe );
  650. mausPos.x = me.mx;
  651. mausPos.y = me.my;
  652. }
  653. if( getMausStand( M_Mitte ) )
  654. {
  655. data->tNachLinks( (int)( ( mausPos.x - me.mx ) / größe ) );
  656. data->tNachOben( (int)( ( mausPos.y - me.my ) / größe ) );
  657. mausPos.x = me.mx;
  658. mausPos.y = me.my;
  659. }
  660. }
  661. if( me.id == ME_RLinks )
  662. {
  663. if( !getTastenStand( T_Shift ) )
  664. data->deSelect();
  665. data->select( ( Vec2<float> )select->getPosition() / größe + offs, ( Vec2<float> )( select->getPosition() + select->getSize() ) / größe + offs );
  666. select->setSize( 0, 0 );
  667. select->setPosition( 0, 0 );
  668. }
  669. if( me.id == ME_RRechts )
  670. {
  671. mausPos.x = 0;
  672. mausPos.y = 0;
  673. }
  674. me.verarbeitet = 1;
  675. me.mx += pos.x;
  676. me.my += pos.y;
  677. }
  678. void Editor2D::doTastaturEreignis( TastaturEreignis &te )
  679. {
  680. if( te.id == TE_Release && te.taste == T_Enter && mausIn )
  681. {
  682. PolygonData *pd = data->zPolygon( data->getSelectedPolygon() );
  683. if( pd )
  684. {
  685. pd->addVertex( addV, Punkt( 0, 0 ) );
  686. rend = 1;
  687. }
  688. }
  689. if( te.id == TE_Release && te.taste == T_Einfg )
  690. {
  691. data->addPolygon();
  692. rend = 1;
  693. }
  694. if( te.id == T_Oben )
  695. offs.y -= 2;
  696. if( te.id == T_Links )
  697. offs.x -= 2;
  698. if( te.id == T_Unten )
  699. offs.y += 2;
  700. if( te.id == T_Rechts )
  701. offs.x += 2;
  702. if( te.id == T_Oben || te.id == T_Links || te.id == T_Unten || te.id == T_Rechts )
  703. rend = 1;
  704. }
  705. bool Editor2D::tick( double zeit )
  706. {
  707. if( mausIn )
  708. {
  709. if( getTastenStand( T_Links ) )
  710. {
  711. offs.x--;
  712. rend = 1;
  713. }
  714. if( getTastenStand( T_Rechts ) )
  715. {
  716. offs.x++;
  717. rend = 1;
  718. }
  719. if( getTastenStand( T_Oben ) )
  720. {
  721. offs.y--;
  722. rend = 1;
  723. }
  724. if( getTastenStand( T_Unten ) )
  725. {
  726. offs.y++;
  727. rend = 1;
  728. }
  729. if( getTastenStand( 'w' ) )
  730. {
  731. data->tNachOben( 1 );
  732. rend = 1;
  733. }
  734. if( getTastenStand( 'a' ) )
  735. {
  736. data->tNachLinks( 1 );
  737. rend = 1;
  738. }
  739. if( getTastenStand( 's' ) )
  740. {
  741. data->tNachOben( -1 );
  742. rend = 1;
  743. }
  744. if( getTastenStand( 'd' ) )
  745. {
  746. data->tNachLinks( -1 );
  747. rend = 1;
  748. }
  749. }
  750. bool ret = rend;
  751. rend = 0;
  752. return ret;
  753. }
  754. void Editor2D::render( Bild &zRObj )
  755. {
  756. if( !zRObj.setDrawOptions( pos, ram->getSize() ) )
  757. return;
  758. ram->render( zRObj );
  759. if( !zRObj.setDrawOptions( 1, 1, ram->getBreite() - 2, ram->getHeight() - 2 ) )
  760. {
  761. zRObj.releaseDrawOptions();
  762. return;
  763. }
  764. if( data->zTextur() )
  765. {
  766. Punkt tPos = data->getTPos();
  767. zRObj.alphaBildSkall( (int)( ( tPos.x - offs.x ) * größe ), (int)( ( tPos.y - offs.y ) * größe ),
  768. (int)( data->zTextur()->getBreite() * größe ), (int)( data->zTextur()->getHeight() * größe ), *data->zTextur() );
  769. }
  770. // Raster mahlen
  771. int xanz = (int)( ram->getBreite() / ( 50 * größe ) );
  772. int yanz = (int)( ram->getHeight() / ( 50 * größe ) );
  773. int xStart = ( 50 - abs( offs.x ) % 50 );
  774. if( offs.x < 0 )
  775. xStart = -offs.x % 50;
  776. if( offs.x == 0 )
  777. xStart = 0;
  778. int yStart = ( 50 - abs( offs.y ) % 50 );
  779. if( offs.y < 0 )
  780. yStart = -offs.y % 50;
  781. if( offs.y == 0 )
  782. yStart = 0;
  783. for( float x = xStart * größe, y = yStart * größe; !( x > ram->getBreite() && y > ram->getHeight() ); x += 50 * größe, y += 50 * größe )
  784. {
  785. zRObj.drawLinieH( 0, (int)y, ram->getBreite(), 0xFF505050 );
  786. zRObj.drawLinieV( (int)x, 0, ram->getHeight() , 0xFF505050 );
  787. }
  788. Text xPos = "";
  789. xPos = offs.x + (int)( xStart + 50 * ( xanz / 2 ) );
  790. schrift->setDrawPosition( (int)( xStart * größe + 50 * größe * ( xanz / 2 ) ), 0 );
  791. schrift->renderText( &xPos, zRObj, 0xFF505050 );
  792. xPos = offs.y + (int)( yStart + 50 * ( yanz / 2 ) );
  793. schrift->setDrawPosition( 0, (int)( yStart * größe + 50 * größe * ( yanz / 2 ) ) );
  794. schrift->renderText( &xPos, zRObj, 0xFF505050 );
  795. // Model mahlen
  796. int pAnz = data->getPolygonAnzahl();
  797. for( int i = 0; i < pAnz; i++ )
  798. {
  799. PolygonData *p = data->zPolygon( i );
  800. if( !p->istSichtbar() )
  801. continue;
  802. if( data->getSelectedPolygon() == i && mausIn )
  803. {
  804. int vAnz = p->getVertexAnzahl();
  805. VertexData tmp = VertexData( addV, Punkt() );
  806. VertexData *l = p->zVertex( vAnz - 1 );
  807. for( int j = -1; j < vAnz && vAnz > 0; j++ )
  808. {
  809. VertexData *v = j < 0 ? &tmp : p->zVertex( j );
  810. if( l && v )
  811. {
  812. if( l->istSichtbar() && v->istSichtbar() )
  813. zRObj.drawLinie( ( ( l->getPos() - offs ) * größe ), ( ( v->getPos() - offs ) * größe ), 0xFFA0A0A0 );
  814. else
  815. zRObj.drawLinie( ( ( l->getPos() - offs ) * größe ), ( ( v->getPos() - offs ) * größe ), 0xFF606060 );
  816. }
  817. if( !l->istSichtbar() )
  818. {
  819. l = v;
  820. continue;
  821. }
  822. if( j == 0 )
  823. zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFF50FF50 );
  824. else
  825. {
  826. if( !l->istAusgewählt() )
  827. zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFF5050FF );
  828. else
  829. zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFFFF5050 );
  830. }
  831. l = v;
  832. }
  833. }
  834. else
  835. {
  836. int vAnz = p->getVertexAnzahl();
  837. VertexData *l = p->zVertex( vAnz - 1 );
  838. for( int j = 0; j < vAnz; j++ )
  839. {
  840. VertexData *v = p->zVertex( j );
  841. if( l && v )
  842. {
  843. if( l->istSichtbar() && v->istSichtbar() )
  844. zRObj.drawLinie( ( ( l->getPos() - offs ) * größe ), ( ( v->getPos() - offs ) * größe ), 0xFFA0A0A0 );
  845. else
  846. zRObj.drawLinie( ( ( l->getPos() - offs ) * größe ), ( ( v->getPos() - offs ) * größe ), 0xFF606060 );
  847. }
  848. if( !l->istSichtbar() )
  849. {
  850. l = v;
  851. continue;
  852. }
  853. if( !l->istAusgewählt() )
  854. zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFF5050FF );
  855. else
  856. zRObj.fillRegion( (int)( ( l->getPos().x - offs.x ) * größe ) - 5, (int)( ( l->getPos().y - offs.y ) * größe ) - 5, 10, 10, 0xFFFF5050 );
  857. l = v;
  858. }
  859. }
  860. }
  861. select->render( zRObj );
  862. zRObj.releaseDrawOptions();
  863. zRObj.releaseDrawOptions();
  864. }
  865. // Reference Counting
  866. Editor2D *Editor2D::getThis()
  867. {
  868. ref++;
  869. return this;
  870. }
  871. Editor2D *Editor2D::release()
  872. {
  873. ref--;
  874. if( !ref )
  875. delete this;
  876. return 0;
  877. }
  878. // Inhalt der GUI Klasse aus KEDModel2DEditor.h
  879. // Konstruktor
  880. GUI::GUI( Schrift *zSchrift )
  881. {
  882. speichern = initKnopf( 660, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Speichern" );
  883. abbrechen = initKnopf( 770, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Abbrehen" );
  884. textur = initKontrollKnopf( 10, 500, 100, 20, zSchrift, KontrollKnopf::Style::Normal, "Textur" );
  885. texturVerknüpfen = initKnopf( 120, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Textur Speichern" );
  886. texturLaden = initKnopf( 230, 500, 100, 20, zSchrift, Knopf::Style::Sichtbar, "Textur Laden" );
  887. data = new Data( 0 );
  888. editor = new Editor2D( zSchrift );
  889. editor->setDataZ( data->getThis() );
  890. liste = new EditorListe( zSchrift );
  891. liste->setDataZ( data->getThis() );
  892. importDialog = 0;
  893. aktion = 0;
  894. alpha = 0;
  895. sichtbar = 0;
  896. ref = 1;
  897. }
  898. // Destruktor
  899. GUI::~GUI()
  900. {
  901. editor->release();
  902. liste->release();
  903. speichern->release();
  904. abbrechen->release();
  905. data->release();
  906. textur->release();
  907. texturVerknüpfen->release();
  908. texturLaden->release();
  909. if( importDialog )
  910. importDialog->release();
  911. }
  912. // nicht constant
  913. void GUI::setSichtbar( bool s )
  914. {
  915. sichtbar = s;
  916. }
  917. void GUI::setModel( Model2DData *data )
  918. {
  919. if( this->data )
  920. this->data->release();
  921. this->data = new Data( data );
  922. editor->setDataZ( this->data->getThis() );
  923. liste->setDataZ( this->data->getThis() );
  924. }
  925. void GUI::doMausEreignis( MausEreignis &me )
  926. {
  927. if( !sichtbar )
  928. return;
  929. editor->doMausEreignis( me );
  930. liste->doMausEreignis( me );
  931. bool vera = me.verarbeitet;
  932. speichern->doMausEreignis( me );
  933. if( me.id == ME_RLinks && me.verarbeitet && !vera )
  934. {
  935. aktion = 1;
  936. }
  937. vera = me.verarbeitet;
  938. abbrechen->doMausEreignis( me );
  939. if( me.id == ME_RLinks && me.verarbeitet && !vera )
  940. {
  941. aktion = 2;
  942. }
  943. vera = me.verarbeitet;
  944. textur->doMausEreignis( me );
  945. data->setRTextur( textur->hatStyle( KontrollKnopf::Style::Selected ) );
  946. vera = me.verarbeitet;
  947. texturVerknüpfen->doMausEreignis( me );
  948. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  949. data->saveTextur();
  950. vera = me.verarbeitet;
  951. texturLaden->doMausEreignis( me );
  952. if( !vera && me.verarbeitet && me.id == ME_RLinks )
  953. {
  954. if( !importDialog )
  955. {
  956. importDialog = new DateiDialogTh();
  957. importDialog->setOpen( 1 );
  958. importDialog->setDateiTypAuswahl( 4 );
  959. importDialog->addDateiTyp( "JPEG-Bild", "*.jpg;*.jpeg;*.jpe" );
  960. importDialog->addDateiTyp( "GIF-Bild", "*.gif" );
  961. importDialog->addDateiTyp( "PNG-Bild", "*.png" );
  962. importDialog->addDateiTyp( "Alle Dateien", "*.*" );
  963. importDialog->start();
  964. }
  965. }
  966. }
  967. void GUI::doTastaturEreignis( TastaturEreignis &te )
  968. {
  969. if( !sichtbar )
  970. return;
  971. liste->doTastaturEreignis( te );
  972. editor->doTastaturEreignis( te );
  973. }
  974. bool GUI::tick( double zeit )
  975. {
  976. if( importDialog )
  977. {
  978. if( !importDialog->isRunning() )
  979. {
  980. Text *importPfad = importDialog->getPfad();
  981. importDialog = importDialog->release();
  982. if( sichtbar && importPfad )
  983. {
  984. importPfad->ersetzen( "\\", "/" );
  985. Text *err = new Text();
  986. Bild *b = ladeBild( importPfad->getText(), err );
  987. if( !b )
  988. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), err, new Text( "Ok" ) );
  989. else
  990. data->setTextur( b );
  991. err->release();
  992. }
  993. if( importPfad )
  994. importPfad->release();
  995. }
  996. }
  997. rend |= speichern->tick( zeit );
  998. rend |= abbrechen->tick( zeit );
  999. if( sichtbar && alpha != 255 )
  1000. {
  1001. if( alpha + zeit * 200 > 255 )
  1002. alpha = 255;
  1003. else
  1004. alpha += (unsigned char)(zeit * 200);
  1005. rend = 1;
  1006. }
  1007. else if( !sichtbar && alpha )
  1008. {
  1009. if( alpha - zeit * 200 < 0 )
  1010. alpha = 0;
  1011. else
  1012. alpha -= (unsigned char)( zeit * 200 );
  1013. rend = 1;
  1014. }
  1015. if( sichtbar )
  1016. {
  1017. rend |= editor->tick( zeit );
  1018. rend |= liste->tick( zeit );
  1019. rend |= speichern->tick( zeit );
  1020. rend |= textur->tick( zeit );
  1021. rend |= texturVerknüpfen->tick( zeit );
  1022. rend |= texturLaden->tick( zeit );
  1023. }
  1024. bool ret = rend;
  1025. rend = 0;
  1026. return ret;
  1027. }
  1028. void GUI::render( Bild &zRObj )
  1029. {
  1030. zRObj.setAlpha( alpha );
  1031. editor->render( zRObj );
  1032. liste->render( zRObj );
  1033. speichern->render( zRObj );
  1034. abbrechen->render( zRObj );
  1035. textur->render( zRObj );
  1036. texturVerknüpfen->render( zRObj );
  1037. texturLaden->render( zRObj );
  1038. zRObj.releaseAlpha();
  1039. }
  1040. int GUI::getAktion()
  1041. {
  1042. int ret = aktion;
  1043. aktion = 0;
  1044. return ret;
  1045. }
  1046. // const
  1047. Model2DData *GUI::getM2Data() const
  1048. {
  1049. return data->getM2();
  1050. }
  1051. // Reference Counting
  1052. GUI *GUI::getThis()
  1053. {
  1054. ref++;
  1055. return 0;
  1056. }
  1057. GUI *GUI::release()
  1058. {
  1059. ref--;
  1060. if( !ref )
  1061. delete this;
  1062. return 0;
  1063. }