diff --git a/Editor/MaterialWindow.cpp b/Editor/MaterialWindow.cpp index b23ec53d2..76fcadc20 100644 --- a/Editor/MaterialWindow.cpp +++ b/Editor/MaterialWindow.cpp @@ -426,13 +426,11 @@ void MaterialWindow::Create(EditorComponent* editor) AddWidget(&clearcoatRoughnessSlider); - // Textures: - + // x = 10; y = 0; hei = 20; step = hei + 2; - float uvset_offset = 385; materialNameField.Create("MaterialName"); materialNameField.SetTooltip("Set a name for the material..."); @@ -462,134 +460,6 @@ void MaterialWindow::Create(EditorComponent* editor) }); AddWidget(&newMaterialButton); - - - - auto add_texturemap_controls = [&](MaterialComponent::TEXTURESLOT i) - { - auto& slot = slots[i]; - - slot.label.Create(""); - slot.label.SetPos(XMFLOAT2(x, y += step)); - slot.label.SetSize(XMFLOAT2(120, 20)); - AddWidget(&slot.label); - - slot.button.Create(""); - slot.button.SetPos(XMFLOAT2(x + 122, y)); - slot.button.SetSize(XMFLOAT2(260, 20)); - slot.button.OnClick([this, i, &slot](wiEventArgs args) { - MaterialComponent* material = wiScene::GetScene().materials.GetComponent(entity); - if (material == nullptr) - return; - - if (material->textures[i].resource != nullptr) - { - material->textures[i].resource = nullptr; - material->textures[i].name = ""; - material->SetDirty(); - slot.button.SetText(""); - } - else - { - wiHelper::FileDialogParams params; - params.type = wiHelper::FileDialogParams::OPEN; - params.description = "Texture"; - params.extensions.push_back("dds"); - params.extensions.push_back("png"); - params.extensions.push_back("jpg"); - params.extensions.push_back("jpeg"); - params.extensions.push_back("tga"); - params.extensions.push_back("bmp"); - wiHelper::FileDialog(params, [this, material, &slot, i](std::string fileName) { - wiEvent::Subscribe_Once(SYSTEM_EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) { - material->textures[i].resource = wiResourceManager::Load(fileName, wiResourceManager::IMPORT_RETAIN_FILEDATA); - material->textures[i].name = fileName; - material->SetDirty(); - slots[i].button.SetText(wiHelper::GetFileNameFromPath(fileName)); - }); - }); - } - }); - AddWidget(&slot.button); - - slot.uvsetField.Create("uvset"); - slot.uvsetField.SetText(""); - slot.uvsetField.SetTooltip("uv set number"); - slot.uvsetField.SetPos(XMFLOAT2(x + uvset_offset, y)); - slot.uvsetField.SetSize(XMFLOAT2(20, 20)); - slot.uvsetField.OnInputAccepted([this, i](wiEventArgs args) { - MaterialComponent* material = wiScene::GetScene().materials.GetComponent(entity); - if (material != nullptr) - { - material->textures[i].uvset = (uint32_t)args.iValue; - } - }); - AddWidget(&slot.uvsetField); - }; - - for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) - { - add_texturemap_controls((MaterialComponent::TEXTURESLOT)i); - - switch (i) - { - case MaterialComponent::BASECOLORMAP: - slots[i].label.SetText("BaseColorMap:"); - slots[i].button.SetTooltip("RGBA: Basecolor"); - break; - case MaterialComponent::NORMALMAP: - slots[i].label.SetText("NormalMap:"); - slots[i].button.SetTooltip("RGB: Normal"); - break; - case MaterialComponent::SURFACEMAP: - slots[i].label.SetText("SurfaceMap:"); - slots[i].button.SetTooltip("Default workflow: R: Occlusion, G: Roughness, B: Metalness, A: Reflectance\nSpecular-glossiness workflow: RGB: Specular color (f0), A: smoothness"); - break; - case MaterialComponent::EMISSIVEMAP: - slots[i].label.SetText("EmissiveMap:"); - slots[i].button.SetTooltip("RGBA: Emissive"); - break; - case MaterialComponent::OCCLUSIONMAP: - slots[i].label.SetText("OcclusionMap:"); - slots[i].button.SetTooltip("R: Occlusion"); - break; - case MaterialComponent::DISPLACEMENTMAP: - slots[i].label.SetText("DisplacementMap:"); - slots[i].button.SetTooltip("R: Displacement heightmap"); - break; - case MaterialComponent::TRANSMISSIONMAP: - slots[i].label.SetText("TransmissionMap:"); - slots[i].button.SetTooltip("R: Transmission factor"); - break; - case MaterialComponent::SHEENCOLORMAP: - slots[i].label.SetText("SheenColorMap:"); - slots[i].button.SetTooltip("RGB: Sheen color"); - break; - case MaterialComponent::SHEENROUGHNESSMAP: - slots[i].label.SetText("SheenRoughMap:"); - slots[i].button.SetTooltip("A: Roughness"); - break; - case MaterialComponent::CLEARCOATMAP: - slots[i].label.SetText("ClearcoatMap:"); - slots[i].button.SetTooltip("R: Clearcoat factor"); - break; - case MaterialComponent::CLEARCOATROUGHNESSMAP: - slots[i].label.SetText("ClearcoatRoughMap:"); - slots[i].button.SetTooltip("G: Roughness"); - break; - case MaterialComponent::CLEARCOATNORMALMAP: - slots[i].label.SetText("ClearcoatNormMap:"); - slots[i].button.SetTooltip("RGB: Normal"); - break; - case MaterialComponent::SPECULARMAP: - slots[i].label.SetText("SpecularMap:"); - slots[i].button.SetTooltip("RGB: Specular color, A: Specular intensity [non-metal]"); - break; - default: - break; - } - } - colorComboBox.Create("Color picker mode: "); colorComboBox.SetSize(XMFLOAT2(120, hei)); colorComboBox.SetPos(XMFLOAT2(x + 150, y += step)); @@ -626,16 +496,163 @@ void MaterialWindow::Create(EditorComponent* editor) break; case 3: material->SetSubsurfaceScatteringColor(args.color.toFloat3()); - break; + break; case 4: material->SetSheenColor(args.color.toFloat3()); break; } } - }); + }); AddWidget(&colorPicker); + // Textures: + + y += colorPicker.GetScale().y; + + textureSlotComboBox.Create("Texture Slot: "); + textureSlotComboBox.SetSize(XMFLOAT2(170, hei)); + textureSlotComboBox.SetPos(XMFLOAT2(x + 100, y += step)); + for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) + { + switch (i) + { + case MaterialComponent::BASECOLORMAP: + textureSlotComboBox.AddItem("BaseColor map"); + textureSlotButton.SetTooltip("RGBA: Basecolor"); + break; + case MaterialComponent::NORMALMAP: + textureSlotComboBox.AddItem("Normal map"); + textureSlotButton.SetTooltip("RGB: Normal"); + break; + case MaterialComponent::SURFACEMAP: + textureSlotComboBox.AddItem("Surface map"); + textureSlotButton.SetTooltip("Default workflow: R: Occlusion, G: Roughness, B: Metalness, A: Reflectance\nSpecular-glossiness workflow: RGB: Specular color (f0), A: smoothness"); + break; + case MaterialComponent::EMISSIVEMAP: + textureSlotComboBox.AddItem("Emissive map"); + textureSlotButton.SetTooltip("RGBA: Emissive"); + break; + case MaterialComponent::OCCLUSIONMAP: + textureSlotComboBox.AddItem("Occlusion map"); + textureSlotButton.SetTooltip("R: Occlusion"); + break; + case MaterialComponent::DISPLACEMENTMAP: + textureSlotComboBox.AddItem("Displacement map"); + textureSlotButton.SetTooltip("R: Displacement heightmap"); + break; + case MaterialComponent::TRANSMISSIONMAP: + textureSlotComboBox.AddItem("Transmission map"); + textureSlotButton.SetTooltip("R: Transmission factor"); + break; + case MaterialComponent::SHEENCOLORMAP: + textureSlotComboBox.AddItem("SheenColor map"); + textureSlotButton.SetTooltip("RGB: Sheen color"); + break; + case MaterialComponent::SHEENROUGHNESSMAP: + textureSlotComboBox.AddItem("SheenRoughness map"); + textureSlotButton.SetTooltip("A: Roughness"); + break; + case MaterialComponent::CLEARCOATMAP: + textureSlotComboBox.AddItem("Clearcoat map"); + textureSlotButton.SetTooltip("R: Clearcoat factor"); + break; + case MaterialComponent::CLEARCOATROUGHNESSMAP: + textureSlotComboBox.AddItem("ClearcoatRoughness map"); + textureSlotButton.SetTooltip("G: Roughness"); + break; + case MaterialComponent::CLEARCOATNORMALMAP: + textureSlotComboBox.AddItem("ClearcoatNormal map"); + textureSlotButton.SetTooltip("RGB: Normal"); + break; + case MaterialComponent::SPECULARMAP: + textureSlotComboBox.AddItem("Specular map"); + textureSlotButton.SetTooltip("RGB: Specular color, A: Specular intensity [non-metal]"); + break; + default: + break; + } + } + textureSlotComboBox.SetSelected(0); + textureSlotComboBox.OnSelect([this](wiEventArgs args) + { + + MaterialComponent* material = wiScene::GetScene().materials.GetComponent(entity); + if (material == nullptr) + return; + textureSlotButton.SetImage(material->textures[args.iValue].resource); + + }); + textureSlotComboBox.SetTooltip("Choose the texture slot to modify."); + AddWidget(&textureSlotComboBox); + + textureSlotButton.Create(""); + textureSlotButton.SetSize(XMFLOAT2(180, 180)); + textureSlotButton.SetPos(XMFLOAT2(textureSlotComboBox.GetPosition().x + textureSlotComboBox.GetScale().x - textureSlotButton.GetScale().x, y += step)); + textureSlotButton.sprites[wiWidget::IDLE].params.color = wiColor::White(); + textureSlotButton.sprites[wiWidget::FOCUS].params.color = wiColor::Gray(); + textureSlotButton.sprites[wiWidget::ACTIVE].params.color = wiColor::White(); + textureSlotButton.sprites[wiWidget::DEACTIVATING].params.color = wiColor::Gray(); + textureSlotButton.OnClick([this](wiEventArgs args) { + MaterialComponent* material = wiScene::GetScene().materials.GetComponent(entity); + if (material == nullptr) + return; + + int slot = textureSlotComboBox.GetSelected(); + + if (material->textures[slot].resource != nullptr) + { + material->textures[slot].resource = nullptr; + material->textures[slot].name = ""; + material->SetDirty(); + textureSlotLabel.SetText(""); + } + else + { + wiHelper::FileDialogParams params; + params.type = wiHelper::FileDialogParams::OPEN; + params.description = "Texture"; + params.extensions.push_back("dds"); + params.extensions.push_back("png"); + params.extensions.push_back("jpg"); + params.extensions.push_back("jpeg"); + params.extensions.push_back("tga"); + params.extensions.push_back("bmp"); + wiHelper::FileDialog(params, [this, material, slot](std::string fileName) { + wiEvent::Subscribe_Once(SYSTEM_EVENT_THREAD_SAFE_POINT, [=](uint64_t userdata) { + material->textures[slot].resource = wiResourceManager::Load(fileName, wiResourceManager::IMPORT_RETAIN_FILEDATA); + material->textures[slot].name = fileName; + material->SetDirty(); + textureSlotLabel.SetText(wiHelper::GetFileNameFromPath(fileName)); + }); + }); + } + }); + AddWidget(&textureSlotButton); + + y += textureSlotButton.GetScale().y - step + 2; + + textureSlotLabel.Create(""); + textureSlotLabel.SetPos(XMFLOAT2(x, y += step)); + textureSlotLabel.SetSize(XMFLOAT2(colorPicker.GetScale().x - hei - 2, hei)); + AddWidget(&textureSlotLabel); + + textureSlotUvsetField.Create("uvset"); + textureSlotUvsetField.SetText(""); + textureSlotUvsetField.SetTooltip("uv set number"); + textureSlotUvsetField.SetPos(XMFLOAT2(x + textureSlotLabel.GetScale().x + 2, y)); + textureSlotUvsetField.SetSize(XMFLOAT2(hei, hei)); + textureSlotUvsetField.OnInputAccepted([this](wiEventArgs args) { + MaterialComponent* material = wiScene::GetScene().materials.GetComponent(entity); + if (material != nullptr) + { + int slot = textureSlotComboBox.GetSelected(); + material->textures[slot].uvset = (uint32_t)args.iValue; + } + }); + AddWidget(&textureSlotUvsetField); + + Translate(XMFLOAT3((float)editor->GetLogicalWidth() - 880, 120, 0)); SetVisible(false); @@ -693,12 +710,6 @@ void MaterialWindow::SetEntity(Entity entity) } shadingRateComboBox.SetSelected((int)material->shadingRate); - for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) - { - slots[i].button.SetText(wiHelper::GetFileNameFromPath(material->textures[i].name)); - slots[i].uvsetField.SetText(std::to_string(material->textures[i].uvset)); - } - colorComboBox.SetEnabled(true); colorPicker.SetEnabled(true); @@ -742,34 +753,19 @@ void MaterialWindow::SetEntity(Entity entity) sheenRoughnessSlider.SetEnabled(false); clearcoatSlider.SetEnabled(false); clearcoatRoughnessSlider.SetEnabled(false); - slots[MaterialComponent::SHEENCOLORMAP].SetEnabled(false); - slots[MaterialComponent::SHEENROUGHNESSMAP].SetEnabled(false); - slots[MaterialComponent::CLEARCOATMAP].SetEnabled(false); - slots[MaterialComponent::CLEARCOATROUGHNESSMAP].SetEnabled(false); - slots[MaterialComponent::CLEARCOATNORMALMAP].SetEnabled(false); switch (material->shaderType) { case MaterialComponent::SHADERTYPE_PBR_CLOTH: sheenRoughnessSlider.SetEnabled(true); - slots[MaterialComponent::SHEENCOLORMAP].SetEnabled(true); - slots[MaterialComponent::SHEENROUGHNESSMAP].SetEnabled(true); break; case MaterialComponent::SHADERTYPE_PBR_CLEARCOAT: clearcoatSlider.SetEnabled(true); clearcoatRoughnessSlider.SetEnabled(true); - slots[MaterialComponent::CLEARCOATMAP].SetEnabled(true); - slots[MaterialComponent::CLEARCOATROUGHNESSMAP].SetEnabled(true); - slots[MaterialComponent::CLEARCOATNORMALMAP].SetEnabled(true); break; case MaterialComponent::SHADERTYPE_PBR_CLOTH_CLEARCOAT: sheenRoughnessSlider.SetEnabled(true); clearcoatSlider.SetEnabled(true); clearcoatRoughnessSlider.SetEnabled(true); - slots[MaterialComponent::SHEENCOLORMAP].SetEnabled(true); - slots[MaterialComponent::SHEENROUGHNESSMAP].SetEnabled(true); - slots[MaterialComponent::CLEARCOATMAP].SetEnabled(true); - slots[MaterialComponent::CLEARCOATROUGHNESSMAP].SetEnabled(true); - slots[MaterialComponent::CLEARCOATNORMALMAP].SetEnabled(true); break; } sheenRoughnessSlider.SetValue(material->sheenRoughness); @@ -783,6 +779,11 @@ void MaterialWindow::SetEntity(Entity entity) reflectanceSlider.SetEnabled(false); metalnessSlider.SetEnabled(false); } + + int slot = textureSlotComboBox.GetSelected(); + textureSlotButton.SetImage(material->textures[slot].resource); + textureSlotLabel.SetText(wiHelper::GetFileNameFromPath(material->textures[slot].name)); + textureSlotUvsetField.SetText(std::to_string(material->textures[slot].uvset)); } else { @@ -791,11 +792,9 @@ void MaterialWindow::SetEntity(Entity entity) colorComboBox.SetEnabled(false); colorPicker.SetEnabled(false); - for (int i = 0; i < MaterialComponent::TEXTURESLOT_COUNT; ++i) - { - slots[i].button.SetText(""); - slots[i].uvsetField.SetText(""); - } + textureSlotButton.SetImage(nullptr); + textureSlotLabel.SetText(""); + textureSlotUvsetField.SetText(""); } newMaterialButton.SetEnabled(true); diff --git a/Editor/MaterialWindow.h b/Editor/MaterialWindow.h index a5336027a..aa7d0ad77 100644 --- a/Editor/MaterialWindow.h +++ b/Editor/MaterialWindow.h @@ -44,23 +44,12 @@ public: wiSlider clearcoatSlider; wiSlider clearcoatRoughnessSlider; - struct TextureSlotControls - { - std::string name; - wiLabel label; - wiButton button; - wiTextInputField uvsetField; - - void SetEnabled(bool value) - { - label.SetEnabled(value); - button.SetEnabled(value); - uvsetField.SetEnabled(value); - } - }; - TextureSlotControls slots[wiScene::MaterialComponent::TEXTURESLOT_COUNT]; - wiComboBox colorComboBox; wiColorPicker colorPicker; + + wiComboBox textureSlotComboBox; + wiButton textureSlotButton; + wiLabel textureSlotLabel; + wiTextInputField textureSlotUvsetField; }; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index dd8f6fbf6..f14c5a226 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking compatibility changes const int minor = 56; // minor bug fixes, alterations, refactors, updates - const int revision = 25; + const int revision = 26; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision); diff --git a/WickedEngine/wiWidget.cpp b/WickedEngine/wiWidget.cpp index 265d6632f..db729a580 100644 --- a/WickedEngine/wiWidget.cpp +++ b/WickedEngine/wiWidget.cpp @@ -254,6 +254,20 @@ wiColor wiWidget::GetColor() const { return wiColor::fromFloat4(sprites[GetState()].params.color); } +void wiWidget::SetImage(std::shared_ptr textureResource, WIDGETSTATE state) +{ + if (state == WIDGETSTATE_COUNT) + { + for (int i = 0; i < WIDGETSTATE_COUNT; ++i) + { + sprites[i].textureResource = textureResource; + } + } + else + { + sprites[state].textureResource = textureResource; + } +} void wiWidget::AttachTo(wiWidget* parent) { diff --git a/WickedEngine/wiWidget.h b/WickedEngine/wiWidget.h index d6d552a2f..e9cd237bd 100644 --- a/WickedEngine/wiWidget.h +++ b/WickedEngine/wiWidget.h @@ -66,6 +66,8 @@ public: // last param default: set color for all states void SetColor(wiColor color, WIDGETSTATE state = WIDGETSTATE_COUNT); wiColor GetColor() const; + // last param default: set color for all states + void SetImage(std::shared_ptr textureResource, WIDGETSTATE state = WIDGETSTATE_COUNT); virtual void Update(const wiCanvas& canvas, float dt); virtual void Render(const wiCanvas& canvas, wiGraphics::CommandList cmd) const = 0;