editor: material window texture slot visualizer
This commit is contained in:
+158
-159
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user