public LocalGeometryViewManager(LocalGeometryJob job, LocalGeometryViewManager previewViewManager = null) { Job = job; PreviewViewManager = previewViewManager ?? this; }
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 }); }