//------------------------------------------------------------------------ void CIronSight::UpdateDepthOfField(CActor *pActor, float frameTime, float t) { if(pActor) { CPlayer *pPlayer = static_cast<CPlayer *>(pActor); if(IMovementController *pMV = pActor->GetMovementController()) { SMovementState ms; pMV->GetMovementState(ms); Vec3 start = ms.eyePosition; Vec3 dir = ms.eyeDirection; static ray_hit hit; IPhysicalEntity *pSkipEntities[10]; int nSkip = CSingle::GetSkipEntities(m_pWeapon, pSkipEntities, 10); // jitter the direction (non-uniform disk sampling ... we want to bias the center in this case) f32 cosTheta, sinTheta; f32 theta = Random() * gf_PI2; f32 spreadAngle = DEG2RAD(g_pGameCVars->g_dof_sampleAngle)/2.0f; f32 scale = tan_tpl(spreadAngle); f32 radiusSqrt = scale * Random(); sincos_tpl(theta, &cosTheta, &sinTheta); f32 x = radiusSqrt * cosTheta; f32 y = radiusSqrt * sinTheta; Matrix33 viewRotation(pPlayer->GetViewQuatFinal()); Vec3 xOff = x * viewRotation.GetColumn0(); Vec3 yOff = y * viewRotation.GetColumn2(); // jitter if(true) { dir += xOff + yOff; dir.Normalize(); } const float maxRelaxSpeed = 1.0f; f32 delta; if(gEnv->pPhysicalWorld->RayWorldIntersection(start, 1000.0f*dir, ent_all, rwi_pierceability(10)|rwi_ignore_back_faces, &hit, 1, pSkipEntities, nSkip)) { delta = g_pGameCVars->g_dof_minHitScale*hit.dist - m_minDoF; Limit(delta, -g_pGameCVars->g_dof_minAdjustSpeed, g_pGameCVars->g_dof_minAdjustSpeed); //delta *= fabs(delta/minAdjustSpeed); m_minDoF += delta * frameTime; delta = g_pGameCVars->g_dof_maxHitScale*hit.dist - m_maxDoF; Limit(delta, -g_pGameCVars->g_dof_maxAdjustSpeed, g_pGameCVars->g_dof_maxAdjustSpeed); //delta *= fabs(delta/maxAdjustSpeed); m_maxDoF += delta * frameTime; } if(m_maxDoF - g_pGameCVars->g_dof_distAppart < m_minDoF) { m_maxDoF = m_minDoF + g_pGameCVars->g_dof_distAppart; } else { // relax max to min delta = m_minDoF - m_maxDoF; Limit(delta, -maxRelaxSpeed, maxRelaxSpeed); //delta *= fabs(delta/maxRelaxSpeed); m_maxDoF += delta * frameTime; } // the average is relaxed to the center between min and max m_averageDoF = (m_maxDoF - m_minDoF)/2.0f; Limit(delta, -g_pGameCVars->g_dof_averageAdjustSpeed, g_pGameCVars->g_dof_averageAdjustSpeed); //delta *= fabs(delta/averageAdjustSpeed); m_averageDoF += delta * frameTime; } } }
void CPlayerVisTable::DoVisibilityCheck(const Vec3& localPlayerPosn, SVisTableEntry& visInfo, VisEntryIndex visIndex) { Vec3 vecToTarget; IEntity * pEntity = gEnv->pEntitySystem->GetEntity(visInfo.entityId); if(pEntity) { IPhysicalEntity* pTargetPhysEnt = pEntity->GetPhysics(); SDeferredLinetestBuffer& targetBuffer = m_linetestBuffers[GetCurrentLinetestBufferTargetIndex()]; if(targetBuffer.m_numLinetestsCurrentlyProcessing < kMaxVisTableLinetestsPerFrame) { visInfo.framesSinceLastCheck = 0; SDeferredLinetestReceiver * processingEntry = GetAvailableDeferredLinetestReceiver(targetBuffer); assert(processingEntry); Vec3 targetPosn = pEntity->GetWorldPos(); if (visInfo.flags & eVF_CheckAgainstCenter) { AABB targetBbox; pEntity->GetWorldBounds(targetBbox); if (!targetBbox.IsEmpty()) { targetPosn = targetBbox.GetCenter(); } float radius = min(min(targetBbox.max.x-targetBbox.min.x, targetBbox.max.y-targetBbox.min.y), targetBbox.max.z-targetBbox.min.z); targetPosn += (localPlayerPosn-targetPosn).GetNormalized() * radius * 0.25f; } targetPosn.z += visInfo.heightOffset; vecToTarget = targetPosn - localPlayerPosn; processingEntry->visTableIndex = visIndex; ray_hit hit; const int rayFlags = rwi_colltype_any(geom_colltype_solid&(~geom_colltype_player)) | rwi_ignore_noncolliding | rwi_pierceability(PIERCE_GLASS); m_numLinetestsThisFrame++; targetBuffer.m_numLinetestsCurrentlyProcessing++; visInfo.flags |= eVF_Pending; visInfo.flags &= ~eVF_CheckAgainstCenter; processingEntry->visBufferIndex = m_currentBufferTarget; const int numEntries = kMaxNumIgnoreEntities + 1; IPhysicalEntity* pSkipEnts[numEntries]; int numSkipEnts = 0; if(pTargetPhysEnt) { pSkipEnts[numSkipEnts] = pTargetPhysEnt; numSkipEnts++; } if (m_currentNumIgnoreEntities) { for(int i = 0; i < m_currentNumIgnoreEntities; ++i) { SIgnoreEntity& ignoreEnt = m_globalIgnoreEntities[i]; CRY_ASSERT(ignoreEnt.id); IEntity* pIgnoreEntity = gEnv->pEntitySystem->GetEntity(ignoreEnt.id); IPhysicalEntity* pIgnorePhysicsEntity = pIgnoreEntity ? pIgnoreEntity->GetPhysics() : NULL; if (pIgnorePhysicsEntity) { pSkipEnts[numSkipEnts] = pIgnorePhysicsEntity; numSkipEnts++; } } } CRY_ASSERT(processingEntry->queuedRayID == 0); processingEntry->queuedRayID = g_pGame->GetRayCaster().Queue( RayCastRequest::HighPriority, RayCastRequest(localPlayerPosn, vecToTarget, ent_terrain|ent_static|ent_sleeping_rigid|ent_rigid, rayFlags, pSkipEnts, numSkipEnts, 2), functor(*processingEntry, &SDeferredLinetestReceiver::OnDataReceived)); #if ALLOW_VISTABLE_DEBUGGING m_debugDraw.UpdateDebugTarget(visInfo.entityId, targetPosn, ((visInfo.flags & eVF_Visible) != 0)); #endif } } else { visInfo.flags |= eVF_Remove; } }