diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-07-04 12:21:31 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-07-04 12:22:57 +0300 |
commit | 9e4d667c2cfd4a81f9a69628b69facd8fd4e0a01 (patch) | |
tree | 212ca3a6f0c3db50d83bd0fc799026ebcdfd582e | |
parent | 75b5ff6698f5c1d50152cfb68530ac6a4ead999e (diff) |
SoftBody: refactored sbFree()
This prevents having to wrap each call to sbFree() in an if(ob->soft)
condition and assign ob->soft = NULL after calling.
Furthermore, passing `Object *` allows us to change freeing behaviour
depending on whether the object is an evaluated copy or an original (not
done in this commit yet).
-rw-r--r-- | source/blender/blenkernel/BKE_softbody.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/softbody.c | 9 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 2 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 5 |
5 files changed, 14 insertions, 14 deletions
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h index ff9d079c8e1..b173c995727 100644 --- a/source/blender/blenkernel/BKE_softbody.h +++ b/source/blender/blenkernel/BKE_softbody.h @@ -54,7 +54,7 @@ typedef struct BodyPoint { extern struct SoftBody *sbNew(struct Scene *scene); /* frees internal data and softbody itself */ -extern void sbFree(struct SoftBody *sb); +extern void sbFree(struct Object *ob); /* frees simulation data to reset simulation */ extern void sbFreeSimulation(struct SoftBody *sb); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 09e1ca62b92..3f5464156c5 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -165,10 +165,7 @@ void BKE_object_free_particlesystems(Object *ob) void BKE_object_free_softbody(Object *ob) { - if (ob->soft) { - sbFree(ob->soft); - ob->soft = NULL; - } + sbFree(ob); } void BKE_object_free_curve_cache(Object *ob) @@ -452,10 +449,7 @@ void BKE_object_free(Object *ob) BKE_rigidbody_free_object(ob, NULL); BKE_rigidbody_free_constraint(ob); - if (ob->soft) { - sbFree(ob->soft); - ob->soft = NULL; - } + sbFree(ob); for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) { if (oed->free != NULL) { diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index a61b71f50eb..4960714b47c 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -3287,14 +3287,21 @@ SoftBody *sbNew(Scene *scene) } /* frees all */ -void sbFree(SoftBody *sb) +void sbFree(Object *ob) { + SoftBody *sb = ob->soft; + if (sb == NULL) { + return; + } + free_softbody_intern(sb); BKE_ptcache_free_list(&sb->ptcaches); sb->pointcache = NULL; if (sb->effector_weights) MEM_freeN(sb->effector_weights); MEM_freeN(sb); + + ob->soft = NULL; } void sbFreeSimulation(SoftBody *sb) diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 7dc4aa1d1b3..a6c3c86922d 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -1050,7 +1050,7 @@ static void copy_attr(Main *bmain, Scene *scene, ViewLayer *view_layer, short ev DEG_relations_tag_update(bmain); } else if (event == 23) { - if (base->object->soft) sbFree(base->object->soft); + sbFree(base->object); BKE_object_copy_softbody(base->object, ob, 0); if (!modifiers_findByType(base->object, eModifierType_Softbody)) { diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 2889f798dd8..31a53bed201 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -293,9 +293,8 @@ static bool object_modifier_remove(Main *bmain, Object *ob, ModifierData *md, } else if (md->type == eModifierType_Softbody) { if (ob->soft) { - sbFree(ob->soft); - ob->soft = NULL; - ob->softflag = 0; + sbFree(ob); + ob->softflag = 0; /* TODO(Sybren): this should probably be moved into sbFree() */ } } else if (md->type == eModifierType_Collision) { |