527 lines
15 KiB
C++
Executable File
527 lines
15 KiB
C++
Executable File
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
|
|
|
|
#pragma once
|
|
|
|
#include <math/ray.hpp>
|
|
#include <noggit/Misc.h>
|
|
#include <noggit/Selection.h>
|
|
#include <noggit/BoolToggleProperty.hpp>
|
|
#include <noggit/Camera.hpp>
|
|
#include <noggit/tool_enums.hpp>
|
|
#include <noggit/ui/ObjectEditor.h>
|
|
#include <noggit/ui/MinimapCreator.hpp>
|
|
#include <noggit/ui/UidFixWindow.hpp>
|
|
#include <noggit/unsigned_int_property.hpp>
|
|
#include <noggit/ui/tools/AssetBrowser/Ui/AssetBrowser.hpp>
|
|
#include <noggit/ui/tools/ViewportGizmo/ViewportGizmo.hpp>
|
|
#include <noggit/ui/tools/ViewportManager/ViewportManager.hpp>
|
|
#include <noggit/ui/tools/ToolPanel/ToolPanel.hpp>
|
|
#include <noggit/TabletManager.hpp>
|
|
#include <external/qtimgui/QtImGui.h>
|
|
#include <opengl/texture.hpp>
|
|
#include <opengl/scoped.hpp>
|
|
#include <optional>
|
|
|
|
#include <QtCore/QElapsedTimer>
|
|
#include <QtCore/QSettings>
|
|
#include <QtCore/QTimer>
|
|
#include <QtWidgets/QDockWidget>
|
|
#include <QtWidgets/QLabel>
|
|
#include <QtWidgets/QOpenGLWidget>
|
|
#include <QWidgetAction>
|
|
#include <QOpenGLContext>
|
|
|
|
#include <forward_list>
|
|
#include <map>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <thread>
|
|
#include <array>
|
|
#include <optional>
|
|
|
|
#include <ui_MapViewOverlay.h>
|
|
|
|
|
|
class World;
|
|
|
|
namespace Noggit::Ui::Windows
|
|
{
|
|
class NoggitWindow;
|
|
}
|
|
|
|
namespace Noggit
|
|
{
|
|
|
|
namespace Ui::Tools::ViewToolbar::Ui
|
|
{
|
|
class ViewToolbar;
|
|
}
|
|
|
|
namespace Ui::Tools
|
|
{
|
|
class BrushStack;
|
|
class LightEditor;
|
|
|
|
namespace ChunkManipulator
|
|
{
|
|
class ChunkManipulatorPanel;
|
|
}
|
|
}
|
|
|
|
namespace Scripting
|
|
{
|
|
class scripting_tool;
|
|
}
|
|
|
|
class Camera;
|
|
|
|
|
|
namespace Ui
|
|
{
|
|
class detail_infos;
|
|
class flatten_blur_tool;
|
|
class help;
|
|
class minimap_widget;
|
|
class ShaderTool;
|
|
class TerrainTool;
|
|
class texture_picker;
|
|
class texturing_tool;
|
|
class toolbar;
|
|
class water;
|
|
class zone_id_browser;
|
|
class texture_palette_small;
|
|
class hole_tool;
|
|
struct tileset_chooser;
|
|
class ObjectPalette;
|
|
class GroundEffectsTool;
|
|
}
|
|
}
|
|
|
|
enum class save_mode
|
|
{
|
|
current,
|
|
changed,
|
|
all
|
|
};
|
|
|
|
class MapView : public Noggit::Ui::Tools::ViewportManager::Viewport
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
bool _mod_alt_down = false;
|
|
bool _mod_ctrl_down = false;
|
|
bool _mod_shift_down = false;
|
|
bool _mod_space_down = false;
|
|
bool _mod_num_down = false;
|
|
|
|
bool leftMouse = false;
|
|
bool leftClicked = false;
|
|
bool rightMouse = false;
|
|
|
|
std::unique_ptr<World> _world;
|
|
Noggit::Camera _camera;
|
|
|
|
private:
|
|
|
|
float _2d_zoom = 1.f;
|
|
float moving, strafing, updown, mousedir, turn, lookat;
|
|
CursorType _cursorType;
|
|
glm::vec3 _cursor_pos;
|
|
QPoint _drag_start_pos;
|
|
QPoint _right_click_pos;
|
|
float _cursorRotation;
|
|
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<Qt::Key, 6> _inputs = {Qt::Key_W, Qt::Key_S, Qt::Key_D, Qt::Key_A, Qt::Key_Q, Qt::Key_E};
|
|
void checkInputsSettings();
|
|
|
|
public:
|
|
Noggit::BoolToggleProperty _draw_vertex_color = {true};
|
|
Noggit::BoolToggleProperty _draw_baked_shadows = { false };
|
|
Noggit::BoolToggleProperty _draw_climb = {false};
|
|
Noggit::BoolToggleProperty _draw_contour = {false};
|
|
Noggit::BoolToggleProperty _draw_mfbo = {false};
|
|
Noggit::BoolToggleProperty _draw_wireframe = {false};
|
|
Noggit::BoolToggleProperty _draw_lines = {false};
|
|
Noggit::BoolToggleProperty _draw_terrain = {true};
|
|
Noggit::BoolToggleProperty _draw_wmo = {true};
|
|
Noggit::BoolToggleProperty _draw_water = {true};
|
|
Noggit::BoolToggleProperty _draw_wmo_doodads = {true};
|
|
Noggit::BoolToggleProperty _draw_wmo_exterior = { true };
|
|
Noggit::BoolToggleProperty _draw_models = {true};
|
|
Noggit::BoolToggleProperty _draw_model_animations = {true};
|
|
Noggit::BoolToggleProperty _draw_hole_lines = {false};
|
|
Noggit::BoolToggleProperty _draw_models_with_box = {false};
|
|
Noggit::BoolToggleProperty _draw_fog = {false};
|
|
Noggit::BoolToggleProperty _draw_sky = { true };
|
|
Noggit::BoolToggleProperty _draw_skybox = { true };
|
|
Noggit::BoolToggleProperty _draw_hidden_models = {false};
|
|
Noggit::BoolToggleProperty _draw_occlusion_boxes = {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 };
|
|
private:
|
|
|
|
int _selected_area_id = -1;
|
|
|
|
[[nodiscard]]
|
|
math::ray intersect_ray() const;
|
|
selection_result intersect_result(bool terrain_only);
|
|
void doSelection(bool selectTerrainOnly, bool mouseMove = false);
|
|
void update_cursor_pos();
|
|
|
|
display_mode _display_mode;
|
|
|
|
[[nodiscard]]
|
|
glm::mat4x4 model_view(bool use_debug_cam = false) const;
|
|
|
|
[[nodiscard]]
|
|
glm::mat4x4 projection() const;
|
|
|
|
void draw_map();
|
|
|
|
void createGUI();
|
|
|
|
QWidgetAction* createTextSeparator(const QString& text);
|
|
|
|
float mTimespeed;
|
|
|
|
void ResetSelectedObjectRotation();
|
|
void snap_selected_models_to_the_ground();
|
|
void DeleteSelectedObjects();
|
|
void changeZoneIDValue (int set);
|
|
|
|
QPointF _last_mouse_pos;
|
|
float mh, mv, rh, rv; // mh = left click x, rv = right click y
|
|
|
|
float keyx = 0, keyy = 0, keyz = 0, keyr = 0, keys = 0;
|
|
|
|
bool MoveObj;
|
|
float numpad_moveratio = 0.001f;
|
|
|
|
glm::vec3 objMove;
|
|
|
|
std::vector<selection_type> lastSelected;
|
|
|
|
bool _rotation_editor_need_update = false;
|
|
bool _texture_picker_need_update = false;
|
|
bool _area_picker_need_update = false;
|
|
|
|
// Vars for the ground editing toggle mode store the status of some
|
|
// view settings when the ground editing mode is switched on to
|
|
// restore them if switch back again
|
|
std::shared_ptr<Noggit::Project::NoggitProject> _project;
|
|
bool alloff = true;
|
|
bool alloff_models = false;
|
|
bool alloff_doodads = false;
|
|
bool alloff_contour = false;
|
|
bool alloff_wmo = false;
|
|
bool alloff_detailselect = false;
|
|
bool alloff_fog = false;
|
|
bool alloff_terrain = false;
|
|
bool alloff_climb = false;
|
|
bool alloff_vertex_color = false;
|
|
bool alloff_baked_shadows = false;
|
|
|
|
editing_mode terrainMode = editing_mode::ground;
|
|
editing_mode saveterrainMode = terrainMode;
|
|
|
|
bool _uid_duplicate_warning_shown = false;
|
|
bool _force_uid_check = false;
|
|
bool _uid_fix_failed = false;
|
|
void on_uid_fix_fail();
|
|
|
|
uid_fix_mode _uid_fix;
|
|
bool _from_bookmark;
|
|
|
|
bool saving_minimap = false;
|
|
|
|
Noggit::Ui::toolbar* _toolbar;
|
|
Noggit::Ui::Tools::ViewToolbar::Ui::ViewToolbar* _view_toolbar;
|
|
Noggit::Ui::Tools::ViewToolbar::Ui::ViewToolbar* _secondary_toolbar;
|
|
Noggit::Ui::Tools::ViewToolbar::Ui::ViewToolbar* _left_sec_toolbar;
|
|
|
|
void save(save_mode mode);
|
|
|
|
QSettings* _settings;
|
|
Noggit::Ui::Tools::ViewportGizmo::ViewportGizmo _transform_gizmo;
|
|
ImGuiContext* _imgui_context;
|
|
|
|
signals:
|
|
void uid_fix_failed();
|
|
void resized();
|
|
void saved();
|
|
void updateProgress(int value);
|
|
void selectionUpdated();
|
|
public slots:
|
|
void on_exit_prompt();
|
|
void ShowContextMenu(QPoint pos);
|
|
void onApplicationStateChanged(Qt::ApplicationState state);
|
|
|
|
public:
|
|
glm::vec4 cursor_color;
|
|
|
|
MapView ( math::degrees ah0
|
|
, math::degrees av0
|
|
, glm::vec3 camera_pos
|
|
, Noggit::Ui::Windows::NoggitWindow*
|
|
, std::shared_ptr<Noggit::Project::NoggitProject> Project
|
|
, std::unique_ptr<World>
|
|
, uid_fix_mode uid_fix = uid_fix_mode::none
|
|
, bool from_bookmark = false
|
|
);
|
|
~MapView();
|
|
|
|
void tick (float dt);
|
|
void change_selected_wmo_nameset(int set);
|
|
void change_selected_wmo_doodadset(int set);
|
|
void saveMinimap(MinimapRenderSettings* settings);
|
|
void initMinimapSave() { saving_minimap = true; };
|
|
auto setBrushTexture(QImage const* img) -> void;
|
|
Noggit::Camera* getCamera() { return &_camera; };
|
|
void randomizeTerrainRotation();
|
|
void randomizeTexturingRotation();
|
|
void randomizeShaderRotation();
|
|
void randomizeStampRotation();
|
|
void onSettingsSave();
|
|
void updateRotationEditor() { _rotation_editor_need_update = true; };
|
|
void setCameraDirty() { _camera_moved_since_last_draw = true; };
|
|
|
|
[[nodiscard]]
|
|
Noggit::Ui::minimap_widget* getMinimapWidget() const { return _minimap; }
|
|
|
|
void set_editing_mode (editing_mode);
|
|
editing_mode get_editing_mode() { return terrainMode; };
|
|
|
|
[[nodiscard]]
|
|
QWidget *getSecondaryToolBar();
|
|
|
|
[[nodiscard]]
|
|
QWidget *getLeftSecondaryToolbar();
|
|
|
|
[[nodiscard]]
|
|
QWidget* getActiveStampModeItem();
|
|
|
|
[[nodiscard]]
|
|
Noggit::Ui::flatten_blur_tool* getFlattenTool() { return flattenTool; };
|
|
|
|
[[nodiscard]]
|
|
Noggit::Ui::GroundEffectsTool* getGroundEffectsTool();
|
|
|
|
[[nodiscard]]
|
|
Noggit::NoggitRenderContext getRenderContext() { return _context; };
|
|
|
|
[[nodiscard]]
|
|
World* getWorld() { return _world.get(); };
|
|
|
|
[[nodiscard]]
|
|
QDockWidget* getAssetBrowser() {return _asset_browser_dock; };
|
|
|
|
[[nodiscard]]
|
|
Noggit::Ui::Tools::AssetBrowser::Ui::AssetBrowserWidget* getAssetBrowserWidget() { return _asset_browser; };
|
|
|
|
[[nodiscard]]
|
|
Noggit::Ui::object_editor* getObjectEditor() { return objectEditor; };
|
|
|
|
[[nodiscard]]
|
|
QDockWidget* getObjectPalette() { return _object_palette_dock; };
|
|
|
|
[[nodiscard]]
|
|
QDockWidget* getTexturePalette() { return _texture_palette_dock; };
|
|
|
|
private:
|
|
enum Modifier
|
|
{
|
|
MOD_shift = 0x01,
|
|
MOD_ctrl = 0x02,
|
|
MOD_alt = 0x04,
|
|
MOD_meta = 0x08,
|
|
MOD_space = 0x10,
|
|
MOD_num = 0x20,
|
|
MOD_none = 0x00
|
|
};
|
|
struct HotKey
|
|
{
|
|
Qt::Key key;
|
|
size_t modifiers;
|
|
std::function<void()> function;
|
|
std::function<bool()> condition;
|
|
HotKey (Qt::Key k, size_t m, std::function<void()> f, std::function<bool()> c)
|
|
: key (k), modifiers (m), function (f), condition (c) {}
|
|
};
|
|
|
|
std::forward_list<HotKey> hotkeys;
|
|
|
|
void addHotkey(Qt::Key key, size_t modifiers, std::function<void()> function, std::function<bool()> condition = [] { return true; });
|
|
|
|
QElapsedTimer _startup_time;
|
|
qreal _last_update = 0.f;
|
|
std::list<qreal> _last_frame_durations;
|
|
|
|
float _last_fps_update = 0.f;
|
|
|
|
QTimer _update_every_event_loop;
|
|
|
|
QOpenGLContext* _last_opengl_context;
|
|
|
|
virtual void tabletEvent(QTabletEvent* event) override;
|
|
virtual void initializeGL() override;
|
|
virtual void paintGL() override;
|
|
virtual void resizeGL (int w, int h) override;
|
|
virtual void mouseMoveEvent (QMouseEvent*) override;
|
|
virtual void mousePressEvent (QMouseEvent*) override;
|
|
virtual void mouseReleaseEvent (QMouseEvent*) override;
|
|
virtual void wheelEvent (QWheelEvent*) override;
|
|
virtual void keyReleaseEvent (QKeyEvent*) override;
|
|
virtual void keyPressEvent (QKeyEvent*) override;
|
|
virtual void focusOutEvent (QFocusEvent*) override;
|
|
virtual void enterEvent(QEvent*) override;
|
|
|
|
Noggit::Ui::Windows::NoggitWindow* _main_window;
|
|
|
|
glm::vec4 normalized_device_coords (int x, int y) const;
|
|
float aspect_ratio() const;
|
|
|
|
Noggit::TabletManager* _tablet_manager;
|
|
|
|
QLabel* _status_position;
|
|
QLabel* _status_selection;
|
|
QLabel* _status_area;
|
|
QLabel* _status_time;
|
|
QLabel* _status_fps;
|
|
QLabel* _status_culling;
|
|
QLabel* _status_database;
|
|
|
|
Noggit::BoolToggleProperty _locked_cursor_mode = {false};
|
|
Noggit::BoolToggleProperty _move_model_to_cursor_position = {true};
|
|
Noggit::BoolToggleProperty _move_model_snap_to_objects = { true };
|
|
Noggit::BoolToggleProperty _snap_multi_selection_to_ground = {false};
|
|
Noggit::BoolToggleProperty _rotate_along_ground = {true };
|
|
Noggit::BoolToggleProperty _rotate_doodads_along_doodads = { false };
|
|
Noggit::BoolToggleProperty _rotate_doodads_along_wmos = { false };
|
|
Noggit::BoolToggleProperty _rotate_along_ground_smooth = {true };
|
|
Noggit::BoolToggleProperty _rotate_along_ground_random = {false };
|
|
Noggit::BoolToggleProperty _use_median_pivot_point = {true};
|
|
Noggit::BoolToggleProperty _display_all_water_layers = {true};
|
|
Noggit::unsigned_int_property _displayed_water_layer = {0};
|
|
Noggit::object_paste_params _object_paste_params;
|
|
|
|
Noggit::BoolToggleProperty _show_node_editor = {false};
|
|
Noggit::BoolToggleProperty _show_minimap_borders = {true};
|
|
Noggit::BoolToggleProperty _show_minimap_skies = {false};
|
|
Noggit::BoolToggleProperty _show_keybindings_window = {false};
|
|
Noggit::BoolToggleProperty _show_texture_palette_window = {false};
|
|
Noggit::BoolToggleProperty _show_texture_palette_small_window = {false};
|
|
Noggit::BoolToggleProperty _showStampPalette{false};
|
|
|
|
Noggit::Ui::minimap_widget* _minimap;
|
|
QDockWidget* _minimap_dock;
|
|
QDockWidget* _texture_palette_dock;
|
|
QDockWidget* _object_palette_dock;
|
|
|
|
void move_camera_with_auto_height (glm::vec3 const&);
|
|
|
|
void setToolPropertyWidgetVisibility(editing_mode mode);
|
|
|
|
void unloadOpenglData() override;
|
|
|
|
Noggit::Ui::help* _keybindings;
|
|
Noggit::Ui::tileset_chooser* TexturePalette;
|
|
Noggit::Ui::detail_infos* guidetailInfos;
|
|
Noggit::Ui::zone_id_browser* ZoneIDBrowser;
|
|
Noggit::Ui::texture_palette_small* _texture_palette_small;
|
|
Noggit::Ui::ObjectPalette* _object_palette;
|
|
Noggit::Ui::texture_picker* TexturePicker;
|
|
Noggit::Ui::water* guiWater;
|
|
Noggit::Ui::object_editor* objectEditor;
|
|
Noggit::Ui::flatten_blur_tool* flattenTool;
|
|
Noggit::Ui::TerrainTool* terrainTool;
|
|
Noggit::Ui::ShaderTool* shaderTool;
|
|
Noggit::Ui::texturing_tool* texturingTool;
|
|
Noggit::Ui::hole_tool* holeTool;
|
|
Noggit::Ui::MinimapCreator* minimapTool;
|
|
Noggit::Ui::Tools::BrushStack* stampTool;
|
|
Noggit::Ui::Tools::LightEditor* lightEditor;
|
|
Noggit::Ui::Tools::ChunkManipulator::ChunkManipulatorPanel* _chunk_manipulator;
|
|
Noggit::Scripting::scripting_tool* scriptingTool;
|
|
|
|
OpenGL::texture* const _texBrush;
|
|
|
|
Noggit::Ui::Tools::AssetBrowser::Ui::AssetBrowserWidget* _asset_browser;
|
|
|
|
QDockWidget* _asset_browser_dock;
|
|
QDockWidget* _node_editor_dock;
|
|
QDockWidget* _texture_browser_dock;
|
|
QDockWidget* _texture_picker_dock;
|
|
QDockWidget* _detail_infos_dock;
|
|
|
|
Noggit::Ui::Tools::ToolPanel* _tool_panel_dock;
|
|
|
|
::Ui::MapViewOverlay* _viewport_overlay_ui;
|
|
ImGuizmo::MODE _gizmo_mode = ImGuizmo::MODE::WORLD;
|
|
ImGuizmo::OPERATION _gizmo_operation = ImGuizmo::OPERATION::TRANSLATE;
|
|
Noggit::BoolToggleProperty _gizmo_on = {true};
|
|
|
|
bool _change_operation_mode = false;
|
|
void updateGizmoOverlay(ImGuizmo::OPERATION operation);
|
|
|
|
bool _gl_initialized = false;
|
|
bool _destroying = false;
|
|
bool _needs_redraw = false;
|
|
bool _unload_tiles = true;
|
|
|
|
unsigned _mmap_async_index = 0;
|
|
unsigned _mmap_render_index = 0;
|
|
std::optional<QImage> _mmap_combined_image;
|
|
|
|
OpenGL::Scoped::deferred_upload_buffers<2> _buffers;
|
|
|
|
QRubberBand* _area_selection;
|
|
|
|
public:
|
|
|
|
private:
|
|
|
|
void setupViewportOverlay();
|
|
void setupRaiseLowerUi();
|
|
void setupFlattenBlurUi();
|
|
void setupTexturePainterUi();
|
|
void setupHoleCutterUi();
|
|
void setupAreaDesignatorUi();
|
|
void setupFlagUi();
|
|
void setupWaterEditorUi();
|
|
void setupVertexPainterUi();
|
|
void setupObjectEditorUi();
|
|
void setupMinimapEditorUi();
|
|
void setupStampUi();
|
|
void setupLightEditorUi();
|
|
void setupScriptingUi();
|
|
void setupChunkManipulatorUi();
|
|
void setupNodeEditor();
|
|
void setupAssetBrowser();
|
|
void setupDetailInfos();
|
|
void updateDetailInfos();
|
|
void setupToolbars();
|
|
void setupKeybindingsGui();
|
|
void setupMinimap();
|
|
void setupFileMenu();
|
|
void setupEditMenu();
|
|
void setupAssistMenu();
|
|
void setupViewMenu();
|
|
void setupHelpMenu();
|
|
void setupHotkeys();
|
|
void setupClientMenu();
|
|
void setupMainToolbar();
|
|
|
|
QWidget* _overlay_widget;
|
|
};
|