From 6800406409eee4e7ece80e0dd34a630c80bf0a2e Mon Sep 17 00:00:00 2001 From: nitroglycerine Date: Mon, 17 Jun 2024 02:54:58 -0700 Subject: [PATCH] Mouse Drag --- main.cpp | 8 ++++++++ main_d3d.cpp | 7 +++++++ scene.cpp | 35 ++++++++++++++++++++++++++++++++++- scene.hpp | 14 ++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index d9abd60..775d52e 100755 --- a/main.cpp +++ b/main.cpp @@ -71,6 +71,14 @@ glm::vec3 WindowCoordToPickRayDir(Camera* cam, int x, int y) { return ret; } +glm::vec3 WindowCoordToGamePlane(Camera* cam, int x, int y) { + glm::vec3 ray_dir = WindowCoordToPickRayDir(cam, x, y); + glm::vec3 orig = cam->pos; + float t = (0 - orig.z) / ray_dir.z; + glm::vec3 ret = orig + ray_dir * t; + return ret; +} + // These are all scaffolds Triangle *g_triangle[2]; ColorCube *g_colorcube[2]; diff --git a/main_d3d.cpp b/main_d3d.cpp index 2cf9422..77ef9ab 100644 --- a/main_d3d.cpp +++ b/main_d3d.cpp @@ -1035,6 +1035,7 @@ void OnKeyUp(WPARAM wParam, LPARAM lParam) { void OnMouseMove(int x, int y) { g_mouse_x = x; g_mouse_y = y + g_titlebar_size; + GetCurrentGameScene()->OnMouseMove(g_mouse_x, g_mouse_y); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) @@ -1066,6 +1067,12 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) case WM_MOUSEMOVE: OnMouseMove(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)); break; + case WM_LBUTTONDOWN: + GetCurrentGameScene()->OnMouseDown(); + break; + case WM_LBUTTONUP: + GetCurrentGameScene()->OnMouseUp(); + break; default: return DefWindowProc(hwnd, message, wparam, lparam); } diff --git a/scene.cpp b/scene.cpp index d3f42a4..64b9297 100755 --- a/scene.cpp +++ b/scene.cpp @@ -83,6 +83,7 @@ extern bool IsGL(); extern bool IsD3D11(); extern bool IsD3D12(); extern glm::vec3 WindowCoordToPickRayDir(Camera* cam, int x, int y); +extern glm::vec3 WindowCoordToGamePlane(Camera* cam, int x, int y); extern int g_mouse_x, g_mouse_y; const glm::vec3 ClimbScene::PLAYER_ROPE_ENDPOINT[8] = @@ -155,22 +156,33 @@ void ClimbScene::PrepareSpriteListForRender() { bool should_add_hl = false; glm::vec3 campos = camera->pos; campos.z = 0; + hovered_sprite = nullptr; for (Platform* p : platforms) { Sprite* sp = p->GetSpriteForDisplay(); if (this->game_state == ClimbGameStateInEditing && sp != nullptr && curr_edit_option == 0) { ChunkSprite* csp = dynamic_cast(sp); + + if (is_dragging && dragged_sprite) { + glm::vec3 drag_delta = WindowCoordToGamePlane(camera, mouse_x, mouse_y) - drag_pos0; + dragged_sprite->pos = dragged_sprite_pos0 + drag_delta; + } + if (csp) { AABB aabb = csp->GetAABBInWorld(); - glm::vec3 pickray_dir = WindowCoordToPickRayDir(camera, g_mouse_x, g_mouse_y); + glm::vec3 pickray_dir = WindowCoordToPickRayDir(camera, mouse_x, mouse_y); glm::vec3 pickray_orig = camera->pos; bool x1 = (campos.x >= aabb.lb.x && campos.x <= aabb.ub.x && campos.y >= aabb.lb.y && campos.y <= aabb.ub.y); bool x2 = aabb.IntersectRay(pickray_orig, pickray_dir); + if (x2) { + hovered_sprite = csp; + } + if (x1 || x2) { highlight_sprite->pos = sp->pos; float phase = fabs(sin(light_phase * 4)); @@ -1168,6 +1180,27 @@ Sprite* ClimbScene::CurrentCursorSprite() { } else return nullptr; } +void ClimbScene::OnMouseMove(int mx, int my) { + mouse_x = mx; + mouse_y = my; +} + +void ClimbScene::OnMouseDown() { + is_dragging = true; + drag_mouse_x0 = mouse_x; + drag_mouse_y0 = mouse_y; + drag_pos0 = WindowCoordToGamePlane(camera, drag_mouse_x0, drag_mouse_y0); + dragged_sprite = hovered_sprite; + if (dragged_sprite) { + dragged_sprite_pos0 = dragged_sprite->pos; + } +} + +void ClimbScene::OnMouseUp() { + is_dragging = false; + dragged_sprite = nullptr; +} + // 2019-12-18 // 2020-01-01 ????? #ifdef WIN32 diff --git a/scene.hpp b/scene.hpp index 36c03b0..bbb0789 100644 --- a/scene.hpp +++ b/scene.hpp @@ -28,6 +28,10 @@ class GameScene { virtual void OnKeyPressed(char key) { }; virtual void OnKeyReleased(char key) { }; + virtual void OnMouseMove(int mx, int my) { }; + virtual void OnMouseDown() { }; + virtual void OnMouseUp() { }; + Camera* camera; GameScene() : camera(&g_cam) { } @@ -315,6 +319,16 @@ class ClimbScene : public GameScene { Sprite* CurrentCursorSprite(); Sprite* highlight_sprite; bool CanHideMenu(); + + int drag_mouse_x0, drag_mouse_y0; + glm::vec3 drag_pos0, dragged_sprite_pos0; + int mouse_x, mouse_y; + bool is_dragging = false; + ChunkSprite* dragged_sprite, *hovered_sprite; + + virtual void OnMouseMove(int mx, int my); + virtual void OnMouseDown(); + virtual void OnMouseUp(); }; class LightTestScene : public GameScene {