From 1591dba3b87110039ccecb2cc62a84eac072d25e Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 6 Aug 2022 17:07:50 +0200 Subject: [PATCH] #6050: MaterialPreview is automatically detecting skybox materials which are applied to the background instead. A toggle tool button can be used to swap the background material with the object's. --- install/bitmaps/swap_background.png | Bin 0 -> 8304 bytes .../ui/materials/editor/MaterialPreview.cpp | 72 +++++++++++++++--- radiant/ui/materials/editor/MaterialPreview.h | 8 +- 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 install/bitmaps/swap_background.png diff --git a/install/bitmaps/swap_background.png b/install/bitmaps/swap_background.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d4354450a5e0b8f9132d2e7bbacb6afdbaea08 GIT binary patch literal 8304 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 CJsgh! literal 0 HcmV?d00001 diff --git a/radiant/ui/materials/editor/MaterialPreview.cpp b/radiant/ui/materials/editor/MaterialPreview.cpp index c925e838c3..02c0106a7e 100644 --- a/radiant/ui/materials/editor/MaterialPreview.cpp +++ b/radiant/ui/materials/editor/MaterialPreview.cpp @@ -23,6 +23,21 @@ namespace const char* const FUNC_STATIC_CLASS = "func_static"; const char* const GKEY_DEFAULT_ROOM_MATERIAL = "/materialPreview/defaultRoomMaterial"; const char* const GKEY_DEFAULT_LIGHT_DEF = "/materialPreview/defaultLightDef"; + + inline bool isSkyboxMaterial(const MaterialPtr& material) + { + if (!material) return false; + + for (const auto& layer : material->getAllLayers()) + { + if (layer->getMapType() == IShaderLayer::MapType::CameraCubeMap) + { + return true; + } + } + + return false; + } } MaterialPreview::MaterialPreview(wxWindow* parent) : @@ -68,6 +83,15 @@ void MaterialPreview::setupToolbar() toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onTestModelSelectionChanged, this, _testModelSphereButton->GetId()); toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onTestModelSelectionChanged, this, _testModelTilesButton->GetId()); + toolbar->AddSeparator(); + + _swapBackgroundMaterialButton = toolbar->AddTool(wxID_ANY, "Swap", wxutil::GetLocalBitmap("swap_background.png", wxART_TOOLBAR)); + _swapBackgroundMaterialButton->SetToggle(true); + toolbar->ToggleTool(_swapBackgroundMaterialButton->GetId(), false); + _swapBackgroundMaterialButton->SetShortHelp(_("Swap Background and Foreground Materials")); + + toolbar->Bind(wxEVT_TOOL, &MaterialPreview::onSwapBackgroundMaterialChanged, this, _swapBackgroundMaterialButton->GetId()); + toolbar->Realize(); addToolbar(toolbar); @@ -78,8 +102,13 @@ const MaterialPtr& MaterialPreview::getMaterial() return _material; } -void MaterialPreview::updateModelSkin() +void MaterialPreview::updateModelSkin(const std::string& material) { + // Assign the material to the temporary skin + _testModelSkin->setRemapMaterial(GlobalMaterialManager().getMaterial(material)); + + if (!_model) return; + // Hide the model if there's no material to preview _model->setFiltered(_testModelSkin->isEmpty()); @@ -100,7 +129,7 @@ const std::string& MaterialPreview::getRoomMaterial() void MaterialPreview::setRoomMaterial(const std::string& material) { _roomMaterial = material; - updateRoomSkin(); + updateSceneMaterials(); signal_SceneChanged().emit(); } @@ -155,9 +184,9 @@ std::string MaterialPreview::getDefaultLightDef() return className; } -void MaterialPreview::updateRoomSkin() +void MaterialPreview::updateRoomSkin(const std::string& roomMaterial) { - _testRoomSkin->setRemapMaterial(GlobalMaterialManager().getMaterial(getRoomMaterial())); + _testRoomSkin->setRemapMaterial(GlobalMaterialManager().getMaterial(roomMaterial)); // Let the model update its remaps auto skinnedRoom = std::dynamic_pointer_cast(_room); @@ -184,13 +213,11 @@ void MaterialPreview::setMaterial(const MaterialPtr& material) _sceneIsReady = false; - if (_model) - { - // Assign the material to the temporary skin - _testModelSkin->setRemapMaterial(_material); + // Detect whether we should apply this material to the background + _swapBackgroundMaterial = isSkyboxMaterial(_material); + _swapBackgroundMaterialButton->GetToolBar()->ToggleTool(_swapBackgroundMaterialButton->GetId(), _swapBackgroundMaterial); - updateModelSkin(); - } + updateSceneMaterials(); if (!hadMaterial && _material) { @@ -204,6 +231,20 @@ void MaterialPreview::setMaterial(const MaterialPtr& material) queueDraw(); } +void MaterialPreview::updateSceneMaterials() +{ + auto foregroundMaterial = _material ? _material->getName() : _roomMaterial; + auto backgroundMaterial = _roomMaterial; + + if (_swapBackgroundMaterial) + { + std::swap(foregroundMaterial, backgroundMaterial); + } + + updateModelSkin(foregroundMaterial); + updateRoomSkin(backgroundMaterial); +} + void MaterialPreview::enableFrobHighlight(bool enable) { if (!_entity) return; @@ -313,7 +354,7 @@ void MaterialPreview::setupRoom() roomEntity->addChildNode(_room); - updateRoomSkin(); + updateRoomSkin(getRoomMaterial()); } void MaterialPreview::setupTestModel() @@ -343,7 +384,7 @@ void MaterialPreview::setupTestModel() // The test model is a child of this entity scene::addNodeToContainer(_model, _entity); - updateModelSkin(); + updateSceneMaterials(); } void MaterialPreview::onTestModelSelectionChanged(wxCommandEvent& ev) @@ -364,6 +405,13 @@ void MaterialPreview::onTestModelSelectionChanged(wxCommandEvent& ev) queueDraw(); } +void MaterialPreview::onSwapBackgroundMaterialChanged(wxCommandEvent& ev) +{ + _swapBackgroundMaterial = ev.IsChecked(); + updateSceneMaterials(); + queueDraw(); +} + sigc::signal& MaterialPreview::signal_SceneChanged() { return _sigSceneChanged; diff --git a/radiant/ui/materials/editor/MaterialPreview.h b/radiant/ui/materials/editor/MaterialPreview.h index 5e82b2463c..27fd2de017 100644 --- a/radiant/ui/materials/editor/MaterialPreview.h +++ b/radiant/ui/materials/editor/MaterialPreview.h @@ -35,12 +35,14 @@ class MaterialPreview : std::string _roomMaterial; std::string _lightClassname; + bool _swapBackgroundMaterial; float _defaultCamDistanceFactor; wxToolBarToolBase* _testModelCubeButton; wxToolBarToolBase* _testModelSphereButton; wxToolBarToolBase* _testModelTilesButton; + wxToolBarToolBase* _swapBackgroundMaterialButton; sigc::signal _sigSceneChanged; @@ -91,10 +93,12 @@ class MaterialPreview : void setupToolbar(); void setupTestModel(); void setupRoom(); - void updateModelSkin(); - void updateRoomSkin(); + void updateModelSkin(const std::string& material); + void updateRoomSkin(const std::string& material); + void updateSceneMaterials(); std::string getDefaultLightDef(); void onTestModelSelectionChanged(wxCommandEvent& ev); + void onSwapBackgroundMaterialChanged(wxCommandEvent& ev); }; }