Polyphase Game Engine
Loading...
Searching...
No Matches
Voxel3d.h
Go to the documentation of this file.
1#pragma once
2
3#include "Nodes/3D/Mesh3d.h"
4#include "Vertex.h"
5#include <array>
6
7// Forward-declare PolyVox types so this header compiles on platforms that
8// don't ship PolyVox headers (GX, C3D). The full includes live in Voxel3d.cpp.
9namespace PolyVox { template<typename VoxelType> class RawVolume; }
10
11class btTriangleIndexVertexArray;
12class btBvhTriangleMeshShape;
13struct btTriangleInfoMap;
14class Camera3D;
15
16// Voxel type: 0 = air (empty), 1-255 = solid material IDs
17using VoxelType = uint8_t;
18
19// Face direction for per-face textures
20enum class VoxelFace : uint8_t
21{
22 Top = 0, // +Y
23 Bottom, // -Y
24 Side, // +X, -X, +Z, -Z
25 Count
26};
27
28// Per-material texture configuration for atlas-based texturing
30{
31 int32_t mAtlasTile[3] = {0, 0, 0}; // [Top, Bottom, Side] tile indices
32 glm::vec4 mTintColor = glm::vec4(1.0f); // Optional color multiplier
33 bool mUseTexture = false; // false = use vertex color (backward compat)
34};
35
37{
38 bool mHit = false;
39 glm::ivec3 mVoxel = { 0, 0, 0 };
40 glm::ivec3 mPrevVoxel = { -1, -1, -1 };
41 glm::vec3 mHitPosition = { 0.0f, 0.0f, 0.0f };
43};
44
46{
47 bool mValid = false;
48 glm::ivec3 mVoxel = { 0, 0, 0 };
49 glm::vec3 mWorldPosition = { 0.0f, 0.0f, 0.0f };
51};
52
54{
55 glm::ivec3 mCoord = { 0, 0, 0 };
56 glm::vec3 mWorldPosition = { 0.0f, 0.0f, 0.0f };
58};
59
61{
62public:
64
65 Voxel3D();
66 ~Voxel3D();
67
68 virtual const char* GetTypeName() const override;
69 virtual void GatherProperties(std::vector<Property>& outProps) override;
70
71 virtual void Create() override;
72 virtual void Destroy() override;
73 virtual void Copy(Node* srcNode, bool recurse) override;
74 Voxel3DResource* GetResource();
75
76 virtual void Tick(float deltaTime) override;
77 virtual void EditorTick(float deltaTime) override;
78
79 virtual void SaveStream(Stream& stream, Platform platform) override;
80 virtual void LoadStream(Stream& stream, Platform platform, uint32_t version) override;
81
82 virtual bool IsStaticMesh3D() const override;
83 virtual bool IsSkeletalMesh3D() const override;
84 virtual Material* GetMaterial() override;
85
86 virtual void Render() override;
87
88 // Voxel API
89 void SetVoxel(int32_t x, int32_t y, int32_t z, VoxelType value);
90 VoxelType GetVoxel(int32_t x, int32_t y, int32_t z) const;
91 void Fill(VoxelType value);
92 void FillRegion(int32_t x0, int32_t y0, int32_t z0,
93 int32_t x1, int32_t y1, int32_t z1, VoxelType value);
94 void FillSphere(const glm::vec3& worldCenter, float radius, VoxelType value);
95 void FillCylinder(const glm::vec3& worldCenter, float radius, float height, int32_t axis, VoxelType value);
96
97 // Shape queries (return voxels within geometry)
98 std::vector<VoxelInfo> GetVoxelsInSphere(const glm::vec3& worldCenter, float radius);
99 std::vector<VoxelInfo> GetVoxelsInBox(const glm::vec3& worldMin, const glm::vec3& worldMax);
100 std::vector<VoxelInfo> GetVoxelsInCylinder(const glm::vec3& worldCenter, float radius, float height, int32_t axis);
101 std::vector<VoxelInfo> GetVoxelNeighbors(int32_t x, int32_t y, int32_t z);
102
103 // Mesh control
104 void MarkDirty();
105 void RebuildMesh();
106 bool IsDirty() const { return mMeshDirty; }
107
108 // Coordinates
109 glm::vec3 GetVoxelWorldPosition(int32_t x, int32_t y, int32_t z);
110
111 // Ray testing (3D DDA traversal)
112 VoxelRayResult RayTest(const glm::vec3& rayOrigin, const glm::vec3& rayDir, float maxDistance = 100.0f);
113 VoxelRayResult RayTestScreen(Camera3D* camera, int32_t screenX, int32_t screenY, float maxDistance = 100.0f);
114 VoxelRayResult RayTestCenterCamera(Camera3D* camera, float maxDistance = 100.0f);
115
116 // Point query (no ray, just coordinate lookup)
117 VoxelPointResult GetVoxelAtWorldPosition(const glm::vec3& worldPos);
118
119 // Dimensions
120 glm::ivec3 GetDimensions() const { return mDimensions; }
121 void SetDimensions(glm::ivec3 dims);
122
123 // Atlas texturing API
124 void SetAtlasTexture(Texture* atlas, uint32_t tilesX = 16, uint32_t tilesY = 16);
125 Texture* GetAtlasTexture() const;
126 void SetAtlasEnabled(bool enabled);
127 bool IsAtlasEnabled() const { return mEnableAtlasTexturing; }
128
129 void SetMaterialTexture(VoxelType id, int32_t topTile, int32_t bottomTile, int32_t sideTile);
130 void SetMaterialTexture(VoxelType id, int32_t allFacesTile);
131 void SetMaterialTint(VoxelType id, const glm::vec4& tint);
132 void DisableMaterialTexture(VoxelType id);
133 const VoxelMaterialInfo& GetMaterialInfo(VoxelType id) const { return mMaterialTable[id]; }
134
135 virtual Bounds GetLocalBounds() const override;
136
137 uint32_t GetNumVertices() const { return mNumVertices; }
138 uint32_t GetNumIndices() const { return mNumIndices; }
139 const std::vector<VertexColor>& GetVertices() const { return mVertices; }
140 const std::vector<IndexType>& GetIndices() const { return mIndices; }
141 uint32_t mAtlasTilesX = 16;
142 uint32_t mAtlasTilesY = 16;
143
144protected:
145
146 static bool HandlePropChange(Datum* datum, uint32_t index, const void* newValue);
147
148 void TickCommon(float deltaTime);
149 void RebuildMeshInternal();
150 void UploadMeshData();
151 void UpdateBounds();
152 void RecreateCollisionShape();
153 void DestroyTriangleCollisionData();
154 void DecompressVoxelData();
155 glm::vec4 MaterialIdToColor(VoxelType materialId) const;
156
157 // Volume data
159 glm::ivec3 mDimensions = { 32, 32, 32 };
160
161 // Compressed voxel data (for serialization)
162 std::vector<uint8_t> mCompressedData;
163
164 // Generated mesh data (CPU side)
165 std::vector<VertexColor> mVertices;
166 std::vector<IndexType> mIndices;
167 uint32_t mNumVertices = 0;
168 uint32_t mNumIndices = 0;
169
170 // Dirty tracking
171 bool mMeshDirty = true;
172 bool mUploadDirty[MAX_FRAMES] = {};
173
174 // Bounds cache
176
177 // GPU resource
179
180 // Default material
182
183 // Triangle collision data (kept alive while shape is in use)
184 std::vector<glm::vec3> mCollisionVertices;
185 std::vector<int32_t> mCollisionIndices;
186 btTriangleIndexVertexArray* mTriangleIndexVertexArray = nullptr;
187 btTriangleInfoMap* mTriangleInfoMap = nullptr;
188
189 // Atlas texturing configuration
191 bool mEnableAtlasTexturing = false;
192 std::array<VoxelMaterialInfo, 256> mMaterialTable;
193};
Platform
Definition EngineTypes.h:31
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
uint8_t VoxelType
Definition Voxel3d.h:17
VoxelFace
Definition Voxel3d.h:21
Definition AssetRef.h:18
Definition Camera3d.h:12
Definition Datum.h:164
Definition Material.h:48
Definition Mesh3d.h:13
static bool HandlePropChange(Datum *datum, uint32_t index, const void *newValue)
Definition Mesh3d.cpp:12
virtual bool IsSkeletalMesh3D() const
Definition Mesh3d.cpp:132
virtual const char * GetTypeName() const override
Definition Mesh3d.cpp:39
virtual Material * GetMaterial()=0
virtual bool IsStaticMesh3D() const
Definition Mesh3d.cpp:127
virtual void GatherProperties(std::vector< Property > &outProps) override
Definition Mesh3d.cpp:44
virtual void LoadStream(Stream &stream, Platform platform, uint32_t version) override
Definition Mesh3d.cpp:77
virtual void SaveStream(Stream &stream, Platform platform) override
Definition Mesh3d.cpp:56
Definition Node.h:67
void TickCommon(float deltaTime)
Definition Node.cpp:573
virtual void EditorTick(float deltaTime)
Definition Node.cpp:563
virtual void Copy(Node *srcNode, bool recurse)
Definition Node.cpp:323
Definition Voxel3d.h:9
virtual void Destroy() override
Definition Primitive3d.cpp:129
virtual Bounds GetLocalBounds() const
Definition Primitive3d.cpp:829
virtual void Tick(float deltaTime) override
Definition Primitive3d.cpp:163
virtual void Render() override
Definition Primitive3d.cpp:259
virtual void Create() override
Definition Primitive3d.cpp:117
Definition Stream.h:21
Definition Texture.h:10
Definition Voxel3d.h:61
Voxel3DResource mResource
Definition Voxel3d.h:178
MaterialRef mDefaultMaterial
Definition Voxel3d.h:181
std::vector< int32_t > mCollisionIndices
Definition Voxel3d.h:185
const VoxelMaterialInfo & GetMaterialInfo(VoxelType id) const
Definition Voxel3d.h:133
glm::ivec3 GetDimensions() const
Definition Voxel3d.h:120
uint32_t GetNumVertices() const
Definition Voxel3d.h:137
std::vector< VertexColor > mVertices
Definition Voxel3d.h:165
std::array< VoxelMaterialInfo, 256 > mMaterialTable
Definition Voxel3d.h:192
std::vector< uint8_t > mCompressedData
Definition Voxel3d.h:162
TextureRef mAtlasTexture
Definition Voxel3d.h:190
std::vector< glm::vec3 > mCollisionVertices
Definition Voxel3d.h:184
const std::vector< VertexColor > & GetVertices() const
Definition Voxel3d.h:139
bool IsAtlasEnabled() const
Definition Voxel3d.h:127
std::vector< IndexType > mIndices
Definition Voxel3d.h:166
uint32_t GetNumIndices() const
Definition Voxel3d.h:138
bool IsDirty() const
Definition Voxel3d.h:106
const std::vector< IndexType > & GetIndices() const
Definition Voxel3d.h:140
Bounds mBounds
Definition Voxel3d.h:175
DECLARE_NODE(Voxel3D, Mesh3D)
Definition Voxel3d.h:9
Definition EngineTypes.h:193
Definition GraphicsTypes.h:226
Definition Voxel3d.h:54
VoxelType mValue
Definition Voxel3d.h:57
glm::vec3 mWorldPosition
Definition Voxel3d.h:56
glm::ivec3 mCoord
Definition Voxel3d.h:55
Definition Voxel3d.h:30
int32_t mAtlasTile[3]
Definition Voxel3d.h:31
bool mUseTexture
Definition Voxel3d.h:33
glm::vec4 mTintColor
Definition Voxel3d.h:32
Definition Voxel3d.h:46
glm::ivec3 mVoxel
Definition Voxel3d.h:48
VoxelType mValue
Definition Voxel3d.h:50
glm::vec3 mWorldPosition
Definition Voxel3d.h:49
bool mValid
Definition Voxel3d.h:47
Definition Voxel3d.h:37
VoxelType mValue
Definition Voxel3d.h:42
bool mHit
Definition Voxel3d.h:38
glm::vec3 mHitPosition
Definition Voxel3d.h:41
glm::ivec3 mVoxel
Definition Voxel3d.h:39
glm::ivec3 mPrevVoxel
Definition Voxel3d.h:40