]> git.localhorst.tv Git - blank.git/blobdiff - src/ui/ui.cpp
remove self on player controller destruct
[blank.git] / src / ui / ui.cpp
index e7e6b0c7725a36264222a08633119d4f443ba6d2..6a2e2ee167042720101bab5f7d1062d3c2cc610f 100644 (file)
@@ -37,12 +37,16 @@ PlayerController::PlayerController(World &world, Player &player)
 : world(world)
 , player(player)
 , move_dir(0.0f)
-, pitch(0.0f)
-, yaw(0.0f)
 , dirty(true)
 , aim_world()
 , aim_entity() {
+       player.GetEntity().SetController(*this);
+}
 
+PlayerController::~PlayerController() {
+       if (&player.GetEntity().GetController() == this) {
+               player.GetEntity().UnsetController();
+       }
 }
 
 void PlayerController::SetMovement(const glm::vec3 &m) noexcept {
@@ -54,20 +58,20 @@ void PlayerController::SetMovement(const glm::vec3 &m) noexcept {
        Invalidate();
 }
 
+glm::vec3 PlayerController::ControlForce(const Entity &e, const EntityState &s) const {
+       return TargetVelocity(rotateY(move_dir * e.MaxVelocity(), s.yaw), s, 5.0f);
+}
+
 void PlayerController::TurnHead(float dp, float dy) noexcept {
-       pitch += dp;
-       if (pitch > PI / 2) {
-               pitch = PI / 2;
-       } else if (pitch < -PI / 2) {
-               pitch = -PI / 2;
-       }
-       yaw += dy;
-       if (yaw > PI) {
-               yaw -= PI * 2;
-       } else if (yaw < -PI) {
-               yaw += PI * 2;
-       }
-       Invalidate();
+       player.GetEntity().TurnHead(dp, dy);
+}
+
+float PlayerController::GetPitch() const noexcept {
+       return player.GetEntity().Pitch();
+}
+
+float PlayerController::GetYaw() const noexcept {
+       return player.GetEntity().Yaw();
 }
 
 void PlayerController::SelectInventory(int i) noexcept {
@@ -83,12 +87,7 @@ void PlayerController::Invalidate() noexcept {
 }
 
 void PlayerController::UpdatePlayer() noexcept {
-       constexpr float max_vel = 5.0f; // in m/s
        if (dirty) {
-               player.GetEntity().Orientation(glm::quat(glm::vec3(0.0f, yaw, 0.0f)));
-               player.GetEntity().GetModel().EyesState().orientation = glm::quat(glm::vec3(pitch, 0.0f, 0.0f));
-               player.GetEntity().TargetVelocity(glm::rotateY(move_dir * max_vel, yaw));
-
                Ray aim = player.Aim();
                if (!world.Intersection(aim, glm::mat4(1.0f), player.GetEntity().ChunkCoords(), aim_world)) {
                        aim_world = WorldCollision();
@@ -112,12 +111,12 @@ void PlayerController::UpdatePlayer() noexcept {
 DirectInput::DirectInput(World &world, Player &player, WorldManipulator &manip)
 : PlayerController(world, player)
 , manip(manip)
-, place_timer(256)
-, remove_timer(256) {
+, place_timer(0.25f)
+, remove_timer(0.25f) {
 
 }
 
-void DirectInput::Update(int dt) {
+void DirectInput::Update(Entity &, float dt) {
        Invalidate(); // world has changed in the meantime
        UpdatePlayer();
 
@@ -212,8 +211,11 @@ HUD::HUD(Environment &env, Config &config, const Player &player)
 // message box
 , messages(env.assets.small_ui_font)
 , msg_timer(5000)
+, msg_keep(false)
 // crosshair
 , crosshair() {
+       const float ls = env.assets.small_ui_font.LineSkip();
+
        // "inventory"
        block_transform = glm::translate(block_transform, glm::vec3(50.0f, 50.0f, 0.0f));
        block_transform = glm::scale(block_transform, glm::vec3(50.0f));
@@ -231,23 +233,23 @@ HUD::HUD(Environment &env, Config &config, const Player &player)
        counter_text.Position(glm::vec3(-25.0f, 25.0f, 0.0f), Gravity::NORTH_EAST);
        counter_text.Foreground(glm::vec4(1.0f));
        counter_text.Background(glm::vec4(0.5f));
-       position_text.Position(glm::vec3(-25.0f, 25.0f + env.assets.small_ui_font.LineSkip(), 0.0f), Gravity::NORTH_EAST);
+       position_text.Position(glm::vec3(-25.0f, 25.0f + ls, 0.0f), Gravity::NORTH_EAST);
        position_text.Foreground(glm::vec4(1.0f));
        position_text.Background(glm::vec4(0.5f));
-       orientation_text.Position(glm::vec3(-25.0f, 25.0f + 2 * env.assets.small_ui_font.LineSkip(), 0.0f), Gravity::NORTH_EAST);
+       orientation_text.Position(glm::vec3(-25.0f, 25.0f + 2 * ls, 0.0f), Gravity::NORTH_EAST);
        orientation_text.Foreground(glm::vec4(1.0f));
        orientation_text.Background(glm::vec4(0.5f));
-       block_text.Position(glm::vec3(-25.0f, 25.0f + 4 * env.assets.small_ui_font.LineSkip(), 0.0f), Gravity::NORTH_EAST);
+       block_text.Position(glm::vec3(-25.0f, 25.0f + 4 * ls, 0.0f), Gravity::NORTH_EAST);
        block_text.Foreground(glm::vec4(1.0f));
        block_text.Background(glm::vec4(0.5f));
        block_text.Set(env.assets.small_ui_font, "Block: none");
-       entity_text.Position(glm::vec3(-25.0f, 25.0f + 4 * env.assets.small_ui_font.LineSkip(), 0.0f), Gravity::NORTH_EAST);
+       entity_text.Position(glm::vec3(-25.0f, 25.0f + 4 * ls, 0.0f), Gravity::NORTH_EAST);
        entity_text.Foreground(glm::vec4(1.0f));
        entity_text.Background(glm::vec4(0.5f));
        entity_text.Set(env.assets.small_ui_font, "Entity: none");
 
        // message box
-       messages.Position(glm::vec3(25.0f, -25.0f, 0.0f), Gravity::SOUTH_WEST);
+       messages.Position(glm::vec3(25.0f, -25.0f - 2 * ls, 0.0f), Gravity::SOUTH_WEST);
        messages.Foreground(glm::vec4(1.0f));
        messages.Background(glm::vec4(0.5f));
 
@@ -400,7 +402,7 @@ void HUD::Render(Viewport &viewport) noexcept {
                }
 
                // message box
-               if (msg_timer.Running()) {
+               if (msg_keep || msg_timer.Running()) {
                        messages.Render(viewport);
                }
 
@@ -462,10 +464,20 @@ Interface::Interface(
 , fwd(0)
 , rev(0)
 , slot(0)
-, num_slots(10) {
+, num_slots(10)
+, locked(false) {
 
 }
 
+void Interface::Lock() {
+       fwd = glm::ivec3(0);
+       rev = glm::ivec3(0);
+       locked = true;
+}
+
+void Interface::Unlock() {
+       locked = false;
+}
 
 void Interface::HandlePress(const SDL_KeyboardEvent &event) {
        if (!config.input.keyboard) return;
@@ -597,7 +609,7 @@ void Interface::HandleRelease(const SDL_KeyboardEvent &event) {
 }
 
 void Interface::Handle(const SDL_MouseMotionEvent &event) {
-       if (!config.input.mouse) return;
+       if (locked || !config.input.mouse) return;
        player_ctrl.TurnHead(
                event.yrel * config.input.pitch_sensitivity,
                event.xrel * config.input.yaw_sensitivity);