Files
test/Assets/PerfectWorld/Scripts/Common/A3DGeometry.cs
T
2025-12-05 21:07:25 +07:00

123 lines
3.7 KiB
C#

using CSNetwork.GPDataType;
namespace BrewMonster
{
public class A3DAABB
{
public A3DVECTOR3 Center;
public A3DVECTOR3 Extents;
public A3DVECTOR3 Mins;
public A3DVECTOR3 Maxs;
public A3DAABB() { }
public A3DAABB(A3DAABB aabb)
{
Center = aabb.Center;
Extents = aabb.Extents;
Mins = aabb.Mins;
Maxs = aabb.Maxs;
}
public A3DAABB(A3DVECTOR3 mins, A3DVECTOR3 maxs)
{
Mins = mins;
Maxs = maxs;
Center = (mins + maxs) * 0.5f;
Extents = maxs - Center;
}
// Reset AABB về trạng thái rỗng
public void Clear()
{
Mins = new A3DVECTOR3(999999f, 999999f, 999999f);
Maxs = new A3DVECTOR3(-999999f, -999999f, -999999f);
Center = new A3DVECTOR3(0f, 0f, 0f);
Extents = new A3DVECTOR3(0f, 0f, 0f);
}
// Thêm 1 điểm vào AABB
public void AddVertex(A3DVECTOR3 v)
{
if (v.x < Mins.x) Mins.x = v.x;
if (v.y < Mins.y) Mins.y = v.y;
if (v.z < Mins.z) Mins.z = v.z;
if (v.x > Maxs.x) Maxs.x = v.x;
if (v.y > Maxs.y) Maxs.y = v.y;
if (v.z > Maxs.z) Maxs.z = v.z;
CompleteCenterExts();
}
// Hợp nhất 2 AABB
public void Merge(A3DAABB subAABB)
{
if (subAABB.Mins.x < Mins.x) Mins.x = subAABB.Mins.x;
if (subAABB.Mins.y < Mins.y) Mins.y = subAABB.Mins.y;
if (subAABB.Mins.z < Mins.z) Mins.z = subAABB.Mins.z;
if (subAABB.Maxs.x > Maxs.x) Maxs.x = subAABB.Maxs.x;
if (subAABB.Maxs.y > Maxs.y) Maxs.y = subAABB.Maxs.y;
if (subAABB.Maxs.z > Maxs.z) Maxs.z = subAABB.Maxs.z;
CompleteCenterExts();
}
// Cập nhật Mins, Maxs từ Center + Extents
public void CompleteMinsMaxs()
{
Mins = Center - Extents;
Maxs = Center + Extents;
}
// Cập nhật Center + Extents từ Mins, Maxs
public void CompleteCenterExts()
{
Center = (Mins + Maxs) * 0.5f;
Extents = Maxs - Center;
}
// Kiểm tra điểm có nằm trong AABB không
public bool IsPointIn(A3DVECTOR3 v)
{
return !(v.x > Maxs.x || v.x < Mins.x ||
v.y > Maxs.y || v.y < Mins.y ||
v.z > Maxs.z || v.z < Mins.z);
}
// Kiểm tra 1 AABB khác có nằm trong AABB này không
public bool IsAABBIn(A3DAABB aabb)
{
return (aabb.Mins.x >= Mins.x && aabb.Maxs.x <= Maxs.x &&
aabb.Mins.y >= Mins.y && aabb.Maxs.y <= Maxs.y &&
aabb.Mins.z >= Mins.z && aabb.Maxs.z <= Maxs.z);
}
// Xây AABB từ một tập vertices
public void Build(A3DVECTOR3[] vertices)
{
Clear();
foreach (var v in vertices)
AddVertex(v);
}
// Lấy các vertices (8 điểm) của AABB
public A3DVECTOR3[] GetVertices()
{
A3DVECTOR3[] verts = new A3DVECTOR3[8];
verts[0] = new A3DVECTOR3(Mins.x, Mins.y, Mins.z);
verts[1] = new A3DVECTOR3(Maxs.x, Mins.y, Mins.z);
verts[2] = new A3DVECTOR3(Maxs.x, Maxs.y, Mins.z);
verts[3] = new A3DVECTOR3(Mins.x, Maxs.y, Mins.z);
verts[4] = new A3DVECTOR3(Mins.x, Mins.y, Maxs.z);
verts[5] = new A3DVECTOR3(Maxs.x, Mins.y, Maxs.z);
verts[6] = new A3DVECTOR3(Maxs.x, Maxs.y, Maxs.z);
verts[7] = new A3DVECTOR3(Mins.x, Maxs.y, Maxs.z);
return verts;
}
}
}