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; }
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; }
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) ); } } }