50 using std::make_unique;
52 using std::unique_ptr;
128 if (scene ==
nullptr)
return;
131 save(Tools::getPathName(scene->getFileName()), Tools::getFileName(scene->getFileName()));
136 class OnSceneSave:
public virtual Action
139 void performAction()
override {
140 sceneEditorTabController->save(
141 sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
142 sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
144 sceneEditorTabController->popUps->getFileDialogScreenController()->close();
147 OnSceneSave(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
155 if (scene ==
nullptr)
return;
158 vector<string> extensions = {
162 Tools::getPathName(fileName),
165 Tools::getFileName(fileName),
167 new OnSceneSave(
this)
172 showInfoPopUp(
"Warning",
"This command is not supported yet");
178 if (StringTools::startsWith(payload,
"file:") ==
false) {
181 auto fileName = StringTools::substring(payload,
string(
"file:").size());
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));
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()));
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;
197 auto tabMouseX = (mouseX - left) / xScale + offsetX;
198 auto tabMouseY = (mouseY - top) / yScale + offsetY;
199 if (tabMouseX < 0 || tabMouseX >= width || tabMouseX < 0 || tabMouseY >= height) {
205 auto prototype = unique_ptr<Prototype>(
206 PrototypeReader::read(
207 Tools::getPathName(fileName),
208 Tools::getFileName(fileName)
211 prototype->setEmbedded(
false);
214 if (libraryPrototype ==
nullptr) {
216 libraryPrototype = prototype.release();
220 if (libraryPrototype->getType() != Prototype_Type::TERRAIN &&
222 showInfoPopUp(
"Warning",
"Could not place prototype entity.");
225 Console::println(
"SceneEditorTabController::onDrop(): An error occurred: " +
string(exception.what()));
230 showInfoPopUp(
"Warning",
"Could not place prototype entity.");
239 if (scene ==
nullptr)
return;
249 Console::println(
"SceneEditorTabController::save(): An error occurred: " +
string(exception.what()));
267 if (node->
getId() ==
"dropdown_outliner_add") {
271 if (node->
getId() ==
"selectbox_outliner") {
273 vector<string> selectedEntityIds;
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()));
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) {
309 if (StringTools::startsWith(node->
getId(),
"sky.shader.") ==
true) {
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();
318 if (shaderParameterName.empty() ==
true) {
331 if (node->
getId() == applyTranslationNode) {
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())
342 Console::println(
"SceneEditorTabController::onChange(): An error occurred: " +
string(exception.what()));
350 if (node->
getId() == applyRotationNode) {
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())
361 Console::println(
"SceneEditorTabController::onChange(): An error occurred: " +
string(exception.what()));
369 if (node->
getId() == applyScaleNode) {
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())
380 Console::println(
"SceneEditorTabController::onChange(): An error occurred: " +
string(exception.what()));
388 if (node->
getId() == applyReflectionEnvironmentMappingNode) {
393 Console::println(
"SceneEditorTabController::onChange(): An error occurred: " +
string(exception.what()));
401 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
402 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
404 if (node->
getId() == applyLightNode) {
422 if (node->
getId() ==
"tdme.entities.rename_input") {
426 if (node->
getId() == applyBaseNode) {
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");
433 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"base_description"))->getController()->getValue().getString()
438 Console::println(
"SceneEditorTabController::onChange(): An error occurred: " +
string(exception.what()));
449 if (node->
getId() ==
"selectbox_outliner") {
451 if (outlinerNode ==
"scene.lights") {
456 class OnAddLightAction:
public virtual Action
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);
466 sceneEditorTabController->view->getEditorView()->reloadTabOutliner(
"scene.lights.light" + to_string(light->getId()));
468 OnAddLightAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
478 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
482 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
484 if (scene ==
nullptr)
return;
487 if (scene->getLightCount() < 2)
return;
490 class OnDeleteLightAction:
public virtual Action
493 void performAction()
override {
494 auto scene = sceneEditorTabController->view->getScene();
495 if (scene ==
nullptr)
return;
496 scene->removeLightAt(lightIdx);
498 sceneEditorTabController->view->getEditorView()->reloadTabOutliner(
"scene.lights");
500 OnDeleteLightAction(
SceneEditorTabController* sceneEditorTabController,
int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
511 if (StringTools::startsWith(outlinerNode,
"scene.entities.") ==
true) {
516 class OnCenterAction:
public virtual Action
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);
527 OnCenterAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
536 class OnCenterAction:
public virtual Action
539 void performAction()
override {
540 sceneEditorTabController->view->centerEntities();
542 OnCenterAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
551 class OnSelectSameAction:
public virtual Action
554 void performAction()
override {
555 sceneEditorTabController->view->selectSameEntities();
557 OnSelectSameAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
566 class OnOpenPrototype:
public virtual Action
569 void performAction()
override {
570 sceneEditorTabController->view->openPrototype();
572 OnOpenPrototype(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
581 class OnReplacePrototypeAction:
public virtual Action
584 void performAction()
override {
585 sceneEditorTabController->onReplacePrototype();
587 OnReplacePrototypeAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
596 class JumpToPrototypeAction:
public virtual Action
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());
611 JumpToPrototypeAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
620 class OnDeleteAction:
public virtual Action
623 void performAction()
override {
624 sceneEditorTabController->view->removeEntities();
626 OnDeleteAction(
SceneEditorTabController* sceneEditorTabController): sceneEditorTabController(sceneEditorTabController) {
643 int tooltipLeft, tooltipTop;
666 if (node->
getId() ==
"menu_view_scene_run") {
669 if (node->
getId() ==
"menu_view_scene_stop") {
672 if (node->
getId() ==
"tdme.entities.rename_input") {
675 if (StringTools::startsWith(node->
getId(),
"sky.shader.") ==
true &&
676 StringTools::endsWith(node->
getId(),
"_color_edit") ==
true) {
678 auto shaderParameterName = StringTools::substring(node->
getId(),
string(
"sky.shader.").size(), node->
getId().size() -
string(
"_color_edit").size());
682 class OnColorChangeAction:
public virtual Action
685 void performAction()
override {
687 auto view = sceneEditorTabController->getView();
691 auto color4 = sceneEditorTabController->popUps->getColorPickerScreenController()->getColor();
692 shaderParameters.setShaderParameter(shaderParameterName, color4);
694 required_dynamic_cast<GUIImageNode*>(sceneEditorTabController->screenNode->getNodeById(
"sky.shader." + shaderParameterName +
"_color"))->setEffectColorMul(color4);
696 Console::println(
"SceneEditorTabController::onAction(): An error occurred: " +
string(exception.what()));
697 sceneEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
700 scene->setSkyShaderParameters(shaderParameters);
703 OnColorChangeAction(
SceneEditorTabController* sceneEditorTabController,
const string& shaderParameterName): sceneEditorTabController(sceneEditorTabController), shaderParameterName(shaderParameterName) {
707 string shaderParameterName;
713 if (StringTools::startsWith(node->
getId(),
"postprocessing.shader.") ==
true &&
714 StringTools::endsWith(node->
getId(),
"_color_edit") ==
true) {
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();
721 auto parameter = shaderParameters !=
nullptr?shaderParameters->
getShaderParameter(shaderParameterName):Engine::getDefaultShaderParameter(shaderId, shaderParameterName);
722 auto color4 = parameter.getColor4Value();
724 class OnColorChangeAction:
public virtual Action
727 void performAction()
override {
729 auto view = sceneEditorTabController->getView();
733 auto parameter = shaderParametersPtr !=
nullptr?shaderParametersPtr->getShaderParameter(parameterName):Engine::getDefaultShaderParameter(shaderId, parameterName);
734 auto color4 = sceneEditorTabController->popUps->getColorPickerScreenController()->getColor();
735 shaderParameters.setShaderParameter(parameterName, color4);
737 required_dynamic_cast<GUIImageNode*>(sceneEditorTabController->screenNode->getNodeById(
"postprocessing.shader." + shaderId +
"." + parameterName +
"_color"))->setEffectColorMul(color4);
739 Console::println(
"SceneEditorTabController::onAction(): An error occurred: " +
string(exception.what()));
740 sceneEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
743 scene->setPostProcessingShaderParameters(shaderId, shaderParameters);
746 OnColorChangeAction(
SceneEditorTabController* sceneEditorTabController,
const string& shaderId,
const string& parameterName): sceneEditorTabController(sceneEditorTabController), shaderId(shaderId), parameterName(parameterName) {
751 string parameterName;
757 if (node->
getId() ==
"gui_open") {
758 class OnLoadGUIAction:
public virtual Action
761 void performAction()
override {
763 sceneEditorTabController->setGUIFileName(
764 sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName() +
766 sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
769 Console::println(
"OnLoadGUIAction::performAction(): An error occurred: " +
string(exception.what()));
770 sceneEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
772 sceneEditorTabController->setGUIDetails();
773 sceneEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
781 : sceneEditorTabController(sceneEditorTabController) {
795 new OnLoadGUIAction(
this)
798 if (node->
getId() ==
"gui_remove") {
802 if (node->
getId() ==
"gui_browseto") {
804 if (scene->getGUIFileName().empty() ==
true) {
810 if (node->
getId() ==
"prototype_place") {
812 auto prototypeId = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.prototypes.").size()));
815 auto prototype = sceneLibrary->
getPrototype(prototypeId);
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
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);
832 OnColorChangeAction(
SceneEditorTabController* sceneEditorTabController,
int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
839 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
840 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
842 if (scene ==
nullptr)
return;
844 if (light ==
nullptr)
return;
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
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);
862 OnColorChangeAction(
SceneEditorTabController* sceneEditorTabController,
int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
869 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
870 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
872 if (scene ==
nullptr)
return;
874 if (light ==
nullptr)
return;
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
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);
892 OnColorChangeAction(
SceneEditorTabController* sceneEditorTabController,
int lightIdx): sceneEditorTabController(sceneEditorTabController), lightIdx(lightIdx) {
899 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
900 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
902 if (scene ==
nullptr)
return;
904 if (light ==
nullptr)
return;
917 "<template id=\"details_sky\" src=\"resources/engine/gui/template_details_sky.xml\" />\n"
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:
929 auto parameterValue = parameter.getValueAsString();
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()) +
"\" " +
942 case ShaderParameter::TYPE_INTEGER:
944 auto parameterValue = parameter.getValueAsString();
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()) +
"\" " +
956 case ShaderParameter::TYPE_BOOLEAN:
958 auto parameterValue = parameter.getValueAsString();
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 +
"\" " +
967 case ShaderParameter::TYPE_VECTOR2:
969 auto vec2 = parameter.getVector2Value();
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()) +
"\" " +
985 case ShaderParameter::TYPE_VECTOR3:
987 auto vec3 = parameter.getVector3Value();
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()) +
"\" " +
1007 case ShaderParameter::TYPE_VECTOR4:
1009 auto vec4 = parameter.getVector4Value();
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()) +
"\" " +
1033 case ShaderParameter::TYPE_COLOR4:
1036 "<template name=\"" + GUIParser::escape(parameterName) +
"\" "
1037 "id=\"" + GUIParser::escape(
"sky.shader." + parameterName) +
"\" " +
1038 "src=\"resources/engine/gui/template_details_rendering_shader_color4.xml\" " +
1042 case ShaderParameter::TYPE_NONE:
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);
1051 for (
const auto& parameterName: Engine::getShaderParameterNames(
"sky")) {
1052 auto parameter = scene->getSkyShaderParameters().getShaderParameter(parameterName);
1053 switch (parameter.getType()) {
1054 case ShaderParameter::TYPE_COLOR4:
1056 auto color4 = parameter.getColor4Value();
1057 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"sky.shader." + parameterName +
"_color"))->setEffectColorMul(color4);
1065 Console::println(
"SceneEditorTabController::setSkyShaderDetails(): An error occurred: " +
string(exception.what()));
1072 "<template id=\"details_postprocessing\" src=\"resources/engine/gui/template_details_postprocessing.xml\" />\n"
1076 for (
const auto& shaderId: Engine::getRegisteredShader(Engine::SHADERTYPE_POSTPROCESSING,
false)) {
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 +
"\" " +
1090 auto shaderParameters = scene->getPostProcessingShaderParameters(shaderId);
1092 for (
const auto& parameterName: Engine::getShaderParameterNames(shaderId)) {
1093 auto parameterDefaults = Engine::getDefaultShaderParameter(shaderId, parameterName);
1094 if (parameterDefaults ==
nullptr)
continue;
1096 auto parameter = shaderParameters !=
nullptr?shaderParameters->getShaderParameter(parameterName):parameterDefaults->value;
1098 switch (parameter.getType()) {
1099 case ShaderParameter::TYPE_FLOAT:
1101 auto parameterValue = parameter.getValueAsString();
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()) +
"\" " +
1114 case ShaderParameter::TYPE_INTEGER:
1116 auto parameterValue = parameter.getValueAsString();
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()) +
"\" " +
1128 case ShaderParameter::TYPE_BOOLEAN:
1130 auto parameterValue = parameter.getValueAsString();
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 +
"\" " +
1139 case ShaderParameter::TYPE_VECTOR2:
1141 auto vec2 = parameter.getVector2Value();
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()) +
"\" " +
1157 case ShaderParameter::TYPE_VECTOR3:
1159 auto vec3 = parameter.getVector3Value();
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()) +
"\" " +
1179 case ShaderParameter::TYPE_VECTOR4:
1181 auto vec4 = parameter.getVector4Value();
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()) +
"\" " +
1205 case ShaderParameter::TYPE_COLOR4:
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\" " +
1214 case ShaderParameter::TYPE_NONE:
1219 xml+=
"<space height=\"1\" width=\"100%\" border-top=\"1\" border-color=\"{$color.element_frame}\" />";
1222 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_postprocessing"))->getActiveConditions().add(
"open");
1223 required_dynamic_cast<GUIParentNode*>(
screenNode->
getNodeById(
"postprocessing_details"))->addSubNodes(xml,
false);
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:
1231 auto color4 = parameter.getColor4Value();
1232 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"postprocessing.shader." + shaderId +
"." + parameterName +
"_color"))->setEffectColorMul(color4);
1240 Console::println(
"SceneEditorTabController::setPostProcessingDetails(): An error occurred: " +
string(exception.what()));
1253 switch (parameter.getType()) {
1254 case ShaderParameter::TYPE_FLOAT:
1255 shaderParameters.setShaderParameter(
1258 Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"sky.shader." + parameterName))->getController()->getValue().getString())
1262 case ShaderParameter::TYPE_INTEGER:
1263 shaderParameters.setShaderParameter(
1266 Integer::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"sky.shader." + parameterName))->getController()->getValue().getString())
1270 case ShaderParameter::TYPE_BOOLEAN:
1271 shaderParameters.setShaderParameter(
1274 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"sky.shader." + parameterName))->getController()->getValue().getString() ==
"1"
1278 case ShaderParameter::TYPE_VECTOR2:
1279 shaderParameters.setShaderParameter(
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())
1289 case ShaderParameter::TYPE_VECTOR3:
1290 shaderParameters.setShaderParameter(
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())
1301 case ShaderParameter::TYPE_VECTOR4:
1302 shaderParameters.setShaderParameter(
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())
1314 case ShaderParameter::TYPE_COLOR4:
1316 case ShaderParameter::TYPE_NONE:
1320 Console::println(
"SceneEditorTabController::applySkyShaderDetails(): An error occurred: " +
string(exception.what()));
1324 scene->setSkyShaderParameters(shaderParameters);
1333 shaderParameters.setShader(shaderId);
1334 auto shaderParameterDefaults = Engine::getDefaultShaderParameter(shaderId, parameterName);
1335 if (shaderParameterDefaults ==
nullptr)
return;
1338 auto parameter = shaderParameters.getShaderParameter(parameterName);
1339 switch (shaderParameterDefaults->value.getType()) {
1340 case ShaderParameter::TYPE_FLOAT:
1341 shaderParameters.setShaderParameter(
1344 Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"postprocessing.shader." + shaderId +
"." + parameterName))->getController()->getValue().getString())
1348 case ShaderParameter::TYPE_INTEGER:
1349 shaderParameters.setShaderParameter(
1352 Integer::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"postprocessing.shader." + shaderId +
"." + parameterName))->getController()->getValue().getString())
1356 case ShaderParameter::TYPE_BOOLEAN:
1357 shaderParameters.setShaderParameter(
1360 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"postprocessing.shader." + shaderId +
"." + parameterName))->getController()->getValue().getString() ==
"1"
1364 case ShaderParameter::TYPE_VECTOR2:
1365 shaderParameters.setShaderParameter(
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())
1375 case ShaderParameter::TYPE_VECTOR3:
1376 shaderParameters.setShaderParameter(
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())
1387 case ShaderParameter::TYPE_VECTOR4:
1388 shaderParameters.setShaderParameter(
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())
1400 case ShaderParameter::TYPE_COLOR4:
1402 case ShaderParameter::TYPE_NONE:
1406 Console::println(
"SceneEditorTabController::applyPostProcessingDetails(): An error occurred: " +
string(exception.what()));
1410 scene->setPostProcessingShaderParameters(shaderId, shaderParameters);
1419 string(
"<template id=\"details_gui\" src=\"resources/engine/gui/template_details_gui.xml\" />")
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());
1428 Console::println(
"SceneEditorTabController::setGUIDetails(): An error occurred: " +
string(exception.what()));
1435 if (scene ==
nullptr)
return;
1442 if (scene ==
nullptr)
return;
1449 if (scene ==
nullptr)
return;
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;
1459 string(
"<template id=\"details_light\" src=\"resources/engine/gui/template_details_light.xml\" />")
1465 auto spotDirection = light->getSpotDirection().computeLengthSquared() < Math::square(Math::EPSILON)?
Vector3(0.0f, -1.0f, 1.0f):light->getSpotDirection().clone().normalize();
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()));
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()));
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()));
1494 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_light"))->getActiveConditions().add(
"open");
1495 switch (lightType) {
1496 case LIGHTTYPE_AMBIENT:
1499 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"light_type_details"))->getActiveConditions().set(
"ambient");
1502 case LIGHTTYPE_SPOTLIGHT:
1505 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"light_type_details"))->getActiveConditions().set(
"spot");
1508 case LIGHTTYPE_DIRECTIONAL:
1511 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"light_type_details"))->getActiveConditions().set(
"directional");
1516 Console::println(
"SceneEditorTabController::setLightDetails(): An error occurred: " +
string(exception.what()));
1526 if (scene ==
nullptr)
return;
1528 if (light ==
nullptr)
return;
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()));
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()));
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()));
1546 Console::println(
"SceneEditorTabController::updateLightDetails(): An error occurred: " +
string(exception.what()));
1557 if (scene ==
nullptr)
return;
1559 if (light ==
nullptr)
return;
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())) {
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);
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()));
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()),
1594 light->setSpotDirection(
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())
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()));
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()));
1614 light->getPosition().getX(),
1615 light->getPosition().getY(),
1616 light->getPosition().getZ(),
1620 light->setSpotDirection(
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())
1627 light->setSpotCutOff(180.0f);
1628 light->setSpotExponent(0.0f);
1633 Console::println(
"SceneEditorTabController::applyLightDetails(): An error occurred: " +
string(exception.what()));
1645 string(
"<template id=\"details_prototype\" src=\"resources/engine/gui/template_details_prototype.xml\" />")
1650 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_prototype"))->getActiveConditions().add(
"open");
1652 Console::println(
"SceneEditorTabController::setEntityDetails(): An error occurred: " +
string(exception.what()));
1659 if (scene ==
nullptr)
return;
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) +
1668 GUIParser::escape(environmentMappingId) +
1670 (selectedReflectionEnvironmentMappingId == environmentMappingId?
"selected=\"true\" ":
"") +
1675 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"reflection_environmentmap"))->replaceSubNodes(reflectionEnvironmentMappingIdsXML,
true);
1677 Console::println(
"SceneEditorTabController::updateReflectionEnvironmentMappingDetailsDropDown(): An error occurred: " +
string(exception.what()));
1683 auto entity = scene->
getEntity(entityId);
1684 if (entity ==
nullptr)
return;
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\" />")
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");
1699 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_reflections"))->getActiveConditions().add(
"open");
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());
1704 Console::println(
"SceneEditorTabController::setEntityDetails(): An error occurred: " +
string(exception.what()));
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\" />")
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");
1727 Console::println(
"SceneEditorTabController::setEntityDetails(): An error occurred: " +
string(exception.what()));
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());
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());
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());
1769 Console::println(
"SceneEditorTabController::updateEntityDetails(): An error occurred: " +
string(exception.what()));
1777 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Scene") +
"\" value=\"" + GUIParser::escape(
"scene") +
"\">\n";
1779 if (scene !=
nullptr) {
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";
1785 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Lights") +
"\" value=\"" + GUIParser::escape(
"scene.lights") +
"\">\n";
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";
1791 xml+=
"</selectbox-parent-option>\n";
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()) {
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";
1802 xml+=
"</selectbox-parent-option>\n";
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();
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";
1813 xml+=
"</selectbox-parent-option>\n";
1816 xml+=
"</selectbox-parent-option>\n";
1830 if (outlinerNode ==
"scene.gui") {
1833 if (outlinerNode ==
"scene.postprocessing") {
1836 if (outlinerNode ==
"scene.sky") {
1839 if (StringTools::startsWith(outlinerNode,
"scene.lights.") ==
true) {
1840 auto lightIdx = Integer::parse(StringTools::substring(outlinerNode,
string(
"scene.lights.light").size()));
1843 if (StringTools::startsWith(outlinerNode,
"scene.prototypes.") ==
true) {
1846 if (StringTools::startsWith(outlinerNode,
"scene.entities.") ==
true) {
1847 auto entityId = StringTools::substring(outlinerNode,
string(
"scene.entities.").size());
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);
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);
1880 selectedEntityIds.push_back(entityIdToAdd);
1885 if (selectedOutlinerEntityIds.empty() ==
true) {
1886 auto newOutlinerSelection = string(
"scene.entities");
1890 if (selectedOutlinerEntityIds.size() == 1) {
1891 auto newOutlinerSelection = string(selectedOutlinerEntityIds[0]);
1893 updateDetails(StringTools::substring(newOutlinerSelection,
string(
"scene.entities.").size()));
1895 auto newOutlinerSelection = string(
"|");
1896 for (
const auto& entityId: selectedOutlinerEntityIds) {
1897 newOutlinerSelection+= entityId +
"|";
1905 class OnReplacePrototypeAction:
public virtual Action
1908 void performAction()
override {
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(
1922 sceneEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
1923 sceneEditorTabController->popUps->getFileDialogScreenController()->getFileName()
1925 sceneLibrary->addPrototype(newPrototype);
1926 sceneEditorTabController->view->clearScene();
1927 scene->replacePrototypeByIds(prototype->getId(), newPrototype->getId());
1928 sceneLibrary->removePrototype(prototype->getId());
1929 sceneEditorTabController->view->reloadScene();
1931 sceneEditorTabController->view->getEditorView()->reloadTabOutliner(
"scene.entities");
1933 Console::println(
"OnReplacePrototypeAction::performAction(): An error occurred: " +
string(exception.what()));
1934 sceneEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
1936 sceneEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1944 : sceneEditorTabController(sceneEditorTabController) {
1952 auto extensions = PrototypeReader::getPrototypeExtensions();
1955 "Replace prototype with: ",
1959 new OnReplacePrototypeAction(
this)
1965 auto sceneEntity = scene->
getEntity(entityName);
1966 if (sceneEntity ==
nullptr)
return;
1968 if (selectBoxOptionParentNode ==
nullptr)
return;
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",
1982 if (sceneEntity !=
nullptr) {
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");
1988 sceneEntity->getDescription()
1994 Console::println(
"SceneEditorTabController::renameProperty(): An error occurred: " +
string(exception.what()));
Color 4 definition class.
TDME2 engine entity shader parameters.
const ShaderParameter getShaderParameter(const string ¶meterName) 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
Represents rotation orders of a model.
Base property model class.
Scene prototype library definition.
Prototype * getPrototypeByName(const string &name)
Get a prototype by given name.
Prototype * getPrototype(int id)
Get a prototype by given id.
void setConstantAttenuation(float constantAttenuation)
Set up constant attenuation.
const string & getFileName()
bool isPostProcessingShaderEnabled(const string &shaderId)
Is post processing shader enabled.
const EntityShaderParameters & getSkyShaderParameters()
Get sky shader parameters.
void setGUIFileName(const string &fileName)
Set up scene GUI file name including relative path.
SceneLight * getLightAt(int i)
Get light at given index.
SceneEntity * getEntity(const string &id)
Returns scene entity by id.
void enablePostProcessingShader(const string &shaderId)
Enable post processing shader.
SceneLibrary * getLibrary()
void disablePostProcessingShader(const string &shaderId)
Disable post processing shader.
const EntityShaderParameters * getPostProcessingShaderParameters(const string &shaderId)
Get post processing shader parameters.
GUI element node conditions.
GUI node controller base class.
virtual const MutableString & getValue()=0
const string & getToolTip()
GUINodeController * getController()
GUI parent node base class thats supporting child nodes.
GUI screen node that represents a screen that can be rendered via GUI system.
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.
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Vector3 & normalize()
Normalizes this vector3.
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Mutable utf8 aware string class.
bool equals(const string &s2) const
Equals.
const string & getString() const
std::exception Exception
Exception base class.