Exemplo n.º 1
0
        internal void ComputeVertexNormal(int vertId, ref double[] nml)
        {
            for (var i = 0; i < 3; i++)
            {
                nml[i] = 0.0;
            }
            var star = faceLinks[vertId];

            foreach (var faceId in star)
            {
                var faceNml = new double[3];

                ComputeFaceNormal(faceId, ref faceNml, false);
                MxVectorOps.AddInto3(ref nml, faceNml);
            }

            if (star.Count > 1)
            {
                MxVectorOps.Unitize3(ref nml);
            }
        }
Exemplo n.º 2
0
        internal void ApplyContraction(MxPairContraction conx)
        {
            var vertId1 = conx.VertId1;
            var vertId2 = conx.VertId2;

            // Move vert1 to new position
            var pos = Vertex(vertId1).Pos;

            MxVectorOps.AddInto3(ref pos, conx.DeltaV1);
            Vertex(vertId1).Pos = pos;

            // Remove dead faces
            foreach (var faceId in conx.DeadFaces)
            {
                UnLinkFace(faceId);
            }

            // Modify changed faces
            for (var i = conx.DeltaPivot; i < conx.DeltaFaces.Count; i++)
            {
                var faceId = conx.DeltaFaces[i];
                var face   = Face(faceId);
                face.RemapVertex(vertId2, vertId1);
                faceLinks[vertId1].Add(faceId);
            }

            if (NormalBinding == MxBinding.PerFace)
            {
                var nml = new double[3];
                foreach (var faceId in conx.DeltaFaces)
                {
                    ComputeFaceNormal(faceId, ref nml);
                    Normal(faceId, new MxNormal(nml));
                }
            }

            // Remove v2
            VertexMarkInvalid(vertId2);
            faceLinks[vertId2].Clear();
        }