diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 875fdab6..fdd034a2 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -14,65 +14,73 @@ #include #include #include - +#include +#include int main() { - //std::string TrenchbroomPath = "F:/TrenchBroom/"; - // - //FGDFile file(TrenchbroomPath + "Games/Nuake/Nuake.fgd"); - // - //FGDClass newClass(FGDClassType::Point, "light", "a nuake light"); - // - //ClassProperty prop{ - // "Intensity", - // ClassPropertyType::Integer, - // "Changes the light intensity" - //}; - // - //newClass.AddProperty(prop); - //file.AddClass(newClass); - // - //file.Save(); - Engine::Init(); EditorInterface editor; editor.BuildFonts(); - Ref myFramebuffer = CreateRef(true, Vector2(200, 200)); - myFramebuffer->SetTexture(CreateRef(Vector2(200, 200), GL_RGB)); - - Ref myScene = CreateRef(); + // Register Gizmo textures + Ref lightTexture = TextureManager::Get()->GetTexture("resources/Icons/Gizmo/Light.png"); + Ref camTexture = TextureManager::Get()->GetTexture("resources/Icons/Gizmo/Camera.png"); + Ref GuizmoShader = ShaderManager::GetShader("resources/Shaders/gizmo.shader"); while (!Engine::GetCurrentWindow()->ShouldClose()) { Engine::Tick(); - Engine::Draw(); if (Input::IsKeyPressed(GLFW_KEY_F8)) Engine::ExitPlayMode(); - myFramebuffer->Bind(); - myScene->EditorDraw(); + Ref sceneFramebuffer = Engine::GetCurrentWindow()->GetFrameBuffer(); + sceneFramebuffer->Bind(); - myFramebuffer->Unbind(); - if (ImGui::Begin("hahahah")) + Ref currentScene = Engine::GetCurrentScene(); + if (currentScene && !Engine::IsPlayMode) { - ImVec2 regionAvail = ImGui::GetContentRegionAvail(); - glm::vec2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); - - if (myFramebuffer->GetSize() != viewportPanelSize) - myFramebuffer->QueueResize(viewportPanelSize); - - Ref texture = myFramebuffer->GetTexture(); - ImGui::Image((void*)texture->GetID(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); - - } - ImGui::End(); - editor.Draw(); + GuizmoShader->Bind(); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + auto camView = currentScene->m_Registry.view(); + for (auto e : camView) { + auto [transformComponent, cam] = camView.get(e); + + GuizmoShader->SetUniformMat4f("model", transformComponent.GetTransform()); + GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); + GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); + + camTexture->Bind(2); + GuizmoShader->SetUniform1i("gizmo_texture", 2); + + Renderer::DrawQuad(transformComponent.GetTransform()); + } + + auto view = currentScene->m_Registry.view(); + for (auto e : view) { + auto [transformComponent, light] = view.get(e); + + GuizmoShader->SetUniformMat4f("model", transformComponent.GetTransform()); + GuizmoShader->SetUniformMat4f("view", currentScene->m_EditorCamera->GetTransform()); + GuizmoShader->SetUniformMat4f("projection", currentScene->m_EditorCamera->GetPerspective()); + + lightTexture->Bind(2); + GuizmoShader->SetUniform1i("gizmo_texture", 2); + + Renderer::DrawQuad(transformComponent.GetTransform()); + } + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + GuizmoShader->Unbind(); + } + + sceneFramebuffer->Unbind(); + editor.Draw(); Engine::EndDraw(); } diff --git a/Editor/resources/Shaders/gizmo.shader b/Editor/resources/Shaders/gizmo.shader new file mode 100644 index 00000000..db6cb6ef --- /dev/null +++ b/Editor/resources/Shaders/gizmo.shader @@ -0,0 +1,31 @@ +#shader vertex +#version 460 core +layout(location = 0) in vec3 Position; +layout(location = 1) in vec2 UV; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +out sample vec2 a_UV; + +void main() +{ + a_UV = UV; + gl_Position = projection * view * model * vec4(Position, 1.0); +} + +#shader fragment +#version 460 core + +out vec4 FragColor; + +in vec2 a_UV; + +uniform sampler2D gizmo_texture; + +void main() +{ + vec4 px_color = texture(gizmo_texture, a_UV).rgba; + FragColor = px_color; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Framebuffer.cpp b/Nuake/src/Rendering/Framebuffer.cpp index 32ffb10b..3d35617d 100644 --- a/Nuake/src/Rendering/Framebuffer.cpp +++ b/Nuake/src/Rendering/Framebuffer.cpp @@ -43,7 +43,6 @@ void FrameBuffer::SetTexture(Ref texture, GLenum attachment) keys.push_back(s.first); size += 1; } - } if(size > 0) @@ -53,13 +52,18 @@ void FrameBuffer::SetTexture(Ref texture, GLenum attachment) } +void FrameBuffer::Clear() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); +} + void FrameBuffer::Bind() { if (ResizeQueued) UpdateSize(m_Size); glBindFramebuffer(GL_FRAMEBUFFER, m_FramebufferID); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glViewport(0, 0, m_Size.x, m_Size.y); } diff --git a/Nuake/src/Rendering/Framebuffer.h b/Nuake/src/Rendering/Framebuffer.h index 9c058e19..00446f5d 100644 --- a/Nuake/src/Rendering/Framebuffer.h +++ b/Nuake/src/Rendering/Framebuffer.h @@ -25,7 +25,7 @@ public: Ref GetTexture(GLenum attachment = 0x8CE0) { return m_Textures[(int)attachment]; } void SetTexture(Ref texture, GLenum attachment = 0x8CE0); - + void Clear(); void Bind(); void Unbind(); void QueueResize(Vector2 size); diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index 8f57cf7f..2eef9012 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -19,26 +19,35 @@ Shader* Renderer::m_DebugShader; unsigned int CubeVAO; unsigned int CubeVBO; -// Cube +unsigned int QuadVAO; +unsigned int QuadVBO; + + glm::vec3 CubeVertices[36]{ glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, -0.5f), - glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(0.5f, 0.5f, 0.5f), - glm::vec3(0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, 0.5f), - glm::vec3(-0.5f, 0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, -0.5f),glm::vec3(-0.5f, -0.5f, -0.5f), - glm::vec3(-0.5f, -0.5f, -0.5f),glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, 0.5f, 0.5f), - glm::vec3(0.5f, 0.5f, 0.5f),glm::vec3(0.5f, 0.5f, -0.5f),glm::vec3(0.5f, -0.5f, -0.5f), - glm::vec3(0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(0.5f, 0.5f, 0.5f), - glm::vec3(-0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, -0.5f),glm::vec3(0.5f, -0.5f, 0.5f), - glm::vec3(0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, 0.5f),glm::vec3(-0.5f, -0.5f, -0.5f), - glm::vec3(-0.5f, 0.5f, -0.5f) ,glm::vec3(0.5f, 0.5f, -0.5f) ,glm::vec3(0.5f, 0.5f, 0.5f) , - glm::vec3(0.5f, 0.5f, 0.5f) ,glm::vec3(-0.5f, 0.5f, 0.5f) ,glm::vec3(-0.5f, 0.5f, -0.5f) + glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(0.5f, 0.5f, 0.5f), + glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, 0.5f), + glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, -0.5f), + glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f), + glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f), + glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(0.5f, 0.5f, 0.5f), + glm::vec3(-0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, -0.5f), glm::vec3(0.5f, -0.5f, 0.5f), + glm::vec3(0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, 0.5f), glm::vec3(-0.5f, -0.5f, -0.5f), + glm::vec3(-0.5f, 0.5f, -0.5f), glm::vec3(0.5f, 0.5f, -0.5f), glm::vec3(0.5f, 0.5f, 0.5f), + glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, 0.5f), glm::vec3(-0.5f, 0.5f, -0.5f) +}; + +float QuadVertices[] = { + -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.0f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, + -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.0f, 1.0f, 1.0f }; -unsigned int SphereVAO; -unsigned int SphereVBO; -glm::vec3 SphereVertices[360 * 6 + 6]; void Renderer::Init() { // TODO: Make shader storage somewhere. @@ -65,36 +74,22 @@ void Renderer::Init() glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0); glEnableVertexAttribArray(0); - - // WTF is this. - float r = 1.0f; - int index = 0; - for (int i = 0; i <= 360; i++) { - float ra = glm::radians((float)i ); - float rb = glm::radians((float)i + 1); - glm::vec2 a = glm::vec2(sin(ra), cos(ra)) * r; - glm::vec2 b = glm::vec2(sin(rb), cos(rb)) * r; - SphereVertices[index] = glm::vec3(a.x, 0, a.y); - SphereVertices[index + 1] = glm::vec3(b.x, 0, b.y); - SphereVertices[index + 2] = glm::vec3(0, a.x, a.y); - SphereVertices[index + 3] = glm::vec3(0, b.x, b.y); - SphereVertices[index + 4] = glm::vec3(a.x, a.y, 0); - SphereVertices[index + 5] = glm::vec3(b.x, b.y, 0); - index += 6; - } + // Quad + glGenVertexArrays(1, &QuadVAO); + glBindVertexArray(QuadVAO); - glGenVertexArrays(1, &SphereVAO); - glBindVertexArray(SphereVAO); + glGenBuffers(1, &QuadVBO); + glBindBuffer(GL_ARRAY_BUFFER, QuadVBO); - glGenBuffers(1, &SphereVBO); - glBindBuffer(GL_ARRAY_BUFFER, SphereVBO); + glBindBuffer(GL_ARRAY_BUFFER, QuadVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertices), QuadVertices, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, SphereVBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(SphereVertices), SphereVertices, GL_STATIC_DRAW); - - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0); glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + } // TODO: Move to shader storage @@ -221,25 +216,11 @@ void Renderer::DrawCube(TransformComponent transform, glm::vec4 color) // TODO: See above void Renderer::DrawSphere(TransformComponent transform, glm::vec4 color) { - //glDisable(GL_DEPTH_TEST); - Ref window = Engine::GetCurrentWindow(); - Ref fb = window->GetFrameBuffer(); - - m_DebugShader->Bind(); - m_DebugShader->SetUniformMat4f("u_Model", transform.GetTransform()); - m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, color.a); - glBindVertexArray(SphereVAO); - glDrawArrays(GL_TRIANGLES, 0, 36); - - m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, 1.0f); - - glPolygonMode(GL_FRONT, GL_LINE); - glPolygonMode(GL_BACK, GL_LINE); - glLineWidth(8); - glDrawArrays(GL_TRIANGLES, 0, 36); - - // Turn off wireframe mode - glPolygonMode(GL_FRONT, GL_FILL); - glPolygonMode(GL_BACK, GL_FILL); - //glEnable(GL_DEPTH_TEST); + +} + +void Renderer::DrawQuad(Matrix4 transform) +{ + glBindVertexArray(QuadVAO); + glDrawArrays(GL_TRIANGLES, 0, 6); } diff --git a/Nuake/src/Rendering/Renderer.h b/Nuake/src/Rendering/Renderer.h index 5b8b1c4b..b0447e41 100644 --- a/Nuake/src/Rendering/Renderer.h +++ b/Nuake/src/Rendering/Renderer.h @@ -2,7 +2,7 @@ #include "Shaders/Shader.h" #include "../Scene/Components/Components.h" #include "../Core/Core.h" -// DTO for light data. + struct Light { TransformComponent transform; LightComponent light; @@ -18,7 +18,6 @@ public: static Shader* m_DeferredShader; static Shader* m_ProceduralSkyShader; static Shader* m_DebugShader; - static Texture* m_VXGI_Debugtexture; static void Init(); @@ -26,7 +25,6 @@ public: static void BeginDraw(Ref camera); static void EndDraw(); - // Lights static std::vector m_Lights; static void RegisterLight(TransformComponent transform, LightComponent light, Ref cam); @@ -36,4 +34,5 @@ public: static void DrawDebugLine(glm::vec3 start, glm::vec3 end, glm::vec4 color); static void DrawCube(TransformComponent transform, glm::vec4 color); static void DrawSphere(TransformComponent transform, glm::vec4 color); + static void DrawQuad(Matrix4 transform); }; \ No newline at end of file diff --git a/Nuake/src/Rendering/Shaders/ShaderManager.cpp b/Nuake/src/Rendering/Shaders/ShaderManager.cpp new file mode 100644 index 00000000..4cb92e99 --- /dev/null +++ b/Nuake/src/Rendering/Shaders/ShaderManager.cpp @@ -0,0 +1,14 @@ +#pragma once +#include "ShaderManager.h" + +std::map> ShaderManager::m_Shaders = std::map>(); + +Ref ShaderManager::GetShader(const std::string& path) +{ + if (m_Shaders.find(path) == m_Shaders.end()) + { + m_Shaders[path] = CreateRef(path); + } + + return m_Shaders[path]; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Shaders/ShaderManager.h b/Nuake/src/Rendering/Shaders/ShaderManager.h new file mode 100644 index 00000000..1e2ba336 --- /dev/null +++ b/Nuake/src/Rendering/Shaders/ShaderManager.h @@ -0,0 +1,14 @@ +#pragma once +#include +#include + +#include "src/Core/Core.h" +#include "Shader.h" + +class ShaderManager { +private: + static std::map> m_Shaders; + +public: + static Ref GetShader(const std::string& path); +}; \ No newline at end of file diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index a4bf7b8c..40c4f011 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -170,6 +170,7 @@ void Scene::DrawShadows() for (int i = 0; i < 4; i++) { light.m_Framebuffers[i]->Bind(); + light.m_Framebuffers[i]->Clear(); Renderer::m_ShadowmapShader->SetUniformMat4f("lightSpaceMatrix", light.mViewProjections[i]); for (auto e : modelView) { diff --git a/Nuake/src/Scene/Scene.h b/Nuake/src/Scene/Scene.h index bf457df0..071db716 100644 --- a/Nuake/src/Scene/Scene.h +++ b/Nuake/src/Scene/Scene.h @@ -28,9 +28,8 @@ private: std::vector> m_Systems; Ref m_Environement; - Ref m_EditorCamera; - public: + Ref m_EditorCamera; entt::registry m_Registry; std::vector> m_Interfaces; std::string Path = ""; diff --git a/Nuake/src/Scripting/ScriptingEngine.cpp b/Nuake/src/Scripting/ScriptingEngine.cpp index 89e1e40f..a1b97baa 100644 --- a/Nuake/src/Scripting/ScriptingEngine.cpp +++ b/Nuake/src/Scripting/ScriptingEngine.cpp @@ -145,6 +145,8 @@ void ScriptingEngine::ExitScript(Ref script) void ScriptingEngine::Init() { m_Scripts = std::map>(); + m_LoadedScripts.clear(); + WrenConfiguration config; wrenInitConfiguration(&config); @@ -152,6 +154,7 @@ void ScriptingEngine::Init() config.errorFn = &errorFn; config.writeFn = &writeFn; config.bindForeignMethodFn = &bindForeignMethod; + m_WrenVM = wrenNewVM(&config); Ref engineModule = CreateRef(); @@ -166,7 +169,6 @@ void ScriptingEngine::Init() RegisterModule(physicsModule); } - void ScriptingEngine::Close() { wrenFreeVM(m_WrenVM); diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index db680191..78ec0326 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -230,6 +230,7 @@ void Window::FixedUpdate(Timestep ts) void Window::Draw() { + // Dont render if no scene is loaded. if (!m_Scene) return; @@ -242,21 +243,19 @@ void Window::Draw() cam->AspectRatio = size.x / size.y; Renderer::BeginDraw(cam); - - //glCullFace(GL_FRONT); - //glCullFace(GL_BACK); m_Scene->DrawShadows(); m_Framebuffer->Bind(); - - if (Engine::IsPlayMode) - m_Scene->Draw(); - else - m_Scene->EditorDraw(); + m_Framebuffer->Clear(); + { + if (Engine::IsPlayMode) + m_Scene->Draw(); + else + m_Scene->EditorDraw(); - m_Scene->DrawInterface(m_Framebuffer->GetSize()); - + m_Scene->DrawInterface(m_Framebuffer->GetSize()); + } m_Framebuffer->Unbind(); Renderer::EndDraw();