Exemplo n.º 1
0
        public void Update(GameTime gameTime)
        {
            if (orbitEnabled)
            {
                CalculateOrbit(gameTime);
            }

            Vector3d planetCenter = GetComponent <HighPrecisionPosition>().Position;

            if (HasAtmosphere)
            {
                atmosphere.GetComponent <HighPrecisionPosition>().Position = planetCenter;

                atmosphere.Update(SolarSystem.GetSun().LightDirection, Vector3.Zero,
                                  (Vector3.Zero - Transform.AbsoluteTransform.Translation).Length());

                atmosphericScatteringHelper.Update((Vector3.Zero - Transform.AbsoluteTransform.Translation).Length(),
                                                   SolarSystem.GetSun().LightDirection, Vector3.Zero - Transform.AbsoluteTransform.Translation);
            }



            foreach (GameObject.GameObject child in Children)
            {
                CalculateChildMovement(gameTime, child, planetCenter);
            }


            Vector3 toCenterOfPlanet         = Transform.AbsoluteTransform.Translation;
            float   distanceToCenterOfPlanet = toCenterOfPlanet.Length();
            float   surfaceDistance          = distanceToCenterOfPlanet - radius;
            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);
                }
            }

            positionLastFrame = GetComponent <HighPrecisionPosition>().Position;
        }