public void TrySubdivideOver(WorldPos pos) { if (toGenerate == null) { toGenerate = new WeightedSegmentsList() { cam = Camera } } ; toGenerate.Clear(); ShadersReloadedCheck(); foreach (var rootSegment in rootSegments) { if (rootSegment.GenerationBegan == false) { // first generate rootCunks toGenerate.Add(rootSegment, float.MaxValue); } else { // then their children GatherWeights(toGenerate, rootSegment, 0); } } Debug.AddValue("generation / segments to generate", toGenerate.Count); toGenerateOrdered = new Queue <Segment>(toGenerate.GetWeighted()); }
void GatherWeights(WeightedSegmentsList toGenerate, Segment segment, int recursionDepth) { var weight = segment.GetGenerationWeight(Camera); if (segment.GenerationBegan == false) { toGenerate.Add(segment, weight); } if (recursionDepth < SubdivisionMaxRecurisonDepth) { if (weight > WeightNeededToSubdivide) { segment.EnsureChildrenAreCreated(); foreach (var child in segment.Children) { GatherWeights(toGenerate, child, recursionDepth + 1); } if (segment.Children.All(c => c.IsGenerationDone)) { segment.SetVisible(false); } else { segment.SetVisible(true); segment.HideAllChildren(); } return; } } if (segment.IsGenerationDone) { segment.SetVisible(true); segment.HideAllChildren(); } }
void GatherWeights(WeightedSegmentsList toGenerate, Chunk chunk, int recursionDepth) { if (toGenerate.Count > 100) { return; // precaution } var weight = chunk.GetGenerationWeight(toGenerate.data); if (!chunk.generationBegan) { toGenerate.Add(chunk, weight); } if (recursionDepth < SubdivisionMaxRecurisonDepth && weight > chunkConfig.weightNeededToSubdivide) { chunk.EnsureChildrenInstancesAreCreated(); foreach (var child in chunk.children) { GatherWeights(toGenerate, child, recursionDepth + 1); } if (chunk.children.All(c => c.isGenerationDone)) { chunk.SetVisible(false); } else { chunk.SetVisible(true); chunk.HideAllChildren(); } } else if (chunk.isGenerationDone) { chunk.SetVisible(true); //chunk.HideAllChildren(); chunk.DestroyAllChildren(); } }