[Bf-blender-cvs] [c9817c67fc1] master: Snap System: Replace creation and destruction of the object list by a Macro

mano-wii noreply at git.blender.org
Fri Jul 14 00:39:31 CEST 2017


Commit: c9817c67fc141ca85a6e1f9e42d9fa081ede38c7
Author: mano-wii
Date:   Thu Jul 13 19:39:17 2017 -0300
Branches: master
https://developer.blender.org/rBc9817c67fc141ca85a6e1f9e42d9fa081ede38c7

Snap System: Replace creation and destruction of the object list by a Macro

The macro got a little strange, but it's better than using the MEM_mallocN inside a loop, or repeat the lines

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

M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 52fb8411f92..85833f54da6 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -138,88 +138,44 @@ struct SnapObjectContext {
 /** Common utilities
 * \{ */
 
-struct SnapObject {
-	struct SnapObject *next, *prev;
 
-	bool use_obedit;
-	struct Object *ob;
-	float obmat[4][4];
-};
-
-/**
- * Walks through all objects in the scene to create the list of objets to snap.
- *
- * \param sctx: Snap context to store data.
- * \param snap_select : from enum SnapSelect.
- * \param use_object_edit_cage : Uses the coordinates of BMesh(if any) to do the snapping.
- *
- */
-static void create_object_list(
-        SnapObjectContext *sctx,
-        const SnapSelect snap_select, const bool use_object_edit_cage, ListBase *r_obj_list)
-{
-	r_obj_list->first = r_obj_list->last = NULL;
-
-	Object *obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
-
-	bool ignore_object_selected = false, ignore_object_active = false;
-	switch (snap_select) {
-		case SNAP_ALL:
-			break;
-		case SNAP_NOT_SELECTED:
-			ignore_object_selected = true;
-			break;
-		case SNAP_NOT_ACTIVE:
-			ignore_object_active = true;
-			break;
-	}
-
-	/* Need an exception for particle edit because the base is flagged with BA_HAS_RECALC_DATA
-	 * which makes the loop skip it, even the derived mesh will never change
-	 *
-	 * To solve that problem, we do it first as an exception.
-	 * */
-	Base *base_act = sctx->scene->basact;
-	if (base_act && base_act->object && base_act->object->mode & OB_MODE_PARTICLE_EDIT) {
-		struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
-		sobj->use_obedit = false;
-		sobj->ob = base_act->object;
-		copy_m4_m4(sobj->obmat, sobj->ob->obmat);
-		BLI_addtail(r_obj_list, sobj);
-	}
-
-	for (Base *base = sctx->scene->base.first; base != NULL; base = base->next) {
-		if ((BASE_VISIBLE_BGMODE(sctx->v3d_data.v3d, sctx->scene, base)) &&
-		    (base->flag & (BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA)) == 0 &&
-
-			!((ignore_object_selected && (base->flag & (SELECT | BA_WAS_SEL))) ||
-			  (ignore_object_active && base == base_act)))
-		{
-			Object *ob = base->object;
-
-			if (ob->transflag & OB_DUPLI) {
-				DupliObject *dupli_ob;
-				ListBase *lb = object_duplilist(sctx->bmain->eval_ctx, sctx->scene, ob);
-
-				for (dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {
-					struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
-					sobj->use_obedit = obedit && dupli_ob->ob->data == obedit->data;
-					sobj->ob = sobj->use_obedit ? obedit : dupli_ob->ob;;
-					copy_m4_m4(sobj->obmat, dupli_ob->mat);
-					BLI_addtail(r_obj_list, sobj);
-				}
-
-				free_object_duplilist(lb);
-			}
-
-			struct SnapObject *sobj = MEM_mallocN(sizeof(*sobj), __func__);
-			sobj->use_obedit = obedit && ob->data == obedit->data;
-			sobj->ob = sobj->use_obedit ? obedit : ob;
-			copy_m4_m4(sobj->obmat, sobj->ob->obmat);
-			BLI_addtail(r_obj_list, sobj);
-		}
-	}
-}
+#define ITER_SNAP_OBJECTS(use_obedit, ob, obmat, sctx, snap_select, obedit, CODE) \
+	Base *base_act = sctx->scene->basact;\
+	/* Need an exception for particle edit because the base is flagged with BA_HAS_RECALC_DATA\
+	 * which makes the loop skip it, even the derived mesh will never change\
+	 *\
+	 * To solve that problem, we do it first as an exception.\
+	 * */\
+	if (base_act && base_act->object && base_act->object->mode & OB_MODE_PARTICLE_EDIT) {\
+		use_obedit = false;\
+		ob = base_act->object;\
+		obmat = ob->obmat;\
+		CODE\
+	}\
+	for (Base *base = sctx->scene->base.first; base != NULL; base = base->next) {\
+		if ((BASE_VISIBLE_BGMODE(sctx->v3d_data.v3d, sctx->scene, base)) &&\
+		    (base->flag & (BA_HAS_RECALC_OB | BA_HAS_RECALC_DATA)) == 0 &&\
+			!((snap_select == SNAP_NOT_SELECTED && (base->flag & (SELECT | BA_WAS_SEL))) ||\
+			  (snap_select == SNAP_NOT_ACTIVE && base == base_act)))\
+		{\
+			Object *obj = base->object;\
+			if (ob->transflag & OB_DUPLI) {\
+				DupliObject *dupli_ob;\
+				ListBase *lb = object_duplilist(sctx->bmain->eval_ctx, sctx->scene, obj);\
+				for (dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {\
+					use_obedit = obedit && dupli_ob->ob->data == obedit->data;;\
+					ob = use_obedit ? obedit : dupli_ob->ob;\
+					obmat = dupli_ob->mat;\
+					CODE\
+				}\
+				free_object_duplilist(lb);\
+			}\
+			use_obedit = obedit && ob->data == obedit->data;\
+			ob = use_obedit ? obedit : obj;\
+			obmat = ob->obmat;\
+			CODE\
+		}\
+	}\
 
 
 /**
@@ -853,21 +809,21 @@ static bool raycastObjects(
         ListBase *r_hit_list)
 {
 	bool retval = false;
+	bool use_obedit;
 
 	unsigned int ob_index = 0;
 
-	ListBase obj_list;
-	create_object_list(sctx, snap_select, use_object_edit_cage, &obj_list);
+	Object *ob, *obedit;
+	float (*obmat)[4];
 
-	for (struct SnapObject *sobj = obj_list.first; sobj; sobj = sobj->next) {
+	obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
+	ITER_SNAP_OBJECTS(use_obedit, ob, obmat, sctx, snap_select, obedit,
 		retval |= raycastObj(
 		        sctx,
 		        ray_orig, ray_start, ray_dir, depth_range,
-		        sobj->ob, sobj->obmat, ob_index++, sobj->use_obedit,
+		        ob, obmat, ob_index++, use_obedit,
 		        ray_depth, r_loc, r_no, r_index, r_ob, r_obmat, r_hit_list);
-	}
-
-	BLI_freelistN(&obj_list);
+	)
 
 	return retval;
 }
@@ -2080,18 +2036,18 @@ static bool snapObjectsRay(
         Object **r_ob, float r_obmat[4][4])
 {
 	bool retval = false;
+	bool use_obedit;
 
-	ListBase obj_list;
-	create_object_list(sctx, snap_select, use_object_edit_cage, &obj_list);
+	Object *ob, *obedit;
+	float (*obmat)[4];
 
-	for (struct SnapObject *sobj = obj_list.first; sobj; sobj = sobj->next) {
+	obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
+	ITER_SNAP_OBJECTS(use_obedit, ob, obmat, sctx, snap_select, obedit,
 		retval |= snapObject(
-		        sctx, snapdata, sobj->ob, sobj->obmat, sobj->use_obedit,
+		        sctx, snapdata, ob, obmat, use_obedit,
 		        ray_depth, dist_px,
 		        r_loc, r_no, r_ob, r_obmat);
-	}
-
-	BLI_freelistN(&obj_list);
+	)
 
 	return retval;
 }




More information about the Bf-blender-cvs mailing list