Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <tgSystem.h>
- #include "CPhysicsManager.h"
- #include "CCharacter.h"
- #include "CharSelEnums.h"
- #include "CAudioHandler.h"
- #include "CUIHandler.h"
- #include "CGrenade.h"
- #include "CBodyManager.h"
- #include "GameStateMachine/CGameStates.h"
- #include "CTileManager.h"
- #include "CApplication.h"
- #include "CCamera.h"
- #include "CClock.h"
- #include "CSettings.h"
- #include "AppRoot.h"
- #include <tgCCore.h>
- #include "Managers/CModelManager.h"
- #include <tgCPluginInput.h>
- #include <tgCQuadManager.h>
- #include <tgCTextureManager.h>
- #include <tgCDebugManager.h>
- #include "Managers/CLightManager.h"
- #include "tgCLine3D.h"
- #include "CParticleEmitter.h"
- #include "CAnimationHandler.h"
- #include "Managers/CConfigManager.h"
- #include "tgCInterpolator.h"
- #include "tgCAnimation.h"
- #include "CAnimationHandler.h"
- #include "Managers/CAnimationManager.h"
- #include "CParticleManager.h"
- #include "CParticle.h"
- #include "Renderer/CRenderCallBacks.h"
- #if defined (TG_PS4)
- #include "tgCPluginInput_PS4.h"
- #endif
- #include <tgMemoryDisable.h>
- //////////////////////////////////////////////////////////////////////////
- ////////////////////////////// CApplication //////////////////////////////
- // //
- // Info:
- // //
- //*///////////////////////////////////////////////////////////////////////
- CCharacter::CCharacter(tgBool IsPlayerCharacter, tgUInt8 ControllerIndex, tgSInt8 PickedCharacter, tgSInt8 PickedColor)
- : m_CurrentAnimation(ANIMATION_IDLE)
- , m_NextAnimation(ANIMATION_IDLE)
- , m_SubAnimation(ANIMATION_SHOOT)
- , m_SubAnimationHit(ANIMATION_HIT)
- , m_BlendValue(1.0f)
- , m_BlendSpeed(4.0f)
- , m_NumRespawnTries(0)
- {
- m_PickedColor = PickedColor;
- m_PickedChar = PickedCharacter;
- m_HasSpawned = false;
- m_IsPlayerCharacter = IsPlayerCharacter;
- m_ControllerIndex = ControllerIndex;
- m_Connected = false;
- m_OccupiedRespawn = 0;
- m_GodMode = false;
- m_InvulnerabilityTime = 2.0f;
- m_InvulnerabilityTimer = 2.0f;
- m_IsInvulnerable = false;
- //If Windows is defined, use the CGamePad class based on XINPUT for Controller input
- m_pGamePad = new CGamepad();
- m_pGamePad->Create(m_ControllerIndex);
- m_Connected = m_pGamePad->GetConnected();
- if (m_Connected)
- m_PlayerTag = m_pGamePad->GetIndex();
- else
- m_PlayerTag = 0;
- m_TaggedBy = m_PlayerTag;
- // Set model of character, this is a placeholder way of handling it
- // The models and textures should be taken from character select state
- InitModelAndTextures(PickedCharacter, PickedColor);
- m_ModelMatrix = new tgCMatrix(tgCMatrix::Identity);
- m_pShadowModel = CModelManager::GetInstance().LoadModel("models/ball_shadow.tfm", "grenade_shadow", false);
- m_pShadowModel->GetMesh(0)->GetSubMesh(0)->Material.SetColor(tgCColor(0.0f, 0.0f, 0.0f, 0.5f));
- m_Score = 0;
- // Movement variables
- tgFloat movementspeed, inairspeed, rotationspeed, jumpheight, mass;
- // Combat variables
- tgFloat shootingforce, shootingminforce, shootingmaxforce, shootingcooldown, chargerate, shootanglelow, shootanglehigh;
- // Camera variables
- tgFloat camposy, camposz;
- // Misc variables
- tgFloat rumblemax, respawntime;
- tgSInt32 rumbleactivated;
- if (CConfigManager::OpenFile("data/settings/Settings_Players.ini"))
- {
- CConfigManager::ReadSetting("Movement", "movementspeed", NULL, NULL, &movementspeed);
- CConfigManager::ReadSetting("Movement", "inairspeed", NULL, NULL, &inairspeed);
- CConfigManager::ReadSetting("Movement", "rotationspeed", NULL, NULL, &rotationspeed);
- CConfigManager::ReadSetting("Movement", "jumpheight", NULL, NULL, &jumpheight);
- CConfigManager::ReadSetting("Movement", "mass", NULL, NULL, &mass);
- CConfigManager::ReadSetting("Combat", "shootingforce", NULL, NULL, &shootingforce);
- CConfigManager::ReadSetting("Combat", "shootingminforce", NULL, NULL, &shootingminforce);
- CConfigManager::ReadSetting("Combat", "shootingmaxforce", NULL, NULL, &shootingmaxforce);
- CConfigManager::ReadSetting("Combat", "shootingcooldown", NULL, NULL, &shootingcooldown);
- CConfigManager::ReadSetting("Combat", "shootanglehigh", NULL, NULL, &shootanglehigh);
- CConfigManager::ReadSetting("Combat", "shootanglelow", NULL, NULL, &shootanglelow);
- CConfigManager::ReadSetting("Combat", "chargerate", NULL, NULL, &chargerate);
- CConfigManager::ReadSetting("Camera", "camposy", NULL, NULL, &camposy);
- CConfigManager::ReadSetting("Camera", "camposz", NULL, NULL, &camposz);
- CConfigManager::ReadSetting("Misc", "rumbleactivated", NULL, &rumbleactivated, NULL);
- CConfigManager::ReadSetting("Misc", "rumblemax", NULL, NULL, &rumblemax);
- CConfigManager::ReadSetting("Misc", "respawntime", NULL, NULL, &respawntime);
- CConfigManager::CloseFile();
- }
- // Movement
- m_MovementSpeed = movementspeed;
- m_Sensitivity = rotationspeed;
- m_Mass = mass;
- m_JumpHeight = jumpheight;
- m_InAirSpeed = inairspeed;
- // Combat
- m_GrenadeForceMax = shootingmaxforce;
- m_GrenadeForceMin = shootingminforce;
- m_GrenadeForce = 0.f;
- m_GrenadeChargeRate = chargerate;
- m_ShootingForce = shootingforce;
- m_ShootingAngle = LOW_ANGLE;
- m_ShootingCooldownMax = shootingcooldown;
- m_ShootingCooldown = m_ShootingCooldownMax;
- m_AngleHigh = shootanglehigh;
- m_AngleLow = shootanglelow;
- m_Angle = m_AngleLow;
- m_LethalVelocityLimit = 35.0f;
- // Camera
- m_CamPosY = camposy;
- m_CamPosZ = camposz;
- // Physics
- m_pWorld = CPhysicsManager::GetInstance().GetWorld();
- InitPhysics();
- InitCam();
- // Animations
- InitAnimations(PickedCharacter);
- }
- void CCharacter::InitAnimations(tgSInt8 PickedChar) {
- ////////////////// ANIMATIONS //////////////////
- CAnimationManager& rAnimationManager = CAnimationManager::GetInstance();
- // Create interpolators for all regular animations
- // Load the animations
- if (PickedChar == Catceye) {
- m_pAnimations[ANIMATION_IDLE] = rAnimationManager.LoadAnimation("animations/joe_idle.tfa", "joe_Idle");
- m_pAnimations[ANIMATION_RUN] = rAnimationManager.LoadAnimation("animations/joe_run.tfa", "joe_Run");
- m_pAnimations[ANIMATION_SHOOT] = rAnimationManager.LoadAnimation("animations/joe_shoot.tfa", "joe_Shoot");
- m_pAnimations[ANIMATION_HIT] = rAnimationManager.LoadAnimation("animations/joe_hit.tfa", "joe_Hit");
- m_pAnimations[ANIMATION_CHARGEUP] = rAnimationManager.LoadAnimation("animations/joe_chargeup.tfa", "joe_Chargeup");
- m_pAnimations[ANIMATION_CHARGEUP_LOOP] = rAnimationManager.LoadAnimation("animations/joe_chargeup_loop.tfa", "joe_Chargeup_Loop");
- m_pAnimations[ANIMATION_LOWERBODY_JUMP] = rAnimationManager.LoadAnimation("animations/joe_jump.tfa", "Cupcake_Lowerbody_Jump");
- m_pAnimations[ANIMATION_LOWERBODY_STAND] = rAnimationManager.LoadAnimation("animations/cupcake_lowerbody_stand.tfa", "Cupcake_Lowerbody_Stand");
- m_pAnimations[ANIMATION_VICTORY] = rAnimationManager.LoadAnimation("animations/cactai_victory.tfa", "cactai_victory");
- m_pAnimations[ANIMATION_VICTORY_LOOP] = rAnimationManager.LoadAnimation("animations/cactai_victory_loop.tfa", "cactai_victory_loop");
- }
- else if (PickedChar == Zuki) {
- m_pAnimations[ANIMATION_IDLE] = rAnimationManager.LoadAnimation("animations/zuki_idle.tfa", "zuki_Idle");
- m_pAnimations[ANIMATION_RUN] = rAnimationManager.LoadAnimation("animations/zuki_run.tfa", "zuki_Run");
- m_pAnimations[ANIMATION_SHOOT] = rAnimationManager.LoadAnimation("animations/zuki_shoot.tfa", "zuki_Shoot");
- m_pAnimations[ANIMATION_HIT] = rAnimationManager.LoadAnimation("animations/zuki_hit.tfa", "zuki_Hit");
- m_pAnimations[ANIMATION_CHARGEUP] = rAnimationManager.LoadAnimation("animations/zuki_chargeup.tfa", "zuki_Chargeup");
- m_pAnimations[ANIMATION_CHARGEUP_LOOP] = rAnimationManager.LoadAnimation("animations/zuki_chargeup_loop.tfa", "zuki_Chargeup_Loop");
- m_pAnimations[ANIMATION_LOWERBODY_JUMP] = rAnimationManager.LoadAnimation("animations/zuki_jump.tfa", "zuki_Lowerbody_Jump");
- m_pAnimations[ANIMATION_LOWERBODY_STAND] = rAnimationManager.LoadAnimation("animations/zuki_lowerbody_stand.tfa", "zuki_Lowerbody_Stand");
- m_pAnimations[ANIMATION_VICTORY] = rAnimationManager.LoadAnimation("animations/zuki_victory.tfa", "zuki_Victory");
- }
- else if (PickedChar == Laguna) {
- m_pAnimations[ANIMATION_IDLE] = rAnimationManager.LoadAnimation("animations/laguna_idle.tfa", "laguna_Idle");
- m_pAnimations[ANIMATION_RUN] = rAnimationManager.LoadAnimation("animations/laguna_run.tfa", "laguna_Run");
- m_pAnimations[ANIMATION_SHOOT] = rAnimationManager.LoadAnimation("animations/laguna_shoot.tfa", "laguna_Shoot");
- m_pAnimations[ANIMATION_HIT] = rAnimationManager.LoadAnimation("animations/laguna_hit.tfa", "laguna_Hit");
- m_pAnimations[ANIMATION_CHARGEUP] = rAnimationManager.LoadAnimation("animations/laguna_chargeup.tfa", "laguna_Chargeup");
- m_pAnimations[ANIMATION_CHARGEUP_LOOP] = rAnimationManager.LoadAnimation("animations/laguna_chargeup_loop.tfa", "laguna_Chargeup_Loop");
- m_pAnimations[ANIMATION_LOWERBODY_JUMP] = rAnimationManager.LoadAnimation("animations/laguna_jump.tfa", "laguna_Lowerbody_Jump");
- m_pAnimations[ANIMATION_LOWERBODY_STAND] = rAnimationManager.LoadAnimation("animations/laguna_lowerbody_stand.tfa", "laguna_Lowerbody_Stand");
- m_pAnimations[ANIMATION_VICTORY] = rAnimationManager.LoadAnimation("animations/laguna_victory.tfa", "laguna_Victory");
- m_pAnimations[ANIMATION_VICTORY_LOOP] = rAnimationManager.LoadAnimation("animations/laguna_victory_loop.tfa", "laguna_victory_loop");
- }
- else {
- m_pAnimations[ANIMATION_IDLE] = rAnimationManager.LoadAnimation("animations/cupcake_idle.tfa", "Cupcake_Idle");
- m_pAnimations[ANIMATION_RUN] = rAnimationManager.LoadAnimation("animations/cupcake_run.tfa", "Cupcake_Run");
- m_pAnimations[ANIMATION_SHOOT] = rAnimationManager.LoadAnimation("animations/cupcake_shoot.tfa", "Cupcake_Shoot");
- m_pAnimations[ANIMATION_HIT] = rAnimationManager.LoadAnimation("animations/cupcake_hit.tfa", "Cupcake_Hit");
- m_pAnimations[ANIMATION_CHARGEUP] = rAnimationManager.LoadAnimation("animations/cupcake_chargeup.tfa", "Cupcake_Chargeup");
- m_pAnimations[ANIMATION_CHARGEUP_LOOP] = rAnimationManager.LoadAnimation("animations/cupcake_chargeup_loop.tfa", "Cupcake_Chargeup_Loop");
- m_pAnimations[ANIMATION_LOWERBODY_JUMP] = rAnimationManager.LoadAnimation("animations/cupcake_lowerbody_jump.tfa", "Cupcake_Lowerbody_Jump");
- m_pAnimations[ANIMATION_LOWERBODY_STAND] = rAnimationManager.LoadAnimation("animations/cupcake_lowerbody_stand.tfa", "Cupcake_Lowerbody_Stand");
- m_pAnimations[ANIMATION_VICTORY] = rAnimationManager.LoadAnimation("animations/cupcake_victory.tfa", "cupcake_Victory");
- }
- m_pInterpolators[INTERPOLATOR_CURRENT] = new tgCInterpolator(*m_pAnimations[m_CurrentAnimation]);
- m_pInterpolators[INTERPOLATOR_NEXT] = new tgCInterpolator(*m_pAnimations[m_CurrentAnimation]);
- m_pInterpolators[INTERPOLATOR_BLEND] = new tgCInterpolator(*m_pAnimations[m_CurrentAnimation]);
- m_pInterpolators[INTERPOLATOR_SUB] = new tgCInterpolator(*m_pAnimations[m_SubAnimation]);
- m_pInterpolators[INTERPOLATOR_SUB]->SetEndOfInterpolatorCallBack(ShootOnceAnimationCB, this);
- m_pInterpolators[INTERPOLATOR_SUB_HIT] = new tgCInterpolator(*m_pAnimations[m_SubAnimationHit]);
- m_pInterpolators[INTERPOLATOR_SUB_HIT]->SetEndOfInterpolatorCallBack(HitOnceAnimationCB, this);
- }
- void CCharacter::InitModelAndTextures(tgSInt8 PickedChar, tgSInt8 PickedColor) {
- tgCString CharName = "";
- tgCString Color = "";
- switch (PickedColor)
- {
- case Blue:
- {
- Color = "blue";
- break;
- }
- case Red:
- {
- Color = "red";
- break;
- }
- case Green:
- {
- Color = "green";
- break;
- }
- case Pink:
- {
- Color = "pink";
- break;
- }
- case Orange:
- {
- Color = "orange";
- break;
- }
- case Cyan:
- {
- Color = "cyan";
- break;
- }
- default:
- break;
- }
- switch (PickedChar)
- {
- case Laguna:
- {
- CharName = "laguna";
- break;
- }
- case Catceye:
- {
- CharName = "joe";
- break;
- }
- case CupCake:
- {
- CharName = "cupcake";
- break;
- }
- case Zuki:
- {
- CharName = "zuki";
- break;
- }
- default:
- break;
- }
- tgCString PlayerTextureName = tgCString("char_%s_%s", CharName.String(), Color.String());
- m_pModel = CModelManager::GetInstance().LoadModel(tgCString("models/char_%s.tfm", CharName.String()), CharName, true);
- tgCTexture* Texture = tgCTextureManager::GetInstance().Create(PlayerTextureName);
- if (PickedChar == Zuki)
- {
- m_pModel->GetMesh(0)->GetSubMesh(2)->Material.SetColormap(*Texture);
- }
- else
- {
- m_pModel->GetMesh(0)->GetSubMesh(0)->Material.SetColormap(*Texture);
- }
- }
- void CCharacter::InitPhysics(void)
- {
- tgFloat CharHeight = 2.20f;
- tgFloat CharWidth = 0.6f;
- hkVector4 VertexTop = hkVector4(0.0f, (CharHeight - CharWidth * 2) * 0.5f, 0.0f);
- hkVector4 VertexBot = hkVector4(0.0f, (CharHeight - CharWidth * 2) * -0.5f, 0.0f);
- hkVector4 CrouchVertexTop = hkVector4(0.0f, ((CharHeight / 3) - CharWidth * 2) * 0.5f, 0.0f);
- hkVector4 CrouchVertexBot = hkVector4(0.0f, (CharHeight - CharWidth * 2) * -0.5f, 0.0f);
- hknpShape* ShapeStand = hknpCapsuleShape::createCapsuleShape(VertexTop, VertexBot, CharWidth);
- //m_pShapeCrouch = hknpCapsuleShape::createCapsuleShape(CrouchVertexTop, CrouchVertexBot, CharWidth);
- m_AnalogJumpBoost = 0.0f;
- // Create rigid body
- hknpCharacterRigidBodyCinfo Info;
- Info.m_world = m_pWorld;
- Info.m_mass = m_Mass;
- Info.m_shape = ShapeStand;
- Info.m_up.set(hkVector4(0.0f, 1.0f, 0.0f));
- Info.m_weldingTolerance = 0.5f;
- for (tgUInt32 i = 0; i < CTileManager::GetInstance().GetAllTiles().size(); i++)
- {
- if (CTileManager::GetInstance().GetAllTiles().at(i)->GetType() == CTile::TILETYPE_RESPAWNPOINT) {
- m_RespawnTiles.push_back(CTileManager::GetInstance().GetAllTiles().at(i));
- }
- }
- tgUInt32 RespawnTile = GetAvailableRespawn(&m_RespawnTiles);
- m_NumRespawnTries = 0;
- tgCV3D RespawnPos;
- if (m_RespawnTiles.size() <= 0)
- RespawnPos = tgCV3D(-10.0f, 1.6f, 10.0f);
- else
- RespawnPos = m_RespawnTiles.at(RespawnTile)->GetPosition() + tgCV3D(0.0f, 1.6f, 0.0f);
- Info.m_position.set(hkVector4(RespawnPos.x, RespawnPos.y, RespawnPos.z));
- m_Position = RespawnPos;
- m_OccupiedRespawn = RespawnTile;
- // Info.m_maxSlope = 45.0f * HK_REAL_DEG_TO_RAD;
- Info.m_maxForce = 250.0f;
- m_pRigidbody = new hknpCharacterRigidBody(Info);
- // Create state machine
- hknpCharacterStateManager *pStateManager = new hknpCharacterStateManager();
- hknpCharacterStateOnGround *pStateOnGround = new hknpCharacterStateOnGround();
- pStateOnGround->setSpeed(0.30f);
- pStateManager->registerState(pStateOnGround, hknpCharacterState::HK_CHARACTER_ON_GROUND);
- pStateOnGround->removeReference();
- hknpCharacterStateInAir *pStateInAir = new hknpCharacterStateInAir();
- pStateInAir->setSpeed(m_InAirSpeed);
- pStateManager->registerState(pStateInAir, hknpCharacterState::HK_CHARACTER_IN_AIR);
- pStateInAir->removeReference();
- if (m_IsPlayerCharacter) {
- hknpCharacterStateJumping *pStateJumping = new hknpCharacterStateJumping();
- pStateJumping->setJumpHeight(m_JumpHeight);
- pStateManager->registerState(pStateJumping, hknpCharacterState::HK_CHARACTER_JUMPING);
- pStateJumping->removeReference();
- }
- // Set up context
- m_pContext = new hknpCharacterContext(pStateManager, hknpCharacterState::HK_CHARACTER_ON_GROUND);
- m_pContext->setCharacterType(hknpCharacterContext::HK_CHARACTER_RIGIDBODY);
- UpdateCam(0.0f);
- m_pWorld->markForWrite();
- m_pWorld->setBodyProperty<int>(m_pRigidbody->getBodyId(), 10008, 1);
- m_pWorld->setBodyProperty<int>(m_pRigidbody->getBodyId(), 10000, 1);
- m_pWorld->unmarkForWrite();
- m_pWorld->setBodyQuality(m_pRigidbody->getBodyId(), hknpBodyQualityId::PRESET_CHARACTER);
- ShapeStand->removeReference();
- pStateManager->removeReference();
- }
- CCharacter::~CCharacter(void)
- {
- RumbleController(0.0f);
- m_pContext->removeReference();
- #if defined (TG_WINDOWS)
- delete m_pGamePad;
- #elif defined(TG_PS4)
- //delete m_pPad; Caused crash
- #endif
- // Get reference to animation manager instance
- CAnimationManager& rAnimationManager = CAnimationManager::GetInstance();
- // Destroy the interpolators
- for (tgUInt32 InterpolatorIndex = 0; InterpolatorIndex < INTERPOLATOR_SIZE; ++InterpolatorIndex)
- {
- if (m_pInterpolators[InterpolatorIndex])
- delete m_pInterpolators[InterpolatorIndex];
- }
- delete m_pCharCircleInterpolator;
- delete m_pChargeArrowInterpolator;
- delete m_pChargeMuzzleInterpolator;
- CModelManager::GetInstance().DestroyModel(m_pModel);
- CModelManager::GetInstance().DestroyModel(m_pCharCircle);
- CModelManager::GetInstance().DestroyModel(m_pChargeArrowModel);
- delete m_ModelMatrix;
- m_pRigidbody->removeReference();
- }
- tgCInterpolator::ECallBackResult
- CCharacter::ShootOnceAnimationCB(tgCInterpolator& /*rInterpolator*/, void* pUserData)
- {
- // Grab pointer to CPlayer item
- CCharacter* pPlayer = (CCharacter*)pUserData;
- pPlayer->SetIsShooting(false);
- // Make the animation repeat itself
- return tgCInterpolator::CALLBACK_RESULT_WRAP;
- } // */ // AttackOnceAnimationCB
- tgCInterpolator::ECallBackResult
- CCharacter::HitOnceAnimationCB(tgCInterpolator& /*rInterpolator*/, void* pUserData)
- {
- // Grab pointer to CPlayer item
- CCharacter* pPlayer = (CCharacter*)pUserData;
- pPlayer->SetGotHit(false);
- // Make the animation repeat itself
- return tgCInterpolator::CALLBACK_RESULT_WRAP;
- } // */ // AttackOnceAnimationCB
- void CCharacter::UpdateCam(tgFloat DeltaTime)
- {
- if (!m_IsDead) {
- m_pWorld->getBodyTransform(m_pRigidbody->getBodyId()).get4x4ColumnMajor(reinterpret_cast<tgFloat*>(&m_pModel->GetTransform().GetMatrixLocal()));
- m_pWorld->getBodyTransform(m_pRigidbody->getBodyId()).get4x4ColumnMajor(reinterpret_cast<tgFloat*>(&m_pChargeArrowModel->GetTransform().GetMatrixLocal()));
- m_pWorld->getBodyTransform(m_pRigidbody->getBodyId()).get4x4ColumnMajor(reinterpret_cast<tgFloat*>(&m_pChargeMuzzleModel->GetTransform().GetMatrixLocal()));
- }
- }
- void CCharacter::UpdateCrouch(tgFloat /*DeltaTime*/)
- {
- }
- void CCharacter::Update(tgFloat DeltaTime)
- {
- tgUInt16 WindowWidth = tgCCore::GetInstance().GetWindowWidth();
- tgUInt16 WindowHeight = tgCCore::GetInstance().GetWindowHeight();
- m_AliveTime += DeltaTime;
- m_ShootingCooldown += DeltaTime;
- m_InitialSpawnTimer += DeltaTime;
- if (m_InitialSpawnTimer >= m_InitialSpawnTime && !m_HasSpawned) {
- CAnimationHandler::GetInstance().SpawnRespawnAnimation(m_Position, m_PickedColor);
- CAudioHandler::GetInstance().StartSound(CAudioHandler::RESPAWN);
- m_HasSpawned = true;
- m_OccupiedRespawn = 0;
- if (m_RumbleActivated) {
- RumbleController(0.5f);
- }
- }
- m_Rumble += DeltaTime;
- m_Rumble = tgMathClamp(0.0f, m_Rumble, m_RumbleMax);
- if (m_Rumble < m_RumbleMax)
- m_pGamePad->Rumble(m_RumbleValue, m_RumbleValue);
- else
- m_pGamePad->Rumble(0.0f, 0.0f);
- const tgCPluginInput& rPluginInput = tgCPluginInput::GetInstance();
- m_pGamePad->Update();
- m_Connected = m_pGamePad->GetConnected();
- HandleMovement(DeltaTime);
- HandleShooting(DeltaTime);
- UpdateCam(DeltaTime);
- if (m_IsDead) {
- m_RespawnTimer += DeltaTime;
- m_RespawnTimer = tgMathClamp(0.0f, m_RespawnTimer, m_RespawnTime);
- }
- // If fallen of, die
- if (m_pWorld->getBodyTransform(m_pRigidbody->getBodyId()).getTranslation().getComponent(1) <= -6.0f) {
- Die(0);
- }
- // Respawn
- if (m_IsDead && (m_RespawnTimer >= m_RespawnTime)) {
- Respawn();
- }
- // Animate
- AnimateCharacter(DeltaTime);
- // Cheat codes
- if (m_pGamePad->ButtonHeld(CGamepad::DPAD_LEFT) && m_pGamePad->ButtonHeld(CGamepad::DPAD_DOWN) && m_pGamePad->ButtonHeld(CGamepad::X)
- && m_pGamePad->ButtonHeld(CGamepad::B) && m_pGamePad->LeftTrigger() > 0.0f)
- {
- CAudioHandler::GetInstance().StartSound(CAudioHandler::QUACK);
- ActivateGodMode();
- }
- }
- void CCharacter::AnimateCharacter(tgFloat DeltaTime)
- {
- if (m_JustJumped) {
- m_NextAnimation = ANIMATION_LOWERBODY_JUMP;
- m_JustJumped = false;
- }
- if (m_CurrentAnimation != m_NextAnimation) {
- m_BlendValue = 0.0f;
- m_CurrentAnimation = m_NextAnimation;
- m_pInterpolators[INTERPOLATOR_NEXT]->SetAnimation(*m_pAnimations[m_CurrentAnimation]);
- }
- // Animate and blend /////////////////////////////////////////////
- m_pCharCircleInterpolator->AddTime(DeltaTime);
- m_pCharCircle->SetAnimationMatrices(*m_pCharCircleInterpolator);
- m_pCharCircle->Update();
- tgFloat AnimationSpeed = DeltaTime;
- if (m_CurrentAnimation == ANIMATION_RUN) {
- if (m_Connected)
- AnimationSpeed = m_pGamePad->LeftStick().Length() * DeltaTime;
- }
- if (m_BlendValue < 1.0f) {
- m_BlendValue += AnimationSpeed * m_BlendSpeed;
- m_BlendValue = tgMathClamp(0.0f, m_BlendValue, 1.0f);
- //Still below 1.0f?
- if (m_BlendValue < 1.0f) {
- m_pInterpolators[INTERPOLATOR_CURRENT]->AddTime(AnimationSpeed);
- m_pInterpolators[INTERPOLATOR_NEXT]->AddTime(AnimationSpeed);
- m_pInterpolators[INTERPOLATOR_BLEND]->Blend(*m_pInterpolators[INTERPOLATOR_CURRENT], *m_pInterpolators[INTERPOLATOR_NEXT], m_BlendValue);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_BLEND]);
- }
- else {
- m_pInterpolators[INTERPOLATOR_CURRENT]->SetAnimation(*m_pInterpolators[INTERPOLATOR_NEXT]->GetAnimation());
- m_pInterpolators[INTERPOLATOR_CURRENT]->SetTime(m_pInterpolators[INTERPOLATOR_NEXT]->GetTime());
- m_pInterpolators[INTERPOLATOR_CURRENT]->AddTime(AnimationSpeed);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_CURRENT]);
- }
- }
- else {
- m_pInterpolators[INTERPOLATOR_CURRENT]->AddTime(AnimationSpeed);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_CURRENT]);
- }
- if (m_IsShooting) {
- if (m_CurrentAnimation == ANIMATION_RUN) {
- m_pInterpolators[INTERPOLATOR_CURRENT]->AddTime(AnimationSpeed);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_CURRENT]);
- }
- m_pInterpolators[INTERPOLATOR_SUB]->AddTime(AnimationSpeed);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_SUB]);
- }
- if (m_GotHit) {
- m_pInterpolators[INTERPOLATOR_SUB_HIT]->AddTime(AnimationSpeed);
- m_pModel->SetAnimationMatrices(*m_pInterpolators[INTERPOLATOR_SUB_HIT]);
- }
- if (!RStick_InDeadZone && m_Connected)
- m_pModel->GetTransform().GetMatrixLocal().At = tgCV3D(-m_ModelDir.x, 0.f, -m_ModelDir.y);
- else if (!m_Connected) {
- m_pModel->GetTransform().GetMatrixLocal().RotateY(m_Yaw, tgCMatrix::COMBINE_PRE_MULTIPLY);
- }
- else
- {
- m_pModel->GetTransform().GetMatrixLocal().At = tgCV3D(-m_DirNormalized.x, 0.f, -m_DirNormalized.y);
- }
- RStick_InDeadZone = true;
- if (!m_IsDead) {
- m_pModel->GetTransform().GetMatrixLocal().OrthoNormalize();
- if (m_IsInTheLead) {
- m_pModel->GetTransform().GetMatrixLocal().Scale(tgCV3D(1.3f, 1.3f, 1.3f), tgCMatrix::COMBINE_PRE_MULTIPLY);
- }
- else {
- m_pModel->GetTransform().GetMatrixLocal().Scale(tgCV3D(1.0f, 1.0f, 1.0f), tgCMatrix::COMBINE_PRE_MULTIPLY);
- }
- m_pModel->Update();
- }
- }
- void CCharacter::HandleMovement(tgFloat DeltaTime) {
- const tgCPluginInput& rPluginInput = tgCPluginInput::GetInstance();
- // Reset the next animation to IDLE
- m_NextAnimation = ANIMATION_IDLE;
- if (!m_Connected) {
- // Calculate mouse movement
- const tgSInt32 MoveX = rPluginInput.GetMouseMoveX();
- const tgSInt32 MoveY = rPluginInput.GetMouseMoveY();
- if (rPluginInput.KeyHeld('W') || rPluginInput.KeyHeld('S') || rPluginInput.KeyHeld('A') || rPluginInput.KeyHeld('D')) {
- m_NextAnimation = ANIMATION_RUN;
- }
- //If mouse have moved
- if (MoveX != 0 || MoveY != 0)
- {
- m_Yaw -= MoveX * m_Sensitivity;
- m_Pitch += MoveY * m_Sensitivity;
- m_Pitch = tgMathClamp(-89.0f, m_Pitch, 89.0f);
- if (m_Yaw > 359.0f)
- m_Yaw = 0.0f;
- if (m_Yaw < 0.0f)
- m_Yaw = 359.f;
- m_Yaw = tgMathClamp(-1.0f, m_Yaw, 359.0f);
- m_DirNonNormalized = tgCV2D(MoveX, -MoveY);
- m_DirNormalized = tgCV2D(MoveX, -MoveY);
- m_DirNormalized.Normalize();
- m_ModelDir = tgCV2D(MoveX, -MoveY);
- }
- }
- else {
- if (!m_pGamePad->LStick_InDeadZone()) {
- const tgFloat MoveX = m_pGamePad->LeftStick().x;
- const tgFloat MoveY = m_pGamePad->LeftStick().y;
- m_DirNonNormalized = tgCV2D(MoveX, -MoveY);
- m_DirNormalized = tgCV2D(MoveX, -MoveY);
- m_DirNormalized.Normalize();
- m_ModelDir = tgCV2D(MoveX, -MoveY);
- m_NextAnimation = ANIMATION_RUN;
- }
- if (!m_pGamePad->RStick_InDeadZone()) {
- const tgFloat MoveX = m_pGamePad->RightStick().x;
- const tgFloat MoveY = m_pGamePad->RightStick().y;
- m_ModelDir = tgCV2D(MoveX, -MoveY);
- RStick_InDeadZone = false;
- }
- else
- {
- if (m_pGamePad->LStick_InDeadZone()) {
- m_DirNonNormalized = m_ModelDir;
- m_DirNormalized = m_ModelDir;
- m_DirNormalized.Normalize();
- }
- }
- if (m_pGamePad->ButtonHeld(CGamepad::A)) {
- m_NextAnimation = ANIMATION_LOWERBODY_JUMP;
- }
- }
- }
- void CCharacter::HandleShooting(tgFloat DeltaTime)
- {
- const tgCPluginInput& rPluginInput = tgCPluginInput::GetInstance();
- tgUInt16 WindowWidth = tgCCore::GetInstance().GetWindowWidth();
- tgUInt16 WindowHeight = tgCCore::GetInstance().GetWindowHeight();
- // PC Controls
- if (m_GodMode)
- {
- if ((m_pGamePad->ButtonHeld(CGamepad::RB) || m_pGamePad->RightTrigger() > 0.0f)) {
- ShootGrenade(m_GrenadeForce);
- }
- }
- if (m_ShootingCooldown >= m_ShootingCooldownMax) {
- // Charge grenade forcek
- if ((m_pGamePad->ButtonHeld(CGamepad::RB) || m_pGamePad->RightTrigger() > 0.0f)) {
- if (m_GrenadeForce >= m_GrenadeForceMax && !m_HasPlayedChargeupSound) {
- m_HasPlayedChargeupSound = true;
- }
- m_GrenadeForce = tgMathClamp(m_GrenadeForceMin, m_GrenadeForce, m_GrenadeForceMax);
- m_GrenadeForce += DeltaTime * m_GrenadeChargeRate;
- if (m_PickedUpPowerup == POWERUP_MAX_CHARGEUP)
- m_GrenadeForce = m_GrenadeForceMax;
- if (m_GrenadeForce >= m_GrenadeForceMax) {
- m_NextAnimation = ANIMATION_CHARGEUP_LOOP;
- }
- else {
- m_NextAnimation = ANIMATION_CHARGEUP;
- }
- m_ChargingUp = true;
- // Animate the chargup arrow
- if (m_pChargeArrowInterpolator->GetTime() <= (m_pChargeArrowAnimation->GetDuration() - 0.1f)) {
- m_pChargeArrowInterpolator->AddTime(DeltaTime * m_GrenadeChargeRate * 0.775f);
- m_pChargeArrowModel->SetAnimationMatrices(*m_pChargeArrowInterpolator);
- }
- m_pChargeArrowModel->GetTransform().GetMatrixLocal().At = m_pModel->GetTransform().GetMatrixLocal().At;
- m_pChargeArrowModel->GetTransform().GetMatrixLocal().Up = m_pModel->GetTransform().GetMatrixLocal().Up;
- m_pChargeArrowModel->GetTransform().GetMatrixLocal().Left = m_pModel->GetTransform().GetMatrixLocal().Left;
- m_pChargeArrowModel->GetTransform().GetMatrixLocal().Pos.y = (m_pModel->GetTransform().GetMatrixLocal().Pos.y + 0.05f);
- m_pChargeArrowModel->GetTransform().GetMatrixLocal().Scale(tgCV3D(3.0f, 3.0f, 3.0f), tgCMatrix::COMBINE_PRE_MULTIPLY);
- m_pChargeArrowModel->Update();
- // Animate chargeup muzzle
- // Animate the chargup arrow
- if (m_pChargeMuzzleInterpolator->GetTime() <= (m_pChargeMuzzleAnimation->GetDuration() - 0.1f)) {
- m_pChargeMuzzleInterpolator->AddTime(DeltaTime * m_GrenadeChargeRate * 0.775f);
- m_pChargeMuzzleModel->SetAnimationMatrices(*m_pChargeMuzzleInterpolator);
- }
- m_pChargeMuzzleModel->GetTransform().GetMatrixLocal().At = m_pModel->GetTransform().GetMatrixLocal().At;
- m_pChargeMuzzleModel->GetTransform().GetMatrixLocal().Up = m_pModel->GetTransform().GetMatrixLocal().Up;
- m_pChargeMuzzleModel->GetTransform().GetMatrixLocal().Left = m_pModel->GetTransform().GetMatrixLocal().Left;
- m_pChargeMuzzleModel->GetTransform().GetMatrixLocal().Pos.y = (m_pModel->GetTransform().GetMatrixLocal().Pos.y + 0.05f);
- //m_pChargeMuzzleModel->GetTransform().GetMatrixLocal().Scale(tgCV3D(3.0f, 3.0f, 3.0f), tgCMatrix::COMBINE_PRE_MULTIPLY);
- m_pChargeMuzzleModel->Update();
- }
- // Shoot grenade
- if (((m_pGamePad->ButtonReleased(CGamepad::RB)) || ((m_pGamePad->RightTrigger() == 0.0f && m_GrenadeForce > 0.0f) && !m_pGamePad->ButtonHeld(CGamepad::RB)))) {
- if (!m_IsShooting) {
- m_IsShooting = true;
- m_pInterpolators[INTERPOLATOR_SUB]->SetTime(0.0f);
- }
- else {
- m_pInterpolators[INTERPOLATOR_SUB]->SetTime(0.0f);
- }
- ShootGrenade(m_GrenadeForce);
- if (m_PickedUpPowerup == POWERUP_BURST) {
- m_BurstedAmount = 1;
- m_ShouldBurst = true;
- m_BurstForce = m_GrenadeForce;
- }
- m_GrenadeForce = 0.0f;
- m_ShootingCooldown = 0.0f;
- m_HasPlayedChargeupSound = false;
- // Reset the animation
- m_pChargeArrowInterpolator->SetTime(0.0f);
- m_pChargeMuzzleInterpolator->SetTime(0.0f);
- }
- }
- // Explode all grenades
- if (m_pGamePad->LeftTrigger() > 0.0f || m_pGamePad->ButtonPressed(CGamepad::LB)) {
- for (tgUInt32 i = 0; i < CBodyManager::GetInstance().GetAllBodies().size(); i++)
- {
- CGrenade* Grenade = CBodyManager::GetInstance().GetAllBodies()[i];
- if (Grenade->GetPlayerTag() == m_PlayerTag && Grenade->GetTime() >= 0.1f) {
- if (!Grenade->GetShouldExplode() && Grenade->GetPowerupType() != CGrenade::CLUSTER_SPAWN) {
- Grenade->DetonateGrenade(m_PickedUpPowerup, DeltaTime);
- }
- }
- }
- }
- }
- void CCharacter::Die(tgUInt32 DeathType)
- {
- if (!m_IsInvulnerable) {
- CCharacter* Killer = this;
- if (!m_IsDead) {
- m_OccupiedRespawn = GetAvailableRespawn(&m_RespawnTiles);
- }
- m_IsDead = true;
- m_KillStreak = 0;
- if (!m_AddedScore) {
- m_pBloodParticleTransform = &m_pModel->GetTransform();
- if (DeathType == CUIHandler::NORMAL_DEATH_ICON && m_TaggedBy == m_PlayerTag)
- CUIHandler::GetInstance().AddPlayerKilledText(m_TaggedBy, m_PlayerTag, CUIHandler::SUICIDE_DEATH_ICON);
- else
- CUIHandler::GetInstance().AddPlayerKilledText(m_TaggedBy, m_PlayerTag, DeathType);
- }
- // Poor sucker
- if (m_TaggedBy == m_PlayerTag && !m_AddedScore) {
- PlayFallDeathSound();
- //m_Score--;
- m_AddedScore = true;
- m_Stats.Deaths++;
- }
- if (!m_AddedScore) {
- for (tgUInt32 i = 0; i < CGameStates::GetInstance().GetStateGame()->GetCharacters()->size(); i++)
- {
- if (CGameStates::GetInstance().GetStateGame()->GetCharacters()->at(i)->GetPlayerTag() == m_TaggedBy) {
- Killer = CGameStates::GetInstance().GetStateGame()->GetCharacters()->at(i);
- if (m_IsInTheLead) {
- Killer->AddScore(true);
- }
- else
- Killer->AddScore(false);
- m_AddedScore = true;
- if (DeathType == CUIHandler::NORMAL_DEATH_ICON) {
- PlayFallDeathSound();
- }
- }
- }
- }
- }
- }
- tgUInt32 CCharacter::GetAvailableRespawn(std::vector<CTile*>* Tiles) {
- m_NumRespawnTries++;
- if (Tiles->size() <= 0)
- return 0;
- tgUInt32 RandSpawn = tgMathRandom(0, Tiles->size());
- if (RandSpawn == Tiles->size())
- RandSpawn = RandSpawn - 1;
- tgUInt32 NumPlayers = CGameStates::GetInstance().GetStateGame()->GetCharacters()->size();
- tgUInt32 CheckedPlayers = 0;
- for (tgUInt32 i = 0; i < NumPlayers; i++)
- {
- CCharacter* Player = CGameStates::GetInstance().GetStateGame()->GetCharacters()->at(i);
- // Check if this tile is occupied by a respawning player
- if ((Player->GetOccupiedRespawn() != RandSpawn) {
- ++CheckedPlayers;
- if (CheckedPlayers >= NumPlayers) {
- return GetAvailableRespawn(Tiles);
- }
- }
- }
- return RandSpawn;
- }
- void CCharacter::Respawn(void)
- {
- m_RespawnTimer = 0.0f;
- m_HitPercentage = 0.0f;
- m_ShouldRenderOnlyAmbient = false;
- m_IsDead = false;
- m_AddedScore = false;
- m_TaggedBy = m_PlayerTag;
- m_GrenadeForce = 0.0f;
- m_PickedUpPowerup = 0;
- m_NumRespawnTries = 0;
- tgCV3D RespawnPos;
- if (m_RespawnTiles.size() <= 0)
- RespawnPos = tgCV3D(0.0f, 2.0f, 0.0f);
- else {
- RespawnPos = m_RespawnTiles.at(m_OccupiedRespawn)->GetPosition() + tgCV3D(0.0f, 2.0f, 0.0f);
- }
- m_pWorld->setBodyPosition(m_pRigidbody->getBodyId(), hkVector4(RespawnPos.x, RespawnPos.y, RespawnPos.z));
- m_pWorld->setBodyLinearVelocity(m_pRigidbody->getBodyId(), hkVector4(0.0f, 0.0f, 0.0f));
- CAnimationHandler::GetInstance().SpawnRespawnAnimation(RespawnPos, m_PickedColor);
- m_OccupiedRespawn = 0;
- m_InvulnerabilityTimer = 0.0f;
- CAudioHandler::GetInstance().StartSound(CAudioHandler::RESPAWN);
- RumbleController(0.3f);
- }
- void CCharacter::ShootGrenade(tgFloat Force)
- {
- CAudioHandler::GetInstance().StartSound(CAudioHandler::GRENADE_FLOMPF);
- // Spawn Muzzle flash
- tgSInt32 MuzzleWeaponIndex = m_pModel->GetJointIDFromName("gun_flash");
- tgUInt32 MuzzleJointID = m_pModel->GetJoint(MuzzleWeaponIndex)->HierarchyID;
- tgCMatrix NewMatrix = m_pModel->GetHierarchy(MuzzleJointID)->Transform.GetMatrixWorld();
- CAnimationHandler::GetInstance().SpawnMuzzleFlashAnimation(NewMatrix.Pos, m_pModel->GetTransform().GetMatrixLocal(), m_PickedChar);
- // Get pos in front of character SPAWN FROM JOINT "AIM"
- tgSInt32 weaponIndex = m_pModel->GetJointIDFromName("aim");
- tgUInt32 JointID = m_pModel->GetJoint(weaponIndex)->HierarchyID;
- tgSModelHierarchy* Hierarchy = m_pModel->GetHierarchy(JointID);
- tgCV3D Pos = Hierarchy->Transform.GetMatrixWorld().Pos;
- hkVector4 hkPos = hkVector4(Pos.x, Pos.y, Pos.z);
- tgCV3D LinVel;
- if (m_Connected)
- LinVel = (m_pModel->GetTransform().GetMatrixWorld().At + (tgCV3D::PositiveY * m_Angle)) * (Force * m_ShootingForce);
- else
- {
- tgCV3D DirTransformed;
- DirTransformed.TransformVector(m_pModel->GetTransform().GetMatrixLocal().At, m_pModel->GetTransform().GetMatrixWorld());
- LinVel = (Hierarchy->Transform.GetMatrixWorld().At + (tgCV3D::PositiveY * m_Angle)) * (Force * m_ShootingForce);
- }
- hkVector4 hkLinVel = hkVector4(LinVel.x, LinVel.y, LinVel.z);
- CBodyManager::GetInstance().AddNewBody(Pos, LinVel, m_PlayerTag, false, CGrenade::NO_POWERUP);
- }
- void CCharacter::UpdatePhysics(tgFloat DeltaTime)
- {
- if (!m_IsDead && CGameStates::GetInstance().GetStateGame()->CountDownFinished()) {
- const tgCPluginInput& rPluginInput = tgCPluginInput::GetInstance();
- hknpCharacterInput Input;
- Input.m_inputUD = 0.0f;
- Input.m_inputLR = 0.0f;
- Input.m_wantJump = false;
- //If controller is not connected use keyboard and mouse input
- if (!m_Connected) {
- if (m_GrenadeForce <= 0.0f && m_IsPlayerCharacter) {
- tgFloat MovementScaling = 1.0f;
- Input.m_wantJump = rPluginInput.KeyHeld(VK_SPACE);
- if (Input.m_wantJump)
- m_JustJumped = true;
- if (rPluginInput.KeyHeld(VK_SPACE))
- m_AnalogJumpBoost += DeltaTime * 10.0f;
- else
- m_AnalogJumpBoost = 0.0f;
- if (rPluginInput.KeyHeld('W')) {
- Input.m_inputUD -= m_MovementSpeed * MovementScaling;
- m_IsShooting = false;
- }
- if (rPluginInput.KeyHeld('S')) {
- Input.m_inputUD += m_MovementSpeed * MovementScaling;
- m_IsShooting = false;
- }
- if (rPluginInput.KeyHeld('A')) {
- Input.m_inputLR += m_MovementSpeed * MovementScaling;
- m_IsShooting = false;
- }
- if (rPluginInput.KeyHeld('D')) {
- Input.m_inputLR -= m_MovementSpeed * MovementScaling;
- m_IsShooting = false;
- }
- }
- }
- //If controller is connected
- else {
- if (m_IsPlayerCharacter) {
- tgFloat MovementScaling = 1.0f;
- if (CGameStates::GetInstance().GetStateGame()->GetDebugChargeupMode() == 2) {
- MovementScaling = 1.0f - (m_GrenadeForce * 0.4f);
- if (m_GrenadeForce > (m_GrenadeForceMax * 0.65f))
- MovementScaling = 0.0f;
- if (MovementScaling <= 0.0f)
- MovementScaling = 0.0f;
- }
- else if (CGameStates::GetInstance().GetStateGame()->GetDebugChargeupMode() == 1 && m_GrenadeForce > 0) {
- MovementScaling = 0.0f;
- }
- else if (m_GrenadeForce > 0) {
- MovementScaling = 0.2f;
- }
- if (m_GodMode)
- {
- MovementScaling = 4.0f;
- }
- //Does not do anything if the left stick is in the deadzone
- if (!m_pGamePad->LStick_InDeadZone()) {
- if (!(m_PickedUpPowerup == POWERUP_MOVEMENTSPEED))
- Input.m_inputUD += m_DirNonNormalized.Length() * m_MovementSpeed * MovementScaling;
- else
- Input.m_inputUD += m_DirNonNormalized.Length() * m_MovementSpeed * 4.0f;
- m_IsShooting = false;
- }
- //Checks for 'A' on a XBOX Controller, 'A' on a XBOX Controller is 'X' on a PS Controller
- Input.m_wantJump = m_pGamePad->ButtonHeld(CGamepad::A);
- if (Input.m_wantJump)
- m_JustJumped = true;
- if (m_pGamePad->ButtonHeld(CGamepad::A))
- m_AnalogJumpBoost += DeltaTime * 10.0f;
- else
- m_AnalogJumpBoost = 0.0f;
- }
- }
- Input.m_atLadder = false;
- Input.m_up.set(hkVector4(0.0f, 1.0f, 0.0f));
- if (!m_Connected) {
- hkQuaternion CurrentOriantation;
- CurrentOriantation.setAxisAngle(Input.m_up, 0.0f * HK_FLOAT_DEG_TO_RAD);
- Input.m_forward.setRotatedDir(CurrentOriantation, hkVector4(0.F, 0.f, 1.f));
- }
- else {
- Input.m_forward.set(hkVector4(m_DirNormalized.x, 0.f, m_DirNormalized.y));
- }
- Input.m_stepInfo.m_deltaTime = DeltaTime;
- Input.m_stepInfo.m_invDeltaTime = 1.0f / DeltaTime;
- Input.m_characterGravity.set(hkVector4(0.0f, -55.0f, 0.0f));
- //Input.m_characterGravity.set(hkVector4(0.0f, -85.0f, 0.0f));
- Input.m_velocity = m_pRigidbody->getLinearVelocity();
- Input.m_position = m_pRigidbody->getPosition();
- m_pRigidbody->checkSupport(Input.m_stepInfo, Input.m_surfaceInfo);
- hknpCharacterOutput Output;
- m_pContext->update(Input, Output);
- // Limit analog jump
- if (m_AnalogJumpBoost >= 0.5f)
- m_AnalogJumpBoost = 0.0f;
- m_pRigidbody->setLinearVelocity(hkVector4(Output.m_velocity(0), Output.m_velocity(1) + (m_AnalogJumpBoost), Output.m_velocity(2)), DeltaTime, Input.m_wantJump);
- }
- }
- void CCharacter::Render(void)
- {
- m_pModel->GetTransform().GetMatrixLocal().Up = tgCV3D::PositiveY;
- m_Position = m_pModel->GetTransform().GetMatrixLocal().Pos;
- // Cast ray on ground
- hknpRayCastQuery RayQuery;
- hknpClosestHitCollector Collector;
- hknpCollisionResult RayCastResult;
- hkcdRay Ray;
- Ray.setOriginDirection(m_pRigidbody->getPosition(), hkVector4(0.0f, -1.0f, 0.0f));
- Ray.setEndPoints(m_pRigidbody->getPosition(), hkVector4(m_pRigidbody->getPosition()(0), m_pRigidbody->getPosition()(1) - 20.0f, m_pRigidbody->getPosition()(2)));
- RayQuery.m_ray = Ray;
- m_pWorld->castRay(RayQuery, &Collector);
- if (Collector.hasHit()) {
- RayCastResult = Collector.getHit();
- m_pShadowModel->GetTransform().GetMatrixLocal().Translate(tgCV3D(RayCastResult.m_position(0), RayCastResult.m_position(1), RayCastResult.m_position(2)), tgCMatrix::COMBINE_REPLACE);
- if (RayCastResult.m_position(1) < 0.0f) {
- m_pCharCircle->GetTransform().GetMatrixLocal().Translate(tgCV3D(m_Position.x, 0.0f, m_Position.z), tgCMatrix::COMBINE_REPLACE);
- }
- else if (m_pModel->GetTransform().GetMatrixLocal().Pos.y > 0.0f) {
- m_pCharCircle->GetTransform().GetMatrixLocal().Translate(tgCV3D(RayCastResult.m_position(0), RayCastResult.m_position(1), RayCastResult.m_position(2)), tgCMatrix::COMBINE_REPLACE);
- }
- else {
- m_pCharCircle->GetTransform().GetMatrixLocal().Translate(m_Position, tgCMatrix::COMBINE_REPLACE);
- }
- m_pCharCircle->GetTransform().Update();
- }
- m_pShadowModel->GetTransform().GetMatrixLocal().Scale(tgCV3D(2.0f, 2.0f, 2.0f), tgCMatrix::COMBINE_PRE_MULTIPLY);
- m_pShadowModel->GetTransform().Update();
- const CLightManager::SLight* pLightArray = CLightManager::GetInstance().GetLightArray();
- tgCLightManager& rLightManager = tgCLightManager::GetInstance();
- // Render player model and shadowmodel
- if (!m_IsDead && m_InitialSpawnTimer >= m_InitialSpawnTime) {
- for (tgUInt32 LightIndex = 0; LightIndex < MAX_NUM_LIGHTS; ++LightIndex)
- {
- if (pLightArray[LightIndex].pLight)
- {
- rLightManager.SetCurrentLight(*pLightArray[LightIndex].pLight);
- if (m_ShouldRenderOnlyAmbient && rLightManager.GetCurrentLight()->GetType() == tgCLight::TYPE_AMBIENT)
- m_pModel->Render();
- if (!m_ShouldRenderOnlyAmbient) {
- if (rLightManager.GetCurrentLight()->GetType() == tgCLight::TYPE_DIRECTIONAL)
- CLightManager::GetInstance().GetLight("Directional")->SetIntensity(0.5f);
- m_pModel->Render();
- }
- }
- }
- }
- if (!m_IsDead && m_InitialSpawnTimer >= m_InitialSpawnTime) {
- if (m_GrenadeForce > 0.0f) {
- m_pChargeArrowModel->Render();
- m_pChargeMuzzleModel->Render();
- }
- }
- }
- void CCharacter::PlayDamagedSound(void)
- {
- CAudioHandler::GetInstance().PlayDamagedVoice(m_PickedChar);
- }
- void CCharacter::PlayFallDeathSound(void)
- {
- CAudioHandler::GetInstance().PlayDeathVoice(m_PickedChar);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement