Пример #1
0
        public PainterMesh.MeshPoint InsertIntoTriangle(PainterMesh.Triangle a, Vector3 pos)
        {
            // Debug.Log("Inserting into triangle");
            var newVrt = new PainterMesh.MeshPoint(a.vertexes[0].meshPoint, pos);

            var w = a.DistanceToWeight(pos);

            var newV20 = a.vertexes[0].GetUv(0) * w.x + a.vertexes[1].GetUv(0) * w.y + a.vertexes[2].GetUv(0) * w.z;
            var newV21 = a.vertexes[0].GetUv(1) * w.x + a.vertexes[1].GetUv(1) * w.y + a.vertexes[2].GetUv(1) * w.z;

            var newUv = new PainterMesh.Vertex(newVrt, newV20, newV21);

            a.AssignWeightedData(newUv, w);

            meshPoints.Add(newVrt);

            var b = new PainterMesh.Triangle(a.vertexes).CopySettingsFrom(a);
            var c = new PainterMesh.Triangle(a.vertexes).CopySettingsFrom(a);

            a.Replace(0, newUv); //uvpnts[0] = newUV;
            b.Replace(1, newUv); // uvpnts[1] = newUV;
            c.Replace(2, newUv); // uvpnts[2] = newUV;

            triangles.Add(b);
            triangles.Add(c);


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

            Dirty = true;
            return(newVrt);
        }
Пример #2
0
        public override void AssignText(MarkerWithText markers, PainterMesh.MeshPoint point)
        {
            var selected = MeshMGMT.GetSelectedVertex();

            if (point.vertices.Count > 1 || selected == point)
            {
                if (selected == point)
                {
                    markers.textm.text = (point.vertices.Count > 1) ? (
                        Path.Combine((point.vertices.IndexOf(MeshMGMT.SelectedUv) + 1).ToString(), point.vertices.Count +
                                     (point.smoothNormal ? "s" : ""))

                        ) : "";
                }
                else
                {
                    markers.textm.text = point.vertices.Count +
                                         (point.smoothNormal ? "s" : "");
                }
            }
            else
            {
                markers.textm.text = "";
            }
        }
Пример #3
0
        public bool DeleteVertexHeal(PainterMesh.MeshPoint vertex)
        {
            var trs = new PainterMesh.Triangle[3];

            var cnt = 0;

            foreach (var t in editedMesh.triangles)
            {
                if (!t.Includes(vertex))
                {
                    continue;
                }
                if (cnt == 3)
                {
                    return(false);
                }
                trs[cnt] = t;
                cnt++;
            }

            if (cnt != 3)
            {
                return(false);
            }

            trs[0].MergeAround(trs[1], vertex);
            editedMesh.triangles.Remove(trs[1]);
            editedMesh.triangles.Remove(trs[2]);

            editedMesh.meshPoints.Remove(vertex);

            editedMesh.NullPointedSelected();

            return(true);
        }
Пример #4
0
        public void SwapLine(PainterMesh.MeshPoint a, PainterMesh.MeshPoint b)
        {
            NullPointedSelected();

            var trs = new PainterMesh.Triangle[2];
            var cnt = 0;

            foreach (var tmp in triangles)
            {
                if (!tmp.Includes(a, b))
                {
                    continue;
                }

                if (cnt == 2)
                {
                    return;
                }
                trs[cnt] = tmp;
                cnt++;
            }
            if (cnt != 2)
            {
                return;
            }

            var nol0 = trs[0].GetNotOneOf(a, b);
            var nol1 = trs[1].GetNotOneOf(a, b);

            trs[0].Replace(trs[0].GetByVertex(a), nol1);
            trs[1].Replace(trs[1].GetByVertex(b), nol0);
        }
Пример #5
0
        public override void AssignText(MarkerWithText markers, PainterMesh.MeshPoint point)
        {
            var vrt = MeshMGMT.GetSelectedVertex();

            if (point.vertices.Count > 1 || vrt == point)
            {
                var tex = MeshEditorManager.target.meshRenderer.sharedMaterial.mainTexture;

                if (vrt == point)
                {
                    var   text  = (point.vertices.Count > 1) ? ((point.vertices.IndexOf(MeshMGMT.SelectedUv) + 1) + "/" + point.vertices.Count + (point.smoothNormal ? "s" : "")) : "";
                    float tSize = !tex ? 128 : tex.width;
                    text += ("uv: " + (MeshMGMT.SelectedUv.EditedUv.x * tSize) + "," + (MeshMGMT.SelectedUv.EditedUv.y * tSize));
                    markers.textm.text = text;
                }
                else
                {
                    markers.textm.text = point.vertices.Count +
                                         (point.smoothNormal ? "s" : "");
                }
            }
            else
            {
                markers.textm.text = "";
            }
        }
Пример #6
0
        private void Line(PainterMesh.MeshPoint a, PainterMesh.MeshPoint b, Color colA, Color colB)
        {
            Vector3 v3a  = a.WorldPos;
            Vector3 v3b  = b.WorldPos;
            Vector3 diff = (v3b - v3a) / 2;

            Line(v3a, v3a + diff, colA);
            Line(v3b, v3b - diff, colB);
        }
Пример #7
0
        public void MoveVertexToGrid(PainterMesh.MeshPoint vp)
        {
            UpdateLocalSpaceMousePosition();

            var diff = onGridLocal - vp.localPos;

            diff.Scale(GridNavigator.Inst().GetGridPerpendicularVector());
            vp.localPos += diff;
        }
Пример #8
0
 public bool IsInTriangleSet(PainterMesh.MeshPoint vertex)
 {
     for (var i = 0; i < triVertices; i++)
     {
         if (triangleSet[i].meshPoint == vertex)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #9
0
        public void DisconnectDragged()
        {
            Debug.Log("Disconnecting dragged");

            var temp = new PainterMesh.MeshPoint(SelectedUv.meshPoint);

            editedMesh.meshPoints.Add(temp);

            SelectedUv.AssignToNewVertex(temp);

            editedMesh.Dirty = true;//_Mesh.GenerateMesh(_targetPiece);
        }
Пример #10
0
        public PainterMesh.Vertex GetUvPointAFromLine(PainterMesh.MeshPoint a, PainterMesh.MeshPoint b)
        {
            foreach (var t in triangles)
            {
                if (t.Includes(a) && t.Includes(b))
                {
                    return(t.GetByVertex(a));
                }
            }

            return(null);
        }
Пример #11
0
 private bool SameTriangleAsPointed(PainterMesh.MeshPoint uvi)
 {
     if (PointedUv == null)
     {
         return(false);
     }
     foreach (PainterMesh.Triangle t in editedMesh.triangles)
     {
         if (t.Includes(uvi) && t.Includes(PointedUv))
         {
             return(true);
         }
     }
     return(false);
 }
Пример #12
0
        public bool SetAllUVsShared(PainterMesh.MeshPoint pnt)
        {
            if (pnt.vertices.Count == 1)
            {
                return(false);
            }

            while (pnt.vertices.Count > 1)
            {
                if (!MoveTriangle(pnt.vertices[1], pnt.vertices[0]))
                {
                    break;
                }
            }

            Dirty = true;
            return(true);
        }
Пример #13
0
        public void Merge(PainterMesh.MeshPoint pointA, PainterMesh.MeshPoint pointB)
        {
            if (pointA == pointB)
            {
                return;
            }

            pointA.StripPointData_StageForDeleteFrom(pointB);

            /*foreach (var buv in pointB.vertices)
             * {
             *  var uvs = new Vector2[] { buv.GetUv(0), buv.GetUv(1) };
             *  pointA.vertices.Add(buv);
             *  buv.meshPoint = pointA;
             *  buv.SetUvIndexBy(uvs);
             * }*/

            meshPoints.Remove(pointB);
        }
Пример #14
0
        public PainterMesh.MeshPoint InsertIntoTriangleUniqueVertices(PainterMesh.Triangle a, Vector3 localPos)
        {
            var newVrt = new PainterMesh.MeshPoint(a.vertexes[0].meshPoint, localPos);

            meshPoints.Add(newVrt);

            var newUv = new PainterMesh.Vertex[3]; // (newVrt);

            var w = a.DistanceToWeight(localPos);

            //var newV20 = a.vertexes[0].GetUv(0) * w.x + a.vertexes[1].GetUv(0) * w.y + a.vertexes[2].GetUv(0) * w.z;
            //var newV21 = a.vertexes[0].GetUv(1) * w.x + a.vertexes[1].GetUv(1) * w.y + a.vertexes[2].GetUv(1) * w.z;
            //Color col = a.uvpnts[0]._color * w.x + a.uvpnts[1]._color * w.y + a.uvpnts[2]._color * w.z;
            for (var i = 0; i < 3; i++)
            {
                newUv[i] = new PainterMesh.Vertex(newVrt);//, newV20, newV21);
                a.AssignWeightedData(newUv[i], w);
            }

            var b = new PainterMesh.Triangle(a.vertexes).CopySettingsFrom(a);
            var c = new PainterMesh.Triangle(a.vertexes).CopySettingsFrom(a);

            a.vertexes[0] = newUv[0];
            b.vertexes[1] = newUv[1];
            c.vertexes[2] = newUv[2];

            triangles.Add(b);
            triangles.Add(c);

            a.MakeTriangleVertexUnique(a.vertexes[1]);
            b.MakeTriangleVertexUnique(b.vertexes[2]);
            c.MakeTriangleVertexUnique(c.vertexes[0]);


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

            Dirty = true;
            return(newVrt);
        }
Пример #15
0
        public PainterMesh.MeshPoint GetClosestToPos(Vector3 pos)
        {
            PainterMesh.MeshPoint closest = null;
            float dist = 0;

            foreach (var v in meshPoints)
            {
                var newDist = Vector3.Distance(v.localPos, pos);

                if (closest != null && !(dist > newDist))
                {
                    continue;
                }

                dist = newDist;

                closest = v;
            }
            return(closest);
        }
Пример #16
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);
        }
Пример #17
0
 public virtual void AssignText(MarkerWithText markers, PainterMesh.MeshPoint point) => markers.textm.text = "";
Пример #18
0
        private void BreakMesh(Mesh mesh)
        {
            if (!mesh)
            {
                return;
            }

            meshName = mesh.name;

            QcSharp.timer.Start("Breaking mesh");

            var vCnt = mesh.vertices.Length;

            meshPoints = new List <PainterMesh.MeshPoint>();
            var vertices = mesh.vertices;

            var cols = mesh.colors;
            var bW   = mesh.boneWeights;
            var uv1  = mesh.uv;
            var uv2  = mesh.uv2;

            bindPoses = mesh.bindposes;

            var gotUv1    = (uv1 != null) && (uv1.Length == vCnt);
            var gotUv2    = (uv2 != null) && (uv2.Length == vCnt);
            var gotColors = (cols != null) && (cols.Length == vCnt);

            gotBoneWeights = (bW != null) && (bW.Length == vCnt);


            for (var i = 0; i < vCnt; i++)
            {
                var v = new PainterMesh.MeshPoint(vertices[i]);
                meshPoints.Add(v);
                var uv = new PainterMesh.Vertex(meshPoints[i], gotUv1 ? uv1[i] : Vector2.zero, gotUv2 ? uv2[i] : Vector2.zero);
            }

            if (gotColors)
            {
                for (var i = 0; i < vCnt; i++)
                {
                    var p = meshPoints[i];
                    p.vertices[0].color = cols[i];
                }
            }

            //   "Got Colors".TimerEnd_Restart();

            if (gotBoneWeights)
            {
                for (var i = 0; i < vCnt; i++)
                {
                    var p = meshPoints[i];
                    p.vertices[0].boneWeight = bW[i];
                }
            }


            //   "Gote Bone Weights".TimerEnd_Restart();

            shapes = new List <string>();

            for (var s = 0; s < mesh.blendShapeCount; s++)
            {
                for (var v = 0; v < vCnt; v++)
                {
                    meshPoints[v].shapes.Add(new List <PainterMesh.BlendFrame>());
                }

                shapes.Add(mesh.GetBlendShapeName(s));

                for (var f = 0; f < mesh.GetBlendShapeFrameCount(s); f++)
                {
                    blendWeights[s][f] = mesh.GetBlendShapeFrameWeight(s, f);

                    var normals = new Vector3[vCnt];
                    var pos     = new Vector3[vCnt];
                    var tng     = new Vector3[vCnt];
                    mesh.GetBlendShapeFrameVertices(s, f, pos, normals, tng);

                    for (var v = 0; v < vCnt; v++)
                    {
                        meshPoints[v].shapes.TryGetLast().Add(new PainterMesh.BlendFrame(pos[v], normals[v], tng[v]));
                    }
                }
            }

            triangles = new List <PainterMesh.Triangle>();
            var points = new PainterMesh.Vertex[3];

            subMeshCount = Mathf.Max(1, mesh.subMeshCount);
            baseVertex   = new List <uint>();

            //   "Blend Shapes Done".TimerEnd_Restart();

            for (var s = 0; s < subMeshCount; s++)
            {
                baseVertex.Add(mesh.GetBaseVertex(s));

                var indices = mesh.GetTriangles(s);

                var tCnt = indices.Length / 3;

                for (var i = 0; i < tCnt; i++)
                {
                    for (var e = 0; e < 3; e++)
                    {
                        points[e] = meshPoints[indices[i * 3 + e]].vertices[0];
                    }

                    var t = new PainterMesh.Triangle(points)
                    {
                        subMeshIndex = s
                    };
                    triangles.Add(t);
                }
            }

            //   "Triangles done".TimerEnd_Restart();

            if (vCnt > 50)
            {
                //    Debug.Log("Using caching to merge vertex points.");

                var mSize = mesh.bounds;

                float coef = 10000f / mesh.bounds.size.magnitude;

                UnNullableLists <PainterMesh.MeshPoint> distanceGroups = new UnNullableLists <PainterMesh.MeshPoint>();

                for (var i = 0; i < vCnt; i++)
                {
                    var p = meshPoints[i];
                    distanceGroups[Mathf.FloorToInt(p.localPos.magnitude * coef)].Add(p);
                }

                var grps = distanceGroups.GetAllObjsNoOrder();

                //  Debug.Log("Got {0} groups".F(grps.Count));

                foreach (var groupList in grps)
                {
                    var cnt = groupList.Count;

                    for (var aInd = 0; aInd < cnt; aInd++)
                    {
                        var aPoint = groupList[aInd];

                        for (var bInd = aInd + 1; bInd < cnt; bInd++)
                        {
                            var bPoint = groupList[bInd];

                            if (bPoint.localPos.Equals(aPoint.localPos))
                            {
                                aPoint.StripPointData_StageForDeleteFrom(bPoint);
                                groupList.RemoveAt(bInd);
                                bInd--;
                                cnt--;
                            }
                        }
                    }
                }

                distanceGroups.Clear();

                DeleteStagedMeshPoints();
            }
            else
            {
                for (var i = 0; i < vCnt; i++)
                {
                    var main = meshPoints[i];
                    for (var j = i + 1; j < vCnt; j++)
                    {
                        // if (!((meshPoints[j].localPos - main.localPos).magnitude < float.Epsilon)) continue;

                        if (meshPoints[j].localPos.Equals(main.localPos))
                        {
                            Merge(i, j);
                            j--;
                            vCnt = meshPoints.Count;
                        }
                    }
                }
            }

            QcSharp.timer.End("Breaking mesh done", 1);

            mesh = new Mesh();

            Dirty = true;
        }
Пример #19
0
        public PainterMesh.MeshPoint InsertIntoLine(PainterMesh.MeshPoint a, PainterMesh.MeshPoint b, Vector3 pos)
        {
            var dstA = Vector3.Distance(pos, a.localPos);
            var dstB = Vector3.Distance(pos, b.localPos);


            var sum = dstA + dstB;

            float weightA = dstB / sum;
            float weightB = dstA / sum;

            pos = (a.localPos * dstB + b.localPos * dstA) / sum;

            var newVrt = new PainterMesh.MeshPoint(a, pos);

            meshPoints.Add(newVrt);

            var pointTris = a.Triangles();

            for (int i = 0; i < pointTris.Count; i++)
            {
                var tr = pointTris[i];

                if (!tr.Includes(b))
                {
                    continue;
                }

                var auv     = tr.GetByVertex(a);
                var buv     = tr.GetByVertex(b);
                var splitUv = tr.GetNotOneOf(a, b);


                if (auv == null || buv == null)
                {
                    Debug.LogError("Didn't found a uv");
                    continue;
                }

                //  var uv = (auv.GetUv(0) * weightA + buv.GetUv(0) * weightA);
                // var uv1 = (auv.GetUv(1) * weightA + buv.GetUv(1) * weightA);

                // Vertex newUv = null;

                //               if (Cfg.newVerticesUnique || newVrt.vertices.IsNullOrEmpty())
                //                 newUv = new Vertex(newVrt);

                /*else
                 * {
                 *  foreach (var t in newVrt.vertices)
                 *      if (t.SameUv(uv, uv1))
                 *          newUv = t;
                 * }*/

                //if (newUv == null)
                PainterMesh.Vertex newUv = new PainterMesh.Vertex(newVrt);


                tr.AssignWeightedData(newUv, tr.DistanceToWeight(pos));


                var trb = new PainterMesh.Triangle(tr.vertexes).CopySettingsFrom(tr);
                triangles.Add(trb);
                tr.Replace(auv, newUv);

                if (Cfg.newVerticesUnique)
                {
                    var split = new PainterMesh.Vertex(splitUv);
                    trb.Replace(splitUv, split);
                    var newB = new PainterMesh.Vertex(newUv);
                    trb.Replace(buv, newB);
                }
                else
                {
                    trb.Replace(buv, newUv);
                }
            }

            Dirty = true;

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

            return(newVrt);
        }
Пример #20
0
        public void DRAW_Lines(bool isGizmoCall)
        {
            GizmoLines = isGizmoCall;

            if (!target)
            {
                return;
            }

            if (MeshTool.ShowTriangles)
            {
                if ((PointedTriangle != null) && ((PointedTriangle != SelectedTriangle) || (!MeshTool.ShowSelectedTriangle)))
                {
                    OutlineTriangle(PointedTriangle, Color.cyan, Color.gray);
                }

                if ((SelectedTriangle != null) && (MeshTool.ShowSelectedTriangle))
                {
                    OutlineTriangle(SelectedTriangle, Color.blue, Color.white);
                }
            }

            if (MeshTool.ShowLines)
            {
                if (PointedLine != null)
                {
                    Line(PointedLine.points[0].meshPoint, PointedLine.points[1].meshPoint, Color.green);
                }

                var dv = EditedMesh._draggedVertices;

                if (dv.Count > 0)
                {
                    for (int i = 0; i < dv.Count; i++)
                    {
                        var a = dv[i];
                        for (int j = 0; j < dv.Count; j++)
                        {
                            Line(a, dv[j], Color.cyan); //var b = dv[j];
                        }
                    }
                }


                for (int i = 0; i < Mathf.Min(verticesShowMax, editedMesh.meshPoints.Count); i++)
                {
                    PainterMesh.MeshPoint vp = editedMesh.meshPoints[i];
                    if (SameTriangleAsPointed(vp))
                    {
                        Line(vp, PointedUv.meshPoint, Color.yellow);
                    }
                }
            }

            if (MeshTool.ShowVertices)
            {
                if (PointedUv != null)
                {
                    for (int i = 0; i < editedMesh.triangles.Count; i++)
                    {
                        PainterMesh.Triangle td = editedMesh.triangles[i];
                        if (td.Includes(PointedUv))
                        {
                            Line(td.vertexes[1].meshPoint, td.vertexes[0].meshPoint, Color.yellow);
                            Line(td.vertexes[1].meshPoint, td.vertexes[2].meshPoint, Color.yellow);
                            Line(td.vertexes[2].meshPoint, td.vertexes[0].meshPoint, Color.yellow);
                        }
                    }
                }
            }
        }
Пример #21
0
 private void Line(PainterMesh.MeshPoint a, PainterMesh.MeshPoint b, Color colA) => Line(a.WorldPos, b.WorldPos, colA);