From 33604e198dbf0083e97d45705413447f580b3334 Mon Sep 17 00:00:00 2001 From: "SND\\eagleeyestudios_cp" <SND\eagleeyestudios_cp@7a4bfd9b-e295-4cbd-a51f-ab472bcf69b7> Date: Wed, 31 Oct 2012 21:11:25 +0000 Subject: [PATCH] Content Pipeline: - changed FontDescriptionProcessor test status to InProgress Framework: - Implemented missing Matrix methods and fixed some issues. A few UnitTests more pass now :) --- .../Processors/FontDescriptionProcessor.cs | 2 +- ANX.Framework/Matrix.cs | 170 +++++++++++++++--- 2 files changed, 149 insertions(+), 23 deletions(-) diff --git a/ANX.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/ANX.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index 0378f195..32a01d6a 100644 --- a/ANX.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/ANX.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -21,7 +21,7 @@ namespace ANX.Framework.Content.Pipeline.Processors { [PercentageComplete(90)] [Developer("SilentWarrior/Eagle Eye Studios")] - [TestState(TestStateAttribute.TestState.Untested)] //due to missing importer's font character enumeration + [TestState(TestStateAttribute.TestState.InProgress)] [ContentProcessor(DisplayName = "FontDescription Processor - ANX Framework")] public class FontDescriptionProcessor : ContentProcessor<FontDescription, SpriteFontContent> { diff --git a/ANX.Framework/Matrix.cs b/ANX.Framework/Matrix.cs index a3616350..81ffded1 100644 --- a/ANX.Framework/Matrix.cs +++ b/ANX.Framework/Matrix.cs @@ -521,11 +521,73 @@ namespace ANX.Framework public static void CreateConstrainedBillboard(ref Vector3 objectPosition, ref Vector3 cameraPosition, ref Vector3 rotateAxis, - Nullable<Vector3> cameraForwardVector, - Nullable<Vector3> objectForwardVector, + Vector3? cameraForwardVector, + Vector3? objectForwardVector, out Matrix result) { - throw new NotImplementedException(); + Vector3 vector; + vector.X = objectPosition.X - cameraPosition.X; + vector.Y = objectPosition.Y - cameraPosition.Y; + vector.Z = objectPosition.Z - cameraPosition.Z; + var num = vector.LengthSquared(); + if (num < 0.0001f) + { + vector = (cameraForwardVector.HasValue ? (-cameraForwardVector.Value) : Vector3.Forward); + } + else + { + Vector3.Multiply(ref vector, 1f / (float)Math.Sqrt(num), out vector); + } + var vector2 = rotateAxis; + float value; + Vector3.Dot(ref rotateAxis, ref vector, out value); + Vector3 vector3; + Vector3 vector4; + if (Math.Abs(value) > 0.998254657f) + { + if (objectForwardVector.HasValue) + { + vector3 = objectForwardVector.Value; + Vector3.Dot(ref rotateAxis, ref vector3, out value); + if (Math.Abs(value) > 0.998254657f) + { + value = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z; + vector3 = ((Math.Abs(value) > 0.998254657f) ? Vector3.Right : Vector3.Forward); + } + } + else + { + value = rotateAxis.X * Vector3.Forward.X + rotateAxis.Y * Vector3.Forward.Y + rotateAxis.Z * Vector3.Forward.Z; + vector3 = ((Math.Abs(value) > 0.998254657f) ? Vector3.Right : Vector3.Forward); + } + Vector3.Cross(ref rotateAxis, ref vector3, out vector4); + vector4.Normalize(); + Vector3.Cross(ref vector4, ref rotateAxis, out vector3); + vector3.Normalize(); + } + else + { + Vector3.Cross(ref rotateAxis, ref vector, out vector4); + vector4.Normalize(); + Vector3.Cross(ref vector4, ref vector2, out vector3); + vector3.Normalize(); + } + result.M11 = vector4.X; + result.M12 = vector4.Y; + result.M13 = vector4.Z; + result.M14 = 0f; + result.M21 = vector2.X; + result.M22 = vector2.Y; + result.M23 = vector2.Z; + result.M24 = 0f; + result.M31 = vector3.X; + result.M32 = vector3.Y; + result.M33 = vector3.Z; + result.M34 = 0f; + result.M41 = objectPosition.X; + result.M42 = objectPosition.Y; + result.M43 = objectPosition.Z; + result.M44 = 1f; } public static Matrix CreateFromAxisAngle(Vector3 axis, float angle) @@ -537,7 +599,33 @@ namespace ANX.Framework public static void CreateFromAxisAngle(ref Vector3 axis, float angle, out Matrix result) { - throw new NotImplementedException(); + var x = axis.X; + var y = axis.Y; + var z = axis.Z; + var num = (float)Math.Sin(angle); + var num2 = (float)Math.Cos(angle); + var num3 = x * x; + var num4 = y * y; + var num5 = z * z; + var num6 = x * y; + var num7 = x * z; + var num8 = y * z; + result.M11 = num3 + num2 * (1f - num3); + result.M12 = num6 - num2 * num6 + num * z; + result.M13 = num7 - num2 * num7 - num * y; + result.M14 = 0f; + result.M21 = num6 - num2 * num6 - num * z; + result.M22 = num4 + num2 * (1f - num4); + result.M23 = num8 - num2 * num8 + num * x; + result.M24 = 0f; + result.M31 = num7 - num2 * num7 + num * y; + result.M32 = num8 - num2 * num8 - num * x; + result.M33 = num5 + num2 * (1f - num5); + result.M34 = 0f; + result.M41 = 0f; + result.M42 = 0f; + result.M43 = 0f; + result.M44 = 1f; } public static Matrix CreateFromQuaternion(Quaternion quaternion) @@ -589,17 +677,9 @@ namespace ANX.Framework float roll, out Matrix result) { - Matrix yawRotation = Matrix.Identity; - Matrix pitchRotation = Matrix.Identity; - Matrix rollRotation = Matrix.Identity; - - Matrix.CreateRotationY(yaw, out yawRotation); - Matrix.CreateRotationX(pitch, out pitchRotation); - Matrix.CreateRotationZ(roll, out rollRotation); - - Matrix tmp = Matrix.identity; - Matrix.Multiply(ref yawRotation, ref pitchRotation, out tmp); - Matrix.Multiply(ref tmp, ref rollRotation, out result); + Quaternion quaternion; + Quaternion.CreateFromYawPitchRoll(yaw, pitch, roll, out quaternion); + CreateFromQuaternion(ref quaternion, out result); } public static Matrix CreateLookAt(Vector3 cameraPosition, @@ -678,18 +758,18 @@ namespace ANX.Framework float nPmfP = zNearPlane - zFarPlane; - result.M11 = width * 0.5f; + result.M11 = 2f / width; result.M12 = 0f; result.M13 = 0f; result.M14 = 0f; result.M21 = 0f; - result.M22 = height * 0.5f; + result.M22 = 2f / height; result.M23 = 0f; result.M24 = 0f; result.M31 = 0f; result.M32 = 0f; result.M33 = 1f / nPmfP; - result.M34 = -1f; + result.M34 = 0f; result.M41 = 0f; result.M42 = 0f; result.M43 = zNearPlane / nPmfP; @@ -720,12 +800,12 @@ namespace ANX.Framework float nPmfP = zNearPlane - zFarPlane; - result.M11 = (right - left) * 0.5f; + result.M11 = 2f / (right - left); result.M12 = 0f; result.M13 = 0f; result.M14 = 0f; result.M21 = 0f; - result.M22 = (top - bottom) * 0.5f; + result.M22 = 2f / (top - bottom); result.M23 = 0f; result.M24 = 0f; result.M31 = 0f; @@ -886,7 +966,31 @@ namespace ANX.Framework public static void CreateReflection(ref Plane value, out Matrix result) { - throw new NotImplementedException(); + Plane plane; + Plane.Normalize(ref value, out plane); + value.Normalize(); + var x = plane.Normal.X; + var y = plane.Normal.Y; + var z = plane.Normal.Z; + var num = -2f * x; + var num2 = -2f * y; + var num3 = -2f * z; + result.M11 = num * x + 1f; + result.M12 = num2 * x; + result.M13 = num3 * x; + result.M14 = 0f; + result.M21 = num * y; + result.M22 = num2 * y + 1f; + result.M23 = num3 * y; + result.M24 = 0f; + result.M31 = num * z; + result.M32 = num2 * z; + result.M33 = num3 * z + 1f; + result.M34 = 0f; + result.M41 = num * plane.D; + result.M42 = num2 * plane.D; + result.M43 = num3 * plane.D; + result.M44 = 1f; } public static Matrix CreateRotationX(float radians) @@ -995,7 +1099,29 @@ namespace ANX.Framework public static void CreateShadow(ref Vector3 lightDirection, ref Plane plane, out Matrix result) { - throw new NotImplementedException(); + Plane planeResult; + Plane.Normalize(ref plane, out planeResult); + var num = planeResult.Normal.X * lightDirection.X + planeResult.Normal.Y * lightDirection.Y + planeResult.Normal.Z * lightDirection.Z; + var num2 = -planeResult.Normal.X; + var num3 = -planeResult.Normal.Y; + var num4 = -planeResult.Normal.Z; + var num5 = -planeResult.D; + result.M11 = num2 * lightDirection.X + num; + result.M21 = num3 * lightDirection.X; + result.M31 = num4 * lightDirection.X; + result.M41 = num5 * lightDirection.X; + result.M12 = num2 * lightDirection.Y; + result.M22 = num3 * lightDirection.Y + num; + result.M32 = num4 * lightDirection.Y; + result.M42 = num5 * lightDirection.Y; + result.M13 = num2 * lightDirection.Z; + result.M23 = num3 * lightDirection.Z; + result.M33 = num4 * lightDirection.Z + num; + result.M43 = num5 * lightDirection.Z; + result.M14 = 0f; + result.M24 = 0f; + result.M34 = 0f; + result.M44 = num; } public static Matrix CreateTranslation(float xPosition, float yPosition, float zPosition)