editor: material window texture slot visualizer

This commit is contained in:
Turanszki Janos
2021-05-30 18:23:04 +02:00
parent d26a31d3bb
commit 6c6f650b1c
5 changed files with 180 additions and 176 deletions
+158 -159
View File
@@ -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);