diff --git a/source/blender/editors/sculpt_paint/sculpt_cloth.cc b/source/blender/editors/sculpt_paint/sculpt_cloth.cc index d45d77b1fe7..d7a22c484a8 100644 --- a/source/blender/editors/sculpt_paint/sculpt_cloth.cc +++ b/source/blender/editors/sculpt_paint/sculpt_cloth.cc @@ -552,9 +552,10 @@ static void do_cloth_brush_apply_forces_task(Object &ob, BKE_pbvh_vertex_iter_end; } -static ListBase *cloth_brush_collider_cache_create(Object &object, Depsgraph *depsgraph) +static Vector cloth_brush_collider_cache_create(Object &object, + Depsgraph *depsgraph) { - ListBase *cache = nullptr; + Vector cache; DEGObjectIterSettings deg_iter_settings = {nullptr}; deg_iter_settings.depsgraph = depsgraph; deg_iter_settings.flags = DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_VISIBLE | @@ -573,15 +574,12 @@ static ListBase *cloth_brush_collider_cache_create(Object &object, Depsgraph *de if (!cmd->bvhtree) { continue; } - if (cache == nullptr) { - cache = MEM_cnew(__func__); - } - ColliderCache *col = MEM_cnew(__func__); - col->ob = ob; - col->collmd = cmd; + ColliderCache col{}; + col.ob = ob; + col.collmd = cmd; collision_move_object(cmd, 1.0, 0.0, true); - BLI_addtail(cache, col); + cache.append(col); } DEG_OBJECT_ITER_END; return cache; @@ -631,7 +629,7 @@ static void cloth_brush_solve_collision(Object &object, SimulationData &cloth_si const float4x4 &object_to_world = object.object_to_world(); const float4x4 &world_to_object = object.world_to_object(); - LISTBASE_FOREACH (ColliderCache *, collider_cache, cloth_sim.collider_list) { + for (const ColliderCache &collider_cache : cloth_sim.collider_list) { float ray_start[3], ray_normal[3]; float pos_world_space[3], prev_pos_world_space[3]; @@ -644,7 +642,7 @@ static void cloth_brush_solve_collision(Object &object, SimulationData &cloth_si normalize_v3(ray_normal); ClothBrushCollision col; - CollisionModifierData *collmd = collider_cache->collmd; + CollisionModifierData *collmd = collider_cache.collmd; col.col_data = collmd; isect_ray_tri_watertight_v3_precalc(&col.isect_precalc, ray_normal); @@ -728,9 +726,7 @@ static void do_cloth_brush_solve_simulation_task(Object &ob, cloth_sim.pos[i] += pos_diff * mask_v; cloth_sim.pos[i] += cloth_sim.acceleration[i] * mask_v; - if (cloth_sim.collider_list != nullptr) { - cloth_brush_solve_collision(ob, cloth_sim, i); - } + cloth_brush_solve_collision(ob, cloth_sim, i); cloth_sim.last_iteration_pos[i] = cloth_sim.pos[i]; @@ -1167,12 +1163,7 @@ void do_cloth_brush(const Sculpt &sd, Object &ob, Span nodes) do_simulation_step(sd, ob, *ss.cache->cloth_sim, nodes); } -SimulationData::~SimulationData() -{ - if (this->collider_list) { - BKE_collider_cache_free(&this->collider_list); - } -} +SimulationData::~SimulationData() = default; void simulation_limits_draw(const uint gpuattr, const Brush &brush, diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index 76da6e2254d..7887fa2dadb 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -12,6 +12,7 @@ #include #include "BKE_attribute.hh" +#include "BKE_collision.h" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" #include "BKE_subdiv_ccg.hh" @@ -1573,7 +1574,7 @@ struct SimulationData { Array prev_pos; Array last_iteration_pos; - ListBase *collider_list; + Vector collider_list; int totnode; Map node_state_index;