Some more work on Boundingthings done.

This commit is contained in:
SND\xToast_cp 2011-11-08 18:09:18 +00:00
parent c4eba424a8
commit 55228d6d3c
6 changed files with 1060 additions and 33 deletions

View File

@ -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));

View File

@ -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);

View File

@ -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),

View File

@ -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

View File

@ -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<float> Intersects(Ray ray)
{
throw new Exception("method has not yet been implemented");
Nullable<float> result;
Intersects(ref ray, out result);
return result;
}
public void Intersects(ref Ray ray, out Nullable<float> 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

View File

@ -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()