コード例 #1
0
        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());
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
    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();
        }
    }