#pragma once #include #include #include #include #include #include namespace LV::Client { using EntityId_t = uint16_t; using FuncEntityId_t = uint16_t; struct GlobalTime { uint32_t Seconds : 22 = 0, Sub : 10 = 0; GlobalTime() = default; GlobalTime(double gTime) { Seconds = int(gTime); Sub = (gTime-int(gTime))*1024; } GlobalTime& operator=(double gTime) { Seconds = int(gTime); Sub = (gTime-int(gTime))*1024; return *this; } operator double() const { return double(Seconds) + double(Sub)/1024.; } }; // 16 метров ребро // 256 вокселей ребро struct Chunk { // Кубы вокселей в чанке std::vector Voxels; // Ноды std::array Nodes; // Ограничения прохождения света, идущего от солнца (от верха карты до верхней плоскости чанка) // LightPrism Lights[16][16]; }; class Entity { public: // PosQuat WorldId_t WorldId; // PortalId LastUsedPortal; Pos::Object Pos; glm::quat Quat; static constexpr uint16_t HP_BS = 4096, HP_BS_Bit = 12; uint32_t HP = 0; // State std::unordered_map Tags; // m_attached_particle_spawners // states }; /* Интерфейс рендера текущего подключения к серверу */ class IRenderSession { public: // Объект уведомления об изменениях struct TickSyncData { // Новые или изменённые используемые теперь двоичные ресурсы std::unordered_map> Assets_ChangeOrAdd; // Более не используемые ресурсы std::unordered_map> Assets_Lost; // Новые или изменённые профили контента std::unordered_map> Profiles_ChangeOrAdd; // Более не используемые профили std::unordered_map> Profiles_Lost; // Новые или изменённые чанки std::unordered_map> Chunks_ChangeOrAdd; // Более не отслеживаемые регионы std::unordered_map> Chunks_Lost; }; public: // Серверная сессия собирается обработать данные такток сервера (изменение профилей, ресурсов, прочих игровых данных) virtual void prepareTickSync() = 0; // Началась стадия изменения данных IServerSession, все должны приостановить работу virtual void pushStageTickSync() = 0; // После изменения внутренних данных IServerSession, IRenderSession уведомляется об изменениях virtual void tickSync(TickSyncData& data) = 0; // Установить позицию для камеры virtual void setCameraPos(WorldId_t worldId, Pos::Object pos, glm::quat quat) = 0; virtual ~IRenderSession(); }; struct Region { std::array Chunks; }; struct World { }; struct DefWorldInfo { }; struct DefPortalInfo { }; struct DefEntityInfo { }; struct DefFuncEntityInfo { }; struct WorldInfo { std::vector Entitys; std::vector FuncEntitys; std::unordered_map Regions; }; struct VoxelInfo { }; struct NodeInfo { }; struct PortalInfo { }; struct EntityInfo { }; struct FuncEntityInfo { }; struct DefItemInfo { }; struct DefVoxel_t {}; struct DefNode_t {}; struct AssetEntry { EnumAssets Type; ResourceId Id; std::string Domain, Key; Resource Res; }; /* Интерфейс обработчика сессии с сервером. Данный здесь меняются только меж вызовами IRenderSession::pushStageTickSync и IRenderSession::tickSync */ class IServerSession { public: // Используемые двоичные ресурсы std::unordered_map> Assets; // Используемые профили контента struct { std::unordered_map DefVoxel; std::unordered_map DefNode; std::unordered_map DefWorld; std::unordered_map DefPortal; std::unordered_map DefEntity; std::unordered_map DefItem; } Profiles; // Видимый контент struct { std::unordered_map Worlds; // std::unordered_map Portals; std::unordered_map Entityes; } Content; virtual ~IServerSession(); // Обновление сессии с сервером, может начатся стадия IRenderSession::tickSync virtual void update(GlobalTime gTime, float dTime) = 0; }; /* Интерфейс получателя событий от модуля вывода графики в ОС */ class ISurfaceEventListener { public: enum struct EnumCursorMoveMode { Default, MoveAndHidden } CursorMode = EnumCursorMoveMode::Default; enum struct EnumCursorBtn { Left, Right, Middle, One, Two }; public: // Изменение размера окна вывода графики virtual void onResize(uint32_t width, uint32_t height); // Приобретение или потеря фокуса приложением virtual void onChangeFocusState(bool isFocused); // Абсолютное изменение позиции курсора (вызывается только если CursorMode == EnumCursorMoveMode::Default) virtual void onCursorPosChange(int32_t width, int32_t height); // Относительное перемещение курсора (вызывается только если CursorMode == EnumCursorMoveMode::MoveAndHidden) virtual void onCursorMove(float xMove, float yMove); // Когда на GPU отправлены команды на отрисовку мира и мир рисуется virtual void onFrameRendering(); // Здесь пока неизвестно что можно делать, но тут есть свободное время // Когда GPU завершил кадр virtual void onFrameRenderEnd(); // Изменять игровые данные можно только здесь virtual void onCursorBtn(EnumCursorBtn btn, bool state); virtual void onKeyboardBtn(int btn, int state); virtual void onJoystick(); virtual ~ISurfaceEventListener(); }; }