PolycodeEntityEditor.cpp 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286
  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. mainScene = new Scene(Scene::SCENE_3D, true);
  169. renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
  170. mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);
  171. mainScene->useClearColor = true;
  172. mainScene->rootEntity.processInputEvents = true;
  173. renderTextureShape = new UIRect(256, 256);
  174. renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);
  175. renderTextureShape->setTexture(renderTexture->getTargetTexture());
  176. addChild(renderTextureShape);
  177. renderTextureShape->setPosition(0, 30);
  178. cameraPreview = new CameraPreviewWindow();
  179. addChild(cameraPreview);
  180. cameraPreview->setPosition(5, 35);
  181. headerBg = new UIRect(10,10);
  182. addChild(headerBg);
  183. headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
  184. headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
  185. topBar = new Entity();
  186. addChild(topBar);
  187. topBar->setPosition(0, 0);
  188. topBar->processInputEvents = true;
  189. mainScene->getDefaultCamera()->setPosition(10, 10, 10);
  190. mainScene->getDefaultCamera( )->lookAt(Vector3());
  191. mainScene->getDefaultCamera()->setClippingPlanes(0.01, 10000);
  192. grid = new EditorGrid();
  193. mainScene->addChild(grid);
  194. sceneObjectRoot = new Entity();
  195. sceneObjectRoot->processInputEvents = true;
  196. mainScene->addChild(sceneObjectRoot);
  197. transformGizmo = new TransformGizmo(mainScene, mainScene->getDefaultCamera());
  198. mainScene->addChild(transformGizmo);
  199. trackballCamera = new TrackballCamera(mainScene->getDefaultCamera(), renderTextureShape);
  200. trackballCamera->addEventListener(this, Event::CHANGE_EVENT);
  201. addEntityButton = new UIImageButton("entityEditor/add_entity.png", 1.0, 24, 24);
  202. topBar->addChild(addEntityButton);
  203. addEntityButton->setPosition(4, 2);
  204. addEntityButton->addEventListener(this, UIEvent::CLICK_EVENT);
  205. transformGizmoMenu = new TransformGizmoMenu(transformGizmo);
  206. topBar->addChild(transformGizmoMenu);
  207. transformGizmoMenu->setPositionX(40);
  208. modeSwitchDropdown = new UIComboBox(globalMenu, 100);
  209. topBar->addChild(modeSwitchDropdown);
  210. modeSwitchDropdown->addComboItem("3D MODE");
  211. modeSwitchDropdown->addComboItem("2D MODE");
  212. modeSwitchDropdown->setSelectedIndex(0);
  213. modeSwitchDropdown->addEventListener(this, UIEvent::CHANGE_EVENT);
  214. shadeModeSelector = new UIIconSelector();
  215. shadeModeSelector->addIcon("entityEditor/shade_full.png");
  216. shadeModeSelector->addIcon("entityEditor/shade_solid.png");
  217. shadeModeSelector->addIcon("entityEditor/shade_wire.png");
  218. // topBar->addChild(shadeModeSelector);
  219. shadeModeSelector->setPosition(320, 3);
  220. shadeModeSelector->addEventListener(this, UIEvent::SELECT_EVENT);
  221. editorMode = EDITOR_MODE_3D;
  222. input = CoreServices::getInstance()->getCore()->getInput();
  223. input->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  224. }
  225. void EntityEditorMainView::setEditorMode(int newMode) {
  226. editorMode = newMode;
  227. if(editorMode == EDITOR_MODE_3D) {
  228. mainScene->setSceneType(Scene::SCENE_3D);
  229. grid->setGridMode(EditorGrid::GRID_MODE_3D);
  230. transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_3D);
  231. mainScene->getDefaultCamera()->setOrthoMode(false);
  232. mainScene->getDefaultCamera()->setClippingPlanes(1, 1000);
  233. trackballCamera->disableRotation(false);
  234. } else {
  235. mainScene->setSceneType(Scene::SCENE_2D);
  236. mainScene->getDefaultCamera()->setOrthoMode(true);
  237. mainScene->getDefaultCamera()->setClippingPlanes(-1, 10000);
  238. trackballCamera->setCameraPosition(trackballCamera->getOribitingCenter()+Vector3(0.0, 0.0, trackballCamera->getCameraDistance()));
  239. grid->setGridMode(EditorGrid::GRID_MODE_2D);
  240. transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D);
  241. trackballCamera->disableRotation(true);
  242. Update();
  243. }
  244. }
  245. Entity *EntityEditorMainView::getSelectedEntity() {
  246. if(selectedEntities.size() > 0) {
  247. return selectedEntities[selectedEntities.size()-1];
  248. } else {
  249. return NULL;
  250. }
  251. }
  252. void EntityEditorMainView::Update() {
  253. if(entitiesToSelect.size() != 0) {
  254. if(multiselectIndex > entitiesToSelect.size()-1) {
  255. multiselectIndex = 0;
  256. }
  257. selectEntity(entitiesToSelect[multiselectIndex], input->getKeyState(KEY_LSHIFT) || input->getKeyState(KEY_RSHIFT));
  258. multiselectIndex++;
  259. entitiesToSelect.clear();
  260. }
  261. if(editorMode == EDITOR_MODE_2D) {
  262. Number aspect = renderTextureShape->getWidth() / renderTextureShape->getHeight();
  263. mainScene->getDefaultCamera()->setOrthoSize(trackballCamera->getCameraDistance() * aspect, trackballCamera->getCameraDistance());
  264. }
  265. for(int i=0; i < icons.size(); i++) {
  266. Number scale;
  267. if(editorMode == EDITOR_MODE_2D) {
  268. scale = trackballCamera->getCameraDistance() * 0.1;
  269. } else {
  270. scale = mainScene->getDefaultCamera()->getPosition().distance(icons[i]->getConcatenatedMatrix().getPosition()) * 0.1;
  271. }
  272. icons[i]->setScale(scale, scale, scale);
  273. }
  274. }
  275. void EntityEditorMainView::createIcon(Entity *entity, String iconFile) {
  276. entity->removeAllHandlersForListener(this);
  277. ScenePrimitive *iconPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 0.4, 0.4);
  278. iconPrimitive->setMaterialByName("Unlit");
  279. Texture *tex = CoreServices::getInstance()->getMaterialManager()->createTextureFromFile("entityEditor/"+iconFile);
  280. if(iconPrimitive->getLocalShaderOptions()) {
  281. iconPrimitive->getLocalShaderOptions()->addTexture("diffuse", tex);
  282. }
  283. entity->addChild(iconPrimitive);
  284. iconPrimitive->billboardMode = true;
  285. iconPrimitive->processInputEvents = true;
  286. iconPrimitive->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  287. iconPrimitive->addTag("");
  288. iconPrimitive->depthTest = false;
  289. iconPrimitive->depthWrite = false;
  290. iconPrimitive->editorOnly = true;
  291. iconPrimitive->alphaTest = true;
  292. iconPrimitive->setUserData(entity);
  293. icons.push_back(iconPrimitive);
  294. }
  295. void EntityEditorMainView::setEditorPropsRecursive(Entity *entity) {
  296. setEditorProps(entity);
  297. for(int i=0; i < entity->getNumChildren(); i++) {
  298. setEditorProps(entity->getChildAtIndex(i));
  299. }
  300. }
  301. void EntityEditorMainView::setEditorProps(Entity *entity) {
  302. entity->processInputEvents = true;
  303. entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  304. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  305. SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(entity);
  306. if(sceneMesh && !emitter) {
  307. sceneMesh->wireFrameColor = Color(1.0, 0.8, 0.3, 1.0);
  308. // sceneMesh->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX());
  309. sceneMesh->useGeometryHitDetection = true;
  310. }
  311. SceneLight *sceneLight = dynamic_cast<SceneLight*>(entity);
  312. if(sceneLight) {
  313. createIcon(entity, "light_icon.png");
  314. LightDisplay *lightVis = new LightDisplay(sceneLight);
  315. }
  316. if(emitter) {
  317. createIcon(entity, "emitter_icon.png");
  318. }
  319. SceneSound *sound = dynamic_cast<SceneSound*>(entity);
  320. if(sound) {
  321. createIcon(entity, "sound_icon.png");
  322. }
  323. Camera *camera = dynamic_cast<Camera*>(entity);
  324. if(camera) {
  325. CameraDisplay *camVis = new CameraDisplay(camera);
  326. createIcon(entity, "camera_icon.png");
  327. }
  328. if(!emitter && !sceneLight && !camera && !sound && !sceneMesh && entity != sceneObjectRoot) {
  329. createIcon(entity, "empty_icon.png");
  330. }
  331. }
  332. void EntityEditorMainView::addEntityFromMenu(String command) {
  333. if(command == "add_primitive") {
  334. ScenePrimitive *newPrimitive = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 1.0, 1.0, 1.0);
  335. sceneObjectRoot->addChild(newPrimitive);
  336. setEditorProps(newPrimitive);
  337. newPrimitive->setPosition(cursorPosition);
  338. selectEntity(newPrimitive);
  339. return;
  340. }
  341. if(command == "add_empty") {
  342. Entity *newEntity = new Entity();
  343. sceneObjectRoot->addChild(newEntity);
  344. setEditorProps(newEntity);
  345. newEntity->setPosition(cursorPosition);
  346. selectEntity(newEntity);
  347. return;
  348. }
  349. if(command == "add_sound") {
  350. SceneSound *newSound = new SceneSound("default.wav", 1.0, 2.0);
  351. sceneObjectRoot->addChild(newSound);
  352. setEditorProps(newSound);
  353. newSound->setPosition(cursorPosition);
  354. selectEntity(newSound);
  355. return;
  356. }
  357. if(command == "add_sound") {
  358. SceneSound *newSound = new SceneSound("default.wav", 1.0, 2.0);
  359. sceneObjectRoot->addChild(newSound);
  360. setEditorProps(newSound);
  361. newSound->setPosition(cursorPosition);
  362. selectEntity(newSound);
  363. return;
  364. }
  365. if(command == "add_camera") {
  366. Camera *newCamera = new Camera(mainScene);
  367. sceneObjectRoot->addChild(newCamera);
  368. setEditorProps(newCamera);
  369. newCamera->setPosition(cursorPosition);
  370. selectEntity(newCamera);
  371. return;
  372. }
  373. if(command == "add_image") {
  374. assetSelectType = "image";
  375. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  376. std::vector<String> extensions;
  377. extensions.push_back("png");
  378. globalFrame->showAssetBrowser(extensions);
  379. return;
  380. }
  381. if(command == "add_sprite") {
  382. assetSelectType = "sprite";
  383. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  384. std::vector<String> extensions;
  385. extensions.push_back("sprite");
  386. globalFrame->showAssetBrowser(extensions);
  387. return;
  388. }
  389. if(command == "add_label") {
  390. SceneLabel *newLabel = new SceneLabel("TEXT", 12, "sans", Label::ANTIALIAS_FULL, 1.0);
  391. newLabel->setBlendingMode(Renderer::BLEND_MODE_NORMAL);
  392. newLabel->setAnchorPoint(0.0, 0.0, 0.0);
  393. newLabel->snapToPixels = false;
  394. newLabel->positionAtBaseline = false;
  395. sceneObjectRoot->addChild(newLabel);
  396. setEditorProps(newLabel);
  397. newLabel->setPosition(cursorPosition);
  398. selectEntity(newLabel);
  399. return;
  400. }
  401. if(command == "add_light") {
  402. SceneLight *newLight = new SceneLight(SceneLight::POINT_LIGHT, mainScene, 1.0);
  403. sceneObjectRoot->addChild(newLight);
  404. mainScene->addLight(newLight);
  405. setEditorProps(newLight);
  406. newLight->setPosition(cursorPosition);
  407. selectEntity(newLight);
  408. return;
  409. }
  410. if(command == "add_mesh") {
  411. assetSelectType = "mesh";
  412. globalFrame->assetBrowser->addEventListener(this, UIEvent::OK_EVENT);
  413. std::vector<String> extensions;
  414. extensions.push_back("mesh");
  415. globalFrame->showAssetBrowser(extensions);
  416. return;
  417. }
  418. if(command == "add_particles") {
  419. SceneParticleEmitter *newEmitter = new SceneParticleEmitter(30, 3.0, 0.2);
  420. newEmitter->bBox = Vector3(0.5, 0.5, 0.5);
  421. newEmitter->setParticleType(SceneParticleEmitter::PARTICLE_TYPE_QUAD);
  422. sceneObjectRoot->addChild(newEmitter);
  423. setEditorProps(newEmitter);
  424. newEmitter->setPosition(cursorPosition);
  425. newEmitter->scaleCurve.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  426. newEmitter->scaleCurve.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  427. newEmitter->colorCurveR.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  428. newEmitter->colorCurveR.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  429. newEmitter->colorCurveG.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  430. newEmitter->colorCurveG.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  431. newEmitter->colorCurveB.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  432. newEmitter->colorCurveB.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  433. newEmitter->colorCurveA.addControlPoint2dWithHandles(-0.1, 0.5, 0.0, 0.5, 0.1, 0.5);
  434. newEmitter->colorCurveA.addControlPoint2dWithHandles(0.9, 0.5, 1.0, 0.5, 1.1, 0.5);
  435. selectEntity(newEmitter);
  436. return;
  437. }
  438. }
  439. void EntityEditorMainView::deleteSelected() {
  440. for(int i=0; i < selectedEntities.size(); i++) {
  441. selectedEntities[i]->getParentEntity()->removeChild(selectedEntities[i]);
  442. }
  443. for(int i=0; i < selectedEntities.size(); i++) {
  444. selectedEntities[i]->setOwnsChildrenRecursive(true);
  445. for(int j=0; j < icons.size(); j++) {
  446. if(icons[j]->getUserData() == selectedEntities[i]) {
  447. delete icons[j];
  448. icons[j]->getParentEntity()->removeChild(icons[j]);
  449. icons.erase(icons.begin()+j);
  450. break;
  451. }
  452. }
  453. selectedEntities[i]->removeAllHandlers();
  454. delete selectedEntities[i];
  455. }
  456. selectedEntities.clear();
  457. transformGizmo->setTransformSelection(selectedEntities);
  458. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  459. }
  460. void EntityEditorMainView::handleEvent(Event *event) {
  461. if(event->getDispatcher() == trackballCamera) {
  462. Update();
  463. } else if(event->getDispatcher() == modeSwitchDropdown) {
  464. setEditorMode(modeSwitchDropdown->getSelectedIndex());
  465. } else if(event->getDispatcher() == globalFrame->assetBrowser) {
  466. if(event->getEventCode() == UIEvent::OK_EVENT) {
  467. if(assetSelectType == "mesh") {
  468. SceneMesh *newMesh = new SceneMesh(globalFrame->assetBrowser->getFullSelectedAssetPath());
  469. newMesh->cacheToVertexBuffer(true);
  470. sceneObjectRoot->addChild(newMesh);
  471. setEditorProps(newMesh);
  472. newMesh->setPosition(cursorPosition);
  473. selectEntity(newMesh);
  474. } else if(assetSelectType == "image") {
  475. SceneImage *newImage = new SceneImage(globalFrame->assetBrowser->getFullSelectedAssetPath());
  476. newImage->setMaterialByName("Unlit");
  477. if(newImage->getLocalShaderOptions()) {
  478. newImage->getLocalShaderOptions()->addTexture("diffuse", newImage->getTexture());
  479. }
  480. sceneObjectRoot->addChild(newImage);
  481. setEditorProps(newImage);
  482. newImage->setPosition(cursorPosition);
  483. selectEntity(newImage);
  484. } else if(assetSelectType == "sprite") {
  485. SceneSprite *newSprite = new SceneSprite(globalFrame->assetBrowser->getFullSelectedAssetPath());
  486. if(newSprite->getNumAnimations()) {
  487. newSprite->playAnimation(newSprite->getAnimationAtIndex(0)->name, 0, false);
  488. }
  489. newSprite->setMaterialByName("Unlit");
  490. if(newSprite->getLocalShaderOptions()) {
  491. newSprite->getLocalShaderOptions()->addTexture("diffuse", newSprite->getTexture());
  492. }
  493. sceneObjectRoot->addChild(newSprite);
  494. setEditorProps(newSprite);
  495. newSprite->setPosition(cursorPosition);
  496. selectEntity(newSprite);
  497. }
  498. globalFrame->assetBrowser->removeAllHandlersForListener(this);
  499. globalFrame->hideModal();
  500. }
  501. } else if(event->getDispatcher() == addEntityMenu) {
  502. addEntityMenu->removeAllHandlersForListener(this);
  503. String command = addEntityMenu->getSelectedItem()->getMenuItemID();
  504. addEntityMenu = NULL;
  505. addEntityFromMenu(command);
  506. } else if(event->getDispatcher() == addEntityButton) {
  507. addEntityMenu = globalMenu->showMenuAtMouse(150);
  508. addEntityMenu->addOption("Add Primitive", "add_primitive");
  509. addEntityMenu->addOption("Add Mesh", "add_mesh");
  510. addEntityMenu->addOption("Add Entity", "add_entity");
  511. addEntityMenu->addDivider();
  512. addEntityMenu->addOption("Add Sprite", "add_sprite");
  513. addEntityMenu->addOption("Add Image", "add_image");
  514. addEntityMenu->addOption("Add Label", "add_label");
  515. addEntityMenu->addDivider();
  516. addEntityMenu->addOption("Add Light", "add_light");
  517. addEntityMenu->addOption("Add Particle System", "add_particles");
  518. addEntityMenu->addOption("Add Sound", "add_sound");
  519. addEntityMenu->addOption("Add Camera", "add_camera");
  520. addEntityMenu->addDivider();
  521. addEntityMenu->addOption("Add Empty", "add_empty");
  522. addEntityMenu->fitToScreenVertical();
  523. addEntityMenu->addEventListener(this, UIEvent::OK_EVENT);
  524. } else if(event->getDispatcher() == input) {
  525. InputEvent *inputEvent = (InputEvent*) event;
  526. if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
  527. switch(inputEvent->key) {
  528. case KEY_BACKSPACE:
  529. case KEY_DELETE:
  530. //deleteSelected();
  531. break;
  532. }
  533. }
  534. } else if(event->getDispatcher() == shadeModeSelector) {
  535. switch(shadeModeSelector->getSelectedIndex()) {
  536. case 0:
  537. restoreSettingsRecursive(sceneObjectRoot);
  538. break;
  539. case 1:
  540. setMaterialRecursive("Default", false, sceneObjectRoot);
  541. break;
  542. case 2:
  543. setMaterialRecursive("", true, sceneObjectRoot);
  544. break;
  545. }
  546. } else {
  547. if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN ) {
  548. InputEvent *inputEvent = (InputEvent*) event;
  549. if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON2) {
  550. Entity* targetEntity = (Entity*) event->getDispatcher();
  551. // if it's an icon, select the entity linked to the icon
  552. for(int i=0; i < icons.size(); i++) {
  553. if(icons[i] == targetEntity) {
  554. targetEntity = (Entity*)targetEntity->getUserData();
  555. }
  556. }
  557. entitiesToSelect.push_back(targetEntity);
  558. }
  559. }
  560. }
  561. }
  562. void EntityEditorMainView::restoreSettingsRecursive(Entity *entity) {
  563. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  564. if(sceneMesh && !entity->editorOnly) {
  565. SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
  566. if(meshSettings) {
  567. sceneMesh->setMaterial(meshSettings->material);
  568. sceneMesh->backfaceCulled = meshSettings->backfaceCulled;
  569. }
  570. sceneMesh->renderWireframe = false;
  571. }
  572. for(int i=0; i < entity->getNumChildren(); i++) {
  573. restoreSettingsRecursive(entity->getChildAtIndex(i));
  574. }
  575. }
  576. void EntityEditorMainView::setMaterialRecursive(const String &materialName, bool wireFrame, Entity *entity) {
  577. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
  578. if(sceneMesh && !entity->editorOnly) {
  579. if(!sceneMesh->getUserData()) {
  580. SceneMeshSettings *meshSettings = new SceneMeshSettings();
  581. meshSettings->material = sceneMesh->getMaterial();
  582. meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
  583. sceneMesh->setUserData((void*)meshSettings);
  584. } else {
  585. SceneMeshSettings *meshSettings = (SceneMeshSettings*) entity->getUserData();
  586. meshSettings->material = sceneMesh->getMaterial();
  587. meshSettings->backfaceCulled = sceneMesh->backfaceCulled;
  588. }
  589. sceneMesh->setMaterialByName(materialName);
  590. sceneMesh->renderWireframe = wireFrame;
  591. if(wireFrame) {
  592. // sceneMesh->setColor(RANDOM_NUMBER, RANDOM_NUMBER, RANDOM_NUMBER, 1.0);
  593. sceneMesh->backfaceCulled = false;
  594. }
  595. }
  596. for(int i=0; i < entity->getNumChildren(); i++) {
  597. setMaterialRecursive(materialName, wireFrame, entity->getChildAtIndex(i));
  598. }
  599. }
  600. Scene *EntityEditorMainView::getMainScene() {
  601. return mainScene;
  602. }
  603. void EntityEditorMainView::doEntityDeselect(Entity *targetEntity) {
  604. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
  605. if(sceneMesh) {
  606. sceneMesh->overlayWireframe = false;
  607. }
  608. }
  609. void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
  610. SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
  611. SceneParticleEmitter *emitter = dynamic_cast<SceneParticleEmitter*>(targetEntity);
  612. if(sceneMesh && ! emitter) {
  613. sceneMesh->overlayWireframe = true;
  614. }
  615. Camera *camera = dynamic_cast<Camera*>(targetEntity);
  616. cameraPreview->setCamera(mainScene, camera);
  617. }
  618. void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelection) {
  619. bool doNotReselect = false;
  620. if(!addToSelection) {
  621. for(int i=0; i < selectedEntities.size(); i++) {
  622. doEntityDeselect(selectedEntities[i]);
  623. }
  624. selectedEntities.clear();
  625. } else {
  626. for(int i=0; i < selectedEntities.size(); i++) {
  627. if(targetEntity == selectedEntities[i]) {
  628. doEntityDeselect(targetEntity);
  629. selectedEntities.erase(selectedEntities.begin() + i);
  630. doNotReselect = true;
  631. break;
  632. }
  633. }
  634. }
  635. if(!doNotReselect) {
  636. selectedEntities.push_back(targetEntity);
  637. doEntitySelect(targetEntity);
  638. }
  639. transformGizmo->setTransformSelection(selectedEntities);
  640. dispatchEvent(new Event(), Event::CHANGE_EVENT);
  641. }
  642. Entity *EntityEditorMainView::getObjectRoot() {
  643. return sceneObjectRoot;
  644. }
  645. void EntityEditorMainView::setObjectRoot(Entity *entity) {
  646. if(sceneObjectRoot) {
  647. sceneObjectRoot->getParentEntity()->removeChild(sceneObjectRoot);
  648. delete sceneObjectRoot;
  649. }
  650. sceneObjectRoot = entity;
  651. sceneObjectRoot->processInputEvents = true;
  652. mainScene->addChild(sceneObjectRoot);
  653. sceneObjectRoot->getParentEntity()->moveChildBottom(sceneObjectRoot);
  654. }
  655. EntityEditorMainView::~EntityEditorMainView() {
  656. }
  657. void EntityEditorMainView::Resize(Number width, Number height) {
  658. headerBg->Resize(width, 30);
  659. modeSwitchDropdown->setPosition(width-110, 4);
  660. Vector2 screenPos = renderTextureShape->getScreenPosition(globalScene->getDefaultCamera()->getProjectionMatrix(), globalScene->getDefaultCamera()->getTransformMatrix(), globalScene->getDefaultCamera()->getViewport());
  661. mainScene->sceneMouseRect.x = screenPos.x;
  662. mainScene->sceneMouseRect.y = screenPos.y;
  663. mainScene->sceneMouseRect.w = renderTextureShape->getWidth();
  664. mainScene->sceneMouseRect.h = renderTextureShape->getHeight();
  665. mainScene->remapMouse = true;
  666. renderTexture->resizeRenderTexture(width, height-30);
  667. renderTextureShape->setTexture(renderTexture->getTargetTexture());
  668. renderTextureShape->Resize(width, height-30);
  669. Update();
  670. }
  671. EntityEditorPropertyContainer::EntityEditorPropertyContainer() : UIElement() {
  672. propIconSelector = new UIIconSelector();
  673. addChild(propIconSelector);
  674. propIconSelector->addIcon("entityEditor/properties_icon.png");
  675. propIconSelector->addIcon("entityEditor/icon_tree.png");
  676. propIconSelector->addIcon("entityEditor/settings_icon.png");
  677. propIconSelector->setPosition(10.0, 3.0);
  678. propIconSelector->addEventListener(this, UIEvent::SELECT_EVENT);
  679. propertyView = new EntityEditorPropertyView();
  680. addChild(propertyView);
  681. propertyView->setPosition(0.0, 30.0);
  682. currentView = propertyView;
  683. treeView = new EntityEditorTreeView();
  684. addChild(treeView);
  685. treeView->setPosition(0.0, 30.0);
  686. treeView->visible = false;
  687. treeView->enabled = false;
  688. settingsView = new EntityEditorSettingsView();
  689. addChild(settingsView);
  690. settingsView->setPosition(0.0, 30.0);
  691. settingsView->visible = false;
  692. settingsView->enabled = false;
  693. }
  694. void EntityEditorPropertyContainer::handleEvent(Event *event) {
  695. if(event->getDispatcher() == propIconSelector) {
  696. currentView->visible = false;
  697. currentView->enabled = false;
  698. switch(propIconSelector->getSelectedIndex()) {
  699. case 0:
  700. currentView = propertyView;
  701. break;
  702. case 1:
  703. currentView = treeView;
  704. treeView->refreshTree();
  705. break;
  706. case 2:
  707. currentView = settingsView;
  708. break;
  709. }
  710. currentView->visible = true;
  711. currentView->enabled = true;
  712. }
  713. }
  714. EntityEditorPropertyContainer::~EntityEditorPropertyContainer() {
  715. }
  716. void EntityEditorPropertyContainer::Resize(Number width, Number height) {
  717. propertyView->Resize(width, height-30);
  718. treeView->Resize(width, height-30);
  719. settingsView->Resize(width, height-30);
  720. }
  721. PolycodeEntityEditor::PolycodeEntityEditor() : PolycodeEditor(true){
  722. mainSizer = new UIHSizer(300, 300, 300, false);
  723. addChild(mainSizer);
  724. mainView = new EntityEditorMainView();
  725. mainView->addEventListener(this, Event::CHANGE_EVENT);
  726. mainSizer->addLeftChild(mainView);
  727. mainSizer->setMinimumSize(200);
  728. propertyContainer = new EntityEditorPropertyContainer();
  729. propertyView = propertyContainer->propertyView;
  730. treeView = propertyContainer->treeView;
  731. settingsView = propertyContainer->settingsView;
  732. treeView->addEventListener(this, Event::CHANGE_EVENT);
  733. mainSizer->addRightChild(propertyContainer);
  734. }
  735. void PolycodeEntityEditor::handleEvent(Event *event) {
  736. if(event->getDispatcher() == treeView) {
  737. mainView->selectEntity(treeView->getSelectedEntity());
  738. }
  739. if(event->getDispatcher() == mainView) {
  740. switch(event->getEventCode()) {
  741. case Event::CHANGE_EVENT:
  742. propertyView->setEntity(mainView->getSelectedEntity());
  743. treeView->setSelectedEntity(mainView->getSelectedEntity());
  744. break;
  745. }
  746. }
  747. PolycodeEditor::handleEvent(event);
  748. }
  749. PolycodeEntityEditor::~PolycodeEntityEditor() {
  750. }
  751. bool PolycodeEntityEditor::openFile(OSFileEntry filePath) {
  752. PolycodeEditor::openFile(filePath);
  753. // return true;
  754. loadedInstance = new SceneEntityInstance(mainView->getMainScene(), filePath.fullPath);
  755. mainView->setObjectRoot(loadedInstance);
  756. mainView->setEditorPropsRecursive(loadedInstance);
  757. treeView->setRootEntity(loadedInstance);
  758. propertyView->setEntityInstance(loadedInstance);
  759. settingsView->setEntityInstance(loadedInstance);
  760. return true;
  761. }
  762. void PolycodeEntityEditor::Activate() {
  763. Resize(getWidth(), getHeight());
  764. }
  765. void PolycodeEntityEditor::saveCurveToObject(ObjectEntry *entry, BezierCurve *curve) {
  766. ObjectEntry *controlPoints = entry->addChild("controlPoints");
  767. for(int i=0; i < curve->getNumControlPoints(); i++) {
  768. ObjectEntry *controlPointEntry = controlPoints->addChild("controlPoint");
  769. ObjectEntry *pt1 = controlPointEntry->addChild("pt1");
  770. pt1->addChild("x", curve->getControlPoint(i)->p1.x);
  771. pt1->addChild("y", curve->getControlPoint(i)->p1.y);
  772. pt1->addChild("z", curve->getControlPoint(i)->p1.z);
  773. ObjectEntry *pt2 = controlPointEntry->addChild("pt2");
  774. pt2->addChild("x", curve->getControlPoint(i)->p2.x);
  775. pt2->addChild("y", curve->getControlPoint(i)->p2.y);
  776. pt2->addChild("z", curve->getControlPoint(i)->p2.z);
  777. ObjectEntry *pt3 = controlPointEntry->addChild("pt3");
  778. pt3->addChild("x", curve->getControlPoint(i)->p3.x);
  779. pt3->addChild("y", curve->getControlPoint(i)->p3.y);
  780. pt3->addChild("z", curve->getControlPoint(i)->p3.z);
  781. }
  782. }
  783. void PolycodeEntityEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *entry) {
  784. if(entity->editorOnly)
  785. return;
  786. entry->addChild("id", entity->id);
  787. String tagString = "";
  788. for(int i=0; i < entity->getNumTags(); i++) {
  789. if(i != 0) {
  790. tagString += ",";
  791. }
  792. tagString += entity->getTagAtIndex(i);
  793. }
  794. entry->addChild("tags", tagString);
  795. if(entity->entityProps.size() > 0) {
  796. ObjectEntry *props = entry->addChild("props");
  797. for(int i=0; i < entity->entityProps.size(); i++) {
  798. ObjectEntry *prop = props->addChild("prop");
  799. prop->addChild("name", entity->entityProps[i].propName);
  800. prop->addChild("value", entity->entityProps[i].propValue);
  801. }
  802. }
  803. if(dynamic_cast<SceneEntityInstance*>(entity)) {
  804. if(!(*(entry))["type"]) {
  805. entry->addChild("type", "SceneEntityInstance");
  806. }
  807. SceneEntityInstance *instance = (SceneEntityInstance*) entity;
  808. ObjectEntry *instanceEntry = entry->addChild("SceneEntityInstance");
  809. instanceEntry->addChild("filePath", instance->getFileName());
  810. }
  811. if(dynamic_cast<SceneParticleEmitter*>(entity)) {
  812. if(!(*(entry))["type"])
  813. entry->addChild("type", "SceneParticleEmitter");
  814. SceneParticleEmitter *emitter = (SceneParticleEmitter*) entity;
  815. ObjectEntry *emitterEntry = entry->addChild("SceneParticleEmitter");
  816. emitterEntry->addChild("type", (int)emitter->getParticleType());
  817. emitterEntry->addChild("count", (int)emitter->getParticleCount());
  818. emitterEntry->addChild("lifetime", emitter->getParticleLifetime());
  819. emitterEntry->addChild("size", emitter->getParticleSize());
  820. emitterEntry->addChild("world", emitter->getParticlesInWorldSpace());
  821. emitterEntry->addChild("loop", emitter->getLoopParticles());
  822. emitterEntry->addChild("rX", emitter->getParticleRotationSpeed().x);
  823. emitterEntry->addChild("rY", emitter->getParticleRotationSpeed().y);
  824. emitterEntry->addChild("rZ", emitter->getParticleRotationSpeed().z);
  825. emitterEntry->addChild("gX", emitter->getGravity().x);
  826. emitterEntry->addChild("gY", emitter->getGravity().y);
  827. emitterEntry->addChild("gZ", emitter->getGravity().z);
  828. emitterEntry->addChild("dirX", emitter->getParticleDirection().x);
  829. emitterEntry->addChild("dirY", emitter->getParticleDirection().y);
  830. emitterEntry->addChild("dirZ", emitter->getParticleDirection().z);
  831. emitterEntry->addChild("eX", emitter->getEmitterSize().x);
  832. emitterEntry->addChild("eY", emitter->getEmitterSize().y);
  833. emitterEntry->addChild("eZ", emitter->getEmitterSize().z);
  834. emitterEntry->addChild("devX", emitter->getDirectionDeviation().x);
  835. emitterEntry->addChild("devY", emitter->getDirectionDeviation().y);
  836. emitterEntry->addChild("devZ", emitter->getDirectionDeviation().z);
  837. emitterEntry->addChild("perlin", emitter->getPerlinEnabled());
  838. emitterEntry->addChild("pX", emitter->getPerlinValue().x);
  839. emitterEntry->addChild("pY", emitter->getPerlinValue().y);
  840. emitterEntry->addChild("pZ", emitter->getPerlinValue().z);
  841. emitterEntry->addChild("useColorCurves", emitter->useColorCurves);
  842. emitterEntry->addChild("useScaleCurve", emitter->useScaleCurve);
  843. if(emitter->useScaleCurve) {
  844. saveCurveToObject(emitterEntry->addChild("scaleCurve"), &emitter->scaleCurve);
  845. }
  846. if(emitter->useColorCurves) {
  847. saveCurveToObject(emitterEntry->addChild("colorCurveR"), &emitter->colorCurveR);
  848. saveCurveToObject(emitterEntry->addChild("colorCurveG"), &emitter->colorCurveG);
  849. saveCurveToObject(emitterEntry->addChild("colorCurveB"), &emitter->colorCurveB);
  850. saveCurveToObject(emitterEntry->addChild("colorCurveA"), &emitter->colorCurveA);
  851. }
  852. }
  853. if(dynamic_cast<SceneSprite*>(entity)) {
  854. if(!(*(entry))["type"])
  855. entry->addChild("type", "SceneSprite");
  856. SceneSprite *sprite = (SceneSprite*) entity;
  857. ObjectEntry *spriteEntry = entry->addChild("SceneSprite");
  858. spriteEntry->addChild("filePath", sprite->getFileName());
  859. String animName = "";
  860. if(sprite->getCurrentAnimation()) {
  861. animName = sprite->getCurrentAnimation()->name;
  862. }
  863. spriteEntry->addChild("anim", animName);
  864. }
  865. if(dynamic_cast<SceneLabel*>(entity)) {
  866. SceneLabel *label = (SceneLabel*) entity;
  867. if(!(*(entry))["type"])
  868. entry->addChild("type", "SceneLabel");
  869. ObjectEntry *labelEntry = entry->addChild("SceneLabel");
  870. labelEntry->addChild("text", label->getText());
  871. labelEntry->addChild("font", label->getLabel()->getFont()->getFontName());
  872. labelEntry->addChild("size", (Number)label->getLabel()->getSize());
  873. labelEntry->addChild("actualHeight", label->getLabelActualHeight());
  874. labelEntry->addChild("aaMode", (int)label->getLabel()->getAntialiasMode());
  875. }
  876. if(dynamic_cast<SceneLight*>(entity)) {
  877. SceneLight *light = (SceneLight*) entity;
  878. if(!(*(entry))["type"]) {
  879. entry->addChild("type", "SceneLight");
  880. }
  881. ObjectEntry *lightEntry = entry->addChild("SceneLight");
  882. lightEntry->addChild("type", light->getType());
  883. lightEntry->addChild("cR", light->lightColor.r);
  884. lightEntry->addChild("cG", light->lightColor.g);
  885. lightEntry->addChild("cB", light->lightColor.b);
  886. lightEntry->addChild("cA", light->lightColor.a);
  887. lightEntry->addChild("scR", light->specularLightColor.r);
  888. lightEntry->addChild("scG", light->specularLightColor.g);
  889. lightEntry->addChild("scB", light->specularLightColor.b);
  890. lightEntry->addChild("scA", light->specularLightColor.a);
  891. lightEntry->addChild("intensity", light->getIntensity());
  892. lightEntry->addChild("cAtt", light->getConstantAttenuation());
  893. lightEntry->addChild("lAtt", light->getLinearAttenuation());
  894. lightEntry->addChild("qAtt", light->getQuadraticAttenuation());
  895. if(light->getType() == SceneLight::SPOT_LIGHT) {
  896. lightEntry->addChild("spotCutoff", light->getSpotlightCutoff());
  897. lightEntry->addChild("spotExponent", light->getSpotlightExponent());
  898. lightEntry->addChild("shadows", light->areShadowsEnabled());
  899. if(light->areShadowsEnabled()) {
  900. lightEntry->addChild("shadowmapFOV", light->getShadowMapFOV());
  901. lightEntry->addChild("shadowmapRes", (int)light->getShadowMapResolution());
  902. }
  903. }
  904. }
  905. if(dynamic_cast<SceneSound*>(entity)) {
  906. SceneSound *sound = (SceneSound*) entity;
  907. if(!(*(entry))["type"]) {
  908. entry->addChild("type", "SceneSound");
  909. }
  910. ObjectEntry *soundEntry = entry->addChild("SceneSound");
  911. soundEntry->addChild("filePath", sound->getSound()->getFileName());
  912. soundEntry->addChild("refDistance", sound->getSound()->getReferenceDistance());
  913. soundEntry->addChild("maxDistance", sound->getSound()->getMaxDistance());
  914. soundEntry->addChild("volume", sound->getSound()->getVolume());
  915. soundEntry->addChild("pitch", sound->getSound()->getPitch());
  916. }
  917. if(dynamic_cast<Camera*>(entity)) {
  918. Camera *camera = (Camera*) entity;
  919. if(!(*(entry))["type"]) {
  920. entry->addChild("type", "Camera");
  921. }
  922. ObjectEntry *cameraEntry = entry->addChild("Camera");
  923. cameraEntry->addChild("exposure", camera->getExposureLevel());
  924. cameraEntry->addChild("nearClip", camera->getNearClipppingPlane());
  925. cameraEntry->addChild("farClip", camera->getFarClipppingPlane());
  926. cameraEntry->addChild("ortho", camera->getOrthoMode());
  927. if(camera->getOrthoMode()) {
  928. cameraEntry->addChild("sizeMode", camera->getOrthoSizeMode());
  929. cameraEntry->addChild("orthoWidth", camera->getOrthoSizeX());
  930. cameraEntry->addChild("orthoHeight", camera->getOrthoSizeY());
  931. } else {
  932. cameraEntry->addChild("fov", camera->getFOV());
  933. }
  934. }
  935. if(dynamic_cast<ScenePrimitive*>(entity) && !dynamic_cast<SceneSprite*>(entity) && !dynamic_cast<SceneLabel*>(entity)) {
  936. if(!(*(entry))["type"]) {
  937. entry->addChild("type", "ScenePrimitive");
  938. }
  939. ScenePrimitive *primitive = (ScenePrimitive*) entity;
  940. ObjectEntry *primitiveEntry = entry->addChild("ScenePrimitive");
  941. primitiveEntry->addChild("type", primitive->getPrimitiveType());
  942. primitiveEntry->addChild("p1", primitive->getPrimitiveParameter1());
  943. primitiveEntry->addChild("p2", primitive->getPrimitiveParameter2());
  944. primitiveEntry->addChild("p3", primitive->getPrimitiveParameter3());
  945. primitiveEntry->addChild("p4", primitive->getPrimitiveParameter4());
  946. primitiveEntry->addChild("p5", primitive->getPrimitiveParameter5());
  947. }
  948. if(dynamic_cast<SceneMesh*>(entity)) {
  949. if(!(*(entry))["type"]) {
  950. entry->addChild("type", "SceneMesh");
  951. }
  952. SceneMesh *sceneMesh = (SceneMesh*) entity;
  953. ObjectEntry *meshEntry = entry->addChild("SceneMesh");
  954. if(sceneMesh->getFilename() != "") {
  955. meshEntry->addChild("file", sceneMesh->getFilename().replace(parentProject->getRootFolder()+"/", ""));
  956. }
  957. if(sceneMesh->getMaterial()) {
  958. meshEntry->addChild("material", sceneMesh->getMaterial()->getResourceName());
  959. ObjectEntry *shaderOptions = meshEntry->addChild("shader_options");
  960. saveShaderOptionsToEntry(shaderOptions, sceneMesh->getMaterial(), sceneMesh->getLocalShaderOptions());
  961. }
  962. }
  963. if(!(*(entry))["type"])
  964. entry->addChild("type", "Entity");
  965. entry->addChild("cR", entity->color.r);
  966. entry->addChild("cG", entity->color.g);
  967. entry->addChild("cB", entity->color.b);
  968. entry->addChild("cA", entity->color.a);
  969. entry->addChild("blendMode", entity->blendingMode);
  970. entry->addChild("sX", entity->getScale().x);
  971. entry->addChild("sY", entity->getScale().y);
  972. entry->addChild("sZ", entity->getScale().z);
  973. entry->addChild("rX", entity->getPitch());
  974. entry->addChild("rY", entity->getYaw());
  975. entry->addChild("rZ", entity->getRoll());
  976. entry->addChild("pX", entity->getPosition().x);
  977. entry->addChild("pY", entity->getPosition().y);
  978. entry->addChild("pZ", entity->getPosition().z);
  979. entry->addChild("bbX", entity->bBox.x);
  980. entry->addChild("bbY", entity->bBox.y);
  981. entry->addChild("bbZ", entity->bBox.z);
  982. ObjectEntry *children = NULL;
  983. for(int i=0; i < entity->getNumChildren(); i++) {
  984. if(!entity->getChildAtIndex(i)->editorOnly) {
  985. if(!children)
  986. children = entry->addChild("children");
  987. ObjectEntry *child = children->addChild("child");
  988. saveEntityToObjectEntry((ScreenEntity*)entity->getChildAtIndex(i), child);
  989. }
  990. }
  991. }
  992. void PolycodeEntityEditor::saveShaderOptionsToEntry(ObjectEntry *entry, Material *material, ShaderBinding *binding) {
  993. if(material->getNumShaders() > 0) {
  994. for(int s=0; s < material->getNumShaders(); s++) {
  995. Shader *shader = material->getShader(s);
  996. ObjectEntry *shaderEntry = entry->addChild("shader");
  997. ObjectEntry *texturesEntry = shaderEntry->addChild("textures");
  998. for(int j=0; j < shader->expectedTextures.size(); j++) {
  999. Texture *texture = binding->getTexture(shader->expectedTextures[j]);
  1000. if(texture) {
  1001. String texturePath = texture->getResourcePath();
  1002. texturePath = texturePath.replace(parentProject->getRootFolder()+"/", "");
  1003. ObjectEntry *textureEntry = texturesEntry->addChild("texture", texturePath);
  1004. textureEntry->addChild("name", shader->expectedTextures[j]);
  1005. }
  1006. }
  1007. for(int j=0; j < shader->expectedCubemaps.size(); j++) {
  1008. Cubemap *cubemap = binding->getCubemap(shader->expectedCubemaps[j]);
  1009. if(cubemap) {
  1010. String cubemapName = cubemap->getResourceName();
  1011. ObjectEntry *cubemapEntry = texturesEntry->addChild("cubemap", cubemapName);
  1012. cubemapEntry->addChild("name", shader->expectedCubemaps[j]);
  1013. }
  1014. }
  1015. if(shader->expectedParams.size() > 0 || shader->expectedParams.size() > 0) {
  1016. ObjectEntry *paramsEntry = shaderEntry->addChild("params");
  1017. for(int j=0; j < shader->expectedParams.size(); j++) {
  1018. if(binding->getLocalParamByName(shader->expectedParams[j].name)) {
  1019. ObjectEntry *paramEntry = paramsEntry->addChild("param");
  1020. paramEntry->addChild("name", shader->expectedParams[j].name);
  1021. paramEntry->addChild("value", PolycodeMaterialEditor::createStringValue(shader->expectedParams[j].type, binding->getLocalParamByName(shader->expectedParams[j].name)->data));
  1022. }
  1023. }
  1024. }
  1025. }
  1026. }
  1027. }
  1028. void PolycodeEntityEditor::saveFile() {
  1029. Object saveObject;
  1030. ObjectEntry *settings = saveObject.root.addChild("settings");
  1031. ObjectEntry *linkedMaterialFiles = settings->addChild("matFiles");
  1032. for(int i=0; i < loadedInstance->getNumLinkedResourePools(); i++) {
  1033. ResourcePool *pool = loadedInstance->getLinkedResourcePoolAtIndex(i);
  1034. linkedMaterialFiles->addChild("matFile")->addChild("path", pool->getName());
  1035. }
  1036. saveObject.root.name = "entity";
  1037. ObjectEntry *children = saveObject.root.addChild("root");
  1038. saveEntityToObjectEntry(mainView->getObjectRoot(), children);
  1039. saveObject.saveToXML(filePath);
  1040. setHasChanges(false);
  1041. }
  1042. void PolycodeEntityEditor::Resize(int x, int y) {
  1043. mainSizer->Resize(x, y);
  1044. PolycodeEditor::Resize(x,y);
  1045. }