]> git.localhorst.tv Git - blank.git/blob - src/world/block.cpp
check for entities under crosshair
[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 NullShape 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(bool v, const glm::vec3 &col, const Shape *s) noexcept
73 : shape(s)
74 , texture(0)
75 , color(col)
76 , outline_color(-1, -1, -1)
77 , label("some block")
78 , id(0)
79 , luminosity(0)
80 , visible(v)
81 , block_light(false)
82 , collision(false)
83 , collide_block(false)
84 , fill({ false, false, false, false, false, false }) {
85
86 }
87
88 void BlockType::FillEntityModel(
89         EntityModel::Buffer &buf,
90         const glm::mat4 &transform,
91         EntityModel::Index idx_offset
92 ) const noexcept {
93         shape->Vertices(buf, transform, texture, idx_offset);
94         buf.colors.insert(buf.colors.end(), shape->VertexCount(), color);
95 }
96
97 void BlockType::FillBlockModel(
98         BlockModel::Buffer &buf,
99         const glm::mat4 &transform,
100         BlockModel::Index idx_offset
101 ) const noexcept {
102         shape->Vertices(buf, transform, texture, idx_offset);
103         buf.colors.insert(buf.colors.end(), shape->VertexCount(), color);
104 }
105
106 void BlockType::FillOutlineModel(
107         OutlineModel::Buffer &buf,
108         const glm::vec3 &pos_offset,
109         OutlineModel::Index idx_offset
110 ) const noexcept {
111         shape->Outline(buf, pos_offset, idx_offset);
112         buf.colors.insert(buf.colors.end(), shape->OutlineCount(), outline_color);
113 }
114
115
116 BlockTypeRegistry::BlockTypeRegistry() {
117         Add(BlockType());
118 }
119
120 Block::Type BlockTypeRegistry::Add(const BlockType &t) {
121         int id = types.size();
122         types.push_back(t);
123         types.back().id = id;
124         return id;
125 }
126
127
128 const glm::mat4 Block::orient2transform[ORIENT_COUNT] = {
129         {  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: up,    turn: none
130         {  0,  0, -1,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: left
131         { -1,  0,  0,  0,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: up,    turn: around
132         {  0,  0,  1,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: right
133         {  1,  0,  0,  0,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: down,  turn: none
134         {  0,  0, -1,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: left
135         { -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: down,  turn: around
136         {  0,  0,  1,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: right
137         {  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: right, turn: none
138         {  0, -1,  0,  0,  0,  0, -1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: left
139         {  0, -1,  0,  0, -1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: right, turn: around
140         {  0, -1,  0,  0,  0,  0,  1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: right
141         {  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: left,  turn: none
142         {  0,  1,  0,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: left
143         {  0,  1,  0,  0,  1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: left,  turn: around
144         {  0,  1,  0,  0,  0,  0, -1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: right
145         {  1,  0,  0,  0,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: none
146         {  0,  0, -1,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: left
147         { -1,  0,  0,  0,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: around
148         {  0,  0,  1,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: right
149         {  1,  0,  0,  0,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: none
150         {  0,  0, -1,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: left
151         { -1,  0,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: around
152         {  0,  0,  1,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: right
153 };
154
155 const glm::ivec3 Block::face2normal[FACE_COUNT] = {
156         {  0,  1,  0 },
157         {  0, -1,  0 },
158         {  1,  0,  0 },
159         { -1,  0,  0 },
160         {  0,  0,  1 },
161         {  0,  0, -1 },
162 };
163
164 const Block::Face Block::orient2face[ORIENT_COUNT][FACE_COUNT] = {
165         { FACE_UP,    FACE_DOWN,  FACE_RIGHT, FACE_LEFT,  FACE_FRONT, FACE_BACK,  }, // face: up,    turn: none
166         { FACE_UP,    FACE_DOWN,  FACE_FRONT, FACE_BACK,  FACE_LEFT,  FACE_RIGHT, }, // face: up,    turn: left
167         { FACE_UP,    FACE_DOWN,  FACE_LEFT,  FACE_RIGHT, FACE_BACK,  FACE_FRONT, }, // face: up,    turn: around
168         { FACE_UP,    FACE_DOWN,  FACE_BACK,  FACE_FRONT, FACE_RIGHT, FACE_LEFT,  }, // face: up,    turn: right
169         { FACE_DOWN,  FACE_UP,    FACE_RIGHT, FACE_LEFT,  FACE_BACK,  FACE_FRONT, }, // face: down,  turn: none
170         { FACE_DOWN,  FACE_UP,    FACE_BACK,  FACE_FRONT, FACE_LEFT,  FACE_RIGHT, }, // face: down,  turn: left
171         { FACE_DOWN,  FACE_UP,    FACE_LEFT,  FACE_RIGHT, FACE_FRONT, FACE_BACK,  }, // face: down,  turn: around
172         { FACE_DOWN,  FACE_UP,    FACE_FRONT, FACE_BACK,  FACE_RIGHT, FACE_LEFT,  }, // face: down,  turn: right
173         { FACE_LEFT,  FACE_RIGHT, FACE_UP,    FACE_DOWN,  FACE_FRONT, FACE_BACK,  }, // face: right, turn: none
174         { FACE_LEFT,  FACE_RIGHT, FACE_FRONT, FACE_BACK,  FACE_DOWN,  FACE_UP,    }, // face: right, turn: left
175         { FACE_LEFT,  FACE_RIGHT, FACE_DOWN,  FACE_UP,    FACE_BACK,  FACE_FRONT, }, // face: right, turn: around
176         { FACE_LEFT,  FACE_RIGHT, FACE_BACK,  FACE_FRONT, FACE_UP,    FACE_DOWN,  }, // face: right, turn: right
177         { FACE_RIGHT, FACE_LEFT,  FACE_DOWN,  FACE_UP,    FACE_FRONT, FACE_BACK,  }, // face: left,  turn: none
178         { FACE_RIGHT, FACE_LEFT,  FACE_FRONT, FACE_BACK,  FACE_UP,    FACE_DOWN,  }, // face: left,  turn: left
179         { FACE_RIGHT, FACE_LEFT,  FACE_UP,    FACE_DOWN,  FACE_BACK,  FACE_FRONT, }, // face: left,  turn: around
180         { FACE_RIGHT, FACE_LEFT,  FACE_BACK,  FACE_FRONT, FACE_DOWN,  FACE_UP,    }, // face: left,  turn: right
181         { FACE_BACK,  FACE_FRONT, FACE_RIGHT, FACE_LEFT,  FACE_UP,    FACE_DOWN,  }, // face: front, turn: none
182         { FACE_BACK,  FACE_FRONT, FACE_UP,    FACE_DOWN,  FACE_LEFT,  FACE_RIGHT, }, // face: front, turn: left
183         { FACE_BACK,  FACE_FRONT, FACE_LEFT,  FACE_RIGHT, FACE_DOWN,  FACE_UP,    }, // face: front, turn: around
184         { FACE_BACK,  FACE_FRONT, FACE_DOWN,  FACE_UP,    FACE_RIGHT, FACE_LEFT,  }, // face: front, turn: right
185         { FACE_FRONT, FACE_BACK,  FACE_RIGHT, FACE_LEFT,  FACE_DOWN,  FACE_UP,    }, // face: back,  turn: none
186         { FACE_FRONT, FACE_BACK,  FACE_DOWN,  FACE_UP,    FACE_LEFT,  FACE_RIGHT, }, // face: back,  turn: left
187         { FACE_FRONT, FACE_BACK,  FACE_LEFT,  FACE_RIGHT, FACE_UP,    FACE_DOWN,  }, // face: back,  turn: around
188         { FACE_FRONT, FACE_BACK,  FACE_UP,    FACE_DOWN,  FACE_RIGHT, FACE_LEFT,  }, // face: back,  turn: right
189 };
190
191 }