summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts/Physics/PhysicsQuadtree.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-05-09 19:28:57 +0800
committerchai <215380520@qq.com>2023-05-09 19:28:57 +0800
commitfc2cfdad0d3cfb3844681855c1c45d9415f5ee8e (patch)
treeacbcac9d6e153b011171ae0246592d68ff008b75 /marching/Assets/Scripts/Physics/PhysicsQuadtree.cs
parent4afa7c36ba9ec33ed113dcfb7cd33bd630d444f2 (diff)
*misc
Diffstat (limited to 'marching/Assets/Scripts/Physics/PhysicsQuadtree.cs')
-rw-r--r--marching/Assets/Scripts/Physics/PhysicsQuadtree.cs67
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);
+ }
+
+}
+