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 } }