added material editing in mesh panel. Renamed mesh component to model component.

This commit is contained in:
a.pilote
2022-07-17 14:15:11 -04:00
parent dbec248d8a
commit 5fb1e376c2
13 changed files with 298 additions and 28 deletions

View File

@@ -0,0 +1,249 @@
#include "MaterialEditor.h"
#include <imgui/imgui.h>
#include <src/Resource/FontAwesome5.h>
#include <src/Vendors/imgui/imgui_internal.h>
#include "../Misc/InterfaceFonts.h"
void MaterialEditor::Draw(Ref<Nuake::Material> material)
{
using namespace Nuake;
std::string materialTitle = material->Path;
{
UIFont boldfont = UIFont(Fonts::SubTitle);
ImGui::Text(material->Path.c_str());
}
ImGui::SameLine();
{
UIFont boldfont = UIFont(Fonts::Icons);
if (ImGui::Button(ICON_FA_SAVE))
{
std::string fileData = material->Serialize().dump(4);
FileSystem::BeginWriteFile(FileSystem::Root + material->Path);
FileSystem::WriteLine(fileData);
FileSystem::EndWriteFile();
}
}
bool flagsHeaderOpened;
{
UIFont boldfont = UIFont(Fonts::Bold);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.f, 0.f));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.f, 8.f));
flagsHeaderOpened = ImGui::CollapsingHeader(" FLAGS", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleVar(2);
}
if (flagsHeaderOpened)
{
ImGui::BeginTable("##Flags", 3, ImGuiTableFlags_BordersInner);
{
ImGui::TableSetupColumn("name", 0, 0.3f);
ImGui::TableSetupColumn("set", 0, 0.6f);
ImGui::TableSetupColumn("reset", 0, 0.1f);
ImGui::TableNextColumn();
ImGui::Text("Unlit");
ImGui::TableNextColumn();
bool unlit = material->data.u_Unlit == 1;
ImGui::Checkbox("Unlit", &unlit);
material->data.u_Unlit = (int)unlit;
}
ImGui::EndTable();
}
const auto TexturePanelHeight = 100;
const ImVec2 TexturePanelSize = ImVec2(0, TexturePanelHeight);
bool AlbedoOpened;
{
UIFont boldfont = UIFont(Fonts::Bold);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.f, 0.f));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.f, 8.f));
AlbedoOpened = ImGui::CollapsingHeader("Albedo", ImGuiTreeNodeFlags_DefaultOpen);
ImGui::PopStyleVar(2);
}
if (AlbedoOpened)
{
ImGui::BeginChild("##albedo", TexturePanelSize, true);
{
uint32_t textureID = 0;
if (material->HasAlbedo())
{
textureID = material->m_Albedo->GetID();
}
else
{
textureID = TextureManager::Get()->GetTexture("default")->GetID();
}
if (ImGui::ImageButtonEx(ImGui::GetCurrentWindow()->GetID("#image1"), (void*)textureID, ImVec2(80, 80), ImVec2(0, 1), ImVec2(1, 0), ImVec2(2, 2), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)))
{
std::string texture = FileDialog::OpenFile("*.png | *.jpg");
if (texture != "")
{
material->SetAlbedo(TextureManager::Get()->GetTexture(texture));
}
}
if (ImGui::BeginPopupContextWindow())
{
if (ImGui::MenuItem("Clear Texture"))
{
material->m_Albedo = nullptr;
}
ImGui::EndPopup();
}
ImGui::SameLine();
ImGui::ColorEdit3("Color", &material->data.m_AlbedoColor.r);
}
ImGui::EndChild();
}
if (ImGui::CollapsingHeader("Normal", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::BeginChild("##normal", TexturePanelSize, true);
{
uint32_t textureID = 0;
if (material->HasNormal())
{
textureID = material->m_Normal->GetID();
}
else
{
textureID = TextureManager::Get()->GetTexture("default")->GetID();
}
if (ImGui::ImageButtonEx(ImGui::GetCurrentWindow()->GetID("#image3"), (void*)textureID, ImVec2(80, 80), ImVec2(0, 1), ImVec2(1, 0), ImVec2(2, 2), ImVec4(0, 0, 0, 1), ImVec4(1, 1, 1, 1)))
{
std::string texture = FileDialog::OpenFile("*.png | *.jpg");
if (texture != "")
{
material->SetNormal(TextureManager::Get()->GetTexture(texture));
}
}
if (ImGui::BeginPopupContextWindow())
{
if (ImGui::MenuItem("Clear Texture"))
{
material->m_Normal = nullptr;
}
ImGui::EndPopup();
}
}
ImGui::EndChild();
}
if (ImGui::CollapsingHeader("AO", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::BeginChild("##ao", TexturePanelSize, true);
{
uint32_t textureID = 0;
if (material->HasAO())
{
textureID = material->m_AO->GetID();
}
else
{
textureID = TextureManager::Get()->GetTexture("default")->GetID();
}
if (ImGui::ImageButtonEx(ImGui::GetCurrentWindow()->GetID("#image2"), (void*)textureID, ImVec2(80, 80), ImVec2(0, 1), ImVec2(1, 0), ImVec2(2, 2), ImVec4(1, 1, 1, 1), ImVec4(1, 1, 1, 1)))
{
std::string texture = FileDialog::OpenFile("Image files (*.png) | *.png | Image files (*.jpg) | *.jpg");
if (texture != "")
{
material->SetAO(TextureManager::Get()->GetTexture(texture));
}
}
if (ImGui::BeginPopupContextWindow())
{
if (ImGui::MenuItem("Clear Texture"))
{
material->m_AO = nullptr;
}
ImGui::EndPopup();
}
}
ImGui::EndChild();
}
if (ImGui::CollapsingHeader("Metalness", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::BeginChild("##metalness", TexturePanelSize, true);
{
uint32_t textureID = 0;
if (material->HasMetalness())
{
textureID = material->m_Metalness->GetID();
}
else
{
textureID = TextureManager::Get()->GetTexture("default")->GetID();
}
if (ImGui::ImageButtonEx(ImGui::GetCurrentWindow()->GetID("#image4"), (void*)textureID, ImVec2(80, 80), ImVec2(0, 1), ImVec2(1, 0), ImVec2(2, 2), ImVec4(0, 0, 0, 1), ImVec4(1, 1, 1, 1)))
{
std::string texture = FileDialog::OpenFile("*.png | *.jpg");
if (texture != "")
{
material->SetMetalness(TextureManager::Get()->GetTexture(texture));
}
}
if (ImGui::BeginPopupContextWindow())
{
if (ImGui::MenuItem("Clear Texture"))
{
material->m_Metalness = nullptr;
}
ImGui::EndPopup();
}
ImGui::SameLine();
ImGui::DragFloat("Value##4", &material->data.u_MetalnessValue, 0.01f, 0.0f, 1.0f);
}
ImGui::EndChild();
}
if (ImGui::CollapsingHeader("Roughness", ImGuiTreeNodeFlags_DefaultOpen))
{
ImGui::BeginChild("##roughness", TexturePanelSize, true);
{
uint32_t textureID = 0;
if (material->HasRoughness())
{
textureID = material->m_Roughness->GetID();
}
else
{
textureID = TextureManager::Get()->GetTexture("default")->GetID();
}
if (ImGui::ImageButtonEx(ImGui::GetCurrentWindow()->GetID("#image5"), (void*)textureID, ImVec2(80, 80), ImVec2(0, 1), ImVec2(1, 0), ImVec2(2, 2), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1)))
{
std::string texture = FileDialog::OpenFile("*.png | *.jpg");
if (texture != "")
{
material->SetRoughness(TextureManager::Get()->GetTexture(texture));
}
}
if (ImGui::BeginPopupContextWindow())
{
if (ImGui::MenuItem("Clear Texture"))
{
material->m_Roughness = nullptr;
}
ImGui::EndPopup();
}
}
ImGui::EndChild();
}
}

View File

@@ -0,0 +1,12 @@
#pragma once
#include <src/Core/Core.h>
#include <src/Rendering/Textures/Material.h>
class MaterialEditor
{
public:
MaterialEditor() = default;
~MaterialEditor() = default;
void Draw(Ref<Nuake::Material> material);
};

View File

@@ -4,7 +4,7 @@
#include "ModelResourceInspector.h"
#include <src/Scene/Entities/ImGuiHelper.h>
#include <src/Scene/Components/MeshComponent.h>
#include <src/Scene/Components/ModelComponent.h>
#include <src/Resource/ResourceLoader.h>
#include <src/Core/String.h>
@@ -21,13 +21,14 @@ public:
void Draw(Nuake::Entity entity) override
{
if (!entity.HasComponent<Nuake::MeshComponent>())
using namespace Nuake;
if (!entity.HasComponent<ModelComponent>())
return;
Nuake::MeshComponent& component = entity.GetComponent<Nuake::MeshComponent>();
BeginComponentTable(MESH, Nuake::MeshComponent);
ModelComponent& component = entity.GetComponent<ModelComponent>();
BeginComponentTable(MESH, ModelComponent);
{
ImGui::Text("Mesh");
ImGui::Text("Model");
ImGui::TableNextColumn();
std::string label = std::to_string(component.ModelResource->ID);

View File

@@ -1,5 +1,6 @@
#include "ModelResourceInspector.h"
#include <imgui/imgui.h>
#include "MaterialEditor.h"
ModelResourceInspector::ModelResourceInspector(Ref<Nuake::Model> model)
{
@@ -8,16 +9,23 @@ ModelResourceInspector::ModelResourceInspector(Ref<Nuake::Model> model)
void ModelResourceInspector::Draw()
{
ImGui::BeginChild("modelInspector",ImVec2(0,0), true);
ImGui::BeginChild("modelInspector", ImVec2(0, 0), true);
{
for (uint32_t i = 0; i < std::size(_model->GetMeshes()); i++)
{
std::string headerLabel = "Mesh " + std::to_string(i);
if (ImGui::CollapsingHeader(headerLabel.c_str()))
{
std::string childId = "materialEditor" + std::to_string(i);
ImGui::BeginChild(childId.c_str(), ImVec2(0, 0), false);
{
MaterialEditor editor;
editor.Draw(_model->GetMeshes().at(i)->GetMaterial());
}
ImGui::EndChild();
}
}
}
ImGui::EndChild();
}