diff --git a/.gitmodules b/.gitmodules index 37f5ea2..be2e8f8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,6 @@ [submodule "Prism/vendor/assimp"] path = Prism/vendor/assimp url = https://github.com/assimp/assimp.git +[submodule "Prism/vendor/ImGuizmo"] + path = Prism/vendor/ImGuizmo + url = https://github.com/CedricGuillemet/ImGuizmo.git diff --git a/Editor/Editor/EditorLayer.cpp b/Editor/Editor/EditorLayer.cpp index 82a8fb0..76525fe 100644 --- a/Editor/Editor/EditorLayer.cpp +++ b/Editor/Editor/EditorLayer.cpp @@ -4,6 +4,9 @@ #include "EditorLayer.h" +#include "ImGuizmo.h" +#include "Prism/Core/KeyCodes.h" + namespace Prism { enum class PropertyFlag @@ -201,6 +204,9 @@ namespace Prism m_Light.Direction = {-0.5f, -0.5f, 1.0f}; m_Light.Radiance = {1.0f, 1.0f, 1.0f}; + + + m_Transform = glm::scale(glm::mat4(1.0f), glm::vec3(m_MeshScale)); } void EditorLayer::OnDetach() @@ -305,7 +311,7 @@ namespace Prism { if (m_Mesh) { - m_Mesh->Render(deltaTime, scale(mat4(1.0f), vec3(m_MeshScale)), m_MeshMaterial); + m_Mesh->Render(deltaTime, m_Transform, m_MeshMaterial); } } @@ -678,9 +684,20 @@ namespace Prism auto viewportSize = ImGui::GetContentRegionAvail(); m_Framebuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y); m_FinalPresentBuffer->Resize((uint32_t)viewportSize.x, (uint32_t)viewportSize.y); - m_Camera.SetProjectionMatrix(glm::perspectiveFov(glm::radians(45.0f), viewportSize.x, viewportSize.y, 0.1f, - 10000.0f)); + m_Camera.SetProjectionMatrix(glm::perspectiveFov(glm::radians(45.0f), viewportSize.x, viewportSize.y, 0.1f, 10000.0f)); ImGui::Image((ImTextureRef)m_FinalPresentBuffer->GetColorAttachmentRendererID(), viewportSize, {0, 1}, {1, 0}); + + // ImGuizmo + if (m_GizmoType != -1) + { + const float rw = (float)ImGui::GetWindowWidth(); + const float rh = (float)ImGui::GetWindowHeight(); + ImGuizmo::SetOrthographic(false); + ImGuizmo::SetDrawlist(); + ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, rw, rh); + ImGuizmo::Manipulate(glm::value_ptr(m_Camera.GetViewMatrix()), glm::value_ptr(m_Camera.GetProjectionMatrix()), (ImGuizmo::OPERATION)m_GizmoType, ImGuizmo::LOCAL, glm::value_ptr(m_Transform)); + } + ImGui::End(); ImGui::PopStyleVar(); @@ -702,6 +719,27 @@ namespace Prism void EditorLayer::OnEvent(Event& e) { - Layer::OnEvent(e); + EventDispatcher dispatcher(e); + dispatcher.Dispatch(HZ_BIND_EVENT_FN(EditorLayer::OnKeyPressedEvent)); + } + + bool EditorLayer::OnKeyPressedEvent(KeyPressedEvent& e) + { + switch (e.GetKeyCode()) + { + case PM_KEY_Q: + m_GizmoType = -1; + break; + case PM_KEY_W: + m_GizmoType = ImGuizmo::OPERATION::TRANSLATE; + break; + case PM_KEY_E: + m_GizmoType = ImGuizmo::OPERATION::ROTATE; + break; + case PM_KEY_R: + m_GizmoType = ImGuizmo::OPERATION::SCALE; + break; + } + return false; } } diff --git a/Editor/Editor/EditorLayer.h b/Editor/Editor/EditorLayer.h index 95baa70..1ac23cb 100644 --- a/Editor/Editor/EditorLayer.h +++ b/Editor/Editor/EditorLayer.h @@ -21,6 +21,9 @@ public: virtual void OnImGuiRender() override; virtual void OnEvent(Event& e) override; +private: + bool OnKeyPressedEvent(KeyPressedEvent& e); + private: float m_ClearColor[4]; @@ -54,6 +57,10 @@ private: Ref m_Shader; Ref m_PBRShader; + // Imguizmo + int m_GizmoType = -1; // -1 = no gizmo + glm::mat4 m_Transform; + struct AlbedoInput { diff --git a/Prism/CMakeLists.txt b/Prism/CMakeLists.txt index 1bd70f2..28108bf 100644 --- a/Prism/CMakeLists.txt +++ b/Prism/CMakeLists.txt @@ -17,7 +17,11 @@ add_subdirectory(vendor/TinyFileDialog EXCLUDE_FROM_ALL) # ------------- imgui ------------- set(IMGUI_DIR vendor/ImGui) -include_directories(${IMGUI_DIR} ${IMGUI_DIR}/backends) +include_directories( + ${IMGUI_DIR} + ${IMGUI_DIR}/backends +) + file(GLOB IMGUI_SOURCE ${IMGUI_DIR}/*.cpp ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp @@ -26,6 +30,17 @@ file(GLOB IMGUI_SOURCE # add imgui source list(APPEND SRC_SOURCE ${IMGUI_SOURCE}) + +# ------------- ImGuizmo ------------- +set(IMGUIZMO_DIR vendor/ImGuizmo) +include_directories(${IMGUIZMO_DIR}) +file(GLOB IMGUIZMO_SOURCE ${IMGUIZMO_DIR}/*.cpp) + +# add imguizmo source +list(APPEND SRC_SOURCE ${IMGUIZMO_SOURCE}) + + + # ------------- link libraries ------------- set(LINK_LIBRARIES_PRIVATE spdlog @@ -53,6 +68,7 @@ endif() set(TARGET_INCLUDE_DIR $ ${IMGUI_DIR} + ${IMGUIZMO_DIR} ) # ------------- debug Defines ------------- diff --git a/Prism/src/Prism/Core/Core.cpp b/Prism/src/Prism/Core/Core.cpp index 57c7877..75265f6 100644 --- a/Prism/src/Prism/Core/Core.cpp +++ b/Prism/src/Prism/Core/Core.cpp @@ -27,6 +27,7 @@ namespace Prism { #ifdef PRISM_SHARED #if defined(_WIN32) +#include BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, diff --git a/Prism/src/Prism/Core/ImGui/ImGuiLayer.cpp b/Prism/src/Prism/Core/ImGui/ImGuiLayer.cpp index 27dba64..30edb96 100644 --- a/Prism/src/Prism/Core/ImGui/ImGuiLayer.cpp +++ b/Prism/src/Prism/Core/ImGui/ImGuiLayer.cpp @@ -8,8 +8,8 @@ #include "imgui_impl_glfw.h" #include "GLFW/glfw3.h" #include "Prism/Core/Application.h" +#include "ImGuizmo.h" -#include "Prism/Core/Log.h" namespace Prism { @@ -32,6 +32,7 @@ namespace Prism ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); + ImGuizmo::BeginFrame(); } void ImGuiLayer::End() @@ -90,8 +91,9 @@ namespace Prism // Setup Platform/Renderer bindings ImGui_ImplGlfw_InitForOpenGL(window, true); - ImGui_ImplOpenGL3_Init("#version 410"); + ImGui_ImplOpenGL3_Init("#version 460"); + SetImGuiCustomTheme(); } void ImGuiLayer::OnDetach() @@ -105,4 +107,50 @@ namespace Prism { } -} \ No newline at end of file + void ImGuiLayer::SetImGuiCustomTheme() + { + // ImGui Colors + ImVec4* colors = ImGui::GetStyle().Colors; + colors[ImGuiCol_Text] = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.5f, 0.5f, 0.5f, 1.0f); + colors[ImGuiCol_WindowBg] = ImVec4(0.18f, 0.18f, 0.18f, 1.0f); // Window background + colors[ImGuiCol_ChildBg] = ImVec4(1.0f, 1.0f, 1.0f, 0.0f); + colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); + colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.5f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.0f, 0.0f, 0.0f, 0.0f); + colors[ImGuiCol_FrameBg] = ImVec4(0.3f, 0.3f, 0.3f, 0.5f); // Widget backgrounds + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.4f, 0.4f, 0.4f, 0.4f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.4f, 0.4f, 0.4f, 0.6f); + colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.0f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.29f, 0.29f, 0.29f, 1.0f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.0f, 0.0f, 0.0f, 0.51f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.0f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.31f, 0.31f, 0.31f, 1.0f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.41f, 0.41f, 0.41f, 1.0f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.0f); + colors[ImGuiCol_CheckMark] = ImVec4(0.94f, 0.94f, 0.94f, 1.0f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.51f, 0.51f, 0.51f, 0.7f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.66f, 0.66f, 0.66f, 1.0f); + colors[ImGuiCol_Button] = ImVec4(0.44f, 0.44f, 0.44f, 0.4f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.46f, 0.47f, 0.48f, 1.0f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.42f, 0.42f, 0.42f, 1.0f); + colors[ImGuiCol_Header] = ImVec4(0.7f, 0.7f, 0.7f, 0.31f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.7f, 0.7f, 0.7f, 0.8f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.48f, 0.5f, 0.52f, 1.0f); + colors[ImGuiCol_Separator] = ImVec4(0.43f, 0.43f, 0.5f, 0.5f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.72f, 0.72f, 0.72f, 0.78f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.0f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.91f, 0.91f, 0.91f, 0.25f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.81f, 0.81f, 0.81f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.46f, 0.46f, 0.46f, 0.95f); + colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.0f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.0f, 0.43f, 0.35f, 1.0f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.73f, 0.6f, 0.15f, 1.0f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.0f, 0.6f, 0.0f, 1.0f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.87f, 0.87f, 0.87f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.0f, 1.0f, 0.0f, 0.9f); + colors[ImGuiCol_NavHighlight] = ImVec4(0.60f, 0.6f, 0.6f, 1.0f); + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.0f, 1.0f, 1.0f, 0.7f); + } +} diff --git a/Prism/src/Prism/Core/ImGui/ImGuiLayer.h b/Prism/src/Prism/Core/ImGui/ImGuiLayer.h index 8b609ea..0465e83 100644 --- a/Prism/src/Prism/Core/ImGui/ImGuiLayer.h +++ b/Prism/src/Prism/Core/ImGui/ImGuiLayer.h @@ -25,6 +25,8 @@ namespace Prism virtual void OnDetach() override; virtual void OnImGuiRender() override; + private: + void SetImGuiCustomTheme(); private: float m_Time = 0.0f; }; diff --git a/Prism/src/Prism/Core/KeyCodes.h b/Prism/src/Prism/Core/KeyCodes.h index a4ef321..4fd1451 100644 --- a/Prism/src/Prism/Core/KeyCodes.h +++ b/Prism/src/Prism/Core/KeyCodes.h @@ -5,8 +5,6 @@ #ifndef KEYCODES_H #define KEYCODES_H -#pragma once - // From glfw3.h #define PM_KEY_SPACE 32 #define PM_KEY_APOSTROPHE 39 /* ' */ diff --git a/Prism/src/Prism/Renderer/Material.cpp b/Prism/src/Prism/Renderer/Material.cpp index 9c444c1..eaaddbd 100644 --- a/Prism/src/Prism/Renderer/Material.cpp +++ b/Prism/src/Prism/Renderer/Material.cpp @@ -170,6 +170,8 @@ namespace Prism void MaterialInstance::Bind() const { + m_Material->m_Shader->Bind(); + if (m_VSUniformStorageBuffer) m_Material->m_Shader->SetVSMaterialUniformBuffer(m_VSUniformStorageBuffer); diff --git a/Prism/src/pmpch.h b/Prism/src/pmpch.h index 4825ceb..d5e05c5 100644 --- a/Prism/src/pmpch.h +++ b/Prism/src/pmpch.h @@ -5,9 +5,6 @@ #ifndef PMPCH_H #define PMPCH_H -#if defined(_WIN32) -#include -#endif #include #include diff --git a/Prism/vendor/ImGuizmo b/Prism/vendor/ImGuizmo new file mode 160000 index 0000000..b3a3ccf --- /dev/null +++ b/Prism/vendor/ImGuizmo @@ -0,0 +1 @@ +Subproject commit b3a3ccfc4b26e90275db9ed47d6c21089fe8ef3f