private void GenerateBuildings()
    {
        long      startTicks = DateTime.Now.Ticks;
        const int maxTicks   = 500000;

        lock (newBuildingsData)
        {
            int newBuildingIndex = newBuildingsData.Count;
            while (newBuildingIndex > 0)
            {
                if (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)
                {
                    break;
                }

                newBuildingIndex--;
                OnlineMapsBuildingsNodeData data = newBuildingsData.Dequeue();
                CreateBuilding(data);

                data.Dispose();

                if (DateTime.Now.Ticks - startTicks > maxTicks)
                {
                    break;
                }
            }
        }

        OnlineMapsBuildingBuiltIn.roofIndices = null;
    }
    public void CreateBuilding(OnlineMapsBuildingsNodeData data)
    {
        if (OnCreateBuilding != null && !OnCreateBuilding(data))
        {
            return;
        }
        if (buildings.ContainsKey(data.way.id) || unusedBuildings.ContainsKey(data.way.id))
        {
            return;
        }

        OnlineMapsBuildingBase building = null;

        building = OnlineMapsBuildingBuiltIn.Create(this, data.way, data.nodes);

        if (building != null)
        {
            building.LoadMeta(data.way);
            if (OnBuildingCreated != null)
            {
                OnBuildingCreated(building);
            }
            unusedBuildings.Add(data.way.id, building);
        }
    }
示例#3
0
    public void CreateBuilding(OnlineMapsBuildingsNodeData data)
    {
        if (OnCreateBuilding != null && !OnCreateBuilding(data))
        {
            return;
        }
        if (buildings.ContainsKey(data.way.id) || unusedBuildings.ContainsKey(data.way.id))
        {
            return;
        }

        int initialZoom = map.buffer.renderState.zoom;

        OnlineMapsBuildingBase building = OnlineMapsBuildingBuiltIn.Create(this, data.way, data.nodes);

        if (building != null)
        {
            building.LoadMeta(data.way);
            if (OnBuildingCreated != null)
            {
                OnBuildingCreated(building);
            }
            unusedBuildings.Add(data.way.id, building);
            if (Math.Abs(map.buffer.lastState.floatZoom - initialZoom) > float.Epsilon)
            {
                UpdateBuildingScale(building);
            }
            building.transform.localScale.Scale(new Vector3(1, heightScale, 1));
        }
        else
        {
            //Debug.Log("Null building");
        }
    }
示例#4
0
    /// <summary>
    /// Creates a new building based on data
    /// </summary>
    /// <param name="data">Building data</param>
    public void CreateBuilding(OnlineMapsBuildingsNodeData data)
    {
        if (OnCreateBuilding != null && !OnCreateBuilding(data))
        {
            return;
        }
        if (buildings.ContainsKey(data.way.id) || unusedBuildings.ContainsKey(data.way.id))
        {
            return;
        }

        int initialZoom = map.buffer.apiZoom;

        OnlineMapsBuildingBase building = OnlineMapsBuildingBuiltIn.Create(this, data.way, data.nodes);

        if (building != null)
        {
            building.LoadMeta(data.way);
            if (OnBuildingCreated != null)
            {
                OnBuildingCreated(building);
            }
            unusedBuildings.Add(data.way.id, building);
            if (map.buffer.apiZoom != initialZoom)
            {
                UpdateBuildingScale(building);
            }
        }
        else
        {
            //Debug.Log("Null building");
        }
    }
示例#5
0
    private void GenerateBuildings()
    {
        long      startTicks = DateTime.Now.Ticks;
        const int maxTicks   = 500000;

        lock (newBuildingsData)
        {
            while (newBuildingsData.Count > 0)
            {
                if (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)
                {
                    break;
                }

                OnlineMapsBuildingsNodeData data = newBuildingsData[0];
                newBuildingsData.RemoveAt(0);

                if (OnCreateBuilding != null && !OnCreateBuilding(data))
                {
                    data.Dispose();
                    continue;
                }

                if (buildings.ContainsKey(data.way.id) || unusedBuildings.ContainsKey(data.way.id))
                {
                    data.Dispose();
                    continue;
                }

                OnlineMapsBuildingBase building = OnlineMapsBuildingBuiltIn.Create(this, data.way, data.nodes);
                if (building != null)
                {
                    building.LoadMeta(data.way);
                    if (OnBuildingCreated != null)
                    {
                        OnBuildingCreated(building);
                    }
                    unusedBuildings.Add(data.way.id, building);
                }

                data.Dispose();

                if (DateTime.Now.Ticks - startTicks > maxTicks)
                {
                    break;
                }
            }
        }

        OnlineMapsBuildingBuiltIn.usedNodes   = null;
        OnlineMapsBuildingBuiltIn.roofIndices = null;
    }
示例#6
0
    private bool GenerateBuildings()
    {
        long      startTicks      = DateTime.Now.Ticks;
        const int maxTicks        = 500000;
        bool      hasNewBuildings = false;

        lock (newBuildingsData)
        {
            int newBuildingIndex = newBuildingsData.Count;
            int needCreate       = newBuildingIndex;
            while (newBuildingIndex > 0)
            {
                if (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)
                {
                    break;
                }

                newBuildingIndex--;
                OnlineMapsBuildingsNodeData data = newBuildingsData.Dequeue();
                CreateBuilding(data);
                hasNewBuildings = true;

                data.Dispose();

                if (DateTime.Now.Ticks - startTicks > maxTicks)
                {
                    break;
                }
            }
            if (needCreate > 0 &&
                (newBuildingIndex == 0 || (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)) &&
                OnAllBuildingsCreated != null)
            {
                OnAllBuildingsCreated();
            }
        }

        OnlineMapsBuildingBase.roofIndices = null;
        return(hasNewBuildings);
    }
示例#7
0
    private void GenerateBuildings()
    {
        float       startTicks = Time.realtimeSinceStartup;
        const float maxTicks   = 0.05f;

        lock (newBuildingsData)
        {
            int newBuildingIndex = newBuildingsData.Count;
            int needCreate       = newBuildingIndex;

            while (newBuildingIndex > 0)
            {
                if (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)
                {
                    break;
                }

                newBuildingIndex--;
                OnlineMapsBuildingsNodeData data = newBuildingsData.Dequeue();
                CreateBuilding(data);
                needUpdatePosition = true;

                data.Dispose();

                if (Time.realtimeSinceStartup > maxTicks)
                {
                    break;
                }
            }
            if (needCreate > 0 &&
                (newBuildingIndex == 0 || (maxBuilding > 0 && unusedBuildings.Count + buildings.Count >= maxBuilding)) &&
                OnAllBuildingsCreated != null)
            {
                OnAllBuildingsCreated();
            }
        }

        OnlineMapsBuildingBase.roofIndices = null;
    }