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.
113 lines
4.1 KiB
113 lines
4.1 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.VFX;
|
|
|
|
namespace UnityEditor.VFX.Block
|
|
{
|
|
class GPUEventRate : VFXBlock
|
|
{
|
|
public enum Mode
|
|
{
|
|
OverTime,
|
|
OverDistance
|
|
}
|
|
|
|
[SerializeField, VFXSetting, Tooltip("Specifies whether particles are spawned over time (rate per second) or over distance (rate per parent particle distance change).")]
|
|
protected Mode mode = Mode.OverTime;
|
|
|
|
[SerializeField, VFXSetting(VFXSettingAttribute.VisibleFlags.InInspector), Tooltip("True to allow one event max per frame")]
|
|
protected bool clampToOne = true;
|
|
|
|
public override void Sanitize(int version)
|
|
{
|
|
base.Sanitize(version);
|
|
var newBlock = ScriptableObject.CreateInstance<TriggerEvent>();
|
|
newBlock.SetSettingValue("mode", mode == Mode.OverDistance ? TriggerEvent.Mode.OverDistance : TriggerEvent.Mode.OverTime);
|
|
newBlock.SetSettingValue("clampToOne", clampToOne);
|
|
VFXSlot.CopyLinksAndValue(newBlock.GetInputSlot(0), GetInputSlot(0));
|
|
VFXSlot.CopyLinksAndValue(newBlock.GetOutputSlot(0), GetOutputSlot(0));
|
|
ReplaceModel(newBlock, this);
|
|
}
|
|
|
|
public override string name { get { return string.Format("Trigger Event Rate ({0})", ObjectNames.NicifyVariableName(mode.ToString())); } }
|
|
public override VFXContextType compatibleContexts { get { return VFXContextType.Update; } }
|
|
public override VFXDataType compatibleData { get { return VFXDataType.Particle; } }
|
|
|
|
public override IEnumerable<VFXAttributeInfo> attributes
|
|
{
|
|
get
|
|
{
|
|
if (GetRateCountAttribute() is { } rateCountAttributeName)
|
|
{
|
|
yield return new VFXAttributeInfo(new VFXAttribute(rateCountAttributeName, VFXValueType.Float, string.Empty), VFXAttributeMode.ReadWrite);
|
|
}
|
|
yield return new VFXAttributeInfo(VFXAttribute.EventCount, VFXAttributeMode.Write);
|
|
|
|
if (mode == Mode.OverDistance)
|
|
{
|
|
yield return new VFXAttributeInfo(VFXAttribute.Velocity, VFXAttributeMode.Read);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override IEnumerable<VFXNamedExpression> parameters
|
|
{
|
|
get
|
|
{
|
|
foreach (var parameter in base.parameters)
|
|
yield return parameter;
|
|
|
|
yield return new VFXNamedExpression(VFXBuiltInExpression.DeltaTime, "deltaTime");
|
|
}
|
|
}
|
|
|
|
public class InputProperties
|
|
{
|
|
[Tooltip("Sets the rate of spawning particles via a GPU event based on the selected mode.")]
|
|
public float Rate = 10.0f;
|
|
}
|
|
|
|
public class OutputProperties
|
|
{
|
|
[Tooltip("Outputs a GPU event which can connect to another system via a GPUEvent context. Attributes from the current system can be inherited in the new system.")]
|
|
public GPUEvent evt = new GPUEvent();
|
|
}
|
|
|
|
private string GetRateCountAttribute()
|
|
{
|
|
return GetParent() is { } parent ? "rateCount_" + VFXCodeGeneratorHelper.GeneratePrefix((uint)parent.GetIndex(this)) : null;
|
|
}
|
|
|
|
public override string source
|
|
{
|
|
get
|
|
{
|
|
string outSource = "";
|
|
string rateCount = GetRateCountAttribute();
|
|
|
|
switch (mode)
|
|
{
|
|
case Mode.OverDistance:
|
|
outSource += $"{rateCount} += length(velocity) * deltaTime * Rate;";
|
|
break;
|
|
case Mode.OverTime:
|
|
outSource += $"{rateCount} += deltaTime * Rate;";
|
|
break;
|
|
}
|
|
|
|
outSource += $@"
|
|
uint count = floor({rateCount});
|
|
{rateCount} = frac({rateCount});
|
|
eventCount = count;";
|
|
|
|
if (clampToOne)
|
|
outSource += @"
|
|
eventCount = min(eventCount,1);
|
|
";
|
|
|
|
return outSource;
|
|
}
|
|
}
|
|
}
|
|
}
|