#include #include #define GLM_ENABLE_EXPERIMENTAL #include #include #include #include #include #include #include #include #include #include #include #include "scene.h" #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" 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() / 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); } void Scene::DrawGUI(GLFWwindow* window) { // 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()); } void Scene::Idle() { } void Scene::ReloadShader() { GLuint new_shader = InitShader(vertex_shader.c_str(), fragment_shader.c_str()); if (new_shader == -1) // loading failed { DebugBreak(); //alert user by breaking and showing debugger 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; } } void Scene::Init() { glewInit(); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); ReloadShader(); }