the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "HumanoidModel.h"
3#include "..\Minecraft.World\Mth.h"
4#include "..\Minecraft.World\Entity.h"
5#include "ModelPart.h"
6
7// 4J added
8
9ModelPart * HumanoidModel::AddOrRetrievePart(SKIN_BOX *pBox)
10{
11 ModelPart *pAttachTo=NULL;
12
13 switch(pBox->ePart)
14 {
15 case eBodyPart_Head:
16 pAttachTo=head;
17 break;
18 case eBodyPart_Body:
19 pAttachTo=body;
20 break;
21 case eBodyPart_Arm0:
22 pAttachTo=arm0;
23 break;
24 case eBodyPart_Arm1:
25 pAttachTo=arm1;
26 break;
27 case eBodyPart_Leg0:
28 pAttachTo=leg0;
29 break;
30 case eBodyPart_Leg1:
31 pAttachTo=leg1;
32 break;
33 }
34
35 // first check this box doesn't already exist
36 ModelPart *pNewBox = pAttachTo->retrieveChild(pBox);
37
38 if(pNewBox)
39 {
40 if((pNewBox->getfU()!=(int)pBox->fU) || (pNewBox->getfV()!=(int)pBox->fV))
41 {
42 app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Box geometry was found, but with different uvs\n");
43 pNewBox=NULL;
44 }
45 }
46 if(pNewBox==NULL)
47 {
48 //app.DebugPrintf("HumanoidModel::AddOrRetrievePart - Adding box to model part\n");
49
50 pNewBox = new ModelPart(this, (int)pBox->fU, (int)pBox->fV);
51 pNewBox->visible=false;
52 pNewBox->addHumanoidBox(pBox->fX, pBox->fY, pBox->fZ, pBox->fW, pBox->fH, pBox->fD, 0);
53 // 4J-PB - don't compile here, since the lighting isn't set up. It'll be compiled on first use.
54 //pNewBox->compile(1.0f/16.0f);
55 pAttachTo->addChild(pNewBox);
56 }
57
58 return pNewBox;
59}
60
61void HumanoidModel::_init(float g, float yOffset, int texWidth, int texHeight)
62{
63 this->texWidth = texWidth;
64 this->texHeight = texHeight;
65
66 m_fYOffset=yOffset;
67 cloak = new ModelPart(this, 0, 0);
68 cloak->addHumanoidBox(-5, -0, -1, 10, 16, 1, g); // Cloak
69
70 ear = new ModelPart(this, 24, 0);
71 ear->addHumanoidBox(-3, -6, -1, 6, 6, 1, g); // Ear
72
73 head = new ModelPart(this, 0, 0);
74 head->addHumanoidBox(-4, -8, -4, 8, 8, 8, g); // Head
75 head->setPos(0, 0 + yOffset, 0);
76
77 hair = new ModelPart(this, 32, 0);
78 hair->addHumanoidBox(-4, -8, -4, 8, 8, 8, g + 0.5f); // Head
79 hair->setPos(0, 0 + yOffset, 0);
80
81 body = new ModelPart(this, 16, 16);
82 body->addHumanoidBox(-4, 0, -2, 8, 12, 4, g); // Body
83 body->setPos(0, 0 + yOffset, 0);
84
85 arm0 = new ModelPart(this, 24 + 16, 16);
86 arm0->addHumanoidBox(-3, -2, -2, 4, 12, 4, g); // Arm0
87 arm0->setPos(-5, 2 + yOffset, 0);
88
89 arm1 = new ModelPart(this, 24 + 16, 16);
90 arm1->bMirror = true;
91 arm1->addHumanoidBox(-1, -2, -2, 4, 12, 4, g); // Arm1
92 arm1->setPos(5, 2 + yOffset, 0);
93
94 leg0 = new ModelPart(this, 0, 16);
95 leg0->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg0
96 leg0->setPos(-1.9, 12 + yOffset, 0);
97
98 leg1 = new ModelPart(this, 0, 16);
99 leg1->bMirror = true;
100 leg1->addHumanoidBox(-2, 0, -2, 4, 12, 4, g); // Leg1
101 leg1->setPos(1.9, 12 + yOffset, 0);
102
103 // 4J added - compile now to avoid random performance hit first time cubes are rendered
104 // 4J Stu - Not just performance, but alpha+depth tests don't work right unless we compile here
105 cloak->compile(1.0f/16.0f);
106 ear->compile(1.0f/16.0f);
107 head->compile(1.0f/16.0f);
108 body->compile(1.0f/16.0f);
109 arm0->compile(1.0f/16.0f);
110 arm1->compile(1.0f/16.0f);
111 leg0->compile(1.0f/16.0f);
112 leg1->compile(1.0f/16.0f);
113 hair->compile(1.0f/16.0f);
114
115 holdingLeftHand=0;
116 holdingRightHand=0;
117 sneaking=false;
118 idle=false;
119 bowAndArrow=false;
120
121 // 4J added
122 eating = false;
123 eating_t = 0.0f;
124 eating_swing = 0.0f;
125 m_uiAnimOverrideBitmask = 0L;
126}
127
128HumanoidModel::HumanoidModel() : Model()
129{
130 _init(0, 0, 64, 32);
131}
132
133HumanoidModel::HumanoidModel(float g) : Model()
134{
135 _init(g, 0, 64, 32);
136}
137
138HumanoidModel::HumanoidModel(float g, float yOffset, int texWidth, int texHeight) : Model()
139{
140 _init(g,yOffset,texWidth,texHeight);
141}
142
143void HumanoidModel::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled)
144{
145 if(entity != NULL)
146 {
147 m_uiAnimOverrideBitmask=entity->getAnimOverrideBitmask();
148 }
149
150 setupAnim(time, r, bob, yRot, xRot, scale, entity, m_uiAnimOverrideBitmask);
151
152 if (young)
153 {
154 float ss = 2.0f;
155 glPushMatrix();
156 glScalef(1.5f / ss, 1.5f / ss, 1.5f / ss);
157 glTranslatef(0, 16 * scale, 0);
158 head->render(scale, usecompiled);
159 glPopMatrix();
160 glPushMatrix();
161 glScalef(1 / ss, 1 / ss, 1 / ss);
162 glTranslatef(0, 24 * scale, 0);
163 body->render(scale, usecompiled);
164 arm0->render(scale, usecompiled);
165 arm1->render(scale, usecompiled);
166 leg0->render(scale, usecompiled);
167 leg1->render(scale, usecompiled);
168 hair->render(scale, usecompiled);
169 glPopMatrix();
170 }
171 else
172 {
173 head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0);
174 body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0);
175 arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0);
176 arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0);
177 leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0);
178 leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0);
179 hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
180 }
181}
182
183void HumanoidModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr<Entity> entity, unsigned int uiBitmaskOverrideAnim)
184{
185 //bool bIsAttacking = (attackTime > -9990.0f);
186
187 {
188 head->yRot = yRot / (float) (180.0f / PI);
189 head->xRot = xRot / (float) (180.0f / PI);
190 hair->yRot = head->yRot;
191 hair->xRot = head->xRot;
192 body->z = 0.0f;
193
194 // Does the skin have an override for anim?
195
196 if(uiBitmaskOverrideAnim&(1<<eAnim_ArmsDown))
197 {
198 arm0->xRot=0.0f;
199 arm1->xRot=0.0f;
200 arm0->zRot = 0.0f;
201 arm1->zRot = 0.0f;
202
203 }
204 else if(uiBitmaskOverrideAnim&(1<<eAnim_ArmsOutFront))
205 {
206 arm0->xRot=-HALF_PI;
207 arm1->xRot=-HALF_PI;
208 arm0->zRot = 0.0f;
209 arm1->zRot = 0.0f;
210 }
211 else if(uiBitmaskOverrideAnim&(1<<eAnim_SingleArms))
212 {
213 arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
214 arm1->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
215 arm0->zRot = 0.0f;
216 arm1->zRot = 0.0f;
217 }
218 // 4J-PB - Weeping Angel - does't look good holding something in the arm that's up
219 else if((uiBitmaskOverrideAnim&(1<<eAnim_StatueOfLiberty)) && (holdingRightHand==0) && (attackTime==0.0f))
220 {
221 arm0->xRot = -PI;
222 arm0->zRot = -0.3f;
223 arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
224 arm1->zRot = 0.0f;
225 }
226 else
227 {
228 arm0->xRot = (Mth::cos(time * 0.6662f + PI) * 2.0f) * r * 0.5f;
229 arm1->xRot = ( Mth::cos(time * 0.6662f) * 2.0f) * r * 0.5f;
230 arm0->zRot = 0.0f;
231 arm1->zRot = 0.0f;
232 }
233 // arm0.zRot = ((float) (util.Mth.cos(time * 0.2312f) + 1) * 1) * r;
234
235
236 // arm1.zRot = ((float) (util.Mth.cos(time * 0.2812f) - 1) * 1) * r;
237
238
239 leg0->yRot = 0.0f;
240 leg1->yRot = 0.0f;
241
242 if (riding)
243 {
244 if(uiBitmaskOverrideAnim&(1<<eAnim_SmallModel) == 0)
245 {
246 arm0->xRot += -HALF_PI * 0.4f;
247 arm1->xRot += -HALF_PI * 0.4f;
248 leg0->xRot = -HALF_PI * 0.8f;
249 leg1->xRot = -HALF_PI * 0.8f;
250 leg0->yRot = HALF_PI * 0.2f;
251 leg1->yRot = -HALF_PI * 0.2f;
252 }
253 else
254 {
255 arm0->xRot += -HALF_PI * 0.4f;
256 arm1->xRot += -HALF_PI * 0.4f;
257 leg0->xRot = -HALF_PI * 0.4f;
258 leg1->xRot = -HALF_PI * 0.4f;
259 }
260 }
261 else if(idle && !sneaking )
262 {
263 leg0->xRot = -HALF_PI;
264 leg1->xRot = -HALF_PI;
265 leg0->yRot = HALF_PI * 0.2f;
266 leg1->yRot = -HALF_PI * 0.2f;
267 }
268 else if(uiBitmaskOverrideAnim&(1<<eAnim_NoLegAnim))
269 {
270 leg0->xRot=0.0f;
271 leg0->zRot=0.0f;
272 leg1->xRot=0.0f;
273 leg1->zRot=0.0f;
274 leg0->yRot = 0.0f;
275 leg1->yRot = 0.0f;
276 }
277 else if(uiBitmaskOverrideAnim&(1<<eAnim_SingleLegs))
278 {
279 leg0->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
280 leg1->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
281 }
282 else
283 {
284 leg0->xRot = ( Mth::cos(time * 0.6662f) * 1.4f) * r;
285 leg1->xRot = ( Mth::cos(time * 0.6662f + PI) * 1.4f) * r;
286 }
287
288
289 if (holdingLeftHand != 0)
290 {
291 arm1->xRot = arm1->xRot * 0.5f - HALF_PI * 0.2f * holdingLeftHand;
292 }
293 if (holdingRightHand != 0)
294 {
295 arm0->xRot = arm0->xRot * 0.5f - HALF_PI * 0.2f * holdingRightHand;
296 }
297
298 arm0->yRot = 0.0f;
299 arm1->yRot = 0.0f;
300 if (attackTime > -9990.0f)
301 {
302 float swing = attackTime;
303 body->yRot = Mth::sin(sqrt(swing) * PI * 2.0f) * 0.2f;
304 arm0->z = Mth::sin(body->yRot) * 5.0f;
305 arm0->x = -Mth::cos(body->yRot) * 5.0f;
306 arm1->z = -Mth::sin(body->yRot) * 5.0f;
307 arm1->x = Mth::cos(body->yRot) * 5.0f;
308 arm0->yRot += body->yRot;
309 arm1->yRot += body->yRot;
310 arm1->xRot += body->yRot;
311
312 swing = 1.0f - attackTime;
313 swing *= swing;
314 swing *= swing;
315 swing = 1.0f - swing;
316 float aa = Mth::sin(swing * PI);
317 float bb = Mth::sin(attackTime * PI) * -(head->xRot - 0.7f) * 0.75f;
318 arm0->xRot -= aa * 1.2f + bb; // 4J - changed 1.2 -> 1.2f
319 arm0->yRot += body->yRot * 2.0f;
320
321 if((uiBitmaskOverrideAnim&(1<<eAnim_StatueOfLiberty))&& (holdingRightHand==0) && (attackTime==0.0f))
322 {
323 arm0->zRot -= Mth::sin(attackTime * PI) * -0.4f;
324 }
325 else
326 {
327 arm0->zRot = Mth::sin(attackTime * PI) * -0.4f;
328 }
329 }
330
331 // 4J added
332 if( eating )
333 {
334 // These factors are largely lifted from ItemInHandRenderer to try and keep the 3rd person eating animation as similar as possible
335 float is = 1 - eating_swing;
336 is = is * is * is;
337 is = is * is * is;
338 is = is * is * is;
339 float iss = 1 - is;
340 arm0->xRot = - Mth::abs(Mth::cos(eating_t / 4.0f * PI) * 0.1f) * (eating_swing > 0.2 ? 1.0f : 0.0f) * 2.0f; // This factor is the chomping bit (conditional factor is so that he doesn't eat whilst the food is being pulled away at the end)
341 arm0->yRot -= iss * 0.5f; // This factor and the following to the general arm movement through the life of the swing
342 arm0->xRot -= iss * 1.2f;
343
344 }
345
346 if (sneaking)
347 {
348 if(uiBitmaskOverrideAnim&(1<<eAnim_SmallModel))
349 {
350 body->xRot = -0.5f;
351 leg0->xRot -= 0.0f;
352 leg1->xRot -= 0.0f;
353 arm0->xRot += 0.4f;
354 arm1->xRot += 0.4f;
355 leg0->z = -4.0f;
356 leg1->z = -4.0f;
357 body->z = 2.0f;
358 body->y = 0.0f;
359 arm0->y = 2.0f;
360 arm1->y = 2.0f;
361 leg0->y = +9.0f;
362 leg1->y = +9.0f;
363 head->y = +1.0f;
364 hair->y = +1.0f;
365 ear->y = +1.0f;
366 cloak->y = 0.0f;
367 }
368 else
369 {
370 body->xRot = 0.5f;
371 leg0->xRot -= 0.0f;
372 leg1->xRot -= 0.0f;
373 arm0->xRot += 0.4f;
374 arm1->xRot += 0.4f;
375 leg0->z = +4.0f;
376 leg1->z = +4.0f;
377 body->y = 0.0f;
378 arm0->y = 2.0f;
379 arm1->y = 2.0f;
380 leg0->y = +9.0f;
381 leg1->y = +9.0f;
382 head->y = +1.0f;
383 hair->y = +1.0f;
384 ear->y = +1.0f;
385 cloak->y = 0.0f;
386 }
387 }
388 else
389 {
390 body->xRot = 0.0f;
391 leg0->z = 0.1f;
392 leg1->z = 0.1f;
393
394 if(!riding && idle)
395 {
396 leg0->y = 22.0f;
397 leg1->y = 22.0f;
398 body->y = 10.0f;
399 arm0->y = 12.0f;
400 arm1->y = 12.0f;
401 head->y = 10.0f;
402 hair->y = 10.0f;
403 ear->y = 11.0f;
404 cloak->y = 10.0f;
405 }
406 else
407 {
408 leg0->y = 12.0f;
409 leg1->y = 12.0f;
410 body->y = 0.0f;
411 arm0->y = 2.0f;
412 arm1->y = 2.0f;
413 head->y = 0.0f;
414 hair->y = 0.0f;
415 ear->y = 1.0f;
416 cloak->y = 0.0f;
417 }
418 }
419
420
421 arm0->zRot += ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
422 arm1->zRot -= ((Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
423 arm0->xRot += ((Mth::sin(bob * 0.067f)) * 0.05f);
424 arm1->xRot -= ((Mth::sin(bob * 0.067f)) * 0.05f);
425
426 if (bowAndArrow)
427 {
428 float attack2 = 0.0f;
429 float attack = 0.0f;
430
431 arm0->zRot = 0.0f;
432 arm1->zRot = 0.0f;
433 arm0->yRot = -(0.1f - attack2 * 0.6f) + head->yRot;
434 arm1->yRot = +(0.1f - attack2 * 0.6f) + head->yRot + 0.4f;
435 arm0->xRot = -HALF_PI + head->xRot;
436 arm1->xRot = -HALF_PI + head->xRot;
437 arm0->xRot -= attack2 * 1.2f - attack * 0.4f;
438 arm1->xRot -= attack2 * 1.2f - attack * 0.4f;
439 arm0->zRot += ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
440 arm1->zRot -= ((float) (Mth::cos(bob * 0.09f)) * 0.05f + 0.05f);
441 arm0->xRot += ((float) (Mth::sin(bob * 0.067f)) * 0.05f);
442 arm1->xRot -= ((float) (Mth::sin(bob * 0.067f)) * 0.05f);
443 }
444 }
445}
446
447void HumanoidModel::renderHair(float scale,bool usecompiled)
448{
449 hair->yRot = head->yRot;
450 hair->xRot = head->xRot;
451 hair->render(scale,usecompiled);
452}
453
454void HumanoidModel::renderEars(float scale,bool usecompiled)
455{
456 ear->yRot = head->yRot;
457 ear->xRot = head->xRot;
458 ear->x=0;
459 ear->y=0;
460 ear->render(scale,usecompiled);
461}
462
463void HumanoidModel::renderCloak(float scale,bool usecompiled)
464{
465 cloak->render(scale,usecompiled);
466}
467
468void HumanoidModel::render(HumanoidModel *model, float scale, bool usecompiled)
469{
470 head->yRot = model->head->yRot;
471 head->y = model->head->y;
472 head->xRot = model->head->xRot;
473 hair->y = head->y;
474 hair->yRot = head->yRot;
475 hair->xRot = head->xRot;
476
477 body->yRot = model->body->yRot;
478
479 arm0->xRot = model->arm0->xRot;
480 arm0->yRot = model->arm0->yRot;
481 arm0->zRot = model->arm0->zRot;
482
483 arm1->xRot = model->arm1->xRot;
484 arm1->yRot = model->arm1->yRot;
485 arm1->zRot = model->arm1->zRot;
486
487 leg0->xRot = model->leg0->xRot;
488 leg1->xRot = model->leg1->xRot;
489
490 head->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHead))>0);
491 body->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderTorso))>0);
492 arm0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm0))>0);
493 arm1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderArm1))>0);
494 leg0->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg0))>0);
495 leg1->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderLeg1))>0);
496 hair->render(scale, usecompiled,(m_uiAnimOverrideBitmask&(1<<eAnim_DisableRenderHair))>0);
497}