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}
8483auto 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
9493auto 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
103102auto 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
114113auto 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
119118auto OMModelPrecompiler::queryNumParts (int bsid) -> int
120119{
121- return models [bsid].size ();
120+ return blockModels [bsid]. parts .size ();
122121}
123122auto 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}
142141auto 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}
161160auto 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
257256auto OMModelPrecompiler::queryPartRotationAxis (int bsid, int pid) -> int
258257{
259- return models [bsid][pid].rotateAxis ;
258+ return blockModels [bsid]. parts [pid].rotateAxis ;
260259}
261260
262261auto OMModelPrecompiler::queryPartRotationCenter (int bsid, int pid) -> glm::vec3
263262{
264- return models [bsid][pid].rotateOrigin ;
263+ return blockModels [bsid]. parts [pid].rotateOrigin ;
265264}
266265
267266auto 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
272271auto OMModelPrecompiler::querySoild (int bsid) -> bool
273272{
274- return modelSoild [bsid];
273+ return blockModels [bsid]. soild ;
275274}
276275
277276auto OMModelPrecompiler::loadModelPart (OMIdentifier i, bool soild) -> int
@@ -318,13 +317,13 @@ auto rotateVoxelElement90(const glm::vec3 &from, const glm::vec3 &to, int i) ->
318317auto 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