diff --git a/Editor/src/Views/Viewport.cpp b/Editor/src/Views/Viewport.cpp index 428dd44..0dea0b3 100644 --- a/Editor/src/Views/Viewport.cpp +++ b/Editor/src/Views/Viewport.cpp @@ -18,6 +18,7 @@ void Viewport::Draw() { }); cam.Update(); + renderer.SetMainCamera(cam); renderer.Render(scene); ImVec2 WinPos = ImGui::GetWindowPos(); @@ -37,6 +38,7 @@ void Viewport::Draw() { ImGuizmo::SetRect(ScreenSpaceMin.x, ScreenSpaceMin.y, ContentRegionMax.x, ContentRegionMax.y); glm::mat4 transposed_view = glm::transpose(cam.ViewMatrix); + isFocused = ImGui::IsWindowFocused(); //ImGuizmo::DrawGrid(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), glm::value_ptr(worldOrigin), 100.0f); //ImGuizmo::ViewManipulate(glm::value_ptr(cam.ViewMatrix), 1, { ScreenSpaceMin.x,ScreenSpaceMin.y }, { 90,90 }, 0x22CCCCCC); @@ -44,12 +46,4 @@ void Viewport::Draw() { // Matrix is the model matrix we would want to manipulate //ImGuizmo::Manipulate(glm::value_ptr(cam.ViewMatrix), glm::value_ptr(cam.ProjectionMatrix), ImGuizmo::TRANSLATE, ImGuizmo::WORLD, glm::value_ptr(cam.ViewMatrix)); - if (ImGui::IsWindowFocused()) - { - isFocused = true; - - } - else { - isFocused = false; - } } \ No newline at end of file diff --git a/Editor/src/app.cpp b/Editor/src/app.cpp index 53a2cef..d48a410 100644 --- a/Editor/src/app.cpp +++ b/Editor/src/app.cpp @@ -38,7 +38,7 @@ public: SceneExplorer explorer(Selected, scene); Inspector inspector = Inspector(Selected); Settings settings = Settings(); - // AssetFinder assetsView = AssetFinder(); + // AssetFinder assetsView = AssetFinder(); Console console = Console(); Selected = YoggieEngine::Entity((entt::entity) -1, &scene); @@ -54,68 +54,16 @@ public: lag += elapsed; scene.Update(); - - if (sceneview.isFocused) - { - const float movement_speed = 0.1f; - static float lastX = 400, lastY = 300; - const float sensitivity = 0.1; - static bool firstMouse = true; - if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) { - - glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN); - auto newX = getCursorPosX(appWindow); - auto newY = getCursorPosY(appWindow); - - if (firstMouse) - { - lastX = newX; - lastY = newY; - firstMouse = false; - } - - - float xoffset = newX - lastX; - float yoffset = newY - lastY; - - lastX = newX; - lastY = newY; - - xoffset *= sensitivity; - yoffset *= sensitivity; - - sceneview.cam.yaw += xoffset; - sceneview.cam.pitch += yoffset; - - if (sceneview.cam.pitch > 89.0f) - sceneview.cam.pitch = 89.0f; - if (sceneview.cam.pitch < -89.0f) - sceneview.cam.pitch = -89.0f; - - } - else if (firstMouse == false) - { - glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); - firstMouse = true; - } - - // Check for Camara movement input here! - if (keyIsPressed(YOGGIE_KEY_W)) - sceneview.cam.Position += sceneview.cam.Front * movement_speed; - - if (keyIsPressed(YOGGIE_KEY_A)) - sceneview.cam.Position -= sceneview.cam.Right * movement_speed; - - if (keyIsPressed(YOGGIE_KEY_S)) - sceneview.cam.Position -= sceneview.cam.Front * movement_speed; - - if (keyIsPressed(YOGGIE_KEY_D)) - sceneview.cam.Position += sceneview.cam.Right * movement_speed; + if (sceneview.isFocused) { + UpdateSceneCamera(sceneview); + std::cout << "Scene view in Focus!\r" ; } GuiBegin(); + + { MainMenuBar menuBar = MainMenuBar(); @@ -181,10 +129,70 @@ public: private: bool SimulatePhysics = true; YoggieEngine::Entity Selected; - Project project; Scene scene; + + void UpdateSceneCamera(Viewport& sceneview) { + const float movement_speed = 0.1f; + static float lastX = 400, lastY = 300; + const float sensitivity = 0.1; + static bool firstMouse = true; + + if (MouseButtonPressed(YOGGIE_MOUSE_BUTTON_RIGHT)) { + + glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + auto newX = getCursorPosX(appWindow); + auto newY = getCursorPosY(appWindow); + + if (firstMouse) + { + lastX = newX; + lastY = newY; + firstMouse = false; + } + + + float xoffset = newX - lastX; + float yoffset = newY - lastY; + + lastX = newX; + lastY = newY; + + xoffset *= sensitivity; + yoffset *= sensitivity; + + sceneview.cam.yaw += xoffset; + sceneview.cam.pitch += yoffset; + + if (sceneview.cam.pitch > 89.0f) + sceneview.cam.pitch = 89.0f; + if (sceneview.cam.pitch < -89.0f) + sceneview.cam.pitch = -89.0f; + + } + else if (firstMouse == false) + { + glfwSetInputMode((GLFWwindow*)appWindow->GetHandle(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); + firstMouse = true; + } + + // Check for Camara movement input here! + if (keyIsPressed(YOGGIE_KEY_W)) { + sceneview.cam.Position += sceneview.cam.Front * movement_speed; + std::cout << "Pressed W !" << std::endl; + } + + if (keyIsPressed(YOGGIE_KEY_A)) + sceneview.cam.Position -= sceneview.cam.Right * movement_speed; + + if (keyIsPressed(YOGGIE_KEY_S)) + sceneview.cam.Position -= sceneview.cam.Front * movement_speed; + + if (keyIsPressed(YOGGIE_KEY_D)) + sceneview.cam.Position += sceneview.cam.Right * movement_speed; + } + }; YoggieEngine::Application* CreateApplication() { @@ -192,3 +200,5 @@ YoggieEngine::Application* CreateApplication() { return new Editor(); } + + diff --git a/YoggieEngine/src/Graphics/Renderer.cpp b/YoggieEngine/src/Graphics/Renderer.cpp index c6c27ad..8c018ba 100644 --- a/YoggieEngine/src/Graphics/Renderer.cpp +++ b/YoggieEngine/src/Graphics/Renderer.cpp @@ -71,14 +71,14 @@ Renderer::Renderer(RendererConfig& config) lightingPassShader("build/Debug/Shaders/deferred/lightPass.vert", "build/Debug/Shaders/deferred/lightPass.frag"), SkyboxShader("build/Debug/Shaders/Cubemaps/Skybox.vert", "build/Debug/Shaders/Cubemaps/Skybox.frag"), BlendingShader("build/Debug/Shaders/forward/Blending.vert", "build/Debug/Shaders/forward/Blending.frag"), - forwardShader("build/Debug/Shaders/forward/geometry.vert", "build/Debug/Shaders/forward/geometry.frag") + forwardShader("build/Debug/Shaders/forward/geometry.vert", "build/Debug/Shaders/forward/geometry.frag"), + postProcessingShader("build/Debug/Shaders/forward/postprocessing.vert", "build/Debug/Shaders/forward/postprocessing.frag") { width = config.ScreenWidth; height = config.ScreenHeight; glEnable(GL_DEPTH_TEST); - // Deferred Rendering glGenFramebuffers(1, &gBuffer); glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); @@ -150,9 +150,6 @@ Renderer::Renderer(RendererConfig& config) #else grassTexture = Texture("build/Debug/Texture/grass.png", true); #endif - - - } @@ -257,6 +254,32 @@ void Renderer::GeometryPass() { } +void Renderer::ForwardGeometryPass() +{ + for (const DrawCommand& command : commands) + { + if (command.isDynamic == false) + continue; + + glBindVertexArray(command.VAO_identifier); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, command.IBO_identifier); + + forwardShader.Use(); + + forwardShader.setUniformVec3("Color", command.color); + forwardShader.setUniformMat4("M", command.transform.LocalTransform); + forwardShader.setUniformMat4("V", MainCamera.ViewMatrix); + forwardShader.setUniformMat4("P", MainCamera.ProjectionMatrix); + + glDrawElements(GL_TRIANGLES, static_cast(command.num_elements), + GL_UNSIGNED_INT, NULL); + + glBindVertexArray(0); + + } + +} + void Renderer::SkyboxPass() { // Render skybox glDepthMask(GL_FALSE); @@ -267,7 +290,6 @@ void Renderer::SkyboxPass() { glBindTexture(GL_TEXTURE_CUBE_MAP, sky.getID()); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); - glDepthMask(GL_TRUE); } @@ -361,12 +383,38 @@ void Renderer::BlendingPass() { } + glBindVertexArray(0); + glDisable(GL_BLEND); } +void Renderer::PostProcessing() +{ + postProcessingShader.Use(); + postProcessingShader.setUniformInt("screen", 0); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, m_framebuffer.GetColourAttachment()); + + + glBindVertexArray(quadVAO); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindVertexArray(0); + + +} + +void Renderer::CopyGBuffer() { + glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer.GetId()); + glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + + glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId()); +} + void Renderer::Render(Scene& scene) { SubmitVegetationDemo(); @@ -380,37 +428,13 @@ void Renderer::Render(Scene& scene) lightingPass(scene); + CopyGBuffer(); - glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_framebuffer.GetId()); - glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + ForwardGeometryPass(); - // Forward rendering approach - glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer.GetId()); - - for (const DrawCommand& command : commands) - { - if (command.isDynamic == false) - continue; - - glBindVertexArray(command.VAO_identifier); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, command.IBO_identifier); - - forwardShader.Use(); - - forwardShader.setUniformVec3("Color", command.color); - forwardShader.setUniformMat4("M", command.transform.LocalTransform); - forwardShader.setUniformMat4("V", MainCamera.ViewMatrix); - forwardShader.setUniformMat4("P", MainCamera.ProjectionMatrix); - - glDrawElements(GL_TRIANGLES, static_cast(command.num_elements), - GL_UNSIGNED_INT, NULL); - - glBindVertexArray(0); - - } BlendingPass(); + //PostProcessing(); // Lighting pass diff --git a/YoggieEngine/src/Graphics/Renderer.h b/YoggieEngine/src/Graphics/Renderer.h index 5cf2a0f..e516ab4 100644 --- a/YoggieEngine/src/Graphics/Renderer.h +++ b/YoggieEngine/src/Graphics/Renderer.h @@ -35,10 +35,12 @@ namespace YoggieEngine { Framebuffer& getCurrentFrameBuffer() { return m_framebuffer; } private: void GeometryPass(); + void ForwardGeometryPass(); void SkyboxPass(); void lightingPass(Scene& scene); void BlendingPass(); - + void PostProcessing(); + void CopyGBuffer(); private: @@ -59,6 +61,8 @@ namespace YoggieEngine { Shader lightingPassShader; Shader gBufferShader; Shader SkyboxShader; + Shader postProcessingShader; + // blending Shader BlendingShader;