public override int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType) { RefreshBounds(); int code = treeType == SceneSeparateTreeType.OcTree ? CalculateOcTreeBoundsCode(m_Bounds, bounds) : CalculateQuadBoundsCode(m_Bounds, bounds); return(code); }
/// <summary> /// 构造函数 /// </summary> /// <param name="treeType">树类型</param> /// <param name="center">树中心</param> /// <param name="size">树区域大小</param> /// <param name="maxDepth">树最大深度</param> public SceneSeparateTree(SceneSeparateTreeType treeType, Vector3 center, Vector3 size, int maxDepth) { this.m_TreeType = treeType; this.m_MaxDepth = maxDepth; if (treeType == SceneSeparateTreeType.QuadTree) { this.m_Root = new SceneSeparateTreeNode <T>(new Bounds(center, size), 0, 4); } else { this.m_Root = new SceneSeparateTreeNode <T>(new Bounds(center, size), 0, 8); } }
public void Trigger(IDetector detector, SceneSeparateTreeType treeType, TriggerHandle <T> handle) { if (handle == null) { return; } int code = detector.DetectedCode(m_Bounds, treeType); for (int i = 0; i < m_ChildNodes.Length; i++) { var node = m_ChildNodes[i]; if (node != null && (code & (1 << i)) != 0) { node.Trigger(detector, treeType, handle); } } //if (detector.IsDetected(m_Bounds)) { var node = m_ObjectList.First; while (node != null) { if (detector.IsDetected(node.Value.Bounds)) { handle(node.Value); } node = node.Next; } //for (int i = 0; i < m_ObjectList.Count; i++) //{ // if (m_ObjectList[i] != null) // { // if (detector.IsDetected(m_ObjectList[i].Bounds)) // handle(m_ObjectList[i]); // } //} } }
/// <summary> /// 初始化 /// </summary> /// <param name="center">场景区域中心</param> /// <param name="size">场景区域大小</param> /// <param name="asyn">是否异步</param> public void Init(Vector3 center, Vector3 size, bool asyn, SceneSeparateTreeType treeType) { Init(center, size, asyn, 25, 15, 1, 5, treeType); }
/// <summary> /// 初始化 /// </summary> /// <param name="center">场景区域中心</param> /// <param name="size">场景区域大小</param> /// <param name="asyn">是否异步</param> /// <param name="maxCreateCount">最大创建数量</param> /// <param name="minCreateCount">最小创建数量</param> /// <param name="maxRefreshTime">更新区域时间间隔</param> /// <param name="maxDestroyTime">检查销毁时间间隔</param> /// <param name="quadTreeDepth">四叉树深度</param> public void Init(Vector3 center, Vector3 size, bool asyn, int maxCreateCount, int minCreateCount, float maxRefreshTime, float maxDestroyTime, SceneSeparateTreeType treeType, int quadTreeDepth = 5) { if (m_IsInitialized) { return; } m_QuadTree = new SceneSeparateTree <SceneObject>(treeType, center, size, quadTreeDepth); m_LoadedObjectList = new List <SceneObject>(); //m_PreDestroyObjectQueue = new Queue<SceneObject>(); m_PreDestroyObjectQueue = new PriorityQueue <SceneObject>(new SceneObjectWeightComparer()); m_TriggerHandle = new TriggerHandle <SceneObject>(this.TriggerHandle); m_MaxCreateCount = Mathf.Max(0, maxCreateCount); m_MinCreateCount = Mathf.Clamp(minCreateCount, 0, m_MaxCreateCount); m_MaxRefreshTime = maxRefreshTime; m_MaxDestroyTime = maxDestroyTime; m_Asyn = asyn; m_IsInitialized = true; m_RefreshTime = maxRefreshTime; }
/// <summary> /// 初始化 /// </summary> /// <param name="center">场景区域中心</param> /// <param name="size">场景区域大小</param> /// <param name="asyn">是否异步</param> /// <param name="maxCreateCount">更新区域时间间隔</param> /// <param name="minCreateCount">检查销毁时间间隔</param> public void Init(Vector3 center, Vector3 size, bool asyn, int maxCreateCount, int minCreateCount, SceneSeparateTreeType treeType) { Init(center, size, asyn, maxCreateCount, minCreateCount, 0.1f, 2, treeType); }
/// <param name="center"></param> /// <param name="size"></param> public void Init(Vector3 center, Vector3 size, SceneSeparateTreeType treeType) { Init(center, size, 20, 15, 1, 1, treeType); }
public override int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType) { if (m_Camera == null) { return(0); } Matrix4x4 matrix = m_Camera.projectionMatrix * m_Camera.worldToCameraMatrix; if (m_Codes == null || m_CurrentTreeType != treeType) { m_Codes = new int[treeType == SceneSeparateTreeType.OcTree ? 27 : 18]; m_CurrentTreeType = treeType; } int code = 0; int index = 0; if (treeType == SceneSeparateTreeType.OcTree) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { m_Codes[index] = CalculateCullCode( new Vector4(bounds.center.x + bounds.size.x * 0.5f * (i - 1), bounds.center.y + bounds.size.y * 0.5f * (k - 1), bounds.center.z + bounds.size.z * 0.5f * (j - 1), 1), matrix); index += 1; } } } code = CalculateOcTreeBoundsCullCode(code, 0, 1); code = CalculateOcTreeBoundsCullCode(code, 1, 2); code = CalculateOcTreeBoundsCullCode(code, 3, 4); code = CalculateOcTreeBoundsCullCode(code, 4, 8); code = CalculateOcTreeBoundsCullCode(code, 9, 16); code = CalculateOcTreeBoundsCullCode(code, 10, 32); code = CalculateOcTreeBoundsCullCode(code, 12, 64); code = CalculateOcTreeBoundsCullCode(code, 13, 128); } else { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int k = -1; k < 2; k += 2) { m_Codes[index] = CalculateCullCode( new Vector4(bounds.center.x + bounds.size.x * 0.5f * (i - 1), bounds.center.y + bounds.size.y * 0.5f * k, bounds.center.z + bounds.size.z * 0.5f * (j - 1), 1), matrix); index += 1; } } } code = CalculateQuadTreeBoundsCullCode(code, 0, 1); code = CalculateQuadTreeBoundsCullCode(code, 2, 2); code = CalculateQuadTreeBoundsCullCode(code, 6, 4); code = CalculateQuadTreeBoundsCullCode(code, 8, 8); } return(code); }
public abstract int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType);