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