Skip to content

Commit 0431e68

Browse files
committed
[Renderer] block & model part
1 parent fed2a1c commit 0431e68

5 files changed

Lines changed: 125 additions & 86 deletions

File tree

include/openminecraft-shell/data/om_model_precompiler.hpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ struct OMModelPart
6565
OMModelAxis rotateAxis;
6666
double rotateAngle;
6767
};
68+
struct OMModel
69+
{
70+
std::vector<OMModelPart> parts;
71+
std::vector<bool> partAmbientOcculusion;
72+
std::vector<bool> partComplex;
73+
bool soild;
74+
};
6875
class OMModelPrecompiler : public openminecraft::renderer::common::wrap::OMVoxelHandler
6976
{
7077
public:
@@ -76,6 +83,8 @@ class OMModelPrecompiler : public openminecraft::renderer::common::wrap::OMVoxel
7683
-> OMModelFace;
7784
auto wrapPart(std::shared_ptr<openminecraft::io::json::OMJsonNode>) -> OMModelPart;
7885

86+
auto composeBlock(std::vector<int>, bool = true) -> int;
87+
7988
auto loadModelPart(OMIdentifier, bool = true) -> int;
8089
auto loadModelPartWithArgs(OMIdentifier, int, int, int, bool, bool = true) -> int;
8190

@@ -92,9 +101,9 @@ class OMModelPrecompiler : public openminecraft::renderer::common::wrap::OMVoxel
92101
auto queryPartRotationAngle(int bsid, int pid) -> int override;
93102
auto querySoild(int bsid) -> bool override;
94103
auto queryOcclusionShape(int bsid) -> openminecraft::renderer::common::wrap::OMVoxelShape override;
95-
auto queryAmbientOcclusion(int bsid) -> bool override;
104+
auto queryPartAmbientOcclusion(int bsid, int pid) -> bool override;
96105
auto queryPartShade(int bsid, int pid) -> bool override;
97-
auto queryComplex(int bsid) -> bool override;
106+
auto queryPartComplex(int bsid, int pid) -> bool override;
98107
auto queryPartFaceSecondaryTexture(int bsid, int pid, openminecraft::renderer::common::wrap::OMVoxelFacing)
99108
-> bool override;
100109
auto queryPartRotationAngleF(int bsid, int pid) -> float override;
@@ -104,7 +113,8 @@ class OMModelPrecompiler : public openminecraft::renderer::common::wrap::OMVoxel
104113
std::string root;
105114
openminecraft::log::OMLogger logger;
106115
OMTextureAtlas &textureAtlas;
107-
std::vector<std::vector<OMModelPart>> models;
116+
std::vector<OMModel> blockModels;
117+
std::vector<std::vector<OMModelPart>> modelParts;
108118
std::vector<bool> modelSoild;
109119
std::vector<bool> modelAmbientOcculusion;
110120
std::vector<bool> modelComplex;

include/openminecraft/renderer/common/wrap/om_renderer_voxel.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ class OMVoxelHandler
157157
virtual auto queryPartRotationAngle(int bsid, int pid) -> int = 0;
158158
virtual auto querySoild(int bsid) -> bool = 0;
159159
virtual auto queryOcclusionShape(int bsid) -> OMVoxelShape = 0;
160-
virtual auto queryAmbientOcclusion(int bsid) -> bool = 0;
160+
virtual auto queryPartAmbientOcclusion(int bsid, int pid) -> bool = 0;
161161
virtual auto queryPartShade(int bsid, int pid) -> bool = 0;
162-
virtual auto queryComplex(int bsid) -> bool = 0;
162+
virtual auto queryPartComplex(int bsid, int pid) -> bool = 0;
163163
virtual auto queryPartFaceSecondaryTexture(int bsid, int pid, OMVoxelFacing) -> bool = 0;
164164
virtual auto queryPartRotationAngleF(int bsid, int pid) -> float = 0;
165165
};
@@ -217,15 +217,15 @@ class OMVoxelHandlerDummy : public OMVoxelHandler
217217
{
218218
return {{{0, 0, 0}, {16, 16, 16}}};
219219
}
220-
auto queryAmbientOcclusion(int bsid) -> bool override
220+
auto queryPartAmbientOcclusion(int bsid, int pid) -> bool override
221221
{
222222
return true;
223223
}
224224
auto queryPartShade(int bsid, int pid) -> bool override
225225
{
226226
return true;
227227
}
228-
auto queryComplex(int bsid) -> bool override
228+
auto queryPartComplex(int bsid, int pid) -> bool override
229229
{
230230
return false;
231231
}

src/openminecraft-core/renderer/common/wrap/om_renderer_voxel_compiler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,14 @@ auto OMVoxelCompiler::compile(const world::OMChunk<16> &chunk,
296296
!checkExistSoild(chunk, externalAccessor, v.first, handler->queryPartFaceCull(v.second, i, f)))
297297
{
298298
auto [ao1, ao2, ao3, ao4] =
299-
handler->queryAmbientOcclusion(v.second) && handler->queryPartShade(v.second, i)
299+
handler->queryPartAmbientOcclusion(v.second, i) && handler->queryPartShade(v.second, i)
300300
? computeAO(chunk, externalAccessor, v.first.x, v.first.y, v.first.z, f, v.second, i)
301301
: std::make_tuple<uint8_t, uint8_t, uint8_t, uint8_t>(0, 0, 0, 0);
302302
auto aabb = handler->queryPartAABB(v.second, i);
303303
auto uv = handler->queryPartFaceUV(v.second, i, f);
304304
auto raxis = handler->queryPartRotationCenter(v.second, i);
305305

306-
if (handler->queryComplex(v.second))
306+
if (handler->queryPartComplex(v.second, i))
307307
{
308308
float rotationAngle = handler->queryPartRotationAngleF(v.second, i);
309309
bool texSec = handler->queryPartFaceSecondaryTexture(v.second, i, f);

src/openminecraft/data/om_model_precompiler.cpp

Lines changed: 75 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#include <iostream>
21
#include <memory>
32
#include <utility>
43
#include <vector>
@@ -68,42 +67,42 @@ auto OMModelPrecompiler::queryPartFaceSecondaryTexture(int bsid, int pid,
6867
{
6968
default:
7069
case ::NegX:
71-
return models[bsid][pid].west.secondaryTex;
70+
return blockModels[bsid].parts[pid].west.secondaryTex;
7271
case ::PosX:
73-
return models[bsid][pid].east.secondaryTex;
72+
return blockModels[bsid].parts[pid].east.secondaryTex;
7473
case ::NegZ:
75-
return models[bsid][pid].north.secondaryTex;
74+
return blockModels[bsid].parts[pid].north.secondaryTex;
7675
case ::PosZ:
77-
return models[bsid][pid].south.secondaryTex;
76+
return blockModels[bsid].parts[pid].south.secondaryTex;
7877
case ::NegY:
79-
return models[bsid][pid].down.secondaryTex;
78+
return blockModels[bsid].parts[pid].down.secondaryTex;
8079
case ::PosY:
81-
return models[bsid][pid].up.secondaryTex;
80+
return blockModels[bsid].parts[pid].up.secondaryTex;
8281
}
8382
}
8483
auto OMModelPrecompiler::queryPartRotationAngleF(int bsid, int pid) -> float
8584
{
86-
return models[bsid][pid].rotateAngle;
85+
return blockModels[bsid].parts[pid].rotateAngle;
8786
}
8887

89-
auto OMModelPrecompiler::queryComplex(int bsid) -> bool
88+
auto OMModelPrecompiler::queryPartComplex(int bsid, int pid) -> bool
9089
{
91-
return modelComplex[bsid];
90+
return blockModels[bsid].partComplex[pid];
9291
}
9392

9493
auto OMModelPrecompiler::queryPartShade(int bsid, int pid) -> bool
9594
{
96-
return models[bsid][pid].shade;
95+
return blockModels[bsid].parts[pid].shade;
9796
}
98-
auto OMModelPrecompiler::queryAmbientOcclusion(int bsid) -> bool
97+
auto OMModelPrecompiler::queryPartAmbientOcclusion(int bsid, int pid) -> bool
9998
{
100-
return modelAmbientOcculusion[bsid];
99+
return blockModels[bsid].partAmbientOcculusion[pid];
101100
}
102101

103102
auto OMModelPrecompiler::queryOcclusionShape(int bsid) -> OMVoxelShape
104103
{
105104
std::vector<OMVoxelAABB> r;
106-
for (auto &pp : models[bsid])
105+
for (auto &pp : blockModels[bsid].parts)
107106
{
108107
r.emplace_back(OMVoxelAABB{pp.from, pp.to - pp.from});
109108
}
@@ -113,30 +112,30 @@ auto OMModelPrecompiler::queryOcclusionShape(int bsid) -> OMVoxelShape
113112

114113
auto OMModelPrecompiler::queryPartAABB(int bsid, int pid) -> OMVoxelAABB
115114
{
116-
return {models[bsid][pid].from, models[bsid][pid].to - models[bsid][pid].from};
115+
return {blockModels[bsid].parts[pid].from, blockModels[bsid].parts[pid].to - blockModels[bsid].parts[pid].from};
117116
}
118117

119118
auto OMModelPrecompiler::queryNumParts(int bsid) -> int
120119
{
121-
return models[bsid].size();
120+
return blockModels[bsid].parts.size();
122121
}
123122
auto OMModelPrecompiler::queryPartFaceEnabled(int bsid, int pid, ::OMVoxelFacing f) -> bool
124123
{
125124
switch (f)
126125
{
127126
default:
128127
case ::NegX:
129-
return models[bsid][pid].enableWest;
128+
return blockModels[bsid].parts[pid].enableWest;
130129
case ::PosX:
131-
return models[bsid][pid].enableEast;
130+
return blockModels[bsid].parts[pid].enableEast;
132131
case ::NegZ:
133-
return models[bsid][pid].enableNorth;
132+
return blockModels[bsid].parts[pid].enableNorth;
134133
case ::PosZ:
135-
return models[bsid][pid].enableSouth;
134+
return blockModels[bsid].parts[pid].enableSouth;
136135
case ::NegY:
137-
return models[bsid][pid].enableDown;
136+
return blockModels[bsid].parts[pid].enableDown;
138137
case ::PosY:
139-
return models[bsid][pid].enableUp;
138+
return blockModels[bsid].parts[pid].enableUp;
140139
}
141140
}
142141
auto OMModelPrecompiler::queryPartFaceTex(int bsid, int pid, ::OMVoxelFacing f) -> int
@@ -145,17 +144,17 @@ auto OMModelPrecompiler::queryPartFaceTex(int bsid, int pid, ::OMVoxelFacing f)
145144
{
146145
default:
147146
case ::NegX:
148-
return models[bsid][pid].west.textureid;
147+
return blockModels[bsid].parts[pid].west.textureid;
149148
case ::PosX:
150-
return models[bsid][pid].east.textureid;
149+
return blockModels[bsid].parts[pid].east.textureid;
151150
case ::NegZ:
152-
return models[bsid][pid].north.textureid;
151+
return blockModels[bsid].parts[pid].north.textureid;
153152
case ::PosZ:
154-
return models[bsid][pid].south.textureid;
153+
return blockModels[bsid].parts[pid].south.textureid;
155154
case ::NegY:
156-
return models[bsid][pid].down.textureid;
155+
return blockModels[bsid].parts[pid].down.textureid;
157156
case ::PosY:
158-
return models[bsid][pid].up.textureid;
157+
return blockModels[bsid].parts[pid].up.textureid;
159158
}
160159
}
161160
auto cullFaceTo(OMModelCullSide s) -> ::OMVoxelFacing
@@ -184,17 +183,17 @@ auto OMModelPrecompiler::queryPartFaceCull(int bsid, int pid, ::OMVoxelFacing f)
184183
{
185184
default:
186185
case ::NegX:
187-
return cullFaceTo(models[bsid][pid].west.cull);
186+
return cullFaceTo(blockModels[bsid].parts[pid].west.cull);
188187
case ::PosX:
189-
return cullFaceTo(models[bsid][pid].east.cull);
188+
return cullFaceTo(blockModels[bsid].parts[pid].east.cull);
190189
case ::NegZ:
191-
return cullFaceTo(models[bsid][pid].north.cull);
190+
return cullFaceTo(blockModels[bsid].parts[pid].north.cull);
192191
case ::PosZ:
193-
return cullFaceTo(models[bsid][pid].south.cull);
192+
return cullFaceTo(blockModels[bsid].parts[pid].south.cull);
194193
case ::NegY:
195-
return cullFaceTo(models[bsid][pid].down.cull);
194+
return cullFaceTo(blockModels[bsid].parts[pid].down.cull);
196195
case ::PosY:
197-
return cullFaceTo(models[bsid][pid].up.cull);
196+
return cullFaceTo(blockModels[bsid].parts[pid].up.cull);
198197
}
199198
}
200199

@@ -206,28 +205,28 @@ auto OMModelPrecompiler::queryPartFaceUV(int bsid, int pid, openminecraft::rende
206205
{
207206
default:
208207
case ::NegX:
209-
uv0 = models[bsid][pid].west.uv0;
210-
uv1 = models[bsid][pid].west.uv1;
208+
uv0 = blockModels[bsid].parts[pid].west.uv0;
209+
uv1 = blockModels[bsid].parts[pid].west.uv1;
211210
break;
212211
case ::PosX:
213-
uv0 = models[bsid][pid].east.uv0;
214-
uv1 = models[bsid][pid].east.uv1;
212+
uv0 = blockModels[bsid].parts[pid].east.uv0;
213+
uv1 = blockModels[bsid].parts[pid].east.uv1;
215214
break;
216215
case ::NegZ:
217-
uv0 = models[bsid][pid].north.uv0;
218-
uv1 = models[bsid][pid].north.uv1;
216+
uv0 = blockModels[bsid].parts[pid].north.uv0;
217+
uv1 = blockModels[bsid].parts[pid].north.uv1;
219218
break;
220219
case ::PosZ:
221-
uv0 = models[bsid][pid].south.uv0;
222-
uv1 = models[bsid][pid].south.uv1;
220+
uv0 = blockModels[bsid].parts[pid].south.uv0;
221+
uv1 = blockModels[bsid].parts[pid].south.uv1;
223222
break;
224223
case ::NegY:
225-
uv0 = models[bsid][pid].down.uv0;
226-
uv1 = models[bsid][pid].down.uv1;
224+
uv0 = blockModels[bsid].parts[pid].down.uv0;
225+
uv1 = blockModels[bsid].parts[pid].down.uv1;
227226
break;
228227
case ::PosY:
229-
uv0 = models[bsid][pid].up.uv0;
230-
uv1 = models[bsid][pid].up.uv1;
228+
uv0 = blockModels[bsid].parts[pid].up.uv0;
229+
uv1 = blockModels[bsid].parts[pid].up.uv1;
231230
break;
232231
}
233232
return {uv0.x, uv0.y, uv1.x, uv1.y};
@@ -240,38 +239,38 @@ auto OMModelPrecompiler::queryPartFaceRotation(int bsid, int pid,
240239
{
241240
default:
242241
case ::NegX:
243-
return models[bsid][pid].west.rotation / 90;
242+
return blockModels[bsid].parts[pid].west.rotation / 90;
244243
case ::PosX:
245-
return models[bsid][pid].east.rotation / 90;
244+
return blockModels[bsid].parts[pid].east.rotation / 90;
246245
case ::NegZ:
247-
return models[bsid][pid].north.rotation / 90;
246+
return blockModels[bsid].parts[pid].north.rotation / 90;
248247
case ::PosZ:
249-
return models[bsid][pid].south.rotation / 90;
248+
return blockModels[bsid].parts[pid].south.rotation / 90;
250249
case ::NegY:
251-
return models[bsid][pid].down.rotation / 90;
250+
return blockModels[bsid].parts[pid].down.rotation / 90;
252251
case ::PosY:
253-
return models[bsid][pid].up.rotation / 90;
252+
return blockModels[bsid].parts[pid].up.rotation / 90;
254253
}
255254
}
256255

257256
auto OMModelPrecompiler::queryPartRotationAxis(int bsid, int pid) -> int
258257
{
259-
return models[bsid][pid].rotateAxis;
258+
return blockModels[bsid].parts[pid].rotateAxis;
260259
}
261260

262261
auto OMModelPrecompiler::queryPartRotationCenter(int bsid, int pid) -> glm::vec3
263262
{
264-
return models[bsid][pid].rotateOrigin;
263+
return blockModels[bsid].parts[pid].rotateOrigin;
265264
}
266265

267266
auto OMModelPrecompiler::queryPartRotationAngle(int bsid, int pid) -> int
268267
{
269-
return static_cast<float>(models[bsid][pid].rotateAngle + 45) / 22.5f;
268+
return static_cast<float>(blockModels[bsid].parts[pid].rotateAngle + 45) / 22.5f;
270269
}
271270

272271
auto OMModelPrecompiler::querySoild(int bsid) -> bool
273272
{
274-
return modelSoild[bsid];
273+
return blockModels[bsid].soild;
275274
}
276275

277276
auto OMModelPrecompiler::loadModelPart(OMIdentifier i, bool soild) -> int
@@ -318,13 +317,13 @@ auto rotateVoxelElement90(const glm::vec3 &from, const glm::vec3 &to, int i) ->
318317
auto OMModelPrecompiler::loadModelPartWithArgs(OMIdentifier i, int xrot, int yrot, int zrot, bool lockuv, bool soild)
319318
-> int
320319
{
321-
models.resize(modelId + 1);
320+
modelParts.resize(modelId + 1);
322321
modelSoild.resize(modelId + 1);
323322
modelAmbientOcculusion.resize(modelId + 1);
324323
modelComplex.resize(modelId + 1);
325324

326325
modelComplex[modelId] = false;
327-
models[modelId] = {};
326+
modelParts[modelId] = {};
328327

329328
auto prem = precompile(i);
330329
modelAmbientOcculusion[modelId] =
@@ -516,7 +515,7 @@ auto OMModelPrecompiler::loadModelPartWithArgs(OMIdentifier i, int xrot, int yro
516515
tzrot -= 90;
517516
}
518517

519-
models[modelId].emplace_back(wrapPart(p));
518+
modelParts[modelId].emplace_back(wrapPart(p));
520519
}
521520
}
522521

@@ -696,4 +695,21 @@ auto OMModelPrecompiler::wrapFace(std::shared_ptr<openminecraft::io::json::OMJso
696695
face->getMap().count("rotation") ? static_cast<int>(face->getMap()["rotation"]->getNumber()) : 0,
697696
textureAtlas.subtex.count(ident) == 0};
698697
}
698+
699+
auto OMModelPrecompiler::composeBlock(std::vector<int> partids, bool soild) -> int
700+
{
701+
auto &m = blockModels.emplace_back();
702+
m.soild = soild;
703+
for (auto i : partids)
704+
{
705+
for (auto &mp : modelParts[i])
706+
{
707+
m.parts.push_back(mp);
708+
m.partComplex.push_back(modelComplex[i]);
709+
m.partAmbientOcculusion.push_back(modelAmbientOcculusion[i]);
710+
}
711+
}
712+
713+
return blockModels.size() - 1;
714+
}
699715
} // namespace openminecraftshell::data

0 commit comments

Comments
 (0)