private Slice(Lime.Animesh mesh, AnimeshSlice sliceBefore, AnimeshSlice sliceAfter, bool skipFirstSync) { this.mesh = mesh; this.sliceBefore = sliceBefore; this.sliceAfter = sliceAfter; this.skipFirstSync = skipFirstSync; }
private void Do(Lime.Animesh mesh, AnimeshSlice slice, bool skipSync) { var controller = mesh.Controller(); AnimeshTools.State = slice.State; mesh.Vertices.Clear(); foreach (var v in slice.Vertices) { mesh.Vertices.Add(v); } mesh.Faces.Clear(); foreach (var i in slice.IndexBuffer) { mesh.Faces.Add(i); } mesh.ConstrainedEdges.Clear(); foreach (var cp in slice.ConstrainedVertices) { mesh.ConstrainedEdges.Add(cp); } if (!skipSync) { controller.Topology.ConstructFrom(mesh.Vertices, mesh.ConstrainedEdges, mesh.Faces); } if (mesh.Animators.TryFind(nameof(mesh.TransientVertices), out var animator)) { animator.Keys.Clear(); foreach (var key in slice.Keyframes) { animator.Keys.AddOrdered(key); animator.ResetCache(); } mesh.Animators.Invalidate(); } else { mesh.TransientVertices.Clear(); foreach (var v in slice.Vertices) { mesh.TransientVertices.Add(v); } } mesh.Invalidate(); }
public static void Perform(Lime.Animesh mesh, AnimeshSlice sliceBefore, AnimeshSlice sliceAfter, bool skipFirstSync = true) { Document.Current.History.Perform(new Slice(mesh, sliceBefore, sliceAfter, skipFirstSync)); }