From 32a37e6e13be732c44031564b17760641927385c Mon Sep 17 00:00:00 2001 From: T1ti <40864460+T1ti@users.noreply.github.com> Date: Mon, 26 Aug 2024 05:12:46 +0200 Subject: [PATCH] debug & fps Camera credit adspartan https://github.com/wowdev/noggit3/commit/a7eb763976b7f1a10c85784164745aff2b35898d --- src/noggit/MapView.cpp | 130 ++++++++++++++++++++++++++++------------- src/noggit/MapView.h | 9 ++- 2 files changed, 97 insertions(+), 42 deletions(-) diff --git a/src/noggit/MapView.cpp b/src/noggit/MapView.cpp index 50d2f2c4..6c0098ce 100755 --- a/src/noggit/MapView.cpp +++ b/src/noggit/MapView.cpp @@ -2258,7 +2258,7 @@ void MapView::setupViewMenu() ADD_TOGGLE (view_menu, "Show Node Editor", "Shift+N", _show_node_editor); - ADD_TOGGLE_NS(view_menu, "Game View", _game_mode_camera); + // ADD_TOGGLE_NS(view_menu, "Game View", _game_mode_camera); view_menu->addSeparator(); view_menu->addAction(createTextSeparator("Minimap")); @@ -2377,6 +2377,31 @@ void MapView::setupViewMenu() } ); + view_menu->addSeparator(); + view_menu->addAction(createTextSeparator("Camera Modes")); + view_menu->addSeparator(); + + /* // TODO, doesn't work for some reason. + ADD_TOGGLE_NS(view_menu, "Debug cam", _debug_cam_mode); + connect(&_debug_cam_mode, &Noggit::BoolToggleProperty::changed + , [this] + { + _debug_cam = Noggit::Camera(_camera.position, _camera.yaw(), _camera.pitch()); + } + ); + + ADD_ACTION_NS(view_menu + , "Go to debug camera" + , [this] + { + _camera = Noggit::Camera(_debug_cam.position, _debug_cam.yaw(), _debug_cam.pitch()); + } + );*/ + + ADD_TOGGLE_NS(view_menu, "FPS camera", _fps_mode); + + ADD_TOGGLE_NS(view_menu, "Camera Collision", _camera_collision); + } void MapView::setupHelpMenu() @@ -3003,6 +3028,7 @@ MapView::MapView( math::degrees camera_yaw0 , cursor_color (1.f, 1.f, 1.f, 1.f) , _cursorType{CursorType::CIRCLE} , _main_window (NoggitWindow) + , _debug_cam(camera_pos, camera_yaw0, camera_pitch0) , _world (std::move (world)) , _status_position (new QLabel (this)) , _status_selection (new QLabel (this)) @@ -4373,7 +4399,7 @@ void MapView::tick (float dt) rh = 0; rv = 0; - if (_display_mode != display_mode::in_2D) + if (_display_mode == display_mode::in_3D) { if (turn) { @@ -4386,29 +4412,33 @@ void MapView::tick (float dt) _camera_moved_since_last_draw = true; } - if (_game_mode_camera.get()) - { - if (moving) - { - _camera.move_forward(moving, dt); - _camera_moved_since_last_draw = true; - // TODO use normalized speed (doesn't slow down when looking up) - // _camera.move_forward_normalized(moving, dt); - } - if (strafing) - { - _camera.move_horizontal(strafing, dt); - _camera_moved_since_last_draw = true; - } - // get ground z position - // hack to update camera when entering mode in void ViewToolbar::add_tool_icon() - if (_camera_moved_since_last_draw) - { - auto ground_pos = _world.get()->get_ground_height(_camera.position); - _camera.position.y = ground_pos.y + 6; - } - } - else + // if (_fps_mode.get()) + // { + // // if (moving) + // // { + // // _camera.move_forward(moving, dt); + // // _camera_moved_since_last_draw = true; + // // // TODO use normalized speed (doesn't slow down when looking up) + // // // _camera.move_forward_normalized(moving, dt); + // // } + // // if (strafing) + // // { + // // _camera.move_horizontal(strafing, dt); + // // _camera_moved_since_last_draw = true; + // // } + // // // get ground z position + // // // hack to update camera when entering mode in void ViewToolbar::add_tool_icon() + // // if (_camera_moved_since_last_draw) + // // { + // // auto ground_pos = _world.get()->get_ground_height(_camera.position); + // // _camera.position.y = ground_pos.y + 6; + // // } + // + // auto h = _world->get_ground_height(_camera.position).y; + // + // _camera.position.y = h + 6.f; + // } + // else { if (moving) @@ -4426,15 +4456,24 @@ void MapView::tick (float dt) _camera.move_vertical(updown, dt); _camera_moved_since_last_draw = true; } - // camera collision to ground - /* - auto ground_height = _world.get()->get_ground_height(_camera.position).y; - if (_camera.position.y < ground_height) - { - _camera.position.y = ground_height + 3; - } - */ + if (_camera_moved_since_last_draw) + { + if (_fps_mode.get()) + { + // there is a also hack to update camera when entering mode in void ViewToolbar::add_tool_icon() + float h = _world->get_ground_height(_camera.position).y; + _camera.position.y = h + 3.f; + } + else if (_camera_collision.get()) + { + float h = _world.get()->get_ground_height(_camera.position).y; + if (_camera.position.y < h + 3.f) + { + _camera.position.y = h + 3.f; + } + } + } } } else @@ -4824,11 +4863,11 @@ void MapView::update_cursor_pos() } } -glm::mat4x4 MapView::model_view() const +glm::mat4x4 MapView::model_view(bool use_debug_cam) const { if (_display_mode == display_mode::in_2D) { - glm::vec3 eye = _camera.position; + glm::vec3 eye = use_debug_cam ? _debug_cam.position : _camera.position; glm::vec3 target = eye; target.y -= 1.f; target.z -= 0.001f; @@ -4839,7 +4878,14 @@ glm::mat4x4 MapView::model_view() const } else { - return _camera.look_at_matrix(); + if (use_debug_cam) + { + return _debug_cam.look_at_matrix(); + } + else + { + return _camera.look_at_matrix(); + } } } @@ -4856,7 +4902,7 @@ glm::mat4x4 MapView::projection() const } else { - return glm::perspective(_camera.fov()._, aspect_ratio(), 1.f, far_z); + return glm::perspective(_camera.fov()._, aspect_ratio(), _fps_mode.get() ? 0.1f : 1.f, far_z); } } @@ -4945,8 +4991,12 @@ void MapView::draw_map() bool classic_ui = _settings->value("classicUI", false).toBool(); bool show_unpaintable = classic_ui ? texturingTool->show_unpaintable_chunks() : _left_sec_toolbar->showUnpaintableChunk(); + + bool debug_cam = _debug_cam_mode.get(); + // math::frustum frustum(model_view(debug_cam) * projection()); + _world->renderer()->draw ( - model_view() + model_view(debug_cam) , projection() , _cursor_pos , _cursorRotation @@ -4965,8 +5015,8 @@ void MapView::draw_map() , angled_mode , terrainMode == editing_mode::paint , terrainMode - , _camera.position - , _camera_moved_since_last_draw + , debug_cam ? _debug_cam.position : _camera.position + , debug_cam ? false : _camera_moved_since_last_draw , _draw_mfbo.get() , _draw_terrain.get() , _draw_wmo.get() diff --git a/src/noggit/MapView.h b/src/noggit/MapView.h index a4aa2c66..9f346181 100755 --- a/src/noggit/MapView.h +++ b/src/noggit/MapView.h @@ -133,6 +133,11 @@ private: bool look, freelook; bool ui_hidden = false; + Noggit::Camera _debug_cam; + Noggit::BoolToggleProperty _debug_cam_mode = { false }; + Noggit::BoolToggleProperty _fps_mode = { false }; + Noggit::BoolToggleProperty _camera_collision = { false }; + bool _camera_moved_since_last_draw = true; std::array _inputs = {Qt::Key_W, Qt::Key_S, Qt::Key_D, Qt::Key_A, Qt::Key_Q, Qt::Key_E}; @@ -158,7 +163,7 @@ public: Noggit::BoolToggleProperty _draw_fog = {false}; Noggit::BoolToggleProperty _draw_hidden_models = {false}; Noggit::BoolToggleProperty _draw_occlusion_boxes = {false}; - Noggit::BoolToggleProperty _game_mode_camera = { false }; + // Noggit::BoolToggleProperty _game_mode_camera = { false }; Noggit::BoolToggleProperty _draw_lights_zones = { false }; Noggit::BoolToggleProperty _show_detail_info_window = { false }; Noggit::BoolToggleProperty _show_minimap_window = { false }; @@ -175,7 +180,7 @@ private: display_mode _display_mode; [[nodiscard]] - glm::mat4x4 model_view() const; + glm::mat4x4 model_view(bool use_debug_cam = false) const; [[nodiscard]] glm::mat4x4 projection() const;