Files
HauntedBloodlines/Assets/Obi/Scripts/Common/Backends/Burst/DataStructures/BurstAffineTransform.cs
2025-05-29 22:31:40 +03:00

88 lines
3.0 KiB
C#

#if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS)
using UnityEngine;
using Unity.Mathematics;
using System.Collections;
namespace Obi
{
public struct BurstAffineTransform
{
public float4 translation;
public float4 scale;
public quaternion rotation;
public BurstAffineTransform(float4 translation, quaternion rotation, float4 scale)
{
// make sure there are good values in the 4th component:
translation[3] = 0;
scale[3] = 1;
this.translation = translation;
this.rotation = rotation;
this.scale = scale;
}
public static BurstAffineTransform operator *(BurstAffineTransform a, BurstAffineTransform b)
{
return new BurstAffineTransform(a.TransformPoint(b.translation),
math.mul(a.rotation,b.rotation),
a.scale * b.scale);
}
public BurstAffineTransform Inverse()
{
return new BurstAffineTransform(new float4(math.rotate(math.conjugate(rotation),(translation / -scale).xyz),0),
math.conjugate(rotation),
1 / scale);
}
public BurstAffineTransform Interpolate(BurstAffineTransform other, float translationalMu, float rotationalMu, float scaleMu)
{
return new BurstAffineTransform(math.lerp(translation, other.translation, translationalMu),
math.slerp(rotation, other.rotation, rotationalMu),
math.lerp(scale, other.scale, scaleMu));
}
public float4 TransformPoint(float4 point)
{
return new float4(translation.xyz + math.rotate(rotation, (point * scale).xyz),0);
}
public float4 InverseTransformPoint(float4 point)
{
return new float4(math.rotate(math.conjugate(rotation),(point - translation).xyz) / scale.xyz , 0);
}
public float4 TransformPointUnscaled(float4 point)
{
return new float4(translation.xyz + math.rotate(rotation,point.xyz), 0);
}
public float4 InverseTransformPointUnscaled(float4 point)
{
return new float4(math.rotate(math.conjugate(rotation), (point - translation).xyz), 0);
}
public float4 TransformDirection(float4 direction)
{
return new float4(math.rotate(rotation, direction.xyz), 0);
}
public float4 InverseTransformDirection(float4 direction)
{
return new float4(math.rotate(math.conjugate(rotation), direction.xyz), 0);
}
public float4 TransformVector(float4 vector)
{
return new float4(math.rotate(rotation, (vector * scale).xyz), 0);
}
public float4 InverseTransformVector(float4 vector)
{
return new float4(math.rotate(math.conjugate(rotation),vector.xyz) / scale.xyz, 0);
}
}
}
#endif