[Bf-blender-cvs] [deeb0b3aac1] sculpt-dev: Add experimental ripple effects option to the cloth solver

Pablo Dobarro noreply at git.blender.org
Wed Jan 13 23:00:30 CET 2021


Commit: deeb0b3aac103fcc0e1eccddb499719b9c4a349e
Author: Pablo Dobarro
Date:   Wed Jan 6 20:26:38 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rBdeeb0b3aac103fcc0e1eccddb499719b9c4a349e

Add experimental ripple effects option to the cloth solver

===================================================================

M	source/blender/blenkernel/BKE_paint.h
M	source/blender/editors/sculpt_paint/sculpt_cloth.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index 0a35658464a..5b074919d59 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -335,6 +335,7 @@ typedef struct SculptClothSimulation {
   float (*softbody_pos)[3];
   float (*prev_pos)[3];
   float (*last_iteration_pos)[3];
+  float (*init_normal)[3];
 
   struct ListBase *collider_list;
 
diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.c b/source/blender/editors/sculpt_paint/sculpt_cloth.c
index 111f823fc24..7572f1b5894 100644
--- a/source/blender/editors/sculpt_paint/sculpt_cloth.c
+++ b/source/blender/editors/sculpt_paint/sculpt_cloth.c
@@ -103,6 +103,11 @@
 #include <stdlib.h>
 #include <string.h>
 
+
+/* Experimental features. */
+
+#define USE_SOLVER_RIPPLE_CONSTRAINT false
+
 static void cloth_brush_simulation_location_get(SculptSession *ss,
                                                 const Brush *brush,
                                                 float r_location[3])
@@ -465,6 +470,17 @@ static void do_cloth_brush_build_constraints_task_cb_ex(
   BKE_pbvh_vertex_iter_end;
 }
 
+static void cloth_brush_constraint_pos_to_line(SculptClothSimulation *cloth_sim, const int v) {
+    if (!USE_SOLVER_RIPPLE_CONSTRAINT) {
+        return;
+    }
+    float line_points[2][3];
+    copy_v3_v3(line_points[0], cloth_sim->init_pos[v]);
+    add_v3_v3v3(line_points[1], cloth_sim->init_pos[v], cloth_sim->init_normal[v]);
+    closest_to_line_v3(cloth_sim->pos[v], cloth_sim->pos[v], line_points[0], line_points[1]);
+}
+
+
 static void cloth_brush_apply_force_to_vertex(SculptSession *UNUSED(ss),
                                               SculptClothSimulation *cloth_sim,
                                               const float force[3],
@@ -849,6 +865,10 @@ static void do_cloth_brush_solve_simulation_task_cb_ex(
       cloth_simulation_noise_get(noise, ss, vd.index, 0.000001f);
       add_v3_v3(cloth_sim->pos[i], noise);
 
+      if (USE_SOLVER_RIPPLE_CONSTRAINT) {
+        cloth_brush_constraint_pos_to_line(cloth_sim, i);
+      }
+
       if (cloth_sim->collider_list != NULL) {
         cloth_brush_solve_collision(data->ob, cloth_sim, i);
       }
@@ -872,6 +892,7 @@ static void do_cloth_brush_solve_simulation_task_cb_ex(
   cloth_sim->node_state[node_index] = SCULPT_CLOTH_NODE_INACTIVE;
 }
 
+
 static void cloth_brush_satisfy_constraints(SculptSession *ss,
                                             Brush *brush,
                                             SculptClothSimulation *cloth_sim)
@@ -962,6 +983,10 @@ static void cloth_brush_satisfy_constraints(SculptSession *ss,
                            deformation_strength);
         }
       }
+      if (USE_SOLVER_RIPPLE_CONSTRAINT) {
+        cloth_brush_constraint_pos_to_line(cloth_sim, v1);
+        cloth_brush_constraint_pos_to_line(cloth_sim, v2);
+      }
     }
   }
 }
@@ -1134,6 +1159,15 @@ SculptClothSimulation *SCULPT_cloth_brush_simulation_create(SculptSession *ss,
         totverts, sizeof(float[3]), "cloth sim softbody pos");
   }
 
+  if (USE_SOLVER_RIPPLE_CONSTRAINT) {
+  cloth_sim->init_normal = MEM_calloc_arrayN(
+      totverts, sizeof(float) * 3, "init noramls");
+  for (int i = 0; i < totverts; i++) {
+      SCULPT_vertex_normal_get(ss, i, cloth_sim->init_normal[i]);
+  }
+  }
+
+
   cloth_sim->mass = cloth_mass;
   cloth_sim->damping = cloth_damping;
   cloth_sim->softbody_strength = cloth_softbody_strength;
@@ -1306,6 +1340,7 @@ void SCULPT_cloth_simulation_free(struct SculptClothSimulation *cloth_sim)
   MEM_SAFE_FREE(cloth_sim->init_pos);
   MEM_SAFE_FREE(cloth_sim->deformation_strength);
   MEM_SAFE_FREE(cloth_sim->node_state);
+  MEM_SAFE_FREE(cloth_sim->init_normal);
   BLI_ghash_free(cloth_sim->node_state_index, NULL, NULL);
   if (cloth_sim->collider_list) {
     BKE_collider_cache_free(&cloth_sim->collider_list);



More information about the Bf-blender-cvs mailing list