aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h')
-rw-r--r--Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h339
1 files changed, 339 insertions, 0 deletions
diff --git a/Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h b/Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h
new file mode 100644
index 00000000..d411432a
--- /dev/null
+++ b/Minecraft.Client/PS3/PS3Extras/DirectX/DirectXCollision.h
@@ -0,0 +1,339 @@
+//-------------------------------------------------------------------------------------
+// DirectXCollision.h -- C++ Collision Math library
+//
+// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
+// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+// PARTICULAR PURPOSE.
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//-------------------------------------------------------------------------------------
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include "DirectXMath.h"
+
+namespace DirectX
+{
+
+enum ContainmentType
+{
+ DISJOINT = 0,
+ INTERSECTS = 1,
+ CONTAINS = 2,
+};
+
+enum PlaneIntersectionType
+{
+ FRONT = 0,
+ INTERSECTING = 1,
+ BACK = 2,
+};
+
+struct BoundingBox;
+struct BoundingOrientedBox;
+struct BoundingFrustum;
+
+#pragma warning(push)
+#pragma warning(disable:4324 4820)
+
+//-------------------------------------------------------------------------------------
+// Bounding sphere
+//-------------------------------------------------------------------------------------
+struct BoundingSphere
+{
+ XMFLOAT3 Center; // Center of the sphere.
+ float Radius; // Radius of the sphere.
+
+ // Creators
+ BoundingSphere() : Center(0,0,0), Radius( 1.f ) {}
+ BoundingSphere( _In_ const XMFLOAT3& center, _In_ float radius )
+ : Center(center), Radius(radius) { assert( radius >= 0.f ); };
+ BoundingSphere( _In_ const BoundingSphere& sp )
+ : Center(sp.Center), Radius(sp.Radius) {}
+
+ // Methods
+ BoundingSphere& operator=( _In_ const BoundingSphere& sp ) { Center = sp.Center; Radius = sp.Radius; return *this; }
+
+ void Transform( _Out_ BoundingSphere& Out, _In_ CXMMATRIX M ) const;
+ void Transform( _Out_ BoundingSphere& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation ) const;
+ // Transform the sphere
+
+ ContainmentType Contains( _In_ FXMVECTOR Point ) const;
+ ContainmentType Contains( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ ContainmentType Contains( _In_ const BoundingSphere& sh ) const;
+ ContainmentType Contains( _In_ const BoundingBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingOrientedBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ const BoundingSphere& sh ) const;
+ bool Intersects( _In_ const BoundingBox& box ) const;
+ bool Intersects( _In_ const BoundingOrientedBox& box ) const;
+ bool Intersects( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ // Triangle-sphere test
+
+ PlaneIntersectionType Intersects( _In_ FXMVECTOR Plane ) const;
+ // Plane-sphere test
+
+ bool Intersects( _In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist ) const;
+ // Ray-sphere test
+
+ ContainmentType ContainedBy( _In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2,
+ _In_ GXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5 ) const;
+ // Test sphere against six planes (see BoundingFrustum::GetPlanes)
+
+ // Static methods
+ static void CreateMerged( _Out_ BoundingSphere& Out, _In_ const BoundingSphere& S1, _In_ const BoundingSphere& S2 );
+
+ static void CreateFromBoundingBox( _Out_ BoundingSphere& Out, _In_ const BoundingBox& box );
+ static void CreateFromBoundingBox( _Out_ BoundingSphere& Out, _In_ const BoundingOrientedBox& box );
+
+ static void CreateFromPoints( _Out_ BoundingSphere& Out, _In_ size_t Count,
+ _In_reads_bytes_(sizeof(XMFLOAT3)+Stride*(Count-1)) const XMFLOAT3* pPoints, _In_ size_t Stride );
+
+ static void CreateFromFrustum( _Out_ BoundingSphere& Out, _In_ const BoundingFrustum& fr );
+};
+
+//-------------------------------------------------------------------------------------
+// Axis-aligned bounding box
+//-------------------------------------------------------------------------------------
+struct BoundingBox
+{
+ static const size_t CORNER_COUNT = 8;
+
+ XMFLOAT3 Center; // Center of the box.
+ XMFLOAT3 Extents; // Distance from the center to each side.
+
+ // Creators
+ BoundingBox() : Center(0,0,0), Extents( 1.f, 1.f, 1.f ) {}
+ BoundingBox( _In_ const XMFLOAT3& center, _In_ const XMFLOAT3& extents )
+ : Center(center), Extents(extents) { assert(extents.x >= 0 && extents.y >= 0 && extents.z >= 0); }
+ BoundingBox( _In_ const BoundingBox& box ) : Center(box.Center), Extents(box.Extents) {}
+
+ // Methods
+ BoundingBox& operator=( _In_ const BoundingBox& box) { Center = box.Center; Extents = box.Extents; return *this; }
+
+ void Transform( _Out_ BoundingBox& Out, _In_ CXMMATRIX M ) const;
+ void Transform( _Out_ BoundingBox& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation ) const;
+
+ void GetCorners( _Out_writes_(8) XMFLOAT3* Corners ) const;
+ // Gets the 8 corners of the box
+
+ ContainmentType Contains( _In_ FXMVECTOR Point ) const;
+ ContainmentType Contains( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ ContainmentType Contains( _In_ const BoundingSphere& sh ) const;
+ ContainmentType Contains( _In_ const BoundingBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingOrientedBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ const BoundingSphere& sh ) const;
+ bool Intersects( _In_ const BoundingBox& box ) const;
+ bool Intersects( _In_ const BoundingOrientedBox& box ) const;
+ bool Intersects( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ // Triangle-Box test
+
+ PlaneIntersectionType Intersects( _In_ FXMVECTOR Plane ) const;
+ // Plane-box test
+
+ bool Intersects( _In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist ) const;
+ // Ray-Box test
+
+ ContainmentType ContainedBy( _In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2,
+ _In_ GXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5 ) const;
+ // Test box against six planes (see BoundingFrustum::GetPlanes)
+
+ // Static methods
+ static void CreateMerged( _Out_ BoundingBox& Out, _In_ const BoundingBox& b1, _In_ const BoundingBox& b2 );
+
+ static void CreateFromSphere( _Out_ BoundingBox& Out, _In_ const BoundingSphere& sh );
+
+ static void CreateFromPoints( _Out_ BoundingBox& Out, _In_ FXMVECTOR pt1, _In_ FXMVECTOR pt2 );
+ static void CreateFromPoints( _Out_ BoundingBox& Out, _In_ size_t Count,
+ _In_reads_bytes_(sizeof(XMFLOAT3)+Stride*(Count-1)) const XMFLOAT3* pPoints, _In_ size_t Stride );
+};
+
+//-------------------------------------------------------------------------------------
+// Oriented bounding box
+//-------------------------------------------------------------------------------------
+struct BoundingOrientedBox
+{
+ static const size_t CORNER_COUNT = 8;
+
+ XMFLOAT3 Center; // Center of the box.
+ XMFLOAT3 Extents; // Distance from the center to each side.
+ XMFLOAT4 Orientation; // Unit quaternion representing rotation (box -> world).
+
+ // Creators
+ BoundingOrientedBox() : Center(0,0,0), Extents( 1.f, 1.f, 1.f ), Orientation(0,0,0, 1.f ) {}
+ BoundingOrientedBox( _In_ const XMFLOAT3& _Center, _In_ const XMFLOAT3& _Extents, _In_ const XMFLOAT4& _Orientation )
+ : Center(_Center), Extents(_Extents), Orientation(_Orientation)
+ {
+ assert(_Extents.x >= 0 && _Extents.y >= 0 && _Extents.z >= 0);
+ }
+ BoundingOrientedBox( _In_ const BoundingOrientedBox& box )
+ : Center(box.Center), Extents(box.Extents), Orientation(box.Orientation) {}
+
+ // Methods
+ BoundingOrientedBox& operator=( _In_ const BoundingOrientedBox& box ) { Center = box.Center; Extents = box.Extents; Orientation = box.Orientation; return *this; }
+
+ void Transform( _Out_ BoundingOrientedBox& Out, _In_ CXMMATRIX M ) const;
+ void Transform( _Out_ BoundingOrientedBox& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation ) const;
+
+ void GetCorners( _Out_writes_(8) XMFLOAT3* Corners ) const;
+ // Gets the 8 corners of the box
+
+ ContainmentType Contains( _In_ FXMVECTOR Point ) const;
+ ContainmentType Contains( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ ContainmentType Contains( _In_ const BoundingSphere& sh ) const;
+ ContainmentType Contains( _In_ const BoundingBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingOrientedBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ const BoundingSphere& sh ) const;
+ bool Intersects( _In_ const BoundingBox& box ) const;
+ bool Intersects( _In_ const BoundingOrientedBox& box ) const;
+ bool Intersects( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ // Triangle-OrientedBox test
+
+ PlaneIntersectionType Intersects( _In_ FXMVECTOR Plane ) const;
+ // Plane-OrientedBox test
+
+ bool Intersects( _In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist ) const;
+ // Ray-OrientedBox test
+
+ ContainmentType ContainedBy( _In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2,
+ _In_ GXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5 ) const;
+ // Test OrientedBox against six planes (see BoundingFrustum::GetPlanes)
+
+ // Static methods
+ static void CreateFromBoundingBox( _Out_ BoundingOrientedBox& Out, _In_ const BoundingBox& box );
+
+ static void CreateFromPoints( _Out_ BoundingOrientedBox& Out, _In_ size_t Count,
+ _In_reads_bytes_(sizeof(XMFLOAT3)+Stride*(Count-1)) const XMFLOAT3* pPoints, _In_ size_t Stride );
+};
+
+//-------------------------------------------------------------------------------------
+// Bounding frustum
+//-------------------------------------------------------------------------------------
+struct BoundingFrustum
+{
+ static const size_t CORNER_COUNT = 8;
+
+ XMFLOAT3 Origin; // Origin of the frustum (and projection).
+ XMFLOAT4 Orientation; // Quaternion representing rotation.
+
+ float RightSlope; // Positive X slope (X/Z).
+ float LeftSlope; // Negative X slope.
+ float TopSlope; // Positive Y slope (Y/Z).
+ float BottomSlope; // Negative Y slope.
+ float Near, Far; // Z of the near plane and far plane.
+
+ // Creators
+ BoundingFrustum() : Origin(0,0,0), Orientation(0,0,0, 1.f), RightSlope( 1.f ), LeftSlope( -1.f ),
+ TopSlope( 1.f ), BottomSlope( -1.f ), Near(0), Far( 1.f ) {}
+ BoundingFrustum( _In_ const XMFLOAT3& _Origin, _In_ const XMFLOAT4& _Orientation,
+ _In_ float _RightSlope, _In_ float _LeftSlope, _In_ float _TopSlope, _In_ float _BottomSlope,
+ _In_ float _Near, _In_ float _Far )
+ : Origin(_Origin), Orientation(_Orientation),
+ RightSlope(_RightSlope), LeftSlope(_LeftSlope), TopSlope(_TopSlope), BottomSlope(_BottomSlope),
+ Near(_Near), Far(_Far) { assert( _Near <= _Far ); }
+ BoundingFrustum( _In_ const BoundingFrustum& fr )
+ : Origin(fr.Origin), Orientation(fr.Orientation), RightSlope(fr.RightSlope), LeftSlope(fr.LeftSlope),
+ TopSlope(fr.TopSlope), BottomSlope(fr.BottomSlope), Near(fr.Near), Far(fr.Far) {}
+ BoundingFrustum( _In_ CXMMATRIX Projection ) { CreateFromMatrix( *this, Projection ); }
+
+ // Methods
+ BoundingFrustum& operator=( _In_ const BoundingFrustum& fr ) { Origin=fr.Origin; Orientation=fr.Orientation;
+ RightSlope=fr.RightSlope; LeftSlope=fr.LeftSlope;
+ TopSlope=fr.TopSlope; BottomSlope=fr.BottomSlope;
+ Near=fr.Near; Far=fr.Far; return *this; }
+
+ void Transform( _Out_ BoundingFrustum& Out, _In_ CXMMATRIX M ) const;
+ void Transform( _Out_ BoundingFrustum& Out, _In_ float Scale, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation ) const;
+
+ void GetCorners( _Out_writes_(8) XMFLOAT3* Corners ) const;
+ // Gets the 8 corners of the frustum
+
+ ContainmentType Contains( _In_ FXMVECTOR Point ) const;
+ ContainmentType Contains( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ ContainmentType Contains( _In_ const BoundingSphere& sp ) const;
+ ContainmentType Contains( _In_ const BoundingBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingOrientedBox& box ) const;
+ ContainmentType Contains( _In_ const BoundingFrustum& fr ) const;
+ // Frustum-Frustum test
+
+ bool Intersects( _In_ const BoundingSphere& sh ) const;
+ bool Intersects( _In_ const BoundingBox& box ) const;
+ bool Intersects( _In_ const BoundingOrientedBox& box ) const;
+ bool Intersects( _In_ const BoundingFrustum& fr ) const;
+
+ bool Intersects( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2 ) const;
+ // Triangle-Frustum test
+
+ PlaneIntersectionType Intersects( _In_ FXMVECTOR Plane ) const;
+ // Plane-Frustum test
+
+ bool Intersects( _In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _Out_ float& Dist ) const;
+ // Ray-Frustum test
+
+ ContainmentType ContainedBy( _In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, _In_ FXMVECTOR Plane2,
+ _In_ GXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5 ) const;
+ // Test frustum against six planes (see BoundingFrustum::GetPlanes)
+
+ void GetPlanes( _Out_opt_ XMVECTOR* NearPlane, _Out_opt_ XMVECTOR* FarPlane, _Out_opt_ XMVECTOR* RightPlane,
+ _Out_opt_ XMVECTOR* LeftPlane, _Out_opt_ XMVECTOR* TopPlane, _Out_opt_ XMVECTOR* BottomPlane ) const;
+ // Create 6 Planes representation of Frustum
+
+ // Static methods
+ static void CreateFromMatrix( _Out_ BoundingFrustum& Out, _In_ CXMMATRIX Projection );
+};
+
+//-----------------------------------------------------------------------------
+// Triangle intersection testing routines.
+//-----------------------------------------------------------------------------
+namespace TriangleTests
+{
+ bool Intersects( _In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, _In_ FXMVECTOR V0, _In_ GXMVECTOR V1, _In_ CXMVECTOR V2, _Out_ float& Dist );
+ // Ray-Triangle
+
+ bool Intersects( _In_ FXMVECTOR A0, _In_ FXMVECTOR A1, _In_ FXMVECTOR A2, _In_ GXMVECTOR B0, _In_ CXMVECTOR B1, _In_ CXMVECTOR B2 );
+ // Triangle-Triangle
+
+ PlaneIntersectionType Intersects( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2, _In_ GXMVECTOR Plane );
+ // Plane-Triangle
+
+ ContainmentType ContainedBy( _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2,
+ _In_ GXMVECTOR Plane0, _In_ CXMVECTOR Plane1, _In_ CXMVECTOR Plane2,
+ _In_ CXMVECTOR Plane3, _In_ CXMVECTOR Plane4, _In_ CXMVECTOR Plane5 );
+ // Test a triangle against six planes at once (see BoundingFrustum::GetPlanes)
+};
+
+#pragma warning(pop)
+
+/****************************************************************************
+ *
+ * Implementation
+ *
+ ****************************************************************************/
+
+#pragma warning(push)
+#pragma warning(disable : 4068 4616 6001)
+
+#pragma prefast(push)
+#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes")
+
+#include "DirectXCollision.inl"
+
+#pragma prefast(pop)
+#pragma warning(pop)
+
+}; // namespace DirectX
+