diff options
author | chai <215380520@qq.com> | 2023-05-09 19:28:57 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-05-09 19:28:57 +0800 |
commit | fc2cfdad0d3cfb3844681855c1c45d9415f5ee8e (patch) | |
tree | acbcac9d6e153b011171ae0246592d68ff008b75 /marching/Assets/Scripts/Physics/PhysicsQuadtree.cs | |
parent | 4afa7c36ba9ec33ed113dcfb7cd33bd630d444f2 (diff) |
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsQuadtree.cs')
-rw-r--r-- | marching/Assets/Scripts/Physics/PhysicsQuadtree.cs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs new file mode 100644 index 0000000..cb17900 --- /dev/null +++ b/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs @@ -0,0 +1,67 @@ +using mh; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +/// <summary> +/// 基于图形的四叉树 +/// </summary> +class PhysicsQuadtree +{ + public Vector4 quadtreeRange { set { m_QuadtreeRange = value; } } + private Vector4 m_QuadtreeRange; + private Quadtree m_Quadtree; + private List<IQuadTreeObject> m_Objects = new List<IQuadTreeObject>(); + + public PhysicsQuadtree(Vector4 range) + { + m_QuadtreeRange = range; + m_Quadtree = new Quadtree(0, range); + } + + 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); + for (int i = 0; i < m_Objects.Count; i++) + { + IQuadTreeObject obj = m_Objects[i]; + m_Quadtree.Insert(obj); + } + } + + public void Debug() + { + Color c = Gizmos.color; + Gizmos.color = Color.red; + 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); + } + +} + |