From 77d135c1dc8b6327afe5eaa2296754eff3ff279a Mon Sep 17 00:00:00 2001 From: Archit Gosain Date: Fri, 27 Jan 2023 19:50:07 +0530 Subject: [PATCH] Create basic UI class --- examples/examples2D/marching_squares.cpp | 8 ++-- examples/examples2D/renderer_2D_example.cpp | 39 +++++++++---------- examples/examples3D/suzanne_example.cpp | 2 +- src/CMakeLists.txt | 4 +- src/Editor/Application.cpp | 11 ++++++ src/Editor/Application.h | 5 +++ src/Editor/Window.cpp | 31 +++------------ src/Editor/Window.h | 1 + src/{NewtonRenderer.h => Vivid.h} | 4 ++ src/ui/UI.cpp | 42 +++++++++++++++++++++ src/ui/UI.h | 14 +++++++ 11 files changed, 110 insertions(+), 51 deletions(-) rename src/{NewtonRenderer.h => Vivid.h} (84%) create mode 100644 src/ui/UI.cpp create mode 100644 src/ui/UI.h diff --git a/examples/examples2D/marching_squares.cpp b/examples/examples2D/marching_squares.cpp index 57b0d03..3f8be2e 100644 --- a/examples/examples2D/marching_squares.cpp +++ b/examples/examples2D/marching_squares.cpp @@ -1,4 +1,4 @@ -#include "NewtonRenderer.h" +#include "Vivid.h" #include #include @@ -110,7 +110,7 @@ int main(void) val4.push_back(temp4); } - float time = 0; + double time = 0; while (app->IsRunning()) { Vivid::Renderer2D::BeginScene(); @@ -132,7 +132,7 @@ int main(void) Vec2 x3 = Vec2(x + dim, y + dim); Vec2 x4 = Vec2(x, y + dim); - Vivid::Renderer2D::DrawQuad(x1.x, x1.y, dim, dim, Vec3(v1, v1, v1)); +// Vivid::Renderer2D::DrawQuad(x1.x, x1.y, dim, dim, Vec3(v1, v1, v1)); Vec2 a = x1 + (x2 - x1) * (v1 / (v1 + v2)); Vec2 b = x2 + (x3 - x2) * (v2 / (v2 + v3)); @@ -189,7 +189,7 @@ int main(void) break; } } - time += 0.00025; + time += 0.000005; } Vivid::Renderer2D::EndScene(); diff --git a/examples/examples2D/renderer_2D_example.cpp b/examples/examples2D/renderer_2D_example.cpp index 32bc056..9e51046 100644 --- a/examples/examples2D/renderer_2D_example.cpp +++ b/examples/examples2D/renderer_2D_example.cpp @@ -1,4 +1,4 @@ -#include "NewtonRenderer.h" +#include "Vivid.h" int main(void) { @@ -11,24 +11,25 @@ int main(void) Vivid::Renderer2D::Init(); const GLubyte* vendor = glGetString(GL_VENDOR); // Returns the vendor const GLubyte* renderer = glGetString(GL_RENDERER); // Returns a hint to the model - while (app->IsRunning()) - { - // Begin Scene - // Todo: Fix order. Currently quads will always be drawn first - Vivid::Renderer2D::BeginScene(); - - // Draw using API - Vivid::Renderer2D::DrawCircle(Vec2(0, 0), 150, Vec3(0.0f, 1.0f, 0.0f)); - - Vivid::Renderer2D::DrawLine(Vec2(-150, 0), Vec2(150, 0), 2, - Vec3(1.0f, 0.5f, 0.0f)); - - Vivid::Renderer2D::DrawQuad(-200, -200, 100, 100, Vec3(1.0f, 1.0f, 0.0f)); - - Vivid::Renderer2D::EndScene(); - // Update App - app->GetWindow().Update(); - } +// while (app->IsRunning()) +// { +// // Begin Scene +// // Todo: Fix order. Currently quads will always be drawn first +// Vivid::Renderer2D::BeginScene(); +// +// // Draw using API +// Vivid::Renderer2D::DrawCircle(Vec2(0, 0), 150, Vec3(0.0f, 1.0f, 0.0f)); +// +// Vivid::Renderer2D::DrawLine(Vec2(-150, 0), Vec2(150, 0), 2, +// Vec3(1.0f, 0.5f, 0.0f)); +// +// Vivid::Renderer2D::DrawQuad(-200, -200, 100, 100, Vec3(1.0f, 1.0f, 0.0f)); +// +// Vivid::Renderer2D::EndScene(); +// // Update App +// app->GetWindow().Update(); +// } + app->Run(); app->Terminate(); return 0; diff --git a/examples/examples3D/suzanne_example.cpp b/examples/examples3D/suzanne_example.cpp index ed2a3be..4129a1b 100644 --- a/examples/examples3D/suzanne_example.cpp +++ b/examples/examples3D/suzanne_example.cpp @@ -1,4 +1,4 @@ -#include "NewtonRenderer.h" +#include "Vivid.h" int main(void) { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6e8d655..a7f9e8d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,6 +19,7 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/renderer/shapes/Sphere.cpp ${CMAKE_CURRENT_SOURCE_DIR}/utils/Error.cpp ${CMAKE_CURRENT_SOURCE_DIR}/utils/Timer.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ui/UI.cpp ${CMAKE_CURRENT_SOURCE_DIR}/renderer/Renderer2D.cpp ) @@ -48,7 +49,8 @@ set(HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/utils/Error.h ${CMAKE_CURRENT_SOURCE_DIR}/utils/Timer.h ${CMAKE_CURRENT_SOURCE_DIR}/renderer/Renderer2D.h - ${CMAKE_CURRENT_SOURCE_DIR}/NewtonRenderer.h + ${CMAKE_CURRENT_SOURCE_DIR}/ui/UI.h + ${CMAKE_CURRENT_SOURCE_DIR}/Vivid.h ) add_library(Vivid SHARED ${SOURCES} ${HEADERS}) diff --git a/src/Editor/Application.cpp b/src/Editor/Application.cpp index f7e281d..e4bf66e 100644 --- a/src/Editor/Application.cpp +++ b/src/Editor/Application.cpp @@ -15,6 +15,8 @@ Application::Application(int width, int height, const char* title) if (title == nullptr) m_Title = "Newton"; m_Window = Window::Init(m_Width, m_Height, m_Title); + m_UI = new UI(); + m_UI->Init(); } bool Application::IsRunning() @@ -25,3 +27,12 @@ void Application::Terminate() { glfwTerminate(); } + +void Application::Run() +{ + while (IsRunning()) + { + m_Window->Update(); + m_UI->Update(); + } +} diff --git a/src/Editor/Application.h b/src/Editor/Application.h index 2789721..11054a7 100644 --- a/src/Editor/Application.h +++ b/src/Editor/Application.h @@ -1,6 +1,8 @@ #pragma once + #include "common/Types.h" #include "Window.h" +#include "ui/UI.h" #include class Application @@ -15,6 +17,9 @@ class Application Application* getInstanceImpl(int width, int height, char* title); Ptr m_Window; + // Todo: make this unique pointer + UI* m_UI; + public: void Run(); bool IsRunning(); diff --git a/src/Editor/Window.cpp b/src/Editor/Window.cpp index c09134a..e6053f8 100644 --- a/src/Editor/Window.cpp +++ b/src/Editor/Window.cpp @@ -4,10 +4,8 @@ #include "confs/Config.h" #include "inputs/InputHandler.h" -#include "imgui/imgui/backends/imgui_impl_glfw.h" -#include "imgui/imgui/backends/imgui_impl_opengl3.h" -#include "imgui/imgui/imgui.h" #include "renderer/Renderer.h" +#include "ui/UI.h" InputHandler* InputHandler::s_Instance; Vivid::Camera* Vivid::Camera::s_Instance; @@ -39,15 +37,9 @@ Window::Window(int width, int height, const char* title) return; } - glfwMakeContextCurrent(m_Window); - - IMGUI_CONFS +// UI::Init(m_UIUpadateCallback); - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGui_ImplGlfw_InitForOpenGL(m_Window, true); - ImGui_ImplOpenGL3_Init(glsl_version); - ImGui::StyleColorsDark(); + glfwMakeContextCurrent(m_Window); } Ptr Window::Init(int width, int height, const char* title) @@ -98,21 +90,8 @@ void Window::Update() m_PrevMousePosition->y = mousePosition.y; } - // IMGUI - ImGui_ImplGlfw_NewFrame(); - ImGui_ImplOpenGL3_NewFrame(); - ImGui::NewFrame(); - - ImGui::Begin("Debug"); - // ImGui::SliderFloat3("Translation Model 1", &translationModel1.x, -500.0f, 500.0f); - // // ImGui::SliderFloat3("Translation Model 2", &translationModel2.x, -300.0f, 300.0f); - // ImGui::SliderFloat3("Light Position", &lightPos.x, -500.0f, 500.0f); - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", - 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - - ImGui::End(); - ImGui::Render(); - ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + // UI +// OnUIUpdate(); glfwMakeContextCurrent(m_Window); glfwSwapBuffers(m_Window); diff --git a/src/Editor/Window.h b/src/Editor/Window.h index 0cf998a..6190ff4 100644 --- a/src/Editor/Window.h +++ b/src/Editor/Window.h @@ -16,6 +16,7 @@ class Window ~Window() = default; static Ptr Init(int width, int height, const char* title); + void Clear() const; void Update(); diff --git a/src/NewtonRenderer.h b/src/Vivid.h similarity index 84% rename from src/NewtonRenderer.h rename to src/Vivid.h index 8fd6d8e..a21a1f7 100644 --- a/src/NewtonRenderer.h +++ b/src/Vivid.h @@ -32,4 +32,8 @@ #include "glm/gtc/matrix_transform.hpp" #include "glm/glm/glm.hpp" +#include "imgui/imgui/backends/imgui_impl_glfw.h" +#include "imgui/imgui/backends/imgui_impl_opengl3.h" +#include "imgui/imgui/imgui.h" + Application* Application::s_Instance = nullptr; \ No newline at end of file diff --git a/src/ui/UI.cpp b/src/ui/UI.cpp new file mode 100644 index 0000000..2826bf0 --- /dev/null +++ b/src/ui/UI.cpp @@ -0,0 +1,42 @@ +#include "UI.h" +#include "imgui/imgui/backends/imgui_impl_glfw.h" +#include "imgui/imgui/backends/imgui_impl_opengl3.h" +#include "imgui/imgui/imgui.h" + +#include "confs/Config.h" +#include "Editor/Application.h" + +void UI::Update() +{ + + ImGui_ImplGlfw_NewFrame(); + ImGui_ImplOpenGL3_NewFrame(); + ImGui::NewFrame(); + + ImGui::Begin("Debug"); + // ImGui::SliderFloat3("Translation Model 1", &translationModel1.x, -500.0f, 500.0f); + // // ImGui::SliderFloat3("Translation Model 2", &translationModel2.x, -300.0f, 300.0f); + // ImGui::SliderFloat3("Light Position", &lightPos.x, -500.0f, 500.0f); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", + 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); + +// m_OnUpdate(); + + ImGui::End(); + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +} + +UI* UI::Init() +{ + IMGUI_CONFS + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGui_ImplGlfw_InitForOpenGL(Application::GetInstance()->GetWindow().GetGLFWWindow(), true); + ImGui_ImplOpenGL3_Init(glsl_version); + ImGui::StyleColorsDark(); + +// m_OnUpdate = onUpdate; + return this; +} diff --git a/src/ui/UI.h b/src/ui/UI.h new file mode 100644 index 0000000..d60840a --- /dev/null +++ b/src/ui/UI.h @@ -0,0 +1,14 @@ +#pragma once +#include "common/Types.h" + +class UI +{ +private: + static void(*m_OnUpdate)(); +public: + UI() = default; + UI* Init(); + void Update(); + //TODO: Implement events +// virtual void OnEvent(Event& event) = 0; +};