EditorKarte.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #include "EditorKarte.h"
  2. #include <Model2D.h>
  3. #include <Bild.h>
  4. #include <Textur2D.h>
  5. #include <Datei.h>
  6. #include <DateiSystem.h>
  7. #include <M2Datei.h>
  8. #include <Globals.h>
  9. #include <DLLRegister.h>
  10. using namespace Editor;
  11. SpielerDaten::SpielerDaten()
  12. : Model()
  13. {}
  14. TeamDaten::TeamDaten()
  15. : Model()
  16. {}
  17. ObjektDaten::ObjektDaten()
  18. : Model()
  19. {}
  20. EditorObject::EditorObject()
  21. : Model2DObject()
  22. {}
  23. EditorObject::~EditorObject()
  24. {}
  25. EdSpieler::EdSpieler( SpielerDaten *model )
  26. : EditorObject()
  27. {
  28. mdl = model;
  29. }
  30. EdSpieler::~EdSpieler()
  31. {}
  32. void EdSpieler::update()
  33. {
  34. mdl->pos = position;
  35. mdl->rot = (double)rotation;
  36. mdl->update();
  37. }
  38. EdObjekt::EdObjekt( ObjektDaten *model )
  39. : EditorObject()
  40. {
  41. mdl = model;
  42. }
  43. EdObjekt::~EdObjekt()
  44. {}
  45. void EdObjekt::update()
  46. {
  47. mdl->pos = position;
  48. mdl->rot = rotation;
  49. mdl->scale = size;
  50. mdl->update();
  51. }
  52. UpdateObserver::UpdateObserver( std::function< void() > f )
  53. {
  54. this->f = f;
  55. }
  56. void UpdateObserver::update( Model *m )
  57. {
  58. f();
  59. }
  60. KarteDaten::KarteDaten( EditorKlient *client, SpielerTeamStruktur *sts )
  61. : Thread()
  62. {
  63. HMODULE dll = Framework::getDLLRegister()->ladeDLL( "GSL.dll", "data/bin/GSL.dll" );
  64. getGSLDatei = (GetGSLDatei)GetProcAddress( dll, "getGSLDatei" );
  65. welt = new Welt2D();
  66. welt->setCircular( 1 );
  67. this->client = client;
  68. this->sts = (SpielerTeamStruktur *)sts->getThis();
  69. client->loadMapSize( size );
  70. client->loadResources( resources );
  71. client->loadSpieler( spieler );
  72. client->loadTeams( teams );
  73. client->loadObjekte( objekte );
  74. welt->setSize( size.x, size.y );
  75. welt->setSize( 1 );
  76. for( auto s = spieler.getIterator(); s; s++ )
  77. {
  78. Model2DObject *model = new EdSpieler( s._ );
  79. Bild *bild;
  80. int fc = sts->spielerFarbe->get( s->id - 1 );
  81. for( auto r = resources.getIterator(); r; r++ )
  82. {
  83. if( r->id == s->m2d )
  84. model->setModel( client->loadModel( r->path ) );
  85. if( r->id == s->bild )
  86. bild = client->loadBild( r->path );
  87. }
  88. if( bild )
  89. {
  90. Bild *shb = new Bild();
  91. shb->neuBild( bild->getBreite(), bild->getHeight(), 0 );
  92. int maxP = shb->getBreite() * shb->getHeight();
  93. int *buffer = bild->getBuffer();
  94. for( int i = 0; i < maxP; i++ )
  95. {
  96. if( buffer[ i ] )
  97. {
  98. shb->setPixelDP( i, fc );
  99. shb->alphaPixelDP2D( i, buffer[ i ] );
  100. }
  101. }
  102. Textur2D *textur = new Textur2D();
  103. textur->setTexturZ( shb );
  104. model->setTextur( textur, "ship" );
  105. bild->release();
  106. }
  107. model->setPosition( s->pos );
  108. model->setDrehung( (float)s->rot );
  109. model->setCollision( 0 );
  110. welt->addObject( model );
  111. SpielerDaten *d = s._;
  112. d->addView( new UpdateObserver( [ this, d ]()
  113. {
  114. aktionen.add( [ this, d ]()
  115. {
  116. this->client->saveSpieler( d );
  117. } );
  118. } ) );
  119. }
  120. for( auto t = teams.getIterator(); t; t++ )
  121. {
  122. TeamDaten *d = t._;
  123. d->addView( new UpdateObserver( [ this, d ]()
  124. {
  125. aktionen.add( [ this, d ]()
  126. {
  127. this->client->saveTeam( d );
  128. } );
  129. } ) );
  130. }
  131. for( auto o = objekte.getIterator(); o; o++ )
  132. {
  133. Model2DObject *model = new EdObjekt( o._ );
  134. Bild *bild;
  135. for( auto r = resources.getIterator(); r; r++ )
  136. {
  137. if( r->id == o->m2d )
  138. model->setModel( client->loadModel( r->path ) );
  139. if( r->id == o->bild )
  140. bild = client->loadBild( r->path );
  141. }
  142. if( bild )
  143. {
  144. Textur2D *textur = new Textur2D();
  145. textur->setTexturZ( bild );
  146. model->setTextur( textur );
  147. }
  148. model->setPosition( o->pos );
  149. model->setDrehung( o->rot );
  150. model->setSize( o->scale );
  151. model->setCollision( 0 );
  152. welt->addObject( model );
  153. ObjektDaten *d = o._;
  154. d->addView( new UpdateObserver( [ this, d, model ]()
  155. {
  156. aktionen.add( [ this, d, model ]()
  157. {
  158. this->client->saveObjekt( d );
  159. Bild *bild;
  160. for( auto r = resources.getIterator(); r; r++ )
  161. {
  162. if( r->id == d->m2d )
  163. model->setModel( this->client->loadModel( r->path ) );
  164. if( r->id == d->bild )
  165. bild = this->client->loadBild( r->path );
  166. }
  167. if( bild )
  168. {
  169. Textur2D *textur = new Textur2D();
  170. textur->setTexturZ( bild );
  171. model->setTextur( textur );
  172. }
  173. } );
  174. } ) );
  175. }
  176. exit = 0;
  177. start();
  178. }
  179. KarteDaten::~KarteDaten()
  180. {
  181. cs.lock();
  182. for( auto i = resources.getIterator(); i; i++ )
  183. delete i._;
  184. for( auto i = objekte.getIterator(); i; i++ )
  185. delete i._;
  186. for( auto i = spieler.getIterator(); i; i++ )
  187. delete i._;
  188. for( auto i = teams.getIterator(); i; i++ )
  189. delete i._;
  190. sts->release();
  191. client->release();
  192. welt->release();
  193. Framework::getDLLRegister()->releaseDLL( "GSL.dll" );
  194. cs.unlock();
  195. }
  196. void KarteDaten::addObjekt( ObjektDaten & daten, std::function< void( int ) > callBack )
  197. {
  198. ObjektDaten *nd = new ObjektDaten( daten );
  199. cs.lock();
  200. nd->id = objekte.getEintragAnzahl() + 1;
  201. objekte.add( nd );
  202. Model2DObject *model = new EdObjekt( nd );
  203. Bild *bild;
  204. for( auto r = resources.getIterator(); r; r++ )
  205. {
  206. if( r->id == nd->m2d )
  207. model->setModel( client->loadModel( r->path ) );
  208. if( r->id == nd->bild )
  209. bild = client->loadBild( r->path );
  210. }
  211. if( bild )
  212. {
  213. Textur2D *textur = new Textur2D();
  214. textur->setTexturZ( bild );
  215. model->setTextur( textur );
  216. }
  217. model->setPosition( nd->pos );
  218. model->setDrehung( nd->rot );
  219. model->setSize( nd->scale );
  220. model->setCollision( 0 );
  221. welt->addObject( model );
  222. nd->addView( new UpdateObserver( [ this, nd, model ]()
  223. {
  224. aktionen.add( [ this, nd, model ]()
  225. {
  226. this->client->saveObjekt( nd );
  227. Bild *bild;
  228. for( auto r = resources.getIterator(); r; r++ )
  229. {
  230. if( r->id == nd->m2d )
  231. model->setModel( this->client->loadModel( r->path ) );
  232. if( r->id == nd->bild )
  233. bild = this->client->loadBild( r->path );
  234. }
  235. if( bild )
  236. {
  237. Textur2D *textur = new Textur2D();
  238. textur->setTexturZ( bild );
  239. model->setTextur( textur );
  240. }
  241. } );
  242. } ) );
  243. ObjektDaten td = *nd;
  244. EditorKlient *c = client;
  245. aktionen.add( [ td, c, callBack ]()
  246. {
  247. if( c->saveObjekt( &td ) )
  248. callBack( td.id );
  249. else
  250. callBack( 0 );
  251. } );
  252. cs.unlock();
  253. }
  254. void KarteDaten::removeObjekt( int index )
  255. {
  256. cs.lock();
  257. int id = objekte.get( index )->id;
  258. delete objekte.get( index );
  259. objekte.remove( index );
  260. EditorKlient *c = client;
  261. aktionen.add( [ id, c ]()
  262. {
  263. c->deleteObjekt( id );
  264. } );
  265. cs.unlock();
  266. }
  267. void KarteDaten::thread()
  268. {
  269. while( !exit )
  270. {
  271. cs.lock();
  272. while( hasAktions() )
  273. {
  274. std::function< void() > ak = aktionen.get( 0 );
  275. cs.unlock();
  276. ak();
  277. cs.lock();
  278. aktionen.remove( 0 );
  279. }
  280. cs.unlock();
  281. Sleep( 100 );
  282. }
  283. }
  284. ResourceDaten *KarteDaten::getResource( int index )
  285. {
  286. ResourceDaten *ret = 0;
  287. cs.lock();
  288. ret = resources.get( index );
  289. cs.unlock();
  290. return ret;
  291. }
  292. ObjektDaten *KarteDaten::getObjekt( int index )
  293. {
  294. ObjektDaten *ret = 0;
  295. cs.lock();
  296. ret = objekte.get( index );
  297. cs.unlock();
  298. return ret;
  299. }
  300. SpielerDaten *KarteDaten::getSpieler( int index )
  301. {
  302. SpielerDaten *ret = 0;
  303. cs.lock();
  304. ret = spieler.get( index );
  305. cs.unlock();
  306. return ret;
  307. }
  308. TeamDaten *KarteDaten::getTeam( int index )
  309. {
  310. TeamDaten *ret = 0;
  311. cs.lock();
  312. ret = teams.get( index );
  313. cs.unlock();
  314. return ret;
  315. }
  316. const char *KarteDaten::getTeamName( int index )
  317. {
  318. return sts->teamName->z( teams.get( index )->id - 1 )->getText();
  319. }
  320. int KarteDaten::getSpielerIndexById( int id )
  321. {
  322. int index = 0;
  323. cs.lock();
  324. for( auto i = spieler.getIterator(); i; i++ )
  325. {
  326. if( i->id == id )
  327. break;
  328. index++;
  329. }
  330. cs.unlock();
  331. return index;
  332. }
  333. int KarteDaten::getSpielerAnzahl() const
  334. {
  335. return spieler.getEintragAnzahl();
  336. }
  337. int KarteDaten::getTeamIndexById( int id )
  338. {
  339. int index = 0;
  340. cs.lock();
  341. for( auto i = teams.getIterator(); i; i++ )
  342. {
  343. if( i->id == id )
  344. break;
  345. index++;
  346. }
  347. cs.unlock();
  348. return index;
  349. }
  350. int KarteDaten::getTeamAnzahl() const
  351. {
  352. return teams.getEintragAnzahl();
  353. }
  354. int KarteDaten::getObjektIndexById( int id )
  355. {
  356. int index = 0;
  357. cs.lock();
  358. for( auto i = objekte.getIterator(); i; i++ )
  359. {
  360. if( i->id == id )
  361. break;
  362. index++;
  363. }
  364. cs.unlock();
  365. return index;
  366. }
  367. int KarteDaten::getObjektAnzahl() const
  368. {
  369. return objekte.getEintragAnzahl();
  370. }
  371. int KarteDaten::getResourceIndexById( int id )
  372. {
  373. int index = 0;
  374. cs.lock();
  375. for( auto i = resources.getIterator(); i; i++ )
  376. {
  377. if( i->id == id )
  378. break;
  379. index++;
  380. }
  381. cs.unlock();
  382. return index;
  383. }
  384. int KarteDaten::getResourceAnzahl()
  385. {
  386. return resources.getEintragAnzahl();
  387. }
  388. bool KarteDaten::hasError() const
  389. {
  390. return !error.istGleich( "" );
  391. }
  392. char *KarteDaten::getError() const
  393. {
  394. return error;
  395. }
  396. bool KarteDaten::hasAktions() const
  397. {
  398. return aktionen.getEintragAnzahl() > 0;
  399. }
  400. Welt2D *KarteDaten::getWelt() const
  401. {
  402. return welt->getThis();
  403. }
  404. Welt2D *KarteDaten::zWelt() const
  405. {
  406. return welt;
  407. }
  408. void KarteDaten::getResourceIdFromPath( const char *path, std::function< void( int ) > callBack )
  409. {
  410. for( auto r = resources.getIterator(); r; r++ )
  411. {
  412. if( r->path.istGleich( path ) )
  413. {
  414. callBack( r->id );
  415. return;
  416. }
  417. }
  418. aktionen.add( [ this, path, callBack ]()
  419. {
  420. int id = client->addResource( path );
  421. if( !id )
  422. {
  423. callBack( 0 );
  424. return;
  425. }
  426. ResourceDaten *nr = new ResourceDaten();
  427. nr->id = id;
  428. nr->path = path;
  429. cs.lock();
  430. resources.add( nr );
  431. cs.unlock();
  432. callBack( id );
  433. } );
  434. }
  435. bool KarteDaten::doesResourceExist( const char *path )
  436. {
  437. for( auto r = resources.getIterator(); r; r++ )
  438. {
  439. if( r->path.istGleich( path ) )
  440. return 1;
  441. }
  442. return 0;
  443. }
  444. Model2DData *KarteDaten::loadModelFromRessource( int id )
  445. {
  446. for( auto r = resources.getIterator(); r; r++ )
  447. {
  448. if( r->id == id )
  449. return client->loadModel( r->path );
  450. }
  451. return 0;
  452. }
  453. Bild *KarteDaten::loadBildFromRessource( int id )
  454. {
  455. for( auto r = resources.getIterator(); r; r++ )
  456. {
  457. if( r->id == id )
  458. return client->loadBild( r->path );
  459. }
  460. return 0;
  461. }
  462. Model2DData *KarteDaten::loadModelFromPath( const char *path )
  463. {
  464. return client->loadModel( path );
  465. }
  466. Bild *KarteDaten::loadBildFromPath( const char *path )
  467. {
  468. return client->loadBild( path );
  469. }
  470. void KarteDaten::loadUnusedResourcePaths( std::function< void( RCArray< Text > * ) > callBack )
  471. {
  472. cs.lock();
  473. aktionen.add( [ this, callBack ]()
  474. {
  475. RCArray< Text > *result = new RCArray< Text >();
  476. loadSpielResourcePathsFromFolder( "data/spiele/Asteroids", result );
  477. RCArray< Text > *mapPaths = client->getAllMapResourcePaths();
  478. for( auto mp = mapPaths->getIterator(); mp; mp++ )
  479. {
  480. if( !doesResourceExist( mp->getText() ) )
  481. result->add( mp->getThis() );
  482. }
  483. mapPaths->release();
  484. callBack( result );
  485. } );
  486. cs.unlock();
  487. }
  488. void KarteDaten::loadSpielResourcePathsFromFolder( const char *folderPath, RCArray< Text > * zPaths )
  489. {
  490. Datei f;
  491. f.setDatei( folderPath );
  492. if( f.istOrdner() )
  493. {
  494. RCArray< Text > *list = f.getDateiListe();
  495. for( auto n = list->getIterator(); n; n++ )
  496. {
  497. Text path( folderPath );
  498. path += Text( "/" ) + (const char *)n->getText();
  499. loadSpielResourcePathsFromFolder( path, zPaths );
  500. }
  501. list->release();
  502. }
  503. else
  504. {
  505. if( f.zPfad()->hat( ".ltdb" ) )
  506. {
  507. LTDBDatei d;
  508. d.setDatei( new Text( folderPath ) );
  509. d.leseDaten( 0 );
  510. int anz = d.getBildAnzahl();
  511. for( int i = 0; i < anz; i++ )
  512. {
  513. Text *path = new Text( folderPath );
  514. path->ersetzen( 0, (int)strlen( "data/spiele/Asteroids" ), "spiel:" );
  515. path->append( (const char *)( Text( "/" ) + (const char *)d.zBildListe()->z( i )->getText() ) );
  516. if( doesResourceExist( path->getText() ) )
  517. path->release();
  518. else
  519. zPaths->add( path );
  520. }
  521. }
  522. if( f.zPfad()->hat( ".m2" ) )
  523. {
  524. M2Datei d;
  525. d.setPfad( folderPath );
  526. d.leseDaten();
  527. int anz = d.getModelAnzahl();
  528. for( int i = 0; i < anz; i++ )
  529. {
  530. Text *path = new Text( folderPath );
  531. path->ersetzen( 0, (int)strlen( "data/spiele/Asteroids" ), "spiel:" );
  532. path->append( (const char *)( Text( "/" ) + (const char *)d.zModelName( i )->getText() ) );
  533. if( doesResourceExist( path->getText() ) )
  534. path->release();
  535. else
  536. zPaths->add( path );
  537. }
  538. }
  539. if( f.zPfad()->hat( ".gsl" ) )
  540. {
  541. HMODULE dll = Framework::getDLLRegister()->ladeDLL( "GSL.dll", "data/bin/GSL.dll" );
  542. GSL::GSLDateiV *d = getGSLDatei();
  543. d->setDatei( (char *)folderPath );
  544. d->leseDaten();
  545. int anz = d->getSoundAnzahl();
  546. for( int i = 0; i < anz; i++ )
  547. {
  548. Text *path = new Text( folderPath );
  549. path->ersetzen( 0, (int)strlen( "data/spiele/Asteroids" ), "spiel:" );
  550. Text *name = d->getSoundName( i );
  551. path->append( (const char *)( Text( "/" ) + (const char *)name->getText() ) );
  552. name->release();
  553. if( doesResourceExist( path->getText() ) )
  554. path->release();
  555. else
  556. zPaths->add( path );
  557. }
  558. }
  559. }
  560. }
  561. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  562. Thread *KarteDaten::release()
  563. {
  564. if( Thread::ref == 2 && run )
  565. {
  566. exit = 1;
  567. if( isRunning() )
  568. warteAufThread( INT_MAX );
  569. }
  570. return Thread::release();
  571. }