infinipaint/src/World.hpp

138 lines
4.6 KiB
C++
Raw Normal View History

2025-07-06 20:43:53 +03:00
#pragma once
#include <Helpers/NetworkingObjects/DelayUpdateSerializedClassManager.hpp>
#include <Helpers/NetworkingObjects/NetObjOrderedList.hpp>
#include "Helpers/NetworkingObjects/NetObjUnorderedSet.hpp"
2026-01-02 17:11:32 +03:00
#include "WorldUndoManager.hpp"
2025-12-20 16:38:51 +03:00
#include "Bookmarks/BookmarkManager.hpp"
2025-07-06 20:43:53 +03:00
#include "ResourceManager.hpp"
#include "DrawingProgram/DrawingProgram.hpp"
#include "Toolbar.hpp"
#include "SharedTypes.hpp"
2025-12-16 23:06:46 +03:00
#include "CanvasTheme.hpp"
2025-09-06 19:06:30 +03:00
#include "GridManager.hpp"
#include <Helpers/NetworkingObjects/NetObjManager.hpp>
2026-01-01 22:46:02 +03:00
#include <chrono>
2025-07-06 20:43:53 +03:00
#include <filesystem>
#include "ClientData.hpp"
2025-07-06 20:43:53 +03:00
class MainProgram;
//#define ENABLE_ORDERED_LIST_TEST
#define DEFAULT_CANVAS_BACKGROUND_COLOR Vector3f{0.07f, 0.07f, 0.07f}
2025-07-06 20:43:53 +03:00
class World {
public:
static constexpr std::string FILE_EXTENSION = "infpnt";
static constexpr size_t CHAT_SIZE = 10;
struct OpenWorldInfo {
2026-01-01 22:46:02 +03:00
bool isClient;
std::optional<std::filesystem::path> filePathSource;
2025-07-06 20:43:53 +03:00
std::string netSource;
std::string serverLocalID;
std::string_view fileDataBuffer;
};
World(MainProgram& initMain, OpenWorldInfo& worldInfo);
2025-12-09 13:00:38 +03:00
// NOTE: Keep at the very beginning so that it's destroyed last
NetworkingObjects::NetObjManager netObjMan;
2025-11-16 16:39:12 +03:00
void save_file(cereal::PortableBinaryOutputArchive& a) const;
void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version);
2025-07-06 20:43:53 +03:00
MainProgram& main;
DrawData drawData;
2026-01-02 17:11:32 +03:00
WorldUndoManager undo;
2025-07-06 20:43:53 +03:00
ResourceManager rMan;
DrawingProgram drawProg;
BookmarkManager bMan;
2025-09-06 19:06:30 +03:00
GridManager gridMan;
2025-07-06 20:43:53 +03:00
std::deque<Toolbar::ChatMessage> chatMessages;
std::string netSource;
void start_hosting(const std::string& initNetSource, const std::string& serverLocalID);
void send_chat_message(const std::string& message);
2025-10-16 09:38:58 +03:00
void add_chat_message(const std::string& name, const std::string& message, Toolbar::ChatMessage::Type type);
2025-07-06 20:43:53 +03:00
WorldVec get_mouse_world_pos();
WorldVec get_mouse_world_move();
WorldScalar calculate_zoom_from_uniform_zoom(WorldScalar uniformZoom, WorldVec oldWindowSize);
void focus_update();
void unfocus_update();
void on_tab_out();
void on_tab_in();
2025-07-06 20:43:53 +03:00
void draw(SkCanvas* canvas, const DrawData& calledDrawData);
2025-07-06 20:43:53 +03:00
void early_destroy();
bool clientStillConnecting = false;
2026-01-18 13:39:49 +03:00
void autosave_to_directory(const std::filesystem::path& directoryToSaveAt);
void save_to_file(const std::filesystem::path& filePathToSaveAt);
void load_from_file(const std::filesystem::path& filePathToLoadFrom, std::string_view buffer);
2025-07-06 20:43:53 +03:00
void undo_with_checks();
void redo_with_checks();
2025-07-06 20:43:53 +03:00
std::filesystem::path filePath;
std::string name;
NetworkingObjects::NetObjTemporaryPtr<ClientData> ownClientData;
NetworkingObjects::NetObjOwnerPtr<NetworkingObjects::NetObjUnorderedSet<ClientData>> clients;
2025-08-01 10:58:45 +03:00
2025-12-16 23:06:46 +03:00
CanvasTheme canvasTheme;
2025-08-01 10:58:45 +03:00
void scale_up(const WorldScalar& scaleUpAmount);
2025-09-30 16:36:09 +03:00
void scale_up_step();
2026-01-18 13:39:49 +03:00
bool should_ask_before_closing();
bool is_focus();
2026-01-18 13:39:49 +03:00
bool hasUnsavedLocalChanges = false;
bool setToDestroy = false;
2025-12-10 17:23:05 +03:00
NetworkingObjects::DelayUpdateSerializedClassManager delayedUpdateObjectManager;
std::shared_ptr<NetServer> netServer;
2026-01-01 22:46:02 +03:00
std::shared_ptr<NetClient> netClient;
std::unordered_map<unsigned, InputManager::KeyCallbackManager::Callback*> keyCallbacks;
2025-07-06 20:43:53 +03:00
private:
void register_callbacks();
void deregister_callbacks();
2026-01-01 22:46:02 +03:00
void load_empty_canvas();
Vector3f get_random_cursor_color();
void init_client_data_list();
void init_client_data_list_callbacks();
2025-12-10 17:23:05 +03:00
void init_net_obj_type_list();
2026-01-01 22:46:02 +03:00
void init_client(const std::string& serverFullID);
2025-07-06 20:43:53 +03:00
void set_name(const std::string& n);
2025-09-06 19:06:30 +03:00
void draw_other_player_cursors(SkCanvas* canvas, const DrawData& drawData);
void ensure_display_name_unique(std::string& displayName);
2025-09-06 19:06:30 +03:00
2026-01-01 22:46:02 +03:00
void connection_update();
TimePoint timeToSendCameraData;
2025-07-06 20:43:53 +03:00
WorldVec mousePreviousWorldVec = {0, 0};
WorldVec mouseWorldMove = {0, 0};
std::chrono::steady_clock::time_point lastKeepAliveSent;
#ifdef ENABLE_ORDERED_LIST_TEST
NetworkingObjects::NetObjOwnerPtr<NetworkingObjects::NetObjOrderedList<uint16_t>> listDebugTest;
void list_debug_test_update();
std::chrono::steady_clock::time_point listDebugTestTimeStart = std::chrono::steady_clock::now();
std::chrono::steady_clock::time_point nextSendTime = std::chrono::steady_clock::now();
#endif
2025-07-06 20:43:53 +03:00
};