Beispiel #1
0
        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();
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
        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();
        }
Beispiel #4
0
        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);
        }