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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 10
0
        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;
            }
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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);
            }
        }