rabidus-test/Assets/Dreamteck/Splines/Editor/SerializedSplinePoint.cs

256 lines
6.6 KiB
C#
Raw Normal View History

2023-07-24 16:38:13 +03:00
namespace Dreamteck.Splines.Editor
{
using UnityEditor;
using UnityEngine;
public struct SerializedSplinePoint
{
public bool changed;
public SplinePoint.Type type
{
get
{
return (SplinePoint.Type)_type.enumValueIndex;
}
set
{
if (value != type)
{
_type.enumValueIndex = (int)value;
changed = true;
}
}
}
public Vector3 position
{
get { return _position.vector3Value; }
set
{
if (value != position)
{
_position.vector3Value = value;
changed = true;
}
}
}
public Vector3 tangent
{
get { return _tangent.vector3Value; }
set
{
if (value != tangent)
{
_tangent.vector3Value = value;
changed = true;
}
}
}
public Vector3 tangent2
{
get { return _tangent2.vector3Value; }
set
{
if (value != tangent2)
{
_tangent2.vector3Value = value;
changed = true;
}
}
}
public Color color
{
get { return _color.colorValue; }
set
{
if (value != color)
{
_color.colorValue = value;
changed = true;
}
}
}
public Vector3 normal
{
get { return _normal.vector3Value; }
set
{
if (value != normal)
{
_normal.vector3Value = value;
changed = true;
}
}
}
public float size
{
get { return _size.floatValue; }
set
{
if (value != size)
{
_size.floatValue = value;
changed = true;
}
}
}
private SerializedProperty _point;
private SerializedProperty _position;
private SerializedProperty _tangent;
private SerializedProperty _tangent2;
private SerializedProperty _normal;
private SerializedProperty _size;
private SerializedProperty _color;
private SerializedProperty _type;
public SerializedSplinePoint(SerializedProperty input)
{
_point = input;
_position = _point.FindPropertyRelative("position");
_tangent = _point.FindPropertyRelative("tangent");
_tangent2 = _point.FindPropertyRelative("tangent2");
_normal = _point.FindPropertyRelative("normal");
_size = _point.FindPropertyRelative("size");
_color = _point.FindPropertyRelative("color");
_type = _point.FindPropertyRelative("_type");
changed = false;
}
public void SetPoint(SplinePoint point)
{
CheckForChange(point);
position = point.position;
tangent = point.tangent;
tangent2 = point.tangent2;
normal = point.normal;
size = point.size;
color = point.color;
type = point.type;
}
private void CheckForChange(SplinePoint point)
{
if (position != point.position)
{
changed = true;
return;
}
if (tangent != point.tangent)
{
changed = true;
return;
}
if (tangent2 != point.tangent2)
{
changed = true;
return;
}
if (normal != point.normal)
{
changed = true;
return;
}
if (size != point.size)
{
changed = true;
return;
}
if (color != point.color)
{
changed = true;
return;
}
if (type != point.type)
{
changed = true;
return;
}
}
public void CopyFrom(SerializedSplinePoint point)
{
position = point.position;
tangent = point.tangent;
tangent2 = point.tangent2;
normal = point.normal;
size = point.size;
color = point.color;
type = point.type;
}
public SplinePoint CreateSplinePoint()
{
SplinePoint point = new SplinePoint();
point.type = type;
point.position = position;
point.tangent = tangent;
point.tangent2 = tangent2;
point.normal = normal;
point.size = size;
point.color = color;
point.isDirty = changed;
return point;
}
public void SetPosition(Vector3 pos)
{
tangent -= position - pos;
tangent2 -= position - pos;
position = pos;
}
public void SetTangentPosition(Vector3 pos)
{
tangent = pos;
switch ((SplinePoint.Type)_type.enumValueIndex)
{
case SplinePoint.Type.SmoothMirrored: SmoothMirrorTangent2(); break;
case SplinePoint.Type.SmoothFree: SmoothFreeTangent2(); break;
}
}
public void SetTangent2Position(Vector3 pos)
{
tangent2 = pos;
switch ((SplinePoint.Type)_type.enumValueIndex)
{
case SplinePoint.Type.SmoothMirrored: SmoothMirrorTangent(); break;
case SplinePoint.Type.SmoothFree: SmoothFreeTangent(); break;
}
}
private void SmoothMirrorTangent2()
{
tangent2 = position + (position - tangent);
}
private void SmoothMirrorTangent()
{
tangent = position + (position - tangent2);
}
private void SmoothFreeTangent2()
{
tangent2 = position + (position - tangent).normalized * (tangent2 - position).magnitude;
}
private void SmoothFreeTangent()
{
tangent = position + (position - tangent2).normalized * (tangent - position).magnitude;
}
}
}