rabidus-test/Assets/Amazing Assets/Advanced Dissolve/Scripts/Controllers/AdvancedDissolveGeometricCu...

771 lines
41 KiB
C#
Raw Normal View History

2023-09-18 20:09:22 +03:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace AmazingAssets.AdvancedDissolve
{
[ExecuteAlways]
public class AdvancedDissolveGeometricCutoutController : AdvancedDissolveController
{
public enum UpdateMode { OnFixedUpdate, EveryFrame, Manual }
public UpdateMode updateMode = UpdateMode.EveryFrame;
public bool drawGizmos = true;
public AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType type;
public AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount count;
public AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.XYZAxis xyzAxis;
public AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.XYZStyle xyzStyle;
public AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.XYZSpace xyzSpace;
public float xyzRollout;
public Transform xyzPivotPointTransform;
public Vector3 xyzPivotPointPosition;
public Transform target1StartPointTransform; public Transform target1EndPointTransform;
public Vector3 target1StartPointPosition; public Vector3 target1EndPointPosition;
public float target1Radius = 0;
public Vector3 target1Normal = Vector3.up;
public Vector3 target1Rotation = Vector3.zero;
public Vector3 target1Size = Vector3.one;
public Transform target2StartPointTransform; public Transform target2EndPointTransform;
public Vector3 target2StartPointPosition; public Vector3 target2EndPointPosition;
public float target2Radius = 0;
public Vector3 target2Normal = Vector3.up;
public Vector3 target2Rotation = Vector3.zero;
public Vector3 target2Size = Vector3.one;
public Transform target3StartPointTransform; public Transform target3EndPointTransform;
public Vector3 target3StartPointPosition; public Vector3 target3EndPointPosition;
public float target3Radius;
public Vector3 target3Normal = Vector3.up;
public Vector3 target3Rotation = Vector3.zero;
public Vector3 target3Size = Vector3.one;
public Transform target4StartPointTransform; public Transform target4EndPointTransform;
public Vector3 target4StartPointPosition; public Vector3 target4EndPointPosition;
public float target4Radius;
public Vector3 target4Normal = Vector3.up;
public Vector3 target4Rotation = Vector3.zero;
public Vector3 target4Size = Vector3.one;
public bool invert;
public float noise;
protected override void Awake()
{
base.Awake();
}
protected override void Update()
{
base.Update();
if (updateMode == UpdateMode.EveryFrame || (updateMode == UpdateMode.OnFixedUpdate && Application.isEditor))
UpdateShaderData();
}
private void FixedUpdate()
{
if (updateMode == UpdateMode.OnFixedUpdate)
UpdateShaderData();
}
[ContextMenu("Force Update Geometric Cutout Controller")]
override public void ForceUpdateShaderData()
{
UpdateShaderData();
}
[ContextMenu("Reset Geometric Cutout Controller")]
public override void ResetShaderData()
{
#if UNITY_EDITOR
UnityEditor.Undo.RecordObject(this, "Reset Geometric Cutout Controller");
#endif
updateMode = UpdateMode.EveryFrame;
drawGizmos = true;
type = AdvancedDissolveKeywords.CutoutGeometricType.None;
count = AdvancedDissolveKeywords.CutoutGeometricCount.One;
xyzAxis = AdvancedDissolveProperties.Cutout.Geometric.XYZAxis.X;
xyzStyle = AdvancedDissolveProperties.Cutout.Geometric.XYZStyle.Linear;
xyzSpace = AdvancedDissolveProperties.Cutout.Geometric.XYZSpace.Local;
xyzRollout = 0;
xyzPivotPointTransform = null;
xyzPivotPointPosition = Vector3.zero;
target1StartPointTransform = null; target1EndPointTransform = null;
target1StartPointPosition = Vector3.zero; target1EndPointPosition = Vector3.zero;
target1Radius = 0;
target1Normal = Vector3.up;
target1Rotation = Vector3.zero;
target1Size = Vector3.one;
target2StartPointTransform = null; target2EndPointTransform = null;
target2StartPointPosition = Vector3.zero; target2EndPointPosition = Vector3.zero;
target2Radius = 0;
target2Normal = Vector3.up;
target2Rotation = Vector3.zero;
target2Size = Vector3.one;
target3StartPointTransform = null; target3EndPointTransform = null;
target3StartPointPosition = Vector3.zero; target3EndPointPosition = Vector3.zero;
target3Radius = 0;
target3Normal = Vector3.up;
target3Rotation = Vector3.zero;
target3Size = Vector3.one;
target4StartPointTransform = null; target4EndPointTransform = null;
target4StartPointPosition = Vector3.zero; target4EndPointPosition = Vector3.zero;
target4Radius = 0;
target4Normal = Vector3.up;
target4Rotation = Vector3.zero;
target4Size = Vector3.one;
invert = false;
noise = 0;
globalControlID = AdvancedDissolveKeywords.GlobalControlID.None;
ForceUpdateShaderData();
}
void UpdateShaderData()
{
switch (type)
{
case AdvancedDissolveKeywords.CutoutGeometricType.XYZAxis:
{
if (xyzSpace == AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.XYZSpace.World && xyzPivotPointTransform != null)
xyzPivotPointPosition = xyzPivotPointTransform.position;
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.XYZAxis(materials[m], xyzAxis, xyzStyle, xyzSpace, xyzRollout, xyzPivotPointPosition);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.XYZAxis(globalControlID, xyzAxis, xyzStyle, xyzSpace, xyzRollout, xyzPivotPointPosition);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
break;
case AdvancedDissolveKeywords.CutoutGeometricType.Plane:
{
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
Vector3 position;
Vector3 normal;
GetPlaneData(countID, out position, out normal);
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Plane(materials[m], countID, position, normal);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Plane(globalControlID, countID, position, normal);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
}
break;
case AdvancedDissolveKeywords.CutoutGeometricType.Sphere:
{
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
Vector3 position;
float radius;
GetSphereData(countID, out position, out radius);
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Sphere(materials[m], countID, position, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Sphere(globalControlID, countID, position, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
}
break;
case AdvancedDissolveKeywords.CutoutGeometricType.Cube:
{
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
Vector3 position;
Vector3 rotation;
Vector3 size;
GetCubeData(countID, out position, out rotation, out size);
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Cube(materials[m], countID, position, Quaternion.Euler(rotation), size);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Cube(globalControlID, countID, position, Quaternion.Euler(rotation), size);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
}
break;
case AdvancedDissolveKeywords.CutoutGeometricType.Capsule:
{
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
Vector3 startPosition;
Vector3 endPosition;
float radius;
GetCapsuleData(countID, out startPosition, out endPosition, out radius);
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Capsule(materials[m], countID, startPosition, endPosition, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Capsule(globalControlID, countID, startPosition, endPosition, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
}
break;
case AdvancedDissolveKeywords.CutoutGeometricType.ConeSmooth:
{
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
Vector3 startPosition;
Vector3 endPosition;
float radius;
GetConeSmoothData(countID, out startPosition, out endPosition, out radius);
if (globalControlID == AdvancedDissolveKeywords.GlobalControlID.None)
{
if (materials != null)
for (int m = 0; m < materials.Count; m++)
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.ConeSmooth(materials[m], countID, startPosition, endPosition, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Invert(materials[m], invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateLocalProperty.Noise(materials[m], noise);
}
}
else
{
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.ConeSmooth(globalControlID, countID, startPosition, endPosition, radius);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Invert(globalControlID, invert);
AdvancedDissolve.AdvancedDissolveProperties.Cutout.Geometric.UpdateGlobalProperty.Noise(globalControlID, noise);
}
}
}
break;
}
}
public Transform GetTargetStartPointTransform(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1StartPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2StartPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3StartPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4StartPointTransform;
}
return null;
}
public Transform GetTargetEndPointTransform(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1EndPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2EndPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3EndPointTransform;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4EndPointTransform;
}
return null;
}
public Vector3 GetTargetStartPointPosition(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1StartPointTransform == null ? target1StartPointPosition : target1StartPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2StartPointTransform == null ? target2StartPointPosition : target2StartPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3StartPointTransform == null ? target3StartPointPosition : target3StartPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4StartPointTransform == null ? target4StartPointPosition : target4StartPointTransform.position;
}
return Vector3.zero;
}
public Vector3 GetTargetEndPointPosition(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1EndPointTransform == null ? target1EndPointPosition : target1EndPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2EndPointTransform == null ? target2EndPointPosition : target2EndPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3EndPointTransform == null ? target3EndPointPosition : target3EndPointTransform.position;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4EndPointTransform == null ? target4EndPointPosition : target4EndPointTransform.position;
}
return Vector3.zero;
}
public float GetTargetRadius(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: if (target1Radius < 0) target1Radius = 0; return target1Radius;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: if (target2Radius < 0) target2Radius = 0; return target2Radius;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: if (target3Radius < 0) target3Radius = 0; return target3Radius;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: if (target4Radius < 0) target4Radius = 0; return target4Radius;
}
return 0;
}
public Vector3 GetTargetNormal(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1StartPointTransform == null ? target1Normal.normalized : target1StartPointTransform.up;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2StartPointTransform == null ? target2Normal.normalized : target2StartPointTransform.up;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3StartPointTransform == null ? target3Normal.normalized : target3StartPointTransform.up;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4StartPointTransform == null ? target4Normal.normalized : target4StartPointTransform.up;
}
return Vector3.zero;
}
public Vector3 GetTargetRotation(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1StartPointTransform == null ? target1Rotation : target1StartPointTransform.rotation.eulerAngles;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2StartPointTransform == null ? target2Rotation : target2StartPointTransform.rotation.eulerAngles;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3StartPointTransform == null ? target3Rotation : target3StartPointTransform.rotation.eulerAngles;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4StartPointTransform == null ? target4Rotation : target4StartPointTransform.rotation.eulerAngles;
}
return Vector3.zero;
}
public Vector3 GetTargetSize(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: return target1StartPointTransform == null ? target1Size : target1StartPointTransform.lossyScale;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: return target2StartPointTransform == null ? target2Size : target2StartPointTransform.lossyScale;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: return target3StartPointTransform == null ? target3Size : target3StartPointTransform.lossyScale;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: return target4StartPointTransform == null ? target4Size : target4StartPointTransform.lossyScale;
}
return Vector3.one;
}
public void SetTargetStartPointTransform(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Transform transform)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1StartPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2StartPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3StartPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4StartPointTransform = transform; break;
}
}
public void SetTargetEndPointTransform(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Transform transform)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1EndPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2EndPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3EndPointTransform = transform; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4EndPointTransform = transform; break;
}
}
public void SetTargetStartPointPosition(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Vector3 position)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1StartPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2StartPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3StartPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4StartPointPosition = position; break;
}
}
public void SetTargetEndPointPosition(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Vector3 position)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1EndPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2EndPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3EndPointPosition = position; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4EndPointPosition = position; break;
}
}
public void SetTargetRadius(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, float radius)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1Radius = radius; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2Radius = radius; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3Radius = radius; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4Radius = radius; break;
}
}
public void SetTargetNormal(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Vector3 normal)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1Normal = normal; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2Normal = normal; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3Normal = normal; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4Normal = normal; break;
}
}
public void SetTargetRotation(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Vector3 rotation)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1Rotation = rotation; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2Rotation = rotation; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3Rotation = rotation; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4Rotation = rotation; break;
}
}
public void SetTargetSize(AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID, Vector3 size)
{
switch (countID)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.One: target1Size = size; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Two: target2Size = size; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Three: target3Size = size; break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount.Four: target4Size = size; break;
}
}
public void GetPlaneData(AdvancedDissolveKeywords.CutoutGeometricCount countID, out Vector3 position, out Vector3 normal)
{
position = GetTargetStartPointPosition(countID);
normal = GetTargetNormal(countID);
#if UNITY_EDITOR
SetTargetStartPointPosition(countID, position);
SetTargetNormal(countID, normal);
#endif
}
public void GetSphereData(AdvancedDissolveKeywords.CutoutGeometricCount countID, out Vector3 position, out float radius)
{
position = GetTargetStartPointPosition(countID);
radius = GetTargetRadius(countID);
#if UNITY_EDITOR
SetTargetStartPointPosition(countID, position);
#endif
}
public void GetCubeData(AdvancedDissolveKeywords.CutoutGeometricCount countID, out Vector3 position, out Vector3 rotation, out Vector3 size)
{
position = GetTargetStartPointPosition(countID);
rotation = GetTargetRotation(countID);
size = GetTargetSize(countID);
#if UNITY_EDITOR
SetTargetStartPointPosition(countID, position);
SetTargetRotation(countID, rotation);
SetTargetSize(countID, size);
#endif
}
public void GetCapsuleData(AdvancedDissolveKeywords.CutoutGeometricCount countID, out Vector3 startPosition, out Vector3 endPosition, out float radius)
{
startPosition = GetTargetStartPointPosition(countID);
endPosition = GetTargetEndPointPosition(countID);
radius = GetTargetRadius(countID);
}
public void GetConeSmoothData(AdvancedDissolveKeywords.CutoutGeometricCount countID, out Vector3 startPosition, out Vector3 endPosition, out float radius)
{
startPosition = GetTargetStartPointPosition(countID);
endPosition = GetTargetEndPointPosition(countID);
radius = GetTargetRadius(countID);
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (drawGizmos)
{
Gizmos.color = Color.magenta;
for (int c = 0; c < (int)count + 1; c++)
{
AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricCount countID = (AdvancedDissolveKeywords.CutoutGeometricCount)c;
switch (type)
{
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.XYZAxis: break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.Plane:
{
Vector3 position;
Vector3 normal;
GetPlaneData(countID, out position, out normal);
if (normal.magnitude != 0)
{
Quaternion rotation = Quaternion.LookRotation(normal, Vector3.up);
GizmoDrawArrow(position, position + normal, 0.3f, 15);
GizmoDrawCube(position, rotation, new Vector3(1, 1, 0));
}
}
break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.Sphere:
{
Vector3 position;
float radius;
GetSphereData(countID, out position, out radius);
Gizmos.DrawWireSphere(position, radius);
}
break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.Cube:
{
Vector3 position;
Vector3 rotation;
Vector3 size;
GetCubeData(countID, out position, out rotation, out size);
GizmoDrawCube(position, Quaternion.Euler(rotation), size);
}
break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.Capsule:
{
Vector3 startPosition;
Vector3 endPosition;
float radius;
GetCapsuleData(countID, out startPosition, out endPosition, out radius);
GizmoDrawCapsule(startPosition, endPosition, radius);
}
break;
case AdvancedDissolve.AdvancedDissolveKeywords.CutoutGeometricType.ConeSmooth:
{
Vector3 startPosition;
Vector3 endPosition;
float radius;
GetConeSmoothData(countID, out startPosition, out endPosition, out radius);
GizmoDrawConeSmooth(startPosition, endPosition, radius);
}
break;
}
}
}
}
static void GizmoDrawCube(Vector3 position, Quaternion rotation, Vector3 scale)
{
Matrix4x4 save = Gizmos.matrix;
Gizmos.matrix = Matrix4x4.TRS(position, rotation, scale);
Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
Gizmos.matrix = save;
}
static void GizmoDrawCapsule(Vector3 start, Vector3 end, float radius)
{
Vector3 up = (end - start).normalized * radius;
Vector3 forward = Vector3.Slerp(up, -up, 0.5f);
Vector3 right = Vector3.Cross(up, forward).normalized * radius;
float height = (start - end).magnitude;
float sideLength = Mathf.Max(0, (height * 0.5f + radius) - radius);
Vector3 middle = (end + start) * 0.5f;
start = middle + ((start - middle).normalized * sideLength);
end = middle + ((end - middle).normalized * sideLength);
//Radial circles
GizmoDrawCircle(start, up, radius);
GizmoDrawCircle(end, -up, radius);
//Side lines
Gizmos.DrawLine(start + right, end + right);
Gizmos.DrawLine(start - right, end - right);
Gizmos.DrawLine(start + forward, end + forward);
Gizmos.DrawLine(start - forward, end - forward);
for (int i = 1; i < 26; i++)
{
//Start endcap
Gizmos.DrawLine(Vector3.Slerp(right, -up, i / 25.0f) + start, Vector3.Slerp(right, -up, (i - 1) / 25.0f) + start);
Gizmos.DrawLine(Vector3.Slerp(-right, -up, i / 25.0f) + start, Vector3.Slerp(-right, -up, (i - 1) / 25.0f) + start);
Gizmos.DrawLine(Vector3.Slerp(forward, -up, i / 25.0f) + start, Vector3.Slerp(forward, -up, (i - 1) / 25.0f) + start);
Gizmos.DrawLine(Vector3.Slerp(-forward, -up, i / 25.0f) + start, Vector3.Slerp(-forward, -up, (i - 1) / 25.0f) + start);
//End endcap
Gizmos.DrawLine(Vector3.Slerp(right, up, i / 25.0f) + end, Vector3.Slerp(right, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(-right, up, i / 25.0f) + end, Vector3.Slerp(-right, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(forward, up, i / 25.0f) + end, Vector3.Slerp(forward, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(-forward, up, i / 25.0f) + end, Vector3.Slerp(-forward, up, (i - 1) / 25.0f) + end);
}
}
static void GizmoDrawConeSmooth(Vector3 start, Vector3 end, float radius)
{
Vector3 up = (end - start).normalized * radius;
Vector3 forward = Vector3.Slerp(up, -up, 0.5f);
Vector3 right = Vector3.Cross(up, forward).normalized * radius;
float height = (start - end).magnitude;
//Radial circles
GizmoDrawCircle(end, -up, radius);
//Side lines
Gizmos.DrawLine(start, end + right);
Gizmos.DrawLine(start, end - right);
Gizmos.DrawLine(start, end + forward);
Gizmos.DrawLine(start, end - forward);
for (int i = 1; i < 26; i++)
{
//End endcap
Gizmos.DrawLine(Vector3.Slerp(right, up, i / 25.0f) + end, Vector3.Slerp(right, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(-right, up, i / 25.0f) + end, Vector3.Slerp(-right, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(forward, up, i / 25.0f) + end, Vector3.Slerp(forward, up, (i - 1) / 25.0f) + end);
Gizmos.DrawLine(Vector3.Slerp(-forward, up, i / 25.0f) + end, Vector3.Slerp(-forward, up, (i - 1) / 25.0f) + end);
}
}
static void GizmoDrawCircle(Vector3 position, Vector3 up, float radius)
{
up = ((up == Vector3.zero) ? Vector3.up : up).normalized * radius;
Vector3 _forward = Vector3.Slerp(up, -up, 0.5f);
Vector3 _right = Vector3.Cross(up, _forward).normalized * radius;
Matrix4x4 matrix = new Matrix4x4();
matrix[0] = _right.x;
matrix[1] = _right.y;
matrix[2] = _right.z;
matrix[4] = up.x;
matrix[5] = up.y;
matrix[6] = up.z;
matrix[8] = _forward.x;
matrix[9] = _forward.y;
matrix[10] = _forward.z;
Vector3 _lastPoint = position + matrix.MultiplyPoint3x4(new Vector3(Mathf.Cos(0), 0, Mathf.Sin(0)));
Vector3 _nextPoint = Vector3.zero;
for (var i = 0; i < 91; i++)
{
_nextPoint.x = Mathf.Cos((i * 4) * Mathf.Deg2Rad);
_nextPoint.z = Mathf.Sin((i * 4) * Mathf.Deg2Rad);
_nextPoint.y = 0;
_nextPoint = position + matrix.MultiplyPoint3x4(_nextPoint);
Gizmos.DrawLine(_lastPoint, _nextPoint);
_lastPoint = _nextPoint;
}
}
static void GizmoDrawArrow(Vector3 from, Vector3 to, float arrowHeadLength, float arrowHeadAngle)
{
Gizmos.DrawLine(from, to);
var direction = to - from;
var right = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * new Vector3(0, 0, 1);
var left = Quaternion.LookRotation(direction) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * new Vector3(0, 0, 1);
Gizmos.DrawLine(to, to + right * arrowHeadLength);
Gizmos.DrawLine(to, to + left * arrowHeadLength);
}
#endif
}
}