]> git.localhorst.tv Git - blank.git/blob - src/world.cpp
block type colors
[blank.git] / src / world.cpp
1 #include "world.hpp"
2
3
4 namespace blank {
5
6 const BlockType BlockType::DEFAULT;
7
8 void BlockType::FillVBO(
9         const glm::vec3 &pos,
10         std::vector<glm::vec3> &vertices,
11         std::vector<glm::vec3> &colors,
12         std::vector<glm::vec3> &normals
13 ) const {
14         vertices.emplace_back(pos.x    , pos.y    , pos.z + 1); // front
15         vertices.emplace_back(pos.x + 1, pos.y    , pos.z + 1);
16         vertices.emplace_back(pos.x    , pos.y + 1, pos.z + 1);
17         vertices.emplace_back(pos.x + 1, pos.y    , pos.z + 1);
18         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
19         vertices.emplace_back(pos.x    , pos.y + 1, pos.z + 1);
20         vertices.emplace_back(pos.x    , pos.y    , pos.z    ); // back
21         vertices.emplace_back(pos.x    , pos.y + 1, pos.z    );
22         vertices.emplace_back(pos.x + 1, pos.y    , pos.z    );
23         vertices.emplace_back(pos.x + 1, pos.y    , pos.z    );
24         vertices.emplace_back(pos.x    , pos.y + 1, pos.z    );
25         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z    );
26         vertices.emplace_back(pos.x    , pos.y + 1, pos.z    ); // top
27         vertices.emplace_back(pos.x    , pos.y + 1, pos.z + 1);
28         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z    );
29         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z    );
30         vertices.emplace_back(pos.x    , pos.y + 1, pos.z + 1);
31         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
32         vertices.emplace_back(pos.x    , pos.y    , pos.z    ); // bottom
33         vertices.emplace_back(pos.x + 1, pos.y    , pos.z    );
34         vertices.emplace_back(pos.x    , pos.y    , pos.z + 1);
35         vertices.emplace_back(pos.x + 1, pos.y    , pos.z    );
36         vertices.emplace_back(pos.x + 1, pos.y    , pos.z + 1);
37         vertices.emplace_back(pos.x    , pos.y    , pos.z + 1);
38         vertices.emplace_back(pos.x    , pos.y    , pos.z    ); // left
39         vertices.emplace_back(pos.x    , pos.y    , pos.z + 1);
40         vertices.emplace_back(pos.x    , pos.y + 1, pos.z    );
41         vertices.emplace_back(pos.x    , pos.y + 1, pos.z    );
42         vertices.emplace_back(pos.x    , pos.y    , pos.z + 1);
43         vertices.emplace_back(pos.x    , pos.y + 1, pos.z + 1);
44         vertices.emplace_back(pos.x + 1, pos.y    , pos.z    ); // right
45         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z    );
46         vertices.emplace_back(pos.x + 1, pos.y    , pos.z + 1);
47         vertices.emplace_back(pos.x + 1, pos.y    , pos.z + 1);
48         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z    );
49         vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
50
51         colors.insert(colors.end(), 6 * 6, color);
52
53         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  0.0f,  1.0f)); // front
54         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  0.0f, -1.0f)); // back
55         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  1.0f,  0.0f)); // top
56         normals.insert(normals.end(), 6, glm::vec3( 0.0f, -1.0f,  0.0f)); // bottom
57         normals.insert(normals.end(), 6, glm::vec3(-1.0f,  0.0f,  0.0f)); // left
58         normals.insert(normals.end(), 6, glm::vec3( 1.0f,  0.0f,  0.0f)); // right
59 }
60
61
62 BlockTypeRegistry::BlockTypeRegistry() {
63         Add(BlockType::DEFAULT);
64 }
65
66 int BlockTypeRegistry::Add(const BlockType &t) {
67         int id = types.size();
68         types.push_back(t);
69         types.back().id = id;
70         return id;
71 }
72
73
74 Chunk::Chunk()
75 : blocks(Size())
76 , model()
77 , dirty(false) {
78
79 }
80
81
82 void Chunk::Draw() {
83         if (dirty) {
84                 Update();
85         }
86         model.Draw();
87 }
88
89
90 int Chunk::VertexCount() const {
91         // TODO: query blocks as soon as type shapes are implemented
92         return Size() * 6 * 6;
93 }
94
95 void Chunk::Update() {
96         model.Clear();
97         model.Reserve(VertexCount());
98
99         for (int i = 0; i < Size(); ++i) {
100                 if (blocks[i].type->visible) {
101                         blocks[i].type->FillModel(ToCoords(i), model);
102                 }
103         }
104
105         model.Invalidate();
106         dirty = false;
107 }
108
109 }