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