| 340 | } |
| 341 | |
| 342 | void Tr2VolumetricsRenderer::UpdateFogSettings( const EveComponentRegistry& registry, const EveUpdateContext& updateContext ) |
| 343 | { |
| 344 | std::vector<ITr2FroxelFogSettings::FroxelFogSettings*> overrides; |
| 345 | double logBlendingSmoothness = m_logBlendingSmoothness; |
| 346 | |
| 347 | registry.ProcessComponents<ITr2FroxelFogSettings>( [&overrides, logBlendingSmoothness]( ITr2FroxelFogSettings* component ) -> void { |
| 348 | ITr2FroxelFogSettings::FroxelFogSettings* fogSettings = component->GetFroxelFogSettings(); |
| 349 | |
| 350 | //Compute log(1 + thickness * m_logBlendingSmoothness) for each fog |
| 351 | fogSettings->logThickness.value = log1p( (double)fogSettings->thickness.value * logBlendingSmoothness ); |
| 352 | fogSettings->logThickness.enabled = fogSettings->thickness.enabled; |
| 353 | |
| 354 | overrides.push_back( fogSettings ); |
| 355 | } ); |
| 356 | sort( begin( overrides ), end( overrides ), []( const auto& a, const auto& b ) { |
| 357 | return a->priority > b->priority; |
| 358 | } ); |
| 359 | |
| 360 | //m_froxelFogSettings = OldPriorityBlend( overrides ); |
| 361 | |
| 362 | //std::vector<ITr2FroxelFogSettings::FroxelFogSettings*> test; |
| 363 | |
| 364 | #define FROXEL_ACCUMULATE( setting ) m_froxelFogSettings.setting = PriorityBlend::Accumulate( &ITr2FroxelFogSettings::FroxelFogSettings::setting, overrides ) |
| 365 | |
| 366 | FROXEL_ACCUMULATE( thickness ); |
| 367 | |
| 368 | FROXEL_ACCUMULATE( lightDirectionality ); |
| 369 | |
| 370 | FROXEL_ACCUMULATE( environmentIntensity ); |
| 371 | FROXEL_ACCUMULATE( environmentDirectionality ); |
| 372 | |
| 373 | FROXEL_ACCUMULATE( fogColor ); |
| 374 | FROXEL_ACCUMULATE( backgroundVisibility ); |
| 375 | |
| 376 | FROXEL_ACCUMULATE( godRayNoiseIntensity ); |
| 377 | FROXEL_ACCUMULATE( godRayNoiseFrequency ); |
| 378 | FROXEL_ACCUMULATE( godRayNoiseAnimationSpeed ); |
| 379 | |
| 380 | FROXEL_ACCUMULATE( fogNoiseIntensity ); |
| 381 | FROXEL_ACCUMULATE( fogNoiseFrequency ); |
| 382 | FROXEL_ACCUMULATE( fogNoiseMovementSpeed ); |
| 383 | |
| 384 | if( m_logBlending ) |
| 385 | { |
| 386 | //Replace the thickness with a logarithmically interpolated one, making the transition from 0 thickness more graceful. |
| 387 | FROXEL_ACCUMULATE( logThickness ); |
| 388 | m_froxelFogSettings.thickness = (float)( expm1( m_froxelFogSettings.logThickness.value ) / logBlendingSmoothness ); |
| 389 | } |
| 390 | |
| 391 | float delta = updateContext.GetDeltaT(); |
| 392 | |
| 393 | m_godRayNoiseAnimation += m_froxelFogSettings.godRayNoiseAnimationSpeed.value * ( delta / m_froxel3DNoise->GetDepth() ); |
| 394 | m_godRayNoiseAnimation -= floor( m_godRayNoiseAnimation ); |
| 395 | |
| 396 | float fogFrequency = exp2f( -m_froxelFogSettings.fogNoiseFrequency.value ); |
| 397 | m_fogNoiseMovement += m_froxelFogSettings.fogNoiseMovementSpeed.value * delta; |
| 398 | } |
| 399 |
no test coverage detected