diff options
-rw-r--r-- | extern/softbody/src/admmpd_collision.cpp | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh_remesh_voxel.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_remesh_voxel.c | 42 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/softbody.c | 122 | ||||
-rw-r--r-- | source/blender/editors/object/object_remesh.c | 4 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_backend.hh | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_force_types.h | 42 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_object_force.c | 21 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_softbody.c | 1 |
9 files changed, 121 insertions, 123 deletions
diff --git a/extern/softbody/src/admmpd_collision.cpp b/extern/softbody/src/admmpd_collision.cpp index 3e2400ed9dd..78889b810b8 100644 --- a/extern/softbody/src/admmpd_collision.cpp +++ b/extern/softbody/src/admmpd_collision.cpp @@ -191,6 +191,9 @@ int EmbeddedMeshCollision::detect( // // Detection function for a single embedded vertex + // This function is very poorly optimized in terms of + // cache friendlyness. + // Some refactoring would greatly improve run time. // // auto per_embedded_vertex_detect = []( // void *__restrict userdata, @@ -299,8 +302,7 @@ int EmbeddedMeshCollision::detect( // vertices next to eachother are on different threads to provide // better concurrency. Otherwise a standard slice may end up doing // all of the BVH traversals and the other threads do none. - // I haven't actually profiled this, so maybe I'm wrong. Either way it - // won't hurt. I think. + // I haven't actually profiled this, so maybe I'm wrong. int max_threads = std::max(1, std::min(nev, admmpd::get_max_threads(options))); const auto & per_thread_function = [&per_embedded_vertex_detect,&max_threads,&nev] (DetectThreadData *td, int thread_idx) diff --git a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h index 51b9369bd4e..277747e3e27 100644 --- a/source/blender/blenkernel/BKE_mesh_remesh_voxel.h +++ b/source/blender/blenkernel/BKE_mesh_remesh_voxel.h @@ -57,8 +57,8 @@ struct Mesh *BKE_mesh_remesh_quadriflow_to_mesh_nomain(struct Mesh *mesh, void *update_cb, void *update_cb_data); struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh, - unsigned int **tets, - int *numtets); + unsigned int **tets, + int *numtets); /* Data reprojection functions */ void BKE_mesh_remesh_reproject_paint_mask(struct Mesh *target, struct Mesh *source); diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c index a488d292aa4..05cc9769bf7 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c @@ -265,9 +265,7 @@ static Mesh *BKE_mesh_remesh_quadriflow(Mesh *input_mesh, #endif #ifdef WITH_TETGEN -static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh, - unsigned int **tets, - int *numtets) +static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh, unsigned int **tets, int *numtets) { // Ensure that the triangulated mesh data is up to data BKE_mesh_runtime_looptri_recalc(input_mesh); @@ -318,11 +316,9 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh, verttri = NULL; Mesh *mesh = NULL; - if (success) - { + if (success) { // Construct the new output mesh - mesh = BKE_mesh_new_nomain( - tg.out_totverts, 0, 0, (tg.out_totfacets * 3), tg.out_totfacets); + mesh = BKE_mesh_new_nomain(tg.out_totverts, 0, 0, (tg.out_totfacets * 3), tg.out_totfacets); for (int i = 0; i < tg.out_totverts; i++) { copy_v3_v3(mesh->mvert[i].co, &tg.out_verts[i * 3]); @@ -341,26 +337,24 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh, BKE_mesh_calc_normals(mesh); *numtets = tg.out_tottets; - *tets = (unsigned int *)MEM_malloc_arrayN(tg.out_tottets*4, sizeof(unsigned int), "remesh_output_tets"); + *tets = (unsigned int *)MEM_malloc_arrayN( + tg.out_tottets * 4, sizeof(unsigned int), "remesh_output_tets"); //*tets = (unsigned int *)malloc(tg.out_tottets*4*sizeof(unsigned int)); - memcpy(*tets,tg.out_tets,tg.out_tottets*4*sizeof(unsigned int)); + memcpy(*tets, tg.out_tets, tg.out_tottets * 4 * sizeof(unsigned int)); - } // end success + } // end success - if (tg.out_verts != NULL) - { + if (tg.out_verts != NULL) { MEM_freeN(tg.out_verts); tg.out_verts = NULL; } - if (tg.out_facets != NULL) - { + if (tg.out_facets != NULL) { MEM_freeN(tg.out_facets); tg.out_facets = NULL; } - if (tg.out_tets != NULL) - { + if (tg.out_tets != NULL) { MEM_freeN(tg.out_tets); tg.out_tets = NULL; } @@ -370,16 +364,14 @@ static Mesh *BKE_mesh_remesh_tetgen(Mesh *input_mesh, #endif struct Mesh *BKE_mesh_remesh_tetgen_to_mesh_nomain(struct Mesh *mesh, - unsigned int **tets, - int *numtets) + unsigned int **tets, + int *numtets) { - #ifdef WITH_TETGEN - return BKE_mesh_remesh_tetgen(mesh,tets,numtets); - #else - UNUSED_VARS(mesh, - tets, - numtets); - #endif +#ifdef WITH_TETGEN + return BKE_mesh_remesh_tetgen(mesh, tets, numtets); +#else + UNUSED_VARS(mesh, tets, numtets); +#endif return NULL; } diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 2ef42be1f83..bca2af1fb18 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -926,7 +926,7 @@ static void free_scratch(SoftBody *sb) /* only frees internal data */ static void free_softbody_intern(SoftBody *sb) { - if (sb) { + if (sb) { int a; BodyPoint *bp; @@ -3085,7 +3085,7 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, { SoftBody *sb = ob->soft; if (sb) { - //int sb_totpt = sb->totpoint; + // int sb_totpt = sb->totpoint; BodyPoint *bp = sb->bpoint; int a; @@ -3128,12 +3128,12 @@ SoftBody *sbNew(Scene *scene) SoftBody *sb; sb = MEM_callocN(sizeof(SoftBody), "softbody"); - sb->solver_mode = SOLVER_MODE_LEGACY;//SOLVER_MODE_ADMMPD; - sb->admmpd_mesh_mode = 0; // embedded + sb->solver_mode = SOLVER_MODE_LEGACY; // SOLVER_MODE_ADMMPD; + sb->admmpd_mesh_mode = 0; // embedded sb->admmpd_substeps = 1; sb->admmpd_max_admm_iters = 20; sb->admmpd_self_collision = 0; - sb->admmpd_material = 0; // ARAP + sb->admmpd_material = 0; // ARAP sb->admmpd_embed_res = 3; sb->admmpd_converge_eps = 1e-4; sb->admmpd_youngs_exp = 6; @@ -3143,11 +3143,11 @@ SoftBody *sbNew(Scene *scene) sb->admmpd_pk_exp = 4; sb->admmpd_floor_z = -999; sb->admmpd_gravity = -9.8; - sb->admmpd_strainlimit_min = 0; // no compression - sb->admmpd_strainlimit_max = 100; // 100x stretch + sb->admmpd_strainlimit_min = 0; // no compression + sb->admmpd_strainlimit_max = 100; // 100x stretch sb->admmpd_maxthreads = -1; - sb->admmpd_loglevel = 1; // low - sb->admmpd_linsolver = 1; // PCG + sb->admmpd_loglevel = 1; // low + sb->admmpd_linsolver = 1; // PCG sb->admmpd = MEM_callocN(sizeof(ADMMPDInterfaceData), "SoftBody_admmpd"); sb->mediafrict = 0.5f; @@ -3564,22 +3564,21 @@ static void sbStoreLastFrame(struct Depsgraph *depsgraph, Object *object, float object_orig->soft->last_frame = framenr; } -static void update_collider_admmpd( - Depsgraph *depsgraph, - Collection *collection, - Object *vertexowner) +static void update_collider_admmpd(Depsgraph *depsgraph, + Collection *collection, + Object *vertexowner) { SoftBody *sb = vertexowner->soft; - if (!sb) { return; } - if (!sb->admmpd) { return; } + if (!sb) { + return; + } + if (!sb->admmpd) { + return; + } unsigned int numobjects; Object **objects = BKE_collision_objects_create( - depsgraph, - vertexowner, - collection, - &numobjects, - eModifierType_Collision); + depsgraph, vertexowner, collection, &numobjects, eModifierType_Collision); // How many faces and vertices do we need to allocate? int tot_verts = 0; @@ -3587,9 +3586,9 @@ static void update_collider_admmpd( for (int i = 0; i < numobjects; ++i) { Object *ob = objects[i]; if (ob->type == OB_MESH) { - if (ob->pd && ob->pd->deflect){ - CollisionModifierData *cmd = (CollisionModifierData *) - BKE_modifiers_findby_type(ob, eModifierType_Collision); + if (ob->pd && ob->pd->deflect) { + CollisionModifierData *cmd = (CollisionModifierData *)BKE_modifiers_findby_type( + ob, eModifierType_Collision); if (!cmd) continue; tot_verts += cmd->mvert_num; @@ -3598,9 +3597,9 @@ static void update_collider_admmpd( } } - float *obs_v0 = MEM_callocN(sizeof(float)*3*tot_verts, __func__); - float *obs_v1 = MEM_callocN(sizeof(float)*3*tot_verts, __func__); - unsigned int *obs_faces = MEM_callocN(sizeof(unsigned int)*3*tot_faces, __func__); + float *obs_v0 = MEM_callocN(sizeof(float) * 3 * tot_verts, __func__); + float *obs_v1 = MEM_callocN(sizeof(float) * 3 * tot_verts, __func__); + unsigned int *obs_faces = MEM_callocN(sizeof(unsigned int) * 3 * tot_faces, __func__); // Copy over vertices and faces int curr_verts = 0; @@ -3608,24 +3607,24 @@ static void update_collider_admmpd( for (int i = 0; i < numobjects; ++i) { Object *ob = objects[i]; if (ob->type == OB_MESH) { - if (ob->pd && ob->pd->deflect){ - CollisionModifierData *cmd = (CollisionModifierData *) - BKE_modifiers_findby_type(ob, eModifierType_Collision); + if (ob->pd && ob->pd->deflect) { + CollisionModifierData *cmd = (CollisionModifierData *)BKE_modifiers_findby_type( + ob, eModifierType_Collision); if (!cmd) continue; - for (int j=0; j<cmd->mvert_num; ++j) { - int v_idx = j*3 + curr_verts*3; - for (int k=0; k<3; ++k) { - obs_v0[v_idx+k] = cmd->x[j].co[k]; - obs_v1[v_idx+k] = cmd->xnew[j].co[k]; + for (int j = 0; j < cmd->mvert_num; ++j) { + int v_idx = j * 3 + curr_verts * 3; + for (int k = 0; k < 3; ++k) { + obs_v0[v_idx + k] = cmd->x[j].co[k]; + obs_v1[v_idx + k] = cmd->xnew[j].co[k]; } } - for (int j=0; j<cmd->tri_num; ++j) { - int f_idx = j*3 + curr_faces*3; - for (int k=0; k<3; ++k) { - obs_faces[f_idx+k] = cmd->tri[j].tri[k] + curr_verts; + for (int j = 0; j < cmd->tri_num; ++j) { + int f_idx = j * 3 + curr_faces * 3; + for (int k = 0; k < 3; ++k) { + obs_faces[f_idx + k] = cmd->tri[j].tri[k] + curr_verts; } } @@ -3714,44 +3713,43 @@ void sbObjectStep(struct Depsgraph *depsgraph, bool is_first_frame = framenr == startframe; /* Do we need to initialize the ADMM-PD mesh? - * a) Has never been initialized. - * b) The mesh topology has changed. - * TODO: ob->obmat or vertexCos change. */ + * a) Has never been initialized. + * b) The mesh topology has changed. + * TODO: ob->obmat or vertexCos change. */ int init_mesh = 0; if (is_first_frame || admmpd_mesh_needs_update(sb->admmpd, ob)) { init_mesh = admmpd_update_mesh(sb->admmpd, ob, vertexCos); - if (init_mesh==0) { + if (init_mesh == 0) { CLOG_ERROR(&LOG, "%s", sb->admmpd->last_error); WM_reportf(RPT_ERROR, sb->admmpd->last_error); return; } - else if (init_mesh==-1) { + else if (init_mesh == -1) { WM_reportf(RPT_WARNING, sb->admmpd->last_error); } } /* Do we need to initialize the ADMM-PD solver? - * a) Has never been initialized - * b) Some settings require re-initialization - * c) The mesh has changed */ + * a) Has never been initialized + * b) Some settings require re-initialization + * c) The mesh has changed */ int init_solver = 0; - if (is_first_frame || init_mesh || - admmpd_solver_needs_update(sb->admmpd, scene, ob)) { + if (is_first_frame || init_mesh || admmpd_solver_needs_update(sb->admmpd, scene, ob)) { init_solver = admmpd_update_solver(sb->admmpd, scene, ob, vertexCos); - if (init_solver==0) { + if (init_solver == 0) { CLOG_ERROR(&LOG, "%s", sb->admmpd->last_error); WM_reportf(RPT_ERROR, sb->admmpd->last_error); return; } - else if (init_solver==-1) { + else if (init_solver == -1) { WM_reportf(RPT_WARNING, sb->admmpd->last_error); } } /* In case of paramter change, ob->soft->bpoint has not - * been set yet. So we need to resize which can be done - * in the copy_to_object function while leaving vertexCos to null. */ - admmpd_copy_to_object(sb->admmpd,ob,NULL); + * been set yet. So we need to resize which can be done + * in the copy_to_object function while leaving vertexCos to null. */ + admmpd_copy_to_object(sb->admmpd, ob, NULL); if (init_mesh || init_solver) { BKE_ptcache_invalidate(cache); @@ -3792,7 +3790,7 @@ void sbObjectStep(struct Depsgraph *depsgraph, /* first frame, no simulation to do, just set the positions */ if (sb->solver_mode == SOLVER_MODE_ADMMPD) { - admmpd_copy_from_object(sb->admmpd,ob); + admmpd_copy_from_object(sb->admmpd, ob); } else if (sb->solver_mode == SOLVER_MODE_LEGACY) { softbody_update_positions(ob, sb, vertexCos, numVerts); @@ -3818,10 +3816,10 @@ void sbObjectStep(struct Depsgraph *depsgraph, if (sb->solver_mode == SOLVER_MODE_ADMMPD) { /* We have read the cache into softbody, so we need to pass it to ADMM-PD */ - admmpd_copy_from_object(sb->admmpd,ob); + admmpd_copy_from_object(sb->admmpd, ob); /* Now that we have the updated ADMM-PD vertices, we have - * to map them to surface vertices (vertexCos) */ - admmpd_copy_to_object(sb->admmpd,ob,vertexCos); + * to map them to surface vertices (vertexCos) */ + admmpd_copy_to_object(sb->admmpd, ob, vertexCos); } else if (sb->solver_mode == SOLVER_MODE_LEGACY) { softbody_to_object(ob, vertexCos, numVerts, sb->local); @@ -3860,17 +3858,17 @@ void sbObjectStep(struct Depsgraph *depsgraph, } if (sb->solver_mode == SOLVER_MODE_ADMMPD) { - admmpd_copy_from_object(sb->admmpd,ob); + admmpd_copy_from_object(sb->admmpd, ob); update_collider_admmpd(depsgraph, sb->collision_group, ob); - int solve_retval = admmpd_solve(sb->admmpd,ob,vertexCos); - if (solve_retval==0) { + int solve_retval = admmpd_solve(sb->admmpd, ob, vertexCos); + if (solve_retval == 0) { CLOG_ERROR(&LOG, "%s", sb->admmpd->last_error); WM_reportf(RPT_ERROR, sb->admmpd->last_error); } - else if (solve_retval==-1) { + else if (solve_retval == -1) { WM_reportf(RPT_WARNING, sb->admmpd->last_error); } - admmpd_copy_to_object(sb->admmpd,ob,vertexCos); + admmpd_copy_to_object(sb->admmpd, ob, vertexCos); } else if (sb->solver_mode == SOLVER_MODE_LEGACY) { softbody_update_positions(ob, sb, vertexCos, numVerts); diff --git a/source/blender/editors/object/object_remesh.c b/source/blender/editors/object/object_remesh.c index 119f0d8d238..d5715cf6879 100644 --- a/source/blender/editors/object/object_remesh.c +++ b/source/blender/editors/object/object_remesh.c @@ -1209,7 +1209,7 @@ static int tetgen_remesh_exec(bContext *C, wmOperator *op) unsigned int *tets = NULL; int numtets; - new_mesh = BKE_mesh_remesh_tetgen_to_mesh_nomain(mesh,&tets,&numtets); + new_mesh = BKE_mesh_remesh_tetgen_to_mesh_nomain(mesh, &tets, &numtets); if (tets) { MEM_freeN(tets); } @@ -1250,8 +1250,6 @@ void OBJECT_OT_tetgen_remesh(wmOperatorType *ot) ot->exec = tetgen_remesh_exec; ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - - } /** \} */ diff --git a/source/blender/gpu/intern/gpu_backend.hh b/source/blender/gpu/intern/gpu_backend.hh index ba382e3c3fc..25d165098a7 100644 --- a/source/blender/gpu/intern/gpu_backend.hh +++ b/source/blender/gpu/intern/gpu_backend.hh @@ -25,9 +25,9 @@ #pragma once +#include "gpu_batch_private.hh" #include "gpu_context_private.hh" #include "gpu_drawlist_private.hh" -#include "gpu_batch_private.hh" namespace blender { namespace gpu { diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h index 0d9a8c52ec3..33b16350354 100644 --- a/source/blender/makesdna/DNA_object_force_types.h +++ b/source/blender/makesdna/DNA_object_force_types.h @@ -215,28 +215,28 @@ typedef struct SoftBody { struct ADMMPDInterfaceData *admmpd; /* ADMM-PD settings */ - int solver_mode; // 0=legacy, 1=admmpd - int admmpd_mesh_mode; // 0=embedded, 1=tetgen, 2=cloth - int admmpd_substeps; // break time step into smaller bits - int admmpd_max_admm_iters; // max solver iterations - int admmpd_self_collision; // 0 or 1 - int admmpd_material; // see enum - int admmpd_embed_res; // embedded resolution depth - float admmpd_converge_eps; // convergence epsilon - float admmpd_youngs_exp; // Youngs mod exponent - float admmpd_poisson; // Poisson ratio - float admmpd_density_kgm3; // unit-density of object - float admmpd_ck_exp; // collision stiffness exponent (10^n) - float admmpd_pk_exp; // goal stiffness exponent (10^n) - float admmpd_floor_z; // floor position - float admmpd_gravity; // in m/s^2 - float admmpd_strainlimit_min; // [0,1] - float admmpd_strainlimit_max; // [1,100] - int admmpd_maxthreads; // -1 = auto - int admmpd_loglevel; // 0=none, 1=low, 2=high - int admmpd_linsolver; // global step + int solver_mode; // 0=legacy, 1=admmpd + int admmpd_mesh_mode; // 0=embedded, 1=tetgen, 2=cloth + int admmpd_substeps; // break time step into smaller bits + int admmpd_max_admm_iters; // max solver iterations + int admmpd_self_collision; // 0 or 1 + int admmpd_material; // see enum + int admmpd_embed_res; // embedded resolution depth + float admmpd_converge_eps; // convergence epsilon + float admmpd_youngs_exp; // Youngs mod exponent + float admmpd_poisson; // Poisson ratio + float admmpd_density_kgm3; // unit-density of object + float admmpd_ck_exp; // collision stiffness exponent (10^n) + float admmpd_pk_exp; // goal stiffness exponent (10^n) + float admmpd_floor_z; // floor position + float admmpd_gravity; // in m/s^2 + float admmpd_strainlimit_min; // [0,1] + float admmpd_strainlimit_max; // [1,100] + int admmpd_maxthreads; // -1 = auto + int admmpd_loglevel; // 0=none, 1=low, 2=high + int admmpd_linsolver; // global step char admmpd_namedVG_selfcollision[64]; -// int admmpd_pad; // padding + // int admmpd_pad; // padding char _pad; char msg_lock; diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index f5b4295532f..562d1565961 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -605,8 +605,8 @@ static void rna_SoftBodySettings_spring_vgroup_set(PointerRNA *ptr, const char * static void rna_SoftBodySettings_selfcollide_vgroup_set(PointerRNA *ptr, const char *value) { SoftBody *sb = (SoftBody *)ptr->data; - rna_object_vgroup_name_set(ptr, value, - sb->admmpd_namedVG_selfcollision, sizeof(sb->admmpd_namedVG_selfcollision)); + rna_object_vgroup_name_set( + ptr, value, sb->admmpd_namedVG_selfcollision, sizeof(sb->admmpd_namedVG_selfcollision)); } static char *rna_SoftBodySettings_path(PointerRNA *ptr) @@ -1821,14 +1821,22 @@ static void rna_def_softbody(BlenderRNA *brna) static const EnumPropertyItem admmpd_linsolver_items[] = { {0, "LTLD", 0, "LDL^T", "Factors the matrix on any collision or change in pin stiffness"}, - {1, "PCG", 0, "Conjugate Gradients", "Iterative solver but factors preconditioner on change in pin stiffness"}, - //{2, "MCGS", 0, "Multi-Color Gauss-Seidel", "Fast if many threads are available, no support for self collision"}, + {1, + "PCG", + 0, + "Conjugate Gradients", + "Iterative solver but factors preconditioner on change in pin stiffness"}, + //{2, "MCGS", 0, "Multi-Color Gauss-Seidel", "Fast if many threads are available, no support + //for self collision"}, {0, NULL, 0, NULL, NULL}, }; static const EnumPropertyItem aerodynamics_type[] = { {0, "SIMPLE", 0, "Simple", "Edges receive a drag force from surrounding media"}, - {1, "LIFT_FORCE", 0, "Lift Force", + {1, + "LIFT_FORCE", + 0, + "Lift Force", "Edges receive a lift force when passing through surrounding media"}, {0, NULL, 0, NULL, NULL}, }; @@ -1953,7 +1961,8 @@ static void rna_def_softbody(BlenderRNA *brna) prop = RNA_def_property(srna, "vertex_group_selfcollide", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "admmpd_namedVG_selfcollision"); - RNA_def_property_ui_text(prop, "Self Collide VG", "Optional vertex group for self collision vertices"); + RNA_def_property_ui_text( + prop, "Self Collide VG", "Optional vertex group for self collision vertices"); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_selfcollide_vgroup_set"); RNA_def_property_update(prop, 0, "rna_softbody_update"); diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c index bca41b81e91..965d270829e 100644 --- a/source/blender/modifiers/intern/MOD_softbody.c +++ b/source/blender/modifiers/intern/MOD_softbody.c @@ -60,7 +60,6 @@ static void deformVerts(ModifierData *UNUSED(md), Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph); sbObjectStep( ctx->depsgraph, scene, ctx->object, DEG_get_ctime(ctx->depsgraph), vertexCos, numVerts); - } static bool dependsOnTime(ModifierData *UNUSED(md)) |