diff options
Diffstat (limited to 'WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs')
-rw-r--r-- | WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs new file mode 100644 index 0000000..5cd374e --- /dev/null +++ b/WorldlineKeepers/Assets/Scripts/Physics/PhysicsQuadtree.cs @@ -0,0 +1,87 @@ +using mh; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// <summary> +/// 基于图形的四叉树 +/// </summary> +class PhysicsQuadtree +{ + /// <summary> + /// 边界 + /// </summary> + public Vector4 quadtreeRange { set { m_QuadtreeRange = value; } } + private Vector4 m_QuadtreeRange; + + /// <summary> + /// 根节点 + /// </summary> + private Quadtree m_Quadtree; + + /// <summary> + /// 托管的全部对象,但不一定会加入到树里面(中心点在边界外的不加入树) + /// </summary> + private List<IQuadTreeObject> m_Objects = new List<IQuadTreeObject>(); + + public PhysicsQuadtree(Vector4 range) + { + m_QuadtreeRange = range; + m_Quadtree = new Quadtree(0, range, true); + } + + public void AddObject(IQuadTreeObject obj) + { + m_Objects.Add(obj); + } + + public void RemoveObject(IQuadTreeObject obj) + { + m_Objects.Remove(obj); + } + + public void UpdateQuadtree() + { + m_Quadtree.Clear(false); + m_Quadtree.Rebound(m_QuadtreeRange); + InsertAllObjects(); + } + + private void InsertAllObjects() + { + Vector4 bound = m_Quadtree.bound; + for (int i = 0; i < m_Objects.Count; i++) + { + IQuadTreeObject obj = m_Objects[i]; + // 简单的忽略中心在边界外的object + if (PhysicsManager.IsPointInsideBox(bound, obj.bound.xy())) + { + m_Quadtree.Insert(obj); + } + } + } + + public void Debug() + { + Color c = Gizmos.color; + Gizmos.color = Color.green; + m_Quadtree?.Iterate((t) => + { + Vector3 pos = new Vector3(t.x, t.y, 0); + Vector3 size = new Vector3(t.w, t.h, 1); + Gizmos.DrawWireCube(pos, size); + }); + Gizmos.color = c; + } + + public bool Retrive(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj) + { + return m_Quadtree.Retrieve(ref returnObjs, obj); + } + + public bool Retrive(ref List<IQuadTreeObject> returnObjs, Vector4 bound) + { + return m_Quadtree.Retrieve(ref returnObjs, bound); + } + +}
\ No newline at end of file |