Merge branch 'feature/1-camera-controls' into feature/3-mesh-tessellation
This commit is contained in:
commit
a66f4e275a
|
@ -0,0 +1,3 @@
|
||||||
|
## [v0.0.2] - 2024-08-25
|
||||||
|
### Changed
|
||||||
|
- Refactored uniform handling in the initial geometry pass to improve maintainability.
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(TerraVisor VERSION 0.0.1)
|
project(TerraVisor VERSION 0.0.2)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
30
imgui.ini
30
imgui.ini
|
@ -4,8 +4,8 @@ Size=400,400
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Terrain Controls]
|
[Window][Terrain Controls]
|
||||||
Pos=877,19
|
Pos=861,19
|
||||||
Size=403,701
|
Size=419,701
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000002,0
|
DockId=0x00000002,0
|
||||||
|
|
||||||
|
@ -19,17 +19,31 @@ Collapsed=0
|
||||||
|
|
||||||
[Window][TerraVisor]
|
[Window][TerraVisor]
|
||||||
Pos=0,0
|
Pos=0,0
|
||||||
Size=1280,720
|
Size=1676,1017
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Scene Window]
|
[Window][Scene Window]
|
||||||
Pos=0,19
|
Pos=0,19
|
||||||
Size=875,701
|
Size=859,701
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000001,0
|
DockId=0x00000003,0
|
||||||
|
|
||||||
|
[Window][Viewport]
|
||||||
|
Pos=0,19
|
||||||
|
Size=1224,998
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000003,0
|
||||||
|
|
||||||
|
[Window][Scene Settings]
|
||||||
|
Pos=1226,19
|
||||||
|
Size=450,998
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000004,0
|
||||||
|
|
||||||
[Docking][Data]
|
[Docking][Data]
|
||||||
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1280,701 Split=X Selected=0x9F2D9299
|
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1676,998 Split=X Selected=0x9F2D9299
|
||||||
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=875,701 CentralNode=1 Selected=0x9F2D9299
|
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=0,0 Split=X Selected=0x13926F0B
|
||||||
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=403,701 Selected=0xF69494A7
|
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=2107,701 CentralNode=1 Selected=0x13926F0B
|
||||||
|
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=450,701 Selected=0x413E6147
|
||||||
|
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=419,701 Selected=0xF69494A7
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ struct Framebuffer {
|
||||||
|
|
||||||
namespace FBO {
|
namespace FBO {
|
||||||
Framebuffer GenerateFramebuffer(int width, int height);
|
Framebuffer GenerateFramebuffer(int width, int height);
|
||||||
|
void UpdateFrameBuffer(Framebuffer& fbo, int width, int height);
|
||||||
void Bind(const Framebuffer& fbo);
|
void Bind(const Framebuffer& fbo);
|
||||||
void Unbind();
|
void Unbind();
|
||||||
void Cleanup(const Framebuffer& fbo);
|
void Cleanup(const Framebuffer& fbo);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef INTERFACE_H_
|
||||||
|
#define INTERFACE_H_
|
||||||
|
|
||||||
|
#include <imgui.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
struct Window {
|
||||||
|
std::string name;
|
||||||
|
ImVec2 size;
|
||||||
|
ImVec2 position;
|
||||||
|
bool isOpen = true;
|
||||||
|
|
||||||
|
std::function<void()> renderContent;
|
||||||
|
|
||||||
|
Window(const std::string& name, std::function<void()> renderFunc)
|
||||||
|
: name(name), size(ImVec2(512, 512)), position(ImVec2(0, 0)), renderContent(renderFunc) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Interface {
|
||||||
|
void AddWindow(std::vector<Window>& windows, const std::string& name, std::function<void()> renderFunc);
|
||||||
|
Window* GetWindowByName(std::vector<Window>& windows, const std::string& name);
|
||||||
|
void RenderWindows(std::vector<Window>& windows);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // INTERFACE_H_
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#include "fbo.h"
|
#include "fbo.h"
|
||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include "interface.h"
|
||||||
|
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
glm::vec3 position;
|
glm::vec3 position;
|
||||||
|
@ -25,15 +26,21 @@ class Scene {
|
||||||
void DrawGui(GLFWwindow* window);
|
void DrawGui(GLFWwindow* window);
|
||||||
void Idle();
|
void Idle();
|
||||||
void ReloadShader();
|
void ReloadShader();
|
||||||
|
void UpdateCamera();
|
||||||
|
void OnScreenResize(Window* viewport);
|
||||||
|
void UpdateViewport();
|
||||||
std::vector<int16_t> LoadHGT(const std::string& filename, int width, int height);
|
std::vector<int16_t> LoadHGT(const std::string& filename, int width, int height);
|
||||||
|
|
||||||
int window_width;
|
int window_width;
|
||||||
int window_height;
|
int window_height;
|
||||||
|
|
||||||
|
std::vector<Window> windows_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitBuffers();
|
void InitBuffers();
|
||||||
void InitQuadBuffers();
|
void InitQuadBuffers();
|
||||||
void InitShaders();
|
void InitShaders();
|
||||||
|
void InitUI();
|
||||||
|
|
||||||
Camera activeCamera_;
|
Camera activeCamera_;
|
||||||
Framebuffer geo_fbo_;
|
Framebuffer geo_fbo_;
|
||||||
|
@ -52,7 +59,6 @@ class Scene {
|
||||||
glm::mat4 view_matrix_;
|
glm::mat4 view_matrix_;
|
||||||
glm::mat4 projection_matrix_;
|
glm::mat4 projection_matrix_;
|
||||||
|
|
||||||
void UpdateCamera();
|
|
||||||
int16_t SwapEndian(int16_t val);
|
int16_t SwapEndian(int16_t val);
|
||||||
GLuint CreateHeightmapTexture(std::vector<int16_t> data, int width, int height);
|
GLuint CreateHeightmapTexture(std::vector<int16_t> data, int width, int height);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include "callbacks.h"
|
#include "callbacks.h"
|
||||||
|
#include "interface.h"
|
||||||
|
|
||||||
namespace Callbacks {
|
namespace Callbacks {
|
||||||
Scene* scene_ = nullptr;
|
Scene* scene_ = nullptr;
|
||||||
|
@ -52,11 +53,17 @@ void Callbacks::MouseButton(GLFWwindow* window, int button, int action, int mods
|
||||||
|
|
||||||
void Callbacks::Resize(GLFWwindow* window, int width, int height)
|
void Callbacks::Resize(GLFWwindow* window, int width, int height)
|
||||||
{
|
{
|
||||||
width = glm::max(1, width);
|
Window* viewport = Interface::GetWindowByName(scene_->windows_, "Viewport");
|
||||||
height = glm::max(1, height);
|
|
||||||
//Set viewport to cover entire framebuffer
|
scene_->window_width = static_cast<int>(viewport->size.x);
|
||||||
glViewport(0, 0, width, height);
|
scene_->window_height = static_cast<int>(viewport->size.y);
|
||||||
|
|
||||||
|
scene_->OnScreenResize(viewport);
|
||||||
|
|
||||||
//Set aspect ratio used in view matrix calculation
|
//Set aspect ratio used in view matrix calculation
|
||||||
|
// scene_->window_width = width;
|
||||||
|
// scene_->window_height = height;
|
||||||
|
// scene_->Scene::UpdateCamera();
|
||||||
//Scene::Camera::Aspect = float(width) / float(height);
|
//Scene::Camera::Aspect = float(width) / float(height);
|
||||||
//Scene::Camera::UpdateP();
|
//Scene::Camera::UpdateP();
|
||||||
}
|
}
|
|
@ -54,6 +54,13 @@ namespace FBO {
|
||||||
Framebuffer GenerateFramebuffer(int width, int height) {
|
Framebuffer GenerateFramebuffer(int width, int height) {
|
||||||
Framebuffer fbo;
|
Framebuffer fbo;
|
||||||
fbo.id = CreateFramebuffer();
|
fbo.id = CreateFramebuffer();
|
||||||
|
|
||||||
|
UpdateFrameBuffer(fbo, width, height);
|
||||||
|
|
||||||
|
return fbo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateFrameBuffer(Framebuffer& fbo, int width, int height) {
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo.id);
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo.id);
|
||||||
|
|
||||||
fbo.albedoTexture = CreateTexture(width, height, GL_RGBA);
|
fbo.albedoTexture = CreateTexture(width, height, GL_RGBA);
|
||||||
|
@ -73,8 +80,6 @@ namespace FBO {
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
return fbo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bind(const Framebuffer& fbo) {
|
void Bind(const Framebuffer& fbo) {
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include "interface.h"
|
||||||
|
|
||||||
|
#include <imgui_impl_glfw.h>
|
||||||
|
#include <imgui_impl_opengl3.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace Interface {
|
||||||
|
|
||||||
|
void AddWindow(std::vector<Window>& windows, const std::string& name, std::function<void()> renderFunc) {
|
||||||
|
windows.emplace_back(name, renderFunc);
|
||||||
|
}
|
||||||
|
|
||||||
|
Window* GetWindowByName(std::vector<Window>& windows, const std::string& name) {
|
||||||
|
auto it = std::find_if(windows.begin(), windows.end(), [&name](const Window& window) {
|
||||||
|
return window.name == name;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it != windows.end()) {
|
||||||
|
return &(*it); // Return pointer to the found window
|
||||||
|
} else {
|
||||||
|
return nullptr; // Return nullptr if the window was not found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderWindows(std::vector<Window>& windows) {
|
||||||
|
ImGui_ImplOpenGL3_NewFrame();
|
||||||
|
ImGui_ImplGlfw_NewFrame();
|
||||||
|
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||||||
|
|
||||||
|
ImGui::NewFrame();
|
||||||
|
|
||||||
|
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode;
|
||||||
|
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
|
||||||
|
|
||||||
|
// Style windows
|
||||||
|
const ImGuiViewport* viewport = ImGui::GetMainViewport();
|
||||||
|
ImGui::SetNextWindowPos(viewport->WorkPos);
|
||||||
|
ImGui::SetNextWindowSize(viewport->WorkSize);
|
||||||
|
ImGui::SetNextWindowViewport(viewport->ID);
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
||||||
|
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
|
||||||
|
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
|
||||||
|
window_flags |= ImGuiWindowFlags_NoBackground;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||||
|
ImGui::Begin("TerraVisor", nullptr, window_flags);
|
||||||
|
ImGui::PopStyleVar(3);
|
||||||
|
|
||||||
|
// Submit the DockSpace
|
||||||
|
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) {
|
||||||
|
ImGuiID dockspace_id = ImGui::GetID("MyDockSpace");
|
||||||
|
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginMenuBar()) {
|
||||||
|
if (ImGui::BeginMenu("Options")) {
|
||||||
|
ImGui::Text("Nothing Here Yet, Check Back Later!");
|
||||||
|
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndMenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
|
for (auto& window : windows) {
|
||||||
|
if (window.isOpen && ImGui::Begin(window.name.c_str(), &window.isOpen)) {
|
||||||
|
window.size = ImGui::GetWindowSize();
|
||||||
|
window.position = ImGui::GetWindowPos();
|
||||||
|
if (window.renderContent) {
|
||||||
|
window.renderContent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Render();
|
||||||
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||||
|
}
|
||||||
|
}
|
112
source/scene.cpp
112
source/scene.cpp
|
@ -9,10 +9,6 @@
|
||||||
#include <glm/gtx/transform.hpp>
|
#include <glm/gtx/transform.hpp>
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
|
||||||
#include <imgui.h>
|
|
||||||
#include <imgui_impl_glfw.h>
|
|
||||||
#include <imgui_impl_opengl3.h>
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -29,6 +25,7 @@
|
||||||
#include "InitShader.h"
|
#include "InitShader.h"
|
||||||
#include "DebugCallback.h"
|
#include "DebugCallback.h"
|
||||||
#include "load_texture.h"
|
#include "load_texture.h"
|
||||||
|
#include "interface.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -91,6 +88,7 @@ void Scene::Init() {
|
||||||
InitBuffers();
|
InitBuffers();
|
||||||
ReloadShader();
|
ReloadShader();
|
||||||
InitQuadBuffers();
|
InitQuadBuffers();
|
||||||
|
InitUI();
|
||||||
|
|
||||||
CameraControls::SetPosition(activeCamera_, glm::vec3(1.4f, 1.4f, 0.0f));
|
CameraControls::SetPosition(activeCamera_, glm::vec3(1.4f, 1.4f, 0.0f));
|
||||||
CameraControls::SetRotation(activeCamera_, -glm::normalize(CameraControls::GetPosition(activeCamera_)));
|
CameraControls::SetRotation(activeCamera_, -glm::normalize(CameraControls::GetPosition(activeCamera_)));
|
||||||
|
@ -197,6 +195,25 @@ void Scene::InitQuadBuffers() {
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::InitUI() {
|
||||||
|
Interface::AddWindow(windows_, "Viewport", [this]() {
|
||||||
|
ImGui::Image((void*)(intptr_t)lht_fbo_.albedoTexture, ImVec2(window_width, window_height), ImVec2(0, 1), ImVec2(1, 0));
|
||||||
|
});
|
||||||
|
|
||||||
|
Interface::AddWindow(windows_, "Scene Settings", [this]() {
|
||||||
|
// if (ImGui::Button("Quit")) {
|
||||||
|
// glfwSetWindowShouldClose(window, GLFW_TRUE);
|
||||||
|
// }
|
||||||
|
|
||||||
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
||||||
|
|
||||||
|
ImGui::SliderFloat("Tessellation Level", &Uniforms::GeoData.maxTessellation, 1.0f, 64.0f);
|
||||||
|
ImGui::SliderInt("Patch Grid Density", &Uniforms::GeoData.gridDensity, 1, 24);
|
||||||
|
ImGui::SliderFloat("Max Height", &Uniforms::GeoData.displacementScale, 0.0f, 1.0f);
|
||||||
|
Window* viewport = Interface::GetWindowByName(windows_, "Viewport");
|
||||||
|
ImGui::Text("Viewport size: (%.3f, %.3f)", viewport->size.x, viewport->size.y);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Allows for runtime shader updates
|
// Allows for runtime shader updates
|
||||||
void Scene::ReloadShader() {
|
void Scene::ReloadShader() {
|
||||||
|
@ -225,6 +242,12 @@ void Scene::Display(GLFWwindow* window) {
|
||||||
|
|
||||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
|
||||||
|
|
||||||
|
Window* viewport = Interface::GetWindowByName(windows_, "Viewport");
|
||||||
|
if (viewport && viewport->size.x > 0 && viewport->size.y > 0) {
|
||||||
|
OnScreenResize(viewport);
|
||||||
|
}
|
||||||
|
|
||||||
Uniforms::GeoData.PV = projection_matrix_ * CameraControls::GetViewMatrix(activeCamera_); // Projection-View matrix
|
Uniforms::GeoData.PV = projection_matrix_ * CameraControls::GetViewMatrix(activeCamera_); // Projection-View matrix
|
||||||
Uniforms::BufferSceneData();
|
Uniforms::BufferSceneData();
|
||||||
|
|
||||||
|
@ -274,79 +297,24 @@ void Scene::Display(GLFWwindow* window) {
|
||||||
|
|
||||||
FBO::Unbind();
|
FBO::Unbind();
|
||||||
|
|
||||||
DrawGui(window);
|
//DrawGui(window);
|
||||||
|
Interface::RenderWindows(windows_);
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::DrawGui(GLFWwindow* window) {
|
void Scene::OnScreenResize(Window* viewport) {
|
||||||
// Begin ImGui frame
|
if (window_width != static_cast<int>(viewport->size.x) || window_height != static_cast<int>(viewport->size.y)) {
|
||||||
ImGui_ImplOpenGL3_NewFrame();
|
window_width = static_cast<int>(viewport->size.x);
|
||||||
ImGui_ImplGlfw_NewFrame();
|
window_height = static_cast<int>(viewport->size.y);
|
||||||
|
|
||||||
// Enable docking
|
UpdateCamera();
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
}
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
|
||||||
|
|
||||||
ImGui::NewFrame();
|
|
||||||
|
|
||||||
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_PassthruCentralNode;
|
|
||||||
|
|
||||||
// Add menu bar
|
|
||||||
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
|
|
||||||
|
|
||||||
// Style windows
|
|
||||||
const ImGuiViewport* viewport = ImGui::GetMainViewport();
|
|
||||||
ImGui::SetNextWindowPos(viewport->WorkPos);
|
|
||||||
ImGui::SetNextWindowSize(viewport->WorkSize);
|
|
||||||
ImGui::SetNextWindowViewport(viewport->ID);
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
|
|
||||||
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
|
|
||||||
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
|
|
||||||
window_flags |= ImGuiWindowFlags_NoBackground;
|
|
||||||
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
||||||
ImGui::Begin("TerraVisor", nullptr, window_flags);
|
|
||||||
ImGui::PopStyleVar(3);
|
|
||||||
|
|
||||||
// Submit the DockSpace
|
|
||||||
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) {
|
|
||||||
ImGuiID dockspace_id = ImGui::GetID("MyDockSpace");
|
|
||||||
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::BeginMenuBar()) {
|
void Scene::UpdateViewport() {
|
||||||
if (ImGui::BeginMenu("Options")) {
|
window_width = ImGui::GetWindowSize().x;
|
||||||
ImGui::Text("Nothing Here Yet, Check Back Later!");
|
window_height = ImGui::GetWindowSize().y;
|
||||||
|
UpdateCamera();
|
||||||
ImGui::EndMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::EndMenuBar();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
// Draw Gui
|
|
||||||
ImGui::Begin("Terrain Controls");
|
|
||||||
if (ImGui::Button("Quit")) {
|
|
||||||
glfwSetWindowShouldClose(window, GLFW_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
|
||||||
|
|
||||||
ImGui::SliderFloat("Tessellation Level", &Uniforms::GeoData.maxTessellation, 1.0f, 64.0f);
|
|
||||||
ImGui::SliderInt("Patch Grid Density", &Uniforms::GeoData.gridDensity, 1, 24);
|
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
// Draw FBO to ImGui window
|
|
||||||
ImGui::Begin("Scene Window");
|
|
||||||
ImVec2 windowSize = ImGui::GetContentRegionAvail();
|
|
||||||
ImGui::Image((void*)(intptr_t)lht_fbo_.albedoTexture, windowSize, ImVec2(0, 1), ImVec2(1, 0));
|
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
ImGui::Render();
|
|
||||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::Idle() {
|
void Scene::Idle() {
|
||||||
|
@ -383,7 +351,7 @@ std::vector<int16_t> Scene::LoadHGT(const std::string& filename, int width, int
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::UpdateCamera() {
|
void Scene::UpdateCamera() {
|
||||||
projection_matrix_ = glm::perspective(CameraControls::GetFOV(activeCamera_), aspect_, activeCamera_.nearPlane, activeCamera_.farPlane);
|
projection_matrix_ = glm::perspective(CameraControls::GetFOV(activeCamera_), static_cast<float>(window_width) / window_height, activeCamera_.nearPlane, activeCamera_.farPlane);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint Scene::CreateHeightmapTexture(std::vector<int16_t> data, int width, int height) {
|
GLuint Scene::CreateHeightmapTexture(std::vector<int16_t> data, int width, int height) {
|
||||||
|
|
Loading…
Reference in New Issue