45 lines
1.3 KiB
C#
45 lines
1.3 KiB
C#
using Unity.Mathematics;
|
|
using UnityEngine.Splines;
|
|
|
|
namespace Misaki.ArtTool
|
|
{
|
|
public static partial class Distribution
|
|
{
|
|
public static void SplineDistribution(int index, int pointSize, SplineDistributionSetting setting, out float4x4 localMatrix, out bool isValid)
|
|
{
|
|
var pointIndex = index + setting.indexOffset;
|
|
|
|
if (pointIndex > pointSize)
|
|
{
|
|
localMatrix = float4x4.zero;
|
|
isValid = false;
|
|
|
|
return;
|
|
}
|
|
|
|
float t;
|
|
|
|
if (setting.isSpacingMode)
|
|
{
|
|
t = (pointIndex * setting.spacing) / setting.splineLength;
|
|
}
|
|
else
|
|
{
|
|
t = pointIndex / (float)(pointSize - 1);
|
|
}
|
|
|
|
if (SplineUtility.Evaluate(setting.nativeSpline, t, out var position, out var normal, out var upVector))
|
|
{
|
|
var localRotation = quaternion.LookRotationSafe(normal, upVector);
|
|
|
|
localMatrix = math.mul(setting.splineWorldMatrix, float4x4.TRS(position, localRotation, new float3(1.0f)));
|
|
isValid = true;
|
|
}
|
|
else
|
|
{
|
|
localMatrix = float4x4.zero;
|
|
isValid = false;
|
|
}
|
|
}
|
|
}
|
|
} |