fast-nuclear-sim/src/graphics/window.cpp

161 lines
3.6 KiB
C++
Raw Normal View History

2024-01-21 01:36:21 +11:00
#include <GL/glew.h>
#include <GLFW/glfw3.h>
2024-01-21 12:58:37 +11:00
#include <glm/matrix.hpp>
2024-01-21 22:33:55 +11:00
#include <glm/ext/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale
#include <glm/ext/matrix_clip_space.hpp> // glm::perspective
2024-01-21 12:58:37 +11:00
2024-01-21 01:36:21 +11:00
#include <iostream>
2024-01-24 18:34:04 +11:00
#include "mesh/mesh.hpp"
#include "mesh/arrays.hpp"
#include "input/keyboard.hpp"
#include "input/mouse.hpp"
2024-01-22 00:20:54 +11:00
#include "camera.hpp"
2024-01-21 01:36:21 +11:00
#include "resize.hpp"
#include "window.hpp"
#include "shader.hpp"
2024-01-24 18:34:04 +11:00
#include "mesh/font.hpp"
2024-01-28 00:02:54 +11:00
#include "locations.hpp"
#include "../system.hpp"
#include "monitor/vessel.hpp"
#include "monitor/core.hpp"
#include "mesh/texture.hpp"
2024-01-21 01:36:21 +11:00
using namespace sim::graphics;
static GLFWwindow* win;
static bool win_should_close = false;
2024-01-26 00:30:14 +11:00
2024-01-30 16:09:43 +11:00
static glmesh MeshScene, MeshCollisionScene;
2024-01-28 00:02:54 +11:00
static monitor::vessel MonitorVessel;
static monitor::core MonitorCore;
2024-01-21 01:36:21 +11:00
void GLAPIENTRY cb_debug_message(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
{
2024-01-25 00:52:02 +11:00
if(severity != GL_DEBUG_SEVERITY_NOTIFICATION)
{
std::cout << "GL CALLBACK: " << message << "\n";
}
2024-01-21 01:36:21 +11:00
}
2024-01-30 16:09:43 +11:00
void window::create(system& sys)
2024-01-21 01:36:21 +11:00
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, true);
2024-01-28 00:02:54 +11:00
glfwWindowHint(GLFW_VISIBLE, false);
2024-01-23 17:46:33 +11:00
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true);
#endif
2024-01-28 00:02:54 +11:00
2024-01-21 01:36:21 +11:00
win = glfwCreateWindow(800, 600, "FastNuclearSim", nullptr, nullptr);
glfwMakeContextCurrent(win);
2024-01-24 18:34:04 +11:00
glfwSwapInterval(1);
2024-01-28 00:02:54 +11:00
2024-01-21 01:36:21 +11:00
GLenum err = glewInit();
2024-01-28 00:02:54 +11:00
2024-01-21 01:36:21 +11:00
if(err != GLEW_OK)
{
std::cerr << "GLEW Init Failed: " << glewGetErrorString(err) << "\n";
close();
return;
}
if(!glGetTextureHandleARB || !glMakeTextureHandleResidentARB)
{
std::cerr << "Fatal: Bindless textures not supported\n";
if(!glGetTextureHandleARB)
std::cerr << " Missing: glGetTextureHandleARB\n";
if(!glMakeTextureHandleResidentARB)
std::cerr << " Missing: glMakeTextureHandleResidentARB\n";
2024-01-21 01:36:21 +11:00
close();
return;
}
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
2024-01-23 17:46:33 +11:00
glEnable(GL_CULL_FACE);
2024-01-21 12:58:37 +11:00
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2024-01-21 01:36:21 +11:00
glDebugMessageCallback(cb_debug_message, nullptr);
keyboard::init();
2024-01-22 00:20:54 +11:00
mouse::init();
2024-01-21 01:36:21 +11:00
resize::init();
2024-01-28 00:02:54 +11:00
texture::init();
2024-01-21 01:36:21 +11:00
font::init();
2024-01-22 00:20:54 +11:00
2024-01-21 01:36:21 +11:00
shader::init_program();
2024-01-21 22:33:55 +11:00
2024-01-30 16:09:43 +11:00
sys.scene.load_model("../assets", "scene-baked.glb");
2024-01-24 18:34:04 +11:00
MeshScene.bind();
2024-01-30 16:09:43 +11:00
MeshScene.set(sys.scene, GL_STATIC_DRAW);
sys.scene.load_model("../assets/model", "scene_collisions.stl");
MeshCollisionScene.bind();
MeshCollisionScene.set(sys.scene.to_lines(), GL_STATIC_DRAW);
2024-01-24 18:34:04 +11:00
2024-01-28 00:02:54 +11:00
MonitorCore.init();
MonitorVessel.init();
2024-01-26 00:30:14 +11:00
2024-01-28 00:02:54 +11:00
glfwShowWindow(win);
2024-01-21 01:36:21 +11:00
glViewport(0, 0, 800, 600);
}
2024-01-28 00:02:54 +11:00
void window::loop(sim::system& sys)
2024-01-21 01:36:21 +11:00
{
2024-01-28 00:02:54 +11:00
MonitorVessel.update(sys);
2024-01-26 00:30:14 +11:00
glm::mat4 mat_projection = glm::perspective(glm::radians(80.0f), resize::get_aspect(), 0.01f, 20.f);
2024-01-21 22:33:55 +11:00
glUniformMatrix4fv(shader::gl_projection, 1, false, &mat_projection[0][0]);
2024-01-24 22:01:33 +11:00
glClearColor(0, 0, 0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2024-01-21 12:58:37 +11:00
MeshScene.bind();
MeshScene.uniform();
MeshScene.render();
2024-01-28 00:02:54 +11:00
2024-01-30 16:09:43 +11:00
MeshCollisionScene.bind();
MeshCollisionScene.uniform();
MeshCollisionScene.render(GL_LINES);
MonitorCore.render(sys);
2024-01-28 00:02:54 +11:00
MonitorVessel.render();
2024-01-21 01:36:21 +11:00
glfwSwapBuffers(win);
glfwPollEvents();
}
bool window::should_close()
{
return win_should_close || glfwWindowShouldClose(win);
}
void window::close()
{
win_should_close = true;
}
void window::destroy()
{
2024-01-28 00:02:54 +11:00
glfwDestroyWindow(win);
2024-01-21 01:36:21 +11:00
glfwTerminate();
}
GLFWwindow* window::get_window()
{
return win;
}