public override void Use(SculptState state, Deformer deformer) { if (state.drawingDown) { deformer.UpdateMask(state); prevPosition = state.position; } if (deformer.SelectionCount == 0) { return; } var delta = state.worldToLocal * state.position - state.worldToLocal * prevPosition; var deformation = deformer.Deformation; for (int i = 0; i < deformer.SelectionCount; ++i) { deformation[i] = delta; } prevPosition = state.position; deformer.ApplyDeformation(); }
public override void Use(SculptState state, Deformer deformer) { deformer.UpdateMask(state); var mask = deformer.Selection; var deformation = deformer.Deformation; Vector3 avgNormal = Vector3.zero; for (int i = 0; i < deformer.SelectionCount; i++) { avgNormal += SculptMesh.Normals[mask[i]]; } avgNormal.Normalize(); float amp = strength * state.strength; float inv = state.drawingInverted ? -1f : 1f; for (int i = 0; i < deformer.SelectionCount; ++i) { deformation[i] = amp * inv * avgNormal; } deformer.ApplyDeformation(); }
public override void Use(SculptState state, Deformer deformer) { deformer.UpdateMask(state); var mask = deformer.Selection; var edgeRecorder = new HashSet <int>(); Vector3[] deformation = deformer.Deformation; for (int i = 0; i < deformer.SelectionCount; i++) { var vert = SculptMesh.Topology.Vertices[mask[i]]; var force = new Vector3(); foreach (var edge in vert.Edges) { var other = edge.GetOtherVertex(vert); var p0 = SculptMesh.Points[vert.Id]; var p1 = SculptMesh.Points[other.Id]; var delta = p1 - p0; force += delta; } deformation[i] = strength * state.strength * force; } deformer.ApplyDeformation(); }
public IEnumerator ModifyMesh() { var timer = new Timer("modify-mesh"); var menu = new Menu(ToolType.Move); var deformer = new Deformer(sculptMesh); var state = new SculptState { position = Vector3.up * .5f, worldToLocal = sculptMesh.Wrapper.MeshTransform.worldToLocalMatrix }; timer.PrintTime(() => { deformer.UpdateMask(state); }, "Select vertices"); Vector3 offset = Vector3.up * Random.value; int pickId = Random.Range(0, deformer.Selection.Length); var vec = sculptMesh.Points[deformer.Selection[pickId]]; var weight = deformer.Weights[pickId]; timer.PrintTime(() => { var deformation = deformer.Deformation; for (int i = 0; i < deformer.SelectionCount; ++i) { deformation[i] = offset; } }, "Create deform field"); timer.PrintTime(() => sculptMesh.UpdateMeshData(), "Update mesh data"); Debug.Log($"{deformer.SelectionCount} vertices modified out of {sculptMesh.Points.Length}.\n"); timer.PrintTotalTime(); timer.SaveCsv(); Assert.Less(timer.TotalTime, 100); Assert.AreEqual(sculptMesh.Points[deformer.Selection[pickId]], vec + weight * offset); yield return(null); }