Пример #1
0
        void UpdateStartExtrudeMesh()
        {
            MirrorMethod lastMirror = MirrorMethod.None;

            if (extrudableMeshes[0] != null)
            {
                lastMirror = extrudableMeshes[0].mirror;
            }
            if (_startMesh != null)
            {
                extrudableMeshes[0] = new ExtrudableMesh(_startMesh, _axis);
            }
            else if (_middleMeshes.Length > 0)
            {
                if (_iteration == Iteration.Ordered)
                {
                    extrudableMeshes[0] = new ExtrudableMesh(_middleMeshes[0], _axis);
                }
                else
                {
                    random = new System.Random(_randomSeed);
                    extrudableMeshes[0] = new ExtrudableMesh(_middleMeshes[random.Next(_middleMeshes.Length - 1)], _axis);
                }
            }
            if (extrudableMeshes[0] != null)
            {
                extrudableMeshes[0].mirror = lastMirror;
            }
        }
Пример #2
0
        void UpdateEndExtrudeMesh()
        {
            MirrorMethod lastMirror = MirrorMethod.None;

            lastMirror = MirrorMethod.None;
            if (extrudableMeshes[1] != null)
            {
                lastMirror = extrudableMeshes[1].mirror;
            }
            if (_endMesh != null)
            {
                extrudableMeshes[1] = new ExtrudableMesh(_endMesh, _axis);
            }
            else if (_middleMeshes.Length > 0)
            {
                if (_iteration == Iteration.Ordered)
                {
                    extrudableMeshes[1] = new ExtrudableMesh(_middleMeshes[_startMesh != null ? (iterations - 2) % _middleMeshes.Length : (iterations - 1) % _middleMeshes.Length], _axis);
                }
                else
                {
                    random = new System.Random(_randomSeed);
                    for (int i = 0; i < iterations - 1; i++)
                    {
                        random.Next(_middleMeshes.Length - 1);
                    }
                    extrudableMeshes[1] = new ExtrudableMesh(_middleMeshes[random.Next(_middleMeshes.Length - 1)], _axis);
                }
            }
            if (extrudableMeshes[1] != null)
            {
                extrudableMeshes[1].mirror = lastMirror;
            }
        }
Пример #3
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        ExtrudableMesh ex = target as ExtrudableMesh;

        if (GUILayout.Button("Print debug"))
        {
            var manifold    = ex._manifold;
            var faceIds     = new int[manifold.NumberOfFaces()];
            var vertexIds   = new int[manifold.NumberOfVertices()];
            var halfedgeIds = new int[manifold.NumberOfHalfEdges()];
            manifold.GetHMeshIds(vertexIds, halfedgeIds, faceIds);
            string res = "";
            res += "\nVertexIds: ";
            foreach (var vertexId in vertexIds)
            {
                res += vertexId + ", ";
            }
            res += "\nFaceids: ";
            foreach (var faceId in faceIds)
            {
                res += faceId + ", ";
            }

            res += "\nHalfedgeIds: ";
            foreach (var halfedgeId in halfedgeIds)
            {
                res += halfedgeId + ", ";
            }

            Debug.Log(res);
        }
    }
Пример #4
0
    public bool RefineMentTest(int halfedge)
    {
        ExtrudableMesh _extrudableMesh = modellingObject.GetComponentInChildren <ExtrudableMesh>();
        Manifold       manifold        = _extrudableMesh._manifold;

        if (manifold.IsHalfedgeInUse(halfedge))
        {
            int h2 = manifold.GetNextHalfEdge(halfedge);
            h2 = manifold.GetNextHalfEdge(h2);

            if (manifold.IsHalfedgeInUse(h2))
            {
                int v1     = _extrudableMesh._manifold.SplitEdge(halfedge);
                int v2     = _extrudableMesh._manifold.SplitEdge(h2);
                int output = _extrudableMesh._manifold.SplitFaceByEdges(manifold.GetIncidentFace(halfedge), v1, v2);
                _extrudableMesh.UpdateMesh();

                ControlsManager man = modellingObject.GetComponentInChildren <Controls.ControlsManager>();
                man.UpdateControls();

                return(true);
            }
        }

        return(false);
    }
Пример #5
0
 // Use this for initialization
 void Awake()
 {
     Instance                    = this;
     _extrudableMesh             = FindObjectOfType <ExtrudableMesh>();
     _controlsManager            = FindObjectOfType <ControlsManager>();
     undoActions                 = new List <UndoData>();
     _controlsManager.undoReset += OnModelReset;
     _controlsManager.undoStartEventHandlers += OnUndoStartAction;
     _controlsManager.undoEndEventHandlers   += OnUndoEndAction;
     UpdateVisuals();
 }
Пример #6
0
 private void CreateTSFromExtrudableMesh(ExtrudableMesh source, ref TS_Mesh target)
 {
     if (target.vertices.Length != source.vertices.Length)
     {
         target.vertices = new Vector3[source.vertices.Length];
     }
     if (target.normals.Length != source.normals.Length)
     {
         target.normals = new Vector3[source.normals.Length];
     }
     if (target.tangents.Length != source.tangents.Length)
     {
         target.tangents = new Vector4[source.tangents.Length];
     }
     if (target.colors.Length != source.colors.Length)
     {
         target.colors = new Color[source.colors.Length];
     }
     if (target.uv.Length != source.uv.Length)
     {
         target.uv = new Vector2[source.uv.Length];
     }
     source.uv.CopyTo(target.uv, 0);
     if (target.uv.Length != target.vertices.Length)
     {
         Vector2[] newUv = new Vector2[target.vertices.Length];
         for (int i = 0; i < target.vertices.Length; i++)
         {
             if (i < target.uv.Length)
             {
                 newUv[i] = target.uv[i];
             }
             else
             {
                 newUv[i] = Vector2.zero;
             }
         }
         target.uv = newUv;
     }
     source.colors.CopyTo(target.colors, 0);
     target.subMeshes.Clear();
     for (int n = 0; n < source.subMeshes.Count; n++)
     {
         target.subMeshes.Add(source.subMeshes[n].triangles);
     }
 }
Пример #7
0
        private void TRS(ExtrudableMesh source, TS_Mesh target, double percent)
        {
            CreateTSFromExtrudableMesh(source, ref target);
            SplineResult splineResult = Evaluate(percent);
            Quaternion   rhs          = Quaternion.identity;

            switch (axis)
            {
            case Axis.X:
                rhs = Quaternion.LookRotation(Vector3.right);
                break;

            case Axis.Y:
                rhs = Quaternion.LookRotation(Vector3.up, Vector3.back);
                break;
            }
            ref Matrix4x4 reference = ref vertexMatrix;
Пример #8
0
 public void SetEndMesh(Mesh inputMesh, MirrorMethod mirror = MirrorMethod.None)
 {
     _endMesh = inputMesh;
     if (extrudableMeshes.Count < 2)
     {
         extrudableMeshes.AddRange(new ExtrudableMesh[2 - extrudableMeshes.Count]);
     }
     if (_endMesh == null)
     {
         extrudableMeshes[1] = null;
         _hasEndMesh         = false;
         Rebuild(false);
         return;
     }
     extrudableMeshes[1]        = new ExtrudableMesh(_endMesh, _axis);
     extrudableMeshes[1].mirror = mirror;
     CheckMeshes();
     Rebuild(false);
 }
Пример #9
0
 public void SetStartMesh(Mesh inputMesh, MirrorMethod mirror = MirrorMethod.None)
 {
     _startMesh = inputMesh;
     if (extrudableMeshes.Count == 0)
     {
         extrudableMeshes.Add(null);
     }
     if (_startMesh == null)
     {
         extrudableMeshes[0] = null;
         _hasStartMesh       = false;
         Rebuild(false);
         return;
     }
     extrudableMeshes[0]        = new ExtrudableMesh(_startMesh, _axis);
     extrudableMeshes[0].mirror = mirror;
     CheckMeshes();
     Rebuild(false);
 }
Пример #10
0
        /// <summary>
        /// Creates the mesh array that will be referenced when extruding the meshes. Elements 0 and 1 are the start and end cap meshes
        /// </summary>
        void UpdateExtrudableMeshes()
        {
            iterations = 0;
            if (_startMesh != null)
            {
                iterations++;
            }
            if (_endMesh != null)
            {
                iterations++;
            }
            iterations += (extrudableMeshes.Count - 2) * _repeat;
            int targetCount = 2 + _middleMeshes.Length;

            if (extrudableMeshes.Count < targetCount)
            {
                extrudableMeshes.AddRange(new ExtrudableMesh[targetCount - extrudableMeshes.Count]);
            }

            for (int i = 0; i < _middleMeshes.Length; i++)
            {
                if (_middleMeshes[i] == null)
                {
                    RemoveMesh(i);
                    i--;
                    continue;
                }
                MirrorMethod lastMirror = MirrorMethod.None;
                if (extrudableMeshes[i + 2] != null)
                {
                    lastMirror = extrudableMeshes[i + 2].mirror;
                    extrudableMeshes[i + 2].Update(_middleMeshes[i], _axis);
                }
                else
                {
                    extrudableMeshes[i + 2] = new ExtrudableMesh(_middleMeshes[i], _axis);
                }
                extrudableMeshes[i + 2].mirror = lastMirror;
            }
            UpdateStartExtrudeMesh();
            UpdateEndExtrudeMesh();
        }
Пример #11
0
        private void TRS(ExtrudableMesh source, TS_Mesh target, double percent)
        {
            CreateTSFromExtrudableMesh(source, ref target);
            SplineResult result       = Evaluate(percent);
            Matrix4x4    trsMatrix    = new Matrix4x4();
            Quaternion   axisRotation = Quaternion.identity;

            switch (axis)
            {
            case Axis.X: axisRotation = Quaternion.LookRotation(Vector3.right); break;

            case Axis.Y: axisRotation = Quaternion.LookRotation(Vector3.up, Vector3.back); break;
            }
            trsMatrix.SetTRS(result.position + result.right * offset.x + result.normal * offset.y + result.direction * offset.z, result.rotation * Quaternion.AngleAxis(rotation, Vector3.forward) * axisRotation, new Vector3(_scale.x, _scale.y, 1f) * result.size);
            for (int i = 0; i < target.vertexCount; i++)
            {
                target.vertices[i] = trsMatrix.MultiplyPoint3x4(source.vertices[i]);
                target.normals[i]  = trsMatrix.MultiplyVector(source.normals[i]);
            }
        }
Пример #12
0
        private void Stretch(ExtrudableMesh source, TS_Mesh target, double from, double to)
        {
            CreateTSFromExtrudableMesh(source, ref target);
            SplineResult result       = new SplineResult();
            Vector2      uv           = Vector2.zero;
            Vector3      trsVector    = Vector3.zero;
            Matrix4x4    trsMatrix    = new Matrix4x4();
            Quaternion   axisRotation = Quaternion.identity;

            switch (axis)
            {
            case Axis.X: axisRotation = Quaternion.LookRotation(Vector3.left); break;

            case Axis.Y: axisRotation = Quaternion.LookRotation(Vector3.up, Vector3.forward); break;
            }

            for (int i = 0; i < source.vertexGroups.Count; i++)
            {
                double evalPercent = 0.0;
                switch (axis)
                {
                case Axis.X: evalPercent = DMath.Clamp01(Mathf.InverseLerp(source.bounds.min.x, source.bounds.max.x, source.vertexGroups[i].value)); break;

                case Axis.Y: evalPercent = DMath.Clamp01(Mathf.InverseLerp(source.bounds.min.y, source.bounds.max.y, source.vertexGroups[i].value)); break;

                case Axis.Z: evalPercent = DMath.Clamp01(Mathf.InverseLerp(source.bounds.min.z, source.bounds.max.z, source.vertexGroups[i].value)); break;
                }

                if (useLastResult && i == source.vertexGroups.Count)
                {
                    result = lastResult;
                }
                else
                {
                    Evaluate(result, UnclipPercent(DMath.Lerp(from, to, evalPercent)));
                }
                trsMatrix.SetTRS(result.position + result.right * offset.x + result.normal * offset.y + result.direction * offset.z, result.rotation * Quaternion.AngleAxis(rotation, Vector3.forward), new Vector3(_scale.x, _scale.y, 1f) * result.size);
                if (i == 0)
                {
                    lastResult.CopyFrom(result);
                }

                for (int n = 0; n < source.vertexGroups[i].ids.Length; n++)
                {
                    int index = source.vertexGroups[i].ids[n];
                    trsVector              = axisRotation * source.vertices[index];
                    trsVector.z            = 0f;
                    target.vertices[index] = trsMatrix.MultiplyPoint3x4(trsVector);
                    trsVector              = axisRotation * source.normals[index];
                    target.normals[index]  = trsMatrix.MultiplyVector(trsVector);
                    target.colors[index]   = target.colors[index] * result.color;
                    uv = target.uv[index];
                    switch (_tileUVs)
                    {
                    case TileUVs.U: uv.x = (float)result.percent; break;

                    case TileUVs.V: uv.y = (float)result.percent; break;

                    case TileUVs.UniformU: uv.x = CalculateLength(0.0, result.percent); break;

                    case TileUVs.UniformV: uv.y = CalculateLength(0.0, result.percent); break;
                    }
                    target.uv[index]  = new Vector2(uv.x * uvScale.x, uv.y * uvScale.y);
                    target.uv[index] += uvOffset;
                }
            }
        }
Пример #13
0
        /// <summary>
        /// Creates the mesh array that will be referenced when extruding the meshes. Elements 0 and 1 are the start and end cap meshes
        /// </summary>
        void UpdateExtrudableMeshes()
        {
            iterations = 0;
            if (_startMesh != null)
            {
                iterations++;
            }
            if (_endMesh != null)
            {
                iterations++;
            }
            iterations += (extrudableMeshes.Count - 2) * _repeat;
            int targetCount = 2 + _middleMeshes.Length;

            if (extrudableMeshes.Count < targetCount)
            {
                extrudableMeshes.AddRange(new ExtrudableMesh[targetCount - extrudableMeshes.Count]);
            }
            //If the deprecated sourceMesh is set, then migrate it to the new mesh array
            if (_sourceMesh != null)
            {
                Mesh[] newMeshes = new Mesh[_middleMeshes.Length + 1];
                _middleMeshes.CopyTo(newMeshes, 0);
                newMeshes[newMeshes.Length - 1] = _sourceMesh;
                _middleMeshes = newMeshes;
                extrudableMeshes.Add(new ExtrudableMesh(_sourceMesh, _axis));
                _sourceMesh = null;
#if UNITY_EDITOR
                if (!Application.isPlaying)
                {
#if UNITY_5_4_OR_NEWER
                    UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene());
#else
                    UnityEditor.EditorUtility.SetDirty(gameObject);
#endif
                }
#endif
            }

            for (int i = 0; i < _middleMeshes.Length; i++)
            {
                if (_middleMeshes[i] == null)
                {
                    RemoveMesh(i);
                    i--;
                    continue;
                }
                MirrorMethod lastMirror = MirrorMethod.None;
                if (extrudableMeshes[i + 2] != null)
                {
                    lastMirror = extrudableMeshes[i + 2].mirror;
                    extrudableMeshes[i + 2].Update(_middleMeshes[i], _axis);
                }
                else
                {
                    extrudableMeshes[i + 2] = new ExtrudableMesh(_middleMeshes[i], _axis);
                }
                extrudableMeshes[i + 2].mirror = lastMirror;
            }
            UpdateStartExtrudeMesh();
            UpdateEndExtrudeMesh();
        }
Пример #14
0
    public bool RefinementTestLoop(int halfedge1, int halfedge2)
    {
        if (!ValidateFaceLoop(halfedge1, halfedge2))
        {
            return(false);
        }
        ExtrudableMesh _extrudableMesh = modellingObject.GetComponentInChildren <ExtrudableMesh>();
        Manifold       manifold        = _extrudableMesh._manifold;

        int h          = halfedge1;
        int initital_f = manifold.GetIncidentFace(halfedge1);
        int f          = initital_f;

        List <int> faceloop = new List <int>();
        List <int> edgeloop = new List <int>();

        while (true)
        {
            if (manifold.IsFaceInUse(f))
            {
                if (manifold.IsHalfedgeInUse(h))
                {
                    int h2 = manifold.GetNextHalfEdge(h);
                    h2 = manifold.GetNextHalfEdge(h2);
                    if (manifold.IsHalfedgeInUse(h2))
                    {
                        int w = manifold.SplitEdge(h);
                        edgeloop.Add(w);
                        faceloop.Add(f);

                        h = manifold.GetOppHalfEdge(h2);
                        f = manifold.GetIncidentFace(h);
                        if (f == initital_f)
                        {
                            int[] farray = faceloop.ToArray();
                            int[] earray = edgeloop.ToArray();
                            for (int i = 0; i < farray.Length; i++)
                            {
                                if (i == farray.Length - 1)
                                {
                                    int output = manifold.SplitFaceByEdges(farray[i], earray[i], earray[0]); // earray[1]);
                                }
                                else
                                {
                                    int output = manifold.SplitFaceByEdges(farray[i], earray[i], earray[i + 1]);
                                }
                            }
                            _extrudableMesh.UpdateMesh();
                            return(true);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
    }