Esempio n. 1
0
        public CustomFeatureUnity(VectorTileFeature feature, CustomTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
        {
            Data       = feature;
            Properties = Data.GetProperties();
            Points.Clear();
            Tile = tile;

            //this is a temp hack until we figure out how streets ids works
            _geom = buildingsWithUniqueIds ? feature.Geometry <float>() : feature.Geometry <float>(0);

            _rectSizex = tile.Rect.Size.x;
            _rectSizey = tile.Rect.Size.y;

            _geomCount = _geom.Count;
            for (var i = 0; i < _geomCount; i++)
            {
                _pointCount = _geom[i].Count;
                _newPoints  = new List <Vector3>(_pointCount);
                for (var j = 0; j < _pointCount; j++)
                {
                    var point = _geom[i][j];
                    _newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
                }
                Points.Add(_newPoints);
            }
        }
Esempio n. 2
0
        private void MakeEntity(CustomTile tile, MeshData value)
        {
            var go = new GameObject($"Building {_indices[tile]++.ToString()}");

            go.transform.position = tile.Position;
            go.transform.SetParent(tile.Transform, true);

            var filter = go.AddComponent <MeshFilter>();

            filter.sharedMesh = new Mesh();
            go.AddComponent <MeshRenderer>().sharedMaterial = BuildingMaterial;

            filter.sharedMesh.subMeshCount = value.Triangles.Count;
            filter.sharedMesh.SetVertices(value.Vertices);
            filter.sharedMesh.SetNormals(value.Normals);

            for (var i = 0; i < value.Triangles.Count; i++)
            {
                filter.sharedMesh.SetTriangles(value.Triangles[i], i);
            }

            for (var i = 0; i < value.UV.Count; i++)
            {
                filter.sharedMesh.SetUVs(i, value.UV[i]);
            }
            go.layer = LayerMask.NameToLayer("Buildings");
        }
Esempio n. 3
0
        private void OnImageReceived(CustomTile tile, RasterTile rasterTile)
        {
            if (tile == null)
            {
                return;
            }
            TilesWaitingResponse.Remove(tile);
            var raster = new Texture2D(512, 512, TextureFormat.RGB24, false)
            {
                wrapMode = TextureWrapMode.Clamp
            };

            raster.LoadImage(rasterTile.Data);
            raster.Compress(true);
            _textures[tile.TextureIndex]         = raster;
            _combineInstances[tile.TextureIndex] = new CombineInstance
            {
                mesh      = tile.QuadMesh,
                transform = tile.Transform.parent.localToWorldMatrix * tile.Transform.localToWorldMatrix
            };
            tile.ClearMesh();

            if (++_counter == ManhattanTileProvider.Tiles.Count)
            {
                OnComplete();
            }
        }
Esempio n. 4
0
        public void Create(VectorTileLayer layer, CustomTile tile)
        {
            if (tile == null || layer == null)
            {
                return;
            }
            var properties = MakeProperties(layer);

            CoroutineManager.Run(ProcessingRoutine(properties, tile));
        }
Esempio n. 5
0
        public void Terminate(CustomTile tile)
        {
            if (_accumulation.TryGetValue(tile, out var value) && value.Vertices.Count > 3)
            {
                MakeEntity(tile, value);
            }

            tile.VectorDataState = TilePropertyState.Loaded;
            _accumulation.Remove(tile);
        }
Esempio n. 6
0
        private void Terminate(CustomTile tile, MeshData data)
        {
            if (!_accumulation.TryGetValue(tile, out var value) || value.Vertices.Count <= 3)
            {
                return;
            }

            MakeEntity(tile, value);
            _accumulation[tile] = data;
        }
Esempio n. 7
0
 protected override void OnRegistered(CustomTile tile)
 {
     tile.VectorDataState = TilePropertyState.Loading;
     TilesWaitingResponse.Add(tile);
     _dataFetcher.FetchData(new BuildingMeshFetcherParameters
     {
         canonicalTileId   = tile.CanonicalTileId,
         tilesetId         = TilesetId,
         cTile             = tile,
         useOptimizedStyle = false,
         style             = _sourceOptions.layerSource
     });
 }
Esempio n. 8
0
        private void OnVectorDataReceived(CustomTile tile, VectorTile vectorTile)
        {
            if (tile == null)
            {
                return;
            }
            TilesWaitingResponse.Remove(tile);

            _builder.Create(vectorTile.Data.GetLayer(DronesMap.LayerName), tile);

            if (++_counter != ManhattanTileProvider.Tiles.Count)
            {
                return;
            }
            AllBuildingsLoaded?.Invoke();
        }
Esempio n. 9
0
        protected override void OnRegistered(CustomTile tile)
        {
            if (Properties.sourceType != ImagerySourceType.Custom)
            {
                Properties.sourceOptions.layerSource = MapboxDefaultImagery.GetParameters(Properties.sourceType);
            }
            var parameters = new TerrainImageFetcherParameters
            {
                canonicalTileId = tile.CanonicalTileId,
                tilesetId       = TilesetId,
                cTile           = tile,
                useRetina       = Properties.rasterOptions.useRetina
            };

            _dataFetcher.FetchData(parameters);
        }
Esempio n. 10
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);
        }
Esempio n. 11
0
        private void Append(CustomTile tile, MeshData data)
        {
            if (!_accumulation.TryGetValue(tile, out var value))
            {
                value = _accumulation[tile] = data;
            }
            if (data.Vertices.Count <= 3)
            {
                return;
            }
            var st = value.Vertices.Count;

            value.Vertices.AddRange(data.Vertices);
            value.Normals.AddRange(data.Normals);

            for (var j = 0; j < data.UV.Count; j++)
            {
                if (value.UV.Count <= j)
                {
                    value.UV.Add(new List <Vector2>(data.UV[j].Count));
                }
            }

            for (var j = 0; j < data.UV.Count; j++)
            {
                value.UV[j].AddRange(data.UV[j]);
            }

            for (var j = 0; j < data.Triangles.Count; j++)
            {
                if (value.Triangles.Count <= j)
                {
                    value.Triangles.Add(new List <int>(data.Triangles[j].Count));
                }
            }

            for (var j = 0; j < data.Triangles.Count; j++)
            {
                for (var k = 0; k < data.Triangles[j].Count; k++)
                {
                    value.Triangles[j].Add(data.Triangles[j][k] + st);
                }
            }
        }
Esempio n. 12
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);
            }
        }
Esempio n. 13
0
        public CustomFeatureUnity(VectorTileFeature feature, List <List <Point2d <float> > > geom, CustomTile tile, float layerExtent, bool buildingsWithUniqueIds = false)
        {
            Data       = feature;
            Properties = Data.GetProperties();
            Points.Clear();
            Tile  = tile;
            _geom = geom;

            _rectSizex = tile.Rect.Size.x;
            _rectSizey = tile.Rect.Size.y;

            _geomCount = _geom.Count;
            for (var i = 0; i < _geomCount; i++)
            {
                _pointCount = _geom[i].Count;
                _newPoints  = new List <Vector3>(_pointCount);
                for (var j = 0; j < _pointCount; j++)
                {
                    var point = _geom[i][j];
                    _newPoints.Add(new Vector3((float)(point.X / layerExtent * _rectSizex - (_rectSizex / 2)) * tile.TileScale, 0, (float)((layerExtent - point.Y) / layerExtent * _rectSizey - (_rectSizey / 2)) * tile.TileScale));
                }
                Points.Add(_newPoints);
            }
        }
Esempio n. 14
0
 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);
 }
Esempio n. 15
0
 protected abstract void OnRegistered(CustomTile tile);
Esempio n. 16
0
 public void Register(CustomTile tile)
 {
     OnRegistered(tile);
 }