]> git.localhorst.tv Git - blank.git/blob - src/world.cpp
2dd7b307a6ffa292fd24027414af746a5123504b
[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, glm::vec3(1.0f, 1.0f, 1.0f)); // front
52         colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // back
53         colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // top
54         colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // bottom
55         colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // left
56         colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // right
57
58         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  0.0f,  1.0f)); // front
59         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  0.0f, -1.0f)); // back
60         normals.insert(normals.end(), 6, glm::vec3( 0.0f,  1.0f,  0.0f)); // top
61         normals.insert(normals.end(), 6, glm::vec3( 0.0f, -1.0f,  0.0f)); // bottom
62         normals.insert(normals.end(), 6, glm::vec3(-1.0f,  0.0f,  0.0f)); // left
63         normals.insert(normals.end(), 6, glm::vec3( 1.0f,  0.0f,  0.0f)); // right
64 }
65
66
67 Chunk::Chunk()
68 : blocks(Size())
69 , model()
70 , dirty(false) {
71
72 }
73
74
75 void Chunk::Draw() {
76         if (dirty) {
77                 Update();
78         }
79         model.Draw();
80 }
81
82
83 int Chunk::VertexCount() const {
84         // TODO: query blocks as soon as type shapes are implemented
85         return Size() * 6 * 6;
86 }
87
88 void Chunk::Update() {
89         model.Clear();
90         model.Reserve(VertexCount());
91
92         for (int i = 0; i < Size(); ++i) {
93                 if (blocks[i].type->visible) {
94                         blocks[i].type->FillModel(ToCoords(i), model);
95                 }
96         }
97
98         model.Invalidate();
99         dirty = false;
100 }
101
102 }