PolycodeEntityEditor.cpp 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  1. /*
  2. Copyright (C) 2012 by Ivan Safrin
  3. Permission is hereby granted, free of charge, to any person obtaining a copy
  4. of this software and associated documentation files (the "Software"), to deal
  5. in the Software without restriction, including without limitation the rights
  6. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. copies of the Software, and to permit persons to whom the Software is
  8. furnished to do so, subject to the following conditions:
  9. The above copyright notice and this permission notice shall be included in
  10. all copies or substantial portions of the Software.
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  17. THE SOFTWARE.
  18. */
  19. #include "PolycodeEntityEditor.h"
  20. #include "PolycodeFrame.h"
  21. #include "PolyCubemap.h"
  22. #include "PolycodeMaterialEditor.h"
  23. extern UIGlobalMenu *globalMenu;
  24. extern PolycodeFrame *globalFrame;
  25. extern Scene *globalScene;
  26. LightDisplay::LightDisplay(SceneLight *light) : Entity() {
  27. editorOnly = true;
  28. this->light = light;
  29. spotSpot = new ScenePrimitive(ScenePrimitive::TYPE_LINE_CIRCLE, 1.0, 1.0, 32);
  30. spotSpot->getMesh()->setMeshType(Mesh::LINE_LOOP_MESH);
  31. addChild(spotSpot);
  32. spotSpot->setColor(1.0, 0.8, 0.0, 1.0);
  33. spotSpot->enabled = false;
  34. fovSceneMesh = new SceneMesh(Mesh::LINE_MESH);
  35. fovSceneMesh->setColor(1.0, 0.8, 0.0, 1.0);
  36. fovMesh = fovSceneMesh->getMesh();
  37. fovMesh->indexedMesh = true;
  38. addChild(fovSceneMesh);
  39. fovMesh->addVertex(0.0, 0.0, 0.0);
  40. fovMesh->addVertex(-1.0, 1.0, -1.0);
  41. fovMesh->addVertex(1.0, 1.0, -1.0);
  42. fovMesh->addVertex(1.0, -1.0, -1.0);
  43. fovMesh->addVertex(-1.0, -1.0, -1.0);
  44. fovMesh->addIndexedFace(0, 1);
  45. fovMesh->addIndexedFace(0, 2);
  46. fovMesh->addIndexedFace(0, 3);
  47. fovMesh->addIndexedFace(0, 4);
  48. light->addChild(this);
  49. }
  50. LightDisplay::~LightDisplay() {
  51. }
  52. void LightDisplay::Update() {
  53. if(light->getLightType() == SceneLight::SPOT_LIGHT) {
  54. spotSpot->enabled = true;
  55. fovSceneMesh->enabled = true;
  56. Number distance = light->getIntensity() * 2.0;
  57. Number spotAngle = ((light->getSpotlightCutoff()) * 2.0);
  58. Number spotLightSize = ((PI * 2.0) * distance * spotAngle) / 360.0;
  59. spotSpot->setPosition(0.0, 0.0, -distance);
  60. spotSpot->setPrimitiveOptions(ScenePrimitive::TYPE_LINE_CIRCLE, spotLightSize, spotLightSize, 32);
  61. spotSpot->getMesh()->setMeshType(Mesh::LINE_LOOP_MESH);
  62. spotLightSize *= 0.5;
  63. fovMesh->getActualVertex(1)->set(sin(PI/2.0)*spotLightSize, cos(PI/2.0)*spotLightSize, -distance);
  64. fovMesh->getActualVertex(2)->set(sin(PI)*spotLightSize, cos(PI)*spotLightSize, -distance);
  65. fovMesh->getActualVertex(3)->set(sin(PI + (PI/2.0))*spotLightSize, cos(PI + (PI/2.0))*spotLightSize, -distance);
  66. fovMesh->getActualVertex(4)->set(sin(PI*2.0)*spotLightSize, cos(PI*2.0)*spotLightSize, -distance);
  67. fovMesh->dirtyArray(RenderDataArray::VERTEX_DATA_ARRAY);
  68. } else {
  69. spotSpot->enabled = false;
  70. fovSceneMesh->enabled = false;
  71. }
  72. }
  73. CameraDisplay::CameraDisplay(Camera *camera) : Entity() {
  74. editorOnly = true;
  75. fovSceneMesh = new SceneMesh(Mesh::LINE_MESH);
  76. fovSceneMesh->setColor(1.0, 0.0, 1.0, 1.0);
  77. fovMesh = fovSceneMesh->getMesh();
  78. fovMesh->indexedMesh = true;
  79. fovMesh->addVertex(0.0, 0.0, 0.0);
  80. fovMesh->addVertex(-1.0, 1.0, -1.0);
  81. fovMesh->addVertex(1.0, 1.0, -1.0);
  82. fovMesh->addVertex(1.0, -1.0, -1.0);
  83. fovMesh->addVertex(-1.0, -1.0, -1.0);
  84. fovMesh->addIndexedFace(0, 1);
  85. fovMesh->addIndexedFace(0, 2);
  86. fovMesh->addIndexedFace(0, 3);
  87. fovMesh->addIndexedFace(0, 4);
  88. fovMesh->addIndexedFace(1, 2);
  89. fovMesh->addIndexedFace(2, 3);
  90. fovMesh->addIndexedFace(3, 4);
  91. fovMesh->addIndexedFace(4, 1);
  92. addChild(fovSceneMesh);
  93. camera->addChild(this);
  94. this->camera = camera;
  95. }
  96. CameraDisplay::~CameraDisplay() {
  97. }
  98. void CameraDisplay::Update() {
  99. if(camera->getOrthoMode()) {
  100. Number xPos = camera->getOrthoSizeX() * 0.5;
  101. Number yPos = camera->getOrthoSizeY() * 0.5;
  102. Number zPos = 0.0;
  103. switch(camera->getOrthoSizeMode()) {
  104. case Camera::ORTHO_SIZE_LOCK_HEIGHT:
  105. xPos = yPos * (camera->getViewport().w/camera->getViewport().h);
  106. break;
  107. case Camera::ORTHO_SIZE_LOCK_WIDTH:
  108. yPos = xPos * (camera->getViewport().h/camera->getViewport().w);
  109. break;
  110. case Camera::ORTHO_SIZE_VIEWPORT:
  111. xPos = camera->getViewport().w * 0.5;
  112. yPos = camera->getViewport().h * 0.5;
  113. break;
  114. }
  115. fovMesh->getActualVertex(1)->set(-xPos, yPos, zPos);
  116. fovMesh->getActualVertex(2)->set(xPos, yPos, zPos);
  117. fovMesh->getActualVertex(3)->set(xPos, -yPos, zPos);
  118. fovMesh->getActualVertex(4)->set(-xPos, -yPos, zPos);
  119. fovMesh->dirtyArray(RenderDataArray::VERTEX_DATA_ARRAY);
  120. } else {
  121. Number fovRad = (90+camera->getFOV()/2.0) * TORADIANS;
  122. Number displayScale = 3.0;
  123. Number xPos = cos(fovRad) * displayScale;
  124. Number yPos = xPos * 0.5625;
  125. Number zPos = -sin(fovRad) * displayScale * 0.5;
  126. fovMesh->getActualVertex(1)->set(-xPos, yPos, zPos);
  127. fovMesh->getActualVertex(2)->set(xPos, yPos, zPos);
  128. fovMesh->getActualVertex(3)->set(xPos, -yPos, zPos);
  129. fovMesh->getActualVertex(4)->set(-xPos, -yPos, zPos);
  130. fovMesh->dirtyArray(RenderDataArray::VERTEX_DATA_ARRAY);
  131. }
  132. }
  133. CameraPreviewWindow::CameraPreviewWindow() : UIElement() {
  134. bgRect = new UIRect((160 * 1.5)+16, (90 * 1.5) + 28);
  135. addChild(bgRect);
  136. bgRect->setColor(0.0, 0.0, 0.0, 0.5);
  137. UILabel *label = new UILabel("CAMERA PREVIEW", 11);
  138. label->setColor(1.0, 1.0, 1.0, 1.0);
  139. addChild(label);
  140. label->setPosition(15, 3);
  141. previewRect = new UIRect(160 * 1.5, 90 * 1.5);
  142. previewRect->setPosition(8, 20);
  143. addChild(previewRect);
  144. enabled = false;
  145. camera = NULL;
  146. scene = NULL;
  147. renderTexture = NULL;
  148. }
  149. CameraPreviewWindow::~CameraPreviewWindow() {
  150. }
  151. void CameraPreviewWindow::setCamera(Scene *scene, Camera *camera) {
  152. this->camera = camera;
  153. this->scene = scene;
  154. if(camera) {
  155. enabled = true;
  156. if(renderTexture) {
  157. delete renderTexture;
  158. }
  159. renderTexture = new SceneRenderTexture(scene, camera, previewRect->getWidth(), previewRect->getHeight());
  160. previewRect->setTexture(renderTexture->getTargetTexture());
  161. } else {
  162. enabled = false;
  163. }
  164. }
  165. EntityEditorMainView::EntityEditorMainView() {
  166. processInputEvents = true;
  167. multiselectIndex = 0;
  168. objectRootInstance = NULL;
  169. mainScene = new Scene(Scene::SCENE_3D, true);
  170. renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
  171. mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);
  172. mainScene->useClearColor = true;
  173. mainScene->rootEntity.processInputEvents = true;
  174. renderTextureShape = new UIRect(256, 256);
  175. renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);
  176. renderTextureShape->setTexture(renderTexture->getTargetTexture());
  177. addChild(renderTextureShape);
  178. renderTextureShape->setPosition(0, 30);
  179. renderTextureShape->focusable = true;
  180. renderTextureShape->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  181. cameraPreview = new CameraPreviewWindow();
  182. addChild(cameraPreview);
  183. cameraPreview->setPosition(5, 35);
  184. headerBg = new UIRect(10,10);
  185. addChild(headerBg);
  186. headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
  187. headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
  188. topBar = new Entity();
  189. addChild(topBar);
  190. topBar->setPosition(0, 0);
  191. topBar->processInputEvents = true;
  192. mainScene->getDefaultCamera()->setPosition(10, 10, 10);
  193. mainScene->getDefaultCamera( )->lookAt(Vector3());
  194. mainScene->getDefaultCamera()->setClippingPlanes(0.01, 10000);
  195. grid = new EditorGrid();
  196. mainScene->addChild(grid);
  197. objectRootBase = new Entity();
  198. mainScene->addChild(objectRootBase);
  199. objectRootBase->processInputEvents = true;
  200. sceneObjectRoot = new Entity();
  201. sceneObjectRoot->processInputEvents = true;
  202. objectRootBase->addChild(sceneObjectRoot);
  203. iconBase = new Entity();
  204. mainScene->addChild(iconBase);
  205. iconBase->processInputEvents = true;
  206. transformGizmo = new TransformGizmo(mainScene, mainScene->getDefaultCamera());
  207. transformGizmo->enableGizmo = false;
  208. mainScene->addChild(transformGizmo);
  209. trackballCamera = new TrackballCamera(mainScene->getDefaultCamera(), renderTextureShape);
  210. trackballCamera->addEventListener(this, Event::CHANGE_EVENT);
  211. addEntityButton = new UIImageButton("entityEditor/add_entity.png", 1.0, 24, 24);
  212. topBar->addChild(addEntityButton);
  213. addEntityButton->setPosition(4, 2);
  214. addEntityButton->addEventListener(this, UIEvent::CLICK_EVENT);
  215. transformGizmoMenu = new TransformGizmoMenu(transformGizmo);
  216. topBar->addChild(transformGizmoMenu);
  217. transformGizmoMenu->setPositionX(40);
  218. modeSwitchDropdown = new UIComboBox(globalMenu, 100);
  219. topBar->addChild(modeSwitchDropdown);
  220. modeSwitchDropdown->addComboItem("3D MODE");
  221. modeSwitchDropdown->addComboItem("2D MODE");
  222. modeSwitchDropdown->setSelectedIndex(0);
  223. modeSwitchDropdown->addEventListener(this, UIEvent::CHANGE_EVENT);
  224. shadeModeSelector = new UIIconSelector();
  225. shadeModeSelector->addIcon("entityEditor/shade_full.png");
  226. shadeModeSelector->addIcon("entityEditor/shade_solid.png");
  227. shadeModeSelector->addIcon("entityEditor/shade_wire.png");
  228. // topBar->addChild(shadeModeSelector);
  229. shadeModeSelector->setPosition(320, 3);
  230. shadeModeSelector->addEventListener(this, UIEvent::SELECT_EVENT);
  231. editorMode = EDITOR_MODE_3D;
  232. input = CoreServices::getInstance()->getCore()->getInput();
  233. input->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  234. }
  235. void EntityEditorMainView::setEditorMode(int newMode) {
  236. editorMode = newMode;
  237. if(editorMode == EDITOR_MODE_3D) {
  238. mainScene->setSceneType(Scene::SCENE_3D);
  239. grid->setGridMode(EditorGrid::GRID_MODE_3D);
  240. transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_3D);
  241. mainScene->getDefaultCamera()->setOrthoMode(false);
  242. mainScene->getDefaultCamera()->setClippingPlanes(1, 1000);
  243. trackballCamera->disableRotation(false);
  244. } else {
  245. mainScene->setSceneType(Scene::SCENE_2D);
  246. mainScene->getDefaultCamera()->setOrthoMode(true);
  247. mainScene->getDefaultCamera()->setClippingPlanes(-1, 10000);
  248. trackballCamera->setCameraPosition(trackballCamera->getOribitingCenter()+Vector3(0.0, 0.0, trackballCamera->getCameraDistance()));
  249. grid->setGridMode(EditorGrid::GRID_MODE_2D);
  250. transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D);
  251. trackballCamera->disableRotation(true);
  252. Update();
  253. }
  254. }
  255. Entity *EntityEditorMainView::getSelectedEntity() {
  256. if(selectedEntities.size() > 0) {
  257. return selectedEntities[selectedEntities.size()-1];
  258. } else {
  259. return NULL;
  260. }
  261. }
  262. void EntityEditorMainView::Update() {
  263. if(entitiesToSelect.size() != 0) {
  264. if(multiselectIndex > entitiesToSelect.size()-1) {
  265. multiselectIndex = 0;
  266. }
  267. selectEntity(entitiesToSelect[multiselectIndex], input->getKeyState(KEY_LSHIFT) || input->getKeyState(KEY_RSHIFT));
  268. multiselectIndex++;
  269. entitiesToSelect.clear();
  270. }
  271. if(editorMode == EDITOR_MODE_2D) {
  272. Number aspect = renderTextureShape->getWidth() / renderTextureShape->getHeight();
  273. mainScene->getDefaultCamera()->setOrthoSize(trackballCamera->getCameraDistance() * aspect, trackballCamera->getCameraDistance());
  274. }
  275. for(int i=0; i < icons.size(); i++) {
  276. Number scale;
  277. Entity *parentEntity = (Entity*) icons[i]->getUserData();
  278. Vector3 parentPosition = parentEntity->getConcatenatedMatrix().getPosition();
  279. icons[i]->setPosition(parentPosition);
  280. if(editorMode == EDITOR_MODE_2D) {
  281. scale = trackballCamera->getCameraDistance() * 0.1;
  282. } else {
  283. scale = mainScene->getDefaultCamera()->getPosition().distance(icons[i]->getConcatenatedMatrix().getPosition()) * 0.1;
  284. }
  285. icons[i]->setScale(scale, scale, scale);
  286. icons[i]->rebuildTransformMatrix();
  287. }
  288. }
  289. void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
  290. entity->removeAllHandlersForListener(this);
  291. ScenePrimitive *iconPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.4, 0.4);
  292. iconPrimitive->setMaterialByName("Unlit");
  293. Texture *tex = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile("entityEditor/"+iconFile);
  294. if(iconPrimitive->getLocalShaderOptions()) {
  295. iconPrimitive->getLocalShaderOptions()->addTexture("diffuse", tex);
  296. }
  297. iconBase->addChild(iconPrimitive);
  298. iconPrimitive->billboardMode = true;
  299. iconPrimitive->setUserData((void*)entity);
  300. iconPrimitive->processInputEvents = true;
  301. iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  302. iconPrimitive->ignoreParentMatrix = true;
  303. iconPrimitive->addTag("");
  304. iconPrimitive->depthTest = false;
  305. iconPrimitive->depthWrite = false;
  306. iconPrimitive->editorOnly = true;
  307. iconPrimitive->alphaTest = true;
  308. iconPrimitive->setUserData(entity);
  309. icons.push_back(iconPrimitive);
  310. }
  311. void EntityEditorMainView::setEditorPropsRecursive(Entity *entity) {
  312. setEditorProps(entity);
  313. for(int i=0; i < entity->getNumChildren(); i++) {
  314. setEditorProps(entity->getChildAtIndex(i));
  315. }
  316. }
  317. void EntityEditorMainView::setLinkedEntityPropsRecursive(SceneEntityInstance *parentInstance, Entity *entity) {
  318. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  319. SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(entity);
  320. entity->setUserData((void*)parentInstance);
  321. entity->processInputEvents = true;
  322. entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  323. entity->editorOnly = true;
  324. if(sceneMesh && !emitter) {
  325. sceneMesh->wireFrameColor = Color(0.2, 0.9, 0.6, 1.0);
  326. sceneMesh->useGeometryHitDetection = true;
  327. }
  328. for(int i=0; i < entity->getNumChildren(); i++) {
  329. setLinkedEntityPropsRecursive(parentInstance, entity->getChildAtIndex(i));
  330. }
  331. }
  332. void EntityEditorMainView::setEditorProps(Entity *entity) {
  333. entity->processInputEvents = true;
  334. entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  335. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  336. SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(entity);
  337. if(sceneMesh && !emitter) {
  338. sceneMesh->wireFrameColor = Color(1.0, 0.8, 0.3, 1.0);
  339. // sceneMesh->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX());
  340. sceneMesh->useGeometryHitDetection = true;
  341. }
  342. SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(entity);
  343. if(instance && instance != objectRootInstance) {
  344. for(int i=0; i < instance->getNumChildren(); i++) {
  345. setLinkedEntityPropsRecursive(instance, instance->getChildAtIndex(i));
  346. }
  347. }
  348. SceneLight *sceneLight = dynamic_cast<SceneLight*>(entity);
  349. if(sceneLight) {
  350. createIcon(entity, "light_icon.png");
  351. LightDisplay *lightVis = new LightDisplay(sceneLight);
  352. }
  353. if(emitter) {
  354. createIcon(entity, "emitter_icon.png");
  355. }
  356. SceneSound *sound = dynamic_cast<SceneSound*>(entity);
  357. if(sound) {
  358. createIcon(entity, "sound_icon.png");
  359. }
  360. Camera *camera = dynamic_cast<Camera*>(entity);
  361. if(camera) {
  362. CameraDisplay *camVis = new CameraDisplay(camera);
  363. createIcon(entity, "camera_icon.png");
  364. }
  365. if(!emitter && !sceneLight && !camera && !sound && !sceneMesh && entity != sceneObjectRoot) {
  366. createIcon(entity, "empty_icon.png");
  367. }
  368. }
  369. void EntityEditorMainView::addEntityFromMenu(String command) {
  370. if(command == "add_primitive") {
  371. ScenePrimitive *newPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 1.0, 1.0, 1.0);
  372. sceneObjectRoot->addChild(newPrimitive);
  373. setEditorProps(newPrimitive);
  374. newPrimitive->setPosition(cursorPosition);
  375. selectEntity(newPrimitive);
  376. return;
  377. }
  378. if(command == "add_empty") {
  379. Entity *newEntity = new Entity();
  380. sceneObjectRoot->addChild(newEntity);
  381. setEditorProps(newEntity);
  382. newEntity->setPosition(cursorPosition);
  383. selectEntity(newEntity);
  384. return;
  385. }
  386. if(command == "add_sound") {
  387. SceneSound *newSound = new SceneSound("default.wav", 1.0, 2.0);
  388. sceneObjectRoot->addChild(newSound);
  389. setEditorProps(newSound);
  390. newSound->setPosition(cursorPosition);
  391. selectEntity(newSound);
  392. return;
  393. }
  394. if(command == "add_sound") {
  395. SceneSound *newSound = new SceneSound("default.wav", 1.0, 2.0);
  396. sceneObjectRoot->addChild(newSound);
  397. setEditorProps(newSound);
  398. newSound->setPosition(cursorPosition);
  399. selectEntity(newSound);
  400. return;
  401. }
  402. if(command == "add_camera") {
  403. Camera *newCamera = new Camera(mainScene);
  404. sceneObjectRoot->addChild(newCamera);
  405. setEditorProps(newCamera);
  406. newCamera->setPosition(cursorPosition);
  407. selectEntity(newCamera);
  408. return;
  409. }
  410. if(command == "add_image") {
  411. assetSelectType = "image";
  412. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  413. std::vector<String> extensions;
  414. extensions.push_back("png");
  415. globalFrame->showAssetBrowser(extensions);
  416. return;
  417. }
  418. if(command == "add_sprite") {
  419. assetSelectType = "sprite";
  420. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  421. std::vector<String> extensions;
  422. extensions.push_back("sprite");
  423. globalFrame->showAssetBrowser(extensions);
  424. return;
  425. }
  426. if(command == "add_label") {
  427. SceneLabel *newLabel = new SceneLabel("TEXT", 12, "sans", Label::ANTIALIAS_FULL, 1.0);
  428. newLabel->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
  429. newLabel->setAnchorPoint(0.0, 0.0, 0.0);
  430. newLabel->snapToPixels = false;
  431. newLabel->positionAtBaseline = false;
  432. sceneObjectRoot->addChild(newLabel);
  433. setEditorProps(newLabel);
  434. newLabel->setPosition(cursorPosition);
  435. selectEntity(newLabel);
  436. return;
  437. }
  438. if(command == "add_light") {
  439. SceneLight *newLight = new SceneLight(SceneLight::POINT_LIGHT, mainScene, 1.0);
  440. sceneObjectRoot->addChild(newLight);
  441. mainScene->addLight(newLight);
  442. setEditorProps(newLight);
  443. newLight->setPosition(cursorPosition);
  444. selectEntity(newLight);
  445. return;
  446. }
  447. if(command == "add_mesh") {
  448. assetSelectType = "mesh";
  449. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  450. std::vector<String> extensions;
  451. extensions.push_back("mesh");
  452. globalFrame->showAssetBrowser(extensions);
  453. return;
  454. }
  455. if(command == "add_entity") {
  456. assetSelectType = "entity";
  457. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  458. std::vector<String> extensions;
  459. extensions.push_back("entity");
  460. globalFrame->showAssetBrowser(extensions);
  461. return;
  462. }
  463. if(command == "add_particles") {
  464. SceneParticleEmitter *newEmitter = new SceneParticleEmitter(30, 3.0, 0.2);
  465. newEmitter->bBox = Vector3(0.5, 0.5, 0.5);
  466. newEmitter->setParticleType(SceneParticleEmitter::PARTICLE_TYPE_QUAD);
  467. sceneObjectRoot->addChild(newEmitter);
  468. setEditorProps(newEmitter);
  469. newEmitter->setPosition(cursorPosition);
  470. newEmitter->scaleCurve.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  471. newEmitter->scaleCurve.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  472. newEmitter->colorCurveR.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  473. newEmitter->colorCurveR.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  474. newEmitter->colorCurveG.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  475. newEmitter->colorCurveG.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  476. newEmitter->colorCurveB.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  477. newEmitter->colorCurveB.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  478. newEmitter->colorCurveA.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  479. newEmitter->colorCurveA.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  480. selectEntity(newEmitter);
  481. return;
  482. }
  483. }
  484. void EntityEditorMainView::deleteSelected() {
  485. for(int i=0; i < selectedEntities.size(); i++) {
  486. selectedEntities[i]->getParentEntity()->removeChild(selectedEntities[i]);
  487. }
  488. for(int i=0; i < selectedEntities.size(); i++) {
  489. selectedEntities[i]->setOwnsChildrenRecursive(true);
  490. for(int j=0; j < icons.size(); j++) {
  491. if(icons[j]->getUserData() == selectedEntities[i]) {
  492. delete icons[j];
  493. icons[j]->getParentEntity()->removeChild(icons[j]);
  494. icons.erase(icons.begin()+j);
  495. break;
  496. }
  497. }
  498. selectedEntities[i]->removeAllHandlers();
  499. delete selectedEntities[i];
  500. }
  501. selectedEntities.clear();
  502. transformGizmo->setTransformSelection(selectedEntities);
  503. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  504. }
  505. void EntityEditorMainView::onGainFocus() {
  506. transformGizmo->enableGizmo = true;
  507. }
  508. void EntityEditorMainView::onLoseFocus() {
  509. transformGizmo->enableGizmo = false;
  510. }
  511. void EntityEditorMainView::handleEvent(Event *event) {
  512. if(event->getDispatcher() == renderTextureShape) {
  513. focusSelf();
  514. } else if(event->getDispatcher() == trackballCamera) {
  515. Update();
  516. } else if(event->getDispatcher() == modeSwitchDropdown) {
  517. setEditorMode(modeSwitchDropdown->getSelectedIndex());
  518. } else if(event->getDispatcher() == globalFrame->assetBrowser) {
  519. if(event->getEventCode() == UIEvent::OK_EVENT) {
  520. if(assetSelectType == "mesh") {
  521. SceneMesh *newMesh = new SceneMesh(globalFrame->assetBrowser->getSelectedAssetPath());
  522. newMesh->cacheToVertexBuffer(true);
  523. sceneObjectRoot->addChild(newMesh);
  524. setEditorProps(newMesh);
  525. newMesh->setPosition(cursorPosition);
  526. selectEntity(newMesh);
  527. } else if(assetSelectType == "image") {
  528. SceneImage *newImage = new SceneImage(globalFrame->assetBrowser->getSelectedAssetPath());
  529. newImage->setMaterialByName("Unlit");
  530. if(newImage->getLocalShaderOptions()) {
  531. newImage->getLocalShaderOptions()->addTexture("diffuse", newImage->getTexture());
  532. }
  533. sceneObjectRoot->addChild(newImage);
  534. setEditorProps(newImage);
  535. newImage->setPosition(cursorPosition);
  536. selectEntity(newImage);
  537. } else if(assetSelectType == "sprite") {
  538. SceneSprite *newSprite = new SceneSprite(globalFrame->assetBrowser->getSelectedAssetPath());
  539. if(newSprite->getNumAnimations()) {
  540. newSprite->playAnimation(newSprite->getAnimationAtIndex(0)->name, 0, false);
  541. }
  542. newSprite->setMaterialByName("Unlit");
  543. if(newSprite->getLocalShaderOptions()) {
  544. newSprite->getLocalShaderOptions()->addTexture("diffuse", newSprite->getTexture());
  545. }
  546. sceneObjectRoot->addChild(newSprite);
  547. setEditorProps(newSprite);
  548. newSprite->setPosition(cursorPosition);
  549. selectEntity(newSprite);
  550. } else if(assetSelectType == "entity") {
  551. SceneEntityInstance *newEntity = new SceneEntityInstance(mainScene, globalFrame->assetBrowser->getSelectedAssetPath());
  552. sceneObjectRoot->addChild(newEntity);
  553. setEditorProps(newEntity);
  554. newEntity->setPosition(cursorPosition);
  555. selectEntity(newEntity);
  556. }
  557. globalFrame->assetBrowser->removeAllHandlersForListener(this);
  558. globalFrame->hideModal();
  559. }
  560. } else if(event->getDispatcher() == addEntityMenu) {
  561. addEntityMenu->removeAllHandlersForListener(this);
  562. String command = addEntityMenu->getSelectedItem()->getMenuItemID();
  563. addEntityMenu = NULL;
  564. addEntityFromMenu(command);
  565. } else if(event->getDispatcher() == addEntityButton) {
  566. addEntityMenu = globalMenu->showMenuAtMouse(150);
  567. addEntityMenu->addOption("Add Primitive", "add_primitive");
  568. addEntityMenu->addOption("Add Mesh", "add_mesh");
  569. addEntityMenu->addOption("Add Entity", "add_entity");
  570. addEntityMenu->addDivider();
  571. addEntityMenu->addOption("Add Sprite", "add_sprite");
  572. addEntityMenu->addOption("Add Image", "add_image");
  573. addEntityMenu->addOption("Add Label", "add_label");
  574. addEntityMenu->addDivider();
  575. addEntityMenu->addOption("Add Light", "add_light");
  576. addEntityMenu->addOption("Add Particle System", "add_particles");
  577. addEntityMenu->addOption("Add Sound", "add_sound");
  578. addEntityMenu->addOption("Add Camera", "add_camera");
  579. addEntityMenu->addDivider();
  580. addEntityMenu->addOption("Add Empty", "add_empty");
  581. addEntityMenu->fitToScreenVertical();
  582. addEntityMenu->addEventListener(this, UIEvent::OK_EVENT);
  583. } else if(event->getDispatcher() == input) {
  584. InputEvent *inputEvent = (InputEvent*) event;
  585. if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
  586. switch(inputEvent->key) {
  587. case KEY_BACKSPACE:
  588. case KEY_DELETE:
  589. if(hasFocus) {
  590. deleteSelected();
  591. }
  592. break;
  593. case KEY_ESCAPE:
  594. {
  595. for(int i=0; i < selectedEntities.size(); i++) {
  596. doEntityDeselect(selectedEntities[i]);
  597. }
  598. selectedEntities.clear();
  599. transformGizmo->setTransformSelection(selectedEntities);
  600. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  601. }
  602. break;
  603. }
  604. }
  605. } else if(event->getDispatcher() == shadeModeSelector) {
  606. switch(shadeModeSelector->getSelectedIndex()) {
  607. case 0:
  608. restoreSettingsRecursive(sceneObjectRoot);
  609. break;
  610. case 1:
  611. setMaterialRecursive("Default", false, sceneObjectRoot);
  612. break;
  613. case 2:
  614. setMaterialRecursive("", true, sceneObjectRoot);
  615. break;
  616. }
  617. } else {
  618. if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN && hasFocus && event->getDispatcher() != renderTextureShape) {
  619. InputEvent *inputEvent = (InputEvent*) event;
  620. if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON2) {
  621. Entity* targetEntity = (Entity*) event->getDispatcher();
  622. // if it's an icon, select the entity linked to the icon
  623. for(int i=0; i < icons.size(); i++) {
  624. if(icons[i] == targetEntity) {
  625. targetEntity = (Entity*)targetEntity->getUserData();
  626. }
  627. }
  628. entitiesToSelect.push_back(targetEntity);
  629. }
  630. }
  631. }
  632. }
  633. void EntityEditorMainView::restoreSettingsRecursive(Entity *entity) {
  634. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  635. if(sceneMesh && !entity->editorOnly) {
  636. SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
  637. if(meshSettings) {
  638. sceneMesh->setMaterial(meshSettings->material);
  639. sceneMesh->backfaceCulled = meshSettings->backfaceCulled;
  640. }
  641. sceneMesh->renderWireframe = false;
  642. }
  643. for(int i=0; i < entity->getNumChildren(); i++) {
  644. restoreSettingsRecursive(entity->getChildAtIndex(i));
  645. }
  646. }
  647. void EntityEditorMainView::setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity) {
  648. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  649. if(sceneMesh && !entity->editorOnly) {
  650. if(!sceneMesh->getUserData()) {
  651. SceneMeshSettings *meshSettings = new SceneMeshSettings();
  652. meshSettings->material = sceneMesh->getMaterial();
  653. meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
  654. sceneMesh->setUserData((void*)meshSettings);
  655. } else {
  656. SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
  657. meshSettings->material = sceneMesh->getMaterial();
  658. meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
  659. }
  660. sceneMesh->setMaterialByName(materialName);
  661. sceneMesh->renderWireframe = wireFrame;
  662. if(wireFrame) {
  663. // sceneMesh->setColor(RANDOM_NUMBER, RANDOM_NUMBER, RANDOM_NUMBER, 1.0);
  664. sceneMesh->backfaceCulled = false;
  665. }
  666. }
  667. for(int i=0; i < entity->getNumChildren(); i++) {
  668. setMaterialRecursive(materialName, wireFrame, entity->getChildAtIndex(i));
  669. }
  670. }
  671. Scene *EntityEditorMainView::getMainScene() {
  672. return mainScene;
  673. }
  674. void EntityEditorMainView::doEntityDeselect(Entity *targetEntity) {
  675. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
  676. if(sceneMesh) {
  677. sceneMesh->overlayWireframe = false;
  678. }
  679. SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(targetEntity);
  680. if(instance) {
  681. setOverlayWireframeRecursive(targetEntity, false);
  682. }
  683. }
  684. void EntityEditorMainView::setOverlayWireframeRecursive(Entity *targetEntity, bool val) {
  685. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
  686. if(sceneMesh) {
  687. sceneMesh->overlayWireframe = val;
  688. }
  689. for(int i=0; i < targetEntity->getNumChildren(); i++) {
  690. setOverlayWireframeRecursive(targetEntity->getChildAtIndex(i), val);
  691. }
  692. }
  693. void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
  694. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
  695. SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(targetEntity);
  696. if(sceneMesh && ! emitter) {
  697. sceneMesh->overlayWireframe = true;
  698. }
  699. SceneEntityInstance *instance = dynamic_cast<SceneEntityInstance*>(targetEntity);
  700. if(instance) {
  701. setOverlayWireframeRecursive(targetEntity, true);
  702. }
  703. Camera *camera = dynamic_cast<Camera*>(targetEntity);
  704. cameraPreview->setCamera(mainScene, camera);
  705. }
  706. void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelection) {
  707. if(targetEntity->getUserData()) {
  708. SceneEntityInstance *instance = (SceneEntityInstance*)targetEntity->getUserData();
  709. targetEntity = instance;
  710. }
  711. bool doNotReselect = false;
  712. if(!addToSelection) {
  713. for(int i=0; i < selectedEntities.size(); i++) {
  714. doEntityDeselect(selectedEntities[i]);
  715. }
  716. selectedEntities.clear();
  717. } else {
  718. for(int i=0; i < selectedEntities.size(); i++) {
  719. if(targetEntity == selectedEntities[i]) {
  720. doEntityDeselect(targetEntity);
  721. selectedEntities.erase(selectedEntities.begin() + i);
  722. doNotReselect = true;
  723. break;
  724. }
  725. }
  726. }
  727. if(!doNotReselect) {
  728. selectedEntities.push_back(targetEntity);
  729. doEntitySelect(targetEntity);
  730. }
  731. transformGizmo->setTransformSelection(selectedEntities);
  732. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  733. }
  734. Entity *EntityEditorMainView::getObjectRoot() {
  735. return sceneObjectRoot;
  736. }
  737. void EntityEditorMainView::setObjectRoot(SceneEntityInstance *entity) {
  738. objectRootInstance = entity;
  739. if(sceneObjectRoot) {
  740. sceneObjectRoot->getParentEntity()->removeChild(sceneObjectRoot);
  741. delete sceneObjectRoot;
  742. }
  743. sceneObjectRoot = entity;
  744. sceneObjectRoot->processInputEvents = true;
  745. objectRootBase->addChild(sceneObjectRoot);
  746. sceneObjectRoot->getParentEntity()->moveChildBottom(sceneObjectRoot);
  747. }
  748. EntityEditorMainView::~EntityEditorMainView() {
  749. }
  750. void EntityEditorMainView::Resize(Number width, Number height) {
  751. headerBg->Resize(width, 30);
  752. modeSwitchDropdown->setPosition(width-110, 4);
  753. Vector2 screenPos = renderTextureShape->getScreenPosition(globalScene->getDefaultCamera()->getProjectionMatrix(), globalScene->getDefaultCamera()->getTransformMatrix(), globalScene->getDefaultCamera()->getViewport());
  754. mainScene->sceneMouseRect.x = screenPos.x;
  755. mainScene->sceneMouseRect.y = screenPos.y;
  756. mainScene->sceneMouseRect.w = renderTextureShape->getWidth();
  757. mainScene->sceneMouseRect.h = renderTextureShape->getHeight();
  758. mainScene->remapMouse = true;
  759. renderTexture->resizeRenderTexture(width, height-30);
  760. renderTextureShape->setTexture(renderTexture->getTargetTexture());
  761. renderTextureShape->Resize(width, height-30);
  762. Update();
  763. }
  764. EntityEditorPropertyContainer::EntityEditorPropertyContainer() : UIElement() {
  765. propIconSelector = new UIIconSelector();
  766. addChild(propIconSelector);
  767. propIconSelector->addIcon("entityEditor/properties_icon.png");
  768. propIconSelector->addIcon("entityEditor/icon_tree.png");
  769. propIconSelector->addIcon("entityEditor/settings_icon.png");
  770. propIconSelector->setPosition(10.0, 3.0);
  771. propIconSelector->addEventListener(this, UIEvent::SELECT_EVENT);
  772. propertyView = new EntityEditorPropertyView();
  773. addChild(propertyView);
  774. propertyView->setPosition(0.0, 30.0);
  775. currentView = propertyView;
  776. treeView = new EntityEditorTreeView();
  777. addChild(treeView);
  778. treeView->setPosition(0.0, 30.0);
  779. treeView->visible = false;
  780. treeView->enabled = false;
  781. settingsView = new EntityEditorSettingsView();
  782. addChild(settingsView);
  783. settingsView->setPosition(0.0, 30.0);
  784. settingsView->visible = false;
  785. settingsView->enabled = false;
  786. }
  787. void EntityEditorPropertyContainer::handleEvent(Event *event) {
  788. if(event->getDispatcher() == propIconSelector) {
  789. currentView->visible = false;
  790. currentView->enabled = false;
  791. switch(propIconSelector->getSelectedIndex()) {
  792. case 0:
  793. currentView = propertyView;
  794. break;
  795. case 1:
  796. currentView = treeView;
  797. treeView->refreshTree();
  798. break;
  799. case 2:
  800. currentView = settingsView;
  801. break;
  802. }
  803. currentView->visible = true;
  804. currentView->enabled = true;
  805. }
  806. }
  807. EntityEditorPropertyContainer::~EntityEditorPropertyContainer() {
  808. }
  809. void EntityEditorPropertyContainer::Resize(Number width, Number height) {
  810. propertyView->Resize(width, height-30);
  811. treeView->Resize(width, height-30);
  812. settingsView->Resize(width, height-30);
  813. }
  814. PolycodeEntityEditor::PolycodeEntityEditor() : PolycodeEditor(true){
  815. mainSizer = new UIHSizer(300, 300, 300, false);
  816. addChild(mainSizer);
  817. mainView = new EntityEditorMainView();
  818. mainView->addEventListener(this, Event::CHANGE_EVENT);
  819. mainSizer->addLeftChild(mainView);
  820. mainSizer->setMinimumSize(200);
  821. propertyContainer = new EntityEditorPropertyContainer();
  822. propertyView = propertyContainer->propertyView;
  823. treeView = propertyContainer->treeView;
  824. settingsView = propertyContainer->settingsView;
  825. treeView->addEventListener(this, Event::CHANGE_EVENT);
  826. mainSizer->addRightChild(propertyContainer);
  827. }
  828. void PolycodeEntityEditor::handleEvent(Event *event) {
  829. if(event->getDispatcher() == treeView) {
  830. mainView->selectEntity(treeView->getSelectedEntity());
  831. }
  832. if(event->getDispatcher() == mainView) {
  833. switch(event->getEventCode()) {
  834. case Event::CHANGE_EVENT:
  835. propertyView->setEntity(mainView->getSelectedEntity());
  836. treeView->setSelectedEntity(mainView->getSelectedEntity());
  837. break;
  838. }
  839. }
  840. PolycodeEditor::handleEvent(event);
  841. }
  842. PolycodeEntityEditor::~PolycodeEntityEditor() {
  843. }
  844. bool PolycodeEntityEditor::openFile(OSFileEntry filePath) {
  845. PolycodeEditor::openFile(filePath);
  846. // return true;
  847. loadedInstance = new SceneEntityInstance(mainView->getMainScene(), filePath.fullPath);
  848. mainView->setObjectRoot(loadedInstance);
  849. mainView->setEditorPropsRecursive(loadedInstance);
  850. treeView->setRootEntity(loadedInstance);
  851. propertyView->setEntityInstance(loadedInstance);
  852. settingsView->setEntityInstance(loadedInstance);
  853. return true;
  854. }
  855. void PolycodeEntityEditor::Activate() {
  856. Resize(getWidth(), getHeight());
  857. }
  858. void PolycodeEntityEditor::saveCurveToObject(ObjectEntry *entry, BezierCurve *curve) {
  859. ObjectEntry *controlPoints = entry->addChild("controlPoints");
  860. for(int i=0; i < curve->getNumControlPoints(); i++) {
  861. ObjectEntry *controlPointEntry = controlPoints->addChild("controlPoint");
  862. ObjectEntry *pt1 = controlPointEntry->addChild("pt1");
  863. pt1->addChild("x", curve->getControlPoint(i)->p1.x);
  864. pt1->addChild("y", curve->getControlPoint(i)->p1.y);
  865. pt1->addChild("z", curve->getControlPoint(i)->p1.z);
  866. ObjectEntry *pt2 = controlPointEntry->addChild("pt2");
  867. pt2->addChild("x", curve->getControlPoint(i)->p2.x);
  868. pt2->addChild("y", curve->getControlPoint(i)->p2.y);
  869. pt2->addChild("z", curve->getControlPoint(i)->p2.z);
  870. ObjectEntry *pt3 = controlPointEntry->addChild("pt3");
  871. pt3->addChild("x", curve->getControlPoint(i)->p3.x);
  872. pt3->addChild("y", curve->getControlPoint(i)->p3.y);
  873. pt3->addChild("z", curve->getControlPoint(i)->p3.z);
  874. }
  875. }
  876. void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *entry) {
  877. if(entity->editorOnly)
  878. return;
  879. entry->addChild("id", entity->id);
  880. String tagString = "";
  881. for(int i=0; i < entity->getNumTags(); i++) {
  882. if(i != 0) {
  883. tagString += ",";
  884. }
  885. tagString += entity->getTagAtIndex(i);
  886. }
  887. entry->addChild("tags", tagString);
  888. if(entity->entityProps.size() > 0) {
  889. ObjectEntry *props = entry->addChild("props");
  890. for(int i=0; i < entity->entityProps.size(); i++) {
  891. ObjectEntry *prop = props->addChild("prop");
  892. prop->addChild("name", entity->entityProps[i].propName);
  893. prop->addChild("value", entity->entityProps[i].propValue);
  894. }
  895. }
  896. if(dynamic_cast<SceneEntityInstance*>(entity) && entity != mainView->getObjectRoot()) {
  897. if(!(*(entry))["type"]) {
  898. entry->addChild("type", "SceneEntityInstance");
  899. }
  900. SceneEntityInstance *instance = (SceneEntityInstance*) entity;
  901. ObjectEntry *instanceEntry = entry->addChild("SceneEntityInstance");
  902. instanceEntry->addChild("filePath", instance->getFileName());
  903. }
  904. if(dynamic_cast<SceneParticleEmitter*>(entity)) {
  905. if(!(*(entry))["type"])
  906. entry->addChild("type", "SceneParticleEmitter");
  907. SceneParticleEmitter *emitter = (SceneParticleEmitter*) entity;
  908. ObjectEntry *emitterEntry = entry->addChild("SceneParticleEmitter");
  909. emitterEntry->addChild("type", (int)emitter->getParticleType());
  910. emitterEntry->addChild("count", (int)emitter->getParticleCount());
  911. emitterEntry->addChild("lifetime", emitter->getParticleLifetime());
  912. emitterEntry->addChild("size", emitter->getParticleSize());
  913. emitterEntry->addChild("world", emitter->getParticlesInWorldSpace());
  914. emitterEntry->addChild("loop", emitter->getLoopParticles());
  915. emitterEntry->addChild("rX", emitter->getParticleRotationSpeed().x);
  916. emitterEntry->addChild("rY", emitter->getParticleRotationSpeed().y);
  917. emitterEntry->addChild("rZ", emitter->getParticleRotationSpeed().z);
  918. emitterEntry->addChild("gX", emitter->getGravity().x);
  919. emitterEntry->addChild("gY", emitter->getGravity().y);
  920. emitterEntry->addChild("gZ", emitter->getGravity().z);
  921. emitterEntry->addChild("dirX", emitter->getParticleDirection().x);
  922. emitterEntry->addChild("dirY", emitter->getParticleDirection().y);
  923. emitterEntry->addChild("dirZ", emitter->getParticleDirection().z);
  924. emitterEntry->addChild("eX", emitter->getEmitterSize().x);
  925. emitterEntry->addChild("eY", emitter->getEmitterSize().y);
  926. emitterEntry->addChild("eZ", emitter->getEmitterSize().z);
  927. emitterEntry->addChild("devX", emitter->getDirectionDeviation().x);
  928. emitterEntry->addChild("devY", emitter->getDirectionDeviation().y);
  929. emitterEntry->addChild("devZ", emitter->getDirectionDeviation().z);
  930. emitterEntry->addChild("perlin", emitter->getPerlinEnabled());
  931. emitterEntry->addChild("pX", emitter->getPerlinValue().x);
  932. emitterEntry->addChild("pY", emitter->getPerlinValue().y);
  933. emitterEntry->addChild("pZ", emitter->getPerlinValue().z);
  934. emitterEntry->addChild("useColorCurves", emitter->useColorCurves);
  935. emitterEntry->addChild("useScaleCurve", emitter->useScaleCurve);
  936. if(emitter->useScaleCurve) {
  937. saveCurveToObject(emitterEntry->addChild("scaleCurve"), &emitter->scaleCurve);
  938. }
  939. if(emitter->useColorCurves) {
  940. saveCurveToObject(emitterEntry->addChild("colorCurveR"), &emitter->colorCurveR);
  941. saveCurveToObject(emitterEntry->addChild("colorCurveG"), &emitter->colorCurveG);
  942. saveCurveToObject(emitterEntry->addChild("colorCurveB"), &emitter->colorCurveB);
  943. saveCurveToObject(emitterEntry->addChild("colorCurveA"), &emitter->colorCurveA);
  944. }
  945. }
  946. if(dynamic_cast<SceneSprite*>(entity)) {
  947. if(!(*(entry))["type"])
  948. entry->addChild("type", "SceneSprite");
  949. SceneSprite *sprite = (SceneSprite*) entity;
  950. ObjectEntry *spriteEntry = entry->addChild("SceneSprite");
  951. spriteEntry->addChild("filePath", sprite->getFileName());
  952. String animName = "";
  953. if(sprite->getCurrentAnimation()) {
  954. animName = sprite->getCurrentAnimation()->name;
  955. }
  956. spriteEntry->addChild("anim", animName);
  957. }
  958. if(dynamic_cast<SceneLabel*>(entity)) {
  959. SceneLabel *label = (SceneLabel*) entity;
  960. if(!(*(entry))["type"])
  961. entry->addChild("type", "SceneLabel");
  962. ObjectEntry *labelEntry = entry->addChild("SceneLabel");
  963. labelEntry->addChild("text", label->getText());
  964. labelEntry->addChild("font", label->getLabel()->getFont()->getFontName());
  965. labelEntry->addChild("size", (Number)label->getLabel()->getSize());
  966. labelEntry->addChild("actualHeight", label->getLabelActualHeight());
  967. labelEntry->addChild("aaMode", (int)label->getLabel()->getAntialiasMode());
  968. }
  969. if(dynamic_cast<SceneLight*>(entity)) {
  970. SceneLight *light = (SceneLight*) entity;
  971. if(!(*(entry))["type"]) {
  972. entry->addChild("type", "SceneLight");
  973. }
  974. ObjectEntry *lightEntry = entry->addChild("SceneLight");
  975. lightEntry->addChild("type", light->getType());
  976. lightEntry->addChild("cR", light->lightColor.r);
  977. lightEntry->addChild("cG", light->lightColor.g);
  978. lightEntry->addChild("cB", light->lightColor.b);
  979. lightEntry->addChild("cA", light->lightColor.a);
  980. lightEntry->addChild("scR", light->specularLightColor.r);
  981. lightEntry->addChild("scG", light->specularLightColor.g);
  982. lightEntry->addChild("scB", light->specularLightColor.b);
  983. lightEntry->addChild("scA", light->specularLightColor.a);
  984. lightEntry->addChild("intensity", light->getIntensity());
  985. lightEntry->addChild("cAtt", light->getConstantAttenuation());
  986. lightEntry->addChild("lAtt", light->getLinearAttenuation());
  987. lightEntry->addChild("qAtt", light->getQuadraticAttenuation());
  988. if(light->getType() == SceneLight::SPOT_LIGHT) {
  989. lightEntry->addChild("spotCutoff", light->getSpotlightCutoff());
  990. lightEntry->addChild("spotExponent", light->getSpotlightExponent());
  991. lightEntry->addChild("shadows", light->areShadowsEnabled());
  992. if(light->areShadowsEnabled()) {
  993. lightEntry->addChild("shadowmapFOV", light->getShadowMapFOV());
  994. lightEntry->addChild("shadowmapRes", (int)light->getShadowMapResolution());
  995. }
  996. }
  997. }
  998. if(dynamic_cast<SceneSound*>(entity)) {
  999. SceneSound *sound = (SceneSound*) entity;
  1000. if(!(*(entry))["type"]) {
  1001. entry->addChild("type", "SceneSound");
  1002. }
  1003. ObjectEntry *soundEntry = entry->addChild("SceneSound");
  1004. soundEntry->addChild("filePath", sound->getSound()->getFileName());
  1005. soundEntry->addChild("refDistance", sound->getSound()->getReferenceDistance());
  1006. soundEntry->addChild("maxDistance", sound->getSound()->getMaxDistance());
  1007. soundEntry->addChild("volume", sound->getSound()->getVolume());
  1008. soundEntry->addChild("pitch", sound->getSound()->getPitch());
  1009. }
  1010. if(dynamic_cast<Camera*>(entity)) {
  1011. Camera *camera = (Camera*) entity;
  1012. if(!(*(entry))["type"]) {
  1013. entry->addChild("type", "Camera");
  1014. }
  1015. ObjectEntry *cameraEntry = entry->addChild("Camera");
  1016. cameraEntry->addChild("exposure", camera->getExposureLevel());
  1017. cameraEntry->addChild("nearClip", camera->getNearClipppingPlane());
  1018. cameraEntry->addChild("farClip", camera->getFarClipppingPlane());
  1019. cameraEntry->addChild("ortho", camera->getOrthoMode());
  1020. if(camera->getOrthoMode()) {
  1021. cameraEntry->addChild("sizeMode", camera->getOrthoSizeMode());
  1022. cameraEntry->addChild("orthoWidth", camera->getOrthoSizeX());
  1023. cameraEntry->addChild("orthoHeight", camera->getOrthoSizeY());
  1024. } else {
  1025. cameraEntry->addChild("fov", camera->getFOV());
  1026. }
  1027. }
  1028. if(dynamic_cast<ScenePrimitive*>(entity) && !dynamic_cast<SceneSprite*>(entity) && !dynamic_cast<SceneLabel*>(entity)) {
  1029. if(!(*(entry))["type"]) {
  1030. entry->addChild("type", "ScenePrimitive");
  1031. }
  1032. ScenePrimitive *primitive = (ScenePrimitive*) entity;
  1033. ObjectEntry *primitiveEntry = entry->addChild("ScenePrimitive");
  1034. primitiveEntry->addChild("type", primitive->getPrimitiveType());
  1035. primitiveEntry->addChild("p1", primitive->getPrimitiveParameter1());
  1036. primitiveEntry->addChild("p2", primitive->getPrimitiveParameter2());
  1037. primitiveEntry->addChild("p3", primitive->getPrimitiveParameter3());
  1038. primitiveEntry->addChild("p4", primitive->getPrimitiveParameter4());
  1039. primitiveEntry->addChild("p5", primitive->getPrimitiveParameter5());
  1040. }
  1041. if(dynamic_cast<SceneMesh*>(entity)) {
  1042. if(!(*(entry))["type"]) {
  1043. entry->addChild("type", "SceneMesh");
  1044. }
  1045. SceneMesh *sceneMesh = (SceneMesh*) entity;
  1046. ObjectEntry *meshEntry = entry->addChild("SceneMesh");
  1047. if(sceneMesh->getFilename() != "") {
  1048. meshEntry->addChild("file", sceneMesh->getFilename().replace(parentProject->getRootFolder()+"/", ""));
  1049. }
  1050. if(sceneMesh->getMaterial()) {
  1051. meshEntry->addChild("material", sceneMesh->getMaterial()->getResourceName());
  1052. ObjectEntry *shaderOptions = meshEntry->addChild("shader_options");
  1053. saveShaderOptionsToEntry(shaderOptions, sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
  1054. }
  1055. }
  1056. if(!(*(entry))["type"])
  1057. entry->addChild("type", "Entity");
  1058. entry->addChild("cR", entity->color.r);
  1059. entry->addChild("cG", entity->color.g);
  1060. entry->addChild("cB", entity->color.b);
  1061. entry->addChild("cA", entity->color.a);
  1062. entry->addChild("blendMode", entity->blendingMode);
  1063. entry->addChild("sX", entity->getScale().x);
  1064. entry->addChild("sY", entity->getScale().y);
  1065. entry->addChild("sZ", entity->getScale().z);
  1066. entry->addChild("rX", entity->getPitch());
  1067. entry->addChild("rY", entity->getYaw());
  1068. entry->addChild("rZ", entity->getRoll());
  1069. entry->addChild("pX", entity->getPosition().x);
  1070. entry->addChild("pY", entity->getPosition().y);
  1071. entry->addChild("pZ", entity->getPosition().z);
  1072. entry->addChild("bbX", entity->bBox.x);
  1073. entry->addChild("bbY", entity->bBox.y);
  1074. entry->addChild("bbZ", entity->bBox.z);
  1075. ObjectEntry *children = NULL;
  1076. for(int i=0; i < entity->getNumChildren(); i++) {
  1077. if(!entity->getChildAtIndex(i)->editorOnly) {
  1078. if(!children)
  1079. children = entry->addChild("children");
  1080. ObjectEntry *child = children->addChild("child");
  1081. saveEntityToObjectEntry((ScreenEntity*)entity->getChildAtIndex(i), child);
  1082. }
  1083. }
  1084. }
  1085. void PolycodeEntityEditor::saveShaderOptionsToEntry(ObjectEntry *entry, Material *material, ShaderBinding *binding) {
  1086. if(material->getNumShaders() > 0) {
  1087. for(int s=0; s < material->getNumShaders(); s++) {
  1088. Shader *shader = material->getShader(s);
  1089. ObjectEntry *shaderEntry = entry->addChild("shader");
  1090. ObjectEntry *texturesEntry = shaderEntry->addChild("textures");
  1091. for(int j=0; j < shader->expectedTextures.size(); j++) {
  1092. Texture *texture = binding->getTexture(shader->expectedTextures[j]);
  1093. if(texture) {
  1094. String texturePath = texture->getResourcePath();
  1095. texturePath = texturePath.replace(parentProject->getRootFolder()+"/", "");
  1096. ObjectEntry *textureEntry = texturesEntry->addChild("texture", texturePath);
  1097. textureEntry->addChild("name", shader->expectedTextures[j]);
  1098. }
  1099. }
  1100. for(int j=0; j < shader->expectedCubemaps.size(); j++) {
  1101. Cubemap *cubemap = binding->getCubemap(shader->expectedCubemaps[j]);
  1102. if(cubemap) {
  1103. String cubemapName = cubemap->getResourceName();
  1104. ObjectEntry *cubemapEntry = texturesEntry->addChild("cubemap", cubemapName);
  1105. cubemapEntry->addChild("name", shader->expectedCubemaps[j]);
  1106. }
  1107. }
  1108. if(shader->expectedParams.size() > 0 || shader->expectedParams.size() > 0) {
  1109. ObjectEntry *paramsEntry = shaderEntry->addChild("params");
  1110. for(int j=0; j < shader->expectedParams.size(); j++) {
  1111. if(binding->getLocalParamByName(shader->expectedParams[j].name)) {
  1112. ObjectEntry *paramEntry = paramsEntry->addChild("param");
  1113. paramEntry->addChild("name", shader->expectedParams[j].name);
  1114. paramEntry->addChild("value", PolycodeMaterialEditor::createStringValue(shader->expectedParams[j].type, binding->getLocalParamByName(shader->expectedParams[j].name)->data));
  1115. }
  1116. }
  1117. }
  1118. }
  1119. }
  1120. }
  1121. void PolycodeEntityEditor::saveFile() {
  1122. Object saveObject;
  1123. ObjectEntry *settings = saveObject.root.addChild("settings");
  1124. ObjectEntry *linkedMaterialFiles = settings->addChild("matFiles");
  1125. for(int i=0; i < loadedInstance->getNumLinkedResourePools(); i++) {
  1126. ResourcePool *pool = loadedInstance->getLinkedResourcePoolAtIndex(i);
  1127. linkedMaterialFiles->addChild("matFile")->addChild("path", pool->getName());
  1128. }
  1129. saveObject.root.name = "entity";
  1130. ObjectEntry *children = saveObject.root.addChild("root");
  1131. saveEntityToObjectEntry(mainView->getObjectRoot(), children);
  1132. saveObject.saveToXML(filePath);
  1133. setHasChanges(false);
  1134. }
  1135. void PolycodeEntityEditor::Resize(int x, int y) {
  1136. mainSizer->Resize(x, y);
  1137. PolycodeEditor::Resize(x,y);
  1138. }