Ejemplo n.º 1
0
        private void RemoveStaleNodes()
        {
            List <PlanetNode> nodesToRemove = new List <PlanetNode>();

            foreach (PlanetNode n in activePatches.Values)
            {
                if (n.remove)
                {
                    nodesToRemove.Add(n);
                }
            }

            if (PlanetBuilder.GetBuiltNodesQueueSize(Name) == 0 && PlanetBuilder.GetQueueSize() == 0)
            {
                foreach (PlanetNode n in nodesToRemove)
                {
                    RemovePatch(n);
                }

                nodesToRemove.Clear();
            }
        }
Ejemplo n.º 2
0
        private void AddNodeIfNotPresent(Vector3 normal, float step, int depth, Vector3 min, Vector3 max)
        {
            //don't build if already under way.
            Vector3 mid = (min + max) / 2;

            if (nodesBeingBuilt.ContainsKey(mid))
            {
                return;
            }

            if (activePatches.ContainsKey(mid))
            {
                PlanetNode node = activePatches[mid];
                node.remove = false;
                return;
            }


            var patchBeingBuilt = new PatchMinMax(min, max);

            nodesBeingBuilt.Add(mid, patchBeingBuilt);
            PlanetBuilder.Enqueue(testEffect, module, this, depth, min, max, step, normal, radius);
        }
Ejemplo n.º 3
0
        public void Update(GameTime gameTime)
        {
            Vector3 planetCenter             = Transform.AbsoluteTransform.Translation;
            Vector3 toCenterOfPlanet         = Transform.AbsoluteTransform.Translation - SystemCore.ActiveCamera.Position;
            float   distanceToCenterOfPlanet = toCenterOfPlanet.Length();
            float   surfaceDistance          = distanceToCenterOfPlanet - radius;

            if (HasAtmosphere)
            {
                atmosphere.Update(sunDirection, SystemCore.ActiveCamera.Position, distanceToCenterOfPlanet);
                atmosphericScatteringHelper.Update(distanceToCenterOfPlanet, sunDirection, SystemCore.ActiveCamera.Position - Transform.AbsoluteTransform.Translation);
            }



            float farPlaneMultiplier = MonoMathHelper.MapFloatRange(radius, radius * 2, 0.3f, 1f, surfaceDistance);

            GenerateCustomProjectionMatrix(distanceToCenterOfPlanet * farPlaneMultiplier);
            var frustrum = new BoundingFrustum(SystemCore.ActiveCamera.View * customProjection);

            int activeCount = 0;


            foreach (PlanetNode node in activePatches.Values)
            {
                node.Update();



                //all nodes are flagged for removal every frame.
                //The LOD calculation will unflag if nodes should be kept.
                node.remove = true;

                if (!frustrum.Intersects(node.boundingSphere))
                {
                    node.Disable();
                }
                else
                {
                    if (SystemWarGlobalSettings.RenderQuadtreeConnectivity)
                    {
                        RenderConnections(node);
                    }

                    node.Enable();
                    activeCount++;
                }
            }



            if (SystemWarGlobalSettings.RepairSeams)
            {
                CalculateConnectivity();
            }


            for (int i = 0; i < rootNodes.Count; i++)
            {
                PlanetNode root = rootNodes[i];
                CalculatePatchLOD(root.normal, root.step, root.depth, root.min, root.max);
            }



            //removes nodes that have not had their flags refreshed by the LOD pass
            RemoveStaleNodes();

            int patchCountPerFrame = 10;

            for (int i = 0; i < patchCountPerFrame; i++)
            {
                PlanetNode finishedNode;
                if (PlanetBuilder.GetBuiltNodes(Name, out finishedNode))
                {
                    AddPatch(finishedNode);
                }
            }
        }