TDME2  1.9.200
SceneEditorTabController.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <string>
5 
6 #include <tdme/tdme.h>
16 #include <tdme/engine/Engine.h>
17 #include <tdme/engine/Transform.h>
22 #include <tdme/gui/nodes/GUINode.h>
27 #include <tdme/gui/GUI.h>
28 #include <tdme/gui/GUIParser.h>
29 #include <tdme/math/Math.h>
41 #include <tdme/utilities/Action.h>
42 #include <tdme/utilities/Console.h>
45 #include <tdme/utilities/Float.h>
46 #include <tdme/utilities/Integer.h>
49 
50 using std::make_unique;
51 using std::string;
52 using std::unique_ptr;
53 
55 
76 using tdme::math::Math;
97 
98 SceneEditorTabController::SceneEditorTabController(SceneEditorTabView* view)
99 {
100  this->view = view;
101  this->popUps = view->getPopUps();
102  this->basePropertiesSubController = make_unique<BasePropertiesSubController>(view->getEditorView(), "scene");
103 }
104 
106 }
107 
109 {
110  this->screenNode = screenNode;
112  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_toolbar"))->getActiveConditions().add("tools");
113  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_toolbar"))->getActiveConditions().add("snapping");
114  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_toolbar"))->getActiveConditions().add("scene");
115  view->setGridEnabled(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_checkbox_grid"))->getController()->getValue().equals("1"));
116 }
117 
119 {
120 }
121 
123 {
124  switch (command) {
125  case COMMAND_SAVE:
126  {
127  auto scene = view->getScene();
128  if (scene == nullptr) return;
129 
130  //
131  save(Tools::getPathName(scene->getFileName()), Tools::getFileName(scene->getFileName()));
132  }
133  break;
134  case COMMAND_SAVEAS:
135  {
136  class OnSceneSave: public virtual Action
137  {
138  public:
139  void performAction() override {
140  sceneEditorTabController->save(
141  sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
142  sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
143  );
144  sceneEditorTabController->popUps->getFileDialogScreenController()->close();
145  }
146 
147  OnSceneSave(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
148  }
149 
150  private:
151  SceneEditorTabController* sceneEditorTabController;
152  };
153 
154  auto scene = view->getScene();
155  if (scene == nullptr) return;
156 
157  auto fileName = scene->getFileName();
158  vector<string> extensions = {
159  "tscene"
160  };
162  Tools::getPathName(fileName),
163  "Save Scene to: ",
164  extensions,
165  Tools::getFileName(fileName),
166  false,
167  new OnSceneSave(this)
168  );
169  }
170  break;
171  default:
172  showInfoPopUp("Warning", "This command is not supported yet");
173  break;
174  }
175 }
176 
177 void SceneEditorTabController::onDrop(const string& payload, int mouseX, int mouseY) {
178  if (StringTools::startsWith(payload, "file:") == false) {
179  showInfoPopUp("Warning", "Unknown payload in drop");
180  } else {
181  auto fileName = StringTools::substring(payload, string("file:").size());
182  if (view->getEditorView()->getScreenController()->isDropOnNode(mouseX, mouseY, "gui") == true) {
183  vector<string> guiExtensions = {{ "xml" }};
184  if (Tools::hasFileExtension(fileName, guiExtensions) == false) {
185  showInfoPopUp("Warning", "You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(guiExtensions));
186  } else {
187  setGUIFileName(fileName);
188  }
189  } else
190  if (Tools::hasFileExtension(fileName, PrototypeReader::getPrototypeExtensions()) == false) {
191  showInfoPopUp("Warning", "You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(PrototypeReader::getPrototypeExtensions()));
192  } else {
193  auto xScale = static_cast<float>(Engine::getInstance()->getWidth()) / static_cast<float>(screenNode->getScreenWidth());
194  auto yScale = static_cast<float>(Engine::getInstance()->getHeight()) / static_cast<float>(screenNode->getScreenHeight());
195  int left, top, width, height, offsetX, offsetY;
196  if (view->getEditorView()->getCurrentTabViewPort(left, top, width, height, offsetX, offsetY) == true) {
197  auto tabMouseX = (mouseX - left) / xScale + offsetX;
198  auto tabMouseY = (mouseY - top) / yScale + offsetY;
199  if (tabMouseX < 0 || tabMouseX >= width || tabMouseX < 0 || tabMouseY >= height) {
200  showInfoPopUp("Warning", "You can not drop a file here");
201  } else {
202  //
203  try {
204  // load prototype and mark as non embedded
205  auto prototype = unique_ptr<Prototype>(
206  PrototypeReader::read(
207  Tools::getPathName(fileName),
208  Tools::getFileName(fileName)
209  )
210  );
211  prototype->setEmbedded(false);
212  // check if we have prototype already in library
213  auto libraryPrototype = view->getScene()->getLibrary()->getPrototypeByName(prototype->getName());
214  if (libraryPrototype == nullptr) {
215  // yep, delete prototype
216  libraryPrototype = prototype.release();
217  view->addPrototype(libraryPrototype);
218  }
219  // and place it (except terrain, which is automatically placed at origin
220  if (libraryPrototype->getType() != Prototype_Type::TERRAIN &&
221  view->placeEntity(libraryPrototype, tabMouseX, tabMouseY) == false) {
222  showInfoPopUp("Warning", "Could not place prototype entity.");
223  }
224  } catch (Exception& exception) {
225  Console::println("SceneEditorTabController::onDrop(): An error occurred: " + string(exception.what()));
226  showInfoPopUp("Warning", string(exception.what()));
227  }
228  }
229  } else {
230  showInfoPopUp("Warning", "Could not place prototype entity.");
231  }
232  }
233  }
234 }
235 
236 void SceneEditorTabController::save(const string& pathName, const string& fileName)
237 {
238  auto scene = view->getScene();
239  if (scene == nullptr) return;
240 
241  //
242  try {
243  SceneWriter::write(
244  pathName,
245  fileName,
246  scene
247  );
248  } catch (Exception& exception) {
249  Console::println("SceneEditorTabController::save(): An error occurred: " + string(exception.what()));
250  showInfoPopUp("Warning", string(exception.what()));
251  }
252 }
253 
255  required_dynamic_cast<GUITextNode*>(screenNode->getNodeById(view->getTabId() + "_tab_text_info"))->setText(text);
256 }
257 
258 void SceneEditorTabController::showInfoPopUp(const string& caption, const string& message)
259 {
260  popUps->getInfoDialogScreenController()->show(caption, message);
261 }
262 
264 {
265  if (basePropertiesSubController->onChange(node, view->getScene()) == true) return;
266  //
267  if (node->getId() == "dropdown_outliner_add") {
268  auto addOutlinerType = node->getController()->getValue().getString();
269  // TODO
270  } else
271  if (node->getId() == "selectbox_outliner") {
273  vector<string> selectedEntityIds;
274  auto outlinerSelection = StringTools::tokenize(view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
275  for (const auto& selectedEntityId: outlinerSelection) {
276  if (StringTools::startsWith(selectedEntityId, "scene.entities.") == false) continue;
277  selectedEntityIds.push_back(StringTools::substring(selectedEntityId, string("scene.entities.").size()));
278  }
279  view->selectEntities(selectedEntityIds);
280  } else
281  if (node->getId() == view->getTabId() + "_tab_button_translate") {
282  view->setGizmoType(Gizmo::GIZMOTYPE_TRANSLATE);
283  view->updateGizmo();
284  } else
285  if (node->getId() == view->getTabId() + "_tab_button_rotate") {
286  view->setGizmoType(Gizmo::GIZMOTYPE_ROTATE);
287  view->updateGizmo();
288  } else
289  if (node->getId() == view->getTabId() + "_tab_button_scale") {
290  view->setGizmoType(Gizmo::GIZMOTYPE_SCALE);
291  view->updateGizmo();
292  } else
293  if (node->getId() == view->getTabId() + "_tab_button_gizmo") {
294  view->setGizmoType(Gizmo::GIZMOTYPE_ALL);
295  view->updateGizmo();
296  } else
297  if (node->getId() == view->getTabId() + "_tab_checkbox_grid") {
298  view->setGridEnabled(node->getController()->getValue().equals("1"));
299  } else
300  if (StringTools::startsWith(node->getId(), view->getTabId() + "_tab_checkbox_snapping") == true ||
301  StringTools::startsWith(node->getId(), view->getTabId() + "_tab_snapping_x") == true ||
302  StringTools::startsWith(node->getId(), view->getTabId() + "_tab_snapping_z") == true) {
303  view->setSnapping(
304  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_checkbox_snapping"))->getController()->getValue().equals("1") == true,
305  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_snapping_x"))->getController()->getValue().getString()),
306  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_snapping_z"))->getController()->getValue().getString())
307  );
308  } else
309  if (StringTools::startsWith(node->getId(), "sky.shader.") == true) {
310  applySkyShaderDetails(StringTools::substring(node->getId(), string("sky.shader.").size(), node->getId().size()));
311  } else
312  if (StringTools::startsWith(node->getId(), "postprocessing.shader.") == true) {
313  auto shaderParameterString = StringTools::substring(node->getId(), string("postprocessing.shader.").size());
314  auto shaderParameterArray = StringTools::tokenize(shaderParameterString, ".");
315  auto shaderId = shaderParameterArray.size() >= 1?shaderParameterArray[0]:string();
316  auto shaderParameterName = shaderParameterArray.size() == 2?shaderParameterArray[1]:string();
317  //
318  if (shaderParameterName.empty() == true) {
319  if (node->getController()->getValue().getString() == "1") {
321  } else {
323  }
324  //
326  } else {
327  applyPostProcessingDetails(shaderId, shaderParameterName);
328  }
329  } else {
330  for (const auto& applyTranslationNode: applyTranslationNodes) {
331  if (node->getId() == applyTranslationNode) {
332  //
333  try {
335  Vector3(
336  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_x"))->getController()->getValue().getString()),
337  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_y"))->getController()->getValue().getString()),
338  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_z"))->getController()->getValue().getString())
339  )
340  );
341  } catch (Exception& exception) {
342  Console::println("SceneEditorTabController::onChange(): An error occurred: " + string(exception.what()));
343  showInfoPopUp("Warning", string(exception.what()));
344  }
345  //
346  break;
347  }
348  }
349  for (const auto& applyRotationNode: applyRotationNodes) {
350  if (node->getId() == applyRotationNode) {
351  //
352  try {
354  Vector3(
355  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_x"))->getController()->getValue().getString()),
356  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_y"))->getController()->getValue().getString()),
357  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_z"))->getController()->getValue().getString())
358  )
359  );
360  } catch (Exception& exception) {
361  Console::println("SceneEditorTabController::onChange(): An error occurred: " + string(exception.what()));
362  showInfoPopUp("Warning", string(exception.what()));
363  }
364  //
365  break;
366  }
367  }
368  for (const auto& applyScaleNode: applyScaleNodes) {
369  if (node->getId() == applyScaleNode) {
370  //
371  try {
372  view->applyScale(
373  Vector3(
374  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_x"))->getController()->getValue().getString()),
375  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_y"))->getController()->getValue().getString()),
376  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_z"))->getController()->getValue().getString())
377  )
378  );
379  } catch (Exception& exception) {
380  Console::println("SceneEditorTabController::onChange(): An error occurred: " + string(exception.what()));
381  showInfoPopUp("Warning", string(exception.what()));
382  }
383  //
384  break;
385  }
386  }
387  for (const auto& applyReflectionEnvironmentMappingNode: applyReflectionEnvironmentMappingNodes) {
388  if (node->getId() == applyReflectionEnvironmentMappingNode) {
389  //
390  try {
391  view->applyReflectionEnvironmentMappingId(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("reflection_environmentmap"))->getController()->getValue().getString());
392  } catch (Exception& exception) {
393  Console::println("SceneEditorTabController::onChange(): An error occurred: " + string(exception.what()));
394  showInfoPopUp("Warning", string(exception.what()));
395  }
396  //
397  break;
398  }
399  }
400  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
401  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
402  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
403  for (const auto& applyLightNode: applyLightNodes) {
404  if (node->getId() == applyLightNode) {
405  applyLightDetails(lightIdx);
406  //
407  break;
408  }
409  }
410  }
411  //
412  }
413 }
414 
416  if (basePropertiesSubController->onFocus(node, view->getScene()) == true) return;
417 }
418 
420  if (basePropertiesSubController->onUnfocus(node, view->getScene()) == true) return;
421  //
422  if (node->getId() == "tdme.entities.rename_input") {
423  renameEntity();
424  } else {
425  for (const auto& applyBaseNode: applyBaseNodes) {
426  if (node->getId() == applyBaseNode) {
427  //
428  try {
429  auto name = required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("base_name"))->getController()->getValue().getString();
430  if (name.empty() == true) throw ExceptionBase("Please enter a name");
431  if (view->applyBase(
432  name,
433  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("base_description"))->getController()->getValue().getString()
434  ) == false) {
435  throw ExceptionBase("Could not rename entity");
436  }
437  } catch (Exception& exception) {
438  Console::println("SceneEditorTabController::onChange(): An error occurred: " + string(exception.what()));
439  showInfoPopUp("Warning", string(exception.what()));
440  }
441  //
442  break;
443  }
444  }
445  }
446 }
447 
449  if (node->getId() == "selectbox_outliner") {
450  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
451  if (outlinerNode == "scene.lights") {
452  // clear
454  {
455  // add light
456  class OnAddLightAction: public virtual Action
457  {
458  public:
459  void performAction() override {
460  auto scene = sceneEditorTabController->view->getScene();
461  if (scene == nullptr) return;
462  auto light = scene->addLight();
463  if (light == nullptr) return;
464  light->setEnabled(true);
465  //
466  sceneEditorTabController->view->getEditorView()->reloadTabOutliner("scene.lights.light" + to_string(light->getId()));
467  }
468  OnAddLightAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
469  }
470  private:
471  SceneEditorTabController* sceneEditorTabController;
472  };
473  popUps->getContextMenuScreenController()->addMenuItem("Add light", "contextmenu_add", new OnAddLightAction(this));
474  }
475  //
476  popUps->getContextMenuScreenController()->show(mouseX, mouseY);
477  } else
478  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
479  // clear
481  {
482  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
483  auto scene = view->getScene();
484  if (scene == nullptr) return;
485 
486  //
487  if (scene->getLightCount() < 2) return;
488 
489  // remove light
490  class OnDeleteLightAction: public virtual Action
491  {
492  public:
493  void performAction() override {
494  auto scene = sceneEditorTabController->view->getScene();
495  if (scene == nullptr) return;
496  scene->removeLightAt(lightIdx);
497  //
498  sceneEditorTabController->view->getEditorView()->reloadTabOutliner("scene.lights");
499  }
500  OnDeleteLightAction(SceneEditorTabController* sceneEditorTabController, int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
501  }
502  private:
503  SceneEditorTabController* sceneEditorTabController;
504  int lightIdx;
505  };
506  popUps->getContextMenuScreenController()->addMenuItem("Delete light", "contextmenu_delete", new OnDeleteLightAction(this, lightIdx));
507  }
508  //
509  popUps->getContextMenuScreenController()->show(mouseX, mouseY);
510  } else
511  if (StringTools::startsWith(outlinerNode, "scene.entities.") == true) {
512  // clear
514  {
515  // rename
516  class OnCenterAction: public virtual Action
517  {
518  public:
519  void performAction() override {
520  auto outlinerSelection = StringTools::tokenize(sceneEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
521  if (outlinerSelection.size() != 1) return;
522  string selectedEntityId;
523  if (StringTools::startsWith(outlinerSelection[0], "scene.entities.") == false) return;
524  selectedEntityId = StringTools::substring(outlinerSelection[0], string("scene.entities.").size());
525  sceneEditorTabController->startRenameEntity(selectedEntityId);
526  }
527  OnCenterAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
528  }
529  private:
530  SceneEditorTabController* sceneEditorTabController;
531  };
532  popUps->getContextMenuScreenController()->addMenuItem("Rename", "contextmenu_rename", new OnCenterAction(this));
533  }
534  {
535  // center
536  class OnCenterAction: public virtual Action
537  {
538  public:
539  void performAction() override {
540  sceneEditorTabController->view->centerEntities();
541  }
542  OnCenterAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
543  }
544  private:
545  SceneEditorTabController* sceneEditorTabController;
546  };
547  popUps->getContextMenuScreenController()->addMenuItem("Center", "contextmenu_center", new OnCenterAction(this));
548  }
549  {
550  // select same
551  class OnSelectSameAction: public virtual Action
552  {
553  public:
554  void performAction() override {
555  sceneEditorTabController->view->selectSameEntities();
556  }
557  OnSelectSameAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
558  }
559  private:
560  SceneEditorTabController* sceneEditorTabController;
561  };
562  popUps->getContextMenuScreenController()->addMenuItem("Select same", "contextmenu_same", new OnSelectSameAction(this));
563  }
564  {
565  // open prototype
566  class OnOpenPrototype: public virtual Action
567  {
568  public:
569  void performAction() override {
570  sceneEditorTabController->view->openPrototype();
571  }
572  OnOpenPrototype(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
573  }
574  private:
575  SceneEditorTabController* sceneEditorTabController;
576  };
577  popUps->getContextMenuScreenController()->addMenuItem("Open prototype", "contextmenu_openprototype", new OnOpenPrototype(this));
578  }
579  {
580  // replace prototype
581  class OnReplacePrototypeAction: public virtual Action
582  {
583  public:
584  void performAction() override {
585  sceneEditorTabController->onReplacePrototype();
586  }
587  OnReplacePrototypeAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
588  }
589  private:
590  SceneEditorTabController* sceneEditorTabController;
591  };
592  popUps->getContextMenuScreenController()->addMenuItem("Replace prototype", "contextmenu_replaceprototype", new OnReplacePrototypeAction(this));
593  }
594  {
595  // jump to prototype
596  class JumpToPrototypeAction: public virtual Action
597  {
598  public:
599  void performAction() override {
600  auto outlinerSelection = StringTools::tokenize(sceneEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
601  if (outlinerSelection.size() != 1) return;
602  string selectedEntityId;
603  if (StringTools::startsWith(outlinerSelection[0], "scene.entities.") == false) return;
604  auto scene = sceneEditorTabController->view->getScene();
605  selectedEntityId = StringTools::substring(outlinerSelection[0], string("scene.entities.").size());
606  auto sceneEntity = scene->getEntity(selectedEntityId);
607  if (sceneEntity == nullptr) return;
608  sceneEditorTabController->view->getEditorView()->getScreenController()->setOutlinerSelection("scene.prototypes." + GUIParser::escape(to_string(sceneEntity->getPrototype()->getId())));
609  sceneEditorTabController->updateDetails(sceneEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection());
610  }
611  JumpToPrototypeAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
612  }
613  private:
614  SceneEditorTabController* sceneEditorTabController;
615  };
616  popUps->getContextMenuScreenController()->addMenuItem("Jump to prototype", "contextmenu_jumptoprototype", new JumpToPrototypeAction(this));
617  }
618  {
619  // delete
620  class OnDeleteAction: public virtual Action
621  {
622  public:
623  void performAction() override {
624  sceneEditorTabController->view->removeEntities();
625  }
626  OnDeleteAction(SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
627  }
628  private:
629  SceneEditorTabController* sceneEditorTabController;
630  };
632  popUps->getContextMenuScreenController()->addMenuItem("Delete", "contextmenu_delete", new OnDeleteAction(this));
633  }
634  //
635  popUps->getContextMenuScreenController()->show(mouseX, mouseY);
636  }
637  }
638  //
639  basePropertiesSubController->onContextMenuRequest(node, mouseX, mouseY, view->getScene());
640 }
641 
642 void SceneEditorTabController::onTooltipShowRequest(GUINode* node, int mouseX, int mouseY) {
643  int tooltipLeft, tooltipTop;
644  if (view->getEditorView()->getCurrentTabTooltipPosition(screenNode, mouseX, mouseY, tooltipLeft, tooltipTop) == false) return;
645  //
646  popUps->getTooltipScreenController()->show(tooltipLeft, tooltipTop, node->getToolTip());
647 }
648 
651 }
652 
654 {
655  //
656  if (basePropertiesSubController->onAction(type, node, view->getScene()) == true) return;
657  //
658  if (type != GUIActionListenerType::PERFORMED) return;
659  //
660  if (node->getId() == view->getTabId() + "_tab_button_play") {
661  view->runScene();
662  } else
663  if (node->getId() == view->getTabId() + "_tab_button_stop") {
664  view->stopScene();
665  } else
666  if (node->getId() == "menu_view_scene_run") {
667  view->runScene();
668  } else
669  if (node->getId() == "menu_view_scene_stop") {
670  view->stopScene();
671  } else
672  if (node->getId() == "tdme.entities.rename_input") {
673  renameEntity();
674  } else
675  if (StringTools::startsWith(node->getId(), "sky.shader.") == true &&
676  StringTools::endsWith(node->getId(), "_color_edit") == true) {
677  //
678  auto shaderParameterName = StringTools::substring(node->getId(), string("sky.shader.").size(), node->getId().size() - string("_color_edit").size());
679  auto shaderParameter = view->getScene()->getSkyShaderParameters().getShaderParameter(shaderParameterName);
680  auto color4 = shaderParameter.getColor4Value();
681  //
682  class OnColorChangeAction: public virtual Action
683  {
684  public:
685  void performAction() override {
686  //
687  auto view = sceneEditorTabController->getView();
688  auto scene = view->getScene();
689  auto shaderParameters = scene->getSkyShaderParameters();
690  auto shaderParameter = shaderParameters.getShaderParameter(shaderParameterName);
691  auto color4 = sceneEditorTabController->popUps->getColorPickerScreenController()->getColor();
692  shaderParameters.setShaderParameter(shaderParameterName, color4);
693  try {
694  required_dynamic_cast<GUIImageNode*>(sceneEditorTabController->screenNode->getNodeById("sky.shader." + shaderParameterName + "_color"))->setEffectColorMul(color4);
695  } catch (Exception& exception) {
696  Console::println("SceneEditorTabController::onAction(): An error occurred: " + string(exception.what()));
697  sceneEditorTabController->showInfoPopUp("Warning", string(exception.what()));
698  }
699  //
700  scene->setSkyShaderParameters(shaderParameters);
702  }
703  OnColorChangeAction(SceneEditorTabController* sceneEditorTabController, const string& shaderParameterName): sceneEditorTabController(sceneEditorTabController), shaderParameterName(shaderParameterName) {
704  }
705  private:
706  SceneEditorTabController* sceneEditorTabController;
707  string shaderParameterName;
708  };
709  //
710  popUps->getColorPickerScreenController()->show(color4, new OnColorChangeAction(this, shaderParameterName));
711  //
712  } else
713  if (StringTools::startsWith(node->getId(), "postprocessing.shader.") == true &&
714  StringTools::endsWith(node->getId(), "_color_edit") == true) {
715  //
716  auto shaderParameterString = StringTools::substring(node->getId(), string("postprocessing.shader.").size(), node->getId().size() - string("_color_edit").size());
717  auto shaderParameterArray = StringTools::tokenize(shaderParameterString, ".");
718  auto shaderId = shaderParameterArray.size() >= 1?shaderParameterArray[0]:string();
719  auto shaderParameterName = shaderParameterArray.size() == 2?shaderParameterArray[1]:string();
720  auto shaderParameters = view->getScene()->getPostProcessingShaderParameters(shaderId);
721  auto parameter = shaderParameters != nullptr?shaderParameters->getShaderParameter(shaderParameterName):Engine::getDefaultShaderParameter(shaderId, shaderParameterName);
722  auto color4 = parameter.getColor4Value();
723  //
724  class OnColorChangeAction: public virtual Action
725  {
726  public:
727  void performAction() override {
728  //
729  auto view = sceneEditorTabController->getView();
730  auto scene = view->getScene();
731  auto shaderParametersPtr = view->getScene()->getPostProcessingShaderParameters(shaderId);
732  auto shaderParameters = shaderParametersPtr != nullptr?*shaderParametersPtr:EntityShaderParameters();
733  auto parameter = shaderParametersPtr != nullptr?shaderParametersPtr->getShaderParameter(parameterName):Engine::getDefaultShaderParameter(shaderId, parameterName);
734  auto color4 = sceneEditorTabController->popUps->getColorPickerScreenController()->getColor();
735  shaderParameters.setShaderParameter(parameterName, color4);
736  try {
737  required_dynamic_cast<GUIImageNode*>(sceneEditorTabController->screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName + "_color"))->setEffectColorMul(color4);
738  } catch (Exception& exception) {
739  Console::println("SceneEditorTabController::onAction(): An error occurred: " + string(exception.what()));
740  sceneEditorTabController->showInfoPopUp("Warning", string(exception.what()));
741  }
742  //
743  scene->setPostProcessingShaderParameters(shaderId, shaderParameters);
745  }
746  OnColorChangeAction(SceneEditorTabController* sceneEditorTabController, const string& shaderId, const string& parameterName): sceneEditorTabController(sceneEditorTabController), shaderId(shaderId), parameterName(parameterName) {
747  }
748  private:
749  SceneEditorTabController* sceneEditorTabController;
750  string shaderId;
751  string parameterName;
752  };
753  //
754  popUps->getColorPickerScreenController()->show(color4, new OnColorChangeAction(this, shaderId, shaderParameterName));
755  //
756  } else
757  if (node->getId() == "gui_open") {
758  class OnLoadGUIAction: public virtual Action
759  {
760  public:
761  void performAction() override {
762  try {
763  sceneEditorTabController->setGUIFileName(
764  sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName() +
765  "/" +
766  sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
767  );
768  } catch (Exception& exception) {
769  Console::println("OnLoadGUIAction::performAction(): An error occurred: " + string(exception.what()));
770  sceneEditorTabController->showInfoPopUp("Warning", string(exception.what()));
771  }
772  sceneEditorTabController->setGUIDetails();
773  sceneEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
774  }
775 
776  /**
777  * Public constructor
778  * @param sceneEditorTabController scene editor tab controller
779  */
780  OnLoadGUIAction(SceneEditorTabController* sceneEditorTabController)
781  : sceneEditorTabController(sceneEditorTabController) {
782  //
783  }
784 
785  private:
786  SceneEditorTabController* sceneEditorTabController;
787  };
788 
790  string(),
791  "Load GUI from: ",
792  {{ "xml" }},
793  string(),
794  true,
795  new OnLoadGUIAction(this)
796  );
797  } else
798  if (node->getId() == "gui_remove") {
799  auto scene = view->getScene();
801  } else
802  if (node->getId() == "gui_browseto") {
803  auto scene = view->getScene();
804  if (scene->getGUIFileName().empty() == true) {
805  showInfoPopUp("Browse To", "Nothing to browse to");
806  } else {
807  view->getEditorView()->getScreenController()->browseTo(scene->getGUIFileName());
808  }
809  } else
810  if (node->getId() == "prototype_place") {
811  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
812  auto prototypeId = Integer::parse(StringTools::substring(outlinerNode, string("scene.prototypes.").size()));
813  auto scene = view->getScene();
814  auto sceneLibrary = scene->getLibrary();
815  auto prototype = sceneLibrary->getPrototype(prototypeId);
816  if (prototype != nullptr) view->setPlaceEntityMode(prototype);
817  } else
818  if (node->getId() == "light_ambient_ambient_edit" ||
819  node->getId() == "light_spot_ambient_edit" ||
820  node->getId() == "light_directional_ambient_edit") {
821  class OnColorChangeAction: public virtual Action
822  {
823  public:
824  void performAction() override {
825  auto scene = sceneEditorTabController->view->getScene();
826  if (scene == nullptr) return;
827  auto light = scene->getLightAt(lightIdx);
828  if (scene == nullptr) return;
829  light->setAmbient(sceneEditorTabController->popUps->getColorPickerScreenController()->getColor());
830  sceneEditorTabController->updateLightDetails(lightIdx);
831  }
832  OnColorChangeAction(SceneEditorTabController* sceneEditorTabController, int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
833  }
834  private:
835  SceneEditorTabController* sceneEditorTabController;
836  int lightIdx;
837  };
838  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
839  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
840  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
841  auto scene = view->getScene();
842  if (scene == nullptr) return;
843  auto light = scene->getLightAt(lightIdx);
844  if (light == nullptr) return;
845  popUps->getColorPickerScreenController()->show(light->getAmbient(), new OnColorChangeAction(this, lightIdx));
846  }
847  } else
848  if (node->getId() == "light_ambient_diffuse_edit" ||
849  node->getId() == "light_spot_diffuse_edit" ||
850  node->getId() == "light_directional_diffuse_edit") {
851  class OnColorChangeAction: public virtual Action
852  {
853  public:
854  void performAction() override {
855  auto scene = sceneEditorTabController->view->getScene();
856  if (scene == nullptr) return;
857  auto light = scene->getLightAt(lightIdx);
858  if (scene == nullptr) return;
859  light->setDiffuse(sceneEditorTabController->popUps->getColorPickerScreenController()->getColor());
860  sceneEditorTabController->updateLightDetails(lightIdx);
861  }
862  OnColorChangeAction(SceneEditorTabController* sceneEditorTabController, int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
863  }
864  private:
865  SceneEditorTabController* sceneEditorTabController;
866  int lightIdx;
867  };
868  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
869  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
870  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
871  auto scene = view->getScene();
872  if (scene == nullptr) return;
873  auto light = scene->getLightAt(lightIdx);
874  if (light == nullptr) return;
875  popUps->getColorPickerScreenController()->show(light->getDiffuse(), new OnColorChangeAction(this, lightIdx));
876  }
877  } else
878  if (node->getId() == "light_ambient_specular_edit" ||
879  node->getId() == "light_spot_specular_edit" ||
880  node->getId() == "light_directional_specular_edit") {
881  class OnColorChangeAction: public virtual Action
882  {
883  public:
884  void performAction() override {
885  auto scene = sceneEditorTabController->view->getScene();
886  if (scene == nullptr) return;
887  auto light = scene->getLightAt(lightIdx);
888  if (scene == nullptr) return;
889  light->setSpecular(sceneEditorTabController->popUps->getColorPickerScreenController()->getColor());
890  sceneEditorTabController->updateLightDetails(lightIdx);
891  }
892  OnColorChangeAction(SceneEditorTabController* sceneEditorTabController, int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
893  }
894  private:
895  SceneEditorTabController* sceneEditorTabController;
896  int lightIdx;
897  };
898  auto outlinerNode = view->getEditorView()->getScreenController()->getOutlinerSelection();
899  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
900  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
901  auto scene = view->getScene();
902  if (scene == nullptr) return;
903  auto light = scene->getLightAt(lightIdx);
904  if (light == nullptr) return;
905  popUps->getColorPickerScreenController()->show(light->getSpecular(), new OnColorChangeAction(this, lightIdx));
906  }
907  }
908 }
909 
911  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_toolbar"))->getActiveConditions().remove("running");
912  if (running == true) required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById(view->getTabId() + "_tab_toolbar"))->getActiveConditions().add("running");
913 }
914 
917  "<template id=\"details_sky\" src=\"resources/engine/gui/template_details_sky.xml\" />\n"
918  );
919  //
920  string xml;
921  auto scene = view->getScene();
922  for (const auto& parameterName: Engine::getShaderParameterNames("sky")) {
923  auto parameterDefaults = Engine::getDefaultShaderParameter("sky", parameterName);
924  if (parameterDefaults == nullptr) continue;
925  auto parameter = scene->getSkyShaderParameters().getShaderParameter(parameterName);
926  switch (parameter.getType()) {
927  case ShaderParameter::TYPE_FLOAT:
928  {
929  auto parameterValue = parameter.getValueAsString();
930  xml+=
931  "<template name=\"" +
932  GUIParser::escape(parameterName) + "\" " +
933  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
934  "src=\"resources/engine/gui/template_details_rendering_shader_float.xml\" " +
935  "value=\"" + parameterValue + "\" " +
936  "min=\"" + to_string(parameterDefaults->min.getFloatValue()) + "\" " +
937  "max=\"" + to_string(parameterDefaults->max.getFloatValue()) + "\" " +
938  "step=\"" + to_string(parameterDefaults->step.getFloatValue()) + "\" " +
939  "/>\n";
940  break;
941  }
942  case ShaderParameter::TYPE_INTEGER:
943  {
944  auto parameterValue = parameter.getValueAsString();
945  xml+=
946  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
947  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
948  "src=\"resources/engine/gui/template_details_rendering_shader_int.xml\" " +
949  "value=\"" + parameterValue + "\" " +
950  "min=\"" + to_string(parameterDefaults->min.getIntegerValue()) + "\" " +
951  "max=\"" + to_string(parameterDefaults->max.getIntegerValue()) + "\" " +
952  "step=\"" + to_string(parameterDefaults->step.getIntegerValue()) + "\" " +
953  "/>\n";
954  break;
955  }
956  case ShaderParameter::TYPE_BOOLEAN:
957  {
958  auto parameterValue = parameter.getValueAsString();
959  xml+=
960  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
961  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
962  "src=\"resources/engine/gui/template_details_rendering_shader_bool.xml\" " +
963  "value=\"" + parameterValue + "\" " +
964  "/>\n";
965  break;
966  }
967  case ShaderParameter::TYPE_VECTOR2:
968  {
969  auto vec2 = parameter.getVector2Value();
970  xml+=
971  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
972  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
973  "src=\"resources/engine/gui/template_details_rendering_shader_vector2.xml\" " +
974  "value_x=\"" + to_string(vec2.getX()) + "\" " +
975  "min_x=\"" + to_string(parameterDefaults->min.getVector2Value().getX()) + "\" " +
976  "max_x=\"" + to_string(parameterDefaults->max.getVector2Value().getX()) + "\" " +
977  "step_x=\"" + to_string(parameterDefaults->step.getVector2Value().getX()) + "\" " +
978  "value_y=\"" + to_string(vec2.getY()) + "\" "+
979  "min_y=\"" + to_string(parameterDefaults->min.getVector2Value().getY()) + "\" " +
980  "max_y=\"" + to_string(parameterDefaults->max.getVector2Value().getY()) + "\" " +
981  "step_y=\"" + to_string(parameterDefaults->step.getVector2Value().getY()) + "\" " +
982  "/>\n";
983  }
984  break;
985  case ShaderParameter::TYPE_VECTOR3:
986  {
987  auto vec3 = parameter.getVector3Value();
988  xml+=
989  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
990  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
991  "src=\"resources/engine/gui/template_details_rendering_shader_vector3.xml\" " +
992  "value_x=\"" + to_string(vec3.getX()) + "\" " +
993  "min_x=\"" + to_string(parameterDefaults->min.getVector3Value().getX()) + "\" " +
994  "max_x=\"" + to_string(parameterDefaults->max.getVector3Value().getX()) + "\" " +
995  "step_x=\"" + to_string(parameterDefaults->step.getVector3Value().getX()) + "\" " +
996  "value_y=\"" + to_string(vec3.getY()) + "\" "+
997  "min_y=\"" + to_string(parameterDefaults->min.getVector3Value().getY()) + "\" " +
998  "max_y=\"" + to_string(parameterDefaults->max.getVector3Value().getY()) + "\" " +
999  "step_y=\"" + to_string(parameterDefaults->step.getVector3Value().getY()) + "\" " +
1000  "value_z=\"" + to_string(vec3.getZ()) + "\" "+
1001  "min_z=\"" + to_string(parameterDefaults->min.getVector3Value().getZ()) + "\" " +
1002  "max_z=\"" + to_string(parameterDefaults->max.getVector3Value().getZ()) + "\" " +
1003  "step_z=\"" + to_string(parameterDefaults->step.getVector3Value().getZ()) + "\" " +
1004  "/>\n";
1005  }
1006  break;
1007  case ShaderParameter::TYPE_VECTOR4:
1008  {
1009  auto vec4 = parameter.getVector4Value();
1010  xml+=
1011  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1012  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
1013  "src=\"resources/engine/gui/template_details_rendering_shader_vector4.xml\" " +
1014  "value_x=\"" + to_string(vec4.getX()) + "\" " +
1015  "min_x=\"" + to_string(parameterDefaults->min.getVector4Value().getX()) + "\" " +
1016  "max_x=\"" + to_string(parameterDefaults->max.getVector4Value().getX()) + "\" " +
1017  "step_x=\"" + to_string(parameterDefaults->step.getVector4Value().getX()) + "\" " +
1018  "value_y=\"" + to_string(vec4.getY()) + "\" "+
1019  "min_y=\"" + to_string(parameterDefaults->min.getVector4Value().getY()) + "\" " +
1020  "max_y=\"" + to_string(parameterDefaults->max.getVector4Value().getY()) + "\" " +
1021  "step_y=\"" + to_string(parameterDefaults->step.getVector4Value().getY()) + "\" " +
1022  "value_z=\"" + to_string(vec4.getZ()) + "\" "+
1023  "min_z=\"" + to_string(parameterDefaults->min.getVector4Value().getZ()) + "\" " +
1024  "max_z=\"" + to_string(parameterDefaults->max.getVector4Value().getZ()) + "\" " +
1025  "step_z=\"" + to_string(parameterDefaults->step.getVector4Value().getZ()) + "\" " +
1026  "value_w=\"" + to_string(vec4.getW()) + "\" "+
1027  "min_w=\"" + to_string(parameterDefaults->min.getVector4Value().getW()) + "\" " +
1028  "max_w=\"" + to_string(parameterDefaults->max.getVector4Value().getW()) + "\" " +
1029  "step_w=\"" + to_string(parameterDefaults->step.getVector4Value().getW()) + "\" " +
1030  "/>\n";
1031  }
1032  break;
1033  case ShaderParameter::TYPE_COLOR4:
1034  {
1035  xml+=
1036  "<template name=\"" + GUIParser::escape(parameterName) + "\" "
1037  "id=\"" + GUIParser::escape("sky.shader." + parameterName) + "\" " +
1038  "src=\"resources/engine/gui/template_details_rendering_shader_color4.xml\" " +
1039  "/>\n";
1040  }
1041  break;
1042  case ShaderParameter::TYPE_NONE:
1043  break;
1044  }
1045  }
1046  //
1047  try {
1048  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_sky"))->getActiveConditions().add("open");
1049  required_dynamic_cast<GUIParentNode*>(screenNode->getNodeById("rendering_shader_details"))->replaceSubNodes(xml, false);
1050  //
1051  for (const auto& parameterName: Engine::getShaderParameterNames("sky")) {
1052  auto parameter = scene->getSkyShaderParameters().getShaderParameter(parameterName);
1053  switch (parameter.getType()) {
1054  case ShaderParameter::TYPE_COLOR4:
1055  {
1056  auto color4 = parameter.getColor4Value();
1057  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_color"))->setEffectColorMul(color4);
1058  }
1059  break;
1060  default:
1061  break;
1062  }
1063  }
1064  } catch (Exception& exception) {
1065  Console::println("SceneEditorTabController::setSkyShaderDetails(): An error occurred: " + string(exception.what()));
1066  showInfoPopUp("Warning", string(exception.what()));
1067  }
1068 }
1069 
1072  "<template id=\"details_postprocessing\" src=\"resources/engine/gui/template_details_postprocessing.xml\" />\n"
1073  );
1074  //
1075  auto scene = view->getScene();
1076  for (const auto& shaderId: Engine::getRegisteredShader(Engine::SHADERTYPE_POSTPROCESSING, false)) {
1077  string xml;
1078  //
1079  {
1080  auto parameterValue = scene->isPostProcessingShaderEnabled(shaderId) == true?"true":"";
1081  //
1082  xml+=
1083  "<template name=\"" + GUIParser::escape(shaderId) + "\" " +
1084  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId) + "\" " +
1085  "src=\"resources/engine/gui/template_details_rendering_postprocessing_shader.xml\" " +
1086  "value=\"" + parameterValue + "\" " +
1087  "/>\n";
1088  }
1089  //
1090  auto shaderParameters = scene->getPostProcessingShaderParameters(shaderId);
1091  //
1092  for (const auto& parameterName: Engine::getShaderParameterNames(shaderId)) {
1093  auto parameterDefaults = Engine::getDefaultShaderParameter(shaderId, parameterName);
1094  if (parameterDefaults == nullptr) continue;
1095  //
1096  auto parameter = shaderParameters != nullptr?shaderParameters->getShaderParameter(parameterName):parameterDefaults->value;
1097  //
1098  switch (parameter.getType()) {
1099  case ShaderParameter::TYPE_FLOAT:
1100  {
1101  auto parameterValue = parameter.getValueAsString();
1102  xml+=
1103  "<template name=\"" +
1104  GUIParser::escape(parameterName) + "\" " +
1105  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1106  "src=\"resources/engine/gui/template_details_rendering_shader_float.xml\" " +
1107  "value=\"" + parameterValue + "\" " +
1108  "min=\"" + to_string(parameterDefaults->min.getFloatValue()) + "\" " +
1109  "max=\"" + to_string(parameterDefaults->max.getFloatValue()) + "\" " +
1110  "step=\"" + to_string(parameterDefaults->step.getFloatValue()) + "\" " +
1111  "/>\n";
1112  break;
1113  }
1114  case ShaderParameter::TYPE_INTEGER:
1115  {
1116  auto parameterValue = parameter.getValueAsString();
1117  xml+=
1118  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1119  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1120  "src=\"resources/engine/gui/template_details_rendering_shader_int.xml\" " +
1121  "value=\"" + parameterValue + "\" " +
1122  "min=\"" + to_string(parameterDefaults->min.getIntegerValue()) + "\" " +
1123  "max=\"" + to_string(parameterDefaults->max.getIntegerValue()) + "\" " +
1124  "step=\"" + to_string(parameterDefaults->step.getIntegerValue()) + "\" " +
1125  "/>\n";
1126  break;
1127  }
1128  case ShaderParameter::TYPE_BOOLEAN:
1129  {
1130  auto parameterValue = parameter.getValueAsString();
1131  xml+=
1132  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1133  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1134  "src=\"resources/engine/gui/template_details_rendering_shader_bool.xml\" " +
1135  "value=\"" + parameterValue + "\" " +
1136  "/>\n";
1137  break;
1138  }
1139  case ShaderParameter::TYPE_VECTOR2:
1140  {
1141  auto vec2 = parameter.getVector2Value();
1142  xml+=
1143  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1144  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1145  "src=\"resources/engine/gui/template_details_rendering_shader_vector2.xml\" " +
1146  "value_x=\"" + to_string(vec2.getX()) + "\" " +
1147  "min_x=\"" + to_string(parameterDefaults->min.getVector2Value().getX()) + "\" " +
1148  "max_x=\"" + to_string(parameterDefaults->max.getVector2Value().getX()) + "\" " +
1149  "step_x=\"" + to_string(parameterDefaults->step.getVector2Value().getX()) + "\" " +
1150  "value_y=\"" + to_string(vec2.getY()) + "\" "+
1151  "min_y=\"" + to_string(parameterDefaults->min.getVector2Value().getY()) + "\" " +
1152  "max_y=\"" + to_string(parameterDefaults->max.getVector2Value().getY()) + "\" " +
1153  "step_y=\"" + to_string(parameterDefaults->step.getVector2Value().getY()) + "\" " +
1154  "/>\n";
1155  }
1156  break;
1157  case ShaderParameter::TYPE_VECTOR3:
1158  {
1159  auto vec3 = parameter.getVector3Value();
1160  xml+=
1161  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1162  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1163  "src=\"resources/engine/gui/template_details_rendering_shader_vector3.xml\" " +
1164  "value_x=\"" + to_string(vec3.getX()) + "\" " +
1165  "min_x=\"" + to_string(parameterDefaults->min.getVector3Value().getX()) + "\" " +
1166  "max_x=\"" + to_string(parameterDefaults->max.getVector3Value().getX()) + "\" " +
1167  "step_x=\"" + to_string(parameterDefaults->step.getVector3Value().getX()) + "\" " +
1168  "value_y=\"" + to_string(vec3.getY()) + "\" "+
1169  "min_y=\"" + to_string(parameterDefaults->min.getVector3Value().getY()) + "\" " +
1170  "max_y=\"" + to_string(parameterDefaults->max.getVector3Value().getY()) + "\" " +
1171  "step_y=\"" + to_string(parameterDefaults->step.getVector3Value().getY()) + "\" " +
1172  "value_z=\"" + to_string(vec3.getZ()) + "\" "+
1173  "min_z=\"" + to_string(parameterDefaults->min.getVector3Value().getZ()) + "\" " +
1174  "max_z=\"" + to_string(parameterDefaults->max.getVector3Value().getZ()) + "\" " +
1175  "step_z=\"" + to_string(parameterDefaults->step.getVector3Value().getZ()) + "\" " +
1176  "/>\n";
1177  }
1178  break;
1179  case ShaderParameter::TYPE_VECTOR4:
1180  {
1181  auto vec4 = parameter.getVector4Value();
1182  xml+=
1183  "<template name=\"" + GUIParser::escape(parameterName) + "\" " +
1184  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1185  "src=\"resources/engine/gui/template_details_rendering_shader_vector4.xml\" " +
1186  "value_x=\"" + to_string(vec4.getX()) + "\" " +
1187  "min_x=\"" + to_string(parameterDefaults->min.getVector4Value().getX()) + "\" " +
1188  "max_x=\"" + to_string(parameterDefaults->max.getVector4Value().getX()) + "\" " +
1189  "step_x=\"" + to_string(parameterDefaults->step.getVector4Value().getX()) + "\" " +
1190  "value_y=\"" + to_string(vec4.getY()) + "\" "+
1191  "min_y=\"" + to_string(parameterDefaults->min.getVector4Value().getY()) + "\" " +
1192  "max_y=\"" + to_string(parameterDefaults->max.getVector4Value().getY()) + "\" " +
1193  "step_y=\"" + to_string(parameterDefaults->step.getVector4Value().getY()) + "\" " +
1194  "value_z=\"" + to_string(vec4.getZ()) + "\" "+
1195  "min_z=\"" + to_string(parameterDefaults->min.getVector4Value().getZ()) + "\" " +
1196  "max_z=\"" + to_string(parameterDefaults->max.getVector4Value().getZ()) + "\" " +
1197  "step_z=\"" + to_string(parameterDefaults->step.getVector4Value().getZ()) + "\" " +
1198  "value_w=\"" + to_string(vec4.getW()) + "\" "+
1199  "min_w=\"" + to_string(parameterDefaults->min.getVector4Value().getW()) + "\" " +
1200  "max_w=\"" + to_string(parameterDefaults->max.getVector4Value().getW()) + "\" " +
1201  "step_w=\"" + to_string(parameterDefaults->step.getVector4Value().getW()) + "\" " +
1202  "/>\n";
1203  }
1204  break;
1205  case ShaderParameter::TYPE_COLOR4:
1206  {
1207  xml+=
1208  "<template name=\"" + GUIParser::escape(parameterName) + "\" "
1209  "id=\"" + GUIParser::escape("postprocessing.shader." + shaderId + "." + parameterName) + "\" " +
1210  "src=\"resources/engine/gui/template_details_rendering_shader_color4.xml\" " +
1211  "/>\n";
1212  }
1213  break;
1214  case ShaderParameter::TYPE_NONE:
1215  break;
1216  }
1217  }
1218  //
1219  xml+= "<space height=\"1\" width=\"100%\" border-top=\"1\" border-color=\"{$color.element_frame}\" />";
1220  //
1221  try {
1222  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_postprocessing"))->getActiveConditions().add("open");
1223  required_dynamic_cast<GUIParentNode*>(screenNode->getNodeById("postprocessing_details"))->addSubNodes(xml, false);
1224  //
1225  for (const auto& parameterName: Engine::getShaderParameterNames(shaderId)) {
1226  auto parameterDefaults = Engine::getDefaultShaderParameter(shaderId, parameterName);
1227  auto parameter = parameterDefaults->value;
1228  switch (parameter.getType()) {
1229  case ShaderParameter::TYPE_COLOR4:
1230  {
1231  auto color4 = parameter.getColor4Value();
1232  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName + "_color"))->setEffectColorMul(color4);
1233  }
1234  break;
1235  default:
1236  break;
1237  }
1238  }
1239  } catch (Exception& exception) {
1240  Console::println("SceneEditorTabController::setPostProcessingDetails(): An error occurred: " + string(exception.what()));
1241  showInfoPopUp("Warning", string(exception.what()));
1242  }
1243  }
1244 }
1245 
1246 void SceneEditorTabController::applySkyShaderDetails(const string& parameterName) {
1247  //
1248  auto scene = view->getScene();
1249  auto shaderParameters = scene->getSkyShaderParameters();
1250  //
1251  try {
1252  auto parameter = shaderParameters.getShaderParameter(parameterName);
1253  switch (parameter.getType()) {
1254  case ShaderParameter::TYPE_FLOAT:
1255  shaderParameters.setShaderParameter(
1256  parameterName,
1258  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName))->getController()->getValue().getString())
1259  )
1260  );
1261  break;
1262  case ShaderParameter::TYPE_INTEGER:
1263  shaderParameters.setShaderParameter(
1264  parameterName,
1266  Integer::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName))->getController()->getValue().getString())
1267  )
1268  );
1269  break;
1270  case ShaderParameter::TYPE_BOOLEAN:
1271  shaderParameters.setShaderParameter(
1272  parameterName,
1274  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName))->getController()->getValue().getString() == "1"
1275  )
1276  );
1277  break;
1278  case ShaderParameter::TYPE_VECTOR2:
1279  shaderParameters.setShaderParameter(
1280  parameterName,
1282  Vector2(
1283  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_x"))->getController()->getValue().getString()),
1284  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_y"))->getController()->getValue().getString())
1285  )
1286  )
1287  );
1288  break;
1289  case ShaderParameter::TYPE_VECTOR3:
1290  shaderParameters.setShaderParameter(
1291  parameterName,
1293  Vector3(
1294  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_x"))->getController()->getValue().getString()),
1295  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_y"))->getController()->getValue().getString()),
1296  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_z"))->getController()->getValue().getString())
1297  )
1298  )
1299  );
1300  break;
1301  case ShaderParameter::TYPE_VECTOR4:
1302  shaderParameters.setShaderParameter(
1303  parameterName,
1305  Vector4(
1306  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_x"))->getController()->getValue().getString()),
1307  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_y"))->getController()->getValue().getString()),
1308  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_z"))->getController()->getValue().getString()),
1309  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("sky.shader." + parameterName + "_w"))->getController()->getValue().getString())
1310  )
1311  )
1312  );
1313  break;
1314  case ShaderParameter::TYPE_COLOR4:
1315  break;
1316  case ShaderParameter::TYPE_NONE:
1317  break;
1318  }
1319  } catch (Exception& exception) {
1320  Console::println("SceneEditorTabController::applySkyShaderDetails(): An error occurred: " + string(exception.what()));
1321  showInfoPopUp("Warning", string(exception.what()));
1322  }
1323  //
1324  scene->setSkyShaderParameters(shaderParameters);
1326 }
1327 
1328 void SceneEditorTabController::applyPostProcessingDetails(const string& shaderId, const string& parameterName) {
1329  //
1330  auto scene = view->getScene();
1331  auto shaderParametersPtr = scene->getPostProcessingShaderParameters(shaderId);
1332  auto shaderParameters = shaderParametersPtr != nullptr?*shaderParametersPtr:EntityShaderParameters();
1333  shaderParameters.setShader(shaderId);
1334  auto shaderParameterDefaults = Engine::getDefaultShaderParameter(shaderId, parameterName);
1335  if (shaderParameterDefaults == nullptr) return;
1336  //
1337  try {
1338  auto parameter = shaderParameters.getShaderParameter(parameterName);
1339  switch (shaderParameterDefaults->value.getType()) {
1340  case ShaderParameter::TYPE_FLOAT:
1341  shaderParameters.setShaderParameter(
1342  parameterName,
1344  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString())
1345  )
1346  );
1347  break;
1348  case ShaderParameter::TYPE_INTEGER:
1349  shaderParameters.setShaderParameter(
1350  parameterName,
1352  Integer::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString())
1353  )
1354  );
1355  break;
1356  case ShaderParameter::TYPE_BOOLEAN:
1357  shaderParameters.setShaderParameter(
1358  parameterName,
1360  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString() == "1"
1361  )
1362  );
1363  break;
1364  case ShaderParameter::TYPE_VECTOR2:
1365  shaderParameters.setShaderParameter(
1366  parameterName,
1368  Vector2(
1369  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1370  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString())
1371  )
1372  )
1373  );
1374  break;
1375  case ShaderParameter::TYPE_VECTOR3:
1376  shaderParameters.setShaderParameter(
1377  parameterName,
1379  Vector3(
1380  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1381  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1382  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString())
1383  )
1384  )
1385  );
1386  break;
1387  case ShaderParameter::TYPE_VECTOR4:
1388  shaderParameters.setShaderParameter(
1389  parameterName,
1391  Vector4(
1392  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1393  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1394  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString()),
1395  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("postprocessing.shader." + shaderId + "." + parameterName))->getController()->getValue().getString())
1396  )
1397  )
1398  );
1399  break;
1400  case ShaderParameter::TYPE_COLOR4:
1401  break;
1402  case ShaderParameter::TYPE_NONE:
1403  break;
1404  }
1405  } catch (Exception& exception) {
1406  Console::println("SceneEditorTabController::applyPostProcessingDetails(): An error occurred: " + string(exception.what()));
1407  showInfoPopUp("Warning", string(exception.what()));
1408  }
1409  //
1410  scene->setPostProcessingShaderParameters(shaderId, shaderParameters);
1412 }
1413 
1415  auto scene = view->getScene();
1416 
1417  //
1419  string("<template id=\"details_gui\" src=\"resources/engine/gui/template_details_gui.xml\" />")
1420  );
1421 
1422  //
1423  try {
1424  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_gui"))->getActiveConditions().add("open");
1425  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("gui"))->setSource(scene->getGUIFileName());
1426  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("gui"))->setTooltip(scene->getGUIFileName());
1427  } catch (Exception& exception) {
1428  Console::println("SceneEditorTabController::setGUIDetails(): An error occurred: " + string(exception.what()));
1429  showInfoPopUp("Warning", string(exception.what()));
1430  }
1431 }
1432 
1433 void SceneEditorTabController::setGUIFileName(const string& fileName) {
1434  auto scene = view->getScene();
1435  if (scene == nullptr) return;
1436  scene->setGUIFileName(fileName);
1437  setGUIDetails();
1438 }
1439 
1441  auto scene = view->getScene();
1442  if (scene == nullptr) return;
1443  scene->setGUIFileName(string());
1444  setGUIDetails();
1445 }
1446 
1448  auto scene = view->getScene();
1449  if (scene == nullptr) return;
1450  auto light = scene->getLightAt(lightIdx);
1451  if (light == nullptr) return;
1452  enum LightType { LIGHTTYPE_AMBIENT, LIGHTTYPE_SPOTLIGHT, LIGHTTYPE_DIRECTIONAL };
1453  LightType lightType;
1454  if (Math::abs(light->getPosition().getW()) < Math::EPSILON) lightType = LIGHTTYPE_DIRECTIONAL; else
1455  if (Math::abs(light->getSpotExponent()) > Math::EPSILON) lightType = LIGHTTYPE_SPOTLIGHT; else
1456  lightType = LIGHTTYPE_AMBIENT;
1457 
1459  string("<template id=\"details_light\" src=\"resources/engine/gui/template_details_light.xml\" />")
1460  );
1461 
1462  //
1463  try {
1464  //
1465  auto spotDirection = light->getSpotDirection().computeLengthSquared() < Math::square(Math::EPSILON)?Vector3(0.0f, -1.0f, 1.0f):light->getSpotDirection().clone().normalize();
1466 
1467  //
1468  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_constant_attenuation"))->getController()->setValue(MutableString(light->getConstantAttenuation()));
1469  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_linear_attenuation"))->getController()->setValue(MutableString(light->getLinearAttenuation()));
1470  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_quadratic_attenuation"))->getController()->setValue(MutableString(light->getQuadraticAttenuation()));
1471 
1472  //
1473  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_constant_attenuation"))->getController()->setValue(MutableString(light->getConstantAttenuation()));
1474  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_linear_attenuation"))->getController()->setValue(MutableString(light->getLinearAttenuation()));
1475  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_quadratic_attenuation"))->getController()->setValue(MutableString(light->getQuadraticAttenuation()));
1476  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_x"))->getController()->setValue(MutableString(light->getPosition().getX()));
1477  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_y"))->getController()->setValue(MutableString(light->getPosition().getY()));
1478  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_z"))->getController()->setValue(MutableString(light->getPosition().getZ()));
1479  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_x"))->getController()->setValue(MutableString(spotDirection.getX()));
1480  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_y"))->getController()->setValue(MutableString(spotDirection.getY()));
1481  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_z"))->getController()->setValue(MutableString(spotDirection.getZ()));
1482  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_cutoff"))->getController()->setValue(MutableString(light->getSpotCutOff()));
1483  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_exponent"))->getController()->setValue(MutableString(light->getSpotExponent()));
1484 
1485  //
1486  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_constant_attenuation"))->getController()->setValue(MutableString(light->getConstantAttenuation()));
1487  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_linear_attenuation"))->getController()->setValue(MutableString(light->getLinearAttenuation()));
1488  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_quadratic_attenuation"))->getController()->setValue(MutableString(light->getQuadraticAttenuation()));
1489  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_x"))->getController()->setValue(MutableString(spotDirection.getX()));
1490  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_y"))->getController()->setValue(MutableString(spotDirection.getY()));
1491  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_z"))->getController()->setValue(MutableString(spotDirection.getZ()));
1492 
1493  //
1494  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_light"))->getActiveConditions().add("open");
1495  switch (lightType) {
1496  case LIGHTTYPE_AMBIENT:
1497  {
1498  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type"))->getController()->setValue(MutableString(4));
1499  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type_details"))->getActiveConditions().set("ambient");
1500  break;
1501  }
1502  case LIGHTTYPE_SPOTLIGHT:
1503  {
1504  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type"))->getController()->setValue(MutableString(2));
1505  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type_details"))->getActiveConditions().set("spot");
1506  break;
1507  }
1508  case LIGHTTYPE_DIRECTIONAL:
1509  {
1510  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type"))->getController()->setValue(MutableString(3));
1511  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type_details"))->getActiveConditions().set("directional");
1512  break;
1513  }
1514  }
1515  } catch (Exception& exception) {
1516  Console::println("SceneEditorTabController::setLightDetails(): An error occurred: " + string(exception.what()));
1517  showInfoPopUp("Warning", string(exception.what()));
1518  }
1519 
1520  //
1521  updateLightDetails(lightIdx);
1522 }
1523 
1525  auto scene = view->getScene();
1526  if (scene == nullptr) return;
1527  auto light = scene->getLightAt(lightIdx);
1528  if (light == nullptr) return;
1529 
1530  try {
1531  //
1532  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_ambient_ambient"))->setEffectColorMul(Color4(light->getAmbient()));
1533  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_ambient_diffuse"))->setEffectColorMul(Color4(light->getDiffuse()));
1534  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_ambient_specular"))->setEffectColorMul(Color4(light->getSpecular()));
1535 
1536  //
1537  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_spot_ambient"))->setEffectColorMul(Color4(light->getAmbient()));
1538  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_spot_diffuse"))->setEffectColorMul(Color4(light->getDiffuse()));
1539  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_spot_specular"))->setEffectColorMul(Color4(light->getSpecular()));
1540 
1541  //
1542  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_directional_ambient"))->setEffectColorMul(Color4(light->getAmbient()));
1543  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_directional_diffuse"))->setEffectColorMul(Color4(light->getDiffuse()));
1544  required_dynamic_cast<GUIImageNode*>(screenNode->getNodeById("light_directional_specular"))->setEffectColorMul(Color4(light->getSpecular()));
1545  } catch (Exception& exception) {
1546  Console::println("SceneEditorTabController::updateLightDetails(): An error occurred: " + string(exception.what()));
1547  showInfoPopUp("Warning", string(exception.what()));
1548  }
1549 
1550  //
1551  view->updateLights();
1552 }
1553 
1555  //
1556  auto scene = view->getScene();
1557  if (scene == nullptr) return;
1558  auto light = scene->getLightAt(lightIdx);
1559  if (light == nullptr) return;
1560 
1561  //
1562  try {
1563  //
1564  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_light"))->getActiveConditions().add("open");
1565  switch (Integer::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_type"))->getController()->getValue().getString())) {
1566  case 4:
1567  //ambient
1568  {
1569  //
1570  light->setConstantAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_constant_attenuation"))->getController()->getValue().getString()));
1571  light->setLinearAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_linear_attenuation"))->getController()->getValue().getString()));
1572  light->setQuadraticAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_ambient_quadratic_attenuation"))->getController()->getValue().getString()));
1573  light->setPosition(Vector4());
1574  light->setSpotDirection(Vector3());
1575  light->setSpotCutOff(180.0f);
1576  light->setSpotExponent(0.0f);
1577  break;
1578  }
1579  case 2:
1580  // spot light
1581  {
1582  //
1583  light->setConstantAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_constant_attenuation"))->getController()->getValue().getString()));
1584  light->setLinearAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_linear_attenuation"))->getController()->getValue().getString()));
1585  light->setQuadraticAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_quadratic_attenuation"))->getController()->getValue().getString()));
1586  light->setPosition(
1587  Vector4(
1588  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_x"))->getController()->getValue().getString()),
1589  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_y"))->getController()->getValue().getString()),
1590  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_position_z"))->getController()->getValue().getString()),
1591  1.0f
1592  )
1593  );
1594  light->setSpotDirection(
1595  Vector3(
1596  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_x"))->getController()->getValue().getString()),
1597  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_y"))->getController()->getValue().getString()),
1598  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_direction_z"))->getController()->getValue().getString())
1599  ).normalize()
1600  );
1601  light->setSpotCutOff(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_cutoff"))->getController()->getValue().getString()));
1602  light->setSpotExponent(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_spot_exponent"))->getController()->getValue().getString()));
1603  break;
1604  }
1605  case 3:
1606  // directional
1607  {
1608  //
1609  light->setConstantAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_constant_attenuation"))->getController()->getValue().getString()));
1610  light->setLinearAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_linear_attenuation"))->getController()->getValue().getString()));
1611  light->setQuadraticAttenuation(Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_quadratic_attenuation"))->getController()->getValue().getString()));
1612  light->setPosition(
1613  Vector4(
1614  light->getPosition().getX(),
1615  light->getPosition().getY(),
1616  light->getPosition().getZ(),
1617  0.0f
1618  )
1619  );
1620  light->setSpotDirection(
1621  Vector3(
1622  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_x"))->getController()->getValue().getString()),
1623  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_y"))->getController()->getValue().getString()),
1624  Float::parse(required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("light_directional_direction_z"))->getController()->getValue().getString())
1625  ).normalize()
1626  );
1627  light->setSpotCutOff(180.0f);
1628  light->setSpotExponent(0.0f);
1629  break;
1630  }
1631  }
1632  } catch (Exception& exception) {
1633  Console::println("SceneEditorTabController::applyLightDetails(): An error occurred: " + string(exception.what()));
1634  showInfoPopUp("Warning", string(exception.what()));
1635  }
1636 
1637  //
1638  view->updateLights();
1639 }
1640 
1642  auto scene = view->getScene();
1643 
1645  string("<template id=\"details_prototype\" src=\"resources/engine/gui/template_details_prototype.xml\" />")
1646  );
1647 
1648  //
1649  try {
1650  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_prototype"))->getActiveConditions().add("open");
1651  } catch (Exception& exception) {
1652  Console::println("SceneEditorTabController::setEntityDetails(): An error occurred: " + string(exception.what()));
1653  showInfoPopUp("Warning", string(exception.what()));
1654  }
1655 }
1656 
1657 void SceneEditorTabController::updateReflectionEnvironmentMappingDetailsDropDown(const string& selectedReflectionEnvironmentMappingId) {
1658  auto scene = view->getScene();
1659  if (scene == nullptr) return;
1660 
1661  string reflectionEnvironmentMappingIdsXML =
1662  string() + "<dropdown-option text=\"<None>\" value=\"\" " + (selectedReflectionEnvironmentMappingId.empty() == true?"selected=\"true\" ":"") + " />\n";
1663  for (auto& environmentMappingId: scene->getEnvironmentMappingIds()) {
1664  reflectionEnvironmentMappingIdsXML+=
1665  "<dropdown-option text=\"" +
1666  GUIParser::escape(environmentMappingId) +
1667  "\" value=\"" +
1668  GUIParser::escape(environmentMappingId) +
1669  "\" " +
1670  (selectedReflectionEnvironmentMappingId == environmentMappingId?"selected=\"true\" ":"") +
1671  " />\n";
1672  }
1673 
1674  try {
1675  required_dynamic_cast<GUIParentNode*>(screenNode->getInnerNodeById("reflection_environmentmap"))->replaceSubNodes(reflectionEnvironmentMappingIdsXML, true);
1676  } catch (Exception& exception) {
1677  Console::println("SceneEditorTabController::updateReflectionEnvironmentMappingDetailsDropDown(): An error occurred: " + string(exception.what()));
1678  }
1679 }
1680 
1681 void SceneEditorTabController::setEntityDetails(const string& entityId) {
1682  auto scene = view->getScene();
1683  auto entity = scene->getEntity(entityId);
1684  if (entity == nullptr) return;
1685 
1687  string("<template id=\"details_base\" src=\"resources/engine/gui/template_details_base.xml\" />") +
1688  string("<template id=\"details_transform\" src=\"resources/engine/gui/template_details_transform.xml\" />") +
1689  string("<template id=\"details_reflections\" src=\"resources/engine/gui/template_details_reflection.xml\" />")
1690  );
1691 
1692  //
1693  try {
1694  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_base"))->getActiveConditions().add("open");
1695  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_transform"))->getActiveConditions().add("open");
1696  if ((entity->getPrototype()->getType()->getGizmoTypeMask() & Gizmo::GIZMOTYPE_ROTATE) == Gizmo::GIZMOTYPE_ROTATE) {
1697  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_transform"))->getActiveConditions().add("rotation");
1698  }
1699  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_reflections"))->getActiveConditions().add("open");
1700 
1701  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("base_name"))->getController()->setValue(entity->getId());
1702  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("base_description"))->getController()->setValue(entity->getDescription());
1703  } catch (Exception& exception) {
1704  Console::println("SceneEditorTabController::setEntityDetails(): An error occurred: " + string(exception.what()));
1705  showInfoPopUp("Warning", string(exception.what()));
1706  }
1707 
1708  //
1709  updateReflectionEnvironmentMappingDetailsDropDown(entity->getReflectionEnvironmentMappingId());
1710  updateEntityDetails(entity->getTransform());
1711 }
1712 
1713 void SceneEditorTabController::setEntityDetailsMultiple(const Vector3& pivot, const string& selectedReflectionEnvironmentMappingId) {
1714  auto scene = view->getScene();
1715 
1717  string("<template id=\"details_transform\" src=\"resources/engine/gui/template_details_transform.xml\" />") +
1718  string("<template id=\"details_reflections\" src=\"resources/engine/gui/template_details_reflection.xml\" />")
1719  );
1720 
1721  //
1722  try {
1723  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_transform"))->getActiveConditions().add("open");
1724  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_transform"))->getActiveConditions().add("rotation");
1725  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("details_reflections"))->getActiveConditions().add("open");
1726  } catch (Exception& exception) {
1727  Console::println("SceneEditorTabController::setEntityDetails(): An error occurred: " + string(exception.what()));
1728  showInfoPopUp("Warning", string(exception.what()));
1729  }
1730 
1731  //
1732  updateReflectionEnvironmentMappingDetailsDropDown(selectedReflectionEnvironmentMappingId);
1734  pivot,
1735  Vector3(),
1736  Vector3(1.0f, 1.0f, 1.0f)
1737  );
1738 }
1739 
1741  auto scene = view->getScene();
1743  transform.getTranslation(),
1744  Vector3(
1745  transform.getRotationAngle(scene->getRotationOrder()->getAxisXIndex()),
1746  transform.getRotationAngle(scene->getRotationOrder()->getAxisYIndex()),
1747  transform.getRotationAngle(scene->getRotationOrder()->getAxisZIndex())
1748  ),
1749  transform.getScale()
1750  );
1751 
1752 }
1753 
1754 void SceneEditorTabController::updateEntityDetails(const Vector3& translation, const Vector3& rotation, const Vector3& scale) {
1755  //
1756  try {
1757  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_x"))->getController()->setValue(translation.getX());
1758  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_y"))->getController()->setValue(translation.getY());
1759  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_translation_z"))->getController()->setValue(translation.getZ());
1760 
1761  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_x"))->getController()->setValue(rotation.getX());
1762  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_y"))->getController()->setValue(rotation.getY());
1763  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_rotation_z"))->getController()->setValue(rotation.getZ());
1764 
1765  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_x"))->getController()->setValue(scale.getX());
1766  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_y"))->getController()->setValue(scale.getY());
1767  required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("transform_scale_z"))->getController()->setValue(scale.getZ());
1768  } catch (Exception& exception) {
1769  Console::println("SceneEditorTabController::updateEntityDetails(): An error occurred: " + string(exception.what()));
1770  showInfoPopUp("Warning", string(exception.what()));
1771  }
1772 }
1773 
1775 
1776  string xml;
1777  xml+= "<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape("Scene") + "\" value=\"" + GUIParser::escape("scene") + "\">\n";
1778  auto scene = view->getScene();
1779  if (scene != nullptr) {
1780  basePropertiesSubController->createBasePropertiesXML(scene, xml);
1781  xml+= " <selectbox-option image=\"resources/engine/images/gui.png\" text=\"" + GUIParser::escape("GUI") + "\" value=\"" + GUIParser::escape("scene.gui") + "\" />\n";
1782  xml+= " <selectbox-option image=\"resources/engine/images/rendering.png\" text=\"Postprocessing\" value=\"scene.postprocessing\" />\n";
1783  xml+= " <selectbox-option image=\"resources/engine/images/sky.png\" text=\"Sky\" value=\"scene.sky\" />\n";
1784  {
1785  xml+= "<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape("Lights") + "\" value=\"" + GUIParser::escape("scene.lights") + "\">\n";
1786  auto i = 0;
1787  for (auto light: scene->getLights()) {
1788  xml+= " <selectbox-option image=\"resources/engine/images/light.png\" text=\"" + GUIParser::escape("Light " + to_string(i)) + "\" id=\"" + GUIParser::escape("scene.lights.light" + to_string(i)) + "\" value=\"" + GUIParser::escape("scene.lights.light" + to_string(i)) + "\" />\n";
1789  i++;
1790  }
1791  xml+= "</selectbox-parent-option>\n";
1792  }
1793  {
1794  auto sceneLibrary = scene->getLibrary();
1795  xml+= "<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape("Prototypes") + "\" value=\"" + GUIParser::escape("scene.prototypes") + "\">\n";
1796  for (auto prototype: sceneLibrary->getPrototypes()) {
1797  auto icon = getPrototypeIcon(prototype->getType());
1798  auto prototypeId = prototype->getId();
1799  auto prototypeName = prototype->getName();
1800  xml+= " <selectbox-option image=\"resources/engine/images/" + icon +"\" text=\"" + GUIParser::escape(prototypeName) + "\" value=\"" + GUIParser::escape("scene.prototypes." + to_string(prototypeId)) + "\" />\n";
1801  }
1802  xml+= "</selectbox-parent-option>\n";
1803  }
1804  {
1805  xml+= "<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape("Entities") + "\" value=\"" + GUIParser::escape("scene.entities") + "\">\n";
1806  for (auto entity: scene->getEntities()) {
1807  auto entityName = entity->getName();
1808  auto prototype = entity->getPrototype();
1809  auto icon = getPrototypeIcon(prototype->getType());
1810  if (prototype->isRenderGroups() == true) continue;
1811  xml+= " <selectbox-option image=\"resources/engine/images/" + icon + "\" text=\"" + GUIParser::escape(entityName) + "\" id=\"" + GUIParser::escape("scene.entities." + entityName) + "\" value=\"" + GUIParser::escape("scene.entities." + entityName) + "\" />\n";
1812  }
1813  xml+= "</selectbox-parent-option>\n";
1814  }
1815  }
1816  xml+= "</selectbox-parent-option>\n";
1818 }
1819 
1822 }
1823 
1825  view->getEditorView()->setDetailsContent(string());
1826 }
1827 
1828 void SceneEditorTabController::updateDetails(const string& outlinerNode) {
1829  view->getEditorView()->setDetailsContent(string());
1830  if (outlinerNode == "scene.gui") {
1831  setGUIDetails();
1832  } else
1833  if (outlinerNode == "scene.postprocessing") {
1835  } else
1836  if (outlinerNode == "scene.sky") {
1838  } else
1839  if (StringTools::startsWith(outlinerNode, "scene.lights.") == true) {
1840  auto lightIdx = Integer::parse(StringTools::substring(outlinerNode, string("scene.lights.light").size()));
1841  setLightDetails(lightIdx);
1842  } else
1843  if (StringTools::startsWith(outlinerNode, "scene.prototypes.") == true) {
1845  } else
1846  if (StringTools::startsWith(outlinerNode, "scene.entities.") == true) {
1847  auto entityId = StringTools::substring(outlinerNode, string("scene.entities.").size());
1848  setEntityDetails(entityId);
1849  } else {
1850  basePropertiesSubController->updateDetails(view->getScene(), outlinerNode);
1851  }
1852 }
1853 
1856  updateDetails("scene.entities");
1857 }
1858 
1859 void SceneEditorTabController::unselectEntity(const string& entityId) {
1860  auto outlinerSelection = StringTools::tokenize(view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
1861  vector<string> selectedEntityIds;
1862  auto entityIdToRemove = "scene.entities." + entityId;
1863  for (const auto& selectedEntityId: outlinerSelection) {
1864  if (StringTools::startsWith(selectedEntityId, "scene.entities.") == false) continue;
1865  if (selectedEntityId == entityIdToRemove) continue;
1866  selectedEntityIds.push_back(selectedEntityId);
1867  }
1868  selectEntities(selectedEntityIds);
1869 }
1870 
1871 void SceneEditorTabController::selectEntity(const string& entityId) {
1872  auto outlinerSelection = StringTools::tokenize(view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
1873  vector<string> selectedEntityIds;
1874  auto entityIdToAdd = "scene.entities." + entityId;
1875  for (const auto& selectedEntityId: outlinerSelection) {
1876  if (StringTools::startsWith(selectedEntityId, "scene.entities.") == false) continue;
1877  if (selectedEntityId == entityIdToAdd) continue;
1878  selectedEntityIds.push_back(selectedEntityId);
1879  }
1880  selectedEntityIds.push_back(entityIdToAdd);
1881  selectEntities(selectedEntityIds);
1882 }
1883 
1884 void SceneEditorTabController::selectEntities(const vector<string>& selectedOutlinerEntityIds) {
1885  if (selectedOutlinerEntityIds.empty() == true) {
1886  auto newOutlinerSelection = string("scene.entities");
1887  view->getEditorView()->getScreenController()->setOutlinerSelection(newOutlinerSelection);
1888  updateDetails(newOutlinerSelection);
1889  } else
1890  if (selectedOutlinerEntityIds.size() == 1) {
1891  auto newOutlinerSelection = string(selectedOutlinerEntityIds[0]);
1892  view->getEditorView()->getScreenController()->setOutlinerSelection(newOutlinerSelection);
1893  updateDetails(StringTools::substring(newOutlinerSelection, string("scene.entities.").size()));
1894  } else {
1895  auto newOutlinerSelection = string("|");
1896  for (const auto& entityId: selectedOutlinerEntityIds) {
1897  newOutlinerSelection+= entityId + "|";
1898  }
1899  view->getEditorView()->getScreenController()->setOutlinerSelection(newOutlinerSelection);
1900  updateDetails("scene.entities");
1901  }
1902 }
1903 
1905  class OnReplacePrototypeAction: public virtual Action
1906  {
1907  public:
1908  void performAction() override {
1909  try {
1910  auto outlinerSelection = StringTools::tokenize(sceneEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection(), "|");
1911  if (outlinerSelection.size() != 1) return;
1912  string selectedEntityId;
1913  if (StringTools::startsWith(outlinerSelection[0], "scene.entities.") == false) return;
1914  selectedEntityId = StringTools::substring(outlinerSelection[0], string("scene.entities.").size());
1915  auto scene = sceneEditorTabController->view->getScene();
1916  auto sceneLibrary = scene->getLibrary();
1917  auto selectedSceneEntity = scene->getEntity(selectedEntityId);
1918  auto prototype = selectedSceneEntity != nullptr?selectedSceneEntity->getPrototype():nullptr;
1919  if (prototype == nullptr) return;
1920  auto newPrototype = PrototypeReader::read(
1921  Prototype::ID_NONE,
1922  sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
1923  sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
1924  );
1925  sceneLibrary->addPrototype(newPrototype);
1926  sceneEditorTabController->view->clearScene();
1927  scene->replacePrototypeByIds(prototype->getId(), newPrototype->getId());
1928  sceneLibrary->removePrototype(prototype->getId());
1929  sceneEditorTabController->view->reloadScene();
1930  //
1931  sceneEditorTabController->view->getEditorView()->reloadTabOutliner("scene.entities");
1932  } catch (Exception& exception) {
1933  Console::println("OnReplacePrototypeAction::performAction(): An error occurred: " + string(exception.what()));
1934  sceneEditorTabController->showInfoPopUp("Warning", string(exception.what()));
1935  }
1936  sceneEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1937  }
1938 
1939  /**
1940  * Public constructor
1941  * @param sceneEditorTabController scene editor tab controller
1942  */
1943  OnReplacePrototypeAction(SceneEditorTabController* sceneEditorTabController)
1944  : sceneEditorTabController(sceneEditorTabController) {
1945  //
1946  }
1947 
1948  private:
1949  SceneEditorTabController* sceneEditorTabController;
1950  };
1951 
1952  auto extensions = PrototypeReader::getPrototypeExtensions();
1954  string(),
1955  "Replace prototype with: ",
1956  extensions,
1957  string(),
1958  true,
1959  new OnReplacePrototypeAction(this)
1960  );
1961 }
1962 
1963 void SceneEditorTabController::startRenameEntity(const string& entityName) {
1964  auto scene = view->getScene();
1965  auto sceneEntity = scene->getEntity(entityName);
1966  if (sceneEntity == nullptr) return;
1967  auto selectBoxOptionParentNode = dynamic_cast<GUIParentNode*>(view->getEditorView()->getScreenController()->getScreenNode()->getNodeById("scene.entities." + entityName));
1968  if (selectBoxOptionParentNode == nullptr) return;
1969  renameEntityName = entityName;
1970  selectBoxOptionParentNode->replaceSubNodes(
1971  "<template id=\"tdme.entities.rename_input\" hint=\"Property name\" text=\"" + GUIParser::escape(sceneEntity->getName()) + "\"src=\"resources/engine/gui/template_outliner_rename.xml\" />\n",
1972  true
1973  );
1974  Engine::getInstance()->getGUI()->setFoccussedNode(dynamic_cast<GUIElementNode*>(view->getEditorView()->getScreenController()->getScreenNode()->getNodeById("tdme.entities.rename_input")));
1975  view->getEditorView()->getScreenController()->getScreenNode()->forwardChange(required_dynamic_cast<GUIElementNode*>(view->getEditorView()->getScreenController()->getScreenNode()->getNodeById("selectbox_outliner")));
1976 }
1977 
1979  auto scene = view->getScene();
1980  auto sceneEntity = scene->getEntity(renameEntityName);
1981  renameEntityName.clear();
1982  if (sceneEntity != nullptr) {
1983  try {
1984  auto name = required_dynamic_cast<GUIElementNode*>(screenNode->getNodeById("tdme.entities.rename_input"))->getController()->getValue().getString();
1985  if (name.empty() == true) throw ExceptionBase("Please enter a name");
1986  if (view->applyBase(
1987  name,
1988  sceneEntity->getDescription()
1989  ) == false) {
1990  throw ExceptionBase("Could not rename entity");
1991  }
1992  view->reloadScene();
1993  } catch (Exception& exception) {
1994  Console::println("SceneEditorTabController::renameProperty(): An error occurred: " + string(exception.what()));
1995  showInfoPopUp("Warning", string(exception.what()));
1996  }
1997  }
1998 
1999  //
2000  view->getEditorView()->reloadTabOutliner("scene.entities" + (sceneEntity != nullptr?"." + sceneEntity->getName():""));
2001 }
Color 4 definition class.
Definition: Color4.h:18
Engine main class.
Definition: Engine.h:131
TDME2 engine entity shader parameters.
const ShaderParameter getShaderParameter(const string &parameterName) const
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
Shader parameter model class.
const Color4 getColor4Value() const
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
const Vector3 & getScale() const
Definition: Transform.h:71
const Vector3 & getTranslation() const
Definition: Transform.h:56
const float getRotationAngle(const int idx) const
Definition: Transform.h:146
Represents rotation orders of a model.
Definition: RotationOrder.h:23
Base property model class.
Definition: BaseProperty.h:15
Prototype definition.
Definition: Prototype.h:55
Scene entity definition.
Definition: SceneEntity.h:23
Scene prototype library definition.
Definition: SceneLibrary.h:32
Prototype * getPrototypeByName(const string &name)
Get a prototype by given name.
Definition: SceneLibrary.h:111
Prototype * getPrototype(int id)
Get a prototype by given id.
Definition: SceneLibrary.h:98
void setConstantAttenuation(float constantAttenuation)
Set up constant attenuation.
Definition: SceneLight.h:184
Scene definition.
Definition: Scene.h:50
const string & getFileName()
Definition: Scene.h:111
bool isPostProcessingShaderEnabled(const string &shaderId)
Is post processing shader enabled.
Definition: Scene.h:345
const EntityShaderParameters & getSkyShaderParameters()
Get sky shader parameters.
Definition: Scene.h:320
void setGUIFileName(const string &fileName)
Set up scene GUI file name including relative path.
Definition: Scene.h:395
SceneLight * getLightAt(int i)
Get light at given index.
Definition: Scene.h:157
SceneEntity * getEntity(const string &id)
Returns scene entity by id.
Definition: Scene.cpp:254
void enablePostProcessingShader(const string &shaderId)
Enable post processing shader.
Definition: Scene.h:353
SceneLibrary * getLibrary()
Definition: Scene.h:185
void disablePostProcessingShader(const string &shaderId)
Disable post processing shader.
Definition: Scene.h:361
const EntityShaderParameters * getPostProcessingShaderParameters(const string &shaderId)
Get post processing shader parameters.
Definition: Scene.h:370
GUI parser.
Definition: GUIParser.h:40
GUI element node conditions.
GUI node controller base class.
virtual const MutableString & getValue()=0
GUI node base class.
Definition: GUINode.h:64
const string & getToolTip()
Definition: GUINode.h:346
GUINodeController * getController()
Definition: GUINode.h:661
const string & getId()
Definition: GUINode.h:339
GUI parent node base class thats supporting child nodes.
Definition: GUIParentNode.h:42
GUI screen node that represents a screen that can be rendered via GUI system.
Definition: GUIScreenNode.h:72
void forwardChange(GUIElementNode *node)
Forward change event.
GUINode * getInnerNodeById(const string &nodeId)
Get inner GUI node by id.
GUINode * getNodeById(const string &nodeId)
Get GUI node by id.
Standard math functions.
Definition: Math.h:19
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Definition: Vector2.h:20
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
float getY() const
Definition: Vector3.h:117
float getX() const
Definition: Vector3.h:100
float getZ() const
Definition: Vector3.h:134
Vector3 & normalize()
Normalizes this vector3.
Definition: Vector3.h:239
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Definition: Vector4.h:22
void show(const Color4 &color, Action *onColorChangeAction)
Shows the pop up.
void show(int mouseX, int mouseY)
Shows the pop up.
void addMenuItem(const string &text, const string &id, Action *action=nullptr)
Add menu item.
bool isDropOnNode(int dropX, int dropY, const string &nodeId)
Is drop on node.
void setOutlinerSelection(const string &newSelectionValue)
Set outliner selection.
void browseTo(const string &fileName)
Browse to file name.
void show(const string &cwd, const string &captionText, const vector< string > &extensions, const string &fileName, bool enableFilter, Action *applyAction, Action *cancelAction=nullptr, const string &settingsFileName=".filedialog.properties", const string &settingsPathName=string())
Shows the file dialog pop up.
void show(const string &caption, const string &message)
Shows the pop up.
void show(int mouseX, int mouseY, const string &tooltip)
Show tooltip.
void setGizmoType(GizmoType gizmoType)
Set GIZMO type.
Definition: Gizmo.h:151
Pop ups controller accessor class.
Definition: PopUps.h:29
ColorPickerScreenController * getColorPickerScreenController()
Definition: PopUps.h:89
FileDialogScreenController * getFileDialogScreenController()
Definition: PopUps.h:61
TooltipScreenController * getTooltipScreenController()
Definition: PopUps.h:131
ContextMenuScreenController * getContextMenuScreenController()
Definition: PopUps.h:96
InfoDialogScreenController * getInfoDialogScreenController()
Definition: PopUps.h:75
void onContextMenuRequest(GUIElementNode *node, int mouseX, int mouseY) override
On context menu request.
void onDrop(const string &payload, int mouseX, int mouseY) override
On drop.
void updateInfoText(const MutableString &text)
Update info text line.
void save(const string &pathName, const string &fileName)
Save.
void onCommand(TabControllerCommand command) override
On command.
void updateEntityDetails(const Transform &transform)
Update entity details.
void selectEntities(const vector< string > &selectedOutlinerEntityIds)
Select exactly given entities.
void updateDetails(const string &outlinerNode)
Update details panel.
void applyPostProcessingDetails(const string &shaderId, const string &parameterName)
Apply post processing shader details.
void applySkyShaderDetails(const string &parameterName)
Apply sky shader details.
void setEntityDetailsMultiple(const Vector3 &pivot, const string &selectedReflectionEnvironmentMappingId)
Set entity details for multiple entity selection.
const string getPrototypeIcon(Prototype_Type *prototypeType)
Get prototype icon.
void showInfoPopUp(const string &caption, const string &message)
Show the information pop up / modal.
void onAction(GUIActionListenerType type, GUIElementNode *node) override
void updateReflectionEnvironmentMappingDetailsDropDown(const string &selectedReflectionEnvironmentMappingId)
Update reflection details drop down.
unique_ptr< BasePropertiesSubController > basePropertiesSubController
void onTooltipShowRequest(GUINode *node, int mouseX, int mouseY) override
On tooltip show request.
void setEntityDetails(const string &entityId)
Set entity details.
void applyTranslation(const Vector3 &translation)
Apply translation.
void placeEntity()
Places selected entity on selected object.
bool applyBase(const string &name, const string &description)
Apply base information.
void setSnapping(bool snappingEnabled, float snappingX, float snappingZ)
Set snapping.
void selectEntities(const vector< string > &entityIds)
Select entities.
void applyPostProcessingShaderParameters()
Apply post processing shader parameters.
void applyScale(const Vector3 &scale)
Apply scale.
void setPlaceEntityMode(Prototype *prototype)
Initialize place entity mode.
void applySkyShaderParameters()
Apply sky shader parameters.
void addPrototype(Prototype *prototype)
Add prototype to scene.
void applyReflectionEnvironmentMappingId(const string &reflectionEnvironmentMappingId)
Apply reflection environment mapping id.
void applyRotation(const Vector3 &rotation)
Apply rotation.
void setOutlinerAddDropDownContent(const string &xml)
Set outliner add drop down content.
Definition: EditorView.cpp:400
void setOutlinerContent(const string &xml)
Set outliner content.
Definition: EditorView.cpp:396
EditorScreenController * getScreenController()
Definition: EditorView.h:69
bool getCurrentTabViewPort(int &left, int &top, int &width, int &height, int &offsetX, int &offsetY)
Determine current tab viewport screen constraints.
Definition: EditorView.cpp:420
void setDetailsContent(const string &xml)
Set details content.
Definition: EditorView.cpp:404
bool getCurrentTabTooltipPosition(GUIScreenNode *screenNode, int mouseX, int mouseY, int &tooltipLeft, int &tooltipTop)
Determine current tab tooltip position.
Definition: EditorView.cpp:439
void reloadTabOutliner(const string &newSelectionValue=string())
Reload tab outliner.
Definition: EditorView.cpp:408
Console class.
Definition: Console.h:29
Exception base class.
Definition: ExceptionBase.h:19
Float class.
Definition: Float.h:27
Integer class.
Definition: Integer.h:25
Mutable utf8 aware string class.
Definition: MutableString.h:23
bool equals(const string &s2) const
Equals.
const string & getString() const
String tools class.
Definition: StringTools.h:22
std::exception Exception
Exception base class.
Definition: Exception.h:18
Tab controller, which connects UI with logic.
Definition: TabController.h:34
Action Interface.
Definition: Action.h:11