added improvements
This commit is contained in:
parent
aea3330781
commit
38e75534ca
|
@ -2,6 +2,7 @@
|
|||
# How to build
|
||||
|
||||
This is built using CMake. You will also need the required libraries to build.
|
||||
This project currently only works on Linux.
|
||||
|
||||
```
|
||||
mkdir build
|
||||
|
|
|
@ -47,7 +47,7 @@ glm::vec<3, double> camera::get_pos()
|
|||
return pos;
|
||||
}
|
||||
|
||||
void camera::update(const system& sys, double dt)
|
||||
void camera::update(double dt)
|
||||
{
|
||||
glm::vec<2, double> off(0, 0);
|
||||
double m = 30;
|
||||
|
@ -89,8 +89,8 @@ void camera::update(const system& sys, double dt)
|
|||
glm::vec<3, double> normal_last(0);
|
||||
glm::vec<3, double> velocity2;
|
||||
|
||||
velocity2 = sys.scene.calc_intersect(pos, velocity * dt, normal_last);
|
||||
velocity2 = sys.scene.calc_intersect(pos + glm::vec<3, double>(0, 0, -1.5), velocity2, normal_last) / dt;
|
||||
velocity2 = system::active.scene.calc_intersect(pos, velocity * dt, normal_last);
|
||||
velocity2 = system::active.scene.calc_intersect(pos + glm::vec<3, double>(0, 0, -1.5), velocity2, normal_last) / dt;
|
||||
|
||||
pos += velocity2 * dt;
|
||||
on_ground = ((velocity * dt / dt).z != velocity2.z);
|
||||
|
|
|
@ -14,7 +14,7 @@ glm::vec<3, double> get_pos();
|
|||
|
||||
void rotate(double pitch, double yaw);
|
||||
void move(double x, double y, double z);
|
||||
void update(const system& sys, double dt);
|
||||
void update(double dt);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -55,6 +55,16 @@ void focus::on_charcode(unsigned int c)
|
|||
}
|
||||
}
|
||||
|
||||
void focus::update()
|
||||
{
|
||||
triggered = false;
|
||||
|
||||
if(state)
|
||||
{
|
||||
state->update();
|
||||
}
|
||||
}
|
||||
|
||||
bool focus::is_focused()
|
||||
{
|
||||
return (state != nullptr);
|
||||
|
@ -75,8 +85,3 @@ bool focus::is_triggered()
|
|||
return triggered;
|
||||
}
|
||||
|
||||
void focus::clear_trigger()
|
||||
{
|
||||
triggered = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,18 +13,18 @@ struct focus_t
|
|||
virtual void on_mouse_button(int button, int action, int mods) { }
|
||||
virtual void on_cursor_pos(double x, double y) { }
|
||||
virtual void on_charcode(unsigned int c) { }
|
||||
virtual void update() { }
|
||||
};
|
||||
|
||||
bool is_triggered();
|
||||
void clear_trigger();
|
||||
|
||||
void clear();
|
||||
bool is_focused();
|
||||
bool is_triggered();
|
||||
void set(std::unique_ptr<focus_t> f);
|
||||
void on_keypress(int key, int sc, int action, int mods);
|
||||
void on_mouse_button(int button, int action, int mods);
|
||||
void on_cursor_pos(double x, double y);
|
||||
void on_charcode(unsigned int c);
|
||||
void update();
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -13,14 +13,15 @@ static double xpos = 0, ypos = 0;
|
|||
|
||||
static void cb_cursor_pos(GLFWwindow* win, double x, double y)
|
||||
{
|
||||
focus::on_cursor_pos(x, y);
|
||||
|
||||
if(focus::is_focused())
|
||||
{
|
||||
return;
|
||||
focus::on_cursor_pos(x - xpos, y - ypos);
|
||||
}
|
||||
|
||||
camera::rotate(x - xpos, y - ypos);
|
||||
else
|
||||
{
|
||||
camera::rotate(x - xpos, y - ypos);
|
||||
}
|
||||
|
||||
xpos = x;
|
||||
ypos = y;
|
||||
|
|
|
@ -17,37 +17,16 @@ using namespace sim::graphics::monitor;
|
|||
|
||||
struct core_focus_t : public focus::focus_t
|
||||
{
|
||||
sim::system* sys;
|
||||
|
||||
core_focus_t(sim::system& sys)
|
||||
virtual void on_cursor_pos(double x, double y)
|
||||
{
|
||||
this->sys = &sys;
|
||||
}
|
||||
|
||||
void on_keypress(int key, int sc, int action, int mods)
|
||||
{
|
||||
if(action != GLFW_PRESS)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void on_mouse_button(int button, int action, int mods)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void on_cursor_pos(double x, double y)
|
||||
{
|
||||
|
||||
sim::system::active.reactor->rod_speed -= y * 1e-6;
|
||||
}
|
||||
|
||||
void set_all(bool state)
|
||||
{
|
||||
for(int i = 0; i < sys->reactor->rods.size(); i++)
|
||||
for(int i = 0; i < sim::system::active.reactor->rods.size(); i++)
|
||||
{
|
||||
sim::reactor::rod* r = sys->reactor->rods[i].get();
|
||||
sim::reactor::rod* r = sim::system::active.reactor->rods[i].get();
|
||||
|
||||
if(r->should_select() && (r->is_selected() != state))
|
||||
{
|
||||
|
@ -61,28 +40,51 @@ struct core_focus_t : public focus::focus_t
|
|||
//TODO
|
||||
}
|
||||
|
||||
void on_charcode(unsigned int c)
|
||||
virtual void on_charcode(unsigned int c)
|
||||
{
|
||||
sim::system& sys = sim::system::active;
|
||||
|
||||
switch(c)
|
||||
{
|
||||
case 'a': case 'A':
|
||||
sys->reactor->move_cursor(-1);
|
||||
sys.reactor->move_cursor(-1);
|
||||
break;
|
||||
case 'd': case 'D':
|
||||
sys->reactor->move_cursor(1);
|
||||
break;
|
||||
case 's': case 'S':
|
||||
sys->reactor->toggle_selected();
|
||||
sys.reactor->move_cursor(1);
|
||||
break;
|
||||
case 'w': case 'W':
|
||||
sys.reactor->move_cursor(-sim::system::active.reactor->height);
|
||||
break;
|
||||
case 's': case 'S':
|
||||
sys.reactor->move_cursor(sim::system::active.reactor->height);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void on_keypress(int key, int sc, int action, int mods)
|
||||
{
|
||||
if(action != GLFW_PRESS)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch(key)
|
||||
{
|
||||
case GLFW_KEY_Z:
|
||||
sim::system::active.reactor->toggle_selected();
|
||||
break;
|
||||
case GLFW_KEY_C:
|
||||
toggle_auto();
|
||||
break;
|
||||
case 'q': case 'Q':
|
||||
set_all(false);
|
||||
case GLFW_KEY_X:
|
||||
sim::system::active.reactor->rod_speed = 0;
|
||||
break;
|
||||
case 'e': case 'E':
|
||||
case GLFW_KEY_Q:
|
||||
set_all(true);
|
||||
break;
|
||||
case GLFW_KEY_E:
|
||||
set_all(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -112,16 +114,18 @@ void core::init()
|
|||
mesh_click.load_model("../assets/model/", "reactor_core_input.stl");
|
||||
}
|
||||
|
||||
void core::update(sim::system& sys)
|
||||
void core::update()
|
||||
{
|
||||
if(mesh_click.check_focus(2))
|
||||
{
|
||||
focus::set(std::make_unique<core_focus_t>(sys));
|
||||
focus::set(std::make_unique<core_focus_t>());
|
||||
}
|
||||
}
|
||||
|
||||
void core::render(sim::system& sys)
|
||||
void core::render()
|
||||
{
|
||||
sim::system& sys = sim::system::active;
|
||||
|
||||
double step = 1 / (sys.vessel->diameter / sys.reactor->cell_width * 0.8);
|
||||
double sx = 0.5 - (sys.reactor->width - 1) * step / 2.0;
|
||||
double sy = 0.5 - (sys.reactor->height - 1) * step / 2.0;
|
||||
|
@ -157,7 +161,7 @@ void core::render(sim::system& sys)
|
|||
mesh2.uniform();
|
||||
mesh2.render();
|
||||
|
||||
if(sys.reactor->cursor == i && r->should_select())
|
||||
if(sys.reactor->cursor == i)
|
||||
{
|
||||
mesh2.model_matrix = mat * mat_cursor;
|
||||
mesh2.colour_matrix = arrays::colour({1, 0, 0, 1});
|
||||
|
|
|
@ -16,8 +16,8 @@ public:
|
|||
|
||||
core();
|
||||
void init();
|
||||
void update(sim::system& sys);
|
||||
void render(sim::system& sys);
|
||||
void update();
|
||||
void render();
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -41,20 +41,27 @@ void vessel::init()
|
|||
ss << "Reactor Core\n\n";
|
||||
ss << "Temperature\nMin\nMax\n\n";
|
||||
ss << "Neutron Flux\nSlow\nFast\n\n";
|
||||
ss << "Control Rods\nMin\nMax\n\n";
|
||||
ss << "Control Rods\nMin\nMax\nSpeed\n";
|
||||
|
||||
rmesh.load_text(ss.str().c_str(), 0.04);
|
||||
mesh1.bind();
|
||||
mesh1.set(rmesh, GL_STATIC_DRAW);
|
||||
}
|
||||
|
||||
static double show(double v, double m)
|
||||
{
|
||||
return std::round(v * m) / m;
|
||||
}
|
||||
|
||||
static double show(double v)
|
||||
{
|
||||
return std::round(v * 1e3) * 1e-3;
|
||||
}
|
||||
|
||||
void vessel::update(sim::system& sys)
|
||||
void vessel::update()
|
||||
{
|
||||
sim::system& sys = sim::system::active;
|
||||
|
||||
std::stringstream ss;
|
||||
sim::graphics::mesh rmesh;
|
||||
|
||||
|
@ -98,6 +105,7 @@ void vessel::update(sim::system& sys)
|
|||
ss << sys.reactor->get_total(sim::reactor::rod::val_t::N_FAST) << " mol\n\n\n";
|
||||
ss << show( crod_min * 100 ) << " %\n";
|
||||
ss << show( crod_max * 100 ) << " %\n";
|
||||
ss << show( sys.reactor->rod_speed * 100, 1e-5 ) << " %/s\n";
|
||||
|
||||
rmesh.load_text(ss.str().c_str(), 0.04);
|
||||
mesh2.bind();
|
||||
|
|
|
@ -15,7 +15,7 @@ public:
|
|||
|
||||
vessel();
|
||||
void init();
|
||||
void update(sim::system& sys);
|
||||
void update();
|
||||
void render();
|
||||
};
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include "shader.hpp"
|
||||
#include "mesh/font.hpp"
|
||||
#include "locations.hpp"
|
||||
#include "../system.hpp"
|
||||
#include "monitor/vessel.hpp"
|
||||
#include "monitor/core.hpp"
|
||||
#include "mesh/texture.hpp"
|
||||
|
@ -40,7 +39,7 @@ void GLAPIENTRY cb_debug_message(GLenum source, GLenum type, GLuint id, GLenum s
|
|||
}
|
||||
}
|
||||
|
||||
void window::create(system& sys)
|
||||
void window::create()
|
||||
{
|
||||
glfwInit();
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||
|
@ -97,6 +96,8 @@ void window::create(system& sys)
|
|||
|
||||
shader::init_program();
|
||||
|
||||
sim::system& sys = sim::system::active;
|
||||
|
||||
sys.scene.load_model("../assets", "scene-baked.glb");
|
||||
MeshScene.bind();
|
||||
MeshScene.set(sys.scene, GL_STATIC_DRAW);
|
||||
|
@ -116,12 +117,12 @@ void window::create(system& sys)
|
|||
glViewport(0, 0, 800, 600);
|
||||
}
|
||||
|
||||
void window::loop(sim::system& sys)
|
||||
void window::loop()
|
||||
{
|
||||
glfwPollEvents();
|
||||
|
||||
MonitorCore.update(sys);
|
||||
MonitorVessel.update(sys);
|
||||
MonitorCore.update();
|
||||
MonitorVessel.update();
|
||||
|
||||
glm::mat4 mat_projection = glm::perspective(glm::radians(80.0f), resize::get_aspect(), 0.01f, 20.f);
|
||||
glUniformMatrix4fv(shader::gl_projection, 1, false, &mat_projection[0][0]);
|
||||
|
@ -137,7 +138,7 @@ void window::loop(sim::system& sys)
|
|||
MeshScene.uniform();
|
||||
MeshScene.render();
|
||||
|
||||
MonitorCore.render(sys);
|
||||
MonitorCore.render();
|
||||
MonitorVessel.render();
|
||||
|
||||
glfwSwapBuffers(win);
|
||||
|
|
|
@ -9,8 +9,8 @@ namespace sim::graphics::window
|
|||
{
|
||||
|
||||
bool should_close();
|
||||
void create(sim::system& sys);
|
||||
void loop(sim::system& sys);
|
||||
void create();
|
||||
void loop();
|
||||
void destroy();
|
||||
void close();
|
||||
|
||||
|
|
11
src/main.cpp
11
src/main.cpp
|
@ -29,8 +29,7 @@ unsigned long get_now()
|
|||
|
||||
int main()
|
||||
{
|
||||
sim::system sys;
|
||||
graphics::window::create(sys);
|
||||
graphics::window::create();
|
||||
|
||||
long clock = get_now();
|
||||
|
||||
|
@ -41,10 +40,10 @@ int main()
|
|||
double dt = (double)passed / 1e6;
|
||||
clock += passed;
|
||||
|
||||
sys.update(dt);
|
||||
graphics::camera::update(sys, dt);
|
||||
graphics::window::loop(sys);
|
||||
graphics::focus::clear_trigger();
|
||||
sim::system::active.update(dt);
|
||||
graphics::camera::update(dt);
|
||||
graphics::window::loop();
|
||||
graphics::focus::update();
|
||||
}
|
||||
|
||||
graphics::window::destroy();
|
||||
|
|
|
@ -9,6 +9,7 @@ using namespace sim::reactor;
|
|||
reactor::reactor(std::unique_ptr<rod>* rods, int w, int h, double cw, double ch) : cell_width(cw), cell_height(ch), width(w), height(h), size(w * h)
|
||||
{
|
||||
this->rods = std::vector<std::unique_ptr<rod>>(w * h);
|
||||
this->cursor = w * h;
|
||||
|
||||
for(int i = 0; i < size; i++)
|
||||
{
|
||||
|
@ -55,9 +56,14 @@ void reactor::update(double secs)
|
|||
}
|
||||
|
||||
update_interactions(rods_lookup, secs / 2);
|
||||
|
||||
if(rod_speed != 0)
|
||||
{
|
||||
update_selected(secs);
|
||||
}
|
||||
}
|
||||
|
||||
void reactor::update_selected(int v)
|
||||
void reactor::update_selected(double dt)
|
||||
{
|
||||
for(int i = 0; i < size; i++)
|
||||
{
|
||||
|
@ -65,34 +71,34 @@ void reactor::update_selected(int v)
|
|||
|
||||
if(r->is_selected())
|
||||
{
|
||||
r->update_rod_selected(v);
|
||||
r->update_selected(rod_speed * dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int reactor::move_cursor(int d)
|
||||
{
|
||||
for(int i = 0; i < size; i++)
|
||||
goto logic;
|
||||
|
||||
while(cursor == size || !rods[cursor]->should_display())
|
||||
{
|
||||
cursor = (cursor + d) % size;
|
||||
|
||||
logic: cursor = (cursor + d) % (size + 1);
|
||||
|
||||
if(cursor < 0)
|
||||
{
|
||||
cursor += size;
|
||||
cursor += size + 1;
|
||||
}
|
||||
|
||||
if(rods[cursor]->should_select())
|
||||
{
|
||||
return cursor;
|
||||
}
|
||||
if(d > 1) d = 1;
|
||||
if(d < -1) d = -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return cursor;
|
||||
}
|
||||
|
||||
void reactor::toggle_selected()
|
||||
{
|
||||
if(rods[cursor]->should_select())
|
||||
if(cursor < size && rods[cursor]->should_select())
|
||||
{
|
||||
rods[cursor]->toggle_selected();
|
||||
}
|
||||
|
|
|
@ -19,14 +19,14 @@ struct reactor
|
|||
const int size;
|
||||
|
||||
std::vector<std::unique_ptr<rod>> rods;
|
||||
int cursor = 0;
|
||||
double rod_speed = 0;
|
||||
int cursor;
|
||||
|
||||
reactor(std::unique_ptr<rod>* rods, int width, int height, double cell_width, double cell_height);
|
||||
reactor(const reactor& r);
|
||||
reactor(reactor&& r);
|
||||
|
||||
void update(double secs);
|
||||
void update_selected(int v);
|
||||
void get_stats(rod::val_t type, double& min, double& max);
|
||||
void get_rod_stats(int type, double& min, double& max);
|
||||
double get_total(rod::val_t type);
|
||||
|
@ -37,6 +37,7 @@ private:
|
|||
|
||||
void update_tile(double secs, int i, int x, int y);
|
||||
void update_interactions(int* rods_lookup, double secs);
|
||||
void update_selected(double dt);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -43,12 +43,6 @@ void rod::interact(rod* o, double secs)
|
|||
}
|
||||
}
|
||||
|
||||
double rod::get_speed() const
|
||||
{
|
||||
int m = motion < 0 ? -1 : 1;
|
||||
return motion == 0 ? 0 : (std::pow(10, std::abs(motion)) * 1e-6 * m);
|
||||
}
|
||||
|
||||
double rod::get_volume() const
|
||||
{
|
||||
auto r = (sim::reactor::reactor*)reactor;
|
||||
|
@ -61,23 +55,5 @@ void rod::update_rod(double secs)
|
|||
double m = std::pow(0.5, secs / 879.4);
|
||||
vals[val_t::N_FAST] *= m;
|
||||
vals[val_t::N_SLOW] *= m;
|
||||
|
||||
if(motion != 0 && !is_selected())
|
||||
{
|
||||
motion = 0;
|
||||
}
|
||||
|
||||
if(motion != 0)
|
||||
{
|
||||
update_selected(get_speed() * secs);
|
||||
}
|
||||
}
|
||||
|
||||
void rod::update_rod_selected(int m)
|
||||
{
|
||||
motion += m;
|
||||
|
||||
if(motion > 5) motion = 5;
|
||||
if(motion < -5) motion = -5;
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ public:
|
|||
virtual bool has_sensors(val_t t) const { return false; }
|
||||
virtual bool should_display() const { return false; }
|
||||
virtual bool should_select() const { return false; }
|
||||
void update_rod_selected(int m);
|
||||
virtual void update_selected(double a) { }
|
||||
double get_volume() const;
|
||||
|
||||
constexpr void toggle_selected() { selected = !selected; }
|
||||
|
@ -47,11 +47,6 @@ public:
|
|||
|
||||
o << r.get_name() << "\n";
|
||||
|
||||
if(r.is_selected())
|
||||
{
|
||||
o << "Speed: " << r.get_speed() << "\n";
|
||||
}
|
||||
|
||||
r.display(o);
|
||||
|
||||
o << "Heat: " << r.get(val_t::HEAT) << " C\n";
|
||||
|
@ -65,15 +60,12 @@ protected:
|
|||
|
||||
double vals[VAL_N] = {0};
|
||||
bool selected = false;
|
||||
int motion = 0;
|
||||
|
||||
virtual void display(std::ostream& o) const { };
|
||||
virtual double get_k(val_t type) const { return 0; }
|
||||
virtual const char* get_name() const { return "Empty"; }
|
||||
virtual void update_selected(double a) { }
|
||||
|
||||
void update_rod(double secs);
|
||||
double get_speed() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
|
||||
using namespace sim;
|
||||
|
||||
sim::system system::active;
|
||||
|
||||
system::system()
|
||||
{
|
||||
const char* layout[] = {
|
||||
|
|
|
@ -14,6 +14,8 @@ namespace sim
|
|||
|
||||
struct system
|
||||
{
|
||||
static system active;
|
||||
|
||||
std::unique_ptr<sim::reactor::reactor> reactor;
|
||||
std::unique_ptr<sim::reactor::coolant::vessel> vessel;
|
||||
std::unique_ptr<sim::coolant::valve<sim::reactor::coolant::vessel>> valve;
|
||||
|
|
Loading…
Reference in New Issue