]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/chunk.hpp
Multithreading
[dragonblocks3d.git] / src / dragonblocks / chunk.hpp
1 #pragma once
2
3 #include "block.hpp"
4 #include "gl.hpp"
5 #include "mesh_gen_mgr.hpp"
6
7 #define DRAGONBLOCKS_CHUNK_SIZE 16
8
9 namespace dragonblocks
10 {
11         class Map;
12         class Mesh;
13         class Scene;
14         
15         class Chunk : public MeshGenMgr::MeshGenerator
16         {
17                 public:
18                 static void checkPos(const glm::ivec3 &);
19                 
20                 class Data
21                 {
22                         public:
23                         Block blocks[DRAGONBLOCKS_CHUNK_SIZE][DRAGONBLOCKS_CHUNK_SIZE][DRAGONBLOCKS_CHUNK_SIZE];
24                         Data() = default;
25                         Data(const Data &) = default;
26                 };
27                 
28                 glm::ivec3 pos;
29                 
30                 const Block *getBlock(const glm::ivec3 &) const;
31                 const Block *getBlockNoEx(const glm::ivec3 &) const;
32                 void setBlock(const glm::ivec3 &, const Block &);
33                 void setBlockNoEx(const glm::ivec3 &, const Block &);
34                 void addMeshUpdateTask();
35                 void addMeshUpdateTaskWithEdge();
36                 void updateMesh();
37                 
38                 Chunk(Map *, const glm::ivec3 &, const Data &, MeshGenMgr *, Scene *);
39                 ~Chunk();
40                 
41                 private:
42                 static void staticAfterEffect(void *);
43                 
44                 Map *map;
45                 Mesh *mesh = nullptr;
46                 MeshGenMgr *mesh_gen_mgr;
47                 Scene *scene;
48                 Data data;
49                 bool effect_finished = false;
50                 bool mesh_created = false;
51                 
52                 void afterEffect();
53                 void deleteMesh();
54         };
55 };