コード例 #1
0
void CIKTorsoAim_Helper::Update( CIKTorsoAim_Helper::SIKTorsoParams& ikTorsoParams )
{
    if (!m_initialized)
        {
            Init(ikTorsoParams);
        }

    const int  STAPLayer	= GetGameConstCVar(g_stapLayer);

    const bool justTurnedOn = (m_blendFactor == 0.0f) && m_enabled;
    const float frameTime = gEnv->pTimer->GetFrameTime();
    const float delta = (frameTime * ikTorsoParams.blendRate);
    const float newBlendFactor = m_enabled ? m_blendFactor + delta : m_blendFactor - delta;
    m_blendFactor = clamp(newBlendFactor, 0.0f, 1.0f);
    const bool blendPosition = ikTorsoParams.needsSTAPPosition;
    if (justTurnedOn)
        {
            m_blendFactorPosition = blendPosition ? 1.0f : 0.0f;
        }
    else
        {
            const float newBlendFactorPos = blendPosition ? m_blendFactorPosition + delta : m_blendFactorPosition - delta;
            m_blendFactorPosition = clamp(newBlendFactorPos, 0.0f, 1.0f);
        }

    //const float XPOS = 200.0f;
    //const float YPOS = 110.0f;
    //const float FONT_SIZE = 4.0f;
    //const float FONT_COLOUR[4] = {1,1,1,1};
    //gEnv->pRenderer->Draw2dLabel(XPOS, YPOS, FONT_SIZE, FONT_COLOUR, false, "CIKTorsoAim_Helper::Update: %s", m_blendTime > 0.0f ? "update" : "dont update");

    if (m_blendFactor <= 0.0f)
        return;

    CIKTorsoAim *torsoAim = m_ikTorsoAim.get();

    torsoAim->SetBlendWeight(m_blendFactor);
    torsoAim->SetBlendWeightPosition(m_blendFactorPosition);
    torsoAim->SetTargetDirection(ikTorsoParams.aimDirection);
    torsoAim->SetViewOffset(ikTorsoParams.viewOffset);
    torsoAim->SetAbsoluteTargetPosition(ikTorsoParams.targetPosition);

    ikTorsoParams.character->GetISkeletonAnim()->PushPoseModifier(STAPLayer, cryinterface_cast<IAnimationPoseModifier>(m_ikTorsoAim), "IKTorsoAimHelper");

    if (ikTorsoParams.shadowCharacter)
        {
            m_transformationPin->SetBlendWeight(ikTorsoParams.updateTranslationPinning ? m_blendFactor : 0.0f);
            ikTorsoParams.character->GetISkeletonAnim()->PushPoseModifier(15, cryinterface_cast<IAnimationPoseModifier>(m_transformationPin), "IKTorsoAimHelper");
        }
}
コード例 #2
0
void CProceduralWeaponAnimationContext::Update(float timePassed)
{
	ICharacterInstance* pCharacter = m_pScope->GetCharInst();
	if (m_instanceCount <= 0 || pCharacter == 0)
		return;

	m_weaponSway.Update(timePassed);
	const QuatT rightOffset = m_weaponSway.GetRightOffset();
	const QuatT leftOffset = m_weaponSway.GetLeftOffset();

	const int PWALayer = GetGameConstCVar(g_pwaLayer);
	pCharacter->GetISkeletonAnim()->PushPoseModifier(PWALayer, cryinterface_cast<IAnimationPoseModifier>(m_pPoseModifier), "ProceduralWeapon");

	m_pPoseModifier->Clear();

	const IAnimationOperatorQueue::EOp set = IAnimationOperatorQueue::eOp_OverrideRelative;
	const IAnimationOperatorQueue::EOp additive = IAnimationOperatorQueue::eOp_Additive;

	ISkeletonPose* pPose = pCharacter->GetISkeletonPose();
	Vec3 relBlendPos = Vec3(1.0f, 0.0f, 0.0f);
	m_pPoseModifier->PushPosition(m_params.m_rightBlendIkIdx, set, relBlendPos);

	Quat view = Quat::CreateRotationVDir(m_aimDirection);
	Quat invView = view.GetInverted();

	QuatT rightHand;
	rightHand.t = view * rightOffset.t;
	rightHand.q = view * (rightOffset.q * invView);
	m_pPoseModifier->PushPosition(m_params.m_weaponTargetIdx, additive, rightHand.t);
	m_pPoseModifier->PushOrientation(m_params.m_weaponTargetIdx, additive, rightHand.q);

	QuatT leftHand;
	leftHand.t = view * leftOffset.t;
	leftHand.q = view * (leftOffset.q * invView);
	m_pPoseModifier->PushPosition(m_params.m_leftHandTargetIdx, additive, leftHand.t);
	m_pPoseModifier->PushOrientation(m_params.m_leftHandTargetIdx, additive, leftHand.q);
}
コード例 #3
0
void CDoorPanel::Update( SEntityUpdateContext& ctx, int slot )
{
	if (m_bHasDelayedStateEvent)
	{
		if (m_fDelayedStateEventTimeDelay > FLT_EPSILON)
		{
			m_fDelayedStateEventTimeDelay -= ctx.fFrameTime;
		}
		else
		{
			m_fDelayedStateEventTimeDelay = -1.0f;
			m_bHasDelayedStateEvent = false;
			const EDoorPanelBehaviorState delayedState = m_delayedState;
			m_delayedState = eDoorPanelBehaviorState_Invalid;
			SetStateById(delayedState);
		}		
	}

	// Check visible distance
	if (m_fVisibleDistanceSq > 0.0f)
	{
		const float fCurTime = ctx.fCurrTime;
		if ((fCurTime - m_fLastVisibleDistanceCheckTime) >= GetGameConstCVar(g_flashdoorpanel_distancecheckinterval))
		{
			m_fLastVisibleDistanceCheckTime = fCurTime;
			const Vec3& clientPos = CHUDUtils::GetClientPos();
			const float fDistSqFromClientToObject = clientPos.GetSquaredDistance(GetEntity()->GetWorldPos());
			const bool bVisible = fDistSqFromClientToObject <= m_fVisibleDistanceSq;
			if (bVisible != m_bFlashVisible)
			{
				m_bFlashVisible = bVisible;
				SDoorPanelVisibleEvent visibleEvent( bVisible );
				StateMachineHandleEventBehavior( visibleEvent );
			}
		}
	}
}
コード例 #4
0
bool CLocalPlayerComponent::ShouldUpdateTranslationPinning() const
{
	return !m_rPlayer.IsSliding() && !m_rPlayer.IsExitingSlide()
		&& (GetGameConstCVar(g_translationPinningEnable) != 0) 
		&& !m_rPlayer.GetActorStats()->bDisableTranslationPinning;
}
コード例 #5
0
//------------------------------------------------------------------------
bool CTracer::Update(float frameTime, const Vec3 &camera, const float fovScale)
{
	frameTime							= (float)__fsel(-m_age, 0.002f, frameTime);
	const float tracerAge	= (float)__fsel(-m_age, 0.002f, m_age+frameTime);

	m_age = tracerAge;

	if (tracerAge >= m_lifeTime)
		return false;

	Vec3 currentLimitDestination;
	if (gEnv->bMultiplayer)
	{
		if(m_tracerFlags & kTracerFlag_updateDestFromBullet)
		{
			IEntity* pBulletEntity = gEnv->pEntitySystem->GetEntity(m_boundToBulletId);
			if(pBulletEntity)
			{
				m_dest = pBulletEntity->GetPos();
			}
		}
		currentLimitDestination = m_dest;
	}
	else
	{
		IEntity* pBulletEntity = gEnv->pEntitySystem->GetEntity(m_boundToBulletId);
		currentLimitDestination = pBulletEntity ? pBulletEntity->GetPos() : m_dest;
	}

	const Vec3 maxTravelledDistance = m_dest - m_startingPos;
	const float maxTravelledDistanceSqr = maxTravelledDistance.len2();
	
	float dist = sqrt_tpl(maxTravelledDistanceSqr);
	if (dist <= 0.001f)
		return false;
		
	const Vec3 dir = maxTravelledDistance * (float)__fres(dist);
	Vec3 pos = m_pos;
	float lengthScale = 1.f;
	Vec3 newPos = m_pos;
	
	if (!(m_tracerFlags & kTracerFlag_dontTranslate))
  {
    const float sqrRadius = GetGameConstCVar(g_tracers_slowDownAtCameraDistance) * GetGameConstCVar(g_tracers_slowDownAtCameraDistance);
		const float cameraDistance = (m_pos-camera).len2();
    const float speed = m_speed * (float)__fsel(sqrRadius - cameraDistance, 0.35f + (cameraDistance/(sqrRadius*2)), 1.0f); //Slow down tracer when near the player
    newPos += dir * min(speed*frameTime, dist);
	  pos = newPos;

		if(m_slideFrac > 0.f)
		{
			pos += (((2.f * cry_frand()) - 0.5f) * m_slideFrac * speed * frameTime * dir);
		}
  }

	// Now update visuals...
	if (IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entityId))
	{
		AABB tracerBbox;
		pEntity->GetWorldBounds(tracerBbox);

		float tracerHalfLength = !tracerBbox.IsEmpty() ? tracerBbox.GetRadius() : 0.0f;
		const Vec3 frontOfTracerPos = pos + (dir * tracerHalfLength);

		if((frontOfTracerPos-m_startingPos).len2() > maxTravelledDistanceSqr)
		{
			return false;
		}
	
		if (!(m_tracerFlags & kTracerFlag_dontTranslate) && tracerHalfLength > 0.f)
		{
			//Ensure that never goes in front of the bullet
			const Vec3 dirFromFrontOfTracerToDestination = currentLimitDestination - frontOfTracerPos;
			if (dir.dot(dirFromFrontOfTracerToDestination) < 0)
			{
				pos += dirFromFrontOfTracerToDestination;
			}

			// ... and check if back of tracer is behind starting point, so adjust length.
			const Vec3 backOfTracerPos = pos - (dir * tracerHalfLength);
			const Vec3 dirFromBackOfTracerToStart = m_startingPos - backOfTracerPos;

			if (dir.dot(dirFromBackOfTracerToStart) > 0)
			{
				if(dir.dot((m_startingPos - pos)) > 0)
				{
					pos = m_startingPos + (dir * cry_frand() * tracerHalfLength);
				}

				lengthScale = ((pos - m_startingPos).GetLength() / tracerHalfLength);
			}
		}
		
		m_pos = newPos;
		
		Matrix34 tm(Matrix33::CreateRotationVDir(dir));
		tm.AddTranslation(pos);

		pEntity->SetWorldTM(tm);

		//Do not scale effects
		if((m_tracerFlags & kTracerFlag_useGeometry))
		{
			float finalFovScale = fovScale;
			if((m_tracerFlags & kTracerFlag_scaleToDistance) != 0)
			{
				lengthScale = dist * 0.5f;
			}
			else
			{
				const float cameraDistanceSqr = (m_pos-camera).len2();
				const float minScale = GetGameConstCVar(g_tracers_minScale);
				const float maxScale = GetGameConstCVar(g_tracers_maxScale);
				const float minDistanceRange = GetGameConstCVar(g_tracers_minScaleAtDistance) * GetGameConstCVar(g_tracers_minScaleAtDistance);
				const float maxDistanceRange = max(GetGameConstCVar(g_tracers_maxScaleAtDistance) * GetGameConstCVar(g_tracers_maxScaleAtDistance), minDistanceRange + 1.0f);
				const float currentRefDistance = clamp(cameraDistanceSqr, minDistanceRange, maxDistanceRange);

				const float distanceToCameraFactor = ((currentRefDistance - minDistanceRange) / (maxDistanceRange - minDistanceRange));
				const float distanceToCameraScale = LERP(minScale, maxScale, distanceToCameraFactor);
				
				lengthScale = m_scale * distanceToCameraScale;
				finalFovScale *= distanceToCameraScale;
			}
			
			const float widthScale = fovScale;

			tm.SetIdentity();
			tm.SetScale(Vec3(m_scale * finalFovScale, lengthScale, m_scale * finalFovScale));
			pEntity->SetSlotLocalTM(m_geometrySlot,tm);
		}
	}

	return true;
}