private BuildingMeshBuilderProperties MakeProperties(VectorTileLayer layer) { var output = new BuildingMeshBuilderProperties { VectorTileLayer = layer, FeatureCount = layer?.FeatureCount() ?? 0, LayerFeatureFilters = SubLayerProperties.filterOptions.filters.Select(m => m.GetFilterComparer()).ToArray(), LayerFeatureFilterCombiner = new LayerFilterComparer() }; switch (SubLayerProperties.filterOptions.combinerType) { case LayerFilterCombinerOperationType.Any: output.LayerFeatureFilterCombiner = LayerFilterComparer.AnyOf(output.LayerFeatureFilters); break; case LayerFilterCombinerOperationType.All: output.LayerFeatureFilterCombiner = LayerFilterComparer.AllOf(output.LayerFeatureFilters); break; case LayerFilterCombinerOperationType.None: output.LayerFeatureFilterCombiner = LayerFilterComparer.NoneOf(output.LayerFeatureFilters); break; default: throw new ArgumentOutOfRangeException(); } output.BuildingsWithUniqueIds = SubLayerProperties.honorBuildingIdSetting && SubLayerProperties.buildingsWithUniqueIds; return(output); }
private void ProcessingFunction(BuildingMeshBuilderProperties properties, CustomTile tile) { for (var i = 0; i < properties.FeatureCount; ++i) { ProcessFeature(i, tile, properties); } CoroutineManager.Run(_processor.RunJob(tile)); }
private IEnumerator ProcessingRoutine(BuildingMeshBuilderProperties properties, CustomTile tile) { for (var i = 0; i < properties.FeatureCount; ++i) { ProcessFeature(i, tile, properties); yield return(null); } _processor.Terminate(tile); }
private void ProcessFeature(int index, CustomTile tile, BuildingMeshBuilderProperties layerProperties) { var layerExtent = layerProperties.VectorTileLayer.Extent; var fe = layerProperties.VectorTileLayer.GetFeature(index); List <List <Point2d <float> > > geom; if (layerProperties.BuildingsWithUniqueIds) { geom = fe.Geometry <float>(); if (geom[0][0].X <0 || geom[0][0].X> layerExtent || geom[0][0].Y <0 || geom[0][0].Y> layerExtent) { return; } } else { geom = fe.Geometry <float>(0); //passing zero means clip at tile edge } var feature = new CustomFeatureUnity( layerProperties.VectorTileLayer.GetFeature(index), geom, tile, layerProperties.VectorTileLayer.Extent, layerProperties.BuildingsWithUniqueIds); if (!IsFeatureEligibleAfterFiltering(feature, layerProperties) || tile == null || tile.VectorDataState == TilePropertyState.Cancelled) { return; } if (feature.Properties.ContainsKey("extrude") && !Convert.ToBoolean(feature.Properties["extrude"])) { return; } if (feature.Points.Count < 1) { return; } _processor.Execute(tile, feature); }
private static bool IsFeatureEligibleAfterFiltering(CustomFeatureUnity feature, BuildingMeshBuilderProperties layerProperties) { return(layerProperties.LayerFeatureFilters.Length < 1 || layerProperties.LayerFeatureFilterCombiner.Try((VectorFeatureUnity)feature)); }