70 lines
2.5 KiB
C#

using System;
namespace UnityEngine.Rendering.HighDefinition
{
internal class SkyUpdateContext
{
SkySettings m_SkySettings;
public SkyRenderer skyRenderer { get; private set; }
public int cachedSkyRenderingContextId = -1;
public int skyParametersHash = -1;
public float currentUpdateTime = 0.0f;
public bool settingsHadBigDifferenceWithPrev { get; private set; }
public SkySettings skySettings
{
get { return m_SkySettings; }
set
{
// We cleanup the renderer first here because in some cases, after scene unload, the skySettings field will be "null" because the object got destroyed.
// In this case, the renderer might stay allocated until a non null value is set. To avoid a lingering allocation, we cleanup first before anything else.
// So next frame after scene unload, renderer will be freed.
if (skyRenderer != null && (value == null || value.GetSkyRendererType() != skyRenderer.GetType()))
{
skyRenderer.Cleanup();
skyRenderer = null;
}
if (m_SkySettings == null)
settingsHadBigDifferenceWithPrev = true;
else
settingsHadBigDifferenceWithPrev = m_SkySettings.SignificantlyDivergesFrom(value);
if (m_SkySettings == value)
return;
skyParametersHash = -1;
m_SkySettings = value;
currentUpdateTime = 0.0f;
if (m_SkySettings != null && skyRenderer == null)
{
var rendererType = m_SkySettings.GetSkyRendererType();
skyRenderer = (SkyRenderer)Activator.CreateInstance(rendererType);
skyRenderer.Build();
}
}
}
public void Cleanup()
{
if (skyRenderer != null)
{
skyRenderer.Cleanup();
}
HDRenderPipeline hdrp = HDRenderPipeline.currentPipeline;
if (hdrp != null)
hdrp.skyManager.ReleaseCachedContext(cachedSkyRenderingContextId);
}
public bool IsValid()
{
// We need to check m_SkySettings because it can be "nulled" when destroying the volume containing the settings (as it's a ScriptableObject) without the context knowing about it.
return m_SkySettings != null;
}
}
}