void CPlayerRotation::Process() { //FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); // float forceLookLen2(m_player.m_stats.forceLookVector.len2()); if (forceLookLen2>0.001f && !g_vr->initialized()) // no forced look in VR please { float forceLookLen(cry_sqrtf(forceLookLen2)); Vec3 forceLook(m_player.m_stats.forceLookVector); forceLook *= 1.0f/forceLookLen; forceLook = m_player.m_viewQuatFinal.GetInverted() * forceLook; float smoothSpeed(6.6f * forceLookLen); m_deltaAngles.x += asin(forceLook.z) * min(1.0f,m_frameTime*smoothSpeed); m_deltaAngles.z += cry_atan2f(-forceLook.x,forceLook.y) * min(1.0f,m_frameTime*smoothSpeed); CHECKQNAN_VEC(m_deltaAngles); } ProcessAngularImpulses(); ProcessLean(); if (m_stats.inAir && m_stats.inZeroG) ProcessFlyingZeroG(); else if (m_stats.inFreefall.Value()==1) ProcessFreeFall(); else if (m_stats.inFreefall.Value()==2) ProcessParachute(); else { if(!g_vr->initialized()) { ProcessNormalRoll(); ClampAngles(); } ProcessNormal(); } //CHECKQNAN_MAT33(m_viewMtx); //update freelook when linked to an entity SLinkStats *pLinkStats = &m_player.m_linkStats; if (pLinkStats->linkID) { IEntity *pLinked = pLinkStats->GetLinked(); if (pLinked) { //at this point m_baseQuat and m_viewQuat contain the previous frame rotation, I'm using them to calculate the delta rotation. m_baseQuatLinked *= m_player.m_baseQuat.GetInverted() * m_baseQuat; m_viewQuatLinked *= m_player.m_viewQuat.GetInverted() * m_viewQuat; m_baseQuat = pLinked->GetRotation() * m_baseQuatLinked; m_viewQuat = pLinked->GetRotation() * m_viewQuatLinked; } } // m_viewQuatFinal = m_viewQuat; //TEST: * Quat::CreateRotationXYZ(m_player.m_viewAnglesOffset); }
void CPlayerRotation::Process(IItem* pCurrentItem, const SActorFrameMovementParams& movement, const SAimAccelerationParams& verticalAcceleration, float frameTime) { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); // reset to the new impulse. m_angularImpulseDelta = m_angularImpulse; m_deltaAngles = movement.deltaAngles; PR_CHECKQNAN_FLT(m_deltaAngles); // Store the previous rotation to get the correct rotation for linked actors. const Quat previousBaseQuat = m_baseQuat; const Quat previousViewQuat = m_viewQuat; ProcessForcedLookDirection(m_viewQuatFinal, frameTime); ProcessAngularImpulses( frameTime ); ProcessLeanAndPeek( movement ); ProcessNormalRoll( frameTime ); bool shouldProcessTargetAssistance = ShouldProcessTargetAssistance(); if (shouldProcessTargetAssistance) { ProcessTargetAssistance( pCurrentItem ); } #if TALOS if(stricmp(g_pGameCVars->pl_talos->GetString(), m_player.GetEntity()->GetName()) == 0) { 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 }; GetTalosInput(this, m_player, m_deltaAngles.x, m_deltaAngles.z, playerView, frameTime); } #endif float minAngle,maxAngle; GetStanceAngleLimits(verticalAcceleration, pCurrentItem, minAngle, maxAngle); ClampAngles( minAngle, maxAngle ); ProcessNormal( frameTime ); if(shouldProcessTargetAssistance) { IVehicle* pVehicle = m_player.GetLinkedVehicle(); if (pVehicle && GetCurrentItem(true)) { if (m_deltaAngles.x!=0.f) pVehicle->OnAction(eVAI_RotatePitchAimAssist, eAAM_Always, m_deltaAngles.x, m_player.GetEntity()->GetId()); if (m_deltaAngles.z!=0.f) pVehicle->OnAction(eVAI_RotateYawAimAssist, eAAM_Always, m_deltaAngles.z, m_player.GetEntity()->GetId()); } } //update freelook when linked to an entity ProcessLinkedState(m_player.m_linkStats, previousBaseQuat, previousViewQuat); //Recoil/Zoom sway offset for local player ProcessFinalViewEffects( minAngle, maxAngle ); m_frameViewAnglesOffset.Set(0.0f, 0.0f, 0.0f); m_forceLookVector.zero(); m_externalAngles.Set(0.f, 0.f, 0.f); NormalizeQuats(); }