Rasagar/Library/PackageCache/com.unity.render-pipelines.high-definition/Editor/Lighting/Reflection/HDScreenSpaceReflectionEditor.cs
2024-08-26 23:07:20 +03:00

435 lines
26 KiB
C#

using UnityEngine;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Rendering;
using RayTracingMode = UnityEngine.Rendering.HighDefinition.RayTracingMode;
using System;
namespace UnityEditor.Rendering.HighDefinition
{
[CanEditMultipleObjects]
[CustomEditor(typeof(ScreenSpaceReflection))]
class HDScreenSpaceReflectionEditor : VolumeComponentWithQualityEditor
{
// Shared data
SerializedDataParameter m_Enable;
SerializedDataParameter m_EnableTransparent;
SerializedDataParameter m_Tracing;
SerializedDataParameter m_MinSmoothness;
SerializedDataParameter m_SmoothnessFadeStart;
// SSR Only
SerializedDataParameter m_ReflectSky;
SerializedDataParameter m_UsedAlgorithm;
SerializedDataParameter m_ScreenFadeDistance;
SerializedDataParameter m_RayMaxIterations;
SerializedDataParameter m_DepthBufferThickness;
SerializedDataParameter m_AccumulationFactor;
SerializedDataParameter m_BiasFactor;
SerializedDataParameter m_EnableWorldSpeedRejection;
SerializedDataParameter m_SpeedRejectionFactor;
SerializedDataParameter m_SpeedRejectionScalerFactor;
SerializedDataParameter m_SpeedSmoothReject;
SerializedDataParameter m_SpeedSurfaceOnly;
SerializedDataParameter m_SpeedTargetOnly;
// Ray Tracing
SerializedDataParameter m_RayMiss;
SerializedDataParameter m_LastBounce;
SerializedDataParameter m_AmbientProbeDimmer;
SerializedDataParameter m_LayerMask;
SerializedDataParameter m_TextureLodBias;
SerializedDataParameter m_RayLength;
SerializedDataParameter m_ClampValue;
SerializedDataParameter m_Denoise;
SerializedDataParameter m_DenoiserRadius;
SerializedDataParameter m_DenoiserAntiFlickeringStrength;
SerializedDataParameter m_Mode;
// Mixed
SerializedDataParameter m_RayMaxIterationsRT;
// Performance
SerializedDataParameter m_FullResolution;
// Quality
SerializedDataParameter m_SampleCount;
SerializedDataParameter m_BounceCount;
public override void OnEnable()
{
var o = new PropertyFetcher<ScreenSpaceReflection>(serializedObject);
// Shared data
m_Enable = Unpack(o.Find(x => x.enabled));
m_EnableTransparent = Unpack(o.Find(x => x.enabledTransparent));
m_Tracing = Unpack(o.Find(x => x.tracing));
m_MinSmoothness = Unpack(o.Find(x => x.minSmoothness));
m_SmoothnessFadeStart = Unpack(o.Find(x => x.smoothnessFadeStart));
// SSR Data
m_ReflectSky = Unpack(o.Find(x => x.reflectSky));
m_UsedAlgorithm = Unpack(o.Find(x => x.usedAlgorithm));
m_DepthBufferThickness = Unpack(o.Find(x => x.depthBufferThickness));
m_RayMaxIterations = Unpack(o.Find(x => x.rayMaxIterations));
m_ScreenFadeDistance = Unpack(o.Find(x => x.screenFadeDistance));
m_AccumulationFactor = Unpack(o.Find(x => x.accumulationFactor));
m_BiasFactor = Unpack(o.Find(x => x.biasFactor));
m_SpeedRejectionFactor = Unpack(o.Find(x => x.speedRejectionParam));
m_BiasFactor = Unpack(o.Find(x => x.biasFactor));
m_EnableWorldSpeedRejection = Unpack(o.Find(x => x.enableWorldSpeedRejection));
m_SpeedRejectionScalerFactor = Unpack(o.Find(x => x.speedRejectionScalerFactor));
m_SpeedSmoothReject = Unpack(o.Find(x => x.speedSmoothReject));
m_SpeedSurfaceOnly = Unpack(o.Find(x => x.speedSurfaceOnly));
m_SpeedTargetOnly = Unpack(o.Find(x => x.speedTargetOnly));
// Generic ray tracing
m_RayMiss = Unpack(o.Find(x => x.rayMiss));
m_LastBounce = Unpack(o.Find(x => x.lastBounceFallbackHierarchy));
m_AmbientProbeDimmer = Unpack(o.Find(x => x.ambientProbeDimmer));
m_LayerMask = Unpack(o.Find(x => x.layerMask));
m_TextureLodBias = Unpack(o.Find(x => x.textureLodBias));
m_RayLength = Unpack(o.Find(x => x.rayLength));
m_ClampValue = Unpack(o.Find(x => x.clampValue));
m_Denoise = Unpack(o.Find(x => x.denoise));
m_DenoiserRadius = Unpack(o.Find(x => x.denoiserRadius));
m_DenoiserAntiFlickeringStrength = Unpack(o.Find(x => x.denoiserAntiFlickeringStrength));
m_Mode = Unpack(o.Find(x => x.mode));
// Mixed
m_RayMaxIterationsRT = Unpack(o.Find(x => x.rayMaxIterationsRT));
// Performance
m_FullResolution = Unpack(o.Find(x => x.fullResolution));
// Quality
m_SampleCount = Unpack(o.Find(x => x.sampleCount));
m_BounceCount = Unpack(o.Find(x => x.bounceCount));
base.OnEnable();
}
static public readonly GUIContent k_EnabledOpaque = EditorGUIUtility.TrTextContent("State (Opaque)", "Enable Screen Space Reflections.");
static public readonly GUIContent k_EnabledTransparent = EditorGUIUtility.TrTextContent("State (Transparent)", "Enable Transparent Screen Space Reflections");
static public readonly GUIContent k_Algo = EditorGUIUtility.TrTextContent("Algorithm", "The screen space reflection algorithm used.");
static public readonly GUIContent k_TracingText = EditorGUIUtility.TrTextContent("Tracing", "Controls the technique used to compute the reflection.Controls the technique used to compute the reflections. Ray marching uses a ray-marched screen-space solution, Ray tracing uses a hardware accelerated world-space solution. Mixed uses first Ray marching, then Ray tracing if it fails to intersect on-screen geometry.");
static public readonly GUIContent k_ReflectSkyText = EditorGUIUtility.TrTextContent("Reflect Sky", "When enabled, SSR handles sky reflection for opaque objects (not supported for SSR on transparent).");
static public readonly GUIContent k_LayerMaskText = EditorGUIUtility.TrTextContent("Layer Mask", "Layer mask used to include the objects for ray traced reflections.");
static public readonly GUIContent k_RayMissFallbackHierarchyText = EditorGUIUtility.TrTextContent("Ray Miss", "Controls the order in which fall backs are used when a ray misses.");
static public readonly GUIContent k_LastBounceFallbackHierarchyText = EditorGUIUtility.TrTextContent("Last Bounce", "Controls the fallback hierarchy for lighting the last bounce.");
static public readonly GUIContent k_TextureLodBiasText = EditorGUIUtility.TrTextContent("Texture Lod Bias", "The LOD Bias that HDRP adds to texture sampling in the reflection. A higher value increases performance and makes denoising easier, but it might reduce visual fidelity.");
static public readonly GUIContent k_MinimumSmoothnessText = EditorGUIUtility.TrTextContent("Minimum Smoothness", "Controls the smoothness value at which HDRP activates SSR and the smoothness-controlled fade out stops.");
static public readonly GUIContent k_SmoothnessFadeStartText = EditorGUIUtility.TrTextContent("Smoothness Fade Start", "Controls the smoothness value at which the smoothness-controlled fade out starts. The fade is in the range [Min Smoothness, Smoothness Fade Start].");
static public readonly GUIContent k_ScreenFaceDistanceText = EditorGUIUtility.TrTextContent("Screen Edge Fade Distance", "Controls the distance at which HDRP fades out SSR near the edge of the screen.");
static public readonly GUIContent k_AccumulationFactorText = EditorGUIUtility.TrTextContent("Accumulation Factor", "Controls Controls the amount of accumulation (0 no accumulation, 1 just accumulate).");
static public readonly GUIContent k_BiasFactorText = EditorGUIUtility.TrTextContent("Roughness Bias", "Controls the relative roughness offset. A low value means material roughness stays the same, a high value means smoother reflections.");
static public readonly GUIContent k_EnableSpeedRejectionText = EditorGUIUtility.TrTextContent("World Space Speed Rejection", "When enabled, speed from will be computed in world space to reject samples.");
static public readonly GUIContent k_SpeedRejectionFactorText = EditorGUIUtility.TrTextContent("Speed Rejection", "Controls the likelihood history will be rejected based on the previous frame motion vectors of both the surface and the hit object.");
static public readonly GUIContent k_SpeedRejectionScalerFactorText = EditorGUIUtility.TrTextContent("Speed Rejection Scaler Factor", "Controls the upper range of speed. The faster the objects or camera are moving, the higher this number should be.");
static public readonly GUIContent k_SpeedSmoothRejectText = EditorGUIUtility.TrTextContent("Speed Smooth Rejection", "When enabled, history can be partially rejected for moving objects which gives a smoother transition. When disabled, history is either kept or totally rejected.");
static public readonly GUIContent k_SpeedSurfaceOnlyText = EditorGUIUtility.TrTextContent("Speed From Reflecting Surface", "When enabled, the reflecting surface movement is considered as a valid rejection condition. At least one of the two conditions must be checked.");
static public readonly GUIContent k_SpeedTargetOnlyText = EditorGUIUtility.TrTextContent("Speed From Reflected Surface", "When enabled, the reflected surface movement is considered as a valid rejection condition. At least one of the two conditions must be checked.");
static public readonly GUIContent k_DepthBufferThicknessText = EditorGUIUtility.TrTextContent("Object Thickness", "Controls the typical thickness of objects the reflection rays may pass behind.");
static public readonly GUIContent k_RayMaxIterationsText = EditorGUIUtility.TrTextContent("Max Ray Steps", "Sets the maximum number of steps HDRP uses for ray marching. Affects both correctness and performance.");
static public readonly GUIContent k_RayLengthText = EditorGUIUtility.TrTextContent("Max Ray Length", "Controls the maximal length of reflection rays in meters. The higher this value is, the more expensive ray traced reflections are.");
static public readonly GUIContent k_ClampValueText = EditorGUIUtility.TrTextContent("Clamp Value", "Clamps the exposed intensity, this only affects reflections on opaque objects.");
static public readonly GUIContent k_SampleCountText = EditorGUIUtility.TrTextContent("Sample Count", "Number of samples for reflections.");
static public readonly GUIContent k_BounceCountText = EditorGUIUtility.TrTextContent("Bounce Count", "Number of bounces for reflection rays.");
static public readonly GUIContent k_ModeText = EditorGUIUtility.TrTextContent("Mode", "Controls which version of the effect should be used.");
static public readonly GUIContent k_DenoiseText = EditorGUIUtility.TrTextContent("Denoise", "Enable denoising on the ray traced reflections.");
static public readonly GUIContent k_FullResolutionText = EditorGUIUtility.TrTextContent("Full Resolution", "Enables full resolution mode.");
static public readonly GUIContent k_DenoiseRadiusText = EditorGUIUtility.TrTextContent("Denoiser Radius", "Controls the radius of reflection denoiser.");
static public readonly GUIContent k_DenoiserAntiFlickeringStrengthText = EditorGUIUtility.TrTextContent("Anti Flickering", "Controls the anti-flickering strength of reflection denoiser.");
static public readonly GUIContent k_MaxMixedRaySteps = EditorGUIUtility.TrTextContent("Max Ray Steps", "Sets the maximum number of steps HDRP uses for mixed tracing.");
void RayTracingQualityModeGUI()
{
using (new QualityScope(this))
{
PropertyField(m_MinSmoothness, k_MinimumSmoothnessText);
PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText);
m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue);
PropertyField(m_RayLength, k_RayLengthText);
PropertyField(m_SampleCount, k_SampleCountText);
PropertyField(m_BounceCount, k_BounceCountText);
PropertyField(m_Denoise, k_DenoiseText);
using (new IndentLevelScope())
{
PropertyField(m_DenoiserRadius, k_DenoiseRadiusText);
PropertyField(m_DenoiserAntiFlickeringStrength, k_DenoiserAntiFlickeringStrengthText);
}
}
}
void RayTracingPerformanceModeGUI(bool mixed)
{
base.OnInspectorGUI();
using (new IndentLevelScope())
using (new QualityScope(this))
{
PropertyField(m_MinSmoothness, k_MinimumSmoothnessText);
PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText);
m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue);
PropertyField(m_RayLength, k_RayLengthText);
PropertyField(m_FullResolution, k_FullResolutionText);
if (mixed)
PropertyField(m_RayMaxIterationsRT, k_MaxMixedRaySteps);
PropertyField(m_Denoise, k_DenoiseText);
using (new IndentLevelScope())
{
PropertyField(m_DenoiserRadius, k_DenoiseRadiusText);
PropertyField(m_DenoiserAntiFlickeringStrength, k_DenoiserAntiFlickeringStrengthText);
}
}
}
void RayTracedReflectionGUI(RayCastingMode tracingMode)
{
HDRenderPipelineAsset currentAsset = HDRenderPipeline.currentAsset;
HDEditorUtils.EnsureFrameSetting(FrameSettingsField.RayTracing, "RayTracing");
if (RenderPipelineManager.currentPipeline is not HDRenderPipeline { rayTracingSupported: true })
HDRenderPipelineUI.DisplayRayTracingSupportBox();
if (showAdditionalProperties)
{
using (new IndentLevelScope())
{
EditorGUILayout.LabelField("Fallback", EditorStyles.miniLabel);
PropertyField(m_RayMiss, k_RayMissFallbackHierarchyText);
PropertyField(m_LastBounce, k_LastBounceFallbackHierarchyText);
PropertyField(m_AmbientProbeDimmer);
}
}
PropertyField(m_LayerMask, k_LayerMaskText);
PropertyField(m_TextureLodBias, k_TextureLodBiasText);
PropertyField(m_ClampValue, k_ClampValueText);
if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both)
{
if (tracingMode == RayCastingMode.RayTracing)
{
PropertyField(m_Mode, k_ModeText);
using (new IndentLevelScope())
{
switch (m_Mode.value.GetEnumValue<RayTracingMode>())
{
case RayTracingMode.Performance:
RayTracingPerformanceModeGUI(false);
break;
case RayTracingMode.Quality:
RayTracingQualityModeGUI();
break;
}
}
}
else
RayTracingPerformanceModeGUI(true);
}
else if (currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Quality)
{
if (tracingMode == RayCastingMode.RayTracing)
RayTracingQualityModeGUI();
else
HDEditorUtils.QualitySettingsHelpBox("The current HDRP Asset does not support the mixed mode which is only available in performance mode.", MessageType.Error,
HDRenderPipelineUI.ExpandableGroup.Rendering, "m_RenderPipelineSettings.supportedRayTracingMode");
}
else
{
RayTracingPerformanceModeGUI(tracingMode == RayCastingMode.Mixed);
}
}
public override void OnInspectorGUI()
{
HDRenderPipelineAsset currentAsset = HDRenderPipeline.currentAsset;
bool notSupported = currentAsset != null && !currentAsset.currentPlatformRenderPipelineSettings.supportSSR;
if (notSupported)
{
EditorGUILayout.Space();
HDEditorUtils.QualitySettingsHelpBox("The current HDRP Asset does not support Screen Space Reflection.", MessageType.Warning,
HDRenderPipelineUI.ExpandableGroup.Lighting,
HDRenderPipelineUI.ExpandableLighting.Reflection, "m_RenderPipelineSettings.supportSSR");
}
using var disableScope = new EditorGUI.DisabledScope(notSupported);
PropertyField(m_Enable, k_EnabledOpaque);
if (!notSupported)
HDEditorUtils.EnsureFrameSetting(FrameSettingsField.SSR, "Screen Space Reflection");
bool transparentSSRSupported = currentAsset.currentPlatformRenderPipelineSettings.supportSSR
&& currentAsset.currentPlatformRenderPipelineSettings.supportSSRTransparent
&& currentAsset.currentPlatformRenderPipelineSettings.supportTransparentDepthPrepass;
if (transparentSSRSupported)
{
PropertyField(m_EnableTransparent, k_EnabledTransparent);
HDEditorUtils.EnsureFrameSetting(FrameSettingsField.TransparentSSR, "Transparent");
}
else
{
if (!currentAsset.currentPlatformRenderPipelineSettings.supportSSRTransparent)
{
HDEditorUtils.QualitySettingsHelpBox("The current HDRP Asset does not support Transparent Screen Space Reflection.", MessageType.Info,
HDRenderPipelineUI.ExpandableGroup.Lighting, HDRenderPipelineUI.ExpandableLighting.Reflection, "m_RenderPipelineSettings.supportSSRTransparent");
}
else
{
HDEditorUtils.QualitySettingsHelpBox("The current HDRP Asset does not support Transparent Depth Prepass.\nIt is required for Transparent Screen Space Reflection.", MessageType.Info,
HDRenderPipelineUI.ExpandableGroup.Rendering, "m_RenderPipelineSettings.supportTransparentDepthPrepass");
}
}
// If ray tracing is supported display the tracing choice
if (HDRenderPipeline.assetSupportsRayTracing)
PropertyField(m_Tracing, k_TracingText);
// Flag to track if the ray tracing parameters were displayed
RayCastingMode tracingMode = m_Tracing.value.GetEnumValue<RayCastingMode>();
bool rayTracingSettingsDisplayed = HDRenderPipeline.assetSupportsRayTracing
&& m_Tracing.overrideState.boolValue
&& tracingMode != RayCastingMode.RayMarching;
// The rest of the ray tracing UI is only displayed if the asset supports ray tracing and the checkbox is checked.
if (rayTracingSettingsDisplayed)
{
RayTracedReflectionGUI(tracingMode);
}
else
{
PropertyField(m_UsedAlgorithm, k_Algo);
// Shared Data
PropertyField(m_MinSmoothness, k_MinimumSmoothnessText);
PropertyField(m_SmoothnessFadeStart, k_SmoothnessFadeStartText);
PropertyField(m_ReflectSky, k_ReflectSkyText);
m_SmoothnessFadeStart.value.floatValue = Mathf.Max(m_MinSmoothness.value.floatValue, m_SmoothnessFadeStart.value.floatValue);
PropertyField(m_ScreenFadeDistance, k_ScreenFaceDistanceText);
PropertyField(m_DepthBufferThickness, k_DepthBufferThicknessText);
m_DepthBufferThickness.value.floatValue = Mathf.Clamp(m_DepthBufferThickness.value.floatValue, 0.001f, 1.0f);
base.OnInspectorGUI();
using (new IndentLevelScope())
using (new QualityScope(this))
{
PropertyField(m_RayMaxIterations, k_RayMaxIterationsText);
m_RayMaxIterations.value.intValue = Mathf.Max(0, m_RayMaxIterations.value.intValue);
}
if (m_UsedAlgorithm.value.intValue == (int)ScreenSpaceReflectionAlgorithm.PBRAccumulation)
{
PropertyField(m_AccumulationFactor, k_AccumulationFactorText);
PropertyField(m_EnableWorldSpeedRejection, k_EnableSpeedRejectionText);
if (BeginAdditionalPropertiesScope())
{
if (m_EnableWorldSpeedRejection.value.boolValue)
{
using (new IndentLevelScope())
{
PropertyField(m_SpeedRejectionScalerFactor, k_SpeedRejectionScalerFactorText);
PropertyField(m_SpeedSmoothReject, k_SpeedSmoothRejectText);
}
}
PropertyField(m_SpeedRejectionFactor, k_SpeedRejectionFactorText);
if (!m_SpeedSurfaceOnly.value.boolValue && !m_SpeedTargetOnly.value.boolValue)
m_SpeedSurfaceOnly.value.boolValue = true;
PropertyField(m_SpeedSurfaceOnly, k_SpeedSurfaceOnlyText);
PropertyField(m_SpeedTargetOnly, k_SpeedTargetOnlyText);
PropertyField(m_BiasFactor, k_BiasFactorText);
}
EndAdditionalPropertiesScope();
}
}
}
public override QualitySettingsBlob SaveCustomQualitySettingsAsObject(QualitySettingsBlob settings = null)
{
if (settings == null)
settings = new QualitySettingsBlob();
// RTR
settings.Save<float>(m_MinSmoothness);
settings.Save<float>(m_SmoothnessFadeStart);
settings.Save<float>(m_RayLength);
settings.Save<float>(m_ClampValue);
settings.Save<bool>(m_FullResolution);
settings.Save<bool>(m_RayMaxIterationsRT);
settings.Save<bool>(m_Denoise);
settings.Save<float>(m_DenoiserRadius);
settings.Save<float>(m_DenoiserAntiFlickeringStrength);
// SSR
settings.Save<int>(m_RayMaxIterations);
return settings;
}
public override void LoadSettingsFromObject(QualitySettingsBlob settings)
{
// RTR
if (HDRenderPipeline.assetSupportsRayTracing && m_Tracing.overrideState.boolValue &&
m_Tracing.value.GetEnumValue<RayCastingMode>() != RayCastingMode.RayMarching)
{
settings.TryLoad<float>(ref m_MinSmoothness);
settings.TryLoad<float>(ref m_SmoothnessFadeStart);
settings.TryLoad<float>(ref m_RayLength);
settings.TryLoad<float>(ref m_ClampValue);
settings.TryLoad<bool>(ref m_FullResolution);
settings.TryLoad<bool>(ref m_RayMaxIterationsRT);
settings.TryLoad<bool>(ref m_Denoise);
settings.TryLoad<float>(ref m_DenoiserRadius);
settings.TryLoad<float>(ref m_DenoiserAntiFlickeringStrength);
}
// SSR
else
settings.TryLoad<int>(ref m_RayMaxIterations);
}
public override void LoadSettingsFromQualityPreset(RenderPipelineSettings settings, int level)
{
// RTR
if (HDRenderPipeline.assetSupportsRayTracing && m_Tracing.overrideState.boolValue &&
m_Tracing.value.GetEnumValue<RayCastingMode>() != RayCastingMode.RayMarching)
{
CopySetting(ref m_MinSmoothness, settings.lightingQualitySettings.RTRMinSmoothness[level]);
CopySetting(ref m_SmoothnessFadeStart, settings.lightingQualitySettings.RTRSmoothnessFadeStart[level]);
CopySetting(ref m_RayLength, settings.lightingQualitySettings.RTRRayLength[level]);
CopySetting(ref m_FullResolution, settings.lightingQualitySettings.RTRFullResolution[level]);
CopySetting(ref m_RayMaxIterationsRT, settings.lightingQualitySettings.RTRRayMaxIterations[level]);
CopySetting(ref m_Denoise, settings.lightingQualitySettings.RTRDenoise[level]);
CopySetting(ref m_DenoiserRadius, settings.lightingQualitySettings.RTRDenoiserRadiusDimmer[level]);
CopySetting(ref m_DenoiserAntiFlickeringStrength, settings.lightingQualitySettings.RTRDenoiserAntiFlicker[level]);
}
// SSR
else
CopySetting(ref m_RayMaxIterations, settings.lightingQualitySettings.SSRMaxRaySteps[level]);
}
public override bool QualityEnabled()
{
// Quality always used for SSR
if (!HDRenderPipeline.assetSupportsRayTracing || m_Tracing.value.GetEnumValue<RayCastingMode>() == RayCastingMode.RayMarching)
return true;
// Handle the quality usage for RTR
HDRenderPipelineAsset currentAsset = HDRenderPipeline.currentAsset;
// Define if the asset supports Performance or Both Mode (Quality && Performance)
bool assetSupportsPerf = currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Performance;
bool assetSupportsBoth = currentAsset.currentPlatformRenderPipelineSettings.supportedRayTracingMode == RenderPipelineSettings.SupportedRayTracingMode.Both;
// Define if the volume is in Performance or Mixed Mode
bool volumeIsInPerfOrMixed = (m_Tracing.value.GetEnumValue<RayCastingMode>() == RayCastingMode.RayTracing && m_Mode.value.GetEnumValue<RayTracingMode>() == RayTracingMode.Performance)
|| (m_Tracing.value.GetEnumValue<RayCastingMode>() == RayCastingMode.Mixed);
return (assetSupportsBoth && volumeIsInPerfOrMixed) || (assetSupportsPerf && m_Tracing.value.GetEnumValue<RayCastingMode>() != RayCastingMode.RayMarching);
}
}
}