2024-08-10 19:12:21 -04:00
|
|
|
#include <GL/glew.h>
|
|
|
|
#include <GLFW/glfw3.h>
|
|
|
|
|
2024-08-12 21:40:28 -04:00
|
|
|
#define GLM_ENABLE_EXPERIMENTAL
|
|
|
|
#include <glm/glm.hpp>
|
|
|
|
#include <glm/gtc/matrix_transform.hpp>
|
|
|
|
#include <glm/gtx/transform.hpp>
|
|
|
|
#include <glm/gtc/type_ptr.hpp>
|
|
|
|
|
2024-08-11 21:20:17 -04:00
|
|
|
#include <imgui.h>
|
|
|
|
#include <imgui_impl_glfw.h>
|
|
|
|
#include <imgui_impl_opengl3.h>
|
|
|
|
|
2024-08-10 19:12:21 -04:00
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <sstream>
|
|
|
|
#include <string>
|
|
|
|
|
2024-08-12 17:20:14 -04:00
|
|
|
#include "scene.h"
|
2024-08-12 21:40:28 -04:00
|
|
|
#include "Uniforms.h"
|
|
|
|
#include "InitShader.h" //Functions for loading shaders from text files
|
|
|
|
//#include "LoadMesh.h" //Functions for creating OpenGL buffers from mesh files
|
|
|
|
//#include "LoadTexture.h" //Functions for creating OpenGL textures from image files
|
|
|
|
//#include "VideoRecorder.h" //Functions for saving videos
|
|
|
|
#include "DebugCallback.h"
|
2024-08-12 21:55:08 -04:00
|
|
|
#include "PlatformUtils.h"
|
2024-08-12 21:40:28 -04:00
|
|
|
|
|
|
|
static const std::string vertex_shader("shaders/vertex.glsl");
|
|
|
|
static const std::string fragment_shader("shaders/fragment.glsl");
|
|
|
|
GLuint shader_program = -1;
|
|
|
|
|
|
|
|
float angle = 0.0f;
|
|
|
|
float scale = 1.0f;
|
|
|
|
|
|
|
|
namespace Camera {
|
|
|
|
glm::mat4 V, P;
|
|
|
|
|
|
|
|
float Aspect = 1.0f;
|
|
|
|
float NearZ = 0.1f;
|
|
|
|
float FarZ = 100.0f;
|
|
|
|
float Fov = glm::pi<float>() / 4.0f;
|
|
|
|
|
|
|
|
void UpdateP() {
|
|
|
|
P = glm::perspective(Fov, Aspect, NearZ, FarZ);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Scene::Display(GLFWwindow* window) {
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
|
|
|
|
Camera::V = glm::lookAt(glm::vec3(Uniforms::SceneData.eye_w), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
|
|
|
|
Uniforms::SceneData.PV = Camera::P * Camera::V;
|
|
|
|
Uniforms::BufferSceneData();
|
|
|
|
|
|
|
|
glUseProgram(shader_program);
|
|
|
|
|
|
|
|
glm::mat4 M = glm::rotate(angle, glm::vec3(0.0f, 1.0f, 0.0f)) * glm::scale(glm::vec3(scale));
|
|
|
|
glUniformMatrix4fv(Uniforms::UniformLocs::M, 1, false, glm::value_ptr(M));
|
|
|
|
|
|
|
|
//glBindVertexArray(mesh_data.mVao);
|
|
|
|
//glDrawElements(GL_TRIANGLES, mesh_data.mSubmesh[0].mNumIndices, GL_UNSIGNED_INT, 0);
|
|
|
|
|
|
|
|
Scene::DrawGUI(window);
|
|
|
|
|
|
|
|
glfwSwapBuffers(window);
|
|
|
|
}
|
2024-08-10 19:12:21 -04:00
|
|
|
|
2024-08-11 14:52:38 -04:00
|
|
|
void Scene::DrawGUI(GLFWwindow* window) {
|
2024-08-11 21:20:17 -04:00
|
|
|
// Begin ImGui frame
|
|
|
|
ImGui_ImplOpenGL3_NewFrame();
|
|
|
|
ImGui_ImplGlfw_NewFrame();
|
|
|
|
|
|
|
|
// Enable docking
|
|
|
|
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())
|
|
|
|
{
|
|
|
|
if (ImGui::BeginMenu("Options"))
|
|
|
|
{
|
|
|
|
ImGui::Text("Nothing Here Yet, Check Back Later!");
|
|
|
|
|
|
|
|
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::End();
|
|
|
|
|
|
|
|
ImGui::Render();
|
|
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
2024-08-10 19:12:21 -04:00
|
|
|
}
|
|
|
|
|
2024-08-12 21:40:28 -04:00
|
|
|
void Scene::Idle() {
|
2024-08-10 19:12:21 -04:00
|
|
|
}
|
|
|
|
|
2024-08-12 21:40:28 -04:00
|
|
|
void Scene::ReloadShader()
|
|
|
|
{
|
|
|
|
GLuint new_shader = InitShader(vertex_shader.c_str(), fragment_shader.c_str());
|
|
|
|
|
|
|
|
if (new_shader == -1) // loading failed
|
|
|
|
{
|
2024-08-12 22:00:57 -04:00
|
|
|
DEBUG_BREAK(); //alert user by breaking and showing debugger
|
2024-08-12 21:40:28 -04:00
|
|
|
glClearColor(1.0f, 0.0f, 1.0f, 0.0f); //change clear color if shader can't be compiled
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
glClearColor(0.35f, 0.35f, 0.35f, 0.0f);
|
|
|
|
|
|
|
|
if (shader_program != -1)
|
|
|
|
{
|
|
|
|
glDeleteProgram(shader_program);
|
|
|
|
}
|
|
|
|
shader_program = new_shader;
|
|
|
|
}
|
2024-08-10 19:12:21 -04:00
|
|
|
}
|
|
|
|
|
2024-08-11 14:52:38 -04:00
|
|
|
void Scene::Init() {
|
|
|
|
glewInit();
|
|
|
|
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glEnable(GL_CULL_FACE);
|
2024-08-12 21:40:28 -04:00
|
|
|
|
|
|
|
ReloadShader();
|
2024-08-10 19:12:21 -04:00
|
|
|
}
|