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); } }
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(); }