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; }