Example #1
0
        public bool FlipChanelOnLine(ColorChanel chan, MeshPoint other)
        {
            float val = 1;

            if (Cfg.makeVerticesUniqueOnEdgeColoring)
            {
                EditedMesh.GiveLineUniqueVerticesRefreshTriangleListing(new LineData(this, other));
            }

            foreach (var u in vertices)
            {
                if (u.ConnectedTo(other))
                {
                    val *= chan.GetValueFrom(u.color) * chan.GetValueFrom(u.GetConnectedUVinVertex(other).color);
                }
            }

            val = (val > 0.9f) ? 0 : 1;

            SetChanel(chan, other, val);
            other.SetChanel(chan, this, val);

            EditedMesh.Dirty = true;

            return(val == 1);
        }
Example #2
0
        public override bool MouseEventPointedTriangle()
        {
            var m = MeshMGMT;

            if (EditorInputManager.GetMouseButtonDown(0))
            {
                m.Dragging              = true;
                _originalPosition       = GridNavigator.collisionPos;
                GridNavigator.onGridPos = GridNavigator.collisionPos;
                _draggedVertices.Clear();
                foreach (var uv in PointedTriangle.vertexes)
                {
                    _draggedVertices.Add(uv.meshPoint);
                }
            }

            if (!_addToTrianglesAndLines || !EditorInputManager.GetMouseButtonUp(0) || !(m.DragDelay > 0) ||
                !_draggedVertices.Contains(PointedTriangle))
            {
                return(false);
            }

            if (Cfg.newVerticesUnique)
            {
                EditedMesh.InsertIntoTriangleUniqueVertices(m.PointedTriangle, m.collisionPosLocal);
            }
            else
            {
                EditedMesh.InsertIntoTriangle(m.PointedTriangle, m.collisionPosLocal);
            }

            return(false);
        }
Example #3
0
        public bool FlipChanelOnLine(ColorChanel chan, MeshPoint other)
        {
            float val = 1;

            if (Cfg.MakeVericesUniqueOnEdgeColoring)
            {
                EditedMesh.GiveLineUniqueVerticles_RefreshTrisListing(new LineData(this, other));
            }

            foreach (Vertex u in uvpoints)
            {
                if (u.ConnectedTo(other))
                {
                    val *= u._color.GetChanel(chan) * u.GetConnectedUVinVert(other)._color.GetChanel(chan);
                }
            }

            val = (val > 0.9f) ? 0 : 1;

            SetChanel(chan, other, val);
            other.SetChanel(chan, this, val);



            EditedMesh.Dirty = true;


            return(val == 1);
        }
Example #4
0
    // will also remove any triangles which are using the verts
    public static void RemoveVerts(List <int> vertsToRemove, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh();

        Dictionary <int, int> vertRemapping = new Dictionary <int, int>();

        for (int vert = 0; vert < mesh.vertices.Length; ++vert)
        {
            if (!vertsToRemove.Contains(vert))
            {
                vertRemapping.Add(vert, meshEdit.verts.Count);
                meshEdit.verts.Add(mesh.vertices[vert]);
            }
        }

        for (int triangleIndex = 0; triangleIndex < mesh.triangles.Length; triangleIndex += NumVertsPerTriangle)
        {
            if (!vertsToRemove.Contains(mesh.triangles[triangleIndex]) &&
                !vertsToRemove.Contains(mesh.triangles[triangleIndex + 1]) &&
                !vertsToRemove.Contains(mesh.triangles[triangleIndex + 2]))                 // if none of this triangles verts are being removed, keep triangle
            {
                meshEdit.triangleIndecis.Add(vertRemapping[mesh.triangles[triangleIndex]]);
                meshEdit.triangleIndecis.Add(vertRemapping[mesh.triangles[triangleIndex + 1]]);
                meshEdit.triangleIndecis.Add(vertRemapping[mesh.triangles[triangleIndex + 2]]);
            }
        }
        meshEdit.CopyTo(mesh);
    }
Example #5
0
        public override void KeysEventPointedVertex()
        {
            var m = MeshMGMT;

            if (KeyCode.Delete.IsDown())
            {
                if (!EditorInputManager.Control)
                {
                    if (m.PointedUv.meshPoint.vertices.Count == 1)
                    {
                        if (!m.DeleteVertexHeal(MeshMGMT.PointedUv.meshPoint))
                        {
                            EditedMesh.DeleteUv(MeshMGMT.PointedUv);
                        }
                    }
                    else
                    {
                        while (m.PointedUv.meshPoint.vertices.Count > 1)
                        {
                            EditedMesh.MoveTriangle(m.PointedUv.meshPoint.vertices[1], m.PointedUv.meshPoint.vertices[0]);
                        }
                    }
                }
                else
                {
                    EditedMesh.DeleteUv(m.PointedUv);
                }

                EditedMesh.Dirty = true;
            }
        }
Example #6
0
        public override bool MouseEventPointedLine()
        {
            if (EditorInputManager.GetMouseButton(0))
            {
                if (_mergeUnMerge)
                {
                    if (!EditorInputManager.Shift)
                    {
                        EditedMesh.AllVerticesShared(PointedLine);
                    }
                    else
                    {
                        Dirty |= PointedLine.GiveUniqueVerticesToTriangles();
                    }
                }
                else
                {
                    for (var i = 0; i < 2; i++)
                    {
                        Dirty |= PointedLine[i].SetSmoothNormal(!EditorInputManager.Shift);
                    }
                }
            }

            return(false);
        }
Example #7
0
    // triangleVertIndecis must be a multiple of three, each triangle must have three vert indecis
    public static void AddTriangles(List <int> triangleVertIndecis, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh(mesh);

        meshEdit.AddTriangles(triangleVertIndecis);
        meshEdit.CopyTo(mesh);
    }
Example #8
0
        public override bool MouseEventPointedLine()
        {
            var m = MeshMGMT;

            if (EditorInputManager.GetMouseButtonDown(0))
            {
                m.Dragging              = true;
                _originalPosition       = GridNavigator.collisionPos;
                GridNavigator.onGridPos = GridNavigator.collisionPos;
                _draggedVertices.Clear();
                foreach (var uv in PointedLine.points)
                {
                    _draggedVertices.Add(uv.meshPoint);
                }
            }

            if (EditorInputManager.GetMouseButtonUp(0))
            {
                if (_addToTrianglesAndLines && m.DragDelay > 0 && _draggedVertices.Contains(PointedLine))
                {
                    EditedMesh.InsertIntoLine(MeshMGMT.PointedLine.points[0].meshPoint, MeshMGMT.PointedLine.points[1].meshPoint, MeshMGMT.collisionPosLocal);
                }
            }

            return(false);
        }
Example #9
0
            public bool MeshToolInspection(MeshToolBase currentTool)
            {

                if (currentTool is VertexEdgeTool && MeshEditorManager.target.IsAtlased())
                {
                    "ATL_tex_Chanal:".edit(80, ref TriangleAtlasTool.Inst.curAtlasChanel);

                    if ("Auto Edge".Click().nl())
                    {

                        EditedMesh.TagTrianglesUnprocessed();
                        foreach (var t in EditedMesh.triangles)
                            if (!t.wasProcessed)
                            {

                                t.wasProcessed = true;

                                var ntris = t.GetNeighboringTrianglesUnprocessed();
                                foreach (var nt in ntris)
                                    if (t.textureNo[TriangleAtlasTool.Inst.curAtlasChanel] !=
                                        nt.textureNo[TriangleAtlasTool.Inst.curAtlasChanel])
                                    {
                                        var ln = t.LineWith(nt);
                                        if (ln != null) VertexEdgeTool.PutEdgeOnLine(ln);
                                        else Debug.Log("null line discoveredd");
                                    }
                            }

                        EditedMesh.Dirty = true;

                    }
                }

                return false;
            }
Example #10
0
        void OnClickDetected()
        {
            var m = MeshMGMT;

            if (ShowVertices && m.TriVertices < 3 && m.SelectedUv != null && !EditedMesh.IsInTriangleSet(m.SelectedUv.meshPoint))
            {
                EditedMesh.AddToTrisSet(m.SelectedUv);
            }
        }
Example #11
0
    public static void DuplicateVerts(List <int> vertsToDuplicate, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh(mesh);

        for (int index = 0; index < vertsToDuplicate.Count; ++index)
        {
            meshEdit.verts.Add(mesh.vertices[vertsToDuplicate[index]]);
        }
        meshEdit.CopyTo(mesh);
    }
Example #12
0
    // snap the vert to a length along the axis
    public static void SnapVertsOnAxis(List <int> vertsToMove, Vector3 snapAxis, float snapLength, Mesh mesh)
    {
        EditedMesh meshEdit           = new EditedMesh(mesh);
        Vector3    snapAxisNormalized = snapAxis.normalized;

        for (int index = 0; index < vertsToMove.Count; ++index)
        {
            float fixUpLength = snapLength - Vector3.Dot(meshEdit.verts[vertsToMove[index]], snapAxisNormalized);
            meshEdit.verts[vertsToMove[index]] = meshEdit.verts[vertsToMove[index]] + snapAxisNormalized * fixUpLength;
        }
        meshEdit.CopyTo(mesh);
    }
Example #13
0
    public static void MoveVerts(List <int> vertsToMove, Vector3 delta, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh(mesh);

        int vertsToMoveCount = vertsToMove.Count;

        for (int index = 0; index < vertsToMoveCount; ++index)
        {
            meshEdit.verts[vertsToMove[index]] += delta;
        }
        meshEdit.CopyTo(mesh);
    }
Example #14
0
        public override bool MouseEventPointedLine()
        {
            var a = PointedLine.points[0];
            var b = PointedLine.points[1];

            MeshMGMT.AssignSelected(
                Vector3.Distance(MeshMGMT.collisionPosLocal, a.LocalPos) <
                Vector3.Distance(MeshMGMT.collisionPosLocal, b.LocalPos)
                    ? EditedMesh.GetUvPointAFromLine(a.meshPoint, b.meshPoint)
                    : EditedMesh.GetUvPointAFromLine(b.meshPoint, a.meshPoint));

            return(false);
        }
Example #15
0
        public override bool Inspect()
        {
            var m = MeshMGMT;

            "OnClick:".write(60);
            if ((_mergeUnMerge ? "Merging (Shift: Unmerge)" : "Smoothing (Shift: Unsmoothing)").Click().nl())
            {
                _mergeUnMerge = !_mergeUnMerge;
            }

            if ("Sharp All".Click())
            {
                foreach (MeshPoint vr in EditedMesh.meshPoints)
                {
                    vr.smoothNormal = false;
                }
                EditedMesh.Dirty      = true;
                Cfg.newVerticesSmooth = false;
            }

            if ("Smooth All".Click().nl())
            {
                foreach (var vr in EditedMesh.meshPoints)
                {
                    vr.smoothNormal = true;
                }
                EditedMesh.Dirty      = true;
                Cfg.newVerticesSmooth = true;
            }


            if ("All shared".Click())
            {
                EditedMesh.AllVerticesShared();
                EditedMesh.Dirty      = true;
                Cfg.newVerticesUnique = false;
            }

            if ("All unique".Click().nl())
            {
                foreach (var t in EditedMesh.triangles)
                {
                    EditedMesh.GiveTriangleUniqueVertices(t);
                }
                Cfg.newVerticesUnique = true;
            }



            return(false);
        }
Example #16
0
    // reverse the winding order of the triangle
    public static void ChangeTrianglesWinding(List <int> trianglesToChange, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh(mesh);

        for (int triangle = 0; triangle < trianglesToChange.Count; ++triangle)
        {
            int firstTriangleIndex = trianglesToChange[triangle] * NumVertsPerTriangle;

            int temp = meshEdit.triangleIndecis[firstTriangleIndex];
            meshEdit.triangleIndecis[firstTriangleIndex]     = meshEdit.triangleIndecis[firstTriangleIndex + 2];
            meshEdit.triangleIndecis[firstTriangleIndex + 2] = temp;
        }
        meshEdit.CopyTo(mesh);
    }
Example #17
0
    public static void AddUnitTriangle(Mesh mesh)
    {
        int        currentNumVerts = mesh.vertices.Length;
        EditedMesh meshEdit        = new EditedMesh(mesh);

        meshEdit.AddVerts(new List <Vector3>()
        {
            Vector3.zero, new Vector3(-1f, 0f, 0f), new Vector3(0f, 0f, 1f)
        });

        meshEdit.AddTriangles(new List <int>()
        {
            currentNumVerts, currentNumVerts + 1, currentNumVerts + 2
        });
        meshEdit.CopyTo(mesh);
    }
Example #18
0
        public override bool MouseEventPointedLine()
        {
            Vertex a = PointedLine.pnts[0];
            Vertex b = PointedLine.pnts[1];

            if (Vector3.Distance(MeshMGMT.collisionPosLocal, a.Pos) < Vector3.Distance(MeshMGMT.collisionPosLocal, b.Pos))
            {
                MeshMGMT.AssignSelected(EditedMesh.GetUVpointAFromLine(a.meshPoint, b.meshPoint));
            }
            else
            {
                MeshMGMT.AssignSelected(EditedMesh.GetUVpointAFromLine(b.meshPoint, a.meshPoint));
            }

            return(false);
        }
Example #19
0
    public static void RemoveUnusedVerts(Mesh mesh)
    {
        EditedMesh            meshEdit      = new EditedMesh();
        Dictionary <int, int> vertRemapping = new Dictionary <int, int>();

        for (int triangleIndex = 0; triangleIndex < mesh.triangles.Length; ++triangleIndex)
        {
            int vert = mesh.triangles[triangleIndex];
            if (!vertRemapping.ContainsKey(vert))
            {
                vertRemapping.Add(vert, meshEdit.verts.Count);
                meshEdit.verts.Add(mesh.vertices[vert]);
            }
            meshEdit.triangleIndecis.Add(vertRemapping[vert]);
        }
        meshEdit.CopyTo(mesh);
    }
Example #20
0
    // triangle zero, will mean the first triangle (three triangle indecis) are deleted, triangle index 1, the second triangle deleted
    public static void RemoveTriangles(List <int> trianglesToRemove, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh();

        meshEdit.AddVerts(mesh.vertices);
        for (int triangle = 0; triangle < CalculateNumTriangles(mesh); ++triangle)
        {
            if (!trianglesToRemove.Contains(triangle))
            {
                int startingTriangleIndex = triangle * NumVertsPerTriangle;
                meshEdit.triangleIndecis.Add(mesh.triangles[startingTriangleIndex]);
                meshEdit.triangleIndecis.Add(mesh.triangles[startingTriangleIndex + 1]);
                meshEdit.triangleIndecis.Add(mesh.triangles[startingTriangleIndex + 2]);
            }
        }
        meshEdit.CopyTo(mesh);
    }
Example #21
0
        public bool SetAllUVsShared()
        {
            if (uvpoints.Count == 1)
            {
                return(false);
            }

            while (uvpoints.Count > 1)
            {
                if (!EditedMesh.MoveTris(uvpoints[1], uvpoints[0]))
                {
                    break;
                }
            }

            return(true);
        }
Example #22
0
        public override void KeysEventPointedLine()
        {
            if ((KeyCode.Backspace.IsDown()))
            {
                var a = PointedLine.points[0];
                var b = PointedLine.points[1];

                if (!EditorInputManager.Control)
                {
                    EditedMesh.SwapLine(a.meshPoint, b.meshPoint);
                }
                else
                {
                    EditedMesh.DeleteLine(PointedLine);
                }

                EditedMesh.Dirty = true;
            }
        }
Example #23
0
        public static bool PutEdgesBetweenSubmeshes()
        {
            if (MeshMGMT.target.IsAtlased())
            {
                "ATL_tex_Chanal:".edit(80, ref TriangleAtlasTool.Inst.curAtlasChanel);

                if ("Auto Edge".Click().nl())
                {
                    EditedMesh.TagTrianglesUnprocessed();
                    foreach (var t in EditedMesh.triangles)
                    {
                        if (!t.wasProcessed)
                        {
                            t.wasProcessed = true;

                            var ntris = t.GetNeighboringTrianglesUnprocessed();
                            foreach (var nt in ntris)
                            {
                                if (t.textureNo[TriangleAtlasTool.Inst.curAtlasChanel] != nt.textureNo[TriangleAtlasTool.Inst.curAtlasChanel])
                                {
                                    var ln = t.LineWith(nt);
                                    if (ln != null)
                                    {
                                        VertexEdgeTool.PutEdgeOnLine(ln);
                                    }
                                    else
                                    {
                                        Debug.Log("null line discoveredd");
                                    }
                                }
                            }
                        }
                    }
                    EditedMesh.Dirty = true;
                }
            }
            return(false);
        }
Example #24
0
        public override bool MouseEventPointedTriangle()
        {
            if (EditorInputManager.GetMouseButton(0))
            {
                if (MergeUnmerge)
                {
                    if (EditorInputManager.getShiftKey())
                    {
                        EditedMesh.Dirty |= PointedTris.SetAllVerticesShared();
                    }
                    else
                    {
                        EditedMesh.Dirty |= EditedMesh.GiveTriangleUniqueVerticles(PointedTris);
                    }
                }
                else
                {
                    EditedMesh.Dirty |= PointedTris.SetSmoothVertices(!EditorInputManager.getShiftKey());
                }
            }

            return(false);
        }
Example #25
0
        public override bool MouseEventPointedVertex()
        {
            if (EditorInputManager.GetMouseButton(0))
            {
                if (_mergeUnMerge)
                {
                    if (EditorInputManager.Shift)
                    {
                        EditedMesh.SetAllUVsShared(PointedVertex); // .SetAllVerticesShared();
                    }
                    else
                    {
                        EditedMesh.Dirty |= PointedVertex.AllPointsUnique(); //editedMesh.GiveTriangleUniqueVertices(pointedTriangle);
                    }
                }
                else
                {
                    EditedMesh.Dirty |= PointedVertex.SetSmoothNormal(!EditorInputManager.Shift);
                }
            }

            return(false);
        }
Example #26
0
    public static void DuplicateTriangles(List <int> trianglesToDuplicate, Mesh mesh)
    {
        EditedMesh meshEdit = new EditedMesh(mesh);
        // go over all the trianles, making copies of all the verts which are used
        Dictionary <int, int> vertRemapping = new Dictionary <int, int>();

        for (int index = 0; index < trianglesToDuplicate.Count; ++index)
        {
            int startingTriangleIndex = trianglesToDuplicate[index] * NumVertsPerTriangle;

            for (int triangleVert = 0; triangleVert < NumVertsPerTriangle; ++triangleVert)
            {
                int vertIndex = mesh.triangles[startingTriangleIndex + triangleVert];
                if (!vertRemapping.ContainsKey(vertIndex))
                {
                    vertRemapping.Add(vertIndex, meshEdit.verts.Count);
                    meshEdit.verts.Add(mesh.vertices[vertIndex]);
                }
                meshEdit.triangleIndecis.Add(vertRemapping[vertIndex]);
            }
        }
        meshEdit.CopyTo(mesh);
    }
Example #27
0
    // all triangles will be updated
    public static int FuseVerts(List <int> vertsToFuse, Mesh mesh)
    {
        if (vertsToFuse.Count > 1)
        {
            EditedMesh meshEdit      = new EditedMesh();
            List <int> vertsToRemove = new List <int>();
            int        vertToKeep    = mesh.vertices.Length;
            for (int vert = 0; vert < vertsToFuse.Count; ++vert)
            {
                vertsToRemove.Add(vertsToFuse[vert]);
                if (vertsToFuse[vert] < vertToKeep)
                {
                    vertToKeep = vertsToFuse[vert];
                }
            }
            vertsToRemove.Remove(vertToKeep);

            Dictionary <int, int> vertRemapping = new Dictionary <int, int>();
            for (int vert = 0; vert < mesh.vertices.Length; ++vert)
            {
                if (vertsToRemove.Contains(vert))
                {
                    vertRemapping.Add(vert, vertToKeep);
                }
                else
                {
                    vertRemapping.Add(vert, meshEdit.verts.Count);
                    meshEdit.verts.Add(mesh.vertices[vert]);
                }
            }

            meshEdit.RemapTriangleIndecis(mesh, vertRemapping);
            meshEdit.CopyTo(mesh);
            return(vertToKeep);
        }
        return(IndexInvalid);
    }
Example #28
0
    public static void MoveTriangles(List <int> trianglesToMove, Vector3 delta, Mesh mesh)
    {
        EditedMesh    meshEdit    = new EditedMesh(mesh);
        HashSet <int> editedVerts = new HashSet <int>();

        int trianglesToMoveCount = trianglesToMove.Count;

        for (int index = 0; index < trianglesToMoveCount; ++index)
        {
            int triangle = trianglesToMove[index];
            int startingTriangleIndex = triangle * NumVertsPerTriangle;

            for (int triangleIndex = 0; triangleIndex < NumVertsPerTriangle; ++triangleIndex)
            {
                int vertIndex = meshEdit.triangleIndecis[startingTriangleIndex + triangleIndex];
                if (!editedVerts.Contains(vertIndex))
                {
                    editedVerts.Add(vertIndex);
                    meshEdit.verts[vertIndex] += delta;
                }
            }
        }
        meshEdit.CopyTo(mesh);
    }
Example #29
0
        public PainterMesh.MeshPoint CreatePointAndFocus(Vector3 pos)
        {
            var hold = new PainterMesh.MeshPoint(pos, true);

            new PainterMesh.Vertex(hold);

            editedMesh.meshPoints.Add(hold);

            if (!EditorInputManager.Control)
            {
                EditedMesh.AddToTrisSet(hold.vertices[0]);
            }

            if (Cfg.pixelPerfectMeshEditing)
            {
                hold.PixPerfect();
            }

            GridNavigator.collisionPos = pos;

            UpdateLocalSpaceMousePosition();

            return(hold);
        }
Example #30
0
    public static void FuseCloseVerts(List <int> vertsToFuse, Mesh mesh, float distSqr)
    {
        EditedMesh            meshEdit      = new EditedMesh();
        Dictionary <int, int> vertRemapping = new Dictionary <int, int>();

        for (int vert = 0; vert < mesh.vertices.Length; ++vert)
        {
            if (vertRemapping.ContainsKey(vert))             // already been remapped
            {
                continue;
            }
            vertRemapping.Add(vert, meshEdit.verts.Count);
            meshEdit.verts.Add(mesh.vertices[vert]);

            if (!vertsToFuse.Contains(vert))
            {
                continue;                 // not interested in fusing this vert
            }

            Vector3 vertPos = mesh.vertices[vert];
            for (int vertToCompare = vert + 1; vertToCompare < mesh.vertices.Length; ++vertToCompare)
            {
                if (!vertsToFuse.Contains(vertToCompare))
                {
                    continue;                     // not interested in fusing this vert
                }

                if ((vertPos - mesh.vertices[vertToCompare]).sqrMagnitude < distSqr)
                {
                    vertRemapping.Add(vertToCompare, vertRemapping[vert]);
                }
            }
        }
        meshEdit.RemapTriangleIndecis(mesh, vertRemapping);
        meshEdit.CopyTo(mesh);
    }