diff --git a/src/SimpleMath/SimpleMathGL.h b/src/SimpleMath/SimpleMathGL.h index 6541852..8fe80ac 100644 --- a/src/SimpleMath/SimpleMathGL.h +++ b/src/SimpleMath/SimpleMathGL.h @@ -91,8 +91,9 @@ inline Matrix44f Ortho(float left, float right, inline Matrix44f Perspective(float fovy, float aspect, float near, float far) { - float x = fovy / 2.0f; + float x = (fovy * M_PI / 180.0) / 2.0f; float f = cos(x) / sin(x); + return Matrix44f( f / aspect, 0.0f, 0.0f, 0.0f, 0.0f, f, 0.0f, 0.0f, @@ -109,11 +110,11 @@ inline Matrix44f LookAt( Vector3f s = d.cross(up.normalized()); Vector3f u = s.cross(d); - return Matrix44f( + return TranslateMat44(-eye[0], -eye[1], -eye[2]) * Matrix44f( s[0], u[0], -d[0], 0.0f, s[1], u[1], -d[1], 0.0f, s[2], u[2], -d[2], 0.0f, - -eye[0], -eye[1], -eye[2], 1.0f + 0.0f, 0.0f, 0.0f, 1.0f ); } diff --git a/src/main.cc b/src/main.cc index 6302877..02f32e9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -140,7 +140,7 @@ int main(void) ImGuiIO& io = ImGui::GetIO(); (void)io; GuiInputState gui_input_state; gGuiInputState = &gui_input_state; - ImGui_ImplGlfwGL3_Init(gWindow, false); + ImGui_ImplGlfwGL3_Init(gWindow, true); // Timer Timer timer; @@ -175,6 +175,7 @@ int main(void) // Start the imgui frame such that widgets can be submitted handle_mouse(); glfwGetWindowSize(gWindow, &width, &height); + glViewport(0, 0, width, height); glfwPollEvents(); ImGui_ImplGlfwGL3_NewFrame(); diff --git a/src/modules/RenderModule.cc b/src/modules/RenderModule.cc index 7867f4c..158dec9 100644 --- a/src/modules/RenderModule.cc +++ b/src/modules/RenderModule.cc @@ -166,13 +166,17 @@ void Camera::UpdateMatrices() { } void Camera::DrawGui() { - ImGui::SliderFloat3("Eye", mEye.data(), -10.0f, 10.0f); - ImGui::SliderFloat3("Poi", mPoi.data(), -10.0f, 10.0f); - ImGui::SliderFloat3("Up", mUp.data(), -10.0f, 10.0f); + ImGui::Text("Width %3.4f, Height %3.4f", mWidth, mHeight); + + ImGui::InputFloat3("Eye", mEye.data(), -10.0f, 10.0f); + ImGui::SliderFloat3("EyeS", mEye.data(), -10.0f, 10.0f); + + ImGui::InputFloat3("Poi", mPoi.data(), -10.0f, 10.0f); + ImGui::InputFloat3("Up", mUp.data(), -10.0f, 10.0f); ImGui::Checkbox("Orthographic", &mIsOrthographic); ImGui::SliderFloat("Fov", &mFov, 5, 160); ImGui::SliderFloat("Near", &mNear, -10, 10); - ImGui::SliderFloat("Far", &mFar, -20, 20); + ImGui::SliderFloat("Far", &mFar, -20, 50); if (ImGui::Button("Reset")) { *this = Camera(); } @@ -305,11 +309,15 @@ void Renderer::Shutdown() { void Renderer::RenderGl() { - int width, height; - glfwGetWindowSize(gWindow, &width, &height); - if (width != mWidth || height != mHeight) - Resize(width, height); + mSceneAreaWidth = mSceneAreaWidth < 1 ? 1 : mSceneAreaWidth; + mSceneAreaHeight = mSceneAreaHeight < 1 ? 1 : mSceneAreaHeight; + if (mSceneAreaWidth != mRenderTarget.mWidth || mSceneAreaHeight != mRenderTarget.mHeight) { + mRenderTarget.Resize(mSceneAreaWidth, mSceneAreaHeight); + mCamera.mWidth = mSceneAreaWidth; + mCamera.mHeight = mSceneAreaHeight; + } + glViewport(0, 0, mCamera.mWidth, mCamera.mHeight); mCamera.UpdateMatrices(); glEnable(GL_LINE_SMOOTH); @@ -378,7 +386,7 @@ void Renderer::RenderGl() { // Coordinate System: VertexArrayMesh model_view_projection = - TranslateMat44(1.25f, 0.0f, 0.0f) + TranslateMat44(0.0f, 0.0f, 0.0f) * mCamera.mViewMatrix * mCamera.mProjectionMatrix; glUniformMatrix4fv(muDefaultModelViewProjection, 1, GL_FALSE, model_view_projection.data()); @@ -453,6 +461,8 @@ void Renderer::RenderGui() { ImGui::Text("Scene"); const ImVec2 content_avail = ImGui::GetContentRegionAvail(); + mSceneAreaWidth = content_avail.x; + mSceneAreaHeight = content_avail.y; ImGui::Image((void*) texture, content_avail, @@ -460,9 +470,12 @@ void Renderer::RenderGui() { ImVec2(1.0f, 0.0f) ); } + ImGui::EndDock(); if (ImGui::BeginDock("Render Settings")) { + ImGui::Text("Render Target"); + ImGui::Text("Width %d, Height %d", mRenderTarget.mWidth, mRenderTarget.mHeight); ImGui::Text("Camera"); mCamera.DrawGui(); @@ -477,11 +490,3 @@ void Renderer::RenderGui() { ImGui::EndDock(); } -void Renderer::Resize (int width, int height) { - mWidth = width; - mHeight = height; - mRenderTarget.Resize(mWidth, mHeight); - mCamera.mWidth = mWidth; - mCamera.mHeight = mHeight; - glViewport(0, 0, mWidth, mHeight); -} diff --git a/src/modules/RenderModule.h b/src/modules/RenderModule.h index 24eb3b7..93f2e64 100644 --- a/src/modules/RenderModule.h +++ b/src/modules/RenderModule.h @@ -110,6 +110,8 @@ struct Renderer { bool mInitialized = false; uint32_t mWidth = 1; uint32_t mHeight = 1; + uint32_t mSceneAreaWidth = 1; + uint32_t mSceneAreaHeight = 1; Camera mCamera; Mesh mMesh; @@ -147,5 +149,4 @@ struct Renderer { void Shutdown(); void RenderGl(); void RenderGui(); - void Resize (int width, int height); }; diff --git a/src/modules/RenderUtils.cc b/src/modules/RenderUtils.cc index b1b5b48..6cbfae3 100644 --- a/src/modules/RenderUtils.cc +++ b/src/modules/RenderUtils.cc @@ -179,14 +179,19 @@ void RenderTarget::Cleanup() { glDeleteTextures(1, &mLinearizedDepthTexture); mLinearizedDepthTexture = -1; } + + mWidth = -1; + mHeight = -1; } void RenderTarget::Resize(int width, int height) { - if (width == mWidth || height == mHeight) + if (width == mWidth && height == mHeight) return; Cleanup(); + gLog("Resizing RenderTarget"); + mWidth = width; mHeight = height;