diff --git a/ANX.Framework.TestCenter/AssertHelper.cs b/ANX.Framework.TestCenter/AssertHelper.cs
index 181457ef..cfb007ac 100644
--- a/ANX.Framework.TestCenter/AssertHelper.cs
+++ b/ANX.Framework.TestCenter/AssertHelper.cs
@@ -160,6 +160,18 @@ namespace ANX.Framework.TestCenter
}
}
+ public static void ConvertEquals(float a, float b, String test)
+ {
+ if (a.Equals(b))
+ {
+ Assert.Pass(test + " passed");
+ }
+ else
+ {
+ Assert.Fail(String.Format("{0} failed: float a: ({1}) float b: ({2})", test, a, b));
+ }
+ }
+
public static void ConvertEquals(byte a, byte b, String test)
{
if (a == b)
diff --git a/ANX.Framework.TestCenter/Strukturen/PackedVector/HalfSingleTest.cs b/ANX.Framework.TestCenter/Strukturen/PackedVector/HalfSingleTest.cs
index b48efa71..3545a666 100644
--- a/ANX.Framework.TestCenter/Strukturen/PackedVector/HalfSingleTest.cs
+++ b/ANX.Framework.TestCenter/Strukturen/PackedVector/HalfSingleTest.cs
@@ -88,5 +88,13 @@ namespace ANX.Framework.TestCenter.Strukturen.PackedVector
AssertHelper.ConvertEquals(xnaVal, anxVal, "Constructor1");
}
+ [Test, TestCaseSource("floats")]
+ public void unpack1(float single)
+ {
+ XNAHalfSingle xnaVal = new XNAHalfSingle(single);
+ ANXHalfSingle anxVal = new ANXHalfSingle(single);
+
+ AssertHelper.ConvertEquals(xnaVal.ToSingle(), anxVal.ToSingle(), "unpack1");
+ }
}
}
diff --git a/ANX.Framework/ANX.Framework.csproj b/ANX.Framework/ANX.Framework.csproj
index 75be7361..56072a4e 100644
--- a/ANX.Framework/ANX.Framework.csproj
+++ b/ANX.Framework/ANX.Framework.csproj
@@ -24,6 +24,7 @@
prompt
4
x86
+ true
pdbonly
@@ -32,6 +33,7 @@
TRACE
prompt
4
+ true
diff --git a/ANX.Framework/Graphics/PackedVector/HalfTypeHelper.cs b/ANX.Framework/Graphics/PackedVector/HalfTypeHelper.cs
index c2809ed1..d1153376 100644
--- a/ANX.Framework/Graphics/PackedVector/HalfTypeHelper.cs
+++ b/ANX.Framework/Graphics/PackedVector/HalfTypeHelper.cs
@@ -125,10 +125,35 @@ namespace ANX.Framework.Graphics.PackedVector
}
}
- internal static float convert(UInt16 value)
+ internal static unsafe float convert(ushort value)
{
- //TODO: implement
- throw new NotImplementedException();
+ uint rst;
+ uint mantissa = (uint)(value & 1023);
+ uint exp = 0xfffffff2;
+
+ if ((value & -33792) == 0)
+ {
+ if (mantissa != 0)
+ {
+ while ((mantissa & 1024) == 0)
+ {
+ exp--;
+ mantissa = mantissa << 1;
+ }
+ mantissa &= 0xfffffbff;
+ rst = ((uint)(((value & 0x8000) << 16) | ((exp + 127) << 23))) | (mantissa << 13);
+ }
+ else
+ {
+ rst = (uint)((value & 0x8000) << 16);
+ }
+ }
+ else
+ {
+ rst = (uint)((((value & 0x8000) << 16) | (((((value >> 10) & 0x1f) - 15) + 127) << 23)) | (mantissa << 13));
+ }
+
+ return *(((float*)&rst));
}
}
}