ObjektOptionen.cpp 17 KB

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