Add dynamic textures streaming based on visibility
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user