HPC_Voxel_Engine 0.2.0
High-Performance C++ Voxel Engine
Loading...
Searching...
No Matches
Chunk.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <FastNoiseLite.h>
9#include <immintrin.h>
10#include <cstdint>
11#include <cstring>
12#include <memory>
13#include <vector>
14
15#include "../core/MathUtils.h"
16#include "../physics/AABB.h"
17#include "../renderer/Buffer.h"
18#include "../renderer/IndexBuffer.h"
19#include "../renderer/ThermalVolume.h"
20#include "../renderer/VertexArray.h"
21
22constexpr int CHUNK_SIZE = 16;
23constexpr int CHUNK_HEIGHT = 16;
25
26constexpr int PADDED_CHUNK_SIZE = CHUNK_SIZE + 2;
29
31enum Direction { NORTH = 0, SOUTH, EAST, WEST, ABOVE, BELOW }; // Z+, Z-, X+, X-, Y+, Y-
32enum BlockType { AIR = 0, GRASS = 1, DIRT = 2, STONE = 3 };
33
39class Chunk {
40public:
41 Chunk() = delete;
42 Chunk(int iX, int iZ);
43 ~Chunk();
44
45 Chunk(const Chunk&) = delete;
46 Chunk& operator=(const Chunk&) = delete;
47
48 Chunk(Chunk&& other) noexcept;
49 Chunk& operator=(Chunk&& other) noexcept;
50
51 [[nodiscard]] int GetChunkX() const { return m_iChunkX; }
52 [[nodiscard]] int GetChunkZ() const { return m_iChunkZ; }
53
54 [[nodiscard]] bool IsValid() const { return m_pVAO != nullptr; }
55 const uint8_t* GetBlockData() const { return m_iBlocks; }
56
57 // --- Core Logic ---
58
62 AABB GetAABB() const;
63
64 void Render() const;
65
66 void SetNeighbours(Direction iDir, Chunk* pChunk) { m_pNeighbours[iDir] = pChunk; }
67
68 // --- Block Manipulation ---
69
70 [[nodiscard]] inline int GetFlatIndexOf3DLayer(int iX, int iY, int iZ) const {
71 if (iX < 0 || iX >= CHUNK_SIZE || iY < 0 || iY >= CHUNK_HEIGHT || iZ < 0 ||
72 iZ >= CHUNK_SIZE) {
73 return -1;
74 }
75
76 return iX + (iY * CHUNK_SIZE) + (iZ * CHUNK_SIZE * CHUNK_HEIGHT);
77 }
78
79 [[nodiscard]] inline int GetPaddedIndexOf3DLayer(int iX, int iY, int iZ) const {
80 if (iX < -1 || iX >= CHUNK_SIZE + 1 || iY < -1 || iY >= CHUNK_HEIGHT + 1 || iZ < -1 ||
81 iZ >= CHUNK_SIZE + 1) {
82 return -1;
83 }
84 // +1 for padding buffer of neighbour data
85 return (iX + 1) + ((iY + 1) * PADDED_CHUNK_SIZE) +
87 }
88
89 // --- Block Manipulation for SIMD ---
90
91 [[nodiscard]] inline __m256i GetFlatIndexOf3DLayer_AVX2(__m256i vecX,
92 __m256i vecY,
93 __m256i vecZ) const {
94 __m256i vecChunkSize = _mm256_set1_epi32(CHUNK_SIZE);
95 __m256i vecChunkSizeHeight = _mm256_set1_epi32(CHUNK_SIZE * CHUNK_HEIGHT);
96
97 __m256i vecIndex =
98 _mm256_add_epi32(_mm256_add_epi32(vecX, _mm256_mullo_epi32(vecY, vecChunkSize)),
99 _mm256_mullo_epi32(vecZ, vecChunkSizeHeight));
100
101 return vecIndex;
102 }
103
107 uint8_t GetBlockAt(int iX, int iY, int iZ) const {
108 // Quick check for internal blocks
109 if (iX >= 0 && iX < CHUNK_SIZE && iY >= 0 && iY < CHUNK_HEIGHT && iZ >= 0 &&
110 iZ < CHUNK_SIZE) {
111 return m_iBlocks[iX + (iY * CHUNK_SIZE) + (iZ * CHUNK_SIZE * CHUNK_HEIGHT)];
112 }
113
114 // Boundary checks (Neighbor querying)
115 if (iX < 0)
118 : 0;
119 if (iX >= CHUNK_SIZE)
122 : 0;
123
124 if (iY < 0)
127 : 0;
128 if (iY >= CHUNK_HEIGHT)
131 : 0;
132
133 if (iZ < 0)
136 : 0;
137 if (iZ >= CHUNK_SIZE)
140 : 0;
141
142 return 0; // Default to Air
143 }
144
145 void SetBlockAt(int iX, int iY, int iZ, uint8_t uiBlockType);
146
147 void SetBlockData(const uint8_t* iBlocks) {
148 if (iBlocks)
149 std::memcpy(m_iBlocks, iBlocks, CHUNK_VOL * sizeof(uint8_t));
150 }
151
152 float GetTemperatureAt(int iX, int iY, int iZ) const;
153
154 void ReconstructMesh(bool bEnableNeighborCulling = false);
155 void UploadMesh();
157 void InjectHeat(int iX, int iY, int iZ, float fTemp) {
158 int iIndex = GetPaddedIndexOf3DLayer(iX, iY, iZ);
159 if (iIndex != -1) {
160 m_pfCurrFrameData[iIndex] = fTemp;
161 }
162 }
163 void ThermalStep(float fThermalDiffusivity, float fDeltaTime);
164 void ThermalStep_AVX2(float fThermalDiffusivity, float fDeltaTime);
165
166 float* GetCurrData() const { return m_pfCurrFrameData; }
168 void Bind(int iVal) {
169 if (m_pThermalTex)
170 m_pThermalTex->Bind(iVal);
171 }
172
173 void GetMeshStats(size_t& uiOutVertCount, size_t& uiOutTriCount) const {
174 uiOutVertCount = m_uiVertexCount;
175 uiOutTriCount = m_uiTriangleCount;
176 }
177
178private:
179 std::vector<float> m_vec_fVertices;
180 std::vector<unsigned int> m_vec_uiIndices;
181 size_t m_uiVertexCount = 0;
186
187 Chunk* m_pNeighbours[6] = {nullptr};
188
189 float* m_pfCurrFrameData = nullptr;
190 float* m_pfNextFrameData = nullptr;
191 std::unique_ptr<Renderer::ThermalVolume> m_pThermalTex;
192
193 // Per-chunk noise instance (Consider moving to a global generator for efficiency)
194 FastNoiseLite noise{};
196 int m_iChunkX = 0, m_iChunkZ = 0;
197 uint8_t m_iBlocks[CHUNK_VOL]{0};
198 bool m_bVonNeumannBC = true;
199
200 void updateHeightData();
201 void updateBuffers();
202 void addBlockFace(int iX, int iY, int iZ, FaceDirection iDir, int iBlockType);
203};
Direction
Definition Chunk.h:31
@ BELOW
Definition Chunk.h:31
@ SOUTH
Definition Chunk.h:31
@ ABOVE
Definition Chunk.h:31
@ EAST
Definition Chunk.h:31
@ NORTH
Definition Chunk.h:31
@ WEST
Definition Chunk.h:31
FaceDirection
Definition Chunk.h:30
@ FRONT
Definition Chunk.h:30
@ DOWN
Definition Chunk.h:30
@ UP
Definition Chunk.h:30
@ BACK
Definition Chunk.h:30
@ LEFT
Definition Chunk.h:30
@ RIGHT
Definition Chunk.h:30
BlockType
Definition Chunk.h:32
@ STONE
Definition Chunk.h:32
@ AIR
Definition Chunk.h:32
@ DIRT
Definition Chunk.h:32
@ GRASS
Definition Chunk.h:32
constexpr int PADDED_CHUNK_HEIGHT
Definition Chunk.h:27
constexpr int CHUNK_VOL
Definition Chunk.h:24
constexpr int PADDED_CHUNK_SIZE
Definition Chunk.h:26
constexpr int PADDED_CHUNK_VOL
Definition Chunk.h:28
constexpr int CHUNK_HEIGHT
Definition Chunk.h:23
constexpr int CHUNK_SIZE
Definition Chunk.h:22
Axis-Aligned Bounding Box for collision detection. Defined by a Minimum and Maximum point in 3D space...
Definition AABB.h:12
Manages voxel block data, procedural mesh generation, and memory-aligned thermal diffusion buffers.
Definition Chunk.h:39
void InjectHeat(int iX, int iY, int iZ, float fTemp)
Definition Chunk.h:157
void Bind(int iVal)
Definition Chunk.h:168
void ThermalStep_AVX2(float fThermalDiffusivity, float fDeltaTime)
Definition Chunk.cpp:453
int m_iHeightData[CHUNK_SIZE][CHUNK_SIZE]
Definition Chunk.h:195
FastNoiseLite noise
Definition Chunk.h:194
void GetMeshStats(size_t &uiOutVertCount, size_t &uiOutTriCount) const
Definition Chunk.h:173
void Render() const
Definition Chunk.cpp:382
int GetFlatIndexOf3DLayer(int iX, int iY, int iZ) const
Definition Chunk.h:70
Renderer::VertexArray * m_pVAO
Definition Chunk.h:183
int GetChunkX() const
Definition Chunk.h:51
float * m_pfCurrFrameData
Definition Chunk.h:189
void SwapBuffers()
Definition Chunk.h:156
bool IsValid() const
Definition Chunk.h:54
void ThermalStep(float fThermalDiffusivity, float fDeltaTime)
Definition Chunk.cpp:434
void UploadMesh()
Definition Chunk.cpp:371
std::vector< unsigned int > m_vec_uiIndices
Definition Chunk.h:180
Chunk(const Chunk &)=delete
const uint8_t * GetBlockData() const
Definition Chunk.h:55
uint8_t m_iBlocks[CHUNK_VOL]
Definition Chunk.h:197
size_t m_uiVertexCount
Definition Chunk.h:181
float GetTemperatureAt(int iX, int iY, int iZ) const
Definition Chunk.cpp:390
std::unique_ptr< Renderer::ThermalVolume > m_pThermalTex
Definition Chunk.h:191
int m_iChunkX
Definition Chunk.h:196
Chunk()=delete
__m256i GetFlatIndexOf3DLayer_AVX2(__m256i vecX, __m256i vecY, __m256i vecZ) const
Definition Chunk.h:91
void SetBlockAt(int iX, int iY, int iZ, uint8_t uiBlockType)
Definition Chunk.cpp:148
bool m_bVonNeumannBC
Definition Chunk.h:198
Chunk & operator=(const Chunk &)=delete
void SetBlockData(const uint8_t *iBlocks)
Definition Chunk.h:147
std::vector< float > m_vec_fVertices
Definition Chunk.h:179
uint8_t GetBlockAt(int iX, int iY, int iZ) const
Gets a block ID. Handles boundary checks by querying neighbors.
Definition Chunk.h:107
int GetPaddedIndexOf3DLayer(int iX, int iY, int iZ) const
Definition Chunk.h:79
void SetNeighbours(Direction iDir, Chunk *pChunk)
Definition Chunk.h:66
void UpdateThermalTexture()
Definition Chunk.cpp:520
void ReconstructMesh(bool bEnableNeighborCulling=false)
Definition Chunk.cpp:224
Chunk * m_pNeighbours[6]
Definition Chunk.h:187
~Chunk()
Definition Chunk.cpp:34
void updateHeightData()
Definition Chunk.cpp:156
int m_iChunkZ
Definition Chunk.h:196
Renderer::IndexBuffer * m_pIBO
Definition Chunk.h:185
Renderer::VertexBuffer * m_pVBO
Definition Chunk.h:184
float * GetCurrData() const
Definition Chunk.h:166
AABB GetAABB() const
Generates the AABB for the entire chunk based on max height.
Definition Chunk.cpp:125
size_t m_uiTriangleCount
Definition Chunk.h:182
void updateBuffers()
Definition Chunk.cpp:189
float * m_pfNextFrameData
Definition Chunk.h:190
void addBlockFace(int iX, int iY, int iZ, FaceDirection iDir, int iBlockType)
Definition Chunk.cpp:268
int GetChunkZ() const
Definition Chunk.h:52
Definition IndexBuffer.h:6
Wrapper for OpenGL VAO (Vertex Array Object). Stores the configuration of vertex attributes (layout) ...
Definition VertexArray.h:13
Wrapper for OpenGL VBO (Vertex Buffer Object). Stores raw vertex data (positions, colors,...
Definition Buffer.h:11