#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_t 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: // Подгрузка двоичных ресурсов virtual void onBinaryResourceAdd(std::unordered_map>) = 0; virtual void onBinaryResourceLost(std::unordered_map>) = 0; virtual void onContentDefinesAdd(std::unordered_map>) = 0; virtual void onContentDefinesLost(std::unordered_map>) = 0; // Сообщаем об изменившихся чанках virtual void onChunksChange(WorldId_t worldId, const std::unordered_set &changeOrAddList, const std::unordered_set &remove) = 0; // Установить позицию для камеры virtual void setCameraPos(WorldId_t worldId, Pos::Object pos, glm::quat quat) = 0; virtual ~IRenderSession(); }; struct Region { std::array Chunks; }; struct World { }; struct DefVoxelInfo { }; struct DefNodeInfo { }; 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 { }; /* Интерфейс обработчика сессии с сервером */ class IServerSession { public: 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; } Registry; struct { std::unordered_map Worlds; std::unordered_map Portals; std::unordered_map Entityes; } Data; virtual ~IServerSession(); virtual void atFreeDrawTime(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(); }; }