104 lines
3.3 KiB
C#
104 lines
3.3 KiB
C#
// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
|
|
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
|
|
|
|
using System.Runtime.CompilerServices;
|
|
|
|
namespace math
|
|
{
|
|
/// <summary>
|
|
/// A bounding frustum.
|
|
/// </summary>
|
|
public struct BoundingFrustum
|
|
{
|
|
/// <summary>
|
|
/// The left plane of this frustum.
|
|
/// </summary>
|
|
public Plane LeftPlane;
|
|
|
|
/// <summary>
|
|
/// The right plane of this frustum.
|
|
/// </summary>
|
|
public Plane RightPlane;
|
|
|
|
/// <summary>
|
|
/// The top plane of this frustum.
|
|
/// </summary>
|
|
public Plane TopPlane;
|
|
|
|
/// <summary>
|
|
/// The bottom plane of this frustum.
|
|
/// </summary>
|
|
public Plane BottomPlane;
|
|
|
|
/// <summary>
|
|
/// The near plane of this frustum.
|
|
/// </summary>
|
|
public Plane NearPlane;
|
|
|
|
/// <summary>
|
|
/// The far plane of this frustum.
|
|
/// </summary>
|
|
public Plane FarPlane;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="BoundingFrustum"/> struct from a matrix view-projection.
|
|
/// </summary>
|
|
/// <param name="matrix">The matrix view projection.</param>
|
|
public BoundingFrustum( ref Matrix matrix )
|
|
{
|
|
// Left
|
|
LeftPlane = Plane.Normalize( new Plane(
|
|
matrix.M14 + matrix.M11,
|
|
matrix.M24 + matrix.M21,
|
|
matrix.M34 + matrix.M31,
|
|
matrix.M44 + matrix.M41 ) );
|
|
|
|
// Right
|
|
RightPlane = Plane.Normalize( new Plane(
|
|
matrix.M14 - matrix.M11,
|
|
matrix.M24 - matrix.M21,
|
|
matrix.M34 - matrix.M31,
|
|
matrix.M44 - matrix.M41 ) );
|
|
|
|
// Top
|
|
TopPlane = Plane.Normalize( new Plane(
|
|
matrix.M14 - matrix.M12,
|
|
matrix.M24 - matrix.M22,
|
|
matrix.M34 - matrix.M32,
|
|
matrix.M44 - matrix.M42 ) );
|
|
|
|
// Bottom
|
|
BottomPlane = Plane.Normalize( new Plane(
|
|
matrix.M14 + matrix.M12,
|
|
matrix.M24 + matrix.M22,
|
|
matrix.M34 + matrix.M32,
|
|
matrix.M44 + matrix.M42 ) );
|
|
|
|
// Near
|
|
NearPlane = Plane.Normalize( new Plane(
|
|
matrix.M13,
|
|
matrix.M23,
|
|
matrix.M33,
|
|
matrix.M43 ) );
|
|
|
|
// Far
|
|
FarPlane = Plane.Normalize( new Plane(
|
|
matrix.M14 - matrix.M13,
|
|
matrix.M24 - matrix.M23,
|
|
matrix.M34 - matrix.M33,
|
|
matrix.M44 - matrix.M43 ) );
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check whether this frustum contains the specified <see cref="BoundingBoxExt"/>.
|
|
/// </summary>
|
|
/// <param name="boundingBoxExt">The bounding box.</param>
|
|
/// <returns><c>true</c> if this frustum contains the specified bounding box.</returns>
|
|
[MethodImpl( MethodImplOptions.AggressiveInlining )]
|
|
public bool Contains( ref BoundingBoxExt boundingBoxExt )
|
|
{
|
|
return CollisionHelper.FrustumContainsBox( ref this, ref boundingBoxExt );
|
|
}
|
|
}
|
|
}
|