[Bf-blender-cvs] [9e4d667c2cf] blender2.8: SoftBody: refactored sbFree()

Sybren A. Stüvel noreply at git.blender.org
Wed Jul 4 11:45:31 CEST 2018


Commit: 9e4d667c2cfd4a81f9a69628b69facd8fd4e0a01
Author: Sybren A. Stüvel
Date:   Wed Jul 4 11:21:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB9e4d667c2cfd4a81f9a69628b69facd8fd4e0a01

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).

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

M	source/blender/blenkernel/BKE_softbody.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_modifier.c

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

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) {



More information about the Bf-blender-cvs mailing list