[Bf-blender-cvs] [d4be1bfb818] soc-2021-adaptive-cloth: adaptive_cloth: `clothModifier_do()` returns a new `Mesh` if simulation was successful
ishbosamiya
noreply at git.blender.org
Mon Jun 14 14:31:58 CEST 2021
Commit: d4be1bfb8187b2ca270982f6e59157ac0ff72647
Author: ishbosamiya
Date: Fri Jun 11 12:19:52 2021 +0530
Branches: soc-2021-adaptive-cloth
https://developer.blender.org/rBd4be1bfb8187b2ca270982f6e59157ac0ff72647
adaptive_cloth: `clothModifier_do()` returns a new `Mesh` if simulation was successful
This is an important change that allows for remeshing operations in
the cloth simulator. `clothModifier_do()` returns the resulting mesh
if it was successful otherwise NULL.
===================================================================
M source/blender/blenkernel/BKE_cloth.h
M source/blender/blenkernel/intern/cloth.c
M source/blender/blenkernel/intern/particle_system.c
M source/blender/modifiers/intern/MOD_cloth.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 04fcdd6ed6f..7bf47e37c69 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -241,12 +241,11 @@ int cloth_bvh_collision(struct Depsgraph *depsgraph,
// needed for modifier.c
void cloth_free_modifier_extern(struct ClothModifierData *clmd);
void cloth_free_modifier(struct ClothModifierData *clmd);
-void clothModifier_do(struct ClothModifierData *clmd,
- struct Depsgraph *depsgraph,
- struct Scene *scene,
- struct Object *ob,
- struct Mesh *me,
- float (*vertexCos)[3]);
+struct Mesh *clothModifier_do(struct ClothModifierData *clmd,
+ struct Depsgraph *depsgraph,
+ struct Scene *scene,
+ struct Object *ob,
+ struct Mesh *mesh);
int cloth_uses_vgroup(struct ClothModifierData *clmd);
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 09bd397cc78..a63dbf5f467 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -54,7 +54,7 @@
/* ********** cloth engine ******* */
/* Prototypes for internal functions.
*/
-static void cloth_to_object(Object *ob, ClothModifierData *clmd, float (*vertexCos)[3]);
+static void cloth_to_object(Object *ob, ClothModifierData *clmd, Mesh *r_mesh);
static void cloth_from_mesh(ClothModifierData *clmd, const Object *ob, Mesh *mesh);
static bool cloth_from_object(
Object *ob, ClothModifierData *clmd, Mesh *mesh, float framenr, int first);
@@ -318,12 +318,8 @@ static int do_step_cloth(
/************************************************
* clothModifier_do - main simulation function
************************************************/
-void clothModifier_do(ClothModifierData *clmd,
- Depsgraph *depsgraph,
- Scene *scene,
- Object *ob,
- Mesh *mesh,
- float (*vertexCos)[3])
+Mesh *clothModifier_do(
+ ClothModifierData *clmd, Depsgraph *depsgraph, Scene *scene, Object *ob, Mesh *mesh)
{
PointCache *cache;
PTCacheID pid;
@@ -351,7 +347,7 @@ void clothModifier_do(ClothModifierData *clmd,
/* simulation is only active during a specific period */
if (framenr < startframe) {
BKE_ptcache_invalidate(cache);
- return;
+ return NULL;
}
if (framenr > endframe) {
framenr = endframe;
@@ -359,7 +355,7 @@ void clothModifier_do(ClothModifierData *clmd,
/* initialize simulation data if it didn't exist already */
if (!do_init_cloth(ob, clmd, mesh, framenr)) {
- return;
+ return NULL;
}
if (framenr == startframe) {
@@ -368,7 +364,7 @@ void clothModifier_do(ClothModifierData *clmd,
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
clmd->clothObject->last_frame = framenr;
- return;
+ return NULL;
}
/* try to read from cache */
@@ -380,7 +376,10 @@ void clothModifier_do(ClothModifierData *clmd,
if (cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED ||
(!can_simulate && cache_result == PTCACHE_READ_OLD)) {
SIM_cloth_solver_set_positions(clmd);
- cloth_to_object(ob, clmd, vertexCos);
+
+ Mesh *mesh_result = BKE_mesh_copy_for_eval(mesh, false);
+
+ cloth_to_object(ob, clmd, mesh_result);
BKE_ptcache_validate(cache, framenr);
@@ -390,7 +389,7 @@ void clothModifier_do(ClothModifierData *clmd,
clmd->clothObject->last_frame = framenr;
- return;
+ return mesh_result;
}
if (cache_result == PTCACHE_READ_OLD) {
SIM_cloth_solver_set_positions(clmd);
@@ -400,7 +399,8 @@ void clothModifier_do(ClothModifierData *clmd,
/*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) {
/* if baked and nothing in cache, do nothing */
BKE_ptcache_invalidate(cache);
- return;
+ return NULL; /* TODO(ish): figure out if this is an early escape because of some error or
+ something else */
}
/* if on second frame, write cache for first frame */
@@ -421,8 +421,12 @@ void clothModifier_do(ClothModifierData *clmd,
BKE_ptcache_write(&pid, framenr);
}
- cloth_to_object(ob, clmd, vertexCos);
+ Mesh *mesh_result = BKE_mesh_copy_for_eval(mesh, false);
+
+ cloth_to_object(ob, clmd, mesh_result);
clmd->clothObject->last_frame = framenr;
+
+ return mesh_result;
}
/* frees all */
@@ -589,21 +593,32 @@ void cloth_free_modifier_extern(ClothModifierData *clmd)
******************************************************************************/
/**
- * Copies the deformed vertices to the object.
+ * Copies the deformed vertices to `r_mesh` after converting the world
+ * space coordinates stored in `cloth->verts` to local space coords
+ * required by `r_mesh`
*/
-static void cloth_to_object(Object *ob, ClothModifierData *clmd, float (*vertexCos)[3])
+static void cloth_to_object(Object *ob, ClothModifierData *clmd, Mesh *r_mesh)
{
- unsigned int i = 0;
+ /* TODO(ish): might need a better name for the function now that it
+ * directly applies the vertex * positions to the mesh */
Cloth *cloth = clmd->clothObject;
if (clmd->clothObject) {
/* inverse matrix is not uptodate... */
invert_m4_m4(ob->imat, ob->obmat);
- for (i = 0; i < cloth->mvert_num; i++) {
- copy_v3_v3(vertexCos[i], cloth->verts[i].x);
- mul_m4_v3(ob->imat, vertexCos[i]); /* cloth is in global coords */
+ BLI_assert(cloth->mvert_num == r_mesh->totvert);
+
+ float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * cloth->mvert_num, __func__);
+
+ for (size_t i = 0; i < cloth->mvert_num; i++) {
+ copy_v3_v3(vert_coords[i], cloth->verts[i].x);
}
+
+ /* need to convert from world space to local space */
+ BKE_mesh_vert_coords_apply_with_mat4(r_mesh, vert_coords, ob->imat);
+
+ MEM_freeN(vert_coords);
}
}
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index ce4be411c9a..98c9025da17 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3508,8 +3508,9 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
BKE_id_copy_ex(NULL, &psys->hair_in_mesh->id, (ID **)&psys->hair_out_mesh, LIB_ID_COPY_LOCALIZE);
deformedVerts = BKE_mesh_vert_coords_alloc(psys->hair_out_mesh, NULL);
- clothModifier_do(
- psys->clmd, sim->depsgraph, sim->scene, sim->ob, psys->hair_in_mesh, deformedVerts);
+ /* TODO(ish): need to make hair simulation work with the new cloth changes */
+ /* clothModifier_do( */
+ /* psys->clmd, sim->depsgraph, sim->scene, sim->ob, psys->hair_in_mesh, deformedVerts); */
BKE_mesh_vert_coords_apply(psys->hair_out_mesh, deformedVerts);
MEM_freeN(deformedVerts);
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 3ad4bd209c7..2c6a4e85b93 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -128,15 +128,13 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
/* } */
/* } */
- Mesh *mesh_result = BKE_mesh_copy_for_eval(mesh, false);
-
- float(*vert_coords)[3] = BKE_mesh_vert_coords_alloc(mesh_result, NULL);
- BKE_mesh_vert_coords_get(mesh_result, vert_coords);
-
- clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh_result, vert_coords);
-
- BKE_mesh_vert_coords_apply(mesh_result, vert_coords);
+ Mesh *mesh_result = clothModifier_do(clmd, ctx->depsgraph, scene, ctx->object, mesh);
+ if (mesh_result == NULL) {
+ /* didn't get a valid mesh so there is a chance the modifier
+ * failed, return the mesh that the modifier got */
+ return mesh;
+ }
return mesh_result;
}
More information about the Bf-blender-cvs
mailing list