internal bool OnAddedToScene(MyClipmapCellProxy cellProxy) { if (!IsUsed()) { return(false); } bool lodAabbChanged = false; int rootProxy = m_boundingBoxes.GetRoot(); BoundingBoxD lodAabbBefore = BoundingBoxD.CreateInvalid(); if (rootProxy != -1) { lodAabbBefore = m_boundingBoxes.GetAabb(rootProxy); } BoundingBoxD cellAabb = (BoundingBoxD)cellProxy.LocalAabb; m_cellProxyToAabbProxy.Add(cellProxy, m_boundingBoxes.AddProxy(ref cellAabb, null, 0)); if (rootProxy != -1) { BoundingBoxD lodAabbAfter = m_boundingBoxes.GetAabb(rootProxy); lodAabbChanged = lodAabbBefore.Equals(lodAabbAfter); } if (lodAabbChanged) { InvalidateAllMergedMeshesInLod(); } Vector3D translation = cellProxy.Translation; int divideIndex = GetDivideIndex(ref translation); m_trackedActors[divideIndex].Add(cellProxy.Actor); MyMergedLodMeshId mergedLodMeshId = MyMeshes.GetMergedLodMesh(m_mergedLodMeshProxies[divideIndex].MeshId, 0); LodMeshId lodMeshToMerge = MyMeshes.GetLodMesh(cellProxy.MeshId, 0); bool mergedMesh = mergedLodMeshId.MergeLodMesh(lodMeshToMerge); if (mergedMesh) { InvalidateAllMergedMeshesInLod(); } TryCancelMergeJob(divideIndex, MeshId.NULL); bool startedMerge = TryStartMergeJob(divideIndex, 1000); bool shouldMarkDirty = !mergedMesh && !startedMerge; if (shouldMarkDirty) { m_dirtyProxyIndices.Add(divideIndex); } return(shouldMarkDirty); }
public void Reset() { _tmp.Clear(); var rt = _tree.GetRoot(); if (rt >= 0) { Insert(rt); } }
public void GetShieldsChangesInBox(int callerId, BoundingBoxD box, HashSet <DefenseShields> foundShields, HashSet <DefenseShields> lostShields, Dictionary <MyEntity, DefenseShields> compare) { var root = _aabbTree.GetRoot(); var noneFound = true; if (root == -1) { return; } _stack.Clear(); _stack.Push(root); while (_stack.Count > 0) { int id = _stack.Pop(); var nodeBB = _aabbTree.GetAabb(id); if (!nodeBB.Intersects(box)) { continue; } int left; int right; _aabbTree.GetChildren(id, out left, out right); // GetBranches!!! if (left == -1) // is leaf { if (id == callerId) { continue; } noneFound = false; var ds = _aabbTree.GetUserData <DefenseShields>(id); if (!compare.ContainsKey(ds.MyGrid)) { foundShields.Add(ds); } else { lostShields.Add(ds); } } else { if (left >= 0) { _stack.Push(left); } if (right >= 0) { _stack.Push(right); } } } foreach (var shield in compare.Values) { if (noneFound) { lostShields.Add(shield); } else if (lostShields.Contains(shield)) { lostShields.Remove(shield); } } }