the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 497 lines 14 kB view raw
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}