void SpinningWorldModel::UpdateOn( const LTFLOAT &fCurTime ) { LTVector vNewPos(0.0f, 0.0f, 0.0f); LTRotation rNewRot; LTFLOAT fDeltaTm = fCurTime - m_fLastTime; LTFLOAT fPercent = 0.0f; LTVector vOldAngles( m_fPitch, m_fYaw, m_fRoll ); m_bUpdateSpin = LTTRUE; if( m_vVelocity.x ) { m_fPitch += m_vVelocity.x * fDeltaTm; } if( m_vVelocity.y ) { m_fYaw += m_vVelocity.y * fDeltaTm; } if( m_vVelocity.z ) { m_fRoll += m_vVelocity.z * fDeltaTm; } LTFLOAT fDifLeft = (m_vOnAngles - LTVector( m_fPitch, m_fYaw, m_fRoll )).Mag(); LTFLOAT fFinalDif = (m_vOnAngles - m_vOffAngles).Mag(); // Get the percent of our rotation to use for the light ani... fPercent = ( fFinalDif > MATH_EPSILON ? 1 - fDifLeft / fFinalDif : 1.0f ); if( !CalculateNewPosRot( vNewPos, rNewRot, m_vOnPos, m_fPowerOnTime, fPercent, LTTRUE ) && !(m_dwPropFlags & AWM_PROP_FORCEMOVE) ) { // Restore our angles... m_fPitch = vOldAngles.x; m_fYaw = vOldAngles.y; m_fRoll = vOldAngles.z; m_fMoveStartTm += g_pLTServer->GetFrameTime(); m_fLastTime = fCurTime; m_bUpdateSpin = LTFALSE; return; } g_pLTServer->MoveObject( m_hObject, &vNewPos ); // Check to see if we actually moved anywhere... LTVector vPos; g_pLTServer->GetObjectPos( m_hObject, &vPos ); if( !vPos.NearlyEquals( vNewPos, MATH_EPSILON ) ) { // Restore our angles... m_fPitch = vOldAngles.x; m_fYaw = vOldAngles.y; m_fRoll = vOldAngles.z; m_fMoveStartTm += g_pLTServer->GetFrameTime(); m_fLastTime = fCurTime; m_bUpdateSpin = LTFALSE; return; } g_pLTServer->RotateObject( m_hObject, &rNewRot ); // Keep the Pitch, Yaw and Roll within 2PI so they will never over flow... if( m_fPitch > MATH_CIRCLE ) { m_fPitch = -(MATH_CIRCLE - m_fPitch); } else if( m_fPitch < -MATH_CIRCLE ) { m_fPitch += MATH_CIRCLE; } if( m_fYaw > MATH_CIRCLE ) { m_fYaw = -(MATH_CIRCLE - m_fYaw); } else if( m_fYaw < -MATH_CIRCLE ) { m_fYaw += MATH_CIRCLE; } if( m_fRoll > MATH_CIRCLE ) { m_fRoll = -(MATH_CIRCLE - m_fRoll); } else if( m_fRoll < -MATH_CIRCLE ) { m_fRoll += MATH_CIRCLE; } m_fLastTime = fCurTime; }
void CLeanMgr::UpdateCenter( ) { float fCenterFromAngle = m_fCenterFromAngle; LTVector vCamPos; g_pLTClient->GetObjectPos( g_pPlayerMgr->GetCamera(), &vCamPos ); // Develop the rotation values... m_vRotationPt.Init( vCamPos.x, vCamPos.y - g_vtLeanRadius.GetFloat(), vCamPos.z ); m_vRotationPtOffset.Init( 0.0f, g_vtLeanRadius.GetFloat(), 0.0f ); // Did we try to lean but went back to centering before we finished... if( m_bFailedToLean ) { m_bFailedToLean = false; // Recalculate the time... if( m_fMaxLeanAngle > 0.0f ) { float fMovePercent = float(m_kLeanDir) * (m_fLastLeanAngle / m_fMaxLeanAngle); m_fEndTime = g_vtLeanCenterTime.GetFloat() * fMovePercent; } m_fStartTime = 0.0f; fCenterFromAngle = m_fLastLeanAngle; } // Find the angle based on the percentage of lean we should be at... m_fStartTime += g_pLTClient->GetFrameTime(); float fT = (m_fStartTime / m_fEndTime); bool bDone = CalcAngle( m_fLeanAngle, fCenterFromAngle, 0.0f, eLeanDirection(-m_kLeanDir), m_fEndTime, fT ); // Save our current lean angle... m_fLastLeanAngle = m_fLeanAngle; LTRotation rRot; LTVector vPos; CalculateNewPosRot( vPos, rRot, m_fLeanAngle ); // [KLS 3/22/03] Only adjust the camera in first person... if (g_pPlayerMgr->IsFirstPerson()) { g_pLTClient->SetObjectPosAndRotation( g_pPlayerMgr->GetCamera(), &vPos, &rRot ); } if( bDone ) { // We are centered. m_kLeanDir = kLean_Center; m_bFailedToCenter = false; m_bDoneMoving = false; return; } m_bFailedToCenter = true; }
void SpinningWorldModel::UpdateOn( const double &fCurTime ) { LTVector vNewPos(0.0f, 0.0f, 0.0f); LTRotation rNewRot; float fDeltaTm = (float)(fCurTime - m_fLastTime); float fPercent = 0.0f; LTVector vOldAngles( m_fPitch, m_fYaw, m_fRoll ); m_bUpdateSpin = true; if( m_vVelocity.x ) { m_fPitch += m_vVelocity.x * fDeltaTm; } if( m_vVelocity.y ) { m_fYaw += m_vVelocity.y * fDeltaTm; } if( m_vVelocity.z ) { m_fRoll += m_vVelocity.z * fDeltaTm; } float fDifLeft = (m_vInitOnAngles - LTVector( m_fPitch, m_fYaw, m_fRoll )).Mag(); float fFinalDif = (m_vInitOnAngles - m_vInitOffAngles).Mag(); // Get the percent of our rotation to use for the light ani... fPercent = ( fFinalDif > MATH_EPSILON ? 1 - fDifLeft / fFinalDif : 1.0f ); uint32 nFlags; g_pCommonLT->GetObjectFlags( m_hObject, OFT_Flags, nFlags ); bool bTestCollisions = !!( nFlags & FLAG_SOLID ); if( !CalculateNewPosRot( vNewPos, rNewRot, m_vOnPos, m_fPowerOnTime, fPercent, bTestCollisions ) && !(m_dwPropFlags & AWM_PROP_FORCEMOVE) ) { // Restore our angles... m_fPitch = vOldAngles.x; m_fYaw = vOldAngles.y; m_fRoll = vOldAngles.z; m_fMoveStartTm += g_pLTServer->GetFrameTime(); m_fLastTime = fCurTime; m_bUpdateSpin = false; return; } g_pLTServer->Physics()->MoveObject( m_hObject, vNewPos, 0 ); // Check to see if we actually moved anywhere... LTVector vPos; g_pLTServer->GetObjectPos( m_hObject, &vPos ); if( !vPos.NearlyEquals( vNewPos, MATH_EPSILON ) ) { // Restore our angles... m_fPitch = vOldAngles.x; m_fYaw = vOldAngles.y; m_fRoll = vOldAngles.z; m_fMoveStartTm += g_pLTServer->GetFrameTime(); m_fLastTime = fCurTime; m_bUpdateSpin = false; return; } g_pLTServer->RotateObject( m_hObject, rNewRot ); // Keep the Pitch, Yaw and Roll within 2PI so they will never over flow... if( m_fPitch > MATH_CIRCLE ) { m_fPitch = -(MATH_CIRCLE - m_fPitch); } else if( m_fPitch < -MATH_CIRCLE ) { m_fPitch += MATH_CIRCLE; } if( m_fYaw > MATH_CIRCLE ) { m_fYaw = -(MATH_CIRCLE - m_fYaw); } else if( m_fYaw < -MATH_CIRCLE ) { m_fYaw += MATH_CIRCLE; } if( m_fRoll > MATH_CIRCLE ) { m_fRoll = -(MATH_CIRCLE - m_fRoll); } else if( m_fRoll < -MATH_CIRCLE ) { m_fRoll += MATH_CIRCLE; } m_fLastTime = fCurTime; }
void CLeanMgr::UpdateLean( ) { if( !IsLeaning() ) return; // Don't start leaning untill we are done moving... if( !m_bDoneMoving && (g_pMoveMgr->GetMovementPercent() > MATH_EPSILON) ) { BeginLean( m_kLeanDir ); } else { m_bDoneMoving = true; } LTVector vCamPos; g_pLTClient->GetObjectPos( g_pPlayerMgr->GetCamera(), &vCamPos ); // Develop the rotation values... m_vRotationPt.Init( vCamPos.x, vCamPos.y - g_vtLeanRadius.GetFloat(), vCamPos.z ); m_vRotationPtOffset.Init( 0.0f, g_vtLeanRadius.GetFloat(), 0.0f ); float fLeanFromAngle = m_fLeanFromAngle; // Did we try to center but went back to leaning before we finished... if( m_bFailedToCenter ) { m_bFailedToCenter = false; // Recalculate the time... if( m_fMaxLeanAngle > 0.0f ) { float fMovePercent = 1.0f - (float(m_kLeanDir) * (m_fLastLeanAngle / m_fMaxLeanAngle)); m_fEndTime = g_vtLeanOutTime.GetFloat() * fMovePercent; } m_fStartTime = 0.0f; fLeanFromAngle = m_fLastLeanAngle; } // Find the angle based on the percentage of lean we should be at... m_fStartTime += g_pLTClient->GetFrameTime(); float fT = (m_fStartTime / m_fEndTime); bool bDone = CalcAngle( m_fLeanAngle, fLeanFromAngle, m_fMaxLeanAngle, m_kLeanDir, m_fEndTime, fT ); // Save our last lean angle... m_fLastLeanAngle = m_fLeanAngle; LTRotation rRot; LTVector vPos; CalculateNewPosRot( vPos, rRot, m_fLeanAngle ); // [KLS 3/22/03] Only adjust the camera in first person... if (g_pPlayerMgr->IsFirstPerson()) { g_pLTClient->SetObjectPosAndRotation( g_pPlayerMgr->GetCamera(), &vPos, &rRot ); } if( bDone ) { if( !m_bLeanedOut ) { // We are completely leaned out. m_bLeanedOut = true; // Send a message to the server to register a stimulus. CAutoMessage cMsg; cMsg.Writeuint8( MID_PLAYER_CLIENTMSG ); cMsg.Writeuint8( CP_PLAYER_LEAN ); cMsg.Writeuint8( m_kLeanDir == kLean_Left ? PL_LEFT : PL_RIGHT ); cMsg.WriteLTVector( vPos ); g_pLTClient->SendToServer( cMsg.Read(), MESSAGE_GUARANTEED ); } m_bFailedToLean = false; return; } m_bFailedToLean = true; }