ObjektOptionen.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #include "ObjektOptionen.h"
  2. #include "../../../../Initialisierung/Initialisierung.h"
  3. #include <Textur2D.h>
  4. using namespace Editor;
  5. ObjektTool::ObjektTool( Schrift *zSchrift, KarteDaten *daten )
  6. : RightTool()
  7. {
  8. dialog = 0;
  9. dialog2 = 0;
  10. this->daten = daten;
  11. schrift = zSchrift->getThis();
  12. objekte = new AuswahlListe();
  13. objekte->setStyle( ( AuswahlListe::Style::Normal & ~AuswahlListe::Style::FeldHAlpha ) | AuswahlBox::Style::VScroll );
  14. objekte->setRahmenFarbe( 0xFFFFFFFF );
  15. objekte->setRahmenBreite( 1 );
  16. objekte->setSchriftZ( zSchrift->getThis() );
  17. objekte->setSize( 290, 200 );
  18. objekte->setAAFFarbe( 0x5500FF00 );
  19. objekte->setAAFStrength( -5 );
  20. objekte->setALRFarbe( 0xFF00FF00 );
  21. objekte->setALRBreite( 1 );
  22. objekte->setVertikalKlickScroll( 1 );
  23. int anz = daten->getObjektAnzahl();
  24. for( int i = 0; i < anz; i++ )
  25. {
  26. const ObjektDaten *o = daten->getObjekt( i );
  27. objekte->addEintrag( Text( o->id ) );
  28. }
  29. neuesObjekt = initKnopf( 0, 205, 290, 20, zSchrift, Knopf::Style::Normal, "Neues Objekt erstellen" );
  30. neuesObjekt->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me )
  31. {
  32. if( me.id == ME_RLinks )
  33. {
  34. cs.lock();
  35. if( dialog )
  36. dialog->release();
  37. dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_MODEL2D, (KarteDaten *)this->daten->getThis(), [ this ]( const char *modelPath )
  38. {
  39. if( !modelPath )
  40. return;
  41. cs.lock();
  42. if( dialog2 )
  43. dialog2->release();
  44. dialog2 = dialog;
  45. dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_TEXTUR, (KarteDaten *)this->daten->getThis(), [ this, modelPath ]( const char *texturPath )
  46. {
  47. if( !texturPath )
  48. return;
  49. this->daten->getResourceIdFromPath( modelPath, [ this, texturPath ]( int id )
  50. {
  51. ObjektDaten o = ObjektDaten();
  52. o.m2d = id;
  53. this->daten->getResourceIdFromPath( texturPath, [ this, &o ]( int id )
  54. {
  55. o.bild = id;
  56. o.scale = 1;
  57. o.maxStabilität = 100;
  58. o.maxEnergie = 100;
  59. o.energieRadius = 0;
  60. o.reparatur = 0;
  61. o.akkuLeistung = 0;
  62. o.team = this->daten->getTeam( 0 )->id;
  63. o.pos.x = 0;
  64. o.pos.y = 0;
  65. o.rot = 0;
  66. this->daten->addObjekt( o, [ this ]( int id )
  67. {
  68. objekte->addEintrag( Text( id ) );
  69. selectObject( id );
  70. } );
  71. } );
  72. } );
  73. }, screenSize );
  74. cs.unlock();
  75. }, screenSize );
  76. cs.unlock();
  77. }
  78. return 1;
  79. } );
  80. model = new M2DVorschau();
  81. model->setStyle( M2DVorschau::Style::Rahmen | M2DVorschau::Style::UsrRot | M2DVorschau::Style::UsrScale | M2DVorschau::Style::Erlaubt );
  82. model->setSize( 290, 290 );
  83. model->setPosition( 0, 230 );
  84. changeModel = initKnopf( 0, 520, 142, 20, zSchrift, Knopf::Style::Normal, "Model ändern" );
  85. changeModel->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me )
  86. {
  87. if( me.id == ME_RLinks )
  88. {
  89. cs.lock();
  90. if( dialog )
  91. dialog->release();
  92. dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_MODEL2D, (KarteDaten *)this->daten->getThis(), [ this ]( const char *path )
  93. {
  94. if( !path )
  95. return;
  96. modelPath = path;
  97. Model2DData *data = this->daten->loadModelFromPath( modelPath );
  98. Textur2D *textur = new Textur2D();
  99. textur->setTexturZ( this->daten->loadBildFromPath( texturPath ) );
  100. model->postAction( [ this, data, textur ]()
  101. {
  102. model->setModel2D( data );
  103. model->zModel()->setTextur( textur );
  104. } );
  105. }, screenSize );
  106. cs.unlock();
  107. }
  108. return 1;
  109. } );
  110. changeTextur = initKnopf( 147, 520, 143, 20, zSchrift, Knopf::Style::Normal, "Textur ändern" );
  111. changeTextur->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me )
  112. {
  113. if( me.id == ME_RLinks )
  114. {
  115. cs.lock();
  116. if( dialog )
  117. dialog->release();
  118. dialog = new ResourceDialog( new TextRenderer( schrift->getThis() ), SELECT_TEXTUR, (KarteDaten *)this->daten->getThis(), [ this ]( const char *path )
  119. {
  120. if( !path )
  121. return;
  122. texturPath = path;
  123. Textur2D *textur = new Textur2D();
  124. textur->setTexturZ( this->daten->loadBildFromPath( texturPath ) );
  125. model->postAction( [ this, textur ]()
  126. {
  127. model->zModel()->setTextur( textur );
  128. } );
  129. }, screenSize );
  130. cs.unlock();
  131. }
  132. return 1;
  133. } );
  134. stabilitätT = initTextFeld( 0, 545, 100, 20, zSchrift, TextFeld::Style::Text, "Stabilität: " );
  135. stabilität = initTextFeld( 100, 545, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  136. energieT = initTextFeld( 0, 570, 100, 20, zSchrift, TextFeld::Style::Text, "Energie: " );
  137. energie = initTextFeld( 100, 570, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  138. energieRadiusT = initTextFeld( 0, 595, 100, 20, zSchrift, TextFeld::Style::Text, "Radius: " );
  139. energieRadius = initTextFeld( 100, 595, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  140. reparaturT = initTextFeld( 0, 620, 100, 20, zSchrift, TextFeld::Style::Text, "Reparatur: " );
  141. reparatur = initTextFeld( 100, 620, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  142. akkuLeistungT = initTextFeld( 0, 645, 100, 20, zSchrift, TextFeld::Style::Text, "Akku: " );
  143. akkuLeistung = initTextFeld( 100, 645, 50, 20, zSchrift, TextFeld::Style::TextFeld, "" );
  144. team = initAuswahlBox( 0, 670, 150, 20, zSchrift, AuswahlBox::Style::Normal | AuswahlBox::Style::Hintergrund, {} );
  145. anz = daten->getTeamAnzahl();
  146. for( int i = 0; i < anz; i++ )
  147. team->addEintrag( daten->getTeamName( i ) );
  148. speichern = initKnopf( 0, 695, 100, 20, zSchrift, Knopf::Style::Normal, "Speichern" );
  149. speichern->setMausEreignis( [ this ]( void *p, void *o, MausEreignis me )
  150. {
  151. if( me.id == ME_RLinks )
  152. {
  153. ObjektDaten *o = this->daten->getObjekt( this->daten->getObjektIndexById( *objekte->zEintrag( objekte->getAuswahl() )->zText() ) );
  154. this->daten->getResourceIdFromPath( modelPath, [ this, o ]( int id )
  155. {
  156. o->m2d = id;
  157. this->daten->getResourceIdFromPath( texturPath, [ this, o ]( int id )
  158. {
  159. o->bild = id;
  160. o->maxStabilität = *stabilität->zText();
  161. o->maxEnergie = *energie->zText();
  162. o->energieRadius = *energieRadius->zText();
  163. o->reparatur = *reparatur->zText();
  164. o->akkuLeistung = *akkuLeistung->zText();
  165. o->team = team->getAuswahl();
  166. o->update();
  167. } );
  168. } );
  169. }
  170. return 1;
  171. } );
  172. selectObject( 0 );
  173. }
  174. ObjektTool::~ObjektTool()
  175. {
  176. cs.lock();
  177. if( dialog )
  178. dialog->release();
  179. if( dialog2 )
  180. dialog2->release();
  181. cs.unlock();
  182. objekte->release();
  183. neuesObjekt->release();
  184. model->release();
  185. changeModel->release();
  186. changeTextur->release();
  187. stabilitätT->release();
  188. stabilität->release();
  189. energieT->release();
  190. energie->release();
  191. energieRadiusT->release();
  192. energieRadius->release();
  193. reparaturT->release();
  194. reparatur->release();
  195. akkuLeistungT->release();
  196. akkuLeistung->release();
  197. team->release();
  198. speichern->release();
  199. daten->release();
  200. schrift->release();
  201. }
  202. void ObjektTool::doMausEreignis( MausEreignis & me )
  203. {
  204. bool vera = me.verarbeitet;
  205. if( hatStyleNicht( Zeichnung::Style::Sichtbar ) )
  206. me.verarbeitet = 1;
  207. Punkt tmpM( me.mx, me.my );
  208. me.mx = me.rmx;
  209. me.my = me.rmy;
  210. cs.lock();
  211. if( dialog )
  212. dialog->doMausEreignis( me );
  213. cs.unlock();
  214. me.mx = tmpM.x;
  215. me.my = tmpM.y;
  216. me.mx -= pos.x;
  217. me.my -= pos.y;
  218. team->doMausEreignis( me );
  219. int ausw = objekte->getAuswahl();
  220. objekte->doMausEreignis( me );
  221. if( objekte->getAuswahl() != ausw && objekte->getAuswahl() >= 0 )
  222. selectObject( *objekte->zEintrag( objekte->getAuswahl() )->zText() );
  223. if( objekte->getAuswahl() != ausw && objekte->getAuswahl() < 0 )
  224. selectObject( 0 );
  225. neuesObjekt->doMausEreignis( me );
  226. model->doMausEreignis( me );
  227. changeModel->doMausEreignis( me );
  228. changeTextur->doMausEreignis( me );
  229. stabilität->doMausEreignis( me );
  230. energie->doMausEreignis( me );
  231. energieRadius->doMausEreignis( me );
  232. reparatur->doMausEreignis( me );
  233. akkuLeistung->doMausEreignis( me );
  234. speichern->doMausEreignis( me );
  235. me.mx += pos.x;
  236. me.my += pos.y;
  237. if( hatStyleNicht( Zeichnung::Style::Sichtbar ) )
  238. me.verarbeitet = vera;
  239. RightTool::doMausEreignis( me );
  240. }
  241. void ObjektTool::doTastaturEreignis( TastaturEreignis & te )
  242. {
  243. if( hatStyleNicht( Zeichnung::Style::Sichtbar ) )
  244. return;
  245. cs.lock();
  246. if( dialog )
  247. dialog->doTastaturEreignis( te );
  248. cs.unlock();
  249. model->doTastaturEreignis( te );
  250. stabilität->doTastaturEreignis( te );
  251. energie->doTastaturEreignis( te );
  252. energieRadius->doTastaturEreignis( te );
  253. reparatur->doTastaturEreignis( te );
  254. akkuLeistung->doTastaturEreignis( te );
  255. }
  256. bool ObjektTool::tick( double tickVal )
  257. {
  258. if( hatStyleNicht( Zeichnung::Style::Sichtbar ) )
  259. return RightTool::tick( tickVal );
  260. cs.lock();
  261. if( dialog )
  262. rend |= dialog->tick( tickVal );
  263. cs.unlock();
  264. rend |= objekte->tick( tickVal );
  265. rend |= neuesObjekt->tick( tickVal );
  266. rend |= model->tick( tickVal );
  267. rend |= changeModel->tick( tickVal );
  268. rend |= changeTextur->tick( tickVal );
  269. rend |= stabilität->tick( tickVal );
  270. rend |= energie->tick( tickVal );
  271. rend |= energieRadius->tick( tickVal );
  272. rend |= reparatur->tick( tickVal );
  273. rend |= akkuLeistung->tick( tickVal );
  274. rend |= team->tick( tickVal );
  275. rend |= speichern->tick( tickVal );
  276. return RightTool::tick( tickVal );
  277. }
  278. void ObjektTool::render( Bild & rObj )
  279. {
  280. screenSize = rObj.getSize();
  281. if( hatStyleNicht( Zeichnung::Style::Sichtbar ) )
  282. return;
  283. if( rObj.setDrawOptions( pos, gr ) )
  284. {
  285. objekte->render( rObj );
  286. neuesObjekt->render( rObj );
  287. model->render( rObj );
  288. changeModel->render( rObj );
  289. changeTextur->render( rObj );
  290. stabilitätT->render( rObj );
  291. stabilität->render( rObj );
  292. energieT->render( rObj );
  293. energie->render( rObj );
  294. energieRadiusT->render( rObj );
  295. energieRadius->render( rObj );
  296. reparaturT->render( rObj );
  297. reparatur->render( rObj );
  298. akkuLeistungT->render( rObj );
  299. akkuLeistung->render( rObj );
  300. speichern->render( rObj );
  301. team->render( rObj );
  302. rObj.releaseDrawOptions();
  303. }
  304. }
  305. void ObjektTool::renderDialogs( Bild & rObj )
  306. {
  307. cs.lock();
  308. if( dialog )
  309. dialog->render( rObj );
  310. cs.unlock();
  311. }
  312. void ObjektTool::selectObject( int id )
  313. {
  314. if( id == 0 )
  315. {
  316. model->removeStyle( M2DVorschau::Style::Sichtbar );
  317. changeModel->removeStyle( M2DVorschau::Style::Sichtbar );
  318. changeTextur->removeStyle( M2DVorschau::Style::Sichtbar );
  319. stabilitätT->removeStyle( M2DVorschau::Style::Sichtbar );
  320. stabilität->removeStyle( M2DVorschau::Style::Sichtbar );
  321. energieT->removeStyle( M2DVorschau::Style::Sichtbar );
  322. energie->removeStyle( M2DVorschau::Style::Sichtbar );
  323. energieRadiusT->removeStyle( M2DVorschau::Style::Sichtbar );
  324. energieRadius->removeStyle( M2DVorschau::Style::Sichtbar );
  325. reparaturT->removeStyle( M2DVorschau::Style::Sichtbar );
  326. reparatur->removeStyle( M2DVorschau::Style::Sichtbar );
  327. akkuLeistungT->removeStyle( M2DVorschau::Style::Sichtbar );
  328. akkuLeistung->removeStyle( M2DVorschau::Style::Sichtbar );
  329. team->removeStyle( M2DVorschau::Style::Sichtbar );
  330. speichern->removeStyle( M2DVorschau::Style::Sichtbar );
  331. }
  332. else
  333. {
  334. int index = 0;
  335. int anz = objekte->getEintragAnzahl();
  336. for( int i = 0; i < anz; i++ )
  337. {
  338. if( objekte->zEintrag( i )->zText()->istGleich( Text( id ) ) )
  339. break;
  340. index++;
  341. }
  342. objekte->setAuswahl( index );
  343. ObjektDaten *o = daten->getObjekt( daten->getObjektIndexById( id ) );
  344. model->setModel2D( daten->loadModelFromRessource( o->m2d ) );
  345. model->zModel()->addStyle( Model2D::Style::Sichtbar | Model2D::Style::Textur | Model2D::Style::Erlaubt );
  346. modelPath = daten->getResource( daten->getResourceIndexById( o->m2d ) )->path;
  347. Textur2D * textur = new Textur2D();
  348. textur->setTexturZ( daten->loadBildFromRessource( o->bild ) );
  349. texturPath = daten->getResource( daten->getResourceIndexById( o->bild ) )->path;
  350. model->zModel()->setTextur( textur );
  351. stabilität->setText( Text( o->maxStabilität ) );
  352. energie->setText( Text( o->maxEnergie ) );
  353. energieRadius->setText( Text( o->energieRadius ) );
  354. reparatur->setText( Text( o->reparatur ) );
  355. akkuLeistung->setText( Text( o->akkuLeistung ) );
  356. team->setAuswahl( Text( o->team ) );
  357. model->addStyle( M2DVorschau::Style::Sichtbar );
  358. changeModel->addStyle( M2DVorschau::Style::Sichtbar );
  359. changeTextur->addStyle( M2DVorschau::Style::Sichtbar );
  360. stabilitätT->addStyle( M2DVorschau::Style::Sichtbar );
  361. stabilität->addStyle( M2DVorschau::Style::Sichtbar );
  362. energieT->addStyle( M2DVorschau::Style::Sichtbar );
  363. energie->addStyle( M2DVorschau::Style::Sichtbar );
  364. energieRadiusT->addStyle( M2DVorschau::Style::Sichtbar );
  365. energieRadius->addStyle( M2DVorschau::Style::Sichtbar );
  366. reparaturT->addStyle( M2DVorschau::Style::Sichtbar );
  367. reparatur->addStyle( M2DVorschau::Style::Sichtbar );
  368. akkuLeistungT->addStyle( M2DVorschau::Style::Sichtbar );
  369. akkuLeistung->addStyle( M2DVorschau::Style::Sichtbar );
  370. team->addStyle( M2DVorschau::Style::Sichtbar );
  371. speichern->addStyle( M2DVorschau::Style::Sichtbar );
  372. }
  373. }