summaryrefslogtreecommitdiffstats
path: root/game/shared/world/voxel.hh
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/world/voxel.hh')
-rw-r--r--game/shared/world/voxel.hh286
1 files changed, 0 insertions, 286 deletions
diff --git a/game/shared/world/voxel.hh b/game/shared/world/voxel.hh
deleted file mode 100644
index 6013962..0000000
--- a/game/shared/world/voxel.hh
+++ /dev/null
@@ -1,286 +0,0 @@
-#pragma once
-
-#include "core/math/aabb.hh"
-
-#include "shared/types.hh"
-
-namespace world
-{
-class Dimension;
-} // namespace world
-
-namespace world
-{
-enum VoxelRender : unsigned int {
- VRENDER_NONE = 0U, ///< The voxel is not rendered at all
- VRENDER_OPAQUE, ///< The voxel is fully opaque
- VRENDER_BLEND, ///< The voxel is blended (e.g. water, glass)
-};
-
-enum VoxelShape : unsigned int {
- VSHAPE_CUBE = 0U, ///< Full cube shape
- VSHAPE_CROSS, ///< TODO: Cross shape
- VSHAPE_MODEL, ///< TODO: Custom model shape
-};
-
-enum VoxelFace : unsigned int {
- VFACE_NORTH = 0U, ///< Positive Z face
- VFACE_SOUTH, ///< Negative Z face
- VFACE_EAST, ///< Positive X face
- VFACE_WEST, ///< Negative X face
- VFACE_TOP, ///< Positive Y face
- VFACE_BOTTOM, ///< Negative Y face
- VFACE_CROSS_NWSE, ///< Diagonal cross face northwest-southeast
- VFACE_CROSS_NESW, ///< Diagonal cross face northeast-southwest
- VFACE_COUNT
-};
-
-enum VoxelTouch : unsigned int {
- VTOUCH_NONE = 0xFFFFU,
- VTOUCH_SOLID = 0U, ///< The entity is stopped in its tracks
- VTOUCH_BOUNCE, ///< The entity bounces back with some energy loss
- VTOUCH_SINK, ///< The entity phases/sinks through the voxel
-};
-
-enum VoxelMaterial : unsigned int {
- VMAT_UNKNOWN = 0xFFFFU,
- VMAT_DEFAULT = 0U,
- VMAT_STONE,
- VMAT_DIRT,
- VMAT_GLASS,
- VMAT_GRASS,
- VMAT_GRAVEL,
- VMAT_METAL,
- VMAT_SAND,
- VMAT_WOOD,
- VMAT_SLOSH,
- VMAT_COUNT
-};
-
-enum VoxelVisBits : unsigned int {
- VVIS_NORTH = 1U << VFACE_NORTH, ///< Positive Z
- VVIS_SOUTH = 1U << VFACE_SOUTH, ///< Negative Z
- VVIS_EAST = 1U << VFACE_EAST, ///< Positive X
- VVIS_WEST = 1U << VFACE_WEST, ///< Negative X
- VVIS_UP = 1U << VFACE_TOP, ///< Positive Y
- VVIS_DOWN = 1U << VFACE_BOTTOM, ///< Negative Y
-};
-} // namespace world
-
-namespace world
-{
-using VoxelOnPlaceFunc = std::function<void(Dimension*, const voxel_pos&)>;
-using VoxelOnRemoveFunc = std::function<void(Dimension*, const voxel_pos&)>;
-using VoxelOnTickFunc = std::function<void(Dimension*, const voxel_pos&)>;
-} // namespace world
-
-namespace world
-{
-class Voxel {
-public:
- Voxel(void) = default;
- explicit Voxel(const Voxel& source, voxel_id id) noexcept;
-
- void on_place(Dimension* dimension, const voxel_pos& vpos) const;
- void on_remove(Dimension* dimension, const voxel_pos& vpos) const;
- void on_tick(Dimension* dimension, const voxel_pos& vpos) const;
-
- constexpr std::string_view get_name(void) const noexcept;
- constexpr voxel_id get_id(void) const noexcept;
-
- constexpr VoxelRender get_render_mode(void) const noexcept;
- constexpr VoxelShape get_shape(void) const noexcept;
- constexpr bool is_animated(void) const noexcept;
-
- constexpr VoxelTouch get_touch_type(void) const noexcept;
- constexpr const glm::fvec3& get_touch_values(void) const noexcept;
- constexpr VoxelMaterial get_surface_material(void) const noexcept;
-
- constexpr const math::AABBf& get_collision(void) const noexcept;
-
- constexpr const std::vector<std::string>& get_default_textures(void) const noexcept;
- constexpr const std::vector<std::string>& get_face_textures(VoxelFace face) const noexcept;
- constexpr std::size_t get_cached_face_offset(VoxelFace face) const noexcept;
- constexpr std::size_t get_cached_face_plane(VoxelFace face) const noexcept;
-
- template<VoxelRender RenderMode>
- constexpr bool is_render_mode(void) const noexcept;
- template<VoxelShape Shape>
- constexpr bool is_shape(void) const noexcept;
- template<VoxelTouch TouchType>
- constexpr bool is_touch_type(void) const noexcept;
- template<VoxelMaterial Material>
- constexpr bool is_surface_material(void) const noexcept;
-
- /// Non-model voxel shapes support texture variation based on the
- /// voxel position on the world; this method handles the math behind this
- /// @param face The face of the voxel to get the texture index for
- /// @param vpos The absolute voxel position to get the texture index for
- /// @return The index of the texture to use for the given face at the given position
- /// @remarks On client-side: plane[get_cached_face_plane][get_cached_face_offset + thisFunctionResult]
- std::size_t get_random_texture_index(VoxelFace face, const voxel_pos& vpos) const;
-
- /// Assign cached plane index and plane offset for a given face
- /// @param face The face to assign the cache for
- /// @param offset The offset to assign to the face
- /// @param plane The plane index to assign to the face
- void set_face_cache(VoxelFace face, std::size_t offset, std::size_t plane);
-
- /// Calculate a checksum for the voxel's properties
- /// @param combine An optional initial checksum to combine with
- /// @return The calculated checksum
- std::uint64_t get_checksum(std::uint64_t combine = 0U) const;
-
-protected:
- std::string m_name;
- voxel_id m_id { NULL_VOXEL_ID };
-
- VoxelRender m_render_mode { VRENDER_OPAQUE };
- VoxelShape m_shape { VSHAPE_CUBE };
- bool m_animated { false };
-
- VoxelTouch m_touch_type { VTOUCH_SOLID };
- glm::fvec3 m_touch_values { 0.0f };
- VoxelMaterial m_surface_material { VMAT_DEFAULT };
-
- math::AABBf m_collision { { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f } };
-
- std::vector<std::string> m_default_textures;
- std::array<std::vector<std::string>, VFACE_COUNT> m_face_textures;
- std::array<std::size_t, VFACE_COUNT> m_cached_face_offsets;
- std::array<std::size_t, VFACE_COUNT> m_cached_face_planes;
-
- VoxelOnPlaceFunc m_on_place;
- VoxelOnRemoveFunc m_on_remove;
- VoxelOnTickFunc m_on_tick;
-};
-} // namespace world
-
-namespace world
-{
-class VoxelBuilder final : public Voxel {
-public:
- VoxelBuilder(void) = default;
- explicit VoxelBuilder(std::string_view name);
-
- void set_on_place(VoxelOnPlaceFunc func) noexcept;
- void set_on_remove(VoxelOnRemoveFunc func) noexcept;
- void set_on_tick(VoxelOnTickFunc func) noexcept;
-
- void set_name(std::string_view name) noexcept;
-
- void set_render_mode(VoxelRender mode) noexcept;
- void set_shape(VoxelShape shape) noexcept;
- void set_animated(bool animated) noexcept;
-
- void set_touch_type(VoxelTouch type) noexcept;
- void set_touch_values(const glm::fvec3& values) noexcept;
- void set_surface_material(VoxelMaterial material) noexcept;
-
- void set_collision(const math::AABBf& box) noexcept;
-
- void add_default_texture(std::string_view path);
- void add_face_texture(VoxelFace face, std::string_view path);
-
- std::unique_ptr<Voxel> build(voxel_id id) const;
-};
-} // namespace world
-
-constexpr std::string_view world::Voxel::get_name(void) const noexcept
-{
- return m_name;
-}
-
-constexpr voxel_id world::Voxel::get_id(void) const noexcept
-{
- return m_id;
-}
-
-constexpr world::VoxelRender world::Voxel::get_render_mode(void) const noexcept
-{
- return m_render_mode;
-}
-
-constexpr world::VoxelShape world::Voxel::get_shape(void) const noexcept
-{
- return m_shape;
-}
-
-constexpr bool world::Voxel::is_animated(void) const noexcept
-{
- return m_animated;
-}
-
-constexpr world::VoxelTouch world::Voxel::get_touch_type(void) const noexcept
-{
- return m_touch_type;
-}
-
-constexpr const glm::fvec3& world::Voxel::get_touch_values(void) const noexcept
-{
- return m_touch_values;
-}
-
-constexpr world::VoxelMaterial world::Voxel::get_surface_material(void) const noexcept
-{
- return m_surface_material;
-}
-
-constexpr const math::AABBf& world::Voxel::get_collision(void) const noexcept
-{
- return m_collision;
-}
-
-constexpr const std::vector<std::string>& world::Voxel::get_default_textures(void) const noexcept
-{
- return m_default_textures;
-}
-
-constexpr const std::vector<std::string>& world::Voxel::get_face_textures(VoxelFace face) const noexcept
-{
- assert(face <= m_face_textures.size());
-
- if(m_face_textures[face].empty()) {
- return m_default_textures;
- }
-
- return m_face_textures[face];
-}
-
-constexpr std::size_t world::Voxel::get_cached_face_offset(VoxelFace face) const noexcept
-{
- assert(face <= m_cached_face_offsets.size());
-
- return m_cached_face_offsets[face];
-}
-
-constexpr std::size_t world::Voxel::get_cached_face_plane(VoxelFace face) const noexcept
-{
- assert(face <= m_cached_face_planes.size());
-
- return m_cached_face_planes[face];
-}
-
-template<world::VoxelRender RenderMode>
-constexpr bool world::Voxel::is_render_mode(void) const noexcept
-{
- return m_render_mode == RenderMode;
-}
-
-template<world::VoxelShape Shape>
-constexpr bool world::Voxel::is_shape(void) const noexcept
-{
- return m_shape == Shape;
-}
-
-template<world::VoxelTouch TouchType>
-constexpr bool world::Voxel::is_touch_type(void) const noexcept
-{
- return m_touch_type == TouchType;
-}
-
-template<world::VoxelMaterial Material>
-constexpr bool world::Voxel::is_surface_material(void) const noexcept
-{
- return m_surface_material == Material;
-}