]> git.localhorst.tv Git - blank.git/blob - src/block.cpp
use precalculated matrices for block orientation
[blank.git] / src / block.cpp
1 #include "block.hpp"
2
3 #include "geometry.hpp"
4
5 #include <glm/gtx/euler_angles.hpp>
6 #include <glm/gtx/transform.hpp>
7
8
9 namespace blank {
10
11 namespace {
12
13 const glm::mat4 block_transforms[Block::FACE_COUNT * Block::TURN_COUNT] = {
14         {  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: up,    turn: none
15         {  0,  0, -1,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: left
16         { -1,  0,  0,  0,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: up,    turn: around
17         {  0,  0,  1,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: up,    turn: right
18         {  1,  0,  0,  0,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: down,  turn: none
19         {  0,  0, -1,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: left
20         { -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: down,  turn: around
21         {  0,  0,  1,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: down,  turn: right
22         {  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: right, turn: none
23         {  0, -1,  0,  0,  0,  0, -1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: left
24         {  0, -1,  0,  0, -1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: right, turn: around
25         {  0, -1,  0,  0,  0,  0,  1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: right, turn: right
26         {  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  1, }, // face: left,  turn: none
27         {  0,  1,  0,  0,  0,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: left
28         {  0,  1,  0,  0,  1,  0,  0,  0,  0,  0, -1,  0,  0,  0,  0,  1, }, // face: left,  turn: around
29         {  0,  1,  0,  0,  0,  0, -1,  0, -1,  0,  0,  0,  0,  0,  0,  1, }, // face: left,  turn: right
30         {  1,  0,  0,  0,  0,  0,  1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: none
31         {  0,  0, -1,  0,  1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: left
32         { -1,  0,  0,  0,  0,  0, -1,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: around
33         {  0,  0,  1,  0, -1,  0,  0,  0,  0, -1,  0,  0,  0,  0,  0,  1, }, // face: front, turn: right
34         {  1,  0,  0,  0,  0,  0, -1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: none
35         {  0,  0, -1,  0, -1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: left
36         { -1,  0,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: around
37         {  0,  0,  1,  0,  1,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  1, }, // face: back,  turn: right
38 };
39
40 }
41
42 const glm::mat4 &Block::Transform() const {
43         return block_transforms[orient];
44 }
45
46
47 const NullShape BlockType::DEFAULT_SHAPE;
48
49 BlockType::BlockType(bool v, const glm::vec3 &col, const Shape *s)
50 : shape(s)
51 , color(col)
52 , outline_color(-1, -1, -1)
53 , id(0)
54 , visible(v)
55 , fill({ false, false, false, false, false, false }) {
56
57 }
58
59 void BlockType::FillModel(
60         Model::Buffer &buf,
61         const glm::mat4 &transform,
62         Model::Index idx_offset
63 ) const {
64         shape->Vertices(buf.vertices, buf.normals, buf.indices, transform, idx_offset);
65         buf.colors.insert(buf.colors.end(), shape->VertexCount(), color);
66 }
67
68 void BlockType::FillOutlineModel(
69         OutlineModel &model,
70         const glm::vec3 &pos_offset,
71         OutlineModel::Index idx_offset
72 ) const {
73         shape->Outline(model.vertices, model.indices, pos_offset, idx_offset);
74         model.colors.insert(model.colors.end(), shape->OutlineCount(), outline_color);
75 }
76
77
78 BlockTypeRegistry::BlockTypeRegistry() {
79         Add(BlockType());
80 }
81
82 Block::Type BlockTypeRegistry::Add(const BlockType &t) {
83         int id = types.size();
84         types.push_back(t);
85         types.back().id = id;
86         return id;
87 }
88
89 }