From 55228d6d3c70e8b7abae519eea0faa1a12286052 Mon Sep 17 00:00:00 2001 From: "SND\\xToast_cp" Date: Tue, 8 Nov 2011 18:09:18 +0000 Subject: [PATCH] Some more work on Boundingthings done. --- .../Strukturen/BoundingBoxTest.cs | 408 ++++++++++++- .../Strukturen/BoundingFrustumTest.cs | 50 +- .../Strukturen/BoundingSphereTest.cs | 57 ++ .../Strukturen/MatrixTest.cs | 10 +- ANX.Framework/BoundingFrustum.cs | 537 +++++++++++++++++- ANX.Framework/BoundingSphere.cs | 31 +- 6 files changed, 1060 insertions(+), 33 deletions(-) diff --git a/ANX.Framework.TestCenter/Strukturen/BoundingBoxTest.cs b/ANX.Framework.TestCenter/Strukturen/BoundingBoxTest.cs index c2ac3c7a..3f5e7bf7 100644 --- a/ANX.Framework.TestCenter/Strukturen/BoundingBoxTest.cs +++ b/ANX.Framework.TestCenter/Strukturen/BoundingBoxTest.cs @@ -131,6 +131,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("sixfloats")] public void constructor1(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xna = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); ANXBoundingBox anx = new ANXBoundingBox(new ANXVector3(xMin, yMin, zMin), new ANXVector3(xMax, yMax, zMax)); @@ -145,6 +164,44 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, float xMin2, float yMin2, float zMin2, float xMax2, float yMax2, float zMax2) { + if (xMin1 > xMax1) + { + float x = xMin1; + xMin1 = xMax1; + xMax1 = x; + } + if (yMin1 > yMax1) + { + float y = yMin1; + yMin1 = yMax1; + yMax1 = y; + } + if (zMin1 > zMax1) + { + float z = zMin1; + zMin1 = zMax1; + zMax1 = z; + } + + if (xMin2 > xMax2) + { + float x = xMin2; + xMin2 = xMax2; + xMax2 = x; + } + if (yMin2 > yMax2) + { + float y = yMin2; + yMin2 = yMax2; + yMax2 = y; + } + if (zMin2 > zMax2) + { + float z = zMin2; + zMin2 = zMax2; + zMax2 = z; + } + XNABoundingBox xnaBox1 = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); XNABoundingBox xnaBox2 = new XNABoundingBox(new XNAVector3(xMin2, yMin2, zMin2), new XNAVector3(xMax2, yMax2, zMax2)); @@ -165,6 +222,25 @@ namespace ANX.Framework.TestCenter.Strukturen float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44, float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.Matrix xnaMatrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMatrix); @@ -185,6 +261,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("tenfloats")] public void ContainsBoundingSphere(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float xS, float yS, float zS, float rS) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.BoundingSphere xnaSphere = new Microsoft.Xna.Framework.BoundingSphere(new XNAVector3(xS, yS, zS), rS); @@ -203,6 +298,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("ninefloats")] public void ContainsPoint(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float xP, float yP, float zP) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); XNAVector3 xnaPoint = new XNAVector3(xP, yP, zP); @@ -262,6 +376,44 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, float xMin2, float yMin2, float zMin2, float xMax2, float yMax2, float zMax2) { + if (xMin1 > xMax1) + { + float x = xMin1; + xMin1 = xMax1; + xMax1 = x; + } + if (yMin1 > yMax1) + { + float y = yMin1; + yMin1 = yMax1; + yMax1 = y; + } + if (zMin1 > zMax1) + { + float z = zMin1; + zMin1 = zMax1; + zMax1 = z; + } + + if (xMin2 > xMax2) + { + float x = xMin2; + xMin2 = xMax2; + xMax2 = x; + } + if (yMin2 > yMax2) + { + float y = yMin2; + yMin2 = yMax2; + yMax2 = y; + } + if (zMin2 > zMax2) + { + float z = zMin2; + zMin2 = zMax2; + zMax2 = z; + } + XNABoundingBox xnaBox1 = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); XNABoundingBox xnaBox2 = new XNABoundingBox(new XNAVector3(xMin2, yMin2, zMin2), new XNAVector3(xMax2, yMax2, zMax2)); @@ -277,6 +429,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("sixfloats")] public void GetCorners(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); ANXBoundingBox anxBox = new ANXBoundingBox(new ANXVector3(xMin, yMin, zMin), new ANXVector3(xMax, yMax, zMax)); @@ -318,6 +489,44 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, float xMin2, float yMin2, float zMin2, float xMax2, float yMax2, float zMax2) { + if (xMin1 > xMax1) + { + float x = xMin1; + xMin1 = xMax1; + xMax1 = x; + } + if (yMin1 > yMax1) + { + float y = yMin1; + yMin1 = yMax1; + yMax1 = y; + } + if (zMin1 > zMax1) + { + float z = zMin1; + zMin1 = zMax1; + zMax1 = z; + } + + if (xMin2 > xMax2) + { + float x = xMin2; + xMin2 = xMax2; + xMax2 = x; + } + if (yMin2 > yMax2) + { + float y = yMin2; + yMin2 = yMax2; + yMax2 = y; + } + if (zMin2 > zMax2) + { + float z = zMin2; + zMin2 = zMax2; + zMax2 = z; + } + XNABoundingBox xnaBox1 = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); XNABoundingBox xnaBox2 = new XNABoundingBox(new XNAVector3(xMin2, yMin2, zMin2), new XNAVector3(xMax2, yMax2, zMax2)); @@ -334,9 +543,29 @@ namespace ANX.Framework.TestCenter.Strukturen } [Test, TestCaseSource("twentytwofloats")] - public void IntersectsFrustum(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44, + public void IntersectsFrustum( + float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44, float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.Matrix xnaMtrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMtrix); @@ -357,6 +586,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("tenfloats")] public void IntersectsBoundingSphere(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float xS, float yS, float zS, float rS) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.BoundingSphere xnaSphere = new Microsoft.Xna.Framework.BoundingSphere(new XNAVector3(xS, yS, zS), rS); @@ -375,6 +623,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("tenfloats")] public void IntersectsPlane(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float xP, float yP, float zP, float dP) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.Plane xnaPlane = new Microsoft.Xna.Framework.Plane(xP, yP, zP, dP); @@ -392,13 +659,32 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("twelvefloats")] public void IntersectsRay( - float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, + float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float xRay, float yRay, float zRay, float xDir, float yDir, float zDir) { - XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); Microsoft.Xna.Framework.Ray xnaRay = new Microsoft.Xna.Framework.Ray(new XNAVector3(xRay, yRay, zRay), new XNAVector3(xDir, yDir, zDir)); - ANXBoundingBox anxBox = new ANXBoundingBox(new ANXVector3(xMin1, yMin1, zMin1), new ANXVector3(xMax1, yMax1, zMax1)); + ANXBoundingBox anxBox = new ANXBoundingBox(new ANXVector3(xMin, yMin, zMin), new ANXVector3(xMax, yMax, zMax)); ANX.Framework.Ray anxRay = new ANX.Framework.Ray(new ANXVector3(xRay, yRay, zRay), new ANXVector3(xDir, yDir, zDir)); float? xna = xnaBox.Intersects(xnaRay); @@ -415,6 +701,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("sixfloats")] public void Min(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); ANXBoundingBox anxBox = new ANXBoundingBox(new ANXVector3(xMin, yMin, zMin), new ANXVector3(xMax, yMax, zMax)); @@ -433,6 +738,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("sixfloats")] public void Max(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingBox xnaBox = new XNABoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); ANXBoundingBox anxBox = new ANXBoundingBox(new ANXVector3(xMin, yMin, zMin), new ANXVector3(xMax, yMax, zMax)); @@ -455,6 +779,44 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, float xMin2, float yMin2, float zMin2, float xMax2, float yMax2, float zMax2) { + if (xMin1 > xMax1) + { + float x = xMin1; + xMin1 = xMax1; + xMax1 = x; + } + if (yMin1 > yMax1) + { + float y = yMin1; + yMin1 = yMax1; + yMax1 = y; + } + if (zMin1 > zMax1) + { + float z = zMin1; + zMin1 = zMax1; + zMax1 = z; + } + + if (xMin2 > xMax2) + { + float x = xMin2; + xMin2 = xMax2; + xMax2 = x; + } + if (yMin2 > yMax2) + { + float y = yMin2; + yMin2 = yMax2; + yMax2 = y; + } + if (zMin2 > zMax2) + { + float z = zMin2; + zMin2 = zMax2; + zMax2 = z; + } + XNABoundingBox xnaBox1 = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); XNABoundingBox xnaBox2 = new XNABoundingBox(new XNAVector3(xMin2, yMin2, zMin2), new XNAVector3(xMax2, yMax2, zMax2)); @@ -475,6 +837,44 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin1, float yMin1, float zMin1, float xMax1, float yMax1, float zMax1, float xMin2, float yMin2, float zMin2, float xMax2, float yMax2, float zMax2) { + if (xMin1 > xMax1) + { + float x = xMin1; + xMin1 = xMax1; + xMax1 = x; + } + if (yMin1 > yMax1) + { + float y = yMin1; + yMin1 = yMax1; + yMax1 = y; + } + if (zMin1 > zMax1) + { + float z = zMin1; + zMin1 = zMax1; + zMax1 = z; + } + + if (xMin2 > xMax2) + { + float x = xMin2; + xMin2 = xMax2; + xMax2 = x; + } + if (yMin2 > yMax2) + { + float y = yMin2; + yMin2 = yMax2; + yMax2 = y; + } + if (zMin2 > zMax2) + { + float z = zMin2; + zMin2 = zMax2; + zMax2 = z; + } + XNABoundingBox xnaBox1 = new XNABoundingBox(new XNAVector3(xMin1, yMin1, zMin1), new XNAVector3(xMax1, yMax1, zMax1)); XNABoundingBox xnaBox2 = new XNABoundingBox(new XNAVector3(xMin2, yMin2, zMin2), new XNAVector3(xMax2, yMax2, zMax2)); diff --git a/ANX.Framework.TestCenter/Strukturen/BoundingFrustumTest.cs b/ANX.Framework.TestCenter/Strukturen/BoundingFrustumTest.cs index e78afb4e..3749e769 100644 --- a/ANX.Framework.TestCenter/Strukturen/BoundingFrustumTest.cs +++ b/ANX.Framework.TestCenter/Strukturen/BoundingFrustumTest.cs @@ -108,6 +108,25 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float nop0, float nop1, float nop2, float nop3, float nop4, float nop5, float nop6, float nop7, float nop8, float nop9) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + Microsoft.Xna.Framework.Matrix xnaMatrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMatrix); Microsoft.Xna.Framework.BoundingBox xnaBox = new Microsoft.Xna.Framework.BoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); @@ -119,7 +138,7 @@ namespace ANX.Framework.TestCenter.Strukturen Microsoft.Xna.Framework.ContainmentType containsXNA = xnaFrustum.Contains(xnaBox); ANX.Framework.ContainmentType containsANX = anxFrustum.Contains(anxBox); - if (containsXNA.Equals(containsANX)) + if ((int)containsXNA == (int)containsANX) Assert.Pass("ContainsBoundingBox passed"); else Assert.Fail(String.Format("ContainsBoundingBox failed: xna({0}) anx({1})", containsXNA.ToString(), containsANX.ToString())); @@ -143,7 +162,7 @@ namespace ANX.Framework.TestCenter.Strukturen Microsoft.Xna.Framework.ContainmentType containsXNA = xnaFrustum1.Contains(xnaFrustum2); ANX.Framework.ContainmentType containsANX = anxFrustum1.Contains(anxFrustum2); - if (containsXNA.Equals(containsANX)) + if ((int)containsXNA == (int)containsANX) Assert.Pass("ContainsBoundingFrustum passed"); else Assert.Fail(String.Format("ContainsBoundingFrustum failed: xna({0}) anx({1})", containsXNA.ToString(), containsANX.ToString())); @@ -155,6 +174,8 @@ namespace ANX.Framework.TestCenter.Strukturen float xS, float yS, float zS, float rS, float nop0, float nop1, float nop2, float nop3, float nop4, float nop5, float nop6, float nop7, float nop8, float nop9, float nop10, float nop11) { + rS = Math.Max(rS, -rS); + Microsoft.Xna.Framework.Matrix xnaMatrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMatrix); Microsoft.Xna.Framework.BoundingSphere xnaSphere = new Microsoft.Xna.Framework.BoundingSphere(new XNAVector3(xS, yS, zS), rS); @@ -166,7 +187,7 @@ namespace ANX.Framework.TestCenter.Strukturen Microsoft.Xna.Framework.ContainmentType containsXNA = xnaFrustum.Contains(xnaSphere); ANX.Framework.ContainmentType containsANX = anxFrustum.Contains(anxSphere); - if (containsXNA.Equals(containsANX)) + if ((int)containsXNA == (int)containsANX) Assert.Pass("ContainsBoundingSphere passed"); else Assert.Fail(String.Format("ContainsBoundingSphere failed: xna({0}) anx({1})", containsXNA.ToString(), containsANX.ToString())); @@ -189,7 +210,7 @@ namespace ANX.Framework.TestCenter.Strukturen Microsoft.Xna.Framework.ContainmentType containsXNA = xnaFrustum.Contains(xnaPoint); ANX.Framework.ContainmentType containsANX = anxFrustum.Contains(anxPoint); - if (containsXNA.Equals(containsANX)) + if ((int)containsXNA == (int)containsANX) Assert.Pass("ContainsPoint passed"); else Assert.Fail(String.Format("ContainsPoint failed: xna({0}) anx({1})", containsXNA.ToString(), containsANX.ToString())); @@ -244,6 +265,25 @@ namespace ANX.Framework.TestCenter.Strukturen float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float nop0, float nop1, float nop2, float nop3, float nop4, float nop5, float nop6, float nop7, float nop8, float nop9) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + Microsoft.Xna.Framework.Matrix xnaMatrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMatrix); Microsoft.Xna.Framework.BoundingBox xnaBox = new Microsoft.Xna.Framework.BoundingBox(new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); @@ -291,6 +331,8 @@ namespace ANX.Framework.TestCenter.Strukturen float xS, float yS, float zS, float rS, float nop0, float nop1, float nop2, float nop3, float nop4, float nop5, float nop6, float nop7, float nop8, float nop9, float nop10, float nop11) { + rS = Math.Max(rS, -rS); + Microsoft.Xna.Framework.Matrix xnaMatrix = new Microsoft.Xna.Framework.Matrix(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); Microsoft.Xna.Framework.BoundingFrustum xnaFrustum = new Microsoft.Xna.Framework.BoundingFrustum(xnaMatrix); Microsoft.Xna.Framework.BoundingSphere xnaSphere = new Microsoft.Xna.Framework.BoundingSphere(new XNAVector3(xS, yS, zS), rS); diff --git a/ANX.Framework.TestCenter/Strukturen/BoundingSphereTest.cs b/ANX.Framework.TestCenter/Strukturen/BoundingSphereTest.cs index 13227128..3507b9d0 100644 --- a/ANX.Framework.TestCenter/Strukturen/BoundingSphereTest.cs +++ b/ANX.Framework.TestCenter/Strukturen/BoundingSphereTest.cs @@ -134,6 +134,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("tenfloats")] public void ContainsBoundingBox(float xS, float yS, float zS, float rS, float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingSphere xnaSphere = new XNABoundingSphere(new XNAVector3(xS, yS, zS), rS); Microsoft.Xna.Framework.BoundingBox xnaBox = new Microsoft.Xna.Framework.BoundingBox( new XNAVector3(xMin, yMin, zMin), @@ -214,6 +233,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("eightfloats")] public void CreateFromBoundingBox(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, float a, float b) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + Microsoft.Xna.Framework.BoundingBox xnaBox = new Microsoft.Xna.Framework.BoundingBox( new XNAVector3(xMin, yMin, zMin), new XNAVector3(xMax, yMax, zMax)); @@ -288,6 +326,25 @@ namespace ANX.Framework.TestCenter.Strukturen [Test, TestCaseSource("tenfloats")] public void IntersectsBoundingBox(float xS, float yS, float zS, float rS, float xMin, float yMin, float zMin, float xMax, float yMax, float zMax) { + if (xMin > xMax) + { + float x = xMin; + xMin = xMax; + xMax = x; + } + if (yMin > yMax) + { + float y = yMin; + yMin = yMax; + yMax = y; + } + if (zMin > zMax) + { + float z = zMin; + zMin = zMax; + zMax = z; + } + XNABoundingSphere xnaSphere = new XNABoundingSphere(new XNAVector3(xS, yS, zS), rS); Microsoft.Xna.Framework.BoundingBox xnaBox = new Microsoft.Xna.Framework.BoundingBox( new XNAVector3(xMin, yMin, zMin), diff --git a/ANX.Framework.TestCenter/Strukturen/MatrixTest.cs b/ANX.Framework.TestCenter/Strukturen/MatrixTest.cs index 4d5dbfe5..60e0af9e 100644 --- a/ANX.Framework.TestCenter/Strukturen/MatrixTest.cs +++ b/ANX.Framework.TestCenter/Strukturen/MatrixTest.cs @@ -96,11 +96,11 @@ namespace ANX.Framework.TestCenter.Strukturen #region Testdata static object[] sixteenfloats = { - new object[] { DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat }, - new object[] { DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat }, - new object[] { DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat }, - new object[] { DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat }, - new object[] { DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat , DataFactory.RandomFloat }, + new object[] { DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat }, + new object[] { DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat }, + new object[] { DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat }, + new object[] { DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat }, + new object[] { DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat, DataFactory.RandomFloat }, }; #endregion diff --git a/ANX.Framework/BoundingFrustum.cs b/ANX.Framework/BoundingFrustum.cs index 15b19595..304e4d0c 100644 --- a/ANX.Framework/BoundingFrustum.cs +++ b/ANX.Framework/BoundingFrustum.cs @@ -105,37 +105,343 @@ namespace ANX.Framework #region public methods public ContainmentType Contains(BoundingBox box) { - throw new Exception("method has not yet been implemented"); + ContainmentType result; + Contains(ref box, out result); + return result; } public void Contains(ref BoundingBox box, out ContainmentType result) { - throw new Exception("method has not yet been implemented"); + Vector3[] boxCorners = box.GetCorners(); + + result = ContainmentType.Contains; + + Plane plane = Bottom; + Vector3 normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + float planeDistance = plane.D; + + Vector3 pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + float tempDistP; + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + float distanceP = tempDistP - planeDistance; + + Vector3 nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + float tempDistN; + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + float distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } + + plane = Top; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + planeDistance = plane.D; + + pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + distanceP = tempDistP - planeDistance; + + nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } + + plane = Left; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + planeDistance = plane.D; + + pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + distanceP = tempDistP - planeDistance; + + nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } + + plane = Right; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + planeDistance = plane.D; + + pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + distanceP = tempDistP - planeDistance; + + nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } + + plane = Near; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + planeDistance = plane.D; + + pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + distanceP = tempDistP - planeDistance; + + nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } + + plane = Far; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + planeDistance = plane.D; + + pVertex = box.Min; + if (normal.X >= 0) + pVertex.X = box.Max.X; + if (normal.Y >= 0) + pVertex.Y = box.Max.Y; + if (normal.Z < 0) + pVertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistP); + distanceP = tempDistP - planeDistance; + + nVertex = box.Max; + if (normal.X >= 0) + nVertex.X = box.Min.X; + if (normal.Y >= 0) + nVertex.Y = box.Min.Y; + if (normal.Z < 0) + nVertex.Z = box.Min.Z; + + Vector3.Dot(ref normal, ref pVertex, out tempDistN); + distanceN = tempDistN - planeDistance; + + if (distanceN < 0 && distanceP < 0) + { + result = ContainmentType.Disjoint; + return; + } + else if (distanceN < 0 || distanceP < 0) + { + result = ContainmentType.Intersects; + return; + } } public ContainmentType Contains(BoundingFrustum frustum) { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } public ContainmentType Contains(BoundingSphere sphere) { - throw new Exception("method has not yet been implemented"); + ContainmentType result; + Contains(ref sphere, out result); + return result; } public void Contains(ref BoundingSphere sphere, out ContainmentType result) { - throw new Exception("method has not yet been implemented"); + Vector3 center = sphere.Center; + + result = ContainmentType.Contains; + + float distance = Bottom.Normal.X * center.X + Bottom.Normal.Y * center.Y + Bottom.Normal.Z * center.Z + Bottom.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } + + distance = Top.Normal.X * center.X + Top.Normal.Y * center.Y + Top.Normal.Z * center.Z + Top.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } + + distance = Left.Normal.X * center.X + Left.Normal.Y * center.Y + Left.Normal.Z * center.Z + Left.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } + + distance = Right.Normal.X * center.X + Right.Normal.Y * center.Y + Right.Normal.Z * center.Z + Right.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } + + distance = Near.Normal.X * center.X + Near.Normal.Y * center.Y + Near.Normal.Z * center.Z + Near.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } + + distance = Far.Normal.X * center.X + Far.Normal.Y * center.Y + Far.Normal.Z * center.Z + Far.D; + if (distance > sphere.Radius) + { + result = ContainmentType.Disjoint; + return; + } + else if (distance > -sphere.Radius) + { + result = ContainmentType.Intersects; + } } public ContainmentType Contains(Vector3 point) { - throw new Exception("method has not yet been implemented"); + ContainmentType result; + Contains(ref point, out result); + return result; } public void Contains(ref Vector3 point, out ContainmentType result) { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } public Vector3[] GetCorners() @@ -150,57 +456,250 @@ namespace ANX.Framework public override int GetHashCode() { - //TODO: implement - return base.GetHashCode(); + throw new NotImplementedException(); } public bool Intersects(BoundingBox box) { - throw new Exception("method has not yet been implemented"); + bool result; + Intersects(ref box, out result); + return result; } public void Intersects(ref BoundingBox box, out bool result) { - throw new Exception("method has not yet been implemented"); + Vector3[] boxCorners = box.GetCorners(); + + result = true; + + Plane plane = Bottom; + Vector3 normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + float planeDistance = plane.D; + Vector3 vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + float tempDist; + Vector3.Dot(ref normal, ref vertex, out tempDist); + float distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } + + plane = Top; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + planeDistance = plane.D; + vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref vertex, out tempDist); + distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } + + plane = Left; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + planeDistance = plane.D; + vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref vertex, out tempDist); + distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } + + plane = Right; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + planeDistance = plane.D; + vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref vertex, out tempDist); + distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } + + plane = Near; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + planeDistance = plane.D; + vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref vertex, out tempDist); + distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } + + plane = Far; + normal = plane.Normal; + //Vector3.Negate(ref normal, out normal); + + planeDistance = plane.D; + vertex = box.Min; + + if (normal.X >= 0) + vertex.X = box.Max.X; + if (normal.Y >= 0) + vertex.Y = box.Max.Y; + if (normal.Z < 0) + vertex.Z = box.Max.Z; + + Vector3.Dot(ref normal, ref vertex, out tempDist); + distance = tempDist - planeDistance; + + if (distance < 0) + { + result = false; + return; + } } public bool Intersects(BoundingFrustum frustum) { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } public bool Intersects(BoundingSphere sphere) { - throw new Exception("method has not yet been implemented"); + bool result; + Intersects(ref sphere, out result); + return result; } + public void Intersects(ref BoundingSphere sphere, out bool result) { - throw new Exception("method has not yet been implemented"); + Vector3 center = sphere.Center; + + result = true; + + float distance = Bottom.Normal.X * center.X + Bottom.Normal.Y * center.Y + Bottom.Normal.Z * center.Z + Bottom.D; + if (distance > sphere.Radius) + { + result = false; + return; + } + + distance = Top.Normal.X * center.X + Top.Normal.Y * center.Y + Top.Normal.Z * center.Z + Top.D; + if (distance > sphere.Radius) + { + result = false; + return; + } + + distance = Left.Normal.X * center.X + Left.Normal.Y * center.Y + Left.Normal.Z * center.Z + Left.D; + if (distance > sphere.Radius) + { + result = false; + return; + } + + distance = Right.Normal.X * center.X + Right.Normal.Y * center.Y + Right.Normal.Z * center.Z + Right.D; + if (distance > sphere.Radius) + { + result = false; + return; + } + + distance = Near.Normal.X * center.X + Near.Normal.Y * center.Y + Near.Normal.Z * center.Z + Near.D; + if (distance > sphere.Radius) + { + result = false; + return; + } + + distance = Far.Normal.X * center.X + Far.Normal.Y * center.Y + Far.Normal.Z * center.Z + Far.D; + if (distance > sphere.Radius) + { + result = false; + return; + } } public PlaneIntersectionType Intersects(Plane plane) { - throw new Exception("method has not yet been implemented"); + PlaneIntersectionType result; + Intersects(ref plane, out result); + return result; } public void Intersects(ref Plane plane, out PlaneIntersectionType result) { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } public Nullable Intersects(Ray ray) { - throw new Exception("method has not yet been implemented"); + Nullable result; + Intersects(ref ray, out result); + return result; } public void Intersects(ref Ray ray, out Nullable result) { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } public override string ToString() { - throw new Exception("method has not yet been implemented"); + throw new NotImplementedException(); } #endregion diff --git a/ANX.Framework/BoundingSphere.cs b/ANX.Framework/BoundingSphere.cs index 47b20e4a..e7ec055d 100644 --- a/ANX.Framework/BoundingSphere.cs +++ b/ANX.Framework/BoundingSphere.cs @@ -229,7 +229,36 @@ namespace ANX.Framework public static void CreateMerged(ref BoundingSphere original, ref BoundingSphere additional, out BoundingSphere result) { - throw new NotImplementedException(); + float distance = Vector3.Distance(original.Center, additional.Center); + if (distance + additional.Radius < original.Radius) + { + result = original; + return; + } + + distance = Vector3.Distance(additional.Center, original.Center); + if (distance + original.Radius < additional.Radius) + { + result = additional; + return; + } + + Vector3 difference = Vector3.Subtract(additional.Center, original.Center); + difference.Normalize(); + + Vector3 additionalNew = additional.Center; + additionalNew.X += additional.Radius * difference.X; + additionalNew.Y += additional.Radius * difference.Y; + additionalNew.Z += additional.Radius * difference.Z; + + Vector3 originalNew = original.Center; + originalNew.X -= original.Radius * difference.X; + originalNew.Y -= original.Radius * difference.Y; + originalNew.Z -= original.Radius * difference.Z; + + difference = Vector3.Subtract(additionalNew, originalNew) / 2; + + result = new BoundingSphere(difference, difference.Length()); } public override int GetHashCode()