forked from Vogtinator/crafti
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslabrenderer.cpp
191 lines (163 loc) · 7.39 KB
/
slabrenderer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include "slabrenderer.h"
constexpr GLFix SlabRenderer::slab_height, SlabRenderer::slab_width;
// Get slab texture
const TerrainAtlasEntry &SlabRenderer::getSlabTexture(const BLOCK_WDATA block) {
switch (static_cast<SLAB_TYPE>(getBLOCKDATA(block))) {
default:
return terrain_atlas[6][12];
break;
case SLAB_STONE:
return terrain_atlas[1][0];
break;
case SLAB_PLANKS_NORMAL:
return terrain_atlas[4][0];
break;
case SLAB_WALL:
return terrain_atlas[7][0];
break;
case SLAB_PLANKS_DARK:
return terrain_atlas[6][12];
break;
case SLAB_PLANKS_BRIGHT:
return terrain_atlas[6][13];
break;
case SLAB_COBBLESTONE:
return terrain_atlas[0][1];
break;
case SLAB_NETHERRACK:
return terrain_atlas[7][6];
break;
}
}
const TerrainAtlasEntry &SlabRenderer::destructionTexture(const BLOCK_WDATA block) {
return getSlabTexture(block);
}
void SlabRenderer::addedBlock(const BLOCK_WDATA block, int local_x, int local_y, int local_z, Chunk &c) {
if (getBLOCKDATA(c.getGlobalBlockRelative(local_x, local_y - 1, local_z)) == getBLOCKDATA(block)) {
// Remove slab
c.changeLocalBlock(local_x, local_y, local_z, getBLOCK(BLOCK_AIR));
// Define variable
BLOCK fullSlabBlock;
// Get block from slab type
switch (static_cast<SLAB_TYPE>(getBLOCKDATA(block))) {
default:
fullSlabBlock = getBLOCK(BLOCK_PLANKS_DARK);
break;
case SLAB_STONE:
fullSlabBlock = getBLOCK(BLOCK_STONE);
break;
case SLAB_PLANKS_NORMAL:
fullSlabBlock = getBLOCK(BLOCK_PLANKS_NORMAL);
break;
case SLAB_WALL:
fullSlabBlock = getBLOCK(BLOCK_WALL);
break;
case SLAB_PLANKS_DARK:
fullSlabBlock = getBLOCK(BLOCK_PLANKS_DARK);
break;
case SLAB_PLANKS_BRIGHT:
fullSlabBlock = getBLOCK(BLOCK_PLANKS_BRIGHT);
break;
case SLAB_COBBLESTONE:
fullSlabBlock = getBLOCK(BLOCK_COBBLESTONE);
break;
case SLAB_NETHERRACK:
fullSlabBlock = getBLOCK(BLOCK_NETHERRACK);
break;
}
// Set block to slab block type
c.setGlobalBlockRelative(local_x, local_y - 1, local_z, fullSlabBlock);
}
}
void SlabRenderer::renderSpecialBlock(const BLOCK_WDATA block, GLFix x, GLFix y, GLFix z, Chunk &c)
{
const TextureAtlasEntry &slab_top = getSlabTexture(block).current;
TextureAtlasEntry slab_sid = getSlabTexture(block).current;
slab_sid.top = slab_sid.top + (slab_sid.bottom - slab_sid.top) * 8 / 16;
//////
// GL CODE
//////
glPushMatrix();
glLoadIdentity();
glTranslatef(x, y, z);
std::vector<VERTEX> slab_vertices;
slab_vertices.reserve(20);
// Slab Side
slab_vertices.push_back({0, 0, 0, slab_sid.left, slab_sid.bottom, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, GLFix(0) + slab_height, 0, slab_sid.left, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({GLFix(0) + slab_width, GLFix(0) + slab_height, 0, slab_sid.right, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({GLFix(0) + slab_width, 0, 0, slab_sid.right, slab_sid.bottom, TEXTURE_TRANSPARENT});
// Slab Side
slab_vertices.push_back({GLFix(0) + slab_width, 0, GLFix(0) - 0 + BLOCK_SIZE, slab_sid.left, slab_sid.bottom, TEXTURE_TRANSPARENT});
slab_vertices.push_back({GLFix(0) + slab_width, GLFix(0) + slab_height, GLFix(0) - 0 + BLOCK_SIZE, slab_sid.left, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, GLFix(0) + slab_height, GLFix(0) - 0 + BLOCK_SIZE, slab_sid.right, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, 0, GLFix(0) - 0 + BLOCK_SIZE, slab_sid.right, slab_sid.bottom, TEXTURE_TRANSPARENT});
// Slab Back Side
slab_vertices.push_back({0, 0, GLFix(0) + BLOCK_SIZE, slab_sid.left, slab_sid.bottom, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, GLFix(0) + slab_height, 0 + BLOCK_SIZE, slab_sid.left, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, GLFix(0) + slab_height, 0, slab_sid.right, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, 0, 0, slab_sid.right, slab_sid.bottom, TEXTURE_TRANSPARENT});
// Slab (Front) Inside
slab_vertices.push_back({(GLFix(0) - 0) + slab_width, 0, 0, slab_sid.left, slab_sid.bottom, TEXTURE_TRANSPARENT});
slab_vertices.push_back({(GLFix(0) - 0) + slab_width, GLFix(0) + slab_height, 0, slab_sid.left, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({(GLFix(0) - 0) + slab_width, GLFix(0) + slab_height, 0 + BLOCK_SIZE, slab_sid.right, slab_sid.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({(GLFix(0) - 0) + slab_width, 0, 0 + BLOCK_SIZE, slab_sid.right, slab_sid.bottom, TEXTURE_TRANSPARENT});
// Slab Top
slab_vertices.push_back({0, GLFix(0) + slab_height, 0, slab_top.left, slab_top.bottom, TEXTURE_TRANSPARENT});
slab_vertices.push_back({0, GLFix(0) + slab_height, GLFix(0) + BLOCK_SIZE - 0, slab_top.left, slab_top.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({GLFix(0) + slab_width - 0, GLFix(0) + slab_height, GLFix(0) + BLOCK_SIZE - 0, slab_top.right, slab_top.top, TEXTURE_TRANSPARENT});
slab_vertices.push_back({GLFix(0) + slab_width - 0, GLFix(0) + slab_height, 0, slab_top.right, slab_top.bottom, TEXTURE_TRANSPARENT});
for(auto&& v : slab_vertices)
{
VERTEX v1;
nglMultMatVectRes(transformation, &v, &v1);
c.addUnalignedVertex(v1.x, v1.y, v1.z, v.u, v.v, v.c);
}
glPopMatrix();
}
void SlabRenderer::geometryNormalBlock(const BLOCK_WDATA block, const int local_x, const int local_y, const int local_z, const BLOCK_SIDE side, Chunk &c)
{
// Render the bottom of the block as a normal side (needs to be replaced later)
if(side != BLOCK_BOTTOM)
return;
// BOTTOM DOESN'T WORK!!! afdghtresdvbhtredfsvcbgfhtresd
renderNormalBlockSide(local_x, local_y, local_z, side, getSlabTexture(block).current, c);
}
AABB SlabRenderer::getAABB(const BLOCK_WDATA /*block*/, GLFix x, GLFix y, GLFix z)
{
return {x + 0, y, z + 0, x + 0 + slab_width, y + slab_height, z + 0 + slab_width};
}
void SlabRenderer::drawPreview(const BLOCK_WDATA block, TEXTURE &dest, int x, int y)
{
TextureAtlasEntry tex = getSlabTexture(block).resized;
BlockRenderer::drawTextureAtlasEntry(*terrain_resized, tex, dest, x, y);
}
const char *SlabRenderer::getName(const BLOCK_WDATA block)
{
switch (static_cast<SLAB_TYPE>(getBLOCKDATA(block))) {
default:
return "Slab";
break;
case SLAB_STONE:
return "Stone Slab";
break;
case SLAB_PLANKS_NORMAL:
return "Oak Slab";
break;
case SLAB_WALL:
return "Brick Slab";
break;
case SLAB_PLANKS_DARK:
return "Dark Oak Slab";
break;
case SLAB_PLANKS_BRIGHT:
return "Bright Oak Slab";
break;
case SLAB_COBBLESTONE:
return "Cobblestone Slab";
break;
case SLAB_NETHERRACK:
return "Netherack Slab";
break;
}
}