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.
214 lines
6.7 KiB
214 lines
6.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
using UnityEngine;
|
|
using UnityEngine.VFX;
|
|
|
|
namespace UnityEditor.VFX
|
|
{
|
|
[Flags]
|
|
enum VFXAttributeMode
|
|
{
|
|
None = 0,
|
|
Read = 1 << 0,
|
|
Write = 1 << 1,
|
|
ReadWrite = Read | Write,
|
|
ReadSource = 1 << 2,
|
|
}
|
|
|
|
partial struct VFXAttribute : IEquatable<VFXAttribute>
|
|
{
|
|
public VFXAttribute(string name, VFXValueType type, string description, VFXVariadic variadic = VFXVariadic.False, SpaceableType space = SpaceableType.None)
|
|
: this(name, GetValueFromType(type), description, variadic, space)
|
|
{
|
|
}
|
|
|
|
public VFXAttribute(string name, VFXValue value, string description, VFXVariadic variadic = VFXVariadic.False, SpaceableType space = SpaceableType.None)
|
|
{
|
|
this.name = name;
|
|
this.value = value;
|
|
this.variadic = variadic;
|
|
this.space = space;
|
|
this.description = description;
|
|
if (space != SpaceableType.None && variadic != VFXVariadic.False)
|
|
{
|
|
throw new InvalidOperationException("Can't mix spaceable and variadic attributes : " + name);
|
|
}
|
|
|
|
category = "No Category";
|
|
}
|
|
|
|
public string GetNameInCode(VFXAttributeLocation location)
|
|
{
|
|
var structName = location == VFXAttributeLocation.Source ? "sourceAttributes" : "attributes";
|
|
return $"{structName}.{name}";
|
|
}
|
|
|
|
public string name;
|
|
public VFXValue value;
|
|
public VFXVariadic variadic;
|
|
public SpaceableType space;
|
|
public string description;
|
|
public string category { get; set; }
|
|
|
|
public VFXValueType type => value.valueType;
|
|
|
|
public void Rename(string newName)
|
|
{
|
|
name = newName;
|
|
}
|
|
|
|
private static VFXValue GetValueFromType(VFXValueType type)
|
|
{
|
|
switch (type)
|
|
{
|
|
case VFXValueType.Boolean: return VFXValue.Constant<bool>();
|
|
case VFXValueType.Uint32: return VFXValue.Constant<uint>();
|
|
case VFXValueType.Int32: return VFXValue.Constant<int>();
|
|
case VFXValueType.Float: return VFXValue.Constant<float>();
|
|
case VFXValueType.Float2: return VFXValue.Constant<Vector2>();
|
|
case VFXValueType.Float3: return VFXValue.Constant<Vector3>();
|
|
case VFXValueType.Float4: return VFXValue.Constant<Vector4>();
|
|
default: throw new InvalidOperationException($"Unexpected attribute type: {type}");
|
|
}
|
|
}
|
|
|
|
public bool Equals(VFXAttribute other)
|
|
{
|
|
return string.Compare(name, other.name, StringComparison.OrdinalIgnoreCase) == 0;
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return name.GetHashCode();
|
|
}
|
|
}
|
|
|
|
struct VFXAttributeInfo
|
|
{
|
|
public VFXAttributeInfo(VFXAttribute attrib, VFXAttributeMode mode)
|
|
{
|
|
this.attrib = attrib;
|
|
this.mode = mode;
|
|
}
|
|
|
|
public VFXAttribute attrib;
|
|
public VFXAttributeMode mode;
|
|
}
|
|
|
|
enum VFXAttributeLocation
|
|
{
|
|
Current = 0,
|
|
Source = 1,
|
|
}
|
|
|
|
enum VFXVariadic
|
|
{
|
|
False = 0,
|
|
True = 1,
|
|
BelongsToVariadic = 2
|
|
}
|
|
|
|
enum VariadicChannelOptions
|
|
{
|
|
X = 0,
|
|
Y = 1,
|
|
Z = 2,
|
|
XY = 3,
|
|
XZ = 4,
|
|
YZ = 5,
|
|
XYZ = 6
|
|
};
|
|
|
|
#pragma warning disable 0659
|
|
sealed class VFXAttributeExpression : VFXExpression
|
|
{
|
|
public VFXAttributeExpression(VFXAttribute attribute, VFXAttributeLocation location = VFXAttributeLocation.Current) : base(Flags.PerElement)
|
|
{
|
|
m_attribute = attribute;
|
|
m_attributeLocation = location;
|
|
}
|
|
|
|
public override VFXExpressionOperation operation => VFXExpressionOperation.None;
|
|
|
|
public override VFXValueType valueType => m_attribute.type;
|
|
|
|
public string attributeName => m_attribute.name;
|
|
|
|
public VFXAttributeLocation attributeLocation => m_attributeLocation;
|
|
|
|
public VFXAttribute attribute => m_attribute;
|
|
private VFXAttribute m_attribute;
|
|
private VFXAttributeLocation m_attributeLocation;
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!(obj is VFXAttributeExpression))
|
|
return false;
|
|
|
|
var other = (VFXAttributeExpression)obj;
|
|
return valueType == other.valueType && attributeLocation == other.attributeLocation && attributeName == other.attributeName;
|
|
}
|
|
|
|
protected override int GetInnerHashCode()
|
|
{
|
|
return (attributeName.GetHashCode() * 397) ^ attributeLocation.GetHashCode();
|
|
}
|
|
|
|
protected override VFXExpression Evaluate(VFXExpression[] constParents)
|
|
{
|
|
return this;
|
|
}
|
|
|
|
public override string GetCodeString(string[] parents)
|
|
{
|
|
return attribute.GetNameInCode(attributeLocation);
|
|
}
|
|
|
|
public override IEnumerable<VFXAttributeInfo> GetNeededAttributes()
|
|
{
|
|
yield return new VFXAttributeInfo(attribute, m_attributeLocation == VFXAttributeLocation.Source ? VFXAttributeMode.ReadSource : VFXAttributeMode.Read);
|
|
}
|
|
}
|
|
|
|
|
|
sealed class VFXReadEventAttributeExpression : VFXExpression
|
|
{
|
|
private VFXAttribute m_attribute;
|
|
private UInt32 m_elementOffset;
|
|
|
|
public VFXReadEventAttributeExpression(VFXAttribute attribute, UInt32 elementOffset) : base(Flags.PerSpawn | Flags.InvalidOnGPU)
|
|
{
|
|
m_attribute = attribute;
|
|
m_elementOffset = elementOffset;
|
|
}
|
|
|
|
protected override int GetInnerHashCode()
|
|
{
|
|
return m_attribute.name.GetHashCode();
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (!(obj is VFXReadEventAttributeExpression))
|
|
return false;
|
|
|
|
var other = (VFXReadEventAttributeExpression)obj;
|
|
return valueType == other.valueType && attributeName == other.attributeName && m_elementOffset == other.elementOffset;
|
|
}
|
|
|
|
public override IEnumerable<VFXAttributeInfo> GetNeededAttributes()
|
|
{
|
|
yield return new VFXAttributeInfo(m_attribute, VFXAttributeMode.Read);
|
|
}
|
|
|
|
private UInt32 elementOffset => m_elementOffset;
|
|
private string attributeName => m_attribute.name;
|
|
public override VFXValueType valueType => m_attribute.type;
|
|
public override VFXExpressionOperation operation => VFXExpressionOperation.ReadEventAttribute;
|
|
protected override int[] additionnalOperands => new int[] { (int)m_elementOffset, (int)m_attribute.type };
|
|
}
|
|
|
|
#pragma warning restore 0659
|
|
}
|