void CPlayerRotation::ProcessFlyingZeroG() { bool bEnableGyroVerticalFade = (g_pGameCVars->pl_zeroGEnableGyroFade > 0); bool bEnableGyroSpeedFade = (g_pGameCVars->pl_zeroGEnableGyroFade < 2); //thats necessary when passing from groundG to normalG m_baseQuat = m_viewQuat; assert(m_baseQuat.IsValid()); //m_baseQuat = Quat::CreateSlerp(m_viewQuat,m_player.GetEntity()->GetRotation() * Quat::CreateRotationZ(gf_PI),0.5f); Ang3 desiredAngVel(m_deltaAngles.x,m_deltaAngles.y * 0.3f,m_deltaAngles.z); //view recoil in zeroG cause the player to rotate desiredAngVel.x += m_viewAnglesOffset.x * 0.1f; desiredAngVel.z += m_viewAnglesOffset.z * 0.1f; //so once used reset it. m_viewAnglesOffset.Set(0,0,0); //gyroscope: the gyroscope just apply the right roll speed to compensate the rotation, that way effects like //propulsion particles and such can be done easily just by using the angularVel float rotInertia(g_pGameCVars->pl_zeroGAimResponsiveness); if(m_player.GravityBootsOn() && m_stats.gBootsSpotNormal.len2()>0.01f) { Vec3 vRef(m_baseQuat.GetInverted() * m_stats.gBootsSpotNormal); Ang3 alignAngle(0,0,0); alignAngle.y = cry_atan2f(vRef.x, vRef.z); alignAngle.x = cry_atan2f(vRef.y, vRef.z); desiredAngVel.y += alignAngle.y * 0.05f; desiredAngVel.x -= alignAngle.x * 0.05f; } if(m_actions & ACTION_GYROSCOPE && desiredAngVel.y==0) { // we want to fade out the gyroscopic effect Vec3 vRef(m_baseQuat.GetInverted() * m_stats.zeroGUp); Ang3 alignAngle(0,0,0); alignAngle.y = cry_atan2f(vRef.x,vRef.z); float gyroFade = 1.0f; if(bEnableGyroVerticalFade) { float gyroFadeAngleInner = g_pGameCVars->pl_zeroGGyroFadeAngleInner; float gyroFadeAngleOuter = g_pGameCVars->pl_zeroGGyroFadeAngleOuter; float gyroFadeAngleSpan = gyroFadeAngleOuter - gyroFadeAngleInner; float gyroFadeAngleSpanInv = 1.0f / gyroFadeAngleSpan; float viewVerticalAlignment = abs(m_viewQuat.GetFwdZ()); float viewVerticalAngle = RAD2DEG(cry_asinf(viewVerticalAlignment)); gyroFade = 1.0f - CLAMP((viewVerticalAngle - gyroFadeAngleInner) * gyroFadeAngleSpanInv, 0.0f, 1.0f); gyroFade = cry_powf(gyroFade, g_pGameCVars->pl_zeroGGyroFadeExp); } float speedFade = 1.0f; if(bEnableGyroSpeedFade) { float speed = m_player.GetLastRequestedVelocity().GetLength(); speedFade = 1.0f - std::min(1.0f, speed / 5.0f); } desiredAngVel.y += alignAngle.y * speedFade * gyroFade * m_frameTime * g_pGameCVars->pl_zeroGGyroStrength; //rotInertia = 3.0f; } m_absRoll = fabs(desiredAngVel.y); Interpolate(m_angularVel,desiredAngVel,rotInertia,m_frameTime); Ang3 finalAngle(m_angularVel + m_angularImpulseDelta); m_baseQuat *= Quat::CreateRotationZ(finalAngle.z) * Quat::CreateRotationX(finalAngle.x) * Quat::CreateRotationY(finalAngle.y); m_baseQuat.NormalizeSafe(); /*IEntity *pEnt = m_player.GetEntity(); Vec3 offsetToCenter(Vec3(0,0,m_player.GetStanceInfo(m_player.GetStance())->heightCollider)); Vec3 finalPos(pEnt->GetWorldTM() * offsetToCenter); Quat newBaseQuat(m_baseQuat * Quat::CreateRotationZ(finalAngle.z) * Quat::CreateRotationX(finalAngle.x) * Quat::CreateRotationY(finalAngle.y)); Vec3 newPos(pEnt->GetWorldPos() + m_baseQuat * offsetToCenter); pEnt->SetPos(pEnt->GetWorldPos() + (finalPos - newPos),ENTITY_XFORM_USER);*/ //CHECKQNAN_MAT33(m_baseMtx); m_viewQuat = m_baseQuat; m_viewRoll = 0; m_upVector = m_baseQuat.GetColumn2(); }
void CPlayerRotation::ProcessTargetAssistance( IItem* pCurrentPlayerItem ) { // aim assistance float targetAimAssistAngleFollowH; float targetAimAssistAngleFollowV; float targetAimAssistAngleScale; IPlayerInput * pIPlayerInput = m_player.GetPlayerInput(); float absInput = 0.0f; float aimAssistPowerFactor = 1.0f; bool isUsingDedicatedInput = gEnv->IsDedicated(); #if (USE_DEDICATED_INPUT) isUsingDedicatedInput |= g_pGameCVars->g_playerUsesDedicatedInput ? true : false; #endif if(pIPlayerInput && !isUsingDedicatedInput) { CRY_ASSERT(pIPlayerInput->GetType() == IPlayerInput::PLAYER_INPUT); CPlayerInput * pPlayerInput = static_cast<CPlayerInput*>(pIPlayerInput); const Ang3 rawDeltas = pPlayerInput->GetRawControllerInput(); absInput = min((fabsf(rawDeltas.x) + fabsf(rawDeltas.z)) * 1.4f, 1.0f); aimAssistPowerFactor = 2.0f - absInput; } //Gather weapon info before processing target aim assistance bool playerWeaponIsRequestingSnap = false; CWeapon* pWeapon = GetCurrentWeapon( pCurrentPlayerItem ); if (pWeapon) { playerWeaponIsRequestingSnap = pWeapon->ShouldSnapToTarget(); } IMovementController* pMovementController = m_player.GetMovementController(); CRY_ASSERT(pMovementController); SMovementState moveState; pMovementController->GetMovementState(moveState); Vec3 playerView[4] = { m_viewQuat.GetColumn0(), // Right m_viewQuat.GetColumn1(), // Forward m_viewQuat.GetColumn2(), // Up moveState.eyePosition // Pos }; IVehicle* pVehicle = m_player.GetLinkedVehicle(); if (pVehicle) { Vec3 up(0.f,0.f,1.f); playerView[1] = moveState.eyeDirection; // Forward playerView[0] = (playerView[1].cross(up)).GetNormalizedSafe(); // Right playerView[2] = playerView[0].cross(playerView[1]); // Up } float fZoomAmount = 0.0f; TargetAimAssistance(pWeapon, targetAimAssistAngleFollowH, targetAimAssistAngleFollowV, targetAimAssistAngleScale, fZoomAmount, playerView); targetAimAssistAngleScale = powf(targetAimAssistAngleScale, aimAssistPowerFactor); //TODO: Fix so it's not using auto aim unless selected float fFollowAssistScale = (absInput * (1.0f - fZoomAmount)) + min(absInput * fZoomAmount * __fres(g_pGameCVars->aim_assistInputForFullFollow_Ironsight), 1.0f); m_deltaAngles.z = (m_deltaAngles.z * targetAimAssistAngleScale) + (absInput * targetAimAssistAngleFollowH); m_deltaAngles.x = (m_deltaAngles.x * targetAimAssistAngleScale) + (absInput * targetAimAssistAngleFollowV); const bool snapToTarget = (!gEnv->bMultiplayer && playerWeaponIsRequestingSnap && !m_snap_target_dir.IsZero()); const EntityId closeCombatSnapTargetId = g_pGame->GetAutoAimManager().GetCloseCombatSnapTarget(); if (closeCombatSnapTargetId) { Vec3 snapDirection = GetCloseCombatSnapTargetDirection(closeCombatSnapTargetId); if (!snapDirection.IsZero()) { const float blendSpeed = clamp( g_pGameCVars->pl_melee.melee_snap_blend_speed , 0.0f, 1.0f); m_deltaAngles.z = -cry_asinf(snapDirection * m_viewQuat.GetColumn0()) * blendSpeed; m_deltaAngles.x = cry_asinf(snapDirection * m_viewQuat.GetColumn2()) * blendSpeed; } } else if (snapToTarget) { const float zoomInTime = pWeapon->GetZoomInTime(); const float blendFactor = clamp(cry_powf((1.0f-zoomInTime),2.0f), 0.0f, 1.0f); m_deltaAngles.z = -cry_asinf(m_snap_target_dir * m_viewQuat.GetColumn0()) * blendFactor; m_deltaAngles.x = cry_asinf(m_snap_target_dir * m_viewQuat.GetColumn2()) * blendFactor; } m_currently_snapping = playerWeaponIsRequestingSnap; #if !defined(_RELEASE) if(g_pGameCVars->ctrlr_OUTPUTDEBUGINFO) { float white[] = {1,1,1,1}; gEnv->pRenderer->Draw2dLabel( 20, 100, 1.4f, white, false, "Aim Acceleration & Assist\n absInput: %.6f", absInput ); } #endif }