Initial commit

This commit is contained in:
AbstractConcept 2022-09-13 00:36:34 -05:00
commit 3c7cc0c973
8391 changed files with 704313 additions and 0 deletions

View file

@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using UnityEditor;
using UnityEngine;
namespace Unity.Mathematics.Editor
{
[CustomPropertyDrawer(typeof(bool2x2)), CustomPropertyDrawer(typeof(bool2x3)), CustomPropertyDrawer(typeof(bool2x4))]
[CustomPropertyDrawer(typeof(bool3x2)), CustomPropertyDrawer(typeof(bool3x3)), CustomPropertyDrawer(typeof(bool3x4))]
[CustomPropertyDrawer(typeof(bool4x2)), CustomPropertyDrawer(typeof(bool4x3)), CustomPropertyDrawer(typeof(bool4x4))]
[CustomPropertyDrawer(typeof(double2x2)), CustomPropertyDrawer(typeof(double2x3)), CustomPropertyDrawer(typeof(double2x4))]
[CustomPropertyDrawer(typeof(double3x2)), CustomPropertyDrawer(typeof(double3x3)), CustomPropertyDrawer(typeof(double3x4))]
[CustomPropertyDrawer(typeof(double4x2)), CustomPropertyDrawer(typeof(double4x3)), CustomPropertyDrawer(typeof(double4x4))]
[CustomPropertyDrawer(typeof(float2x2)), CustomPropertyDrawer(typeof(float2x3)), CustomPropertyDrawer(typeof(float2x4))]
[CustomPropertyDrawer(typeof(float3x2)), CustomPropertyDrawer(typeof(float3x3)), CustomPropertyDrawer(typeof(float3x4))]
[CustomPropertyDrawer(typeof(float4x2)), CustomPropertyDrawer(typeof(float4x3)), CustomPropertyDrawer(typeof(float4x4))]
[CustomPropertyDrawer(typeof(int2x2)), CustomPropertyDrawer(typeof(int2x3)), CustomPropertyDrawer(typeof(int2x4))]
[CustomPropertyDrawer(typeof(int3x2)), CustomPropertyDrawer(typeof(int3x3)), CustomPropertyDrawer(typeof(int3x4))]
[CustomPropertyDrawer(typeof(int4x2)), CustomPropertyDrawer(typeof(int4x3)), CustomPropertyDrawer(typeof(int4x4))]
[CustomPropertyDrawer(typeof(uint2x2)), CustomPropertyDrawer(typeof(uint2x3)), CustomPropertyDrawer(typeof(uint2x4))]
[CustomPropertyDrawer(typeof(uint3x2)), CustomPropertyDrawer(typeof(uint3x3)), CustomPropertyDrawer(typeof(uint3x4))]
[CustomPropertyDrawer(typeof(uint4x2)), CustomPropertyDrawer(typeof(uint4x3)), CustomPropertyDrawer(typeof(uint4x4))]
class MatrixDrawer : PropertyDrawer
{
public override bool CanCacheInspectorGUI(SerializedProperty property)
{
return false;
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
if (!property.isExpanded)
return EditorGUIUtility.singleLineHeight;
var rows = 1 + property.type[property.type.Length - 3] - '0';
return rows * EditorGUIUtility.singleLineHeight + (rows - 1) * EditorGUIUtility.standardVerticalSpacing;
}
static ReadOnlyCollection<string> k_ColPropertyPaths =
new ReadOnlyCollection<string>(new[] { "c0", "c1", "c2", "c3" });
static ReadOnlyCollection<string> k_RowPropertyPaths =
new ReadOnlyCollection<string>(new[] { "x", "y", "z", "w" });
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
position.height = EditorGUIUtility.singleLineHeight;
EditorGUI.PropertyField(position, property, label, false);
if (Event.current.type == EventType.ContextClick && position.Contains(Event.current.mousePosition))
{
DoUtilityMenu(property);
Event.current.Use();
}
if (!property.isExpanded)
return;
var rows = property.type[property.type.Length - 3] - '0';
var cols = property.type[property.type.Length - 1] - '0';
++EditorGUI.indentLevel;
position = EditorGUI.IndentedRect(position);
--EditorGUI.indentLevel;
var elementType = property.FindPropertyRelative("c0.x").propertyType;
for (var row = 0; row < rows; ++row)
{
position.y += position.height + EditorGUIUtility.standardVerticalSpacing;
var elementRect = new Rect(position)
{
width = elementType == SerializedPropertyType.Boolean
? EditorGUIUtility.singleLineHeight
: (position.width - (cols - 1) * EditorGUIUtility.standardVerticalSpacing) / cols
};
for (var col = 0; col < cols; ++col)
{
EditorGUI.PropertyField(
elementRect,
property.FindPropertyRelative($"{k_ColPropertyPaths[col]}.{k_RowPropertyPaths[row]}"),
GUIContent.none
);
elementRect.x += elementRect.width + EditorGUIUtility.standardVerticalSpacing;
}
}
}
Dictionary<SerializedPropertyType, Action<SerializedProperty, bool>> k_UtilityValueSetters =
new Dictionary<SerializedPropertyType, Action<SerializedProperty, bool>>
{
{ SerializedPropertyType.Boolean, (property, b) => property.boolValue = b },
{ SerializedPropertyType.Float, (property, b) => property.floatValue = b ? 1f : 0f },
{ SerializedPropertyType.Integer, (property, b) => property.intValue = b ? 1 : 0 }
};
void DoUtilityMenu(SerializedProperty property)
{
var rows = property.type[property.type.Length - 3] - '0';
var cols = property.type[property.type.Length - 1] - '0';
var elementType = property.FindPropertyRelative("c0.x").propertyType;
var setValue = k_UtilityValueSetters[elementType];
var menu = new GenericMenu();
property = property.Copy();
menu.AddItem(
EditorGUIUtility.TrTextContent("Set to Zero"),
false,
() =>
{
property.serializedObject.Update();;
for (var row = 0; row < rows; ++row)
for (var col = 0; col < cols; ++col)
setValue(
property.FindPropertyRelative($"{k_ColPropertyPaths[col]}.{k_RowPropertyPaths[row]}"),
false
);
property.serializedObject.ApplyModifiedProperties();
}
);
if (rows == cols)
{
menu.AddItem(
EditorGUIUtility.TrTextContent("Reset to Identity"),
false,
() =>
{
property.serializedObject.Update();
for (var row = 0; row < rows; ++row)
for (var col = 0; col < cols; ++col)
setValue(
property.FindPropertyRelative($"{k_ColPropertyPaths[col]}.{k_RowPropertyPaths[row]}"),
row == col
);
property.serializedObject.ApplyModifiedProperties();
}
);
}
menu.ShowAsContext();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 407410bec194a4cfe929933685bb80a7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,202 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityObject = UnityEngine.Object;
namespace Unity.Mathematics.Editor
{
[CustomPropertyDrawer(typeof(PostNormalizeAttribute))]
class PostNormalizedVectorDrawer : PrimitiveVectorDrawer
{
static class Content
{
public static readonly string tooltip =
L10n.Tr("Values you enter will be post-normalized. You will see the normalized result if you change selection and view the values again.");
}
class VectorPropertyGUIData
{
const int k_MaxElements = 4;
public readonly bool Valid;
// parent property
readonly SerializedProperty m_VectorProperty;
// relative paths of element child properties
readonly IReadOnlyList<string> m_ElementPaths;
// the number of element child properties
readonly int m_NumElements;
// per child property; value is null if there are multiple different values
readonly double?[] m_PreNormalizedValues;
// per target; used to revert actual values for each object after displaying pre-normalized values
readonly Dictionary<SerializedProperty, double4> m_PostNormalizedValues = new Dictionary<SerializedProperty, double4>();
public VectorPropertyGUIData(SerializedProperty property)
{
m_VectorProperty = property;
var parentPath = m_VectorProperty.propertyPath;
var i = 0;
var elementPaths = new List<string>(k_MaxElements);
var iterator = m_VectorProperty.Copy();
while (iterator.Next(true) && iterator.propertyPath.StartsWith(parentPath))
{
if (i >= k_MaxElements || iterator.propertyType != SerializedPropertyType.Float)
return;
elementPaths.Add(iterator.propertyPath.Substring(parentPath.Length + 1));
i++;
}
Valid = true;
m_NumElements = elementPaths.Count;
m_ElementPaths = elementPaths;
m_PreNormalizedValues = elementPaths.Select(p => (double?)null).ToArray();
UpdatePreNormalizedValues();
UpdatePostNormalizedValues();
}
void UpdatePostNormalizedValues()
{
m_PostNormalizedValues.Clear();
foreach (var target in m_VectorProperty.serializedObject.targetObjects)
{
var postNormalizedValue = new double4();
var parentProperty = new SerializedObject(target).FindProperty(m_VectorProperty.propertyPath);
for (var i = 0; i < m_NumElements; ++i)
postNormalizedValue[i] = parentProperty.FindPropertyRelative(m_ElementPaths[i]).doubleValue;
m_PostNormalizedValues[parentProperty] = postNormalizedValue;
}
}
public void UpdatePreNormalizedValues()
{
for (var i = 0; i < m_NumElements; ++i)
{
var p = m_VectorProperty.FindPropertyRelative(m_ElementPaths[i]);
m_PreNormalizedValues[i] = p.hasMultipleDifferentValues ? (double?)null : p.doubleValue;
}
}
public void ApplyPreNormalizedValues()
{
m_VectorProperty.serializedObject.ApplyModifiedProperties();
for (var i = 0; i < m_NumElements; ++i)
{
if (m_PreNormalizedValues[i] != null)
m_VectorProperty.FindPropertyRelative(m_ElementPaths[i]).doubleValue = m_PreNormalizedValues[i].Value;
}
}
public void UnapplyPreNormalizedValues()
{
foreach (var target in m_PostNormalizedValues)
{
target.Key.serializedObject.Update();
for (var i = 0; i < m_NumElements; ++i)
{
target.Key.FindPropertyRelative(m_ElementPaths[i]).doubleValue = target.Value[i];
target.Key.serializedObject.ApplyModifiedProperties();
}
}
m_VectorProperty.serializedObject.Update();
}
public void PostNormalize(Func<double4, double4> normalize)
{
m_VectorProperty.serializedObject.ApplyModifiedProperties();
foreach (var target in m_PostNormalizedValues)
{
target.Key.serializedObject.Update();
var postNormalizedValue = new double4();
for (var i = 0; i < m_NumElements; ++i)
postNormalizedValue[i] = target.Key.FindPropertyRelative(m_ElementPaths[i]).doubleValue;
postNormalizedValue = normalize(normalize(postNormalizedValue));
for (var i = 0; i < m_NumElements; ++i)
target.Key.FindPropertyRelative(m_ElementPaths[i]).doubleValue = postNormalizedValue[i];
target.Key.serializedObject.ApplyModifiedProperties();
}
UpdatePostNormalizedValues();
m_VectorProperty.serializedObject.Update();
}
public void RebuildIfDirty()
{
foreach (var target in m_PostNormalizedValues)
{
target.Key.serializedObject.Update();
for (var i = 0; i < m_NumElements; ++i)
{
var serialized = target.Key.FindPropertyRelative(m_ElementPaths[i]).doubleValue;
if (target.Value[i] != serialized)
{
UpdatePreNormalizedValues();
UpdatePostNormalizedValues();
return;
}
}
}
}
}
Dictionary<string, VectorPropertyGUIData> m_GUIDataPerPropertyPath = new Dictionary<string, VectorPropertyGUIData>();
protected virtual SerializedProperty GetVectorProperty(SerializedProperty property)
{
return property;
}
protected virtual double4 Normalize(double4 value)
{
return math.normalizesafe(value);
}
VectorPropertyGUIData GetGUIData(SerializedProperty property)
{
VectorPropertyGUIData guiData;
if (!m_GUIDataPerPropertyPath.TryGetValue(property.propertyPath, out guiData))
{
guiData = new VectorPropertyGUIData(GetVectorProperty(property));
m_GUIDataPerPropertyPath[property.propertyPath] = guiData;
}
return guiData;
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return GetGUIData(property).Valid ? base.GetPropertyHeight(property, label) : EditorGUIUtility.singleLineHeight;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var guiData = GetGUIData(property);
if (!guiData.Valid)
{
EditorGUI.HelpBox(
EditorGUI.PrefixLabel(position, label),
L10n.Tr($"{typeof(PostNormalizeAttribute).Name} only works with decimal vector types."),
MessageType.None
);
return;
}
if (string.IsNullOrEmpty(label.tooltip))
label.tooltip = Content.tooltip;
guiData.RebuildIfDirty();
guiData.ApplyPreNormalizedValues();
EditorGUI.BeginChangeCheck();
base.OnGUI(position, property, label);
if (EditorGUI.EndChangeCheck())
{
guiData.UpdatePreNormalizedValues();
guiData.PostNormalize(Normalize);
}
else
{
guiData.UnapplyPreNormalizedValues();
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2c060766caf7a405bb18fa4ba02780ee
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,77 @@
using System;
using UnityEditor;
using UnityEngine;
namespace Unity.Mathematics.Editor
{
[CustomPropertyDrawer(typeof(bool2)), CustomPropertyDrawer(typeof(bool3)), CustomPropertyDrawer(typeof(bool4))]
[CustomPropertyDrawer(typeof(double2)), CustomPropertyDrawer(typeof(double3)), CustomPropertyDrawer(typeof(double4))]
[CustomPropertyDrawer(typeof(float2)), CustomPropertyDrawer(typeof(float3)), CustomPropertyDrawer(typeof(float4))]
[CustomPropertyDrawer(typeof(int2)), CustomPropertyDrawer(typeof(int3)), CustomPropertyDrawer(typeof(int4))]
[CustomPropertyDrawer(typeof(uint2)), CustomPropertyDrawer(typeof(uint3)), CustomPropertyDrawer(typeof(uint4))]
[CustomPropertyDrawer(typeof(DoNotNormalizeAttribute))]
class PrimitiveVectorDrawer : PropertyDrawer
{
static class Content
{
public static readonly string doNotNormalizeCompatibility = L10n.Tr(
$"{typeof(DoNotNormalizeAttribute).Name} only works with {typeof(quaternion)} and primitive vector types."
);
public static readonly string doNotNormalizeTooltip =
L10n.Tr("This value is not normalized, which may produce unexpected results.");
public static readonly GUIContent[] labels2 = { new GUIContent("X"), new GUIContent("Y") };
public static readonly GUIContent[] labels3 = { new GUIContent("X"), new GUIContent("Y"), new GUIContent("Z") };
public static readonly GUIContent[] labels4 = { new GUIContent("X"), new GUIContent("Y"), new GUIContent("Z"), new GUIContent("W") };
}
public override bool CanCacheInspectorGUI(SerializedProperty property)
{
return false;
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
var height = EditorGUIUtility.singleLineHeight;
if (!EditorGUIUtility.wideMode)
height += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
return height;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var subLabels = Content.labels4;
var startIter = "x";
switch (property.type[property.type.Length - 1])
{
case '2':
subLabels = Content.labels2;
break;
case '3':
subLabels = Content.labels3;
break;
case '4':
subLabels = Content.labels4;
break;
default:
{
if (property.type == nameof(quaternion))
startIter = "value.x";
else if (attribute is DoNotNormalizeAttribute)
{
EditorGUI.HelpBox(EditorGUI.PrefixLabel(position, label), Content.doNotNormalizeCompatibility, MessageType.None);
return;
}
break;
}
}
if (attribute is DoNotNormalizeAttribute && string.IsNullOrEmpty(label.tooltip))
label.tooltip = Content.doNotNormalizeTooltip;
EditorGUI.BeginProperty(position, label, property);
EditorGUI.MultiPropertyField(position, subLabels, property.FindPropertyRelative(startIter), label);
EditorGUI.EndProperty();
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4ae914da3592740a58dd603fcb28b594
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,18 @@
using UnityEditor;
namespace Unity.Mathematics.Editor
{
[CustomPropertyDrawer(typeof(quaternion))]
class QuaternionDrawer : PostNormalizedVectorDrawer
{
protected override SerializedProperty GetVectorProperty(SerializedProperty property)
{
return property.FindPropertyRelative("value");
}
protected override double4 Normalize(double4 value)
{
return math.normalizesafe(new quaternion((float4)value)).value;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b78c76192c2e742779541501cfe4ca76
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,12 @@
{
"name": "Unity.Mathematics.Editor",
"references": [
"Unity.Mathematics"
],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": true
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 329b4ccd385744985bf3f83cfd77dfe7
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: