Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
            private void Insert(int node)
            {
                var      box = _tree.GetAabb(node);
                Vector3D test;

                Vector3D.Clamp(ref _vec, ref box.Min, ref box.Max, out test);
                var dist = Vector3D.DistanceSquared(test, _vec);

                _tmp.Insert(node, dist);
            }
Exemplo n.º 3
0
            private void Insert(int node)
            {
                var      box = _tree.GetAabb(node);
                Vector3D tmp;

                Vector3D.Clamp(ref _vec, ref box.Min, ref box.Max, out tmp);
                var dist = Vector3D.DistanceSquared(tmp, _vec);

                if (dist <= _maxDistanceSq)
                {
                    _tmp.Insert(node, dist);
                }
            }
Exemplo n.º 4
0
        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);
                }
            }
        }