Exemple #1
0
        public override void OnSaveData()
        {
            LoggerUtils.Log("Saving props");

            BinaryFormatter binaryFormatter  = new BinaryFormatter();
            MemoryStream    propMemoryStream = new MemoryStream();

            try
            {
                PropWrapper[] propInfos = PropUnlimiterManager.instance.GetAllPropWrappers();
                if (propInfos != null)
                {
                    binaryFormatter.Serialize(propMemoryStream, propInfos);
                    serializableDataManager.SaveData(dataKey, propMemoryStream.ToArray());
                    LoggerUtils.Log("Props have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save props, as the array is null!");
                }
            }
            catch (Exception e)
            {
                LoggerUtils.LogError(e);
            }
        }
        /// <summary>
        /// Load all options from the disk.
        /// </summary>
        public static void LoadPropInfo()
        {
            if (File.Exists("BAPropPositioningInfo.xml"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(PropPositioningInfoObject[]), new XmlRootAttribute()
                {
                    ElementName = "PropPositioningInfo"
                });
                StreamReader reader = new StreamReader("BAPropPositioningInfo.xml");
                Dictionary <string, PropPositioningInfo> routeShieldDict = ((PropPositioningInfoObject[])serializer.Deserialize(reader)).ToDictionary(i => i.key, i => i.value);
                reader.Close();

                if (routeShieldDict != null)
                {
                    Instance().propPositioningDict = routeShieldDict;

                    LoggerUtils.Log("Loaded prop position info file.");
                }
                else
                {
                    Instance().propPositioningDict = fallbackDict;
                    LoggerUtils.LogError("Created prop position file is invalid!");
                }
            }
            else
            {
                Instance().propPositioningDict = fallbackDict;
                LoggerUtils.LogWarning("Could not load the prop position file!");
            }
        }
        private Region GetSolution(Model model)
        {
            if (model == null)
            {
                return(null);
            }

            var region = new Region()
            {
                Rows = m_program.GetConst("rows").Number,
                Cols = m_program.GetConst("cols").Number,
            };

            region.Parcels = new Parcel[region.Rows, region.Cols];

            var atoms = model.GetSymbols(shown: true);

            LoggerUtils.Log($"Atoms count: {atoms.Count}");

            foreach (var symbol in atoms)
            {
                if (symbol.Name.Equals("parcel"))
                {
                    var arguments = symbol.Arguments;
                    LoggerUtils.Log($"{symbol} - ({arguments[0].Number}, {arguments[1].Number}, {arguments[2].Number})");
                    region.Parcels[arguments[0].Number, arguments[1].Number] = (Parcel)arguments[2].Number;
                }
            }

            return(region);
        }
        private void LoadProgram()
        {
            try
            {
                m_program = new Control(args: new List <string>()
                {
                    m_maxSolutions.ToString(), "--const", $"rows={m_rows}", "--const", $"cols={m_cols}"
                });

                LoggerUtils.Log("Loading definition files");

                m_program.Load(ClingoConstants.ItemDefinitionFile);
                m_program.Load(ClingoConstants.IndustryGeneratorFile);

                LoggerUtils.Log("Grounding program");

                var parts = new List <Tuple <string, List <Symbol> > >()
                {
                    new Tuple <string, List <Symbol> >("base", new List <Symbol>())
                };
                m_program.Ground(parts);

                LoggerUtils.Log("Solving program");
                m_solver = m_program.Solve(yield: true);
            }
            catch (Exception ex)
            {
                LoggerUtils.Error(ex, "cannot load logic program: ");
            }
        }
Exemple #5
0
        public Task <ResultInfo> SendMessageAsync(CreateHelpRequest message, string appName = null)
        {
            return(RetryUtils.DoAsync(async() =>
            {
                var text = new StringBuilder();
                if (!string.IsNullOrEmpty(appName))
                {
                    text.AppendLine($"*AppName:* {appName}");
                }
                text.AppendLine($"*From:* {message.Email}");
                text.AppendLine($"*Subject:* {message.Subject}");
                text.AppendLine($"*Description:* {message.Description}");

                var slack = new SlackClient(_options.Url);
                var slackMessage = new SlackMessage()
                {
                    Channel = _options.Channel,
                    Text = text.ToString(),
                    Username = _options.Username,
                    IconEmoji = Emoji.Angel
                };
                return await slack.PostAsync(slackMessage) ? new ResultInfo(HttpStatusCode.OK) : new ResultInfo(HttpStatusCode.BadRequest, "Error in post message");
            },
                                      TimeSpan.FromMilliseconds(500),
                                      3,
                                      false,
                                      exception => { LoggerUtils.Log("SlackManager exception", exception, nameof(SlackManager)); }));
        }
Exemple #6
0
        public override void OnSaveData()
        {
            LoggerUtils.Log("Saving routes and signs");

            BinaryFormatter binaryFormatter         = new BinaryFormatter();
            MemoryStream    routeMemoryStream       = new MemoryStream();
            MemoryStream    signMemoryStream        = new MemoryStream();
            MemoryStream    dynamicSignMemoryStream = new MemoryStream();

            try
            {
                RouteContainer[]       routeNames   = RouteManager.Instance().SaveRoutes();
                SignContainer[]        signs        = RouteManager.Instance().m_signList.ToArray();
                DynamicSignContainer[] dynamicSigns = RouteManager.Instance().m_dynamicSignList.ToArray();

                if (routeNames != null)
                {
                    binaryFormatter.Serialize(routeMemoryStream, routeNames);
                    serializableDataManager.SaveData(routeDataKey, routeMemoryStream.ToArray());
                    LoggerUtils.Log("Routes have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save routes, as the array is null!");
                }

                if (signs != null)
                {
                    binaryFormatter.Serialize(signMemoryStream, signs);
                    serializableDataManager.SaveData(signDataKey, signMemoryStream.ToArray());
                    LoggerUtils.Log("Signs have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save signs, as the array is null!");
                }

                if (dynamicSignMemoryStream != null)
                {
                    binaryFormatter.Serialize(dynamicSignMemoryStream, dynamicSigns);
                    serializableDataManager.SaveData(dynamicSignDataKey, dynamicSignMemoryStream.ToArray());
                    LoggerUtils.Log("Dynamic signs have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save dynamic signs, as the array is null!");
                }
            }
            catch (Exception ex)
            {
                LoggerUtils.LogException(ex);
            }
            finally
            {
                routeMemoryStream.Close();
            }
        }
Exemple #7
0
        public void SaveOptions()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(OptionsManager));
            StreamWriter  writer     = new StreamWriter(FILE_NAME);

            serializer.Serialize(writer, OptionsManager.mInstance);
            writer.Close();
            LoggerUtils.Log("Settings saved");
        }
Exemple #8
0
        protected override void OnToolUpdate()
        {
            if (m_toolController != null && !m_toolController.IsInsideUI && Cursor.visible)
            {
                RaycastOutput raycastOutput;

                if (RaycastRoad(out raycastOutput))
                {
                    ushort netSegmentId = raycastOutput.m_netSegment;

                    if (netSegmentId != 0)
                    {
                        NetManager netManager = Singleton <NetManager> .instance;
                        NetSegment netSegment = netManager.m_segments.m_buffer[(int)netSegmentId];

                        if (netSegment.m_flags.IsFlagSet(NetSegment.Flags.Created))
                        {
                            if (Event.current.type == EventType.MouseDown /*&& Event.current.button == (int)UIMouseButton.Left*/)
                            {
                                Vector3 pos1;
                                Vector3 pos2;
                                Vector3 rot1;
                                Vector3 rot2;
                                bool    smooth1;
                                bool    smooth2;

                                netSegment.CalculateCorner(netSegmentId, true, true, true, out pos1, out rot1, out smooth1);
                                netSegment.CalculateCorner(netSegmentId, true, false, true, out pos2, out rot2, out smooth2);
                                LoggerUtils.Log(string.Format("pos:{0},rot:{1}", pos1, rot1));
                                LoggerUtils.Log(string.Format("pos:{0},rot:{1}", pos2, rot2));
                                Vector3 diff  = pos2 - pos1;
                                float   angle = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
                                LoggerUtils.Log(string.Format("angle:{0}", angle));

                                ShowToolInfo(false, null, new Vector3());
                                VehicleInfo info = VehicleHolder.getInstance().getVehicleInfo();
                                VehicleHolder.getInstance().setActive(netSegment.m_middlePosition, Vector3.zero);

                                //unset self as tool
                                ToolsModifierControl.toolController.CurrentTool = ToolsModifierControl.GetTool <DefaultTool>();
                                ToolsModifierControl.SetTool <DefaultTool>();
                                UnityEngine.Object.Destroy(this);
                            }
                            else
                            {
                                ShowToolInfo(true, "Spawn Vehicle", netSegment.m_bounds.center);
                            }
                        }
                    }
                }
            }
            else
            {
                ShowToolInfo(false, null, new Vector3());
            }
        }
        /// <summary>
        /// Invoked when the tool is disabled
        /// </summary>
        protected override void OnDisable()
        {
            LoggerUtils.Log("Disabled");

            base.OnDisable();

            m_optionPanel.Hide();

            m_action.OnLeftController();
            m_action = null;
        }
        /// <summary>
        /// Invoked when the tool is enabled
        /// </summary>
        protected override void OnEnable()
        {
            LoggerUtils.Log("Enabled");

            base.OnEnable();

            m_optionPanel.Show();

            m_action = m_zoningAction;
            m_action.OnEnterController();
        }
Exemple #11
0
 public override void OnCreated(ILoading loading)
 {
     try
     {
         JsonMapper.RegisterExporter <float>((obj, writer) => writer.Write(Convert.ToDouble(obj)));
         JsonMapper.RegisterImporter <double, float>(input => Convert.ToSingle(input));
     }
     catch (NullReferenceException e)
     {
         LoggerUtils.Log("Failure at jsonmapper!");
     }
 }
        /// <summary>
        /// Save all options from the disk.
        /// </summary>
        public static void SavePropInfo()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(PropPositioningInfoObject[]), new XmlRootAttribute()
            {
                ElementName = "PropPositioningInfo"
            });
            StreamWriter writer = new StreamWriter("RouteShieldOptions.xml");

            serializer.Serialize(writer, instance.propPositioningDict.Select(kv => new PropPositioningInfoObject()
            {
                key = kv.Key, value = kv.Value
            }).ToArray());
            writer.Close();

            LoggerUtils.Log("Saved route shield info file.");
        }
        public override void OnSaveData()
        {
            LoggerUtils.Log("Saving Screen Objects");

            BinaryFormatter binaryFormatter    = new BinaryFormatter();
            MemoryStream    propDictStream     = new MemoryStream();
            MemoryStream    buildingDictStream = new MemoryStream();

            try
            {
                ScreenObj[] propDict     = ScreenManager.instance.saveScreen(true);
                ScreenObj[] buildingDict = ScreenManager.instance.saveScreen(false);

                if (propDict != null)
                {
                    binaryFormatter.Serialize(propDictStream, propDict);
                    serializableDataManager.SaveData(propDictKey, propDictStream.ToArray());
                    LoggerUtils.Log("Prop screen objs have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save props, as the array is null!");
                }


                if (buildingDict != null)
                {
                    binaryFormatter.Serialize(buildingDictStream, buildingDict);
                    serializableDataManager.SaveData(buildingDictKey, buildingDictStream.ToArray());
                    LoggerUtils.Log("building screen objs have been saved!");
                }
                else
                {
                    LoggerUtils.LogWarning("Couldn't save buildings, as the array is null!");
                }
            }
            catch (Exception ex)
            {
                LoggerUtils.LogException(ex);
            }
            finally
            {
                buildingDictStream.Close();
                propDictStream.Close();
            }
        }
Exemple #14
0
 public void LoadOptions()
 {
     LoggerUtils.Log("Starting settings load");
     if (File.Exists(FILE_NAME))
     {
         XmlSerializer  xmlSerialiser  = new XmlSerializer(typeof(OptionsManager));
         StreamReader   reader         = new StreamReader(FILE_NAME);
         OptionsManager optionsManager = xmlSerialiser.Deserialize(reader) as OptionsManager;
         reader.Close();
         LoggerUtils.Log(optionsManager.mMaxVelocity.ToString());
         if (optionsManager != null)
         {
             mInstance = optionsManager;
         }
         LoggerUtils.Log("Settings read");
     }
 }
        /// <summary>
        /// Invoked when the tool is created
        /// </summary>
        protected override void Awake()
        {
            base.Awake();

            m_toolController = FindObjectOfType <ToolController>();
            name             = ObjectName;

            LoggerUtils.Log("Loading IndustryLP");

            SetupToolbarButton();
            SetupTutorialPanel();
            SetupOptionPanel();
            SetupScrollablePanel();
            SetupActions();
            SetupDistributions();

            LoggerUtils.Log("Finished");
        }
Exemple #16
0
        public Task <ResultInfo> AddRequestAsync(CreateHelpRequest model)
        {
            return(RetryUtils.DoAsync(async() =>
            {
                var baseUrl = new Uri(new Uri(_options.Url), _addRequestApiMethod);
                var client = new RestClient(baseUrl);

                var request = new RestRequest(Method.POST);
                var outgoingQueryString = HttpUtility.ParseQueryString(string.Empty);
                outgoingQueryString.Add("apikey", _options.ApiKey);
                outgoingQueryString.Add("group", _options.Group);
                outgoingQueryString.Add("businessUnit", _options.BusinessUnit);
                outgoingQueryString.Add("email", model.Email);
                outgoingQueryString.Add("subject", model.Subject);
                outgoingQueryString.Add("description", model.Description);
                var postdata = outgoingQueryString.ToString();

                request.AddParameter("application/x-www-form-urlencoded", postdata, ParameterType.RequestBody);

                var response = await client.ExecuteTaskAsync(request);

                if (!response.IsSuccessful)
                {
                    LoggerUtils.Log($"HelpDesk API request was failed with code: {response.StatusCode}" + Environment.NewLine
                                    + $"Response: {response.Content}",
                                    _logFileName);
                    return new ResultInfo(response.StatusCode, _invalidRequestMessage);
                }

                var responseModel = JsonConvert.DeserializeObject <CreateHelpDeskRequestResponse>(response.Content);

                if (responseModel.Response.Result.Status == CreateHelpDeskRequestResponse.Status.Failure)
                {
                    LoggerUtils.Log($"HelpDesk API AddRequest was failed with message: {responseModel.Response.Result.Message}", _logFileName);
                    return new ResultInfo(HttpStatusCode.BadRequest, _invalidRequestMessage);
                }

                return new ResultInfo(HttpStatusCode.OK);
            },
                                      TimeSpan.FromMilliseconds(500),
                                      3,
                                      false,
                                      exception => { LoggerUtils.Log("HelpDeskManager exception", exception, _logFileName); }));
        }
        public static bool Prefix(ref PropInfo info, ref Vector3 position, ref float angle, ref bool single)
        {
            if (!(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)))
            {
                return(true);
            }
            else
            {
#if DEBUG
                string str = String.Format("Invoking prop at:{0}, angle:{1}, info:{2}", position, angle, info.GetLocalizedTitle());
                LoggerUtils.Log(str);
#endif
                PropUnlimiterManager.instance.SetUnlimitedProp(info.m_prefabDataIndex, position, angle, single);
                PropTool.DispatchPlacementEffect(position, true);
                PropManager.instance.UpdateProp(0);
                PropManager.instance.UpdatePropRenderer(0, true);
                return(false);
            }
        }
        public void Update()
        {
            if (IsAlive && !IsFinished)
            {
                //LoggerUtils.Log("Getting new model");

                Model model = NewSolution();

                if (model != null)
                {
                    LoggerUtils.Log($"Saving model: {model}");
                    m_results.Add(GetSolution(model));
                }
                else
                {
                    //LoggerUtils.Log("Finished!");
                    IsFinished = true;
                }
            }
        }
Exemple #19
0
        public override void OnLoadData()
        {
            LoggerUtils.Log("Loading data");
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            lock (thisLock)
            {
                byte[] loadedPropData = serializableDataManager.LoadData(dataKey);
                LoggerUtils.Log("Props loaded, parsing data");
                if (loadedPropData != null && loadedPropData.Length > 0)
                {
                    MemoryStream memoryStream = new MemoryStream(loadedPropData);

                    try
                    {
                        PropWrapper[] props = binaryFormatter.Deserialize(memoryStream) as PropWrapper[];

                        if (props != null && props.Length > 0)
                        {
                            PropUnlimiterManager.instance.LoadWrappers(props.ToList());
                        }
                        else
                        {
                            LoggerUtils.LogWarning("Couldn't load props, as the array is null!");
                        }
                    }
                    catch (Exception ex)
                    {
                        LoggerUtils.LogException(ex);
                    }
                    finally
                    {
                        memoryStream.Close();
                    }
                }
                else
                {
                    LoggerUtils.LogWarning("Found no data to load");
                }
            }
        }
        protected override void Awake()
        {
            base.Awake();

            LoggerUtils.Log("Initialising RoadRenderingManager");

            if (!LoadPropMeshes())
            {
                LoggerUtils.LogError("Failed to load some props!");
            }
            else
            {
                LoggerUtils.Log("Props loaded!");
            }

            replaceProp(ModSettings.Instance().settings.Contains("loadMotorwaySigns") ? (bool)ModSettings.Instance().settings["loadMotorwaySigns"] : true);

            DistrictManager districtManager = DistrictManager.instance;

            ShaderUtils.m_shaderStore.Add("fallback", districtManager.m_properties.m_areaNameShader);

            //Only start dynamic signs after everything's loaded
            RenderingManager.instance.initTimer();
        }
Exemple #21
0
        public override void OnLoadData()
        {
            LoggerUtils.Log("Loading routes");

            byte[] loadedRouteData       = serializableDataManager.LoadData(routeDataKey);
            byte[] loadedSignData        = serializableDataManager.LoadData(signDataKey);
            byte[] loadedDynamicSignData = serializableDataManager.LoadData(dynamicSignDataKey);

            if (loadedRouteData != null)
            {
                MemoryStream routeMemoryStream = new MemoryStream();

                routeMemoryStream.Write(loadedRouteData, 0, loadedRouteData.Length);
                routeMemoryStream.Position = 0;

                BinaryFormatter binaryFormatter = new BinaryFormatter();

                try
                {
                    RouteContainer[] routeNames = binaryFormatter.Deserialize(routeMemoryStream) as RouteContainer[];

                    if (routeNames != null)
                    {
                        RouteManager.Instance().Load(routeNames);
                    }
                    else
                    {
                        LoggerUtils.LogWarning("Couldn't load routes, as the array is null!");
                    }
                }
                catch (Exception ex)
                {
                    LoggerUtils.LogException(ex);
                }
                finally
                {
                    routeMemoryStream.Close();
                }
            }
            else
            {
                LoggerUtils.LogWarning("Found no data to load");
            }

            if (loadedSignData != null)
            {
                MemoryStream signMemoryStream = new MemoryStream();

                signMemoryStream.Write(loadedSignData, 0, loadedSignData.Length);
                signMemoryStream.Position = 0;

                BinaryFormatter binaryFormatter = new BinaryFormatter();

                try
                {
                    SignContainer[] signNames = binaryFormatter.Deserialize(signMemoryStream) as SignContainer[];

                    if (signNames != null)
                    {
                        RouteManager.Instance().LoadSigns(signNames);
                    }
                    else
                    {
                        LoggerUtils.LogWarning("Couldn't load routes, as the array is null!");
                    }
                }
                catch (Exception ex)
                {
                    LoggerUtils.LogException(ex);
                }
                finally
                {
                    signMemoryStream.Close();
                }
            }
            else
            {
                LoggerUtils.LogWarning("Found no data to load");
            }

            if (loadedDynamicSignData != null)
            {
                MemoryStream dynamicSignMemoryStream = new MemoryStream();

                dynamicSignMemoryStream.Write(loadedDynamicSignData, 0, loadedDynamicSignData.Length);
                dynamicSignMemoryStream.Position = 0;

                BinaryFormatter binaryFormatter = new BinaryFormatter();

                try
                {
                    DynamicSignContainer[] signNames = binaryFormatter.Deserialize(dynamicSignMemoryStream) as DynamicSignContainer[];

                    if (signNames != null)
                    {
                        RouteManager.Instance().LoadDynamicSigns(signNames);
                    }
                    else
                    {
                        LoggerUtils.LogWarning("Couldn't load routes, as the array is null!");
                    }
                }
                catch (Exception ex)
                {
                    LoggerUtils.LogException(ex);
                }
                finally
                {
                    dynamicSignMemoryStream.Close();
                }
            }
            else
            {
                LoggerUtils.LogWarning("Found no data to load");
            }
        }
Exemple #22
0
        protected override void Awake()
        {
            LoggerUtils.Log("Tool awake");

            base.Awake();
        }
Exemple #23
0
        protected override void Awake()
        {
            LoggerUtils.Log("Sign deletion Tool awake");

            base.Awake();
        }
        public override void OnLoadData()
        {
            LoggerUtils.Log("Loading routes");

            byte[] loadPropDict     = serializableDataManager.LoadData(propDictKey);
            byte[] loadBuildingDict = serializableDataManager.LoadData(buildingDictKey);

            if (loadPropDict != null)
            {
                MemoryStream propDictStream = new MemoryStream();

                propDictStream.Write(loadPropDict, 0, loadPropDict.Length);
                propDictStream.Position = 0;

                BinaryFormatter binaryFormatter = new BinaryFormatter();

                try
                {
                    ScreenObj[] propArray = binaryFormatter.Deserialize(propDictStream) as ScreenObj[];

                    if (propArray != null)
                    {
                        ScreenManager.instance.loadScreen(true, propArray);
                    }
                    else
                    {
                        LoggerUtils.LogWarning("Couldn't load props, as the array is null!");
                    }
                }
                catch (Exception ex)
                {
                    LoggerUtils.LogException(ex);
                }
                finally
                {
                    propDictStream.Close();
                }
            }
            else
            {
                LoggerUtils.LogWarning("Found no data to load");
            }

            if (loadBuildingDict != null)
            {
                MemoryStream buildingPropDict = new MemoryStream();

                buildingPropDict.Write(loadBuildingDict, 0, loadBuildingDict.Length);
                buildingPropDict.Position = 0;

                BinaryFormatter binaryFormatter = new BinaryFormatter();

                try
                {
                    ScreenObj[] buildingArray = binaryFormatter.Deserialize(buildingPropDict) as ScreenObj[];

                    if (buildingArray != null)
                    {
                        ScreenManager.instance.loadScreen(false, buildingArray);
                    }
                    else
                    {
                        LoggerUtils.LogWarning("Couldn't load building, as the array is null!");
                    }
                }
                catch (Exception ex)
                {
                    LoggerUtils.LogException(ex);
                }
                finally
                {
                    buildingPropDict.Close();
                }
            }
            else
            {
                LoggerUtils.LogWarning("Found no data to load");
            }
        }
Exemple #25
0
 public void initTimer()
 {
     interval = 5000;
     LoggerUtils.Log("Timer started!");
 }
        /// <summary>
        /// Redraw the text to be drawn later with a mesh. Use sparingly, as
        /// this is an expensive task.
        /// </summary>
        private void RenderText()
        {
            DistrictManager districtManager = DistrictManager.instance;
            NetManager      netManager      = NetManager.instance;

            if (districtManager.m_properties.m_areaNameFont != null)
            {
                UIFontManager.Invalidate(districtManager.m_properties.m_areaNameFont);

                foreach (RouteContainer route in RouteManager.Instance().m_routeDict.Values)
                {
                    if (route.m_segmentId != 0)
                    {
                        string routeStr = route.m_route;

                        if (routeStr != null)
                        {
                            NetSegment       netSegment   = netManager.m_segments.m_buffer[route.m_segmentId];
                            NetSegment.Flags segmentFlags = netSegment.m_flags;

                            if (segmentFlags.IsFlagSet(NetSegment.Flags.Created))
                            {
                                //Load a route shield type ( generic motorway shield should be default value )
                                RouteShieldInfo shieldInfo = RouteShieldConfig.Instance().GetRouteShieldInfo(route.m_routePrefix);

                                NetNode startNode         = netManager.m_nodes.m_buffer[netSegment.m_startNode];
                                NetNode endNode           = netManager.m_nodes.m_buffer[netSegment.m_endNode];
                                Vector3 startNodePosition = startNode.m_position;

                                if (!SpriteUtils.m_textureStore.ContainsKey(shieldInfo.textureName))
                                {
                                    LoggerUtils.Log("WTF, No texture found for route shield" + shieldInfo.textureName);
                                }
                                Material mat = SpriteUtils.m_textureStore[shieldInfo.textureName];
                                route.m_shieldObject.GetComponent <Renderer>().material = mat;

                                //TODO: Make mesh size dependent on text size
                                route.m_shieldMesh.mesh = MeshUtils.CreateRectMesh(mat.mainTexture.width, mat.mainTexture.height);
                                route.m_shieldMesh.transform.position = startNodePosition;

                                route.m_shieldMesh.transform.LookAt(endNode.m_position, Vector3.up);
                                route.m_shieldMesh.transform.Rotate(90f, 0f, 90f);

                                //TODO: Bind the elevation of the mesh to the text z offset
                                route.m_shieldMesh.transform.position  += (Vector3.up * (0.5f));
                                route.m_shieldMesh.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
                                route.m_shieldObject.GetComponent <Renderer>().sortingOrder = 1000;

                                route.m_numMesh.anchor = TextAnchor.MiddleCenter;

                                route.m_numMesh.font = FontUtils.m_fontStore.ContainsKey("Highway Gothic") ? FontUtils.m_fontStore["Highway Gothic"] : districtManager.m_properties.m_areaNameFont.baseFont;
                                route.m_numMesh.GetComponent <Renderer>().material = route.m_numMesh.font.material;
                                if (ShaderUtils.m_shaderStore.ContainsKey("font"))
                                {
                                    route.m_numMesh.GetComponent <Renderer>().material.shader = ShaderUtils.m_shaderStore["font"];
                                }
                                else
                                {
                                    route.m_numMesh.GetComponent <Renderer>().material.shader = ShaderUtils.m_shaderStore["fallback"];
                                }
                                //TODO: Tie the font size to the font size option
                                route.m_numMesh.fontSize           = 50;
                                route.m_numMesh.transform.position = startNode.m_position;
                                route.m_numMesh.transform.parent   = route.m_shieldObject.transform;

                                route.m_numMesh.transform.LookAt(endNode.m_position, Vector3.up);
                                route.m_numMesh.transform.Rotate(90f, 0f, 90f);

                                route.m_numMesh.transform.position = route.m_shieldObject.GetComponent <Renderer>().bounds.center;
                                //Just a hack, to make sure the text actually shows up above the shield
                                route.m_numMesh.offsetZ = 0.001f;
                                //TODO: Definitely get a map of the texture to the required text offsets
                                route.m_numMesh.transform.localPosition += (Vector3.up * shieldInfo.upOffset);
                                route.m_numMesh.transform.localPosition += (Vector3.left * shieldInfo.leftOffset);
                                //TODO: Figure out a better ratio for route markers
                                route.m_numMesh.transform.localScale = new Vector3(shieldInfo.textScale, shieldInfo.textScale, shieldInfo.textScale);
                                route.m_numMesh.GetComponent <Renderer>().material.color = shieldInfo.textColor;
                                route.m_numMesh.text = route.m_route.ToString();
                            }
                        }
                    }
                }

                foreach (SignContainer sign in RouteManager.Instance().m_signList)
                {
                    Vector3      position     = new Vector3(sign.x, sign.y, sign.z);
                    string       signPropType = (sign.m_exitNum == null || !m_signPropDict.ContainsKey(sign.m_exitNum)) ? "hwysign" : sign.m_exitNum;
                    SignPropInfo signPropInfo = SignPropConfig.signPropInfoDict[signPropType];
                    int          numSignProps = signPropInfo.isDoubleGantry ? 2 : 1;

                    sign.m_sign.GetComponent <Renderer>().material = m_signPropDict[signPropType].m_material;
                    //TODO: Make mesh size dependent on text size
                    sign.m_sign.mesh = m_signPropDict[signPropType].m_mesh;
                    sign.m_sign.transform.position = position;

                    if (sign.m_routePrefix != null)
                    {
                        RouteShieldInfo shieldInfo = RouteShieldConfig.Instance().GetRouteShieldInfo(sign.m_routePrefix);
                        Material        mat        = SpriteUtils.m_textureStore[shieldInfo.textureName];
                        sign.m_shieldObject.GetComponent <Renderer>().material = mat;

                        //TODO: Make mesh size dependent on text size
                        sign.m_shieldMesh.mesh = MeshUtils.CreateRectMesh(mat.mainTexture.width, mat.mainTexture.height);
                        sign.m_shieldMesh.transform.position = position;

                        //TODO: Bind the elevation of the mesh to the text z offset
                        sign.m_shieldMesh.transform.position  += (Vector3.up * (0.5f));
                        sign.m_shieldMesh.transform.localScale = signPropInfo.shieldScale;
                        sign.m_shieldObject.GetComponent <Renderer>().sortingOrder = 1000;

                        sign.m_numMesh.anchor = TextAnchor.MiddleCenter;
                        sign.m_numMesh.font   = FontUtils.m_fontStore.ContainsKey("Highway Gothic") ? FontUtils.m_fontStore["Highway Gothic"] : districtManager.m_properties.m_areaNameFont.baseFont;
                        sign.m_numMesh.GetComponent <Renderer>().material = sign.m_numMesh.font.material;
                        if (ShaderUtils.m_shaderStore.ContainsKey("font"))
                        {
                            sign.m_numMesh.GetComponent <Renderer>().material.shader = ShaderUtils.m_shaderStore["font"];
                        }
                        else
                        {
                            sign.m_numMesh.GetComponent <Renderer>().material.shader = ShaderUtils.m_shaderStore["fallback"];
                        }
                        //TODO: Tie the font size to the font size option
                        sign.m_numMesh.fontSize           = 50;
                        sign.m_numMesh.transform.position = position;
                        sign.m_numMesh.transform.parent   = sign.m_shieldObject.transform;

                        sign.m_numMesh.transform.position = sign.m_shieldObject.GetComponent <Renderer>().bounds.center;
                        //Just a hack, to make sure the text actually shows up above the shield
                        sign.m_numMesh.offsetZ = 0.01f;
                        //TODO: Definitely get a map of the texture to the required text offsets ds
                        sign.m_numMesh.transform.localPosition += (Vector3.up * shieldInfo.upOffset);
                        sign.m_numMesh.transform.localPosition += (Vector3.left * shieldInfo.leftOffset);
                        //TODO: Figure out a better ratio for route markers
                        sign.m_numMesh.transform.localScale = new Vector3(shieldInfo.textScale, shieldInfo.textScale, shieldInfo.textScale);
                        sign.m_numMesh.GetComponent <Renderer>().material.color = shieldInfo.textColor;
                        sign.m_numMesh.text = sign.m_route.ToString();
                        sign.m_numMesh.TE

                        sign.m_shieldMesh.transform.parent = sign.m_sign.transform;

                        sign.m_shieldMesh.transform.localPosition = signPropInfo.shieldOffset;
                    }


                    string[] destinationStrings = sign.m_destination.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);

                    for (int i = 0; i < numSignProps; i++)
                    {
                        sign.m_destinationMesh[i].anchor = TextAnchor.MiddleCenter;
                        sign.m_destinationMesh[i].font   = FontUtils.m_fontStore.ContainsKey(signPropInfo.fontType) ? FontUtils.m_fontStore[signPropInfo.fontType] : districtManager.m_properties.m_areaNameFont.baseFont;
                        sign.m_destinationMesh[i].font.material.SetColor("Text Color", Color.white);

                        if (ShaderUtils.m_shaderStore.ContainsKey("font"))
                        {
                            sign.m_destinationMesh[i].font.material.shader = ShaderUtils.m_shaderStore["font"];
                        }
                        else
                        {
                            sign.m_destinationMesh[i].font.material.shader = ShaderUtils.m_shaderStore["fallback"];
                        }

                        sign.m_destinationMesh[i].GetComponent <Renderer>().material = sign.m_destinationMesh[i].font.material;
                        //TODO: Tie the font size to the font size option
                        sign.m_destinationMesh[i].fontSize           = 50;
                        sign.m_destinationMesh[i].transform.position = position;
                        sign.m_destinationMesh[i].transform.parent   = sign.m_sign.transform;

                        sign.m_destinationMesh[i].transform.position = position;
                        //Just a hack, to make sure the text actually shows up above the shield
                        sign.m_destinationMesh[i].offsetZ = 0.001f;
                        //TODO: Definitely get a map of the texture to the required text offsets
                        //TODO: Figure out a better ratio for route markers
                        sign.m_destinationMesh[i].transform.localScale = signPropInfo.textScale;
                        sign.m_destinationMesh[i].text = signPropInfo.isDoubleGantry ? destinationStrings[i] : sign.m_destination;

                        sign.m_destinationMesh[i].transform.localPosition = sign.m_routePrefix == null ? signPropInfo.textOffsetNoSign[i] : signPropInfo.textOffsetSign[i];
                    }
                }

                foreach (DynamicSignContainer sign in RouteManager.Instance().m_dynamicSignList)
                {
                    Vector3 position = new Vector3(sign.x, sign.y, sign.z);

                    sign.m_sign.GetComponent <Renderer>().material = m_signPropDict["electronic_sign_gantry"].m_material;
                    //TODO: Make mesh size dependent on text size
                    sign.m_sign.mesh = m_signPropDict["electronic_sign_gantry"].m_mesh;
                    sign.m_sign.transform.position = position;

                    sign.m_messageTextMesh.anchor = TextAnchor.MiddleLeft;
                    sign.m_messageTextMesh.font   = FontUtils.m_fontStore.ContainsKey("Electronic Highway Sign") ? FontUtils.m_fontStore["Electronic Highway Sign"] : districtManager.m_properties.m_areaNameFont.baseFont;

                    if (ShaderUtils.m_shaderStore.ContainsKey("font"))
                    {
                        sign.m_messageTextMesh.font.material.shader = ShaderUtils.m_shaderStore["font"];
                    }
                    else
                    {
                        sign.m_numMesh.GetComponent <Renderer>().material.shader = ShaderUtils.m_shaderStore["fallback"];
                    }
                    sign.m_messageTextMesh.color = (new Color(1, 0.77f, 0.56f, 1f));
                    sign.m_messageTextMesh.font.material.SetColor("Text Color", new Color(1, 0.77f, 0.56f, 1f));

                    sign.m_messageTextMesh.GetComponent <Renderer>().material = sign.m_messageTextMesh.font.material;
                    //TODO: Tie the font size to the font size option
                    sign.m_messageTextMesh.fontSize           = 50;
                    sign.m_messageTextMesh.transform.position = position;
                    sign.m_messageTextMesh.transform.parent   = sign.m_sign.transform;

                    sign.m_messageTextMesh.transform.position = position;
                    //Just a hack, to make sure the text actually shows up above the shield
                    sign.m_messageTextMesh.offsetZ = 0.001f;
                    //TODO: Definitely get a map of the texture to the required text odffsets
                    //TODO: Figure out a better ratio for route markers
                    sign.m_messageTextMesh.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f);

                    String msgText = (sign.m_route == null ? "Traffic" : (sign.m_routePrefix + '-' + sign.m_route)) +
                                     " moving smoothly";
                    sign.m_messageTextMesh.text = msgText;

                    sign.m_messageTextMesh.transform.localPosition = new Vector3(0.7f, 8.4f, -19.7f);
                }
            }
        }