Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}