// SPDX-License-Identifier: BSD-2-Clause // Copyright (c) 2025 Kirill Dmitrievich // File: dimension.hh // Description: A single world #ifndef SHARED_WORLD_DIMENSION_HH #define SHARED_WORLD_DIMENSION_HH #pragma once #include "shared/const.hh" #include "shared/types.hh" class ConfigMap; class Chunk; class Voxel; class VoxelStorage; using dimension_entropy_map = std::array; using dimension_height_map = std::array; class Dimension { public: explicit Dimension(std::string_view name, float gravity); virtual ~Dimension(void); std::string_view get_name(void) const; float get_gravity(void) const; public: Chunk* create_chunk(const chunk_pos& cpos); Chunk* find_chunk(entt::entity entity) const; Chunk* find_chunk(const chunk_pos& cpos) const; void remove_chunk(entt::entity entity); void remove_chunk(const chunk_pos& cpos); void remove_chunk(Chunk* chunk); public: const Voxel* get_voxel(const voxel_pos& vpos) const; const Voxel* get_voxel(const chunk_pos& cpos, const local_pos& lpos) const; bool set_voxel(const Voxel* voxel, const voxel_pos& vpos); bool set_voxel(const Voxel* voxel, const chunk_pos& cpos, const local_pos& lpos); public: virtual void init(ConfigMap& config); virtual void init_late(std::uint64_t global_seed); virtual bool generate(const chunk_pos& cpos, VoxelStorage& voxels); public: entt::registry chunks; entt::registry entities; private: std::string m_name; emhash8::HashMap m_chunkmap; float m_gravity; }; struct ChunkComponent final { chunk_pos cpos; Chunk* chunk; }; struct ChunkCreateEvent final { Dimension* dimension; chunk_pos cpos; Chunk* chunk; }; struct ChunkDestroyEvent final { Dimension* dimension; chunk_pos cpos; Chunk* chunk; }; struct ChunkUpdateEvent final { Dimension* dimension; chunk_pos cpos; Chunk* chunk; }; struct VoxelSetEvent final { Dimension* dimension; const Voxel* voxel; chunk_pos cpos; local_pos lpos; Chunk* chunk; }; #endif