]> git.localhorst.tv Git - blank.git/blob - src/world/block.cpp
actually load shapes
[blank.git] / src / world / block.cpp
1 #include "Block.hpp"
2 #include "BlockType.hpp"
3 #include "BlockTypeRegistry.hpp"
4
5 #include "../model/geometry.hpp"
6
7 #include <ostream>
8 #include <glm/gtx/euler_angles.hpp>
9 #include <glm/gtx/transform.hpp>
10
11
12 namespace blank {
13
14 const NullBounds BlockType::DEFAULT_SHAPE;
15
16
17 std::ostream &operator <<(std::ostream &out, const Block &block) {
18         return out << "Block(" << block.type << ", " << block.GetFace() << ", " << block.GetTurn() << ')';
19 }
20
21 std::ostream &operator <<(std::ostream &out, const Block::Face &face) {
22         switch (face) {
23                 case Block::FACE_UP:
24                         out << "FACE_UP";
25                         break;
26                 case Block::FACE_DOWN:
27                         out << "FACE_DOWN";
28                         break;
29                 case Block::FACE_RIGHT:
30                         out << "FACE_RIGHT";
31                         break;
32                 case Block::FACE_LEFT:
33                         out << "FACE_LEFT";
34                         break;
35                 case Block::FACE_FRONT:
36                         out << "FACE_FRONT";
37                         break;
38                 case Block::FACE_BACK:
39                         out << "FACE_BACK";
40                         break;
41                 default:
42                 case Block::FACE_COUNT:
43                         out << "invalid Block::Face";
44                         break;
45         }
46         return out;
47 }
48
49 std::ostream &operator <<(std::ostream &out, const Block::Turn &turn) {
50         switch (turn) {
51                 case Block::TURN_NONE:
52                         out << "TURN_NONE";
53                         break;
54                 case Block::TURN_LEFT:
55                         out << "TURN_LEFT";
56                         break;
57                 case Block::TURN_AROUND:
58                         out << "TURN_AROUND";
59                         break;
60                 case Block::TURN_RIGHT:
61                         out << "TURN_RIGHT";
62                         break;
63                 default:
64                 case Block::TURN_COUNT:
65                         out << "invalid Block::Turn";
66                         break;
67         }
68         return out;
69 }
70
71
72 BlockType::BlockType() noexcept
73 : shape(&DEFAULT_SHAPE)
74 , textures()
75 , hsl_mod(0.0f, 1.0f, 1.0f)
76 , rgb_mod(1.0f, 1.0f, 1.0f)
77 , outline_color(-1, -1, -1)
78 , label("some block")
79 , id(0)
80 , luminosity(0)
81 , visible(true)
82 , block_light(true)
83 , collision(true)
84 , collide_block(true)
85 , generate(false)
86 , min_solidity(0.5f)
87 , mid_solidity(0.75f)
88 , max_solidity(1.0f)
89 , min_humidity(-1.0f)
90 , mid_humidity(0.0f)
91 , max_humidity(1.0f)
92 , min_temperature(-1.0f)
93 , mid_temperature(0.0f)
94 , max_temperature(1.0f)
95 , min_richness(-1.0f)
96 , mid_richness(0.0f)
97 , max_richness(1.0f)
98 , commonness(1.0f)
99 , fill({ false, false, false, false, false, false }) {
100
101 }
102
103 void BlockType::FillEntityMesh(
104         EntityMesh::Buffer &buf,
105         const glm::mat4 &transform,
106         EntityMesh::Index idx_offset
107 ) const noexcept {
108         if (textures.empty()) {
109                 shape->Vertices(buf, transform, 0.0f, idx_offset);
110         } else {
111                 shape->Vertices(buf, transform, textures[0], idx_offset);
112         }
113         buf.hsl_mods.insert(buf.hsl_mods.end(), shape->VertexCount(), hsl_mod);
114         buf.rgb_mods.insert(buf.rgb_mods.end(), shape->VertexCount(), rgb_mod);
115 }
116
117 void BlockType::FillBlockMesh(
118         BlockMesh::Buffer &buf,
119         const glm::mat4 &transform,
120         BlockMesh::Index idx_offset
121 ) const noexcept {
122         if (textures.empty()) {
123                 shape->Vertices(buf, transform, 0.0f, idx_offset);
124         } else {
125                 shape->Vertices(buf, transform, textures[0], idx_offset);
126         }
127         buf.hsl_mods.insert(buf.hsl_mods.end(), shape->VertexCount(), hsl_mod);
128         buf.rgb_mods.insert(buf.rgb_mods.end(), shape->VertexCount(), rgb_mod);
129 }
130
131 void BlockType::FillOutlineMesh(OutlineMesh::Buffer &buf) const noexcept {
132         shape->Outline(buf);
133         buf.colors.insert(buf.colors.end(), shape->OutlineCount(), outline_color);
134 }
135
136
137 BlockTypeRegistry::BlockTypeRegistry() {
138         BlockType air;
139         air.visible = false;
140         air.block_light = false;
141         air.collision = false;
142         air.collide_block = false;
143         Add(air);
144 }
145
146 Block::Type BlockTypeRegistry::Add(const BlockType &t) {
147         int id = types.size();
148         types.push_back(t);
149         types.back().id = id;
150         return id;
151 }
152
153
154 const glm::mat4 Block::orient2transform[ORIENT_COUNT] = {
155         {  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: up,    turn: none
156         {  0,  0, -1,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: left
157         { -1,  0,  0,  0,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: up,    turn: around
158         {  0,  0,  1,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: right
159         {  1,  0,  0,  0,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: down,  turn: none
160         {  0,  0, -1,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: left
161         { -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: down,  turn: around
162         {  0,  0,  1,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: right
163         {  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: right, turn: none
164         {  0, -1,  0,  0,  0,  0, -1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: left
165         {  0, -1,  0,  0, -1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: right, turn: around
166         {  0, -1,  0,  0,  0,  0,  1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: right
167         {  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: left,  turn: none
168         {  0,  1,  0,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: left
169         {  0,  1,  0,  0,  1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: left,  turn: around
170         {  0,  1,  0,  0,  0,  0, -1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: right
171         {  1,  0,  0,  0,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: none
172         {  0,  0, -1,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: left
173         { -1,  0,  0,  0,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: around
174         {  0,  0,  1,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: right
175         {  1,  0,  0,  0,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: none
176         {  0,  0, -1,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: left
177         { -1,  0,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: around
178         {  0,  0,  1,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: right
179 };
180
181 const glm::ivec3 Block::face2normal[FACE_COUNT] = {
182         {  0,  1,  0 },
183         {  0, -1,  0 },
184         {  1,  0,  0 },
185         { -1,  0,  0 },
186         {  0,  0,  1 },
187         {  0,  0, -1 },
188 };
189
190 const Block::Face Block::orient2face[ORIENT_COUNT][FACE_COUNT] = {
191         { FACE_UP,    FACE_DOWN,  FACE_RIGHT, FACE_LEFT,  FACE_FRONT, FACE_BACK,  }, // face: up,    turn: none
192         { FACE_UP,    FACE_DOWN,  FACE_FRONT, FACE_BACK,  FACE_LEFT,  FACE_RIGHT, }, // face: up,    turn: left
193         { FACE_UP,    FACE_DOWN,  FACE_LEFT,  FACE_RIGHT, FACE_BACK,  FACE_FRONT, }, // face: up,    turn: around
194         { FACE_UP,    FACE_DOWN,  FACE_BACK,  FACE_FRONT, FACE_RIGHT, FACE_LEFT,  }, // face: up,    turn: right
195         { FACE_DOWN,  FACE_UP,    FACE_RIGHT, FACE_LEFT,  FACE_BACK,  FACE_FRONT, }, // face: down,  turn: none
196         { FACE_DOWN,  FACE_UP,    FACE_BACK,  FACE_FRONT, FACE_LEFT,  FACE_RIGHT, }, // face: down,  turn: left
197         { FACE_DOWN,  FACE_UP,    FACE_LEFT,  FACE_RIGHT, FACE_FRONT, FACE_BACK,  }, // face: down,  turn: around
198         { FACE_DOWN,  FACE_UP,    FACE_FRONT, FACE_BACK,  FACE_RIGHT, FACE_LEFT,  }, // face: down,  turn: right
199         { FACE_LEFT,  FACE_RIGHT, FACE_UP,    FACE_DOWN,  FACE_FRONT, FACE_BACK,  }, // face: right, turn: none
200         { FACE_LEFT,  FACE_RIGHT, FACE_FRONT, FACE_BACK,  FACE_DOWN,  FACE_UP,    }, // face: right, turn: left
201         { FACE_LEFT,  FACE_RIGHT, FACE_DOWN,  FACE_UP,    FACE_BACK,  FACE_FRONT, }, // face: right, turn: around
202         { FACE_LEFT,  FACE_RIGHT, FACE_BACK,  FACE_FRONT, FACE_UP,    FACE_DOWN,  }, // face: right, turn: right
203         { FACE_RIGHT, FACE_LEFT,  FACE_DOWN,  FACE_UP,    FACE_FRONT, FACE_BACK,  }, // face: left,  turn: none
204         { FACE_RIGHT, FACE_LEFT,  FACE_FRONT, FACE_BACK,  FACE_UP,    FACE_DOWN,  }, // face: left,  turn: left
205         { FACE_RIGHT, FACE_LEFT,  FACE_UP,    FACE_DOWN,  FACE_BACK,  FACE_FRONT, }, // face: left,  turn: around
206         { FACE_RIGHT, FACE_LEFT,  FACE_BACK,  FACE_FRONT, FACE_DOWN,  FACE_UP,    }, // face: left,  turn: right
207         { FACE_BACK,  FACE_FRONT, FACE_RIGHT, FACE_LEFT,  FACE_UP,    FACE_DOWN,  }, // face: front, turn: none
208         { FACE_BACK,  FACE_FRONT, FACE_UP,    FACE_DOWN,  FACE_LEFT,  FACE_RIGHT, }, // face: front, turn: left
209         { FACE_BACK,  FACE_FRONT, FACE_LEFT,  FACE_RIGHT, FACE_DOWN,  FACE_UP,    }, // face: front, turn: around
210         { FACE_BACK,  FACE_FRONT, FACE_DOWN,  FACE_UP,    FACE_RIGHT, FACE_LEFT,  }, // face: front, turn: right
211         { FACE_FRONT, FACE_BACK,  FACE_RIGHT, FACE_LEFT,  FACE_DOWN,  FACE_UP,    }, // face: back,  turn: none
212         { FACE_FRONT, FACE_BACK,  FACE_DOWN,  FACE_UP,    FACE_LEFT,  FACE_RIGHT, }, // face: back,  turn: left
213         { FACE_FRONT, FACE_BACK,  FACE_LEFT,  FACE_RIGHT, FACE_UP,    FACE_DOWN,  }, // face: back,  turn: around
214         { FACE_FRONT, FACE_BACK,  FACE_UP,    FACE_DOWN,  FACE_RIGHT, FACE_LEFT,  }, // face: back,  turn: right
215 };
216
217 }