VoxelEngine
 
Loading...
Searching...
No Matches
Chunk.h
1#pragma once
2
3#include <glm/glm.hpp>
4#include <iostream>
5
6#include "../hash.h"
7#include "ChunkID.h"
8
9#include "LayerBuffer.h"
10#include "block/Block.h"
11#include "block/BlockState.h"
12#include "block/VariantBlock.h"
13#include "block/Vertex.h"
14#include "data/IChunkData.h"
15#include "render/Renderable.h"
16
17
18#include <LWGL/buffer/Attributes.h>
19
20
21namespace gl {
22 class ShaderPipeline;
23}
24
25namespace engine {
26
27 class Block;
28 class VariantBlock;
29 class MultiBlock;
30
31 class World;
32 class Engine;
33 struct RenderContext;
34
35
36 class Chunk : public Renderable,
37 public ISerializable {
38 public:
39 static inline glm::ivec3 Dims{16, 16, 16};
40
41 Chunk(World* world, ChunkID coords, std::unique_ptr<IChunkData> data);
42 Chunk(Chunk&) = delete;
43 Chunk(Chunk&&) = delete;
44 ~Chunk();
45
47 const ChunkID& id() const { return m_coords; }
49 glm::ivec3 position() const { return m_coords * m_data->dims; }
50
54 virtual glm::ivec3 dims() const { return m_data->dims; }
55
56 World* world() const { return m_world; }
57
58 template <typename T>
59 T* worldAs() const { // The user knows what world the chunk belongs to, thus static_cast
60 return static_cast<T*>(m_world);
61 }
62
65 bool generated() const { return m_generated; }
66
70 bool generateMesh();
71
72
73 const Block* getBlock(glm::ivec3 pos, BlockState** state = nullptr);
74 void setBlock(const glm::ivec3& pos, BlockID block);
75 void setBlock(const glm::ivec3& pos, BlockID block, BlockState state);
76 void setBlock(const glm::ivec3& pos, MultiBlock&& multiBlock);
77
78
80 IChunkData* data() { return m_data.get(); }
82 const IChunkData* data() const { return m_data.get(); }
83
84
87 void render(Engine& engine, const Camera* camera, int pass) override;
88
89 VariantBlock::Neighbours getNeighbouringBlocks(glm::ivec3 pos) const;
90
92 // TODO probably remove this
93 virtual void afterGenerated() {}
94
95
96 void serialize(std::ostream& out) const override;
97 void deserialize(std::istream& in) override;
98
99
100 protected:
101 World* m_world;
102 ChunkID m_coords;
103 std::unique_ptr<IChunkData> m_data;
104 bool m_dirty = false;
105
107 glm::vec3 axis;
108 float angle;
109 };
110
112 const Block* block;
113 const Geometry* geometry;
114 GeometryState geometryState;
115 gl::Attributes<Vertex>& storage;
116 glm::ivec3 posInChunk;
117 glm::ivec3 worldPos;
118 };
119
120 GeometryState calculateGeometryState(const Block* block, const BlockState* state) const;
121 void generateMeshForGeometry(const MeshGenContext& ctx);
122
123 void generateMeshForBlock(
124 const Block* block,
125 glm::ivec3 pos,
126 const BlockState* state,
127 const glm::ivec3& chunkBlockCoords
128 );
129 void generateMeshForBlock(
130 const VariantBlock* block,
131 glm::ivec3 pos,
132 const BlockState* state,
133 const glm::ivec3& chunkBlockCoords
134 );
135 void generateMeshForBlock(
136 const MultiBlock* block,
137 glm::ivec3 pos,
138 const BlockState* state,
139 const glm::ivec3& chunkBlockCoords
140 );
141
142 private:
143 std::array<LayerBuffer, 3> m_renderLayers;
144
145 bool m_generated = false;
146 std::atomic_bool m_generatingMesh = false;
147
148 friend class World;
149 };
150
151
152} // namespace engine
Definition BlockState.h:17
Definition Block.h:31
Definition Camera.h:29
Definition Chunk.h:37
IChunkData * data()
Definition Chunk.h:80
glm::ivec3 position() const
Definition Chunk.h:49
const IChunkData * data() const
Definition Chunk.h:82
virtual void afterGenerated()
Definition Chunk.h:93
bool generateMesh()
Generates the mesh data for the chunk.
Definition Chunk.cpp:45
virtual glm::ivec3 dims() const
Get the dimensions of this chunk type.
Definition Chunk.h:54
const ChunkID & id() const
Definition Chunk.h:47
void render(Engine &engine, const Camera *camera, int pass) override
Renders the chunk.
Definition Chunk.cpp:151
void populateTerrainData()
Generates the chunk data per TerrainGenerator if not generated yet.
Definition Chunk.cpp:37
Definition Engine.h:36
Definition Geometry.h:13
Interface for chunk data representation.
Definition IChunkData.h:17
Definition ISerializable.h:6
A MultiBlock represents multiple blocks at the same position.
Definition MultiBlock.h:19
Definition Renderable.h:10
A variant block is a block that can have multiple geometries based on the surrounding blocks.
Definition VariantBlock.h:16
Definition World.h:34
Definition ChunkID.h:8
Definition Chunk.h:106
Definition Chunk.h:111
Definition VariantBlock.h:55