From c60d9405dd9a31aba545ba337b1afd2e58ea85a4 Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Tue, 8 Nov 2011 14:02:04 +0000 Subject: [PATCH] implemented unpacking of HalfSingle --- ANX.Framework.TestCenter/AssertHelper.cs | 12 +++++++ .../Strukturen/PackedVector/HalfSingleTest.cs | 8 +++++ ANX.Framework/ANX.Framework.csproj | 2 ++ .../Graphics/PackedVector/HalfTypeHelper.cs | 31 +++++++++++++++++-- 4 files changed, 50 insertions(+), 3 deletions(-) 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)); } } }