コード例 #1
0
        public TerrainSnapshot CompileSnapshot()
        {
            if (cachedSnapshot?.Version == descriptionStore.Version)
            {
                return(cachedSnapshot);
            }
//         Console.WriteLine("Terrain Snapshot Compile Triggered");

            var nodeDescriptions        = descriptionStore.EnumerateSectorNodeDescriptions().ToList();
            var edgeDescriptions        = descriptionStore.EnumerateSectorEdgeDescriptions().ToList();
            var dynamicHoleDescriptions = descriptionStore.EnumerateDynamicTerrainHoleDescriptions().ToList();


            //----------------------------------------------------------------------------------------
            // Plan Local Geometry Jobs
            //----------------------------------------------------------------------------------------
            var edgeDescriptionsByNodeDescription = edgeDescriptions.ToLookup(edge => edge.Source); // 20ms

            var localGeometryRenderJobByNodeDescription = new Dictionary <SectorNodeDescription, LocalGeometryJob>(nodeDescriptions.Count);

            foreach (var sectorNodeDescription in nodeDescriptions)
            {
                var localGeometryRenderJob = new LocalGeometryJob(sectorNodeDescription.StaticMetadata);
                foreach (var edgeDescription in edgeDescriptionsByNodeDescription[sectorNodeDescription])
                {
                    edgeDescription.EnhanceLocalGeometryJob(ref localGeometryRenderJob);
                }
                foreach (var holeDescription in dynamicHoleDescriptions)
                {
                    holeDescription.EnhanceLocalGeometryJob(sectorNodeDescription, ref localGeometryRenderJob);
                }
                localGeometryRenderJobByNodeDescription.Add(sectorNodeDescription, localGeometryRenderJob);
            } // 80ms

            var localGeometryPreviewJobsByRenderJob = localGeometryRenderJobByNodeDescription.Values.Distinct().ToDictionary(
                renderJob => renderJob,
                renderJob => new LocalGeometryJob(renderJob.TerrainStaticMetadata, renderJob.CrossoverSegments)); //110


            // TODO: Optimization: Pathfind on 'known' hole-less geometry.
            // If a 'dirty' uncalculated snapshot is in the final path, calculate and redo pathfind.

            //----------------------------------------------------------------------------------------
            // Local Geometry Jobs => Local Geometry View Managers
            // Which are able to efficiently find paths from one point to another, but don't have the
            // concept of a 'crossover' (though they know to negate character radius at certain segs)
            // Support adding 'endpoints' which may be labeled + looking up all endpoints of a label.
            //----------------------------------------------------------------------------------------
            var localGeometryPreviewJobs            = localGeometryPreviewJobsByRenderJob.Values.ToHashSet();
            var localGeometryPreviewJobViewManagers = localGeometryPreviewJobs.ToDictionary(
                job => job,
                job => previousLocalGeometryViewManagers.GetValueOrDefault(job)
                ?? new LocalGeometryViewManager(job));

            var localGeometryRenderJobs            = localGeometryRenderJobByNodeDescription.Values.ToHashSet();
            var localGeometryRenderJobViewManagers = localGeometryRenderJobs.ToDictionary(
                job => job,
                job => previousLocalGeometryViewManagers.GetValueOrDefault(job)
                ?? localGeometryPreviewJobViewManagers.GetValueOrDefault(job)
                ?? new LocalGeometryViewManager(job, localGeometryPreviewJobViewManagers[localGeometryPreviewJobsByRenderJob[job]]));

            previousLocalGeometryViewManagers = new Dictionary <LocalGeometryJob, LocalGeometryViewManager>();
            foreach (var kvp in localGeometryPreviewJobViewManagers.Concat(localGeometryRenderJobViewManagers))
            {
                previousLocalGeometryViewManagers[kvp.Key] = kvp.Value;
            }

            //----------------------------------------------------------------------------------------
            // Return Terrain Overlay Network Manager
            //----------------------------------------------------------------------------------------
            var localGeometryViewManagerBySectorNodeDescription = nodeDescriptions.ToDictionary(
                nodeDescription => nodeDescription,
                nodeDescription => localGeometryRenderJobViewManagers[localGeometryRenderJobByNodeDescription[nodeDescription]]);
            var terrainOverlayNetworkManager = new TerrainOverlayNetworkManager(localGeometryViewManagerBySectorNodeDescription, edgeDescriptions);

            return(cachedSnapshot = new TerrainSnapshot {
                Version = descriptionStore.Version,
                NodeDescriptions = nodeDescriptions,
                EdgeDescriptions = edgeDescriptions,
                OverlayNetworkManager = terrainOverlayNetworkManager
            });
        }
コード例 #2
0
 /// <summary>
 /// For benchmarking purposes
 /// </summary>
 public void InvalidateCaches()
 {
     cachedSnapshot = null;
 }