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); }
public void Execute(CustomTile tile, CustomFeatureUnity feature) { var meshData = new MeshData { TileRect = tile.Rect }; if (!_accumulation.ContainsKey(tile)) { _accumulation.Add(tile, new MeshData { Edges = new List <int>(), Normals = new List <Vector3>(), Tangents = new List <Vector4>(), Triangles = new List <List <int> > { new List <int>() }, UV = new List <List <Vector2> > { new List <Vector2>() }, Vertices = new List <Vector3>() }); _indices.Add(tile, 0); } foreach (var modifier in _modifiers) { modifier.Run((VectorFeatureUnity)feature, meshData); } if (_accumulation[tile].Vertices.Count + meshData.Vertices.Count < 65000) { Append(tile, meshData); } else { Terminate(tile, meshData); } }
private static bool IsFeatureEligibleAfterFiltering(CustomFeatureUnity feature, BuildingMeshBuilderProperties layerProperties) { return(layerProperties.LayerFeatureFilters.Length < 1 || layerProperties.LayerFeatureFilterCombiner.Try((VectorFeatureUnity)feature)); }