r2mods/ilspy_dump/ror2_csproj/RoR2/PackedUnitVector3.cs

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;
}
}