From ec1771d04cefd48e93d9fd3e1651a4438ceb3da5 Mon Sep 17 00:00:00 2001 From: Nils Gaitzsch Date: Mon, 7 Sep 2020 21:08:48 +0200 Subject: [PATCH] Animating Lara's upper body with certain weapon types --- TR5Main/Renderer/Renderer11Lara.cpp | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/TR5Main/Renderer/Renderer11Lara.cpp b/TR5Main/Renderer/Renderer11Lara.cpp index 5ddbc7fee..770fa950f 100644 --- a/TR5Main/Renderer/Renderer11Lara.cpp +++ b/TR5Main/Renderer/Renderer11Lara.cpp @@ -10,9 +10,38 @@ #include "level.h" #include "GameFlowScript.h" #include +#include "lara_fire.h" using namespace T5M::Renderer; extern GameFlow *g_GameFlow; + +bool shouldAnimateUpperBody(const LARA_WEAPON_TYPE& weapon) { + ITEM_INFO& laraItem = *LaraItem; + LaraInfo& laraInfo = Lara; + switch(weapon){ + case WEAPON_ROCKET_LAUNCHER: + case WEAPON_HARPOON_GUN: + case WEAPON_GRENADE_LAUNCHER: + case WEAPON_CROSSBOW: + case WEAPON_SHOTGUN: + return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW); + break; + case WEAPON_HK: + { + //Animate upper body if Lara is shooting from shoulder OR if Lara is standing still/turning + int baseAnim = Objects[WeaponObject(weapon)].animIndex; + if(laraInfo.rightArm.animNumber - baseAnim == 0 || laraInfo.rightArm.animNumber - baseAnim == 2 || laraInfo.rightArm.animNumber - baseAnim == 4){ + return true; + } else + return (LaraItem->currentAnimState == LS_STOP || LaraItem->currentAnimState == LS_TURN_FAST || LaraItem->currentAnimState == LS_TURN_LEFT_SLOW || LaraItem->currentAnimState == LS_TURN_RIGHT_SLOW); + } + break; + default: + return false; + break; + + } +} void Renderer11::updateLaraAnimations(bool force) { Matrix translation; @@ -80,7 +109,29 @@ void Renderer11::updateLaraAnimations(bool force) case WEAPON_GRENADE_LAUNCHER: case WEAPON_ROCKET_LAUNCHER: case WEAPON_HARPOON_GUN: + { + ANIM_FRAME* shotgunFramePtr; + + // Left arm + mask = MESH_BITS(LM_LINARM) | MESH_BITS(LM_LOUTARM) | MESH_BITS(LM_LHAND); + + if(shouldAnimateUpperBody(Lara.gunType)){ + mask |= MESH_BITS(LM_TORSO) | MESH_BITS(LM_HEAD); + } + shotgunFramePtr = &g_Level.Frames[Lara.leftArm.frameBase + Lara.leftArm.frameNumber]; + updateAnimation(item, laraObj, &shotgunFramePtr, 0, 1, mask); + + // Right arm + mask = MESH_BITS(LM_RINARM) | MESH_BITS(LM_ROUTARM) | MESH_BITS(LM_RHAND); + if(shouldAnimateUpperBody(Lara.gunType)){ + mask |= MESH_BITS(LM_TORSO) | MESH_BITS(LM_HEAD); + } + shotgunFramePtr = &g_Level.Frames[Lara.rightArm.frameBase + Lara.rightArm.frameNumber]; + updateAnimation(item, laraObj, &shotgunFramePtr, 0, 1, mask); + } + break; case WEAPON_REVOLVER: + { ANIM_FRAME* shotgunFramePtr; // Left arm @@ -92,6 +143,7 @@ void Renderer11::updateLaraAnimations(bool force) mask = MESH_BITS(LM_RINARM) | MESH_BITS(LM_ROUTARM) | MESH_BITS(LM_RHAND); shotgunFramePtr = &g_Level.Frames[Lara.rightArm.frameBase + Lara.rightArm.frameNumber]; updateAnimation(item, laraObj, &shotgunFramePtr, 0, 1, mask); + } break; case WEAPON_PISTOLS: