improved renderer
This commit is contained in:
parent
97f7193f66
commit
0e924656fd
|
@ -2,7 +2,7 @@
|
||||||
#version 460 core
|
#version 460 core
|
||||||
#extension GL_ARB_bindless_texture : require
|
#extension GL_ARB_bindless_texture : require
|
||||||
|
|
||||||
in float brightness;
|
in vec4 colour;
|
||||||
in flat sampler2D tex;
|
in flat sampler2D tex;
|
||||||
in vec2 texPos;
|
in vec2 texPos;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ uniform mat4 tex_mat;
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 texdata = texture2D(tex, texPos);
|
vec4 texdata = texture2D(tex, texPos);
|
||||||
FragColour = tex_mat * texdata * vec4(vec3(brightness), 1);
|
FragColour = tex_mat * texdata * colour;
|
||||||
|
|
||||||
if(FragColour.a == 0) discard;
|
if(FragColour.a == 0) discard;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,13 @@ layout (location = 0) in sampler2D aTex;
|
||||||
layout (location = 1) in vec2 aTexPos;
|
layout (location = 1) in vec2 aTexPos;
|
||||||
layout (location = 2) in vec4 aPos;
|
layout (location = 2) in vec4 aPos;
|
||||||
layout (location = 3) in vec3 aNormal;
|
layout (location = 3) in vec3 aNormal;
|
||||||
|
layout (location = 4) in vec4 aColour;
|
||||||
|
|
||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
uniform mat4 camera;
|
uniform mat4 camera;
|
||||||
uniform mat4 projection;
|
uniform mat4 projection;
|
||||||
|
|
||||||
out float brightness;
|
out vec4 colour;
|
||||||
out flat sampler2D tex;
|
out flat sampler2D tex;
|
||||||
out vec2 texPos;
|
out vec2 texPos;
|
||||||
|
|
||||||
|
@ -20,8 +21,9 @@ void main()
|
||||||
vec4 pos = camera * model * aPos;
|
vec4 pos = camera * model * aPos;
|
||||||
vec3 cNormal = vec3(0.f, 0.f, 1.f) * mat3(camera * model);
|
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;
|
gl_Position = projection * pos;
|
||||||
texPos = aTexPos;
|
texPos = aTexPos;
|
||||||
tex = aTex;
|
tex = aTex;
|
||||||
|
|
|
@ -10,8 +10,6 @@
|
||||||
|
|
||||||
using namespace Sim::Graphics;
|
using namespace Sim::Graphics;
|
||||||
|
|
||||||
static unsigned int vao, vbo, ebo;
|
|
||||||
|
|
||||||
static void* ptr_diff(void* a, void* b)
|
static void* ptr_diff(void* a, void* b)
|
||||||
{
|
{
|
||||||
return (void*)((size_t)a - (size_t)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));
|
glVertexAttribPointer(3, 3, GL_FLOAT, false, sizeof(v), ptr_diff(&v.normal, &v));
|
||||||
glEnableVertexAttribArray(3);
|
glEnableVertexAttribArray(3);
|
||||||
|
|
||||||
|
glVertexAttribPointer(4, 4, GL_FLOAT, false, sizeof(v), ptr_diff(&v.colour, &v));
|
||||||
|
glEnableVertexAttribArray(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::mat4 Arrays::colour(glm::vec4 c)
|
glm::mat4 Arrays::colour(glm::vec4 c)
|
||||||
|
|
|
@ -12,6 +12,7 @@ struct Vertex
|
||||||
glm::vec2 texpos = {0, 0};
|
glm::vec2 texpos = {0, 0};
|
||||||
glm::vec4 pos = {0, 0, 0, 1};
|
glm::vec4 pos = {0, 0, 0, 1};
|
||||||
glm::vec3 normal = {0, 0, 0};
|
glm::vec3 normal = {0, 0, 0};
|
||||||
|
glm::vec4 colour = {1, 1, 1, 1};
|
||||||
};
|
};
|
||||||
|
|
||||||
void vertex_attrib_pointers();
|
void vertex_attrib_pointers();
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct Mesh
|
||||||
void load_model(std::string path) { load_model(".", path); }
|
void load_model(std::string path) { load_model(".", path); }
|
||||||
void load_text(const char* text, double size);
|
void load_text(const char* text, double size);
|
||||||
void add(const Mesh& o, glm::mat4 mat);
|
void add(const Mesh& o, glm::mat4 mat);
|
||||||
|
void add(const Mesh& o) { add(o, glm::mat4(1)); }
|
||||||
|
|
||||||
Mesh to_lines() const;
|
Mesh to_lines() const;
|
||||||
bool check_focus() const;
|
bool check_focus() const;
|
||||||
|
|
|
@ -33,6 +33,13 @@ static void set_all(bool state)
|
||||||
|
|
||||||
struct CoreMonitor : public Focus::FocusType
|
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)
|
virtual void on_keypress(int key, int sc, int action, int mods)
|
||||||
{
|
{
|
||||||
if(action != GLFW_PRESS)
|
if(action != GLFW_PRESS)
|
||||||
|
@ -68,15 +75,27 @@ struct CoreMonitor : public Focus::FocusType
|
||||||
case GLFW_KEY_KP_2:
|
case GLFW_KEY_KP_2:
|
||||||
sys.reactor->move_cursor(sys.reactor->height);
|
sys.reactor->move_cursor(sys.reactor->height);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parent->is_dirty = true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CoreJoystick : public Focus::FocusType
|
struct CoreJoystick : public Focus::FocusType
|
||||||
{
|
{
|
||||||
|
Core* parent;
|
||||||
|
|
||||||
|
CoreJoystick(Core* parent)
|
||||||
|
{
|
||||||
|
this->parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void on_cursor_pos(double x, double y)
|
virtual void on_cursor_pos(double x, double y)
|
||||||
{
|
{
|
||||||
Sim::System::active.reactor->add_rod_speed(y * 1e-6);
|
Sim::System::active.reactor->add_rod_speed(y * 1e-6);
|
||||||
|
parent->is_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~CoreJoystick()
|
virtual ~CoreJoystick()
|
||||||
|
@ -104,8 +123,8 @@ Core::Core()
|
||||||
|
|
||||||
void Core::init()
|
void Core::init()
|
||||||
{
|
{
|
||||||
mesh1.model_matrix = Locations::monitors[2];
|
mesh1.model_matrix = mesh2.model_matrix = Locations::monitors[2];
|
||||||
mesh1.colour_matrix = Arrays::colour({1, 1, 1, 1});
|
mesh1.colour_matrix = mesh2.colour_matrix = Arrays::colour({1, 1, 1, 1});
|
||||||
|
|
||||||
Sim::Graphics::Mesh rmesh;
|
Sim::Graphics::Mesh rmesh;
|
||||||
|
|
||||||
|
@ -113,19 +132,6 @@ void Core::init()
|
||||||
mesh1.bind();
|
mesh1.bind();
|
||||||
mesh1.set(rmesh, GL_STATIC_DRAW);
|
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[0].load_model("../assets/model/", "reactor_core_button1.stl");
|
||||||
m_buttons[1].load_model("../assets/model/", "reactor_core_button2.stl");
|
m_buttons[1].load_model("../assets/model/", "reactor_core_button2.stl");
|
||||||
m_buttons[2].load_model("../assets/model/", "reactor_core_button3.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");
|
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)
|
void Core::update(double dt)
|
||||||
{
|
{
|
||||||
Sim::System& sys = Sim::System::active;
|
Sim::System& sys = Sim::System::active;
|
||||||
|
|
||||||
if(m_monitor.check_focus())
|
if(m_monitor.check_focus()) {
|
||||||
Focus::set(std::make_unique<CoreMonitor>());
|
Focus::set(std::make_unique<CoreMonitor>(this));
|
||||||
if(m_joystick.check_focus())
|
}
|
||||||
Focus::set(std::make_unique<CoreJoystick>());
|
if(m_joystick.check_focus()) {
|
||||||
if(m_scram.check_focus())
|
Focus::set(std::make_unique<CoreJoystick>(this));
|
||||||
|
}
|
||||||
|
if(m_scram.check_focus()) {
|
||||||
sys.reactor->scram();
|
sys.reactor->scram();
|
||||||
if(m_buttons[0].check_focus())
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
if(m_buttons[0].check_focus()) {
|
||||||
set_all(true);
|
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);
|
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);
|
set_all(false);
|
||||||
if(m_buttons[3].check_focus())
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
if(m_buttons[3].check_focus()) {
|
||||||
sys.reactor->move_cursor(-1);
|
sys.reactor->move_cursor(-1);
|
||||||
if(m_buttons[4].check_focus())
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
if(m_buttons[4].check_focus()) {
|
||||||
sys.reactor->toggle_selected();
|
sys.reactor->toggle_selected();
|
||||||
if(m_buttons[5].check_focus())
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
if(m_buttons[5].check_focus()) {
|
||||||
sys.reactor->move_cursor(1);
|
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();
|
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);
|
sys.reactor->move_cursor(sys.reactor->height);
|
||||||
}
|
is_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
void Core::render()
|
clock_now += dt;
|
||||||
{
|
|
||||||
Sim::System& sys = Sim::System::active;
|
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 step = 1 / (sys.vessel->diameter / sys.reactor->cell_width * 0.8);
|
||||||
double sx = 0.5 - (sys.reactor->width - 1) * step / 2.0;
|
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_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_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));
|
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++)
|
for(int i = 0; i < sys.reactor->size; i++)
|
||||||
{
|
{
|
||||||
int x = i % sys.reactor->width;
|
int x = i % sys.reactor->width;
|
||||||
|
@ -210,36 +258,38 @@ void Core::render()
|
||||||
continue;
|
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;
|
rmesh.add(add_dot(mat, colour_heat));
|
||||||
mesh2.colour_matrix = Arrays::colour(colour_heat);
|
|
||||||
mesh2.uniform();
|
|
||||||
mesh2.render();
|
|
||||||
|
|
||||||
if(sys.reactor->cursor == i)
|
if(sys.reactor->cursor == i)
|
||||||
{
|
{
|
||||||
mesh2.model_matrix = mat * mat_cursor;
|
rmesh.add(add_dot(mat * mat_cursor, {1, 0, 0, 1}));
|
||||||
mesh2.colour_matrix = Arrays::colour({1, 0, 0, 1});
|
|
||||||
mesh2.uniform();
|
|
||||||
mesh2.render();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(r->selected)
|
if(r->selected)
|
||||||
{
|
{
|
||||||
mesh2.model_matrix = mat * mat_select;
|
rmesh.add(add_dot(mat * mat_select, {1, 1, 0, 1}));
|
||||||
mesh2.colour_matrix = Arrays::colour({1, 1, 0, 1});
|
|
||||||
mesh2.uniform();
|
|
||||||
mesh2.render();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(colour_spec[3] != 0)
|
if(colour_spec[3] != 0)
|
||||||
{
|
{
|
||||||
mesh2.model_matrix = mat * mat_spec;
|
rmesh.add(add_dot(mat * mat_spec, colour_spec));
|
||||||
mesh2.colour_matrix = Arrays::colour(colour_spec);
|
|
||||||
mesh2.uniform();
|
|
||||||
mesh2.render();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mesh2.bind();
|
||||||
|
mesh2.set(rmesh, GL_DYNAMIC_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Core::render()
|
||||||
|
{
|
||||||
|
mesh1.bind();
|
||||||
|
mesh1.uniform();
|
||||||
|
mesh1.render();
|
||||||
|
|
||||||
|
mesh2.bind();
|
||||||
|
mesh2.uniform();
|
||||||
|
mesh2.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ namespace Sim::Graphics::Monitor
|
||||||
class Core
|
class Core
|
||||||
{
|
{
|
||||||
Sim::Graphics::GLMesh mesh1, mesh2;
|
Sim::Graphics::GLMesh mesh1, mesh2;
|
||||||
|
double clock_at = 0, clock_now = 0;
|
||||||
|
|
||||||
Sim::Graphics::Mesh m_monitor;
|
Sim::Graphics::Mesh m_monitor;
|
||||||
Sim::Graphics::Mesh m_buttons[9];
|
Sim::Graphics::Mesh m_buttons[9];
|
||||||
|
@ -17,6 +18,8 @@ class Core
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
bool is_dirty = false;
|
||||||
|
|
||||||
Core();
|
Core();
|
||||||
void init();
|
void init();
|
||||||
void update(double dt);
|
void update(double dt);
|
||||||
|
|
Loading…
Reference in New Issue