5 #include <unordered_map>
63 using std::make_unique;
65 using std::unique_ptr;
66 using std::unordered_map;
158 if (fileName.empty() ==
true)
throw ExceptionBase(
"Could not save file. No filename known");
160 Tools::getPathName(fileName),
161 Tools::getFileName(fileName)
170 class OnModelSave:
public virtual Action
173 void performAction()
override {
175 modelEditorTabController->view->saveFile(
176 modelEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
177 modelEditorTabController->popUps->getFileDialogScreenController()->getFileName()
180 modelEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
182 modelEditorTabController->popUps->getFileDialogScreenController()->close();
189 OnModelSave(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
197 if (fileName.length() == 0) {
199 if (StringTools::endsWith(StringTools::toLowerCase(fileName),
".tmodel") ==
false) {
200 fileName = Tools::removeFileExtension(fileName) +
".tmodel";
203 vector<string> extensions = {
207 Tools::getPathName(fileName),
210 Tools::getFileName(fileName),
212 new OnModelSave(
this)
217 showInfoPopUp(
"Warning",
"This command is not supported yet");
226 if (StringTools::startsWith(payload,
"file:") ==
false) {
229 auto fileName = StringTools::substring(payload,
string(
"file:").size());
231 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
232 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
238 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
239 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
245 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
246 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
252 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
253 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
259 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
260 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
266 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
267 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
273 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
274 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
280 if (Tools::hasFileExtension(fileName, TextureReader::getTextureExtensions()) ==
false) {
281 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(TextureReader::getTextureExtensions()));
287 if (Tools::hasFileExtension(fileName, ModelReader::getModelExtensions()) ==
false) {
288 showInfoPopUp(
"Warning",
"You can not drop this file here. Allowed file extensions are " + Tools::enumerateFileExtensions(ModelReader::getModelExtensions()));
299 for (
const auto& [nodeId, node]: subNodes) {
301 if (node->isJoint() ==
true) {
304 if (node->isEmpty() ==
true) {
309 if (node->getSubNodes().empty() ==
false) {
310 xml+=
"<selectbox-parent-option image=\"resources/engine/images/" + image +
"\" text=\"" + GUIParser::escape(node->getId()) +
"\" value=\"" + GUIParser::escape(prefix +
".nodes." + node->getId()) +
"\">\n";
312 xml+=
"</selectbox-parent-option>\n";
314 xml+=
" <selectbox-option image=\"resources/engine/images/" + image +
"\" text=\"" + GUIParser::escape(node->getId()) +
"\" value=\"" + GUIParser::escape(prefix +
".nodes." + node->getId()) +
"\" />\n";
321 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Prototype") +
"\" value=\"" + GUIParser::escape(
"prototype") +
"\">\n";
323 if (prototype !=
nullptr) {
329 for (
auto lodLevel = 1; lodLevel < 5; lodLevel++) {
330 Model* model =
nullptr;
333 model = prototype->getModel();
336 model = prototype->getLODLevel2() !=
nullptr?prototype->getLODLevel2()->getModel():
nullptr;
337 if (prototype->getLODLevel2() ==
nullptr)
continue;
340 model = prototype->getLODLevel3() !=
nullptr?prototype->getLODLevel3()->getModel():
nullptr;
341 if (prototype->getLODLevel3() ==
nullptr)
continue;
345 if (prototype->getImposterLOD() ==
nullptr)
continue;
348 auto modelPrefix = lodLevel == 1?
"model":
"lod" + to_string(lodLevel) +
".model";
350 if (model !=
nullptr) {
351 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(lodLevel != 1?
"LOD " + to_string(lodLevel) +
" Model":
"Model") +
"\" value=\"" + GUIParser::escape(modelPrefix) +
"\">\n";
353 xml+=
"<selectbox-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(lodLevel != 1?
"LOD " + to_string(lodLevel) +
" Model":
"Model") +
"\" value=\"" + GUIParser::escape(modelPrefix) +
"\" />\n";
355 if (model !=
nullptr) {
356 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Materials") +
"\" value=\"" + GUIParser::escape(modelPrefix +
".materials") +
"\">\n";
358 xml+=
" <selectbox-option image=\"resources/engine/images/material.png\" text=\"" + GUIParser::escape(materialId) +
"\" value=\"" + GUIParser::escape(modelPrefix +
".materials." + materialId) +
"\" />\n";
360 xml+=
"</selectbox-parent-option>\n";
362 if (model !=
nullptr && model->
getSubNodes().empty() ==
false) {
363 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Nodes") +
"\" value=\"" + GUIParser::escape(modelPrefix +
".nodes") +
"\">\n";
365 xml+=
"</selectbox-parent-option>\n";
367 if (model !=
nullptr &&
369 xml+=
"<selectbox-parent-option image=\"resources/engine/images/folder.png\" text=\"" + GUIParser::escape(
"Animations") +
"\" value=\"" + GUIParser::escape(modelPrefix +
".animations") +
"\">\n";
371 if (animationSetupId == Model::ANIMATIONSETUP_DEFAULT)
continue;
372 xml+=
" <selectbox-option image=\"resources/engine/images/animation.png\" text=\"" + GUIParser::escape(animationSetupId) +
"\" id=\"" + GUIParser::escape(modelPrefix +
".animations." + animationSetupId) +
"\" value=\"" + GUIParser::escape(modelPrefix +
".animations." + animationSetupId) +
"\" />\n";
374 xml+=
"</selectbox-parent-option>\n";
376 if (model !=
nullptr) xml+=
"</selectbox-parent-option>\n";
379 xml+=
"</selectbox-parent-option>\n";
385 string(
"<dropdown-option text=\"Property\" value=\"property\" />\n") +
386 string(
"<dropdown-option text=\"BV\" value=\"boundingvolume\" />\n") +
387 string(
"<dropdown-option text=\"Sound\" value=\"sound\" />\n") +
388 string(
"<dropdown-option text=\"Animation\" value=\"animation\" />\n") +
389 string(
"<dropdown-option text=\"LOD\" value=\"lod\" />\n") +
390 string(
"<dropdown-option text=\"LOD None\" value=\"lod_none\" />\n")
400 if (prototype ==
nullptr)
return nullptr;
405 if (prototypeLodLevel ==
nullptr) {
406 auto newPrototypeLodLevel = make_unique<PrototypeLODLevel>(
407 LODObject::LODLEVELTYPE_NONE,
412 prototype->setLODLevel2(newPrototypeLodLevel.get());
413 prototypeLodLevel = newPrototypeLodLevel.release();
415 return prototypeLodLevel;
419 auto prototypeLodLevel = prototype->getLODLevel3();
420 if (prototypeLodLevel ==
nullptr) {
421 auto newPrototypeLodLevel = make_unique<PrototypeLODLevel>(
422 LODObject::LODLEVELTYPE_NONE,
427 prototype->setLODLevel3(newPrototypeLodLevel.get());
428 prototypeLodLevel = newPrototypeLodLevel.release();
430 return prototypeLodLevel;
437 Model* model =
nullptr;
442 default: model =
nullptr;
449 string outlinerNodeModel;
450 Model* model =
nullptr;
458 string outlinerNodeModel;
459 Model* model =
nullptr;
461 if (model ==
nullptr)
return nullptr;
462 if (StringTools::startsWith(outlinerNodeModel,
"model.materials.") ==
true) {
463 materialId = StringTools::substring(outlinerNodeModel,
string(
"model.materials.").size(), outlinerNode.size());
467 auto materialIt = model->
getMaterials().find(materialId);
468 return materialIt != model->
getMaterials().end()?materialIt->second:
nullptr;
474 string outlinerNodeModel;
475 Model* model =
nullptr;
477 if (model ==
nullptr)
return nullptr;
478 if (StringTools::startsWith(outlinerNodeModel,
"model.animations.") ==
true) {
479 animationId = StringTools::substring(outlinerNodeModel,
string(
"model.animations.").size(), outlinerNode.size());
508 class OnModelLoad:
public virtual Action
512 void performAction()
override {
513 modelEditorTabController->view->loadModel(
514 modelEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
515 modelEditorTabController->popUps->getFileDialogScreenController()->getFileName()
517 modelEditorTabController->popUps->getFileDialogScreenController()->close();
524 OnModelLoad(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
534 ModelReader::getModelExtensions(),
537 new OnModelLoad(
this)
543 class OnModelReimport:
public virtual Action
547 void performAction()
override {
548 modelEditorTabController->view->reimportModel(
549 modelEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
550 modelEditorTabController->popUps->getFileDialogScreenController()->getFileName()
552 modelEditorTabController->popUps->getFileDialogScreenController()->close();
559 OnModelReimport(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
568 "Reimport model from: ",
569 ModelReader::getModelExtensions(),
572 new OnModelReimport(
this)
587 class OnLODLoad:
public virtual Action
591 void performAction()
override {
594 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
595 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
598 if (prototypeLODLevel ==
nullptr)
return;
600 modelEditorTabController->view->setLODLevel(1);
606 modelEditorTabController->popUps->getFileDialogScreenController()->getPathName(),
607 modelEditorTabController->popUps->getFileDialogScreenController()->getFileName()
611 Console::println(
"OnLODLoad::performAction(): An error occurred: " +
string(exception.what()));
612 modelEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
615 modelEditorTabController->view->setLODLevel(lodLevel);
616 modelEditorTabController->view->getEditorView()->reloadTabOutliner(
"lod" + to_string(lodLevel) +
".model");
617 modelEditorTabController->popUps->getFileDialogScreenController()->close();
626 OnLODLoad(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype,
int lodLevel): modelEditorTabController(modelEditorTabController), prototype(prototype), lodLevel(lodLevel) {
637 "Load LOD " + to_string(lodLevel) +
" model from: ",
638 ModelReader::getModelExtensions(),
656 "<template id=\"details_material_base\" src=\"resources/engine/gui/template_details_material.xml\" />\n"
660 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_material_base"))->getActiveConditions().add(
"open");
662 Console::println(
"ModelEditorTabController::setMaterialBaseDetails(): An error occurred: " +
string(exception.what()));
672 if (model ==
nullptr)
return;
675 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"material_specular_embedtextures_enabled"))->getController()->setValue(
MutableString(model->hasEmbeddedSpecularTextures() ==
true?
"1":
""));
676 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"material_pbr_embedtextures_enabled"))->getController()->setValue(
MutableString(model->hasEmbeddedPBRTextures() ==
true?
"1":
""));
677 auto shaderModel = model->getShaderModel();
678 if (shaderModel == ShaderModel::SPECULAR) {
681 if (shaderModel == ShaderModel::PBR) {
684 if (shaderModel == ShaderModel::SPECULARPBR) {
688 Console::println(
"ModelEditorTabController::updateMaterialBaseDetails(): An error occurred: " +
string(exception.what()));
695 if (model ==
nullptr)
return;
699 model->setEmbedSpecularTextures(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"material_specular_embedtextures_enabled"))->getController()->getValue().getString() ==
"1");
700 model->setEmbedPBRTextures(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"material_pbr_embedtextures_enabled"))->getController()->getValue().getString() ==
"1");
701 auto shaderModel = required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"material_lightningmodel"))->getController()->getValue().getString();
702 if (shaderModel ==
"specular") {
703 model->setShaderModel(ShaderModel::SPECULAR);
705 if (shaderModel ==
"pbr") {
706 model->setShaderModel(ShaderModel::PBR);
708 if (shaderModel ==
"specularpbr") {
709 model->setShaderModel(ShaderModel::SPECULARPBR);
712 Console::println(
"ModelEditorTabController::applyMaterialBaseDetails(): An error occurred: " +
string(exception.what()));
722 if (material ==
nullptr)
return;
724 if (model ==
nullptr)
return;
726 auto specularMaterialProperties = material->getSpecularMaterialProperties();
727 auto pbrMaterialProperties = material->getPBRMaterialProperties();
730 string(
"<template id=\"details_material_spec\" src=\"resources/engine/gui/template_details_material_specular.xml\" />\n") +
731 string(model->getShaderModel() != ShaderModel::SPECULAR?
"<template id=\"details_material_pbr\" src=\"resources/engine/gui/template_details_material_pbr.xml\" />\n":
"")
735 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_material_spec"))->getActiveConditions().add(
"open");
736 if (model->getShaderModel() != ShaderModel::SPECULAR) {
737 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_material_pbr"))->getActiveConditions().add(
"open");
740 Console::println(
"ModelEditorTabController::setMaterialDetails(): An error occurred: " +
string(exception.what()));
750 if (material ==
nullptr)
return;
752 if (model ==
nullptr)
return;
754 auto specularMaterialProperties = material->getSpecularMaterialProperties();
755 auto pbrMaterialProperties = material->getPBRMaterialProperties();
759 auto diffuseTextureFileName =
760 specularMaterialProperties->getDiffuseTextureFileName().empty() ==
true?
763 PrototypeReader::getResourcePathName(
765 specularMaterialProperties->getDiffuseTexturePathName() +
"/" + specularMaterialProperties->getDiffuseTextureFileName()
768 specularMaterialProperties->getDiffuseTextureFileName()
770 auto diffuseTransparencyTextureFileName =
771 specularMaterialProperties->getDiffuseTransparencyTextureFileName().empty() ==
true?
774 PrototypeReader::getResourcePathName(
776 specularMaterialProperties->getDiffuseTransparencyTexturePathName() +
"/" + specularMaterialProperties->getDiffuseTransparencyTextureFileName()
779 specularMaterialProperties->getDiffuseTransparencyTextureFileName()
781 auto normalTextureFileName =
782 specularMaterialProperties->getNormalTextureFileName().empty() ==
true?
785 PrototypeReader::getResourcePathName(
787 specularMaterialProperties->getNormalTexturePathName() +
"/" + specularMaterialProperties->getNormalTextureFileName()
790 specularMaterialProperties->getNormalTextureFileName()
792 auto specularTextureFileName =
793 specularMaterialProperties->getSpecularTextureFileName().empty() ==
true?
796 PrototypeReader::getResourcePathName(
798 specularMaterialProperties->getSpecularTexturePathName() +
"/" + specularMaterialProperties->getSpecularTextureFileName()
801 specularMaterialProperties->getSpecularTextureFileName()
804 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_diffuse_texture"))->setTexture(specularMaterialProperties->getDiffuseTexture());
805 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_diffuse_texture"))->setTooltip(diffuseTextureFileName);
806 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_transparency_texture"))->setSource(diffuseTransparencyTextureFileName);
807 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_transparency_texture"))->setTooltip(diffuseTransparencyTextureFileName);
808 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_normal_texture"))->setTexture(specularMaterialProperties->getNormalTexture());
809 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_normal_texture"))->setTooltip(normalTextureFileName);
810 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_specular_texture"))->setTexture(specularMaterialProperties->getSpecularTexture());
811 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_specular_texture"))->setTooltip(specularTextureFileName);
812 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_shininess"))->getController()->setValue(specularMaterialProperties->getShininess());
813 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_reflection"))->getController()->setValue(specularMaterialProperties->getReflection());
814 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_maskedtransparency"))->getController()->setValue(
MutableString(specularMaterialProperties->hasDiffuseTextureMaskedTransparency() ==
true?
"1":
""));
817 if (model->getShaderModel() != ShaderModel::SPECULAR && pbrMaterialProperties !=
nullptr) {
818 auto baseColorTextureFileName =
819 pbrMaterialProperties->getBaseColorTextureFileName().empty() ==
true?
822 PrototypeReader::getResourcePathName(
824 pbrMaterialProperties->getBaseColorTexturePathName() +
"/" + pbrMaterialProperties->getBaseColorTextureFileName()
827 pbrMaterialProperties->getBaseColorTextureFileName()
829 auto metallicRoughnessTextureFileName =
830 pbrMaterialProperties->getMetallicRoughnessTextureFileName().empty() ==
true?
833 PrototypeReader::getResourcePathName(
835 pbrMaterialProperties->getMetallicRoughnessTexturePathName() +
"/" + pbrMaterialProperties->getMetallicRoughnessTextureFileName()
838 pbrMaterialProperties->getMetallicRoughnessTextureFileName()
840 auto normalTextureFileName =
841 pbrMaterialProperties->getNormalTextureFileName().empty() ==
true?
844 PrototypeReader::getResourcePathName(
846 pbrMaterialProperties->getNormalTexturePathName() +
"/" + pbrMaterialProperties->getNormalTextureFileName()
849 pbrMaterialProperties->getNormalTextureFileName()
851 auto emissiveTextureFileName =
852 pbrMaterialProperties->getEmissiveTextureFileName().empty() ==
true?
855 PrototypeReader::getResourcePathName(
857 pbrMaterialProperties->getEmissiveTexturePathName() +
"/" + pbrMaterialProperties->getEmissiveTextureFileName()
860 pbrMaterialProperties->getEmissiveTextureFileName()
863 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_basecolor_texture"))->setTexture(pbrMaterialProperties->getBaseColorTexture());
864 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_basecolor_texture"))->setTooltip(baseColorTextureFileName);
865 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_metallic_roughness_texture"))->setTexture(pbrMaterialProperties->getMetallicRoughnessTexture());
866 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_metallic_roughness_texture"))->setTooltip(metallicRoughnessTextureFileName);
867 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_normal_texture"))->setTexture(pbrMaterialProperties->getNormalTexture());
868 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_normal_texture"))->setTooltip(normalTextureFileName);
869 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_emissive_texture"))->setTexture(pbrMaterialProperties->getEmissiveTexture());
870 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_emissive_texture"))->setTooltip(emissiveTextureFileName);
871 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_metallic_factor"))->getController()->setValue(pbrMaterialProperties->getMetallicFactor());
872 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_roughness_factor"))->getController()->setValue(pbrMaterialProperties->getRoughnessFactor());
873 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_normal_scale"))->getController()->setValue(pbrMaterialProperties->getNormalScale());
874 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_exposure"))->getController()->setValue(pbrMaterialProperties->getExposure());
875 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_maskedtransparency"))->getController()->setValue(
MutableString(pbrMaterialProperties->hasBaseColorTextureMaskedTransparency() ==
true?
"1":
""));
878 Console::println(
"ModelEditorTabController::updateMaterialDetails(): An error occurred: " +
string(exception.what()));
888 if (material ==
nullptr)
return;
890 auto specularMaterialProperties = material->getSpecularMaterialProperties();
891 auto pbrMaterialProperties = material->getPBRMaterialProperties();
894 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_ambient"))->setEffectColorMul(
Color4(specularMaterialProperties->getAmbientColor()));
895 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_diffuse"))->setEffectColorMul(
Color4(specularMaterialProperties->getDiffuseColor()));
896 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_emission"))->setEffectColorMul(
Color4(specularMaterialProperties->getEmissionColor()));
897 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"specularmaterial_specular"))->setEffectColorMul(
Color4(specularMaterialProperties->getSpecularColor()));
899 if (pbrMaterialProperties !=
nullptr) {
900 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_basecolor"))->setEffectColorMul(
Color4(pbrMaterialProperties->getBaseColorFactor()));
901 required_dynamic_cast<GUIImageNode*>(
screenNode->
getNodeById(
"pbrmaterial_emissivefactor"))->setEffectColorMul(
Color4(pbrMaterialProperties->getEmissiveFactor()));
904 Console::println(
"ModelEditorTabController::updateMaterialColorDetails(): An error occurred: " +
string(exception.what()));
911 if (material ==
nullptr)
return;
913 auto specularMaterialProperties = material->getSpecularMaterialProperties();
916 specularMaterialProperties->setShininess(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_shininess"))->getController()->getValue().getString()));
917 specularMaterialProperties->setReflection(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_reflection"))->getController()->getValue().getString()));
918 specularMaterialProperties->setDiffuseTextureMaskedTransparency(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"specularmaterial_maskedtransparency"))->getController()->getValue().getString() ==
"1");
920 Console::println(
"ModelEditorTabController::applySpecularMaterialDetails(): An error occurred: " +
string(exception.what()));
927 if (material ==
nullptr)
return;
930 if (material->getPBRMaterialProperties() ==
nullptr) {
932 string outlinerNodeModel;
933 Model* model =
nullptr;
935 material->setPBRMaterialProperties(make_unique<PBRMaterialProperties>().release());
939 Console::println(
"ModelEditorTabController::applyPBRMaterialDetails(): An error occurred: " +
string(exception.what()));
943 auto pbrMaterialProperties = material->getPBRMaterialProperties();
944 if (pbrMaterialProperties ==
nullptr)
return;
947 pbrMaterialProperties->setMetallicFactor(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_metallic_factor"))->getController()->getValue().getString()));
948 pbrMaterialProperties->setRoughnessFactor(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_roughness_factor"))->getController()->getValue().getString()));
949 pbrMaterialProperties->setNormalScale(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_normal_scale"))->getController()->getValue().getString()));
950 pbrMaterialProperties->setExposure(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_exposure"))->getController()->getValue().getString()));
951 pbrMaterialProperties->setBaseColorTextureMaskedTransparency(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"pbrmaterial_maskedtransparency"))->getController()->getValue().getString() ==
"1");
953 Console::println(
"ModelEditorTabController::applyPBRMaterialDetails(): An error occurred: " +
string(exception.what()));
961 auto defaultAnimation = animationSetup !=
nullptr && animationSetup->getId() == Model::ANIMATIONSETUP_DEFAULT;
963 if (animationSetup ==
nullptr)
return;
965 auto defaultAnimationSetup = model->getAnimationSetup(Model::ANIMATIONSETUP_DEFAULT);
968 string(
"<template id=\"details_animation\" src=\"resources/engine/gui/template_details_animation.xml\" max-frames=\"") +
969 to_string(defaultAnimationSetup !=
nullptr?defaultAnimationSetup->getEndFrame():0) +
975 string animationsXML;
978 "<dropdown-option text=\"<None>\" value=\"\" " + (animationSetup->getOverlayFromNodeId().empty() ==
true?
"selected=\"true\" ":
"") +
" />\n";
979 for (
const auto& nodeId: model->getNodeIds()) {
981 "<dropdown-option text=\"" +
982 GUIParser::escape(nodeId) +
984 GUIParser::escape(nodeId) +
986 (animationSetup->getOverlayFromNodeId() == nodeId?
"selected=\"true\" ":
"") +
990 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animation_overlaybone_scrollarea"))->replaceSubNodes(animationsXML,
true);
992 Console::println(
"ModelEditorTabController::setAnimationDetails(): An error occurred: " +
string(exception.what()));
998 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_animation"))->getActiveConditions().add(
"open");
999 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_startframe"))->getController()->setValue(animationSetup->getStartFrame());
1000 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_startframe"))->getController()->setDisabled(defaultAnimation ==
true);
1001 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_endframe"))->getController()->setValue(animationSetup->getEndFrame());
1002 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_endframe"))->getController()->setDisabled(defaultAnimation ==
true);
1003 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_speed"))->getController()->setValue(animationSetup->getSpeed());
1004 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_speed"))->getController()->setDisabled(defaultAnimation ==
true);
1005 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_loop"))->getController()->setValue(
MutableString(animationSetup->isLoop() ==
true?
"1":
""));
1006 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_loop"))->getController()->setDisabled(defaultAnimation ==
true);
1007 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_overlaybone"))->getController()->setValue(animationSetup->getOverlayFromNodeId());
1008 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_overlaybone"))->getController()->setDisabled(defaultAnimation ==
true);
1010 Console::println(
"ModelEditorTabController::setAnimationDetails(): An error occurred: " +
string(exception.what()));
1021 auto defaultAnimation = animationSetup !=
nullptr && animationSetup->getId() == Model::ANIMATIONSETUP_DEFAULT;
1023 if (animationSetup ==
nullptr)
return;
1026 auto startFrame = Integer::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_startframe"))->getController()->getValue().getString());
1027 auto endFrame = Integer::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_endframe"))->getController()->getValue().getString());
1028 auto speed = Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_speed"))->getController()->getValue().getString());
1029 auto loop = required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_loop"))->getController()->getValue().getString() ==
"1";
1030 auto overlayFromNodeId = required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animation_overlaybone"))->getController()->getValue().getString();
1032 animationSetup->setStartFrame(startFrame < endFrame?startFrame:endFrame);
1033 animationSetup->setEndFrame(endFrame > startFrame?endFrame:startFrame);
1034 animationSetup->setSpeed(speed);
1035 animationSetup->setLoop(loop);
1036 animationSetup->setOverlayFromNodeId(overlayFromNodeId);
1040 Console::println(
"ModelEditorTabController::setAnimationDetails(): An error occurred: " +
string(exception.what()));
1047 auto defaultAnimationSetup = model->getAnimationSetup(Model::ANIMATIONSETUP_DEFAULT);
1050 string(
"<template id=\"details_animationpreview\" src=\"resources/engine/gui/template_details_animationpreview.xml\" />\n")
1054 string animationsXML;
1055 animationsXML = animationsXML +
"<dropdown-option text=\"<No animation>\" value=\"\" selected=\"true\" />";
1056 for (
const auto& animationSetupId: model->getAnimationSetupIds()) {
1057 auto animationSetup = model->getAnimationSetup(animationSetupId);
1058 if (animationSetup ==
nullptr || animationSetup->isOverlayAnimationSetup() ==
true)
continue;
1060 animationsXML +
"<dropdown-option text=\"" +
1061 GUIParser::escape(animationSetup->getId()) +
1063 GUIParser::escape(animationSetup->getId()) +
1068 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animationpreview_base_scrollarea"))->replaceSubNodes(animationsXML,
true);
1070 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1075 string overlayAnimationsXML;
1076 overlayAnimationsXML = overlayAnimationsXML +
"<dropdown-option text=\"<No animation>\" value=\"\" selected=\"true\" />";
1077 for (
const auto& animationSetupId: model->getAnimationSetupIds()) {
1078 auto animationSetup = model->getAnimationSetup(animationSetupId);
1079 if (animationSetup ==
nullptr || animationSetup->isOverlayAnimationSetup() ==
false)
continue;
1080 overlayAnimationsXML =
1081 overlayAnimationsXML +
"<dropdown-option text=\"" +
1082 GUIParser::escape(animationSetup->getId()) +
1084 GUIParser::escape(animationSetup->getId()) +
1089 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animationpreview_overlay1_scrollarea"))->replaceSubNodes(overlayAnimationsXML,
true);
1091 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1094 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animationpreview_overlay2_scrollarea"))->replaceSubNodes(overlayAnimationsXML,
true);
1096 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1099 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animationpreview_overlay3_scrollarea"))->replaceSubNodes(overlayAnimationsXML,
true);
1101 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1107 bonesXML = bonesXML +
"<dropdown-option text=\"<No bone>\" value=\"\" selected=\"true\" />";
1108 for (
const auto& nodeId: model->getNodeIds()) {
1110 bonesXML +
"<dropdown-option text=\"" +
1111 GUIParser::escape(nodeId) +
1113 GUIParser::escape(nodeId) +
1118 required_dynamic_cast<GUIParentNode*>(
screenNode->
getInnerNodeById(
"animationpreview_attachment1_bone_scrollarea"))->replaceSubNodes(bonesXML,
true);
1120 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1125 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_animationpreview"))->getActiveConditions().add(
"open");
1127 Console::println(
"ModelEditorTabController::setAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1135 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animationpreview_attachment1_bone"))->getController()->getValue().getString(),
1142 Console::println(
"ModelEditorTabController::setPreviewAnimationsAttachment1Model(): An error occurred: " +
string(exception.what()));
1148 class OnPreviewAnimationsAttachment1ModelLoad:
public virtual Action
1152 void performAction()
override {
1153 modelEditorTabController->setPreviewAnimationsAttachment1Model(modelEditorTabController->popUps->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->popUps->getFileDialogScreenController()->getFileName());
1154 modelEditorTabController->popUps->getFileDialogScreenController()->close();
1161 OnPreviewAnimationsAttachment1ModelLoad(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
1170 "Load animation preview attachment 1 model from: ",
1171 ModelReader::getModelExtensions(),
1174 new OnPreviewAnimationsAttachment1ModelLoad(
this)
1197 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animationpreview_base"))->getController()->getValue().getString(),
1198 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animationpreview_overlay1"))->getController()->getValue().getString(),
1199 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animationpreview_overlay2"))->getController()->getValue().getString(),
1200 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"animationpreview_overlay3"))->getController()->getValue().getString()
1203 Console::println(
"ModelEditorTabController::applyAnimationPreviewDetails(): An error occurred: " +
string(exception.what()));
1210 string outlinerNodeModel;
1211 Model* model =
nullptr;
1213 if (outlinerNodeModel ==
"model.materials") {
1216 if (StringTools::startsWith(outlinerNodeModel,
"model.materials.") ==
true) {
1219 if (outlinerNodeModel ==
"model.animations") {
1222 if (StringTools::startsWith(outlinerNodeModel,
"model.animations.") ==
true) {
1224 view->
playAnimation(animationSetup ==
nullptr?Model::ANIMATIONSETUP_DEFAULT:animationSetup->getId());
1238 if (material ==
nullptr)
return;
1239 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1240 if (specularMaterialProperties ==
nullptr) {
1241 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1244 specularMaterialProperties->setDiffuseTexture(
1245 Tools::getPathName(fileName),
1246 Tools::getFileName(fileName),
1247 specularMaterialProperties->getDiffuseTransparencyTexturePathName(),
1248 specularMaterialProperties->getDiffuseTransparencyTextureFileName()
1255 if (material ==
nullptr)
return;
1256 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1257 if (specularMaterialProperties ==
nullptr) {
1258 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1259 material->setSpecularMaterialProperties(specularMaterialProperties);
1262 class OnLoadTexture:
public virtual Action
1265 void performAction()
override {
1266 modelEditorTabController->setMaterialDiffuseTexture(
1267 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1269 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1278 : modelEditorTabController(modelEditorTabController)
1279 , specularMaterialProperties(specularMaterialProperties) {
1288 auto extensions = TextureReader::getTextureExtensions();
1290 specularMaterialProperties->getDiffuseTextureFileName().empty() ==
false?specularMaterialProperties->getDiffuseTexturePathName():
string(),
1291 "Load specular diffuse texture from: ",
1293 specularMaterialProperties->getDiffuseTextureFileName(),
1295 new OnLoadTexture(
this, specularMaterialProperties)
1301 if (material ==
nullptr)
return;
1302 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1303 if (specularMaterialProperties ==
nullptr) {
1304 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1307 specularMaterialProperties->setDiffuseTexture(
1310 specularMaterialProperties->getDiffuseTransparencyTexturePathName(),
1311 specularMaterialProperties->getDiffuseTransparencyTextureFileName()
1318 if (model ==
nullptr) {
1322 if (model->hasEmbeddedSpecularTextures() ==
true) {
1323 showInfoPopUp(
"Browse To",
"This model has embedded specular material textures");
1327 if (material ==
nullptr) {
1331 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1332 if (specularMaterialProperties ==
nullptr || specularMaterialProperties->getDiffuseTextureFileName().empty() ==
true) {
1341 if (material ==
nullptr)
return;
1342 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1343 if (specularMaterialProperties ==
nullptr) {
1344 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1347 specularMaterialProperties->setDiffuseTexture(
1348 specularMaterialProperties->getDiffuseTexturePathName(),
1349 specularMaterialProperties->getDiffuseTextureFileName(),
1350 Tools::getPathName(fileName),
1351 Tools::getFileName(fileName)
1358 if (material ==
nullptr)
return;
1359 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1360 if (specularMaterialProperties ==
nullptr) {
1361 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1364 class OnLoadTexture:
public virtual Action
1367 void performAction()
override {
1368 modelEditorTabController->setMaterialDiffuseTransparencyTexture(
1369 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1371 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1380 : modelEditorTabController(modelEditorTabController)
1381 , specularMaterialProperties(specularMaterialProperties) {
1389 auto extensions = TextureReader::getTextureExtensions();
1391 specularMaterialProperties->getDiffuseTransparencyTextureFileName().empty() ==
false?specularMaterialProperties->getDiffuseTransparencyTexturePathName():
string(),
1392 "Load specular diffuse transparency texture from: ",
1394 specularMaterialProperties->getDiffuseTransparencyTextureFileName(),
1396 new OnLoadTexture(
this, specularMaterialProperties)
1402 if (material ==
nullptr)
return;
1403 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1404 if (specularMaterialProperties ==
nullptr) {
1406 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1409 specularMaterialProperties->setDiffuseTexture(
1410 specularMaterialProperties->getDiffuseTexturePathName(),
1411 specularMaterialProperties->getDiffuseTextureFileName(),
1420 if (model ==
nullptr) {
1424 if (model->hasEmbeddedSpecularTextures() ==
true) {
1425 showInfoPopUp(
"Browse To",
"This model has embedded specular material textures");
1429 if (material ==
nullptr) {
1433 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1434 if (specularMaterialProperties ==
nullptr) {
1438 if (specularMaterialProperties->getDiffuseTransparencyTextureFileName().empty() ==
false) {
1441 if (specularMaterialProperties->getDiffuseTextureFileName().empty() ==
false) {
1450 if (material ==
nullptr)
return;
1451 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1452 if (specularMaterialProperties ==
nullptr) {
1454 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1457 specularMaterialProperties->setNormalTexture(
1458 Tools::getPathName(fileName),
1459 Tools::getFileName(fileName)
1466 if (material ==
nullptr)
return;
1467 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1468 if (specularMaterialProperties ==
nullptr) {
1469 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1472 class OnLoadTexture:
public virtual Action
1475 void performAction()
override {
1476 modelEditorTabController->setMaterialNormalTexture(
1477 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1479 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1488 : modelEditorTabController(modelEditorTabController)
1489 , specularMaterialProperties(specularMaterialProperties) {
1498 auto extensions = TextureReader::getTextureExtensions();
1500 specularMaterialProperties->getNormalTextureFileName().empty() ==
false?specularMaterialProperties->getNormalTexturePathName():
string(),
1501 "Load specular normal texture from: ",
1503 specularMaterialProperties->getNormalTextureFileName(),
1505 new OnLoadTexture(
this, specularMaterialProperties)
1511 if (material ==
nullptr)
return;
1512 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1513 if (specularMaterialProperties ==
nullptr) {
1514 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1517 specularMaterialProperties->setNormalTexture(
1526 if (model ==
nullptr) {
1530 if (model->hasEmbeddedSpecularTextures() ==
true) {
1531 showInfoPopUp(
"Browse To",
"This model has embedded specular material textures");
1535 if (material ==
nullptr) {
1539 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1540 if (specularMaterialProperties ==
nullptr || specularMaterialProperties->getNormalTextureFileName().empty() ==
true) {
1549 if (material ==
nullptr)
return;
1550 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1551 if (specularMaterialProperties ==
nullptr) {
1552 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1556 specularMaterialProperties->setSpecularTexture(
1557 Tools::getPathName(fileName),
1558 Tools::getFileName(fileName)
1565 if (material ==
nullptr)
return;
1566 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1567 if (specularMaterialProperties ==
nullptr) {
1568 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1571 class OnLoadTexture:
public virtual Action
1574 void performAction()
override {
1575 modelEditorTabController->setMaterialSpecularTexture(
1576 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1578 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1587 : modelEditorTabController(modelEditorTabController)
1588 , specularMaterialProperties(specularMaterialProperties) {
1597 auto extensions = TextureReader::getTextureExtensions();
1599 specularMaterialProperties->getSpecularTextureFileName().empty() ==
false?specularMaterialProperties->getSpecularTexturePathName():
string(),
1600 "Load specular specular texture from: ",
1602 specularMaterialProperties->getSpecularTextureFileName(),
1604 new OnLoadTexture(
this, specularMaterialProperties)
1610 if (material ==
nullptr)
return;
1611 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1612 if (specularMaterialProperties ==
nullptr) {
1613 material->setSpecularMaterialProperties(specularMaterialProperties = (make_unique<SpecularMaterialProperties>()).release());
1616 specularMaterialProperties->setSpecularTexture(
1625 if (model ==
nullptr) {
1629 if (model->hasEmbeddedSpecularTextures() ==
true) {
1630 showInfoPopUp(
"Browse To",
"This model has embedded specular material textures");
1634 if (material ==
nullptr) {
1638 auto specularMaterialProperties = material->getSpecularMaterialProperties();
1639 if (specularMaterialProperties ==
nullptr || specularMaterialProperties->getSpecularTextureFileName().empty() ==
true) {
1648 if (material ==
nullptr)
return;
1649 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1650 if (pbrMaterialProperties ==
nullptr)
return;
1653 pbrMaterialProperties->setBaseColorTexture(
1654 Tools::getPathName(fileName),
1655 Tools::getFileName(fileName)
1662 if (material ==
nullptr)
return;
1663 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1664 if (pbrMaterialProperties ==
nullptr)
return;
1666 class OnLoadTexture:
public virtual Action
1669 void performAction()
override {
1670 modelEditorTabController->setMaterialPBRBaseColorTexture(
1671 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1673 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1682 : modelEditorTabController(modelEditorTabController)
1683 , pbrMaterialProperties(pbrMaterialProperties) {
1692 auto extensions = TextureReader::getTextureExtensions();
1694 pbrMaterialProperties->getBaseColorTextureFileName().empty() ==
false?pbrMaterialProperties->getBaseColorTexturePathName():
string(),
1695 "Load PBR base color texture from: ",
1697 pbrMaterialProperties->getBaseColorTextureFileName(),
1699 new OnLoadTexture(
this, pbrMaterialProperties)
1705 if (material ==
nullptr)
return;
1706 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1707 if (pbrMaterialProperties ==
nullptr)
return;
1709 pbrMaterialProperties->setBaseColorTexture(
1718 if (model ==
nullptr) {
1722 if (model->hasEmbeddedPBRTextures() ==
true) {
1723 showInfoPopUp(
"Browse To",
"This model has embedded PBR material textures");
1727 if (material ==
nullptr) {
1731 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1732 if (pbrMaterialProperties ==
nullptr || pbrMaterialProperties->getBaseColorTextureFileName().empty() ==
true) {
1741 if (material ==
nullptr)
return;
1742 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1743 if (pbrMaterialProperties ==
nullptr)
return;
1746 pbrMaterialProperties->setMetallicRoughnessTexture(
1747 Tools::getPathName(fileName),
1748 Tools::getFileName(fileName)
1755 if (material ==
nullptr)
return;
1756 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1757 if (pbrMaterialProperties ==
nullptr)
return;
1759 class OnLoadTexture:
public virtual Action
1762 void performAction()
override {
1763 modelEditorTabController->setMaterialPBRMetallicRoughnessTexture(
1764 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1766 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1775 : modelEditorTabController(modelEditorTabController)
1776 , pbrMaterialProperties(pbrMaterialProperties) {
1785 auto extensions = TextureReader::getTextureExtensions();
1787 pbrMaterialProperties->getMetallicRoughnessTextureFileName().empty() ==
false?pbrMaterialProperties->getMetallicRoughnessTexturePathName():
string(),
1788 "Load PBR metallic/roughness texture from: ",
1790 pbrMaterialProperties->getMetallicRoughnessTextureFileName(),
1792 new OnLoadTexture(
this, pbrMaterialProperties)
1798 if (material ==
nullptr)
return;
1799 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1800 if (pbrMaterialProperties ==
nullptr)
return;
1802 pbrMaterialProperties->setMetallicRoughnessTexture(
1811 if (model ==
nullptr) {
1815 if (model->hasEmbeddedPBRTextures() ==
true) {
1816 showInfoPopUp(
"Browse To",
"This model has embedded PBR material textures");
1820 if (material ==
nullptr) {
1824 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1825 if (pbrMaterialProperties ==
nullptr || pbrMaterialProperties->getMetallicRoughnessTextureFileName().empty() ==
true) {
1834 if (material ==
nullptr)
return;
1835 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1836 if (pbrMaterialProperties ==
nullptr)
return;
1839 pbrMaterialProperties->setNormalTexture(
1840 Tools::getPathName(fileName),
1841 Tools::getFileName(fileName)
1848 if (material ==
nullptr)
return;
1849 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1850 if (pbrMaterialProperties ==
nullptr)
return;
1852 class OnLoadTexture:
public virtual Action
1855 void performAction()
override {
1856 modelEditorTabController->setMaterialPBRNormalTexture(
1857 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1859 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1868 : modelEditorTabController(modelEditorTabController)
1869 , pbrMaterialProperties(pbrMaterialProperties) {
1878 auto extensions = TextureReader::getTextureExtensions();
1880 pbrMaterialProperties->getNormalTextureFileName().empty() ==
false?pbrMaterialProperties->getNormalTexturePathName():
string(),
1881 "Load PBR normal texture from: ",
1883 pbrMaterialProperties->getNormalTextureFileName(),
1885 new OnLoadTexture(
this, pbrMaterialProperties)
1891 if (material ==
nullptr)
return;
1892 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1893 if (pbrMaterialProperties ==
nullptr)
return;
1895 pbrMaterialProperties->setNormalTexture(
1904 if (model ==
nullptr) {
1908 if (model->hasEmbeddedPBRTextures() ==
true) {
1909 showInfoPopUp(
"Browse To",
"This model has embedded PBR material textures");
1913 if (material ==
nullptr) {
1917 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1918 if (pbrMaterialProperties ==
nullptr || pbrMaterialProperties->getNormalTextureFileName().empty() ==
true) {
1927 if (material ==
nullptr)
return;
1928 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1929 if (pbrMaterialProperties ==
nullptr)
return;
1932 pbrMaterialProperties->setEmissiveTexture(
1933 Tools::getPathName(fileName),
1934 Tools::getFileName(fileName)
1941 if (material ==
nullptr)
return;
1942 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1943 if (pbrMaterialProperties ==
nullptr)
return;
1945 class OnLoadTexture:
public virtual Action
1948 void performAction()
override {
1949 modelEditorTabController->setMaterialPBREmissiveTexture(
1950 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
"/" + modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
1952 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
1961 : modelEditorTabController(modelEditorTabController)
1962 , pbrMaterialProperties(pbrMaterialProperties) {
1971 auto extensions = TextureReader::getTextureExtensions();
1973 pbrMaterialProperties->getEmissiveTextureFileName().empty() ==
false?pbrMaterialProperties->getEmissiveTexturePathName():
string(),
1974 "Load PBR emissive texture from: ",
1976 pbrMaterialProperties->getEmissiveTextureFileName(),
1978 new OnLoadTexture(
this, pbrMaterialProperties)
1984 if (material ==
nullptr)
return;
1985 auto pbrMaterialProperties = material->getPBRMaterialProperties();
1986 if (pbrMaterialProperties ==
nullptr)
return;
1988 pbrMaterialProperties->setEmissiveTexture(
1997 if (model ==
nullptr) {
2001 if (model->hasEmbeddedPBRTextures() ==
true) {
2002 showInfoPopUp(
"Browse To",
"This model has embedded PBR material textures");
2006 if (material ==
nullptr) {
2010 auto pbrMaterialProperties = material->getPBRMaterialProperties();
2011 if (pbrMaterialProperties ==
nullptr || pbrMaterialProperties->getEmissiveTextureFileName().empty() ==
true) {
2020 if (prototype ==
nullptr)
return;
2023 if (selectBoxOptionParentNode ==
nullptr)
return;
2027 selectBoxOptionParentNode->replaceSubNodes(
2028 "<template id=\"tdme.animations.rename_input\" hint=\"Animation name\" text=\"" + GUIParser::escape(animationId) +
"\"src=\"resources/engine/gui/template_outliner_rename.xml\" />\n",
2037 if (model ==
nullptr) {
2045 if (animationSetup !=
nullptr) {
2049 animationSetup->getId(),
2056 Console::println(
"ModelEditorTabController::renameAnimation(): An error occurred: " +
string(exception.what()));
2067 if (model ==
nullptr)
return;
2070 auto defaultAnimationSetup = model->
getAnimationSetup(Model::ANIMATIONSETUP_DEFAULT);
2072 auto animationSetupCreated =
false;
2073 auto animationSetupName = string() +
"New animation";
2075 model->
addAnimationSetup(animationSetupName, defaultAnimationSetup !=
nullptr?defaultAnimationSetup->getStartFrame():0, defaultAnimationSetup !=
nullptr?defaultAnimationSetup->getEndFrame():0,
false, 1.0f) !=
nullptr) {
2076 animationSetupCreated =
true;
2079 for (
auto i = 1; i < 10001; i++) {
2080 animationSetupName = string() +
"New animation " + to_string(i);
2082 model->
addAnimationSetup(animationSetupName, defaultAnimationSetup !=
nullptr?defaultAnimationSetup->getStartFrame():0, defaultAnimationSetup !=
nullptr?defaultAnimationSetup->getEndFrame():0,
false, 1.0f) !=
nullptr) {
2083 animationSetupCreated =
true;
2090 if (animationSetupCreated ==
false) {
2094 Console::println(
"ModelEditorTabController::createAnimationSetup(): An error occurred: " +
string(exception.what()));
2098 if (animationSetupCreated ==
true) {
2105 class OnLoadLODModel:
public virtual Action
2108 void performAction()
override {
2109 auto lodLevelIdx = -1;
2111 if (modelEditorTabController->view->getPrototype()->getLODLevel2() ==
nullptr) {
2112 lodLevel = modelEditorTabController->getLODLevel(2);
2115 if (modelEditorTabController->view->getPrototype()->getLODLevel3() ==
nullptr) {
2116 lodLevel = modelEditorTabController->getLODLevel(3);
2119 if (lodLevel ==
nullptr)
return;
2122 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getPathName() +
2124 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->getFileName()
2126 lodLevel->
setType(LODObject::LODLEVELTYPE_MODEL);
2129 lodLevel->
getType() == LODObject::LODLEVELTYPE_MODEL?
2137 Console::println(
"OnLoadLODModel::performAction(): An error occurred: " +
string(exception.what()));
2138 modelEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
2140 modelEditorTabController->view->getEditorView()->reloadTabOutliner(
"lod" + to_string(lodLevelIdx) +
".model");
2141 modelEditorTabController->view->getPopUps()->getFileDialogScreenController()->close();
2149 : modelEditorTabController(modelEditorTabController) {
2159 Console::println(
"ModelEditorTabController::createLOD(): LOD level 2 and LOD level 3 is already in use");
2160 showInfoPopUp(
"Warning",
"LOD level 2 and LOD level 3 is already in use");
2166 "Load LOD model from: ",
2167 ModelReader::getModelExtensions(),
2170 new OnLoadLODModel(
this)
2182 if (lodLevel ==
nullptr)
return;
2184 lodLevel->
setType(LODObject::LODLEVELTYPE_IGNORE);
2191 if (prototype ==
nullptr)
return;
2195 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
2196 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
2198 if (prototypeLODLevel ==
nullptr)
return;
2201 string(
"<template id=\"details_lod\" src=\"resources/engine/gui/template_details_lod.xml\" />\n")
2205 required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"details_lod"))->getActiveConditions().add(
"open");
2208 Console::println(
"ModelEditorTabController::setLODDetails(): An error occurred: " +
string(exception.what()));
2218 if (prototype ==
nullptr)
return;
2222 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
2223 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
2225 if (prototypeLODLevel ==
nullptr)
return;
2231 Console::println(
"ModelEditorTabController::updateLODColorDetails(): An error occurred: " +
string(exception.what()));
2238 if (prototype ==
nullptr)
return;
2242 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
2243 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
2245 if (prototypeLODLevel ==
nullptr)
return;
2248 prototypeLODLevel->
setMinDistance(Float::parse(required_dynamic_cast<GUIElementNode*>(
screenNode->
getNodeById(
"lod_min_distance"))->getController()->getValue().getString()));
2250 Console::println(
"ModelEditorTabController::applyLODDetails(): An error occurred: " +
string(exception.what()));
2256 if (StringTools::startsWith(outlinerNode,
"model.") ==
true) {
2258 if (lodLevel !=
nullptr) *lodLevel = 1;
2259 modelOutlinerNode = outlinerNode;
2261 if (outlinerNode ==
"lod2.model") {
2263 if (lodLevel !=
nullptr) *lodLevel = 2;
2264 modelOutlinerNode = outlinerNode;
2266 if (StringTools::startsWith(outlinerNode,
"lod2.model.") ==
true) {
2268 if (lodLevel !=
nullptr) *lodLevel = 2;
2269 modelOutlinerNode = StringTools::substring(outlinerNode,
string(
"lod2.").size(), outlinerNode.size());
2271 if (outlinerNode ==
"lod3.model") {
2273 if (lodLevel !=
nullptr) *lodLevel = 3;
2274 modelOutlinerNode = outlinerNode;
2276 if (StringTools::startsWith(outlinerNode,
"lod3.model.") ==
true) {
2278 if (lodLevel !=
nullptr) *lodLevel = 3;
2279 modelOutlinerNode = StringTools::substring(outlinerNode,
string(
"lod3.").size(), outlinerNode.size());
2281 if (outlinerNode ==
"lod4.model") {
2282 if (model !=
nullptr) *model =
nullptr;
2283 if (lodLevel !=
nullptr) *lodLevel = 4;
2284 modelOutlinerNode = outlinerNode;
2286 if (StringTools::startsWith(outlinerNode,
"lod4.model.") ==
true) {
2287 if (model !=
nullptr) *model =
nullptr;
2288 if (lodLevel !=
nullptr) *lodLevel = 4;
2289 modelOutlinerNode = StringTools::substring(outlinerNode,
string(
"lod4.").size(), outlinerNode.size());
2292 if (lodLevel !=
nullptr) *lodLevel = 1;
2293 modelOutlinerNode = outlinerNode;
2295 return model !=
nullptr;
2306 if (model !=
nullptr) {
2310 if (node->
getId() ==
"dropdown_outliner_add") {
2312 if (addOutlinerType ==
"animation") {
2314 string modelOutlinerNode;
2319 if (addOutlinerType ==
"lod") {
2322 if (addOutlinerType ==
"lod_none") {
2326 if (node->
getId() ==
"selectbox_outliner") {
2328 auto haveDetails =
false;
2329 if (outlinerNode ==
"lod2.model" ||
2330 StringTools::startsWith(outlinerNode,
"lod2.model.") ==
true) {
2332 if (outlinerNode ==
"lod2.model") {
2337 if (outlinerNode ==
"lod3.model" ||
2338 StringTools::startsWith(outlinerNode,
"lod3.model.") ==
true) {
2340 if (outlinerNode ==
"lod3.model") {
2345 if (outlinerNode ==
"lod4.model" ||
2346 StringTools::startsWith(outlinerNode,
"lod4.model.") ==
true) {
2348 if (outlinerNode ==
"lod4.model") {
2360 if (node->
getId() == applyAnimationNode) {
2366 if (node->
getId() == applyMaterialBaseNode) {
2372 if (node->
getId() == applySpecularMaterialNode) {
2378 if (node->
getId() == applyPBRMaterialNode) {
2384 if (node->
getId() == applyAnimationPreviewNode) {
2392 if (node->
getId() == applyLODNode) {
2394 if (outlinerNode ==
"lod2.model") {
2397 if (outlinerNode ==
"lod3.model") {
2417 if (node->
getId() ==
"tdme.animations.rename_input") {
2426 if (node->
getId() ==
"selectbox_outliner") {
2428 string modelOutlinerNode;
2431 if (outlinerNode ==
"model") {
2436 class OnModelReloadAction:
public virtual Action
2439 void performAction()
override {
2440 modelEditorTabController->onModelReload();
2442 OnModelReloadAction(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
2450 class OnModelLoadAction:
public virtual Action
2453 void performAction()
override {
2454 modelEditorTabController->onModelLoad();
2456 OnModelLoadAction(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
2464 class OnModelReimportAction:
public virtual Action
2467 void performAction()
override {
2468 modelEditorTabController->onModelReimport();
2470 OnModelReimportAction(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
2478 class EnqueueOnModelGenerateBillboardLodAction:
public virtual Action {
2480 void performAction()
override {
2481 auto prototype = modelEditorTabController->getView()->getPrototype();
2482 if (prototype ==
nullptr)
return;
2483 auto model = prototype->getModel();
2484 auto fileName = prototype->getModelFileName();
2486 if (prototype->getLODLevel2() !=
nullptr && prototype->getLODLevel3() !=
nullptr) {
2489 if (fileName.empty() ==
true)
throw ExceptionBase(
"Could not save file. No filename known");
2490 auto billboardModelPathName = Tools::getPathName(fileName);
2491 auto billboardModelFileName = Tools::removeFileExtension(Tools::getFileName(fileName)) +
".lod" + to_string(prototype->getLODLevel2() ==
nullptr?2:3) +
".tm";
2492 auto billboardLODModel = GenerateBillboardLOD::generate(
2494 billboardModelPathName,
2495 billboardModelFileName
2497 if (prototype->getLODLevel2() ==
nullptr) {
2498 prototype->setLODLevel2(
2499 make_unique<PrototypeLODLevel>(
2500 LODObject::LODLEVELTYPE_MODEL,
2501 billboardModelPathName +
"/" + billboardModelFileName,
2507 if (prototype->getLODLevel2() ==
nullptr) {
2508 prototype->setLODLevel3(
2509 make_unique<PrototypeLODLevel>(
2510 LODObject::LODLEVELTYPE_MODEL,
2511 billboardModelPathName +
"/" + billboardModelFileName,
2517 modelEditorTabController->getView()->reloadPrototype();
2519 modelEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
2522 EnqueueOnModelGenerateBillboardLodAction(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
2531 class EnqueueOnModelGenerateImposterLodAction:
public virtual Action {
2533 void performAction()
override {
2534 auto prototype = modelEditorTabController->getView()->getPrototype();
2535 if (prototype ==
nullptr)
return;
2536 auto model = prototype->getModel();
2537 auto fileName = prototype->getModelFileName();
2539 if (fileName.empty() ==
true)
throw ExceptionBase(
"Could not save file. No filename known");
2540 auto imposterModelPathName = Tools::getPathName(fileName);
2541 auto imposterModelFileName = Tools::removeFileExtension(Tools::getFileName(fileName)) +
".lod" + to_string(prototype->getLODLevel2() ==
nullptr?2:3) +
".tm";
2542 vector<Model*> imposterLODModels;
2543 vector<string> imposterLODFileNames;
2544 GenerateImposterLOD::generate(
2546 imposterModelPathName,
2547 imposterModelFileName,
2549 imposterLODFileNames,
2552 prototype->setImposterLOD(
2553 make_unique<PrototypeImposterLOD>(
2554 imposterLODFileNames,
2559 modelEditorTabController->getView()->reloadPrototype();
2561 modelEditorTabController->showInfoPopUp(
"Warning",
string(exception.what()));
2564 EnqueueOnModelGenerateImposterLodAction(
ModelEditorTabController* modelEditorTabController): modelEditorTabController(modelEditorTabController) {
2575 if (outlinerNode ==
"lod2.model") {
2580 class OnLODLoadAction:
public virtual Action
2583 void performAction()
override {
2584 modelEditorTabController->onLODLoad(lodLevel);
2586 OnLODLoadAction(
ModelEditorTabController* modelEditorTabController,
int lodLevel): modelEditorTabController(modelEditorTabController), lodLevel(lodLevel) {
2595 class OnLODDeleteAction:
public virtual Action
2598 void performAction()
override {
2599 if (prototype ==
nullptr)
return;
2600 modelEditorTabController->view->setLODLevel(1);
2601 prototype->removeLODLevel(lodLevel);
2602 modelEditorTabController->view->getEditorView()->reloadTabOutliner(
"model");
2604 OnLODDeleteAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype,
int lodLevel): modelEditorTabController(modelEditorTabController), prototype(prototype), lodLevel(lodLevel) {
2616 if (outlinerNode ==
"lod3.model") {
2621 class OnLODLoadAction:
public virtual Action
2624 void performAction()
override {
2625 modelEditorTabController->onLODLoad(lodLevel);
2627 OnLODLoadAction(
ModelEditorTabController* modelEditorTabController,
int lodLevel): modelEditorTabController(modelEditorTabController), lodLevel(lodLevel) {
2636 class OnLODDeleteAction:
public virtual Action
2639 void performAction()
override {
2640 if (prototype ==
nullptr)
return;
2641 modelEditorTabController->view->setLODLevel(2);
2642 prototype->removeLODLevel(lodLevel);
2643 modelEditorTabController->view->getEditorView()->reloadTabOutliner(
"lod2.model");
2645 OnLODDeleteAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype,
int lodLevel): modelEditorTabController(modelEditorTabController), prototype(prototype), lodLevel(lodLevel) {
2657 if (outlinerNode ==
"lod4.model") {
2662 class OnLOD4DeleteAction:
public virtual Action
2665 void performAction()
override {
2666 if (prototype ==
nullptr)
return;
2667 modelEditorTabController->view->setLODLevel(1);
2668 prototype->setImposterLOD(
nullptr);
2669 modelEditorTabController->view->getEditorView()->reloadTabOutliner(
"model");
2671 OnLOD4DeleteAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype): modelEditorTabController(modelEditorTabController), prototype(prototype) {
2682 if (modelOutlinerNode ==
"model.animations") {
2686 class OnAddAnimationAction:
public virtual Action
2689 void performAction()
override {
2690 auto outlinerNode = modelEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection();
2691 string modelOutlinerNode;
2693 modelEditorTabController->getOutlinerNodeLOD(outlinerNode, modelOutlinerNode,
nullptr, &lodLevel);
2694 if (modelOutlinerNode ==
"model.animations") modelEditorTabController->createAnimationSetup(lodLevel);
2696 OnAddAnimationAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype): modelEditorTabController(modelEditorTabController), prototype(prototype) {
2707 if (StringTools::startsWith(modelOutlinerNode,
"model.animations.") ==
true) {
2711 class OnRenameAction:
public virtual Action
2714 void performAction()
override {
2715 auto outlinerNode = modelEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection();
2716 string modelOutlinerNode;
2718 modelEditorTabController->getOutlinerNodeLOD(outlinerNode, modelOutlinerNode,
nullptr, &lodLevel);
2719 if (StringTools::startsWith(modelOutlinerNode,
"model.animations.") ==
true) {
2720 modelEditorTabController->startRenameAnimation(
2722 StringTools::substring(modelOutlinerNode,
string(
"model.animations.").size(), modelOutlinerNode.size())
2726 OnRenameAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype): modelEditorTabController(modelEditorTabController), prototype(prototype) {
2738 class OnDeleteAction:
public virtual Action
2741 void performAction()
override {
2742 auto outlinerNode = modelEditorTabController->view->getEditorView()->getScreenController()->getOutlinerSelection();
2743 string modelOutlinerNode;
2745 modelEditorTabController->getOutlinerNodeLOD(outlinerNode, modelOutlinerNode,
nullptr, &lodLevel);
2746 if (StringTools::startsWith(modelOutlinerNode,
"model.animations.") ==
true) {
2747 modelEditorTabController->view->playAnimation(Model::ANIMATIONSETUP_DEFAULT);
2748 auto animationId = StringTools::substring(modelOutlinerNode,
string(
"model.animations.").size(), modelOutlinerNode.size());
2749 Model* model = modelEditorTabController->getLODLevelModel(lodLevel);
2751 modelEditorTabController->view->getEditorView()->reloadTabOutliner((lodLevel == 1?
"model":
"lod" + to_string(lodLevel) +
".model") +
".animations");
2754 OnDeleteAction(
ModelEditorTabController* modelEditorTabController,
Prototype* prototype): modelEditorTabController(modelEditorTabController), prototype(prototype) {
2769 int tooltipLeft, tooltipTop;
2790 if (node->
getId().compare(
"specularmaterial_diffuse_texture_open") == 0) {
2793 if (node->
getId().compare(
"specularmaterial_diffuse_texture_remove") == 0) {
2796 if (node->
getId().compare(
"specularmaterial_diffuse_texture_browseto") == 0) {
2799 if (node->
getId().compare(
"specularmaterial_transparency_texture_open") == 0) {
2802 if (node->
getId().compare(
"specularmaterial_transparency_texture_remove") == 0) {
2805 if (node->
getId().compare(
"specularmaterial_transparency_texture_browseto") == 0) {
2808 if (node->
getId().compare(
"specularmaterial_normal_texture_open") == 0) {
2811 if (node->
getId().compare(
"specularmaterial_normal_texture_remove") == 0) {
2814 if (node->
getId().compare(
"specularmaterial_normal_texture_browseto") == 0) {
2817 if (node->
getId().compare(
"specularmaterial_specular_texture_open") == 0) {
2820 if (node->
getId().compare(
"specularmaterial_specular_texture_remove") == 0) {
2823 if (node->
getId().compare(
"specularmaterial_specular_texture_browseto") == 0) {
2826 if (node->
getId().compare(
"pbrmaterial_basecolor_texture_open") == 0) {
2829 if (node->
getId().compare(
"pbrmaterial_basecolor_texture_remove") == 0) {
2832 if (node->
getId().compare(
"pbrmaterial_basecolor_texture_browseto") == 0) {
2835 if (node->
getId().compare(
"pbrmaterial_metallic_roughness_texture_open") == 0) {
2838 if (node->
getId().compare(
"pbrmaterial_metallic_roughness_texture_remove") == 0) {
2841 if (node->
getId().compare(
"pbrmaterial_metallic_roughness_texture_browseto") == 0) {
2844 if (node->
getId().compare(
"pbrmaterial_normal_texture_open") == 0) {
2847 if (node->
getId().compare(
"pbrmaterial_normal_texture_remove") == 0) {
2850 if (node->
getId().compare(
"pbrmaterial_normal_texture_browseto") == 0) {
2853 if (node->
getId().compare(
"pbrmaterial_emissive_texture_open") == 0) {
2856 if (node->
getId().compare(
"pbrmaterial_emissive_texture_remove") == 0) {
2859 if (node->
getId().compare(
"pbrmaterial_emissive_texture_browseto") == 0) {
2862 if (node->
getId().compare(
"animationpreview_attachment1_model_open") == 0) {
2865 if (node->
getId().compare(
"animationpreview_attachment1_model_remove") == 0) {
2868 if (node->
getId().compare(
"animationpreview_attachment1_model_browseto") == 0) {
2871 if (node->
getId().compare(
"specularmaterial_ambient_edit") == 0) {
2873 auto specularMaterialProperties = material !=
nullptr?material->getSpecularMaterialProperties():
nullptr;
2874 if (specularMaterialProperties !=
nullptr) {
2875 class OnColorChangeAction:
public virtual Action
2878 void performAction()
override {
2879 material->getSpecularMaterialProperties()->setAmbientColor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2880 modelEditorTabController->updateMaterialColorDetails();
2882 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2891 if (node->
getId().compare(
"specularmaterial_diffuse_edit") == 0) {
2893 auto specularMaterialProperties = material !=
nullptr?material->getSpecularMaterialProperties():
nullptr;
2894 if (specularMaterialProperties !=
nullptr) {
2895 class OnColorChangeAction:
public virtual Action
2898 void performAction()
override {
2899 material->getSpecularMaterialProperties()->setDiffuseColor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2900 modelEditorTabController->updateMaterialColorDetails();
2902 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2911 if (node->
getId().compare(
"specularmaterial_emission_edit") == 0) {
2913 auto specularMaterialProperties = material !=
nullptr?material->getSpecularMaterialProperties():
nullptr;
2914 if (specularMaterialProperties !=
nullptr) {
2915 class OnColorChangeAction:
public virtual Action
2918 void performAction()
override {
2919 material->getSpecularMaterialProperties()->setEmissionColor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2920 modelEditorTabController->updateMaterialColorDetails();
2922 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2931 if (node->
getId().compare(
"specularmaterial_specular_edit") == 0) {
2933 auto specularMaterialProperties = material !=
nullptr?material->getSpecularMaterialProperties():
nullptr;
2934 if (specularMaterialProperties !=
nullptr) {
2935 class OnColorChangeAction:
public virtual Action
2938 void performAction()
override {
2939 material->getSpecularMaterialProperties()->setSpecularColor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2940 modelEditorTabController->updateMaterialColorDetails();
2942 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2951 if (node->
getId().compare(
"pbrmaterial_basecolor_edit") == 0) {
2953 auto pbrMaterialProperties = material !=
nullptr?material->getPBRMaterialProperties():
nullptr;
2954 if (pbrMaterialProperties !=
nullptr) {
2955 class OnColorChangeAction:
public virtual Action
2958 void performAction()
override {
2959 material->getPBRMaterialProperties()->setBaseColorFactor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2960 modelEditorTabController->updateMaterialColorDetails();
2962 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2971 if (node->
getId().compare(
"pbrmaterial_emissivefactor_edit") == 0) {
2973 auto pbrMaterialProperties = material !=
nullptr?material->getPBRMaterialProperties():
nullptr;
2974 if (pbrMaterialProperties !=
nullptr) {
2975 class OnColorChangeAction:
public virtual Action
2978 void performAction()
override {
2979 material->getPBRMaterialProperties()->setEmissiveFactor(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
2980 modelEditorTabController->updateMaterialColorDetails();
2982 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
Material* material): modelEditorTabController(modelEditorTabController), material(material) {
2991 if (node->
getId().compare(
"lod_color_add_edit") == 0) {
2993 string modelOutlinerNode;
2998 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
2999 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
3002 if (prototypeLODLevel ==
nullptr)
return;
3003 class OnColorChangeAction:
public virtual Action
3006 void performAction()
override {
3007 prototypeLODLevel->
setColorAdd(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
3008 modelEditorTabController->updateLODColorDetails(lodLevel);
3009 modelEditorTabController->view->updateLODLevel();
3011 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
int lodLevel,
PrototypeLODLevel* prototypeLODLevel): modelEditorTabController(modelEditorTabController), lodLevel(lodLevel), prototypeLODLevel(prototypeLODLevel) {
3020 if (node->
getId().compare(
"lod_color_mul_edit") == 0) {
3022 string modelOutlinerNode;
3027 case 2: prototypeLODLevel = prototype->getLODLevel2();
break;
3028 case 3: prototypeLODLevel = prototype->getLODLevel3();
break;
3031 if (prototypeLODLevel ==
nullptr)
return;
3032 class OnColorChangeAction:
public virtual Action
3035 void performAction()
override {
3036 prototypeLODLevel->
setColorMul(
Color4(modelEditorTabController->popUps->getColorPickerScreenController()->getColor()));
3037 modelEditorTabController->updateLODColorDetails(lodLevel);
3038 modelEditorTabController->view->updateLODLevel();
3040 OnColorChangeAction(
ModelEditorTabController* modelEditorTabController,
int lodLevel,
PrototypeLODLevel* prototypeLODLevel): modelEditorTabController(modelEditorTabController), lodLevel(lodLevel), prototypeLODLevel(prototypeLODLevel) {
3049 if (node->
getId() ==
"tdme.animations.rename_input") {
Color 4 definition class.
Representation of a 3D model.
const vector< string > getMaterialIds()
unordered_map< string, Node * > & getSubNodes()
Returns object's sub nodes.
unordered_map< string, Material * > & getMaterials()
Returns all object materials.
AnimationSetup * getAnimationSetup(const string &id)
bool removeAnimationSetup(const string &id)
Remove animation setup.
AnimationSetup * addAnimationSetup(const string &id, int32_t startFrame, int32_t endFrame, bool loop, float speed=1.0f)
Adds an base animation setup.
const vector< string > getAnimationSetupIds()
const unordered_map< string, AnimationSetup * > & getAnimationSetups()
bool renameAnimationSetup(const string &id, const string &newId)
Rename animation set up.
Represents specular material properties.
Represents specular material properties.
Base property model class.
Prototype LOD level definition.
void setFileName(const string &fileName)
Set file name.
void setColorAdd(const Color4 &colorAdd)
Set color add.
const string & getFileName()
void setType(LODObject::LODLevelType type)
Set type.
void setModel(Model *model)
Set model.
void setColorMul(const Color4 &colorMul)
Set color mul.
const Color4 & getColorMul() const
LODObject::LODLevelType getType() const
void setMinDistance(float minDistance)
Set min distance.
float getMinDistance() const
const Color4 & getColorAdd() const
PrototypeLODLevel * getLODLevel3()
const string & getFileName()
PrototypeLODLevel * getLODLevel2()
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.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Generate imposter LOD utility class.
Mutable utf8 aware string class.
const string & getString() const
std::exception Exception
Exception base class.