mirror of
https://github.com/Memorix101/UnityXNA/
synced 2024-12-30 15:25:35 +01:00
214 lines
6.5 KiB
C#
214 lines
6.5 KiB
C#
|
#region License
|
|||
|
/*
|
|||
|
MIT License
|
|||
|
Copyright © 2006 The Mono.Xna Team
|
|||
|
|
|||
|
All rights reserved.
|
|||
|
|
|||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
of this software and associated documentation files (the "Software"), to deal
|
|||
|
in the Software without restriction, including without limitation the rights
|
|||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|||
|
copies of the Software, and to permit persons to whom the Software is
|
|||
|
furnished to do so, subject to the following conditions:
|
|||
|
|
|||
|
The above copyright notice and this permission notice shall be included in all
|
|||
|
copies or substantial portions of the Software.
|
|||
|
|
|||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||
|
SOFTWARE.
|
|||
|
*/
|
|||
|
#endregion License
|
|||
|
|
|||
|
using System;
|
|||
|
using System.ComponentModel;
|
|||
|
//using Microsoft.Xna.Framework.Design;
|
|||
|
namespace Microsoft.Xna.Framework
|
|||
|
{
|
|||
|
|
|||
|
[Serializable]
|
|||
|
//[TypeConverter(typeof(PlaneConverter))]
|
|||
|
public struct Plane : IEquatable<Plane>
|
|||
|
{
|
|||
|
#region Public Fields
|
|||
|
|
|||
|
public float D;
|
|||
|
public Vector3 Normal;
|
|||
|
|
|||
|
#endregion Public Fields
|
|||
|
|
|||
|
|
|||
|
#region Constructors
|
|||
|
|
|||
|
public Plane(Vector4 value)
|
|||
|
: this(new Vector3(value.X, value.Y, value.Z), value.W)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public Plane(Vector3 normal, float d)
|
|||
|
{
|
|||
|
Normal = normal;
|
|||
|
D = d;
|
|||
|
}
|
|||
|
|
|||
|
public Plane(Vector3 a, Vector3 b, Vector3 c)
|
|||
|
{
|
|||
|
Vector3 ab = b - a;
|
|||
|
Vector3 ac = c - a;
|
|||
|
|
|||
|
Vector3 cross = Vector3.Cross(ab, ac);
|
|||
|
Normal = Vector3.Normalize(cross);
|
|||
|
D = -(Vector3.Dot(cross, a));
|
|||
|
}
|
|||
|
|
|||
|
public Plane(float a, float b, float c, float d)
|
|||
|
: this(new Vector3(a, b, c), d)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endregion Constructors
|
|||
|
|
|||
|
|
|||
|
#region Public Methods
|
|||
|
|
|||
|
public float Dot(Vector4 value)
|
|||
|
{
|
|||
|
return ((((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z)) + (this.D * value.W));
|
|||
|
}
|
|||
|
|
|||
|
public void Dot(ref Vector4 value, out float result)
|
|||
|
{
|
|||
|
result = (((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z)) + (this.D * value.W);
|
|||
|
}
|
|||
|
|
|||
|
public float DotCoordinate(Vector3 value)
|
|||
|
{
|
|||
|
return ((((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z)) + this.D);
|
|||
|
}
|
|||
|
|
|||
|
public void DotCoordinate(ref Vector3 value, out float result)
|
|||
|
{
|
|||
|
result = (((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z)) + this.D;
|
|||
|
}
|
|||
|
|
|||
|
public float DotNormal(Vector3 value)
|
|||
|
{
|
|||
|
return (((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z));
|
|||
|
}
|
|||
|
|
|||
|
public void DotNormal(ref Vector3 value, out float result)
|
|||
|
{
|
|||
|
result = ((this.Normal.X * value.X) + (this.Normal.Y * value.Y)) + (this.Normal.Z * value.Z);
|
|||
|
}
|
|||
|
|
|||
|
public static void Transform(ref Plane plane, ref Quaternion rotation, out Plane result)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public static void Transform(ref Plane plane, ref Matrix matrix, out Plane result)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public static Plane Transform(Plane plane, Quaternion rotation)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public static Plane Transform(Plane plane, Matrix matrix)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public void Normalize()
|
|||
|
{
|
|||
|
float factor;
|
|||
|
Vector3 normal = Normal;
|
|||
|
Normal = Vector3.Normalize(Normal);
|
|||
|
factor = (float)Math.Sqrt(Normal.X * Normal.X + Normal.Y * Normal.Y + Normal.Z * Normal.Z) /
|
|||
|
(float)Math.Sqrt(normal.X * normal.X + normal.Y * normal.Y + normal.Z * normal.Z);
|
|||
|
D = D * factor;
|
|||
|
}
|
|||
|
|
|||
|
public static Plane Normalize(Plane value)
|
|||
|
{
|
|||
|
Plane ret;
|
|||
|
Normalize(ref value, out ret);
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
public static void Normalize(ref Plane value, out Plane result)
|
|||
|
{
|
|||
|
float factor;
|
|||
|
result.Normal = Vector3.Normalize(value.Normal);
|
|||
|
factor = (float)Math.Sqrt(result.Normal.X * result.Normal.X + result.Normal.Y * result.Normal.Y + result.Normal.Z * result.Normal.Z) /
|
|||
|
(float)Math.Sqrt(value.Normal.X * value.Normal.X + value.Normal.Y * value.Normal.Y + value.Normal.Z * value.Normal.Z);
|
|||
|
result.D = value.D * factor;
|
|||
|
}
|
|||
|
|
|||
|
public static bool operator !=(Plane plane1, Plane plane2)
|
|||
|
{
|
|||
|
return !plane1.Equals(plane2);
|
|||
|
}
|
|||
|
|
|||
|
public static bool operator ==(Plane plane1, Plane plane2)
|
|||
|
{
|
|||
|
return plane1.Equals(plane2);
|
|||
|
}
|
|||
|
|
|||
|
public override bool Equals(object other)
|
|||
|
{
|
|||
|
return (other is Plane) ? this.Equals((Plane)other) : false;
|
|||
|
}
|
|||
|
|
|||
|
public bool Equals(Plane other)
|
|||
|
{
|
|||
|
return ((Normal == other.Normal) && (D == other.D));
|
|||
|
}
|
|||
|
|
|||
|
public override int GetHashCode()
|
|||
|
{
|
|||
|
return Normal.GetHashCode() ^ D.GetHashCode();
|
|||
|
}
|
|||
|
|
|||
|
//public PlaneIntersectionType Intersects(BoundingBox box)
|
|||
|
//{
|
|||
|
// return box.Intersects(this);
|
|||
|
//}
|
|||
|
|
|||
|
//public void Intersects(ref BoundingBox box, out PlaneIntersectionType result)
|
|||
|
//{
|
|||
|
// result = Intersects(box);
|
|||
|
//}
|
|||
|
|
|||
|
//public PlaneIntersectionType Intersects(BoundingFrustum frustum)
|
|||
|
//{
|
|||
|
// return frustum.Intersects(this);
|
|||
|
//}
|
|||
|
|
|||
|
//public PlaneIntersectionType Intersects(BoundingSphere sphere)
|
|||
|
//{
|
|||
|
// return sphere.Intersects(this);
|
|||
|
//}
|
|||
|
|
|||
|
//public void Intersects(ref BoundingSphere sphere, out PlaneIntersectionType result)
|
|||
|
//{
|
|||
|
// result = Intersects(sphere);
|
|||
|
//}
|
|||
|
|
|||
|
public override string ToString()
|
|||
|
{
|
|||
|
return string.Format("{{Normal:{0} D:{1}}}", Normal, D);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|