improved renderer

This commit is contained in:
Jay Robson 2024-02-16 21:50:46 +11:00
parent 97f7193f66
commit 0e924656fd
7 changed files with 121 additions and 63 deletions

View File

@ -2,7 +2,7 @@
#version 460 core
#extension GL_ARB_bindless_texture : require
in float brightness;
in vec4 colour;
in flat sampler2D tex;
in vec2 texPos;
@ -13,7 +13,7 @@ uniform mat4 tex_mat;
void main()
{
vec4 texdata = texture2D(tex, texPos);
FragColour = tex_mat * texdata * vec4(vec3(brightness), 1);
FragColour = tex_mat * texdata * colour;
if(FragColour.a == 0) discard;
}

View File

@ -6,12 +6,13 @@ layout (location = 0) in sampler2D aTex;
layout (location = 1) in vec2 aTexPos;
layout (location = 2) in vec4 aPos;
layout (location = 3) in vec3 aNormal;
layout (location = 4) in vec4 aColour;
uniform mat4 model;
uniform mat4 camera;
uniform mat4 projection;
out float brightness;
out vec4 colour;
out flat sampler2D tex;
out vec2 texPos;
@ -20,8 +21,9 @@ void main()
vec4 pos = camera * model * aPos;
vec3 cNormal = vec3(0.f, 0.f, 1.f) * mat3(camera * model);
brightness = dot(normalize(aNormal), normalize(cNormal)) * 0.25f + 0.75f;
float brightness = dot(normalize(aNormal), normalize(cNormal)) * 0.25f + 0.75f;
colour = aColour * vec4(vec3(brightness), 1);
gl_Position = projection * pos;
texPos = aTexPos;
tex = aTex;

View File

@ -10,8 +10,6 @@
using namespace Sim::Graphics;
static unsigned int vao, vbo, ebo;
static void* ptr_diff(void* a, void* b)
{
return (void*)((size_t)a - (size_t)b);
@ -32,6 +30,9 @@ void Arrays::vertex_attrib_pointers()
glVertexAttribPointer(3, 3, GL_FLOAT, false, sizeof(v), ptr_diff(&v.normal, &v));
glEnableVertexAttribArray(3);
glVertexAttribPointer(4, 4, GL_FLOAT, false, sizeof(v), ptr_diff(&v.colour, &v));
glEnableVertexAttribArray(4);
}
glm::mat4 Arrays::colour(glm::vec4 c)

View File

@ -12,6 +12,7 @@ struct Vertex
glm::vec2 texpos = {0, 0};
glm::vec4 pos = {0, 0, 0, 1};
glm::vec3 normal = {0, 0, 0};
glm::vec4 colour = {1, 1, 1, 1};
};
void vertex_attrib_pointers();

View File

@ -26,6 +26,7 @@ struct Mesh
void load_model(std::string path) { load_model(".", path); }
void load_text(const char* text, double size);
void add(const Mesh& o, glm::mat4 mat);
void add(const Mesh& o) { add(o, glm::mat4(1)); }
Mesh to_lines() const;
bool check_focus() const;

View File

@ -33,6 +33,13 @@ static void set_all(bool state)
struct CoreMonitor : public Focus::FocusType
{
Core* parent;
CoreMonitor(Core* parent)
{
this->parent = parent;
}
virtual void on_keypress(int key, int sc, int action, int mods)
{
if(action != GLFW_PRESS)
@ -68,15 +75,27 @@ struct CoreMonitor : public Focus::FocusType
case GLFW_KEY_KP_2:
sys.reactor->move_cursor(sys.reactor->height);
break;
default:
return;
}
parent->is_dirty = true;
}
};
struct CoreJoystick : public Focus::FocusType
{
Core* parent;
CoreJoystick(Core* parent)
{
this->parent = parent;
}
virtual void on_cursor_pos(double x, double y)
{
Sim::System::active.reactor->add_rod_speed(y * 1e-6);
parent->is_dirty = true;
}
virtual ~CoreJoystick()
@ -104,8 +123,8 @@ Core::Core()
void Core::init()
{
mesh1.model_matrix = Locations::monitors[2];
mesh1.colour_matrix = Arrays::colour({1, 1, 1, 1});
mesh1.model_matrix = mesh2.model_matrix = Locations::monitors[2];
mesh1.colour_matrix = mesh2.colour_matrix = Arrays::colour({1, 1, 1, 1});
Sim::Graphics::Mesh rmesh;
@ -113,19 +132,6 @@ void Core::init()
mesh1.bind();
mesh1.set(rmesh, GL_STATIC_DRAW);
unsigned int indices[] = {0, 1, 3, 0, 3, 2};
Arrays::Vertex vertices[] = {
{Texture::handle_white, {0, 0}, {-0.75, -0.75, 0, 1}, {0, 0, -1}},
{Texture::handle_white, {0, 1}, {-0.75, 0.75, 0, 1}, {0, 0, -1}},
{Texture::handle_white, {1, 0}, { 0.75, -0.75, 0, 1}, {0, 0, -1}},
{Texture::handle_white, {1, 1}, { 0.75, 0.75, 0, 1}, {0, 0, -1}},
};
rmesh.set_indices(indices, 6);
rmesh.set_vertices(vertices, 4);
mesh2.bind();
mesh2.set(rmesh, GL_STATIC_DRAW);
m_buttons[0].load_model("../assets/model/", "reactor_core_button1.stl");
m_buttons[1].load_model("../assets/model/", "reactor_core_button2.stl");
m_buttons[2].load_model("../assets/model/", "reactor_core_button3.stl");
@ -140,37 +146,86 @@ void Core::init()
m_scram.load_model("../assets/model/", "reactor_core_scram.stl");
}
static Mesh add_dot(glm::mat4 model_mat, glm::vec4 colour)
{
unsigned int indices[] = {0, 1, 3, 0, 3, 2};
Arrays::Vertex vertices[] = {
{Texture::handle_white, {0, 0}, model_mat * glm::vec4(-0.75, -0.75, 0, 1), {0, 0, -1}, colour},
{Texture::handle_white, {0, 1}, model_mat * glm::vec4(-0.75, 0.75, 0, 1), {0, 0, -1}, colour},
{Texture::handle_white, {1, 0}, model_mat * glm::vec4( 0.75, -0.75, 0, 1), {0, 0, -1}, colour},
{Texture::handle_white, {1, 1}, model_mat * glm::vec4( 0.75, 0.75, 0, 1), {0, 0, -1}, colour},
};
Mesh mesh;
mesh.set_indices(indices, 6);
mesh.set_vertices(vertices, 4);
return mesh;
}
void Core::update(double dt)
{
Sim::System& sys = Sim::System::active;
if(m_monitor.check_focus())
Focus::set(std::make_unique<CoreMonitor>());
if(m_joystick.check_focus())
Focus::set(std::make_unique<CoreJoystick>());
if(m_scram.check_focus())
if(m_monitor.check_focus()) {
Focus::set(std::make_unique<CoreMonitor>(this));
}
if(m_joystick.check_focus()) {
Focus::set(std::make_unique<CoreJoystick>(this));
}
if(m_scram.check_focus()) {
sys.reactor->scram();
if(m_buttons[0].check_focus())
is_dirty = true;
}
if(m_buttons[0].check_focus()) {
set_all(true);
if(m_buttons[1].check_focus())
is_dirty = true;
}
if(m_buttons[1].check_focus()) {
sys.reactor->move_cursor(-sys.reactor->height);
if(m_buttons[2].check_focus())
is_dirty = true;
}
if(m_buttons[2].check_focus()) {
set_all(false);
if(m_buttons[3].check_focus())
is_dirty = true;
}
if(m_buttons[3].check_focus()) {
sys.reactor->move_cursor(-1);
if(m_buttons[4].check_focus())
is_dirty = true;
}
if(m_buttons[4].check_focus()) {
sys.reactor->toggle_selected();
if(m_buttons[5].check_focus())
is_dirty = true;
}
if(m_buttons[5].check_focus()) {
sys.reactor->move_cursor(1);
if(m_buttons[6].check_focus())
is_dirty = true;
}
if(m_buttons[6].check_focus()) {
sys.reactor->reset_rod_speed();
if(m_buttons[7].check_focus())
is_dirty = true;
}
if(m_buttons[7].check_focus()) {
sys.reactor->move_cursor(sys.reactor->height);
}
is_dirty = true;
}
void Core::render()
{
Sim::System& sys = Sim::System::active;
clock_now += dt;
if(clock_at + 1.0/30.0 > clock_now)
{
if(!is_dirty)
{
return;
}
}
else
{
clock_at += 1.0/30.0;
}
Sim::Graphics::Mesh rmesh;
is_dirty = false;
double step = 1 / (sys.vessel->diameter / sys.reactor->cell_width * 0.8);
double sx = 0.5 - (sys.reactor->width - 1) * step / 2.0;
@ -180,14 +235,7 @@ void Core::render()
glm::mat4 mat_select = glm::translate(glm::mat4(1), glm::vec3(-0.8, -0.8, -0.001)) * glm::scale(glm::mat4(1), glm::vec3(0.25, 0.25, 1));
glm::mat4 mat_cursor = glm::translate(glm::mat4(1), glm::vec3(-0.8, 0.8, -0.001)) * glm::scale(glm::mat4(1), glm::vec3(0.25, 0.25, 1));
glm::mat4 mat_spec = glm::translate(glm::mat4(1), glm::vec3(0.8, -0.8, -0.001)) * glm::scale(glm::mat4(1), glm::vec3(0.25, 0.25, 1));
mesh1.bind();
mesh1.uniform();
mesh1.render();
mesh2.bind();
// this renderer is disgusting
for(int i = 0; i < sys.reactor->size; i++)
{
int x = i % sys.reactor->width;
@ -210,36 +258,38 @@ void Core::render()
continue;
}
glm::mat4 mat = mesh1.model_matrix * glm::translate(glm::mat4(1), glm::vec3(ox, oy, 0)) * mat_scale;
glm::mat4 mat = glm::translate(glm::mat4(1), glm::vec3(ox, oy, 0)) * mat_scale;
mesh2.model_matrix = mat;
mesh2.colour_matrix = Arrays::colour(colour_heat);
mesh2.uniform();
mesh2.render();
rmesh.add(add_dot(mat, colour_heat));
if(sys.reactor->cursor == i)
{
mesh2.model_matrix = mat * mat_cursor;
mesh2.colour_matrix = Arrays::colour({1, 0, 0, 1});
mesh2.uniform();
mesh2.render();
rmesh.add(add_dot(mat * mat_cursor, {1, 0, 0, 1}));
}
if(r->selected)
{
mesh2.model_matrix = mat * mat_select;
mesh2.colour_matrix = Arrays::colour({1, 1, 0, 1});
mesh2.uniform();
mesh2.render();
rmesh.add(add_dot(mat * mat_select, {1, 1, 0, 1}));
}
if(colour_spec[3] != 0)
{
mesh2.model_matrix = mat * mat_spec;
mesh2.colour_matrix = Arrays::colour(colour_spec);
mesh2.uniform();
mesh2.render();
rmesh.add(add_dot(mat * mat_spec, colour_spec));
}
}
mesh2.bind();
mesh2.set(rmesh, GL_DYNAMIC_DRAW);
}
void Core::render()
{
mesh1.bind();
mesh1.uniform();
mesh1.render();
mesh2.bind();
mesh2.uniform();
mesh2.render();
}

View File

@ -9,6 +9,7 @@ namespace Sim::Graphics::Monitor
class Core
{
Sim::Graphics::GLMesh mesh1, mesh2;
double clock_at = 0, clock_now = 0;
Sim::Graphics::Mesh m_monitor;
Sim::Graphics::Mesh m_buttons[9];
@ -17,6 +18,8 @@ class Core
public:
bool is_dirty = false;
Core();
void init();
void update(double dt);