Files
LuaVox/Src/Client/Abstract.hpp
2025-07-07 18:42:52 +06:00

199 lines
5.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <cstdint>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <Common/Abstract.hpp>
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<VoxelCube> Voxels;
// Ноды
Node Nodes[16][16][16];
// Ограничения прохождения света, идущего от солнца (от верха карты до верхней плоскости чанка)
// 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<std::string, float> Tags;
// m_attached_particle_spawners
// states
};
/* Интерфейс рендера текущего подключения к серверу */
class IRenderSession {
public:
// Подгрузка двоичных ресурсов
virtual void onBinaryResourceAdd(std::unordered_map<EnumBinResource, std::unordered_map<ResourceId_t, BinaryResource>>) = 0;
virtual void onBinaryResourceLost(std::unordered_map<EnumBinResource, std::vector<ResourceId_t>>) = 0;
virtual void onContentDefinesAdd(std::unordered_map<EnumDefContent, std::unordered_map<ResourceId_t, std::u8string>>) = 0;
virtual void onContentDefinesLost(std::unordered_map<EnumDefContent, std::vector<ResourceId_t>>) = 0;
// Сообщаем об изменившихся чанках
virtual void onChunksChange(WorldId_t worldId, const std::unordered_set<Pos::GlobalChunk> &changeOrAddList, const std::unordered_set<Pos::GlobalRegion> &remove) = 0;
// Установить позицию для камеры
virtual void setCameraPos(WorldId_t worldId, Pos::Object pos, glm::quat quat) = 0;
virtual ~IRenderSession();
};
struct Region {
Chunk Chunks[4][4][4];
};
struct World {
};
struct DefVoxelInfo {
};
struct DefNodeInfo {
};
struct DefWorldInfo {
};
struct DefPortalInfo {
};
struct DefEntityInfo {
};
struct DefFuncEntityInfo {
};
struct WorldInfo {
std::vector<EntityId_t> Entitys;
std::vector<FuncEntityId_t> FuncEntitys;
std::unordered_map<Pos::GlobalRegion, Region> Regions;
};
struct VoxelInfo {
};
struct NodeInfo {
};
struct PortalInfo {
};
struct EntityInfo {
};
struct FuncEntityInfo {
};
struct DefItemInfo {
};
/* Интерфейс обработчика сессии с сервером */
class IServerSession {
public:
struct {
std::unordered_map<DefVoxelId_t, DefVoxelInfo> DefVoxel;
std::unordered_map<DefNodeId_t, DefNodeInfo> DefNode;
std::unordered_map<DefWorldId_t, DefWorldInfo> DefWorld;
std::unordered_map<DefPortalId_t, DefPortalInfo> DefPortal;
std::unordered_map<DefEntityId_t, DefEntityInfo> DefEntity;
std::unordered_map<DefItemId_t, DefItemInfo> DefItem;
} Registry;
struct {
std::unordered_map<WorldId_t, WorldInfo> Worlds;
std::unordered_map<PortalId_t, PortalInfo> Portals;
std::unordered_map<EntityId_t, EntityInfo> 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, Middle, Right, 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();
};
}