You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

448 lines
23 KiB

using System;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.Rendering.HighDefinition;
using static UnityEditor.EditorGUI;
using static UnityEditor.Rendering.HighDefinition.HDProbeUI;
namespace UnityEditor.Rendering.HighDefinition
{
sealed partial class WaterSurfaceEditor : Editor
{
#region Mask
SerializedProperty m_WaterMask;
SerializedProperty m_WaterMaskRemap;
SerializedProperty m_WaterMaskExtent;
SerializedProperty m_WaterMaskOffset;
#endregion
#region Large
SerializedProperty m_RepetitionSize;
SerializedProperty m_LargeOrientationValue;
SerializedProperty m_LargeWindSpeed;
SerializedProperty m_LargeChaos;
// Band0
SerializedProperty m_LargeBand0Multiplier;
SerializedProperty m_LargeBand0FadeToggle;
SerializedProperty m_LargeBand0FadeStart;
SerializedProperty m_LargeBand0FadeDistance;
// Band1
SerializedProperty m_LargeBand1Multiplier;
SerializedProperty m_LargeBand1FadeToggle;
SerializedProperty m_LargeBand1FadeStart;
SerializedProperty m_LargeBand1FadeDistance;
// Current
SerializedProperty m_LargeCurrentSpeedValue;
SerializedProperty m_LargeCurrentMap;
SerializedProperty m_LargeCurrentRegionExtent;
SerializedProperty m_LargeCurrentRegionOffset;
SerializedProperty m_LargeCurrentMapInfluence;
#endregion
#region Ripples
SerializedProperty m_Ripples;
SerializedProperty m_RipplesWindSpeed;
SerializedProperty m_RipplesChaos;
// Current
SerializedProperty m_RipplesMotionMode;
SerializedProperty m_RipplesOrientationValue;
SerializedProperty m_RipplesCurrentSpeedValue;
SerializedProperty m_RipplesCurrentMap;
SerializedProperty m_RipplesCurrentRegionExtent;
SerializedProperty m_RipplesCurrentRegionOffset;
SerializedProperty m_RipplesCurrentMapInfluence;
// Fade
SerializedProperty m_RipplesFadeToggle;
SerializedProperty m_RipplesFadeStart;
SerializedProperty m_RipplesFadeDistance;
#endregion
void OnEnableSimulation(PropertyFetcher<WaterSurface> o)
{
#region Masking
m_WaterMask = o.Find(x => x.waterMask);
m_WaterMaskRemap = o.Find(x => x.waterMaskRemap);
m_WaterMaskExtent = o.Find(x => x.waterMaskExtent);
m_WaterMaskOffset = o.Find(x => x.waterMaskOffset);
#endregion
#region Large
m_RepetitionSize = o.Find(x => x.repetitionSize);
m_LargeOrientationValue = o.Find(x => x.largeOrientationValue);
m_LargeWindSpeed = o.Find(x => x.largeWindSpeed);
m_LargeChaos = o.Find(x => x.largeChaos);
// Band0
m_LargeBand0Multiplier = o.Find(x => x.largeBand0Multiplier);
m_LargeBand0FadeToggle = o.Find(x => x.largeBand0FadeMode);
m_LargeBand0FadeStart = o.Find(x => x.largeBand0FadeStart);
m_LargeBand0FadeDistance = o.Find(x => x.largeBand0FadeDistance);
// Band1
m_LargeBand1Multiplier = o.Find(x => x.largeBand1Multiplier);
m_LargeBand1FadeToggle = o.Find(x => x.largeBand1FadeMode);
m_LargeBand1FadeStart = o.Find(x => x.largeBand1FadeStart);
m_LargeBand1FadeDistance = o.Find(x => x.largeBand1FadeDistance);
// Current
m_LargeCurrentSpeedValue = o.Find(x => x.largeCurrentSpeedValue);
m_LargeCurrentMap = o.Find(x => x.largeCurrentMap);
m_LargeCurrentRegionExtent = o.Find(x => x.largeCurrentRegionExtent);
m_LargeCurrentRegionOffset = o.Find(x => x.largeCurrentRegionOffset);
m_LargeCurrentMapInfluence = o.Find(x => x.largeCurrentMapInfluence);
#endregion
#region Ripples
m_Ripples = o.Find(x => x.ripples);
m_RipplesWindSpeed = o.Find(x => x.ripplesWindSpeed);
m_RipplesChaos = o.Find(x => x.ripplesChaos);
// Current
m_RipplesMotionMode = o.Find(x => x.ripplesMotionMode);
m_RipplesOrientationValue = o.Find(x => x.ripplesOrientationValue);
m_RipplesCurrentSpeedValue = o.Find(x => x.ripplesCurrentSpeedValue);
m_RipplesCurrentMap = o.Find(x => x.ripplesCurrentMap);
m_RipplesCurrentRegionExtent = o.Find(x => x.ripplesCurrentRegionExtent);
m_RipplesCurrentRegionOffset = o.Find(x => x.ripplesCurrentRegionOffset);
m_RipplesCurrentMapInfluence = o.Find(x => x.ripplesCurrentMapInfluence);
// Fade
m_RipplesFadeToggle = o.Find(x => x.ripplesFadeMode);
m_RipplesFadeStart = o.Find(x => x.ripplesFadeStart);
m_RipplesFadeDistance = o.Find(x => x.ripplesFadeDistance);
#endregion
}
static internal void WaterSurfaceLargeCurrent(WaterSurfaceEditor serialized, Editor owner)
{
EditorGUILayout.PropertyField(serialized.m_LargeCurrentSpeedValue, k_LargeCurrentSpeed);
using (new BoldLabelScope())
MapWithExtent(serialized.m_LargeCurrentMap, k_LargeCurrentMap, serialized.m_LargeCurrentRegionExtent);
using (new IndentLevelScope())
{
if (serialized.m_LargeCurrentMap.objectReferenceValue != null)
{
EditorGUILayout.PropertyField(serialized.m_LargeCurrentRegionExtent, k_CurrentRegionExtent);
SanitizeExtentsVector2(serialized.m_LargeCurrentRegionExtent);
EditorGUILayout.PropertyField(serialized.m_LargeCurrentRegionOffset, k_CurrentRegionOffset);
EditorGUILayout.PropertyField(serialized.m_LargeCurrentMapInfluence, k_LargeCurrentMapInfluence);
}
}
}
static internal void WaterSurfaceRipplesOrientationCurrentInherit(WaterSurfaceEditor serialized, Editor owner, string[] modeNames)
{
using (new BoldLabelScope())
serialized.m_RipplesMotionMode.enumValueIndex = EditorGUILayout.Popup(k_RipplesMotionInherit, serialized.m_RipplesMotionMode.enumValueIndex, modeNames);
using (new IndentLevelScope())
{
WaterPropertyOverrideMode overrideType = (WaterPropertyOverrideMode)(serialized.m_RipplesMotionMode.enumValueIndex);
if (overrideType == WaterPropertyOverrideMode.Custom)
WaterSurfaceRipplesOrientationCurrent(serialized, owner);
}
}
static internal void WaterSurfaceRipplesOrientationCurrent(WaterSurfaceEditor serialized, Editor owner)
{
EditorGUILayout.PropertyField(serialized.m_RipplesOrientationValue, k_RipplesOrientation);
EditorGUILayout.PropertyField(serialized.m_RipplesCurrentSpeedValue, k_RipplesCurrentSpeed);
using (new BoldLabelScope())
MapWithExtent(serialized.m_RipplesCurrentMap, k_RipplesCurrentMap, serialized.m_RipplesCurrentRegionExtent);
using (new IndentLevelScope())
{
if (serialized.m_RipplesCurrentMap.objectReferenceValue != null)
{
EditorGUILayout.PropertyField(serialized.m_RipplesCurrentRegionExtent, k_CurrentRegionExtent);
SanitizeExtentsVector2(serialized.m_RipplesCurrentRegionExtent);
EditorGUILayout.PropertyField(serialized.m_RipplesCurrentRegionOffset, k_CurrentRegionOffset);
EditorGUILayout.PropertyField(serialized.m_RipplesCurrentMapInfluence, k_RipplesCurrentMapInfluence);
}
}
}
static internal void WaterSurfaceWaterMask(WaterSurfaceEditor serialized, Editor owner, GUIContent maskContent)
{
// Water Mask
using (new BoldLabelScope())
MapWithExtent(serialized.m_WaterMask, maskContent, serialized.m_WaterMaskExtent);
using (new IndentLevelScope())
{
if (serialized.m_WaterMask.objectReferenceValue != null)
{
EditorGUILayout.PropertyField(serialized.m_WaterMaskExtent, k_WaterMaskExtent);
EditorGUILayout.PropertyField(serialized.m_WaterMaskOffset, k_WaterMaskOffset);
Vector2 remap = serialized.m_WaterMaskRemap.vector2Value;
EditorGUI.BeginChangeCheck();
EditorGUILayout.MinMaxSlider(k_WaterMaskRemap, ref remap.x, ref remap.y, 0.0f, 1.0f);
if (EditorGUI.EndChangeCheck())
serialized.m_WaterMaskRemap.vector2Value = remap;
}
}
}
static internal void WaterSurfaceSimulationSection_Ocean(WaterSurfaceEditor serialized, Editor owner)
{
// Water masking
WaterSurfaceWaterMask(serialized, owner, k_WaterMaskSwell);
// Swell section
EditorGUILayout.LabelField("Swell", EditorStyles.boldLabel);
using (new IndentLevelScope())
{
// Swell parameters
EditorGUI.BeginChangeCheck();
float repetitionSize = EditorGUILayout.Slider(k_SwellRepetitionSize, serialized.m_RepetitionSize.floatValue, WaterConsts.k_SwellMinPatchSize, WaterConsts.k_SwellMaxPatchSize);
if (EditorGUI.EndChangeCheck())
serialized.m_RepetitionSize.floatValue = repetitionSize;
EditorGUILayout.PropertyField(serialized.m_LargeWindSpeed, k_SwellWindSpeed);
EditorGUILayout.PropertyField(serialized.m_LargeChaos, k_SwellChaos);
EditorGUILayout.PropertyField(serialized.m_LargeOrientationValue, k_SwellOrientation);
// Current parameters
WaterSurfaceLargeCurrent(serialized, owner);
// Band0 foldout
float totalAmplitude = 0.0f;
EditorGUILayout.LabelField("First Band", EditorStyles.boldLabel);
using (new IndentLevelScope())
{
// Evaluate the maximal amplitude that this patch size/wind speed allows
EditorGUILayout.PropertyField(serialized.m_LargeBand0Multiplier, k_SwellBand0Mutliplier);
using (new DisabledScope(true))
{
float maxAmplitudeBand0 = serialized.m_LargeBand0Multiplier.floatValue * HDRenderPipeline.EvaluateMaxAmplitude(serialized.m_RepetitionSize.floatValue, serialized.m_LargeWindSpeed.floatValue);
EditorGUILayout.TextField(k_SwellMaxAmplitude, maxAmplitudeBand0.ToString("0.00") + " m", EditorStyles.boldLabel);
totalAmplitude += maxAmplitudeBand0;
}
// The fade parameters are only to be displayed when the additional parameters are
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the ripples
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_LargeBand0FadeToggle, k_SwellFadeToggle);
if (serialized.m_LargeBand0FadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_SwellRangeToggle, k_SwellFadeStart, serialized.m_LargeBand0FadeStart, k_SwellFadeDistance, serialized.m_LargeBand0FadeDistance);
serialized.m_LargeBand0FadeStart.floatValue = Mathf.Max(serialized.m_LargeBand0FadeStart.floatValue, 0.0f);
serialized.m_LargeBand0FadeDistance.floatValue = Mathf.Max(serialized.m_LargeBand0FadeDistance.floatValue, 0.0f);
}
}
}
}
// Second band foldout
EditorGUILayout.LabelField("Second Band", EditorStyles.boldLabel);
using (new IndentLevelScope())
{
// Evaluate the maximal amplitude that this patch size/wind speed allows
EditorGUILayout.PropertyField(serialized.m_LargeBand1Multiplier, k_SwellBand1Mutliplier);
using (new DisabledScope(true))
{
float swellSecondBandRatio = HDRenderPipeline.EvaluateSwellSecondPatchSize(serialized.m_RepetitionSize.floatValue);
float maxAmplitudeBand1 = serialized.m_LargeBand1Multiplier.floatValue * HDRenderPipeline.EvaluateMaxAmplitude(swellSecondBandRatio, serialized.m_LargeWindSpeed.floatValue);
EditorGUILayout.TextField(k_SwellMaxAmplitude, maxAmplitudeBand1.ToString("0.00") + " m", EditorStyles.boldLabel);
totalAmplitude += maxAmplitudeBand1;
}
// The fade parameters are only to be displayed when the additional parameters are
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the ripples
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_LargeBand1FadeToggle, k_SwellFadeToggle);
if (serialized.m_LargeBand1FadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_SwellRangeToggle, k_SwellFadeStart, serialized.m_LargeBand1FadeStart, k_SwellFadeDistance, serialized.m_LargeBand1FadeDistance);
serialized.m_LargeBand1FadeStart.floatValue = Mathf.Max(serialized.m_LargeBand1FadeStart.floatValue, 0.0f);
serialized.m_LargeBand1FadeDistance.floatValue = Mathf.Max(serialized.m_LargeBand1FadeDistance.floatValue, 0.0f);
}
}
}
}
using (new DisabledScope(true))
{
EditorGUILayout.TextField(k_SwellTotalAmplitude, totalAmplitude.ToString("0.00") + " m", EditorStyles.boldLabel);
}
}
// Ripples Section
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_Ripples, k_RipplesEnable);
if (serialized.m_Ripples.boolValue)
{
using (new IndentLevelScope())
{
EditorGUILayout.PropertyField(serialized.m_RipplesWindSpeed, k_RipplesWindSpeed);
EditorGUILayout.PropertyField(serialized.m_RipplesChaos, k_RipplesChaos);
// Current & Orientation
WaterSurfaceRipplesOrientationCurrentInherit(serialized, owner, WaterPropertyParameterDrawer.swellModeNames);
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the ripples
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_RipplesFadeToggle, k_RipplesFadeToggle);
if (serialized.m_RipplesFadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_RipplesFadeRange, k_RipplesFadeStart, serialized.m_RipplesFadeStart, k_RipplesFadeDistance, serialized.m_RipplesFadeDistance);
serialized.m_RipplesFadeStart.floatValue = Mathf.Max(serialized.m_RipplesFadeStart.floatValue, 0.0f);
serialized.m_RipplesFadeDistance.floatValue = Mathf.Max(serialized.m_RipplesFadeDistance.floatValue, 0.0f);
}
}
}
}
}
}
static internal void WaterSurfaceSimulationSection_River(WaterSurfaceEditor serialized, Editor owner)
{
// Water masking
WaterSurfaceWaterMask(serialized, owner, k_WaterMaskAgitation);
// Agitation foldout
EditorGUILayout.LabelField("Agitation", EditorStyles.boldLabel);
using (new IndentLevelScope())
{
// Swell parameters
EditorGUI.BeginChangeCheck();
float repetitionSize = EditorGUILayout.Slider(k_AgitationRepetitionSize, serialized.m_RepetitionSize.floatValue, WaterConsts.k_AgitationMinPatchSize, WaterConsts.k_AgitationMaxPatchSize);
if (EditorGUI.EndChangeCheck())
serialized.m_RepetitionSize.floatValue = repetitionSize;
EditorGUILayout.PropertyField(serialized.m_LargeWindSpeed, k_AgitationWindSpeed);
EditorGUILayout.PropertyField(serialized.m_LargeChaos, k_AgitationChaos);
EditorGUILayout.PropertyField(serialized.m_LargeOrientationValue, k_AgitationOrientation);
// Current parameters
WaterSurfaceLargeCurrent(serialized, owner);
// Evaluate the maximal amplitude that this patch size/wind speed allows
EditorGUILayout.PropertyField(serialized.m_LargeBand0Multiplier, k_AgitationBandMutliplier);
using (new DisabledScope(true))
{
float maxAmplitude = serialized.m_LargeBand0Multiplier.floatValue * HDRenderPipeline.EvaluateMaxAmplitude(serialized.m_RepetitionSize.floatValue, serialized.m_LargeWindSpeed.floatValue);
EditorGUILayout.TextField(k_AgitationTotalAmplitude, maxAmplitude.ToString("0.00") + " m", EditorStyles.boldLabel);
}
// The fade parameters are only to be displayed when the additional parameters are
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the agitation
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_LargeBand0FadeToggle, k_SwellFadeToggle);
if (serialized.m_LargeBand0FadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_SwellRangeToggle, k_SwellFadeStart, serialized.m_LargeBand0FadeStart, k_SwellFadeDistance, serialized.m_LargeBand0FadeDistance);
serialized.m_LargeBand0FadeStart.floatValue = Mathf.Max(serialized.m_LargeBand0FadeStart.floatValue, 0.0f);
serialized.m_LargeBand0FadeDistance.floatValue = Mathf.Max(serialized.m_LargeBand0FadeDistance.floatValue, 0.0f);
}
}
}
}
// Ripples Section
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_Ripples, k_RipplesEnable);
if (serialized.m_Ripples.boolValue)
{
using (new IndentLevelScope())
{
EditorGUILayout.PropertyField(serialized.m_RipplesWindSpeed, k_RipplesWindSpeed);
EditorGUILayout.PropertyField(serialized.m_RipplesChaos, k_RipplesChaos);
// Orientation & Current
WaterSurfaceRipplesOrientationCurrentInherit(serialized, owner, WaterPropertyParameterDrawer.agitationModeNames);
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the ripples
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_RipplesFadeToggle, k_RipplesFadeToggle);
if (serialized.m_RipplesFadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_RipplesFadeRange, k_RipplesFadeStart, serialized.m_RipplesFadeStart, k_RipplesFadeDistance, serialized.m_RipplesFadeDistance);
serialized.m_RipplesFadeStart.floatValue = Mathf.Max(serialized.m_RipplesFadeStart.floatValue, 0.0f);
serialized.m_RipplesFadeDistance.floatValue = Mathf.Max(serialized.m_RipplesFadeDistance.floatValue, 0.0f);
}
}
}
}
}
}
static internal void WaterSurfaceSimulationSection_Pool(WaterSurfaceEditor serialized, Editor owner)
{
// Water Mask
WaterSurfaceWaterMask(serialized, owner, k_WaterMaskRipples);
EditorGUILayout.LabelField("Ripples", EditorStyles.boldLabel);
{
using (new IndentLevelScope())
{
EditorGUILayout.PropertyField(serialized.m_RipplesWindSpeed, k_RipplesWindSpeed);
EditorGUILayout.PropertyField(serialized.m_RipplesChaos, k_RipplesChaos);
// Current
WaterSurfaceRipplesOrientationCurrent(serialized, owner);
if (WaterSurfaceUI.ShowAdditionalProperties())
{
// Fade of the ripples
using (new BoldLabelScope())
EditorGUILayout.PropertyField(serialized.m_RipplesFadeToggle, k_RipplesFadeToggle);
if (serialized.m_RipplesFadeToggle.intValue == (int)WaterSurface.FadeMode.Custom)
{
using (new IndentLevelScope())
{
WaterPropertyParameterDrawer.DrawMultiPropertiesGUI(k_RipplesFadeRange, k_RipplesFadeStart, serialized.m_RipplesFadeStart, k_RipplesFadeDistance, serialized.m_RipplesFadeDistance);
serialized.m_RipplesFadeStart.floatValue = Mathf.Max(serialized.m_RipplesFadeStart.floatValue, 0.0f);
serialized.m_RipplesFadeDistance.floatValue = Mathf.Max(serialized.m_RipplesFadeDistance.floatValue, 0.0f);
}
}
}
}
}
}
static internal void WaterSurfaceSimulationSection(WaterSurfaceEditor serialized, Editor owner)
{
if (serialized.m_SurfaceType.hasMultipleDifferentValues)
return;
WaterSurfaceType surfaceType = (WaterSurfaceType)(serialized.m_SurfaceType.enumValueIndex);
switch (surfaceType)
{
case WaterSurfaceType.OceanSeaLake:
WaterSurfaceSimulationSection_Ocean(serialized, owner);
break;
case WaterSurfaceType.River:
WaterSurfaceSimulationSection_River(serialized, owner);
break;
case WaterSurfaceType.Pool:
WaterSurfaceSimulationSection_Pool(serialized, owner);
break;
};
}
}
}