Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
 private static bool IsFeatureEligibleAfterFiltering(CustomFeatureUnity feature, BuildingMeshBuilderProperties layerProperties)
 {
     return(layerProperties.LayerFeatureFilters.Length < 1 || layerProperties.LayerFeatureFilterCombiner.Try((VectorFeatureUnity)feature));
 }