106 lines
1.9 KiB
C#
106 lines
1.9 KiB
C#
|
using System;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace RoR2;
|
||
|
|
||
|
[Serializable]
|
||
|
public struct PackedUnitVector3
|
||
|
{
|
||
|
[SerializeField]
|
||
|
public ushort value;
|
||
|
|
||
|
private static readonly float[] uvAdjustment;
|
||
|
|
||
|
private const ushort signMask = 57344;
|
||
|
|
||
|
private const ushort invSignMask = 8191;
|
||
|
|
||
|
private const ushort xSignMask = 32768;
|
||
|
|
||
|
private const ushort ySignMask = 16384;
|
||
|
|
||
|
private const ushort zSignMask = 8192;
|
||
|
|
||
|
private const ushort topMask = 8064;
|
||
|
|
||
|
private const ushort bottomMask = 127;
|
||
|
|
||
|
static PackedUnitVector3()
|
||
|
{
|
||
|
uvAdjustment = new float[8192];
|
||
|
for (int i = 0; i < uvAdjustment.Length; i++)
|
||
|
{
|
||
|
int num = i >> 7;
|
||
|
int num2 = i & 0x7F;
|
||
|
if (num + num2 >= 127)
|
||
|
{
|
||
|
num = 127 - num;
|
||
|
num2 = 127 - num2;
|
||
|
}
|
||
|
Vector3 vector = new Vector3(num, num2, 126 - num - num2);
|
||
|
uvAdjustment[i] = 1f / vector.magnitude;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public PackedUnitVector3(ushort value)
|
||
|
{
|
||
|
this.value = value;
|
||
|
}
|
||
|
|
||
|
public PackedUnitVector3(Vector3 src)
|
||
|
{
|
||
|
value = 0;
|
||
|
if (src.x < 0f)
|
||
|
{
|
||
|
value |= 32768;
|
||
|
src.x = 0f - src.x;
|
||
|
}
|
||
|
if (src.y < 0f)
|
||
|
{
|
||
|
value |= 16384;
|
||
|
src.y = 0f - src.y;
|
||
|
}
|
||
|
if (src.z < 0f)
|
||
|
{
|
||
|
value |= 8192;
|
||
|
src.z = 0f - src.z;
|
||
|
}
|
||
|
float num = 126f / (src.x + src.y + src.z);
|
||
|
int num2 = (int)(src.x * num);
|
||
|
int num3 = (int)(src.y * num);
|
||
|
if (num2 >= 64)
|
||
|
{
|
||
|
num2 = 127 - num2;
|
||
|
num3 = 127 - num3;
|
||
|
}
|
||
|
value |= (ushort)(num2 << 7);
|
||
|
value |= (ushort)num3;
|
||
|
}
|
||
|
|
||
|
public Vector3 Unpack()
|
||
|
{
|
||
|
int num = (value & 0x1F80) >> 7;
|
||
|
int num2 = value & 0x7F;
|
||
|
if (num + num2 >= 127)
|
||
|
{
|
||
|
num = 127 - num;
|
||
|
num2 = 127 - num2;
|
||
|
}
|
||
|
float num3 = uvAdjustment[value & 0x1FFF];
|
||
|
Vector3 result = new Vector3(num3 * (float)num, num3 * (float)num2, num3 * (float)(126 - num - num2));
|
||
|
if ((value & 0x8000u) != 0)
|
||
|
{
|
||
|
result.x = 0f - result.x;
|
||
|
}
|
||
|
if ((value & 0x4000u) != 0)
|
||
|
{
|
||
|
result.y = 0f - result.y;
|
||
|
}
|
||
|
if ((value & 0x2000u) != 0)
|
||
|
{
|
||
|
result.z = 0f - result.z;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
}
|