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.
70 lines
2.6 KiB
70 lines
2.6 KiB
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEngine;
|
|
using UnityEngine.VFX;
|
|
|
|
namespace UnityEditor.VFX.Operator
|
|
{
|
|
[VFXHelpURL("Operator-AppendVector")]
|
|
[VFXInfo(name = "Append Vector", category = "Math/Vector")]
|
|
class AppendVector : VFXOperatorNumericCascadedUnified
|
|
{
|
|
protected override sealed string operatorName { get { return "AppendVector"; } }
|
|
|
|
protected override sealed double defaultValueDouble { get { return 0.0f; } }
|
|
|
|
protected override sealed ValidTypeRule typeFilter { get { return ValidTypeRule.allowEverythingExceptIntegerAndVector4; } }
|
|
|
|
protected override Type GetExpectedOutputTypeOfOperation(IEnumerable<Type> inputTypes)
|
|
{
|
|
var outputComponentCount = inputTypes.Select(o =>
|
|
{
|
|
var type = VFXValueType.None;
|
|
if (o == typeof(Position) || o == typeof(DirectionType) || o == typeof(Vector))
|
|
type = VFXValueType.Float3;
|
|
else
|
|
type = VFXExpression.GetVFXValueTypeFromType(o);
|
|
if (type == VFXValueType.None)
|
|
throw new InvalidOperationException("Unable to compute value type from " + o);
|
|
return VFXExpression.TypeToSize(type);
|
|
}).Sum();
|
|
outputComponentCount = Mathf.Min(Mathf.Max(outputComponentCount, 1), 4);
|
|
switch (outputComponentCount)
|
|
{
|
|
case 2: return typeof(Vector2);
|
|
case 3: return typeof(Vector3);
|
|
case 4: return typeof(Vector4);
|
|
default: return typeof(float);
|
|
}
|
|
}
|
|
|
|
protected override sealed IEnumerable<VFXExpression> ApplyPatchInputExpression(IEnumerable<VFXExpression> inputExpression)
|
|
{
|
|
return inputExpression; //remove explicitly unified behavior
|
|
}
|
|
|
|
protected override sealed VFXExpression[] BuildExpression(VFXExpression[] inputExpression)
|
|
{
|
|
var allComponent = inputExpression.SelectMany(e => VFXOperatorUtility.ExtractComponents(e))
|
|
.Take(4)
|
|
.ToArray();
|
|
|
|
if (allComponent.Length == 0)
|
|
{
|
|
return new VFXExpression[] { };
|
|
}
|
|
else if (allComponent.Length == 1)
|
|
{
|
|
return allComponent;
|
|
}
|
|
return new[] { new VFXExpressionCombine(allComponent) };
|
|
}
|
|
|
|
protected override VFXExpression ComposeExpression(VFXExpression a, VFXExpression b)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|