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; } } }