From 13eb9261ebad48d2c58954ea2d6f679452ab07a7 Mon Sep 17 00:00:00 2001 From: Jean Philippe Date: Sat, 6 Aug 2022 13:19:18 +0100 Subject: [PATCH 1/2] added entity material component visualization --- .../Components/InspectorViewUIComponent.cpp | 38 +++++++++- .../src/Helpers/UIComponentDrawerHelper.cpp | 74 +++++++++++++++++-- .../src/Helpers/UIComponentDrawerHelper.h | 7 ++ .../Rendering/Materials/StandardMaterial.h | 7 ++ .../ZEngine/Rendering/Textures/Texture.h | 12 +++ ZEngine/src/StandardMaterial.cpp | 20 +++++ 6 files changed, 151 insertions(+), 7 deletions(-) diff --git a/Tetragrama/src/Components/InspectorViewUIComponent.cpp b/Tetragrama/src/Components/InspectorViewUIComponent.cpp index ffdc6fd9..53c14815 100644 --- a/Tetragrama/src/Components/InspectorViewUIComponent.cpp +++ b/Tetragrama/src/Components/InspectorViewUIComponent.cpp @@ -81,7 +81,43 @@ namespace Tetragrama::Components { if (m_scene_entity->HasComponent()) { - if (ImGui::TreeNodeEx(reinterpret_cast(typeid(MaterialComponent).hash_code()), ImGuiTreeNodeFlags_DefaultOpen, "%s", "Material")) { + if (ImGui::TreeNodeEx(reinterpret_cast(typeid(MaterialComponent).hash_code()), ImGuiTreeNodeFlags_DefaultOpen, "%s", "Materials")) { + auto& component = m_scene_entity->GetComponent(); + auto material = component.GetMaterial(); + auto material_shader_type = material->GetShaderBuiltInType(); + + const char* built_in_shader_type[] = {"Basic", "Standard"}; + + auto material_name = fmt::format("{0} Material", built_in_shader_type[(int) material_shader_type]); + ImGui::Dummy(ImVec2(0, 3)); + Helpers::DrawInputTextControl("Name", material_name, nullptr, true); + + if (material_shader_type == ZEngine::Rendering::Shaders::ShaderBuiltInType::STANDARD) { + auto standard_material = reinterpret_cast(material.get()); + + ImGui::Dummy(ImVec2(0, 0.5f)); + + float tile_factor = standard_material->GetTileFactor(); + Helpers::DrawDragFloatControl( + "Tile Factor", tile_factor, 0.2f, 0.0f, 0.0f, "%.2f", [standard_material](float value) { standard_material->SetTileFactor(value); }); + ImGui::Dummy(ImVec2(0, 0.5f)); + + float shininess = standard_material->GetShininess(); + Helpers::DrawDragFloatControl( + "Shininess", shininess, 0.2f, 0.0f, 0.0f, "%.2f", [standard_material](float value) { standard_material->SetShininess(value); }); + ImGui::Dummy(ImVec2(0, 0.5f)); + + auto tint_color = standard_material->GetTintColor(); + auto diffuse_texture = standard_material->GetDiffuseMap(); + Helpers::DrawTextureColorControl("Diffuse Map", reinterpret_cast(diffuse_texture->GetIdentifier()), tint_color, true, nullptr, + [standard_material](auto& value) { standard_material->SetTintColor(value); }); + ImGui::Dummy(ImVec2(0, 0.5f)); + + auto specular_texture = standard_material->GetSpecularMap(); + Helpers::DrawTextureColorControl("Specular Map", reinterpret_cast(specular_texture->GetIdentifier())); + ImGui::Dummy(ImVec2(0, 0.5f)); + } + ImGui::TreePop(); } ImGui::Dummy(ImVec2(0, 5)); diff --git a/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp b/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp index dc45be50..ca08b8a9 100644 --- a/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp +++ b/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp @@ -262,9 +262,6 @@ namespace Tetragrama::Helpers { ImGui::PushMultiItemsWidths(1, ImGui::CalcItemWidth() + 60.f); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0.5f, 0}); - float line_height = GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; - ImVec2 input_control_size = {line_height + 3.0f, line_height}; - char buffer[1024]; memset(buffer, 0, sizeof(buffer)); auto raw_entity_name = content.data(); @@ -298,9 +295,6 @@ namespace Tetragrama::Helpers { ImGui::PushMultiItemsWidths(1, ImGui::CalcItemWidth() + 60.f); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0.5f, 0}); - float line_height = GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; - ImVec2 input_control_size = {line_height + 3.0f, line_height}; - if (ImGui::DragFloat("##DragFloat", &value, increment_speed, min_value, max_value, fmt.data())) { if (callback) { callback(value); @@ -335,4 +329,72 @@ namespace Tetragrama::Helpers { ImGui::EndTable(); ImGui::PopID(); } + + void DrawColorEdit4Control( + std::string_view label, ZEngine::Maths::Vector4& values, const std::function& callback, float default_value, float column_width) { + ImGui::PushID(label.data()); + + ImGui::Columns(2); + + ImGui::SetColumnWidth(0, column_width); + ImGui::Text(label.data()); + ImGui::NextColumn(); + + ImGui::PushMultiItemsWidths(1, ImGui::CalcItemWidth() + 60.f); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0.5f, 0}); + + if (ImGui::ColorEdit4("##TintColor", ZEngine::Maths::value_ptr(values))) { + if (callback) { + callback(values); + } + } + + ImGui::PopItemWidth(); + ImGui::PopStyleVar(); + ImGui::Columns(1); + ImGui::PopID(); + } + + void DrawTextureColorControl(std::string_view label, ImTextureID texture_id, ZEngine::Maths::Vector4& tint_color, bool enable_zoom, + const std::function& image_click_callback, const std::function& tint_color_change_callback, float column_width) { + ImGui::PushID(label.data()); + ImGui::Columns(2); + + ImGui::SetColumnWidth(0, column_width); + ImGui::Text(label.data()); + ImGui::NextColumn(); + + ImGui::PushMultiItemsWidths(1, ImGui::CalcItemWidth() + 60.f); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0.5f, 0}); + + float line_height = GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; + ImVec2 button_size = {line_height + 3.0f, line_height}; + + if (ImGui::ImageButton(texture_id, button_size, ImVec2(0, 0), ImVec2(1, 1), 1, ImVec4(0, 0, 0, 0), ImVec4{tint_color.x, tint_color.y, tint_color.z, tint_color.w})) { + if (image_click_callback) { + image_click_callback(); + } + } + if (enable_zoom) { + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::Image(texture_id, ImVec2(200, 200), {0, 0}, {1, 1}, ImVec4{tint_color.x, tint_color.y, tint_color.z, tint_color.w}); + ImGui::EndTooltip(); + } + } + ImGui::PopItemWidth(); + + ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(1, 4)); + if (ImGui::ColorEdit4("##TintColor", ZEngine::Maths::value_ptr(tint_color))) { + if (tint_color_change_callback) { + tint_color_change_callback(tint_color); + } + } + ImGui::PopItemWidth(); + + ImGui::PopStyleVar(2); + ImGui::Columns(1); + ImGui::PopID(); + } } // namespace Tetragrama::Helpers diff --git a/Tetragrama/src/Helpers/UIComponentDrawerHelper.h b/Tetragrama/src/Helpers/UIComponentDrawerHelper.h index 22bead93..cacff59f 100644 --- a/Tetragrama/src/Helpers/UIComponentDrawerHelper.h +++ b/Tetragrama/src/Helpers/UIComponentDrawerHelper.h @@ -16,4 +16,11 @@ namespace Tetragrama::Helpers { const std::function& callback = nullptr, float column_width = 100.0f); void DrawCenteredButtonControl(std::string_view label, const std::function& callback = nullptr); + + void DrawColorEdit4Control(std::string_view label, ZEngine::Maths::Vector4& values, const std::function& callback = nullptr, + float default_value = 0.0f, float column_width = 100.0f); + + void DrawTextureColorControl(std::string_view label, ImTextureID texture_id, ZEngine::Maths::Vector4& values = ZEngine::Maths::Vector4{1, 1, 1, 1}, bool enable_zoom = true, + const std::function& image_click_callback = nullptr, const std::function& tint_color_change_callback = nullptr, + float column_width = 100.0f); } // namespace Tetragrama::Helpers diff --git a/ZEngine/include/ZEngine/Rendering/Materials/StandardMaterial.h b/ZEngine/include/ZEngine/Rendering/Materials/StandardMaterial.h index 9d1f90b7..082f3745 100644 --- a/ZEngine/include/ZEngine/Rendering/Materials/StandardMaterial.h +++ b/ZEngine/include/ZEngine/Rendering/Materials/StandardMaterial.h @@ -30,6 +30,13 @@ namespace ZEngine::Rendering::Materials { void SetTexture(Textures::Texture* const texture) override; void SetTexture(const Ref& texture) override; + float GetTileFactor() const; + float GetShininess() const; + const Maths::Vector4& GetTintColor() const; + + Ref GetSpecularMap() const; + Ref GetDiffuseMap() const; + private: float m_shininess; float m_tile_factor; diff --git a/ZEngine/include/ZEngine/Rendering/Textures/Texture.h b/ZEngine/include/ZEngine/Rendering/Textures/Texture.h index db0c75fc..797aebdd 100644 --- a/ZEngine/include/ZEngine/Rendering/Textures/Texture.h +++ b/ZEngine/include/ZEngine/Rendering/Textures/Texture.h @@ -29,6 +29,18 @@ namespace ZEngine::Rendering::Textures { return m_texture_id; } + unsigned int GetWidth() const { + return m_width; + } + + unsigned int GetHeight() const { + return m_height; + } + + std::string_view GetFilePath() { + return m_path; + } + protected: std::string m_path; GLuint m_texture_id{0}; diff --git a/ZEngine/src/StandardMaterial.cpp b/ZEngine/src/StandardMaterial.cpp index 3635aa4d..a6a3958b 100644 --- a/ZEngine/src/StandardMaterial.cpp +++ b/ZEngine/src/StandardMaterial.cpp @@ -55,6 +55,26 @@ namespace ZEngine::Rendering::Materials { SetDiffuseMap(texture); } + float StandardMaterial::GetTileFactor() const { + return m_tile_factor; + } + + float StandardMaterial::GetShininess() const { + return m_shininess; + } + + const Maths::Vector4& StandardMaterial::GetTintColor() const { + return m_tint_color; + } + + Ref StandardMaterial::GetSpecularMap() const { + return m_specular_map; + } + + Ref StandardMaterial::GetDiffuseMap() const { + return m_texture; + } + void StandardMaterial::SetTexture(Textures::Texture* const texture) { SetDiffuseMap(texture); } From fe463f1a51a09aff415586acb6c81af47a9bfee7 Mon Sep 17 00:00:00 2001 From: Jean Philippe Date: Sat, 6 Aug 2022 16:59:16 +0100 Subject: [PATCH 2/2] fixed build error --- .../src/Components/InspectorViewUIComponent.cpp | 5 +++-- .../src/Helpers/UIComponentDrawerHelper.cpp | 16 ++++++++-------- Tetragrama/src/Helpers/UIComponentDrawerHelper.h | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Tetragrama/src/Components/InspectorViewUIComponent.cpp b/Tetragrama/src/Components/InspectorViewUIComponent.cpp index 53c14815..2a91bb1b 100644 --- a/Tetragrama/src/Components/InspectorViewUIComponent.cpp +++ b/Tetragrama/src/Components/InspectorViewUIComponent.cpp @@ -113,8 +113,9 @@ namespace Tetragrama::Components { [standard_material](auto& value) { standard_material->SetTintColor(value); }); ImGui::Dummy(ImVec2(0, 0.5f)); - auto specular_texture = standard_material->GetSpecularMap(); - Helpers::DrawTextureColorControl("Specular Map", reinterpret_cast(specular_texture->GetIdentifier())); + auto specular_texture = standard_material->GetSpecularMap(); + auto specular_tint_color = ZEngine::Maths::Vector4{1, 1, 1, 1}; + Helpers::DrawTextureColorControl("Specular Map", reinterpret_cast(specular_texture->GetIdentifier()), specular_tint_color); ImGui::Dummy(ImVec2(0, 0.5f)); } diff --git a/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp b/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp index ca08b8a9..a91a6c96 100644 --- a/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp +++ b/Tetragrama/src/Helpers/UIComponentDrawerHelper.cpp @@ -6,7 +6,7 @@ namespace Tetragrama::Helpers { void DrawVec4Control( std::string_view label, ZEngine::Maths::Vector4& values, const std::function& callback, float default_value, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); @@ -108,7 +108,7 @@ namespace Tetragrama::Helpers { void DrawVec3Control( std::string_view label, ZEngine::Maths::Vector3& values, const std::function& callback, float default_value, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); @@ -192,7 +192,7 @@ namespace Tetragrama::Helpers { void DrawVec2Control( std::string_view label, ZEngine::Maths::Vector2& values, const std::function& callback, float default_value, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); @@ -252,7 +252,7 @@ namespace Tetragrama::Helpers { void DrawInputTextControl(std::string_view label, std::string_view content, const std::function& callback, bool read_only_mode, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); ImGui::SetColumnWidth(0, column_width); @@ -285,7 +285,7 @@ namespace Tetragrama::Helpers { void DrawDragFloatControl(std::string_view label, float value, float increment_speed, float min_value, float max_value, std::string_view fmt, const std::function& callback, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); ImGui::SetColumnWidth(0, column_width); @@ -308,7 +308,7 @@ namespace Tetragrama::Helpers { void DrawCenteredButtonControl(std::string_view label, const std::function& callback) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::BeginTable("##table", 3); @@ -332,7 +332,7 @@ namespace Tetragrama::Helpers { void DrawColorEdit4Control( std::string_view label, ZEngine::Maths::Vector4& values, const std::function& callback, float default_value, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); @@ -357,7 +357,7 @@ namespace Tetragrama::Helpers { void DrawTextureColorControl(std::string_view label, ImTextureID texture_id, ZEngine::Maths::Vector4& tint_color, bool enable_zoom, const std::function& image_click_callback, const std::function& tint_color_change_callback, float column_width) { - ImGui::PushID(label.data()); + ImGui::PushID(label.data(), (label.data() + label.size())); ImGui::Columns(2); ImGui::SetColumnWidth(0, column_width); diff --git a/Tetragrama/src/Helpers/UIComponentDrawerHelper.h b/Tetragrama/src/Helpers/UIComponentDrawerHelper.h index cacff59f..e62a8806 100644 --- a/Tetragrama/src/Helpers/UIComponentDrawerHelper.h +++ b/Tetragrama/src/Helpers/UIComponentDrawerHelper.h @@ -20,7 +20,7 @@ namespace Tetragrama::Helpers { void DrawColorEdit4Control(std::string_view label, ZEngine::Maths::Vector4& values, const std::function& callback = nullptr, float default_value = 0.0f, float column_width = 100.0f); - void DrawTextureColorControl(std::string_view label, ImTextureID texture_id, ZEngine::Maths::Vector4& values = ZEngine::Maths::Vector4{1, 1, 1, 1}, bool enable_zoom = true, + void DrawTextureColorControl(std::string_view label, ImTextureID texture_id, ZEngine::Maths::Vector4& texture_tint_color, bool enable_zoom = true, const std::function& image_click_callback = nullptr, const std::function& tint_color_change_callback = nullptr, float column_width = 100.0f); } // namespace Tetragrama::Helpers