@@ -18,7 +18,22 @@ namespace RealEngine {
1818 }
1919
2020 Chunk::Chunk (const glm::ivec3& chunkOffset)
21- : m_ChunkOffset(chunkOffset) { }
21+ : m_ChunkOffset(chunkOffset) {
22+ m_MeshData.opaqueMask = new uint64_t [CS_P2]{ 0 };
23+ m_MeshData.faceMasks = new uint64_t [CS_2 * 6 ]{ 0 };
24+ m_MeshData.forwardMerged = new uint8_t [CS_2]{ 0 };
25+ m_MeshData.rightMerged = new uint8_t [CS]{ 0 };
26+ m_MeshData.vertices = new std::vector<uint64_t >(10000 );
27+ m_MeshData.maxVertices = 10000 ;
28+ }
29+
30+ Chunk::~Chunk () {
31+ delete[] m_MeshData.opaqueMask ;
32+ delete[] m_MeshData.faceMasks ;
33+ delete[] m_MeshData.forwardMerged ;
34+ delete[] m_MeshData.rightMerged ;
35+ delete m_MeshData.vertices ;
36+ }
2237
2338 constexpr uint64_t P_MASK = ~(1ull << 63 | 1 );
2439
@@ -43,17 +58,9 @@ namespace RealEngine {
4358 return (type << 32 ) | (h << 24 ) | (w << 18 ) | (z << 12 ) | (y << 6 ) | x;
4459 }
4560
46- MeshData Chunk::Generate () {
61+ MeshData& Chunk::Reuse () {
4762 RE_PROFILE_FUNCTION ();
4863
49- MeshData meshData;
50- meshData.opaqueMask = new uint64_t [CS_P2]{ 0 };
51- meshData.faceMasks = new uint64_t [CS_2 * 6 ]{ 0 };
52- meshData.forwardMerged = new uint8_t [CS_2]{ 0 };
53- meshData.rightMerged = new uint8_t [CS]{ 0 };
54- meshData.vertices = new std::vector<uint64_t >(10000 );
55- meshData.maxVertices = 10000 ;
56-
5764 // for (uint16_t y = 0; y < CS; y++) {
5865 // for (uint8_t x = 0; x < CS; x++) {
5966 // for (uint8_t z = 0; z < CS; z++) {
@@ -78,34 +85,34 @@ namespace RealEngine {
7885 for (int z = 1 ; z < CS_P; z++) {
7986 if (x % 2 == 0 && y % 2 == 0 && z % 2 == 0 ) {
8087 m_Blocks[z + (x * CS_P) + (y * CS_P2)] = 1 ;
81- meshData .opaqueMask [(y * CS_P) + x] |= 1ull << z;
88+ m_MeshData .opaqueMask [(y * CS_P) + x] |= 1ull << z;
8289
8390 m_Blocks[z + (x * CS_P) + (y * CS_P2)] = 2 ;
84- meshData .opaqueMask [((y - 1 ) * CS_P) + (x - 1 )] |= 1ull << z;
91+ m_MeshData .opaqueMask [((y - 1 ) * CS_P) + (x - 1 )] |= 1ull << z;
8592
8693 m_Blocks[z + (x * CS_P) + (y * CS_P2)] = 3 ;
87- meshData .opaqueMask [(y * CS_P) + (x - 1 )] |= 1ull << (z - 1 );
94+ m_MeshData .opaqueMask [(y * CS_P) + (x - 1 )] |= 1ull << (z - 1 );
8895
8996 m_Blocks[z + (x * CS_P) + (y * CS_P2)] = 4 ;
90- meshData .opaqueMask [((y - 1 ) * CS_P) + x] |= 1ull << (z - 1 );
97+ m_MeshData .opaqueMask [((y - 1 ) * CS_P) + x] |= 1ull << (z - 1 );
9198 }
9299 }
93100 }
94101 }
95102
96- GenerateMesh (meshData );
97- return meshData ;
103+ GenerateMesh ();
104+ return m_MeshData ;
98105 }
99106
100- void Chunk::GenerateMesh (MeshData& meshData ) {
107+ void Chunk::GenerateMesh () {
101108 RE_PROFILE_FUNCTION ();
102109
103- meshData .vertexCount = 0 ;
110+ m_MeshData .vertexCount = 0 ;
104111 int vertexI = 0 ;
105112
106- uint64_t * opaqueMask = meshData .opaqueMask ;
107- uint64_t * faceMasks = meshData .faceMasks ;
108- uint8_t * forwardMerged = meshData .forwardMerged ;
113+ uint64_t * opaqueMask = m_MeshData .opaqueMask ;
114+ uint64_t * faceMasks = m_MeshData .faceMasks ;
115+ uint8_t * forwardMerged = m_MeshData .forwardMerged ;
109116
110117 // Hidden face culling
111118 for (int a = 1 ; a < CS_P - 1 ; a++) {
@@ -192,17 +199,17 @@ namespace RealEngine {
192199 break ;
193200 }
194201
195- insertQuad (*meshData .vertices , quad, vertexI, meshData .maxVertices );
202+ insertQuad (*m_MeshData .vertices , quad, vertexI, m_MeshData .maxVertices );
196203 }
197204 }
198205 }
199206
200207 const int faceVertexLength = vertexI - faceVertexBegin;
201- meshData .faceVertexBegin [face] = faceVertexBegin;
202- meshData .faceVertexLength [face] = faceVertexLength;
208+ m_MeshData .faceVertexBegin [face] = faceVertexBegin;
209+ m_MeshData .faceVertexLength [face] = faceVertexLength;
203210 }
204211
205- uint8_t * rightMerged = meshData .rightMerged ;
212+ uint8_t * rightMerged = m_MeshData .rightMerged ;
206213
207214 // Greedy meshing faces 4-5
208215 for (uint8_t face = 4 ; face < 6 ; face++) {
@@ -259,16 +266,16 @@ namespace RealEngine {
259266
260267 const uint64_t quad = getQuad (meshLeft + (face == 4 ? meshWidth : 0 ), meshFront, meshUp, meshWidth, meshLength, type);
261268
262- insertQuad (*meshData .vertices , quad, vertexI, meshData .maxVertices );
269+ insertQuad (*m_MeshData .vertices , quad, vertexI, m_MeshData .maxVertices );
263270 }
264271 }
265272 }
266273
267274 const int faceVertexLength = vertexI - faceVertexBegin;
268- meshData .faceVertexBegin [face] = faceVertexBegin;
269- meshData .faceVertexLength [face] = faceVertexLength;
275+ m_MeshData .faceVertexBegin [face] = faceVertexBegin;
276+ m_MeshData .faceVertexLength [face] = faceVertexLength;
270277 }
271278
272- meshData .vertexCount = vertexI + 1 ;
279+ m_MeshData .vertexCount = vertexI + 1 ;
273280 }
274281}
0 commit comments