public static void MirrorZ(Vertex[] vertices, ProceduralObject obj) { for (int i = 0; i < vertices.Length; i++) { vertices[i].Position.z = -vertices[i].Position.z; } obj.flipFaces = !obj.flipFaces; VertexUtils.flipFaces(obj); if (obj.normalsRecalcMode == NormalsRecalculation.None && !obj.IsPloppableAsphalt()) { obj.normalsRecalcMode = NormalsRecalculation.Default; } obj.RecalculateNormals(); }
public void RecalculateBoundsNormalsExtras(byte meshStatus) { if (!isPloppableAsphalt && meshStatus != 1) { this.RecalculateNormals(); this.m_mesh.RecalculateBounds(); } else if (isPloppableAsphalt) { Bounds b; m_correctedMeshPloppableAsph = VertexUtils.GetCorrectedMeshPloppableAsph(m_mesh, m_correctedMeshPloppableAsph, out b); m_mesh.bounds = b; } halfOverlayDiam = Mathf.Max(m_mesh.bounds.extents.x, m_mesh.bounds.extents.z); MaterialOptions.FixDecalRenderDist(this); }
private void draw(int id) { GUI.DragWindow(new Rect(0, 0, 348, 26)); if (GUIUtils.CloseHelpButtons(winRect, "Advanced_Edition_tools")) { showWindow = false; } // SHOW ALWAYS/DAY/NIGHT if (GUI.Button(new Rect(5, 28, 192.5f, 22), LocalizationManager.instance.current.visibilityString(m_object.m_visibility))) { ProceduralObjectsLogic.PlaySound(); if (m_object.m_visibility == ProceduralObjectVisibility.Always) { m_object.m_visibility = ProceduralObjectVisibility.DayOnly; } else if (m_object.m_visibility == ProceduralObjectVisibility.DayOnly) { m_object.m_visibility = ProceduralObjectVisibility.NightOnly; } else if (m_object.m_visibility == ProceduralObjectVisibility.NightOnly) { m_object.m_visibility = ProceduralObjectVisibility.Always; } } // FLIP FACES if (GUI.Button(new Rect(202.5f, 28, 192.5f, 22), string.Format(LocalizationManager.instance.current["flipFaces"], m_object.flipFaces.GetHashCode()))) { ProceduralObjectsLogic.PlaySound(); m_object.flipFaces = !m_object.flipFaces; VertexUtils.flipFaces(m_object); } // CAST SHADOWS if (GUI.Button(new Rect(5, 52, 192.5f, 22), string.Format(LocalizationManager.instance.current["castShadows"], (!m_object.disableCastShadows).GetHashCode()))) { ProceduralObjectsLogic.PlaySound(); m_object.disableCastShadows = !m_object.disableCastShadows; } // RESET 3D MODEL if (GUI.Button(new Rect(202.5f, 52, 192.5f, 22), LocalizationManager.instance.current["resetModel"])) { ProceduralObjectsLogic.PlaySound(); GUIUtils.ShowModal(LocalizationManager.instance.current["resetModel"], LocalizationManager.instance.current["resetModel_confirm"], (bool ok) => { if (ok) { m_object.ResetOriginalMesh(); } }); } // NORMALS RECALCULATION if (GUI.Button(new Rect(5, 76, 390, 22), LocalizationManager.instance.current.normalsRecalcString(m_object.normalsRecalcMode))) { ProceduralObjectsLogic.PlaySound(); m_object.ChangeNormalsRecalc(); } GUI.Label(new Rect(5, 103, 390, 27), "<b><size=15>" + LocalizationManager.instance.current["edition_history"] + "</size></b>"); // undo GUI.BeginGroup(new Rect(5, 131, 135, 60)); if (m_object.historyEditionBuffer.CanUndo) { if (GUI.Button(new Rect(0, 0, 135, 60), string.Empty)) { undo.Invoke(); } else { GUI.Label(new Rect(3, 3, 98, 64), "<size=13><b>" + LocalizationManager.instance.current["undo"] + "</b></size>"); GUI.Label(new Rect(3, 20, 98, 55), "<size=10>" + LocalizationManager.instance.current["action_type"] + " : " + m_object.historyEditionBuffer.stepsDone[m_object.historyEditionBuffer.stepsDone.Count - 1].GetLocalizedStepString() + "</size>"); } } else { GUI.Box(new Rect(0, 0, 135, 60), string.Empty); GUI.color = Color.gray; GUI.Label(new Rect(10, 10, 95, 40), "<i><size=13>" + LocalizationManager.instance.current["cant_undo"] + "</size></i>"); } GUI.Label(new Rect(110, 12, 30, 30), "<size=28>↺</size>"); GUI.color = Color.white; GUI.EndGroup(); // redo GUI.BeginGroup(new Rect(145, 131, 135, 60)); if (m_object.historyEditionBuffer.CanRedo) { if (GUI.Button(new Rect(0, 0, 135, 60), string.Empty)) { redo.Invoke(); } else { GUI.Label(new Rect(30, 3, 102, 64), "<size=13><b>" + LocalizationManager.instance.current["redo"] + "</b></size>"); GUI.Label(new Rect(30, 20, 102, 55), "<size=10>" + LocalizationManager.instance.current["action_type"] + " : " + m_object.historyEditionBuffer.stepsUndone[m_object.historyEditionBuffer.stepsUndone.Count - 1].GetLocalizedStepString() + "</size>"); } } else { GUI.Box(new Rect(0, 0, 135, 60), string.Empty); GUI.color = Color.gray; GUI.Label(new Rect(37, 10, 95, 40), "<i><size=13>" + LocalizationManager.instance.current["cant_redo"] + "</size></i>"); } GUI.Label(new Rect(7, 12, 30, 30), "<size=28>↻</size>"); GUI.color = Color.white; GUI.EndGroup(); // erase history buffer var erase = new Rect(285, 131, 110, 60); if (GUI.Button(erase, string.Empty)) { m_object.historyEditionBuffer.stepsDone.Clear(); m_object.historyEditionBuffer.stepsUndone.Clear(); } GUI.Label(erase, LocalizationManager.instance.current["erase_history"]); // mirror GUI.Label(new Rect(5, 195, 145, 27), "<b><size=15>" + LocalizationManager.instance.current["mirror_mesh"] + "</size></b>"); GUI.Label(new Rect(150, 195, 270, 27), "<b><size=15>" + LocalizationManager.instance.current["stretch_mesh"] + "</size></b>"); if (m_object.isPloppableAsphalt) { GUI.color = Color.gray; GUI.Box(new Rect(5, 222, 385, 26), "<i>" + LocalizationManager.instance.current["no_mirror_no_stretch"] + "</i>"); GUI.color = Color.white; } else { GUI.color = Color.red; if (GUI.Button(new Rect(5, 222, 35, 25), "<b>X</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorX, m_vertices); VertexUtils.MirrorX(m_vertices, m_object); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.green; if (GUI.Button(new Rect(45, 222, 35, 26), "<b>Y</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorY, m_vertices); VertexUtils.MirrorY(m_vertices, m_object); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.blue; if (GUI.Button(new Rect(85, 222, 35, 26), "<b>Z</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorZ, m_vertices); VertexUtils.MirrorZ(m_vertices, m_object); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.white; // stretch GUI.Label(new Rect(150, 218, 125, 20), "x" + ((float)stretchFactor / 10f).ToString()); stretchFactor = Mathf.FloorToInt(GUI.HorizontalSlider(new Rect(150, 238, 125, 20), stretchFactor, 1f, 30f)); GUI.color = Color.red; if (GUI.Button(new Rect(280, 222, 35, 25), "<b>X</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchX, (float)stretchFactor / 10f); VertexUtils.StretchX(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.green; if (GUI.Button(new Rect(320, 222, 35, 26), "<b>Y</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchY, (float)stretchFactor / 10f); VertexUtils.StretchY(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.blue; if (GUI.Button(new Rect(360, 222, 35, 26), "<b>Z</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchZ, (float)stretchFactor / 10f); VertexUtils.StretchZ(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.white; } // texture UV GUI.Label(new Rect(5, 252, 390, 27), "<b><size=15>" + LocalizationManager.instance.current["texture_tiling"] + "</size></b>"); if (m_object.RequiresUVRecalculation) { if (GUI.Button(new Rect(5, 276, 235, 40), LocalizationManager.instance.current["tex_uv_mode"] + " : " + LocalizationManager.instance.current[(m_object.disableRecalculation ? "uv_stretch" : "uv_repeat")])) { if (m_object.disableRecalculation) { m_object.disableRecalculation = false; m_object.m_mesh.uv = Vertex.RecalculateUVMap(m_object, m_vertices); } else { m_object.disableRecalculation = true; m_object.m_mesh.uv = Vertex.DefaultUVMap(m_object); } } GUI.Label(new Rect(245, 275, 150, 22), string.Format(LocalizationManager.instance.current["tiling_factor"], m_object.tilingFactor)); m_object.tilingFactor = (int)Mathf.FloorToInt(GUI.HorizontalSlider(new Rect(245, 274, 150, 22), (float)m_object.tilingFactor, 1, 20)); } else { GUI.color = Color.gray; GUI.Box(new Rect(5, 275, 390, 42), "<i>" + LocalizationManager.instance.current["no_tex_tiling"] + "</i>"); GUI.color = Color.white; } }
public ProceduralObject(CacheProceduralObject sourceCacheObj, int id, Vector3 position, LayerManager layerManager) { if (sourceCacheObj.baseInfoType == "PROP") { PropInfo sourceProp = sourceCacheObj._baseProp; if (sourceCacheObj._baseProp == null) { sourceProp = Resources.FindObjectsOfTypeAll <PropInfo>().FirstOrDefault(info => info.name == sourceCacheObj.basePrefabName); } this._baseProp = sourceProp; this.id = id; this.basePrefabName = sourceCacheObj.basePrefabName; this.baseInfoType = "PROP"; this.isPloppableAsphalt = sourceProp.IsPloppableAsphalt(); m_material = GameObject.Instantiate(sourceProp.m_material); if (sourceCacheObj.meshStatus == 2) { m_mesh = sourceProp.m_mesh.InstantiateMesh(); m_mesh.SetVertices(new List <Vector3>(sourceCacheObj.allVertices)); vertices = Vertex.CreateVertexList(this); meshStatus = 2; } else { meshStatus = 1; m_mesh = sourceProp.m_mesh; vertices = Vertex.CreateVertexList(sourceProp); } if (sourceProp.m_mesh.name == "ploppableasphalt-prop" || sourceProp.m_mesh.name == "ploppableasphalt-decal") { m_color = m_material.ApplyPloppableColor(); } } else if (sourceCacheObj.baseInfoType == "BUILDING")// building { BuildingInfo sourceBuilding = sourceCacheObj._baseBuilding; if (sourceCacheObj._baseBuilding == null) { sourceBuilding = Resources.FindObjectsOfTypeAll <BuildingInfo>().FirstOrDefault(info => info.name == sourceCacheObj.basePrefabName); } this._baseBuilding = sourceBuilding; this.id = id; this.basePrefabName = sourceCacheObj.basePrefabName; this.baseInfoType = "BUILDING"; this.isPloppableAsphalt = false; m_material = GameObject.Instantiate(sourceBuilding.m_material); m_mesh = sourceBuilding.m_mesh.InstantiateMesh(); meshStatus = 2; m_mesh.SetVertices(new List <Vector3>(sourceCacheObj.allVertices)); vertices = Vertex.CreateVertexList(this); m_mesh.colors = new Color[] { }; m_mesh.colors32 = new Color32[] { }; } if (sourceCacheObj.customTexture != null) { m_material.mainTexture = sourceCacheObj.customTexture as Texture; customTexture = sourceCacheObj.customTexture; } m_visibility = sourceCacheObj.visibility; historyEditionBuffer = new HistoryBuffer(this); if (sourceCacheObj.textParam != null) { m_textParameters = TextParameters.Clone(sourceCacheObj.textParam, false); // m_textParameters.SetFonts(); var originalTex = new Texture2D(m_material.mainTexture.width, m_material.mainTexture.height, TextureFormat.RGBA32, false); originalTex.SetPixels(((Texture2D)m_material.mainTexture).GetPixels()); originalTex.Apply(); m_material.mainTexture = m_textParameters.ApplyParameters(originalTex); } else { m_textParameters = null; } if (sourceCacheObj.layer != null) { if (layerManager.m_layers.Contains(sourceCacheObj.layer)) { layer = sourceCacheObj.layer; } } m_color = sourceCacheObj.m_color; m_material.color = m_color; this.flipFaces = sourceCacheObj.flipFaces; this.disableCastShadows = sourceCacheObj.disableCastShadows; if (this.flipFaces) { VertexUtils.flipFaces(this); } renderDistance = sourceCacheObj.renderDistance; renderDistLocked = sourceCacheObj.renderDistLocked; MaterialOptions.FixDecalRenderDist(this); m_position = position; m_rotation = sourceCacheObj.m_rotation; disableRecalculation = sourceCacheObj.disableRecalculation; normalsRecalcMode = sourceCacheObj.normalsRecalculation; this.tilingFactor = sourceCacheObj.tilingFactor; if (sourceCacheObj.modules != null) { m_modules = new List <POModule>(); foreach (var m in sourceCacheObj.modules) { POModule clone; try { clone = m.Clone(); } catch (Exception e) { Debug.LogError("[ProceduralObjects] Error inside module Clone() method!\n" + e); continue; } ModuleManager.instance.modules.Add(clone); if (clone.enabled) { ModuleManager.instance.enabledModules.Add(clone); } clone.parentObject = this; try { clone.OnModuleCreated(ProceduralObjectsLogic.instance); } catch (Exception e) { Debug.LogError("[ProceduralObjects] Error inside module OnModuleCreated() method!\n" + e); } m_modules.Add(clone); } } }
public ProceduralObject(ProceduralObjectContainer container, LayerManager layerManager, PropInfo[] props, BuildingInfo[] buildings) { if (container.objectType == "PROP") { PropInfo sourceProp = props.FirstOrDefault(info => info.name == container.basePrefabName); this._baseProp = sourceProp; this.id = container.id; this.basePrefabName = container.basePrefabName; this.baseInfoType = "PROP"; this.isPloppableAsphalt = sourceProp.IsPloppableAsphalt(); m_position = container.position.ToVector3(); m_rotation = container.rotation.ToQuaternion(); m_material = GameObject.Instantiate(sourceProp.m_material); // overkil ?? if (container.meshStatus == 0 && container.vertices != null) { // CHECK FOR MESH REPETITION if (ProceduralUtils.CheckMeshEquivalence(container.vertices, sourceProp.m_mesh.vertices)) { meshStatus = 1; m_mesh = sourceProp.m_mesh; vertices = Vertex.CreateVertexList(sourceProp); } else { meshStatus = 2; m_mesh = sourceProp.m_mesh.InstantiateMesh(); var vert = SerializableVector3.ToStandardVector3Array(container.vertices); if (container.scale != 0) { for (int i = 0; i < vert.Count(); i++) { vert[i] = new Vector3(vert[i].x * container.scale, vert[i].y * container.scale, vert[i].z * container.scale); } } m_mesh.SetVertices(new List <Vector3>(vert)); vertices = Vertex.CreateVertexList(this); } } else if (container.meshStatus == 1) { meshStatus = 1; m_mesh = sourceProp.m_mesh; vertices = Vertex.CreateVertexList(sourceProp); } else // meshstatus2 { meshStatus = 2; m_mesh = sourceProp.m_mesh.InstantiateMesh(); if (container.serializedMeshData != null) { container.serializedMeshData.ApplyDataToObject(this); } else if (container.vertices != null) { var vert = SerializableVector3.ToStandardVector3Array(container.vertices); if (container.scale != 0) { for (int i = 0; i < vert.Count(); i++) { vert[i] = new Vector3(vert[i].x * container.scale, vert[i].y * container.scale, vert[i].z * container.scale); } } m_mesh.SetVertices(new List <Vector3>(vert)); } else { throw new Exception("[ProceduralObjects] Loading failure : Missing mesh data !"); } vertices = Vertex.CreateVertexList(this); } if (sourceProp.m_mesh.name == "ploppableasphalt-prop" || sourceProp.m_mesh.name == "ploppableasphalt-decal") { m_color = m_material.ApplyPloppableColor(); } if (container.hasCustomTexture && TextureManager.instance != null) { var customTex = TextureManager.instance.FindTexture(container.customTextureName); m_material.mainTexture = customTex as Texture; customTexture = customTex; } } else if (container.objectType == "BUILDING")// building { BuildingInfo sourceProp = buildings.FirstOrDefault(info => info.name == container.basePrefabName); this._baseBuilding = sourceProp; this.id = container.id; this.basePrefabName = container.basePrefabName; this.baseInfoType = "BUILDING"; this.isPloppableAsphalt = false; m_position = container.position.ToVector3(); m_rotation = container.rotation.ToQuaternion(); meshStatus = 2; m_material = GameObject.Instantiate(sourceProp.m_material); // overkill ?? m_mesh = sourceProp.m_mesh.InstantiateMesh(); if (container.serializedMeshData != null) { container.serializedMeshData.ApplyDataToObject(this); } else if (container.vertices != null) { var vert = SerializableVector3.ToStandardVector3Array(container.vertices); if (container.scale != 0) { for (int i = 0; i < vert.Count(); i++) { vert[i] = new Vector3(vert[i].x * container.scale, vert[i].y * container.scale, vert[i].z * container.scale); } } m_mesh.SetVertices(new List <Vector3>(vert)); } else { throw new Exception("[ProceduralObjects] Loading failure : Missing mesh data !"); } vertices = Vertex.CreateVertexList(this); m_mesh.colors = new Color[] { }; m_mesh.colors32 = new Color32[] { }; if (container.hasCustomTexture && TextureManager.instance != null) { var customTex = TextureManager.instance.FindTexture(container.customTextureName); m_material.mainTexture = customTex as Texture; customTexture = customTex; } } m_visibility = container.visibility; renderDistance = container.renderDistance; MaterialOptions.FixDecalRenderDist(this); renderDistLocked = container.renderDistLocked; if (container.textParam != null) { m_textParameters = TextParameters.Clone(container.textParam, true); for (int i = 0; i < m_textParameters.Count(); i++) { if (m_textParameters[i].m_fontColor == null) { if (m_textParameters[i].serializableColor != null) { m_textParameters[i].m_fontColor = m_textParameters[i].serializableColor.ToColor(); } else { m_textParameters[i].m_fontColor = Color.white; } } } // m_textParameters.SetFonts(); var originalTex = new Texture2D(m_material.mainTexture.width, m_material.mainTexture.height, TextureFormat.RGBA32, false); originalTex.SetPixels(((Texture2D)m_material.mainTexture).GetPixels()); originalTex.Apply(); m_material.mainTexture = m_textParameters.ApplyParameters(originalTex) as Texture; } else { m_textParameters = null; } if (container.belongsToGroup) { if (container.groupRootId == -1) { isRootOfGroup = true; _groupRootIdData = -1; } else { _groupRootIdData = container.groupRootId; isRootOfGroup = false; } } else { _groupRootIdData = -2; group = null; isRootOfGroup = false; } disableRecalculation = container.disableRecalculation; this.normalsRecalcMode = container.normalsRecalculation; this.flipFaces = container.flipFaces; this.disableCastShadows = container.disableCastShadows; if (this.flipFaces) { VertexUtils.flipFaces(this); } historyEditionBuffer = new HistoryBuffer(this); if (container.color == null) { if (!(m_mesh.name == "ploppableasphalt-prop" || m_mesh.name == "ploppableasphalt-decal")) { m_color = Color.white; } } else { m_color = container.color; m_material.color = m_color; } if (container.layerId != 0) { if (layerManager.m_layers.Any(l => l.m_id == container.layerId)) { layer = layerManager.m_layers.Single(l => l.m_id == container.layerId); } else { Debug.LogError("[ProceduralObjects] Layer of an object not found !"); } } else { layer = null; } if (container.tilingFactor == 0) { this.tilingFactor = 8; } else { this.tilingFactor = container.tilingFactor; } m_modules = ModuleManager.LoadModulesFromData(container.modulesData, true, this); }
private void createSelectionClipboard() { var fileLines = File.ReadAllLines(m_filePath); Dictionary <CacheProceduralObject, Vector3> objects = new Dictionary <CacheProceduralObject, Vector3>(); CacheProceduralObject obj = null; Vector3 relativePos = Vector3.zero; var modulesData = new List <Dictionary <string, string> >(); Dictionary <string, string> currentModuleData = null; string name = ""; for (int i = 0; i < fileLines.Count(); i++) { try { if (currentModuleData != null) { if (fileLines[i].Contains("{")) { continue; } else if (fileLines[i].Contains("}")) { modulesData.Add(currentModuleData); currentModuleData = null; continue; } else if (fileLines[i].Contains(" = ")) { currentModuleData.Add(fileLines[i].GetUntilOrEmpty(" = ").Trim(), fileLines[i].GetStringAfter(" = ").Trim()); } continue; } else if (fileLines[i].Contains("name = ")) { name = fileLines[i].Replace("name = ", "").Trim(); } else if (fileLines[i].Contains("{")) { obj = new CacheProceduralObject(); obj.tilingFactor = 8; obj.m_color = Color.white; obj.parent = -1; obj.meshStatus = 2; relativePos = Vector3.zero; modulesData = new List <Dictionary <string, string> >(); } else if (fileLines[i].Contains("}")) { obj.modules = ModuleManager.LoadModulesFromData(modulesData, false, null); objects[obj] = relativePos; modulesData = null; obj = null; relativePos = Vector3.zero; } else if (fileLines[i].Contains("baseInfoType = ")) { obj.baseInfoType = fileLines[i].Replace("baseInfoType = ", ""); } else if (fileLines[i].Contains("basePrefabName = ")) { obj.basePrefabName = fileLines[i].Replace("basePrefabName = ", ""); } else if (fileLines[i].Contains("relativePosition = ")) { relativePos = fileLines[i].Replace("relativePosition = ", "").ParseVector3(); } else if (fileLines[i].Contains("absPosition = ")) { obj._staticPos = fileLines[i].Replace("absPosition = ", "").ParseVector3(); } else if (fileLines[i].Contains("renderDistance = ")) { obj.renderDistance = float.Parse(fileLines[i].Replace("renderDistance = ", "")); } else if (fileLines[i].Contains("renderDistLocked = ")) { obj.renderDistLocked = bool.Parse(fileLines[i].Replace("renderDistLocked = ", "")); } else if (fileLines[i].Contains("isPloppableAsphalt = ")) { obj.isPloppableAsphalt = bool.Parse(fileLines[i].Replace("isPloppableAsphalt = ", "")); } else if (fileLines[i].Contains("rotation = ")) { obj.m_rotation = VertexUtils.ParseQuaternion(fileLines[i].Replace("rotation = ", "")); } else if (fileLines[i].Contains("disableRecalculation = ")) { obj.disableRecalculation = bool.Parse(fileLines[i].Replace("disableRecalculation = ", "")); } else if (fileLines[i].Contains("tilingFactor = ")) { obj.tilingFactor = int.Parse(fileLines[i].Replace("tilingFactor = ", "")); } else if (fileLines[i].Contains("parenting = ")) { var splited = fileLines[i].Replace("parenting = ", "").Trim().Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); obj.temp_id = int.Parse(splited[0]); obj.parent = int.Parse(splited[1]); } else if (fileLines[i].Contains("disableRecalculation = ")) { obj.disableRecalculation = bool.Parse(fileLines[i].Replace("disableRecalculation = ", "")); } else if (fileLines[i].Contains("flipFaces = ")) { obj.flipFaces = bool.Parse(fileLines[i].Replace("flipFaces = ", "")); } else if (fileLines[i].Contains("disableCastShadows = ")) { obj.disableCastShadows = bool.Parse(fileLines[i].Replace("disableCastShadows = ", "")); } else if (fileLines[i].Contains("color = ")) { obj.m_color = SerializableColor.Parse(fileLines[i].Replace("color = ", "")); } else if (fileLines[i].Contains("normalsRecalc = ")) { obj.normalsRecalculation = (NormalsRecalculation)Enum.Parse(typeof(NormalsRecalculation), fileLines[i].Replace("normalsRecalc = ", ""), true); } else if (fileLines[i].Contains("visibility = ")) { obj.visibility = (ProceduralObjectVisibility)Enum.Parse(typeof(ProceduralObjectVisibility), fileLines[i].Replace("visibility = ", ""), true); } else if (fileLines[i].Contains("textParam: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseText(fileLines[i], FontManager.instance)); } else if (fileLines[i].Contains("colorRect: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseColorRect(fileLines[i])); } else if (fileLines[i].Contains("customTexture = ")) { obj.customTexture = TextureManager.instance.FindTexture(fileLines[i].Replace("customTexture = ", "")); /* * if (fileLines[i].Replace("customTexture = ", "") == "null") * obj.customTexture = null; * else if (!availableTextures.Any(tex => tex.name == fileLines[i].Replace("customTexture = ", ""))) * Debug.LogError("[ProceduralObjects] A saved object was found with a texture that doesn't exist anymore with the name " + fileLines[i].Replace("customTexture = ", "") + ", therefore loading the default object texture"); * else * obj.customTexture = availableTextures.FirstOrDefault(tex => tex.name == fileLines[i].Replace("customTexture = ", "")); */ } else if (fileLines[i].Contains("ORIGINALMODEL")) { obj.meshStatus = 1; } else if (fileLines[i].Contains("MODULE")) { try { if (fileLines[i + 1].Contains("{")) { currentModuleData = new Dictionary <string, string>(); } } catch { continue; } } else if (fileLines[i].Contains("VERTICES ")) { obj.allVertices = new Vector3[int.Parse(fileLines[i].Replace("VERTICES ", ""))]; } else if (fileLines[i].Contains("vertex")) { string[] split = fileLines[i].Replace("vertex ", "").Split(new string[] { " = " }, StringSplitOptions.RemoveEmptyEntries); obj.allVertices[int.Parse(split[0])] = VertexUtils.ParseVector3(split[1]); } } catch { Debug.LogError("[ProceduralObjects] Error while loading an object from export at path : " + m_filePath); } } ClipboardProceduralObjects selec = new ClipboardProceduralObjects(ClipboardProceduralObjects.ClipboardType.Selection); selec.selection_objects = objects; var groupInfo = new Dictionary <CacheProceduralObject, CacheProceduralObject>(); var objlist = objects.Keys.ToList(); foreach (var o in objlist) { if (o.parent == -1) { continue; } try { var parent = objlist.First(po => po.temp_id == o.parent); groupInfo.Add(o, parent); } catch { continue; } } if (groupInfo.Count > 0) { selec.groupInformation = groupInfo; } this.m_name = name; this.m_selection = selec; this.m_externalType = ClipboardProceduralObjects.ClipboardType.Selection; }
public static POGroup ConstructSubBuildings(ProceduralObject obj) { var logic = ProceduralObjectsLogic.instance; if (obj.baseInfoType != "BUILDING") { return(null); } var pos = new List <ProceduralObject>(); pos.Add(obj); // Sub buildings var subBuildings = obj._baseBuilding.m_subBuildings; if (subBuildings.Length >= 1) { for (int i = 0; i < subBuildings.Length; i++) { var subB = subBuildings[i]; if (subB == null) { continue; } if (subB.m_buildingInfo == null) { continue; } if (subB.m_buildingInfo.m_mesh == null) { continue; } if (!subB.m_buildingInfo.m_mesh.isReadable) { continue; } int id = 0; try { ProceduralObject sub = new ProceduralObject(); id = logic.proceduralObjects.GetNextUnusedId(); sub.ConstructObject(subB.m_buildingInfo, id); float a = -(subB.m_angle * Mathf.Rad2Deg) % 360f; if (a < 0) { a += 360f; } sub.m_rotation = Quaternion.Euler(sub.m_rotation.eulerAngles.x, a, sub.m_rotation.eulerAngles.z) * obj.m_rotation; sub.m_position = VertexUtils.RotatePointAroundPivot(subB.m_position + obj.m_position, obj.m_position, obj.m_rotation); pos.Add(sub); logic.proceduralObjects.Add(sub); } catch { if (id != 0) { if (logic.activeIds.Contains(id)) { logic.activeIds.Remove(id); } } } } } if (pos.Count < 2) { return(null); } var group = POGroup.MakeGroup(logic, pos, pos[0]); return(group); }
private void createSingleClipboard() { var lines = File.ReadAllLines(m_filePath); CacheProceduralObject obj = new CacheProceduralObject(); try { obj.tilingFactor = 8; obj.m_color = Color.white; string name = ""; var modulesData = new List <Dictionary <string, string> >(); Dictionary <string, string> currentModuleData = null; bool original = lines.Any(s => s.Contains("ORIGINALMODEL")); if (original) { obj.meshStatus = 1; } else { obj.meshStatus = 2; } for (int i = 0; i < lines.Count(); i++) { if (currentModuleData != null) { if (lines[i].Contains("{")) { continue; } else if (lines[i].Contains("}")) { modulesData.Add(currentModuleData); currentModuleData = null; continue; } else if (lines[i].Contains(" = ")) { currentModuleData.Add(lines[i].GetUntilOrEmpty(" = ").Trim(), lines[i].GetStringAfter(" = ").Trim()); } } if (lines[i].Contains("name = ")) { name = lines[i].Replace("name = ", "").Trim(); } else if (lines[i].Contains("baseInfoType = ")) { obj.baseInfoType = lines[i].Replace("baseInfoType = ", ""); } else if (lines[i].Contains("basePrefabName = ")) { obj.basePrefabName = lines[i].Replace("basePrefabName = ", ""); } else if (lines[i].Contains("renderDistance = ")) { obj.renderDistance = float.Parse(lines[i].Replace("renderDistance = ", "")); } else if (lines[i].Contains("renderDistLocked = ")) { obj.renderDistLocked = bool.Parse(lines[i].Replace("renderDistLocked = ", "")); } // else if (lines[i].Contains("scale = ")) // obj.scale = float.Parse(lines[i].Replace("scale = ", "")); else if (lines[i].Contains("isPloppableAsphalt = ")) { obj.isPloppableAsphalt = bool.Parse(lines[i].Replace("isPloppableAsphalt = ", "")); } else if (lines[i].Contains("tilingFactor = ")) { obj.tilingFactor = int.Parse(lines[i].Replace("tilingFactor = ", "")); } else if (lines[i].Contains("rotation = ")) { obj.m_rotation = VertexUtils.ParseQuaternion(lines[i].Replace("rotation = ", "")); } else if (lines[i].Contains("disableRecalculation = ")) { obj.disableRecalculation = bool.Parse(lines[i].Replace("disableRecalculation = ", "")); } else if (lines[i].Contains("color = ")) { obj.m_color = SerializableColor.Parse(lines[i].Replace("color = ", "")); } else if (lines[i].Contains("flipFaces = ")) { obj.flipFaces = bool.Parse(lines[i].Replace("flipFaces = ", "")); } else if (lines[i].Contains("disableCastShadows = ")) { obj.disableCastShadows = bool.Parse(lines[i].Replace("disableCastShadows = ", "")); } else if (lines[i].Contains("normalsRecalc = ")) { obj.normalsRecalculation = (NormalsRecalculation)Enum.Parse(typeof(NormalsRecalculation), lines[i].Replace("normalsRecalc = ", ""), true); } else if (lines[i].Contains("visibility = ")) { obj.visibility = (ProceduralObjectVisibility)Enum.Parse(typeof(ProceduralObjectVisibility), lines[i].Replace("visibility = ", ""), true); } else if (lines[i].Contains("customTexture = ")) { obj.customTexture = TextureManager.instance.FindTexture(lines[i].Replace("customTexture = ", "")); /* * if (lines[i].Replace("customTexture = ", "") == "null") * obj.customTexture = null; * else if (!availableTextures.Any(tex => tex.name == lines[i].Replace("customTexture = ", ""))) * Debug.LogError("[ProceduralObjects] A saved object was found with a texture that doesn't exist anymore with the name " + lines[i].Replace("customTexture = ", "") + ", therefore loading the default object texture"); * else * obj.customTexture = availableTextures.FirstOrDefault(tex => tex.name == lines[i].Replace("customTexture = ", "")); */ } else if (lines[i].Contains("textParam: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseText(lines[i], FontManager.instance)); } else if (lines[i].Contains("colorRect: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseColorRect(lines[i])); } else if (lines[i].Contains("MODULE")) { try { if (lines[i + 1].Contains("{")) { currentModuleData = new Dictionary <string, string>(); } } catch { continue; } } else if (!original) { if (lines[i].Contains("VERTICES ")) { obj.allVertices = new Vector3[int.Parse(lines[i].Replace("VERTICES ", ""))]; } else if (lines[i].Contains("vertex")) { string[] split = lines[i].Replace("vertex ", "").Split(new string[] { " = " }, StringSplitOptions.RemoveEmptyEntries); obj.allVertices[int.Parse(split[0])] = VertexUtils.ParseVector3(split[1]); } } } obj.modules = ModuleManager.LoadModulesFromData(modulesData, false, null); } catch { Debug.LogError("[ProceduralObjects] Couldn't load an External Procedural Object : Invalid, corrupted or edited file at path : " + m_filePath); } this.m_externalType = ClipboardProceduralObjects.ClipboardType.Single; this.m_object = obj; }
public EditingStep.StepType RedoUndoneStep(Vertex[] currentTempBuffer, out Vertex[] buffer) { buffer = currentTempBuffer; if (stepsUndone == null) { return(EditingStep.StepType.none); } if (stepsUndone.Count == 0) { return(EditingStep.StepType.none); } var last = stepsUndone[stepsUndone.Count - 1]; switch (last.type) { case EditingStep.StepType.vertices: buffer = last.RedoVerticesStep(currentTempBuffer); break; case EditingStep.StepType.position: last.RedoPosRotMoveTo(obj); break; case EditingStep.StepType.rotation: last.RedoPosRotMoveTo(obj); break; case EditingStep.StepType.moveTo: last.RedoPosRotMoveTo(obj); break; case EditingStep.StepType.mirrorX: VertexUtils.MirrorX(currentTempBuffer); break; case EditingStep.StepType.mirrorY: VertexUtils.MirrorY(currentTempBuffer); break; case EditingStep.StepType.mirrorZ: VertexUtils.MirrorZ(currentTempBuffer); break; case EditingStep.StepType.stretchX: VertexUtils.StretchX(currentTempBuffer, last.stretchFactor); break; case EditingStep.StepType.stretchY: VertexUtils.StretchY(currentTempBuffer, last.stretchFactor); break; case EditingStep.StepType.stretchZ: VertexUtils.StretchZ(currentTempBuffer, last.stretchFactor); break; } if (stepsUndone.Contains(last)) { stepsUndone.Remove(last); } stepsDone.Add(last); return(last.type); }
private void draw(int id) { GUI.DragWindow(new Rect(0, 0, 350, 28)); if (GUI.Button(new Rect(356, 3, 29, 28), "X")) { ProceduralObjectsLogic.PlaySound(); showWindow = false; } GUI.Label(new Rect(5, 27, 390, 27), "<b><size=15>" + LocalizationManager.instance.current["position"] + "</size></b>"); GUI.Label(new Rect(6, 54, 25, 24), "X :"); GUI.Label(new Rect(135, 54, 25, 24), "Y :"); GUI.Label(new Rect(266, 54, 25, 24), "Z :"); float newX, newY, newZ; if (float.TryParse(GUI.TextField(new Rect(31, 54, 100, 23), m_object.m_position.x.ToString()), out newX)) { m_object.m_position.x = newX; } if (float.TryParse(GUI.TextField(new Rect(160, 54, 100, 23), m_object.m_position.y.ToString()), out newY)) { m_object.m_position.y = newY; } if (float.TryParse(GUI.TextField(new Rect(289, 54, 100, 23), m_object.m_position.z.ToString()), out newZ)) { m_object.m_position.z = newZ; } if (GUI.Button(new Rect(5, 80, 192.5f, 22), LocalizationManager.instance.current["snapToGround"])) { m_object.SnapToGround(); Singleton <EffectManager> .instance.DispatchEffect(Singleton <BuildingManager> .instance.m_properties.m_placementEffect, new EffectInfo.SpawnArea(m_object.m_position, Vector3.up, 10f), Vector3.zero, 0f, 1f, Singleton <AudioManager> .instance.DefaultGroup, 0u, true); } if (GUI.Button(new Rect(202.5f, 80, 192.5f, 22), LocalizationManager.instance.current["storeHeight"])) { ProceduralObjectsLogic.PlaySound(); storeHeight.Invoke(); } GUI.Label(new Rect(5, 105, 390, 27), "<b><size=15>" + LocalizationManager.instance.current["edition_history"] + "</size></b>"); // undo GUI.BeginGroup(new Rect(5, 133, 135, 60)); if (m_object.historyEditionBuffer.CanUndo) { if (GUI.Button(new Rect(0, 0, 135, 60), string.Empty)) { undo.Invoke(); } else { GUI.Label(new Rect(3, 3, 98, 64), "<size=13><b>" + LocalizationManager.instance.current["undo"] + "</b></size>"); GUI.Label(new Rect(3, 20, 98, 55), "<size=10>" + LocalizationManager.instance.current["action_type"] + " : " + m_object.historyEditionBuffer.stepsDone[m_object.historyEditionBuffer.stepsDone.Count - 1].GetLocalizedStepString() + "</size>"); } } else { GUI.Box(new Rect(0, 0, 135, 60), string.Empty); GUI.color = Color.gray; GUI.Label(new Rect(10, 10, 95, 40), "<i><size=13>" + LocalizationManager.instance.current["cant_undo"] + "</size></i>"); } GUI.Label(new Rect(110, 12, 30, 30), "<size=28>↺</size>"); GUI.color = Color.white; GUI.EndGroup(); // redo GUI.BeginGroup(new Rect(145, 133, 135, 60)); if (m_object.historyEditionBuffer.CanRedo) { if (GUI.Button(new Rect(0, 0, 135, 60), string.Empty)) { redo.Invoke(); } else { GUI.Label(new Rect(30, 3, 102, 64), "<size=13><b>" + LocalizationManager.instance.current["redo"] + "</b></size>"); GUI.Label(new Rect(30, 20, 102, 55), "<size=10>" + LocalizationManager.instance.current["action_type"] + " : " + m_object.historyEditionBuffer.stepsUndone[m_object.historyEditionBuffer.stepsUndone.Count - 1].GetLocalizedStepString() + "</size>"); } } else { GUI.Box(new Rect(0, 0, 135, 60), string.Empty); GUI.color = Color.gray; GUI.Label(new Rect(37, 10, 95, 40), "<i><size=13>" + LocalizationManager.instance.current["cant_redo"] + "</size></i>"); } GUI.Label(new Rect(7, 12, 30, 30), "<size=28>↻</size>"); GUI.color = Color.white; GUI.EndGroup(); // erase history buffer var erase = new Rect(285, 133, 110, 60); if (GUI.Button(erase, string.Empty)) { m_object.historyEditionBuffer.stepsDone.Clear(); m_object.historyEditionBuffer.stepsUndone.Clear(); } GUI.Label(erase, LocalizationManager.instance.current["erase_history"]); // mirror GUI.Label(new Rect(5, 197, 145, 27), "<b><size=15>" + LocalizationManager.instance.current["mirror_mesh"] + "</size></b>"); GUI.Label(new Rect(150, 197, 270, 27), "<b><size=15>" + LocalizationManager.instance.current["stretch_mesh"] + "</size></b>"); if (m_object.isPloppableAsphalt) { GUI.color = Color.gray; GUI.Box(new Rect(5, 224, 385, 26), "<i>" + LocalizationManager.instance.current["no_mirror_no_stretch"] + "</i>"); GUI.color = Color.white; } else { GUI.color = Color.red; if (GUI.Button(new Rect(5, 224, 35, 25), "<b>X</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorX, m_vertices); VertexUtils.MirrorX(m_vertices); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.green; if (GUI.Button(new Rect(45, 224, 35, 26), "<b>Y</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorY, m_vertices); VertexUtils.MirrorY(m_vertices); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.blue; if (GUI.Button(new Rect(85, 224, 35, 26), "<b>Z</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.mirrorZ, m_vertices); VertexUtils.MirrorZ(m_vertices); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.white; // stretch GUI.Label(new Rect(150, 220, 125, 20), "x" + ((float)stretchFactor / 10f).ToString()); stretchFactor = Mathf.FloorToInt(GUI.HorizontalSlider(new Rect(150, 237, 125, 20), stretchFactor, 1f, 30f)); GUI.color = Color.red; if (GUI.Button(new Rect(280, 224, 35, 25), "<b>X</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchX, (float)stretchFactor / 10f); VertexUtils.StretchX(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.green; if (GUI.Button(new Rect(320, 224, 35, 26), "<b>Y</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchY, (float)stretchFactor / 10f); VertexUtils.StretchY(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.blue; if (GUI.Button(new Rect(360, 224, 35, 26), "<b>Z</b>")) { m_object.historyEditionBuffer.InitializeNewStep(EditingStep.StepType.stretchZ, (float)stretchFactor / 10f); VertexUtils.StretchZ(m_vertices, (float)stretchFactor / 10f); m_object.historyEditionBuffer.ConfirmNewStep(m_vertices); apply.Invoke(); } GUI.color = Color.white; } // texture UV GUI.Label(new Rect(5, 254, 390, 27), "<b><size=15>" + LocalizationManager.instance.current["texture_tiling"] + "</size></b>"); if (m_object.RequiresUVRecalculation) { if (GUI.Button(new Rect(5, 278, 235, 40), LocalizationManager.instance.current["tex_uv_mode"] + " : " + LocalizationManager.instance.current[(m_object.disableRecalculation ? "uv_stretch" : "uv_repeat")])) { if (m_object.disableRecalculation) { m_object.disableRecalculation = false; m_object.m_mesh.uv = Vertex.RecalculateUVMap(m_object, m_vertices); } else { m_object.disableRecalculation = true; m_object.m_mesh.uv = Vertex.DefaultUVMap(m_object); } } GUI.Label(new Rect(245, 277, 150, 22), string.Format(LocalizationManager.instance.current["tiling_factor"], m_object.tilingFactor)); m_object.tilingFactor = (int)Mathf.FloorToInt(GUI.HorizontalSlider(new Rect(245, 299, 150, 22), (float)m_object.tilingFactor, 1, 20)); } else { GUI.color = Color.gray; GUI.Box(new Rect(5, 277, 390, 42), "<i>" + LocalizationManager.instance.current["no_tex_tiling"] + "</i>"); GUI.color = Color.white; } }
private void LoadSelectionExternal(string[] fileLines, string path, List <Texture2D> availableTextures, bool fromWorkshop, FontManager fManager) { Dictionary <CacheProceduralObject, Vector3> objects = new Dictionary <CacheProceduralObject, Vector3>(); CacheProceduralObject obj = null; Vector3 relativePos = Vector3.zero; string name = ""; for (int i = 0; i < fileLines.Count(); i++) { if (fileLines[i].Contains("name = ")) { name = fileLines[i].Replace("name = ", "").Trim(); } else if (fileLines[i].Contains("{")) { obj = new CacheProceduralObject(); obj.tilingFactor = 8; relativePos = Vector3.zero; } else if (fileLines[i].Contains("}")) { objects[obj] = relativePos; obj = null; relativePos = Vector3.zero; } else if (fileLines[i].Contains("baseInfoType = ")) { obj.baseInfoType = fileLines[i].Replace("baseInfoType = ", ""); } else if (fileLines[i].Contains("basePrefabName = ")) { obj.basePrefabName = fileLines[i].Replace("basePrefabName = ", ""); } else if (fileLines[i].Contains("relativePosition = ")) { relativePos = fileLines[i].Replace("relativePosition = ", "").ParseVector3(); } else if (fileLines[i].Contains("renderDistance = ")) { obj.renderDistance = float.Parse(fileLines[i].Replace("renderDistance = ", "")); } // else if (lines[i].Contains("scale = ")) // obj.scale = float.Parse(lines[i].Replace("scale = ", "")); else if (fileLines[i].Contains("isPloppableAsphalt = ")) { obj.isPloppableAsphalt = bool.Parse(fileLines[i].Replace("isPloppableAsphalt = ", "")); } else if (fileLines[i].Contains("rotation = ")) { obj.m_rotation = VertexUtils.ParseQuaternion(fileLines[i].Replace("rotation = ", "")); } else if (fileLines[i].Contains("disableRecalculation = ")) { obj.disableRecalculation = bool.Parse(fileLines[i].Replace("disableRecalculation = ", "")); } else if (fileLines[i].Contains("tilingFactor = ")) { obj.tilingFactor = int.Parse(fileLines[i].Replace("tilingFactor = ", "")); } else if (fileLines[i].Contains("textParam: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseText(fileLines[i], fManager)); } else if (fileLines[i].Contains("colorRect: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseColorRect(fileLines[i])); } else if (fileLines[i].Contains("customTexture = ")) { if (fileLines[i].Replace("customTexture = ", "") == "null") { obj.customTexture = null; } else if (!availableTextures.Any(tex => tex.name == fileLines[i].Replace("customTexture = ", ""))) { Debug.LogError("[ProceduralObjects] A saved object was found with a texture that doesn't exist anymore with the name " + fileLines[i].Replace("customTexture = ", "") + ", therefore loading the default object texture"); } else { obj.customTexture = availableTextures.FirstOrDefault(tex => tex.name == fileLines[i].Replace("customTexture = ", "")); } } else if (fileLines[i].Contains("VERTICES ")) { obj.allVertices = new Vector3[int.Parse(fileLines[i].Replace("VERTICES ", ""))]; } else if (fileLines[i].Contains("vertex")) { string[] split = fileLines[i].Replace("vertex ", "").Split(new string[] { " = " }, StringSplitOptions.RemoveEmptyEntries); obj.allVertices[int.Parse(split[0])] = VertexUtils.ParseVector3(split[1]); } } ClipboardProceduralObjects selec = new ClipboardProceduralObjects(ClipboardProceduralObjects.ClipboardType.Selection); selec.selection_objects = objects; ExternalInfo info = new ExternalInfo(name, path, selec, fromWorkshop); m_externals.Add(info); }
private void LoadOneExternal(string path, List <Texture2D> availableTextures, bool fromWorkshop, FontManager fManager) { try { var lines = File.ReadAllLines(path); if (lines.Any(line => line.Contains("externaltype = selection"))) { LoadSelectionExternal(lines, path, availableTextures, fromWorkshop, fManager); } else { CacheProceduralObject obj = new CacheProceduralObject(); obj.tilingFactor = 8; string name = ""; for (int i = 0; i < lines.Count(); i++) { if (lines[i].Contains("name = ")) { name = lines[i].Replace("name = ", "").Trim(); } else if (lines[i].Contains("baseInfoType = ")) { obj.baseInfoType = lines[i].Replace("baseInfoType = ", ""); } else if (lines[i].Contains("basePrefabName = ")) { obj.basePrefabName = lines[i].Replace("basePrefabName = ", ""); } else if (lines[i].Contains("renderDistance = ")) { obj.renderDistance = float.Parse(lines[i].Replace("renderDistance = ", "")); } // else if (lines[i].Contains("scale = ")) // obj.scale = float.Parse(lines[i].Replace("scale = ", "")); else if (lines[i].Contains("isPloppableAsphalt = ")) { obj.isPloppableAsphalt = bool.Parse(lines[i].Replace("isPloppableAsphalt = ", "")); } else if (lines[i].Contains("tilingFactor = ")) { obj.tilingFactor = int.Parse(lines[i].Replace("tilingFactor = ", "")); } else if (lines[i].Contains("rotation = ")) { obj.m_rotation = VertexUtils.ParseQuaternion(lines[i].Replace("rotation = ", "")); } else if (lines[i].Contains("disableRecalculation = ")) { obj.disableRecalculation = bool.Parse(lines[i].Replace("disableRecalculation = ", "")); } else if (lines[i].Contains("customTexture = ")) { if (lines[i].Replace("customTexture = ", "") == "null") { obj.customTexture = null; } else if (!availableTextures.Any(tex => tex.name == lines[i].Replace("customTexture = ", ""))) { Debug.LogError("[ProceduralObjects] A saved object was found with a texture that doesn't exist anymore with the name " + lines[i].Replace("customTexture = ", "") + ", therefore loading the default object texture"); } else { obj.customTexture = availableTextures.FirstOrDefault(tex => tex.name == lines[i].Replace("customTexture = ", "")); } } else if (lines[i].Contains("textParam: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseText(lines[i], fManager)); } else if (lines[i].Contains("colorRect: ")) { if (obj.textParam == null) { obj.textParam = new TextParameters(); } obj.textParam.AddField(TextField.ParseColorRect(lines[i])); } else if (lines[i].Contains("VERTICES ")) { obj.allVertices = new Vector3[int.Parse(lines[i].Replace("VERTICES ", ""))]; } else if (lines[i].Contains("vertex")) { string[] split = lines[i].Replace("vertex ", "").Split(new string[] { " = " }, StringSplitOptions.RemoveEmptyEntries); obj.allVertices[int.Parse(split[0])] = VertexUtils.ParseVector3(split[1]); } } ExternalInfo info = new ExternalInfo(name, path, obj, fromWorkshop); m_externals.Add(info); } } catch { Debug.LogError("[ProceduralObjects] Couldn't load an External Procedural Object : Invalid, corrupted or edited file at path : " + path); } }