#include "entities/camera.hpp" #include "pult.hpp" #include "rendering/gl_renderer.hpp" namespace Nimbin { /////////////////////////// // PultButton PultButton::PultButton(const std::string& lbl, PultAction act, Vec3 world_pos) : SolidBox( world_pos, Vec3 { 0.30, 0.10, 0.30 }, SDL_FColor{ 0.35f, 0.75f, 0.35f, 1.0f }, SDL_FColor{ 0.55f, 0.95f, 0.55f, 1.0f }, true) , label(lbl), action(act) {} void PultButton::press() { pressed = true; press_timer = Config::Pult::press_dur; } void PultButton::tick(double dt) { if (pressed) { press_timer -= dt; if (press_timer <= 0.0) pressed = false; } } void PultButton::draw(GlRenderer& gl, const Camera& cam, const Light& light) const { Mat4 view = buildViewMat4 (cam); Mat4 model = buildModelMat4 (pos, yaw); Mat4 proj = gl.get_Projection(); Mat4 mvp = Mat4::mul (proj, Mat4::mul(view, model)); const float hx = static_cast(shape.half_extents.x); const float hy = static_cast(shape.half_extents.y); const float hz = static_cast(shape.half_extents.z); gl.set_Wireframe(false); gl.set_MVP (model, mvp); gl.set_NormalMat(model); gl.set_Light (light); gl.set_Color (pressed ? 1.0f : 0.35f, pressed ? 1.0f : 0.75f, pressed ? 0.2f : 0.35f); gl.draw_Box (hx, hy, hz); } /////////////////////////// // Pult Pult::Pult(const std::string& n, Vec3 world_pos, float half_width, float half_depth) : SolidBox( world_pos, Vec3{ half_width, H, half_depth }, SDL_FColor{ 0.45f, 0.45f, 0.65f, 1.0f }, SDL_FColor{ 0.70f, 0.70f, 0.90f, 1.0f }, false) , name(n), half_w(half_width), half_d(half_depth) { label.set_FaceCamera (true); label.set_Style (Config::Color::teal, Text::Token::depth_wall, 0.0025f); label.set_Collidable(true); label.attach_To (&pos, Vec3{ 0.0, Config::Pult::label_height, 0.0 }); label.set_Text (n); } void Pult::tick(double dt) { for (PultButton* b : buttons) b->tick(dt); } void Pult::draw(GlRenderer& gl, const Camera& cam, const Light& light) const { Mat4 view = buildViewMat4 (cam); Mat4 model = buildModelMat4 (pos, yaw); Mat4 proj = gl.get_Projection(); Mat4 mvp = Mat4::mul (proj, Mat4::mul(view, model)); gl.set_Wireframe(false); gl.set_MVP (model, mvp); gl.set_NormalMat(model); gl.set_Light (light); gl.set_Color (0.45f, 0.45f, 0.65f); gl.draw_Box (half_w, H, half_d); for (const PultButton* b : buttons) b->draw(gl, cam, light); } } // namespace Nimbin