123 lines
3.7 KiB
C#
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;
|
|
}
|
|
}
|
|
} |