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.
220 lines
13 KiB
220 lines
13 KiB
using UnityEngine;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition
|
|
{
|
|
partial class InfluenceVolumeUI
|
|
{
|
|
public static void DrawHandles_EditBase(SerializedInfluenceVolume serialized, Editor owner, Transform transform)
|
|
{
|
|
switch ((InfluenceShape)serialized.shape.intValue)
|
|
{
|
|
case InfluenceShape.Box:
|
|
DrawBoxHandle(serialized, owner, transform, s_BoxBaseHandle);
|
|
break;
|
|
case InfluenceShape.Sphere:
|
|
using (new Handles.DrawingScope(Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one)))
|
|
{
|
|
s_SphereBaseHandle.center = Vector3.zero;
|
|
s_SphereBaseHandle.radius = serialized.sphereRadius.floatValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
s_SphereBaseHandle.DrawHull(true);
|
|
s_SphereBaseHandle.DrawHandle();
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
Vector3 localSize = serialized.boxSize.vector3Value;
|
|
for (int i = 0; i < 3; ++i)
|
|
{
|
|
localSize[i] = Mathf.Max(Mathf.Epsilon, localSize[i]);
|
|
}
|
|
serialized.boxSize.vector3Value = localSize;
|
|
float radius = s_SphereBaseHandle.radius;
|
|
serialized.sphereRadius.floatValue = radius;
|
|
serialized.sphereBlendDistance.floatValue = Mathf.Clamp(serialized.sphereBlendDistance.floatValue, 0, radius);
|
|
serialized.sphereBlendNormalDistance.floatValue = Mathf.Clamp(serialized.sphereBlendNormalDistance.floatValue, 0, radius);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void DrawHandles_EditInfluence(SerializedInfluenceVolume serialized, Editor owner, Transform transform)
|
|
{
|
|
// Synchronize base handles
|
|
s_BoxBaseHandle.center = Vector3.zero;
|
|
s_BoxBaseHandle.size = serialized.boxSize.vector3Value;
|
|
s_SphereBaseHandle.center = Vector3.zero;
|
|
s_SphereBaseHandle.radius = serialized.sphereRadius.floatValue;
|
|
|
|
switch ((InfluenceShape)serialized.shape.intValue)
|
|
{
|
|
case InfluenceShape.Box:
|
|
EditorGUI.BeginChangeCheck();
|
|
DrawBoxFadeHandle(serialized, owner, transform, s_BoxInfluenceHandle, serialized.boxBlendDistancePositive, serialized.boxBlendDistanceNegative);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
//save advanced/simplified saved data
|
|
if (serialized.editorAdvancedModeEnabled.boolValue)
|
|
{
|
|
serialized.editorAdvancedModeBlendDistancePositive.vector3Value = serialized.boxBlendDistancePositive.vector3Value;
|
|
serialized.editorAdvancedModeBlendDistanceNegative.vector3Value = serialized.boxBlendDistanceNegative.vector3Value;
|
|
}
|
|
else
|
|
serialized.editorSimplifiedModeBlendDistance.floatValue = serialized.boxBlendDistancePositive.vector3Value.x;
|
|
serialized.Apply();
|
|
}
|
|
break;
|
|
case InfluenceShape.Sphere:
|
|
DrawSphereFadeHandle(serialized, owner, transform, s_SphereInfluenceHandle, serialized.sphereBlendDistance);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static void DrawHandles_EditInfluenceNormal(SerializedInfluenceVolume serialized, Editor owner, Transform transform)
|
|
{
|
|
// Synchronize base handles
|
|
s_BoxBaseHandle.center = Vector3.zero;
|
|
s_BoxBaseHandle.size = serialized.boxSize.vector3Value;
|
|
s_SphereBaseHandle.center = Vector3.zero;
|
|
s_SphereBaseHandle.radius = serialized.sphereRadius.floatValue;
|
|
|
|
switch ((InfluenceShape)serialized.shape.intValue)
|
|
{
|
|
case InfluenceShape.Box:
|
|
EditorGUI.BeginChangeCheck();
|
|
DrawBoxFadeHandle(serialized, owner, transform, s_BoxInfluenceNormalHandle, serialized.boxBlendNormalDistancePositive, serialized.boxBlendNormalDistanceNegative);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
//save advanced/simplified saved data
|
|
if (serialized.editorAdvancedModeEnabled.boolValue)
|
|
{
|
|
serialized.editorAdvancedModeBlendNormalDistancePositive.vector3Value = serialized.boxBlendNormalDistancePositive.vector3Value;
|
|
serialized.editorAdvancedModeBlendNormalDistanceNegative.vector3Value = serialized.boxBlendNormalDistanceNegative.vector3Value;
|
|
}
|
|
else
|
|
serialized.editorSimplifiedModeBlendNormalDistance.floatValue = serialized.boxBlendNormalDistancePositive.vector3Value.x;
|
|
serialized.Apply();
|
|
}
|
|
break;
|
|
case InfluenceShape.Sphere:
|
|
DrawSphereFadeHandle(serialized, owner, transform, s_SphereInfluenceNormalHandle, serialized.sphereBlendNormalDistance);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void DrawBoxHandle(SerializedInfluenceVolume serialized, Editor owner, Transform transform, HierarchicalBox box)
|
|
{
|
|
using (new Handles.DrawingScope(Matrix4x4.TRS(Vector3.zero, transform.rotation, Vector3.one)))
|
|
{
|
|
box.center = Quaternion.Inverse(transform.rotation) * transform.position;
|
|
box.size = serialized.boxSize.vector3Value;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
box.DrawHull(true);
|
|
box.DrawHandle();
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
var newPosition = transform.rotation * box.center;
|
|
Undo.RecordObject(transform, "Moving Influence");
|
|
transform.position = newPosition;
|
|
|
|
// Clamp blend distances
|
|
var blendPositive = serialized.boxBlendDistancePositive.vector3Value;
|
|
var blendNegative = serialized.boxBlendDistanceNegative.vector3Value;
|
|
var blendNormalPositive = serialized.boxBlendNormalDistancePositive.vector3Value;
|
|
var blendNormalNegative = serialized.boxBlendNormalDistanceNegative.vector3Value;
|
|
var size = box.size;
|
|
serialized.boxSize.vector3Value = size;
|
|
var halfSize = size * .5f;
|
|
for (int i = 0; i < 3; ++i)
|
|
{
|
|
blendPositive[i] = Mathf.Clamp(blendPositive[i], 0f, halfSize[i]);
|
|
blendNegative[i] = Mathf.Clamp(blendNegative[i], 0f, halfSize[i]);
|
|
blendNormalPositive[i] = Mathf.Clamp(blendNormalPositive[i], 0f, halfSize[i]);
|
|
blendNormalNegative[i] = Mathf.Clamp(blendNormalNegative[i], 0f, halfSize[i]);
|
|
}
|
|
serialized.boxBlendDistancePositive.vector3Value = blendPositive;
|
|
serialized.boxBlendDistanceNegative.vector3Value = blendNegative;
|
|
serialized.boxBlendNormalDistancePositive.vector3Value = blendNormalPositive;
|
|
serialized.boxBlendNormalDistanceNegative.vector3Value = blendNormalNegative;
|
|
|
|
if (serialized.editorAdvancedModeEnabled.boolValue)
|
|
{
|
|
serialized.editorAdvancedModeBlendDistancePositive.vector3Value = serialized.boxBlendDistancePositive.vector3Value;
|
|
serialized.editorAdvancedModeBlendDistanceNegative.vector3Value = serialized.boxBlendDistanceNegative.vector3Value;
|
|
serialized.editorAdvancedModeBlendNormalDistancePositive.vector3Value = serialized.boxBlendNormalDistancePositive.vector3Value;
|
|
serialized.editorAdvancedModeBlendNormalDistanceNegative.vector3Value = serialized.boxBlendNormalDistanceNegative.vector3Value;
|
|
}
|
|
else
|
|
{
|
|
serialized.editorSimplifiedModeBlendDistance.floatValue = Mathf.Min(
|
|
serialized.boxBlendDistancePositive.vector3Value.x,
|
|
serialized.boxBlendDistancePositive.vector3Value.y,
|
|
serialized.boxBlendDistancePositive.vector3Value.z,
|
|
serialized.boxBlendDistanceNegative.vector3Value.x,
|
|
serialized.boxBlendDistanceNegative.vector3Value.y,
|
|
serialized.boxBlendDistanceNegative.vector3Value.z);
|
|
serialized.boxBlendDistancePositive.vector3Value = serialized.boxBlendDistanceNegative.vector3Value = Vector3.one * serialized.editorSimplifiedModeBlendDistance.floatValue;
|
|
serialized.editorSimplifiedModeBlendNormalDistance.floatValue = Mathf.Min(
|
|
serialized.boxBlendNormalDistancePositive.vector3Value.x,
|
|
serialized.boxBlendNormalDistancePositive.vector3Value.y,
|
|
serialized.boxBlendNormalDistancePositive.vector3Value.z,
|
|
serialized.boxBlendNormalDistanceNegative.vector3Value.x,
|
|
serialized.boxBlendNormalDistanceNegative.vector3Value.y,
|
|
serialized.boxBlendNormalDistanceNegative.vector3Value.z);
|
|
serialized.boxBlendNormalDistancePositive.vector3Value = serialized.boxBlendNormalDistanceNegative.vector3Value = Vector3.one * serialized.editorSimplifiedModeBlendNormalDistance.floatValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void DrawBoxFadeHandle(SerializedInfluenceVolume serialized, Editor owner, Transform transform, HierarchicalBox box, SerializedProperty positive, SerializedProperty negative)
|
|
{
|
|
using (new Handles.DrawingScope(Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one)))
|
|
{
|
|
box.center = -(positive.vector3Value - negative.vector3Value) * 0.5f;
|
|
box.size = serialized.boxSize.vector3Value - positive.vector3Value - negative.vector3Value;
|
|
box.monoHandle = !serialized.editorAdvancedModeEnabled.boolValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
box.DrawHandle();
|
|
box.DrawHull(true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
var influenceCenter = Vector3.zero;
|
|
var halfInfluenceSize = serialized.boxSize.vector3Value * .5f;
|
|
|
|
var centerDiff = box.center - influenceCenter;
|
|
var halfSizeDiff = halfInfluenceSize - box.size * .5f;
|
|
var positiveNew = halfSizeDiff - centerDiff;
|
|
var negativeNew = halfSizeDiff + centerDiff;
|
|
var blendDistancePositive = Vector3.Max(Vector3.zero, Vector3.Min(positiveNew, halfInfluenceSize));
|
|
var blendDistanceNegative = Vector3.Max(Vector3.zero, Vector3.Min(negativeNew, halfInfluenceSize));
|
|
|
|
positive.vector3Value = blendDistancePositive;
|
|
negative.vector3Value = blendDistanceNegative;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void DrawSphereFadeHandle(SerializedInfluenceVolume serialized, Editor owner, Transform transform, HierarchicalSphere sphere, SerializedProperty radius)
|
|
{
|
|
//init parent sphere for clamping
|
|
s_SphereBaseHandle.center = Vector3.zero;
|
|
s_SphereBaseHandle.radius = serialized.sphereRadius.floatValue;
|
|
|
|
using (new Handles.DrawingScope(Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one)))
|
|
{
|
|
sphere.center = Vector3.zero;
|
|
sphere.radius = serialized.sphereRadius.floatValue - radius.floatValue;
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
sphere.DrawHull(true);
|
|
sphere.DrawHandle();
|
|
if (EditorGUI.EndChangeCheck())
|
|
radius.floatValue = Mathf.Clamp(serialized.sphereRadius.floatValue - sphere.radius, 0, serialized.sphereRadius.floatValue);
|
|
}
|
|
}
|
|
}
|
|
}
|