void CPlayerRotation::ProcessLean()
{
	float leanAmt(0.0f);

	if(m_stats.isOnLadder)
	{
		return;
	}

	if (!m_stats.inZeroG || m_stats.inAir < 0.1f)
	{
		if(float sLean = m_player.GetSpeedLean())
		{
			leanAmt = std::min(1.0f, sLean * 0.05f);
		}
		else if((m_actions & (ACTION_LEANLEFT | ACTION_LEANRIGHT)) != 0)
		{
			leanAmt = ((m_actions & ACTION_LEANLEFT) ? -1.0f : 0.0f) + ((m_actions & ACTION_LEANRIGHT) ? 1.0f : 0.0f);
		}
		else if(fabsf(m_desiredLeanAmount) > 0.01f)
		{
			leanAmt = m_desiredLeanAmount;
		}
	}

	EStance stance = m_player.GetStance();

	if (stance == STANCE_PRONE)
	{
		leanAmt *= 0.65f;
	}

	m_leanAmount = leanAmt;

	//check if its possible
	if (m_leanAmount * m_leanAmount > 0.01f)
	{
		float noLean(0.0f);
		Vec3 headPos(m_player.GetEntity()->GetWorldPos() + m_baseQuat * m_player.GetStanceViewOffset(stance, &noLean));
		Vec3 newPos(m_player.GetEntity()->GetWorldPos() + m_baseQuat * m_player.GetStanceViewOffset(stance, &m_leanAmount));
		/*gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(headPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(newPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawLine(headPos, ColorB(0,0,255,255), newPos, ColorB(0,0,255,255));*/
		ray_hit hit;
		int rayFlags(rwi_stop_at_pierceable | rwi_colltype_any); //COLLISION_RAY_PIERCABILITY & rwi_pierceability_mask);
		IPhysicalEntity *pSkip(m_player.GetEntity()->GetPhysics());
		float distMult(3.0f);

		if (gEnv->pPhysicalWorld->RayWorldIntersection(headPos + m_viewQuat.GetColumn1() * 0.25f, (newPos - headPos)*distMult, ent_terrain | ent_static | ent_rigid | ent_sleeping_rigid, rayFlags, &hit, 1, &pSkip, 1))
		{
			float dist((headPos - newPos).len2() * distMult);
			m_leanAmount *= ((hit.pt - headPos).len2() / dist) / distMult;
			//gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(hit.pt, 0.05f, ColorB(0,255,0,255) );
		}
	}
}
    intrusive_ptr<DocumentSource> DocumentSourceSkip::createFromBson(
        BSONElement *pBsonElement,
        const intrusive_ptr<ExpressionContext> &pExpCtx) {
        uassert(15972, str::stream() << DocumentSourceSkip::skipName <<
                ":  the value to skip must be a number",
                pBsonElement->isNumber());

        intrusive_ptr<DocumentSourceSkip> pSkip(
            DocumentSourceSkip::create(pExpCtx));

        pSkip->skip = pBsonElement->numberLong();
        uassert(15956, str::stream() << DocumentSourceSkip::skipName <<
                ":  the number to skip cannot be negative",
                pSkip->skip >= 0);

        return pSkip;
    }
Beispiel #3
0
void CPlayerRotation::ProcessLeanAndPeek( const SActorFrameMovementParams& movement )
{
	const float leanAmt = (float)__fsel(0.01f - fabsf(movement.desiredLean), 0.0f, movement.desiredLean);

	m_leanAmount = leanAmt;

	//check if its possible
	if ((leanAmt*leanAmt) < 0.01f)
	{
		m_leanAndPeekInfo.Reset();	//Clear any previous result
	}
	else
	{
		const EStance stance = m_player.GetStance();
		const float noLean(0.0f);
		const Vec3 playerPosition = m_player.GetEntity()->GetWorldPos();
		const Vec3 headPos(playerPosition + m_baseQuat * m_player.GetStanceViewOffset(stance,&noLean));
		const Vec3 newPos(playerPosition + m_baseQuat * m_player.GetStanceViewOffset(stance,&m_leanAmount));

		/*gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(headPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(newPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawLine(headPos, ColorB(0,0,255,255), newPos, ColorB(0,0,255,255));*/

		const int rayFlags(rwi_stop_at_pierceable|rwi_colltype_any);
		IPhysicalEntity *pSkip(m_player.GetEntity()->GetPhysics());

		const float distMult(3.0f);
		const float distMultInv(1.0f/distMult);

		const Vec3& limitPoint = m_leanAndPeekInfo.GetLeanLimit(headPos + m_viewQuat.GetColumn1() * 0.25f, (newPos - headPos)*distMult, ent_terrain|ent_static|ent_rigid|ent_sleeping_rigid, rayFlags, &pSkip, pSkip ? 1 : 0);

		const bool validHit = (!limitPoint.IsZero());
		if (validHit)
		{
			const float dist((headPos - newPos).len2() * distMult);
			const float invDist = dist>0.f ? __fres(dist) : 0.f;
			m_leanAmount *= ((limitPoint - headPos).len2() * invDist * distMultInv);

			//gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(hit.pt, 0.05f, ColorB(0,255,0,255) );
		}
	}

	// TODO(Márcio): Maybe do some checks here!
	m_peekOverAmount = movement.desiredPeekOver;
}
Beispiel #4
0
void CPlayerRotation::ProcessLean()
{
	float leanAmt(0.0f);

	if(m_stats.isOnLadder)
		return;

	if (!m_stats.inZeroG || m_stats.inAir<0.1f)
	{
		if(float sLean = m_player.GetSpeedLean())
			leanAmt = std::min(1.0f, sLean * 0.05f);
		else if((m_actions & (ACTION_LEANLEFT|ACTION_LEANRIGHT)) != 0)
			leanAmt = ((m_actions & ACTION_LEANLEFT)?-1.0f:0.0f) + ((m_actions & ACTION_LEANRIGHT)?1.0f:0.0f);
		else if(fabsf(m_desiredLeanAmount) > 0.01f)
			leanAmt = m_desiredLeanAmount;
	}
	
	
	// head offset model for leaning and for forward tilting based on tracker info...
	if (m_player.IsClient() && g_vr->initialized())
	{	
		Ang3 tmp;
		g_vr->headOrientation(tmp);
		float headRoll = RAD2DEG(tmp.y);

		if ( headRoll > 180.f ) //handle wrap around
		{
			headRoll = -360.f + headRoll;
		}
		else if ( headRoll < -180.f )
		{
			headRoll = 360 + headRoll;
		}

		leanAmt = headRoll / 45.f;

		// CryLogAlways("Head Roll: %f Lean: %f", headRoll, leanAmt);

	}
			
	EStance stance = m_player.GetStance();
	if (stance == STANCE_PRONE)
		leanAmt *= 0.65f;

	m_leanAmount = leanAmt;
	
	//check if its possible
	if (m_leanAmount*m_leanAmount > 0.01f)
	{
		float noLean(0.0f);
		Vec3 headPos(m_player.GetEntity()->GetWorldPos() + m_baseQuat * m_player.GetStanceViewOffset(stance,&noLean));
		Vec3 newPos(m_player.GetEntity()->GetWorldPos() + m_baseQuat * m_player.GetStanceViewOffset(stance,&m_leanAmount));

		/*gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(headPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(newPos, 0.05f, ColorB(0,0,255,255) );
		gEnv->pRenderer->GetIRenderAuxGeom()->DrawLine(headPos, ColorB(0,0,255,255), newPos, ColorB(0,0,255,255));*/

		ray_hit hit;
		int rayFlags(rwi_stop_at_pierceable|rwi_colltype_any);//COLLISION_RAY_PIERCABILITY & rwi_pierceability_mask);
		IPhysicalEntity *pSkip(m_player.GetEntity()->GetPhysics());

		float distMult(3.0f);

		if (gEnv->pPhysicalWorld->RayWorldIntersection(headPos + m_viewQuat.GetColumn1() * 0.25f, (newPos - headPos)*distMult, ent_terrain|ent_static|ent_rigid|ent_sleeping_rigid, rayFlags, &hit, 1, &pSkip, 1))
		{
			float dist((headPos - newPos).len2() * distMult);
			m_leanAmount *= ((hit.pt - headPos).len2() / dist) / distMult;

			//gEnv->pRenderer->GetIRenderAuxGeom()->DrawSphere(hit.pt, 0.05f, ColorB(0,255,0,255) );
		}
	}
}