Add dynamic textures streaming based on visibility

This commit is contained in:
Wojtek Figat
2021-06-18 14:41:44 +02:00
parent 41f0554484
commit f582ca5051
13 changed files with 70 additions and 39 deletions

View File

@@ -4,26 +4,33 @@
#include "Streaming.h"
#include "Engine/Core/Math/Math.h"
#include "Engine/Graphics/Textures/StreamingTexture.h"
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Content/Assets/Model.h"
#include "Engine/Content/Assets/SkinnedModel.h"
#include "Engine/Audio/AudioClip.h"
#include "Engine/Audio/Audio.h"
#include "Engine/Audio/AudioSource.h"
float TexturesStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now)
float TexturesStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime)
{
ASSERT(resource);
auto& texture = *(StreamingTexture*)resource;
const TextureHeader& header = *texture.GetHeader();
if (header.TextureGroup < 0 || header.TextureGroup >= Streaming::TextureGroups.Count())
float result = 1.0f;
if (header.TextureGroup >= 0 && header.TextureGroup < Streaming::TextureGroups.Count())
{
// Full texture load by default
return 1.0f;
}
// Quality based on texture group settings
const TextureGroup& group = Streaming::TextureGroups[header.TextureGroup];
result = group.Quality;
// Quality based on texture group settings
const TextureGroup& group = Streaming::TextureGroups[header.TextureGroup];
return group.QualityScale;
// Drop quality if invisible
const double lastRenderTime = texture.GetTexture()->LastRenderTime;
if (lastRenderTime < 0 || group.TimeToInvisible <= (float)(currentTime - lastRenderTime))
{
result *= group.QualityIfInvisible;
}
}
return result;
}
int32 TexturesStreamingHandler::CalculateResidency(StreamableResource* resource, float quality)
@@ -86,7 +93,7 @@ int32 TexturesStreamingHandler::CalculateRequestedResidency(StreamableResource*
return residency;
}
float ModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now)
float ModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime)
{
// TODO: calculate a proper quality levels for models based on render time and streaming enable/disable options
return 1.0f;
@@ -127,7 +134,7 @@ int32 ModelsStreamingHandler::CalculateRequestedResidency(StreamableResource* re
return residency;
}
float SkinnedModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now)
float SkinnedModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime)
{
// TODO: calculate a proper quality levels for models based on render time and streaming enable/disable options
return 1.0f;
@@ -168,7 +175,7 @@ int32 SkinnedModelsStreamingHandler::CalculateRequestedResidency(StreamableResou
return residency;
}
float AudioStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now)
float AudioStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime)
{
// Audio clips don't use quality but only residency
return 1.0f;