Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormano-wii <germano.costa@ig.com.br>2017-07-14 22:52:31 +0300
committermano-wii <germano.costa@ig.com.br>2017-07-14 22:52:31 +0300
commit08b59ab7b928ae2c7ae96bf150a2c621f44ae786 (patch)
tree4eeedce623606a7188ac84759837632be1253687 /source/blender/editors
parent5fb5b7489047d55f020c685ede2c98aeb61ffd39 (diff)
Snap System: Use function that does the interactor instead of Macro
Macro makes debugging difficult. And in that case I was escaping from the style used in Blender
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/transform/transform_snap_object.c206
1 files changed, 140 insertions, 66 deletions
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 761fb3b5b35..61f4914a3f0 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -139,43 +139,55 @@ struct SnapObjectContext {
* \{ */
-#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 (obj->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 && obj->data == obedit->data;\
- ob = use_obedit ? obedit : obj;\
- obmat = ob->obmat;\
- CODE\
- }\
- }\
+typedef void(*IterSnapObjsCallback)(SnapObjectContext *sctx, bool is_obedit, Object *ob, float obmat[4][4], void *data);
+
+/**
+ * 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 obedit : Object Edited to use its coordinates of BMesh(if any) to do the snapping.
+ */
+static void iter_snap_objects(
+ SnapObjectContext *sctx,
+ const SnapSelect snap_select,
+ Object *obedit,
+ IterSnapObjsCallback sob_callback,
+ void *data)
+{
+ 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) {
+ sob_callback(sctx, false, base_act->object, base_act->object->obmat, data);
+ }
+
+ 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)))
+ {
+ bool use_obedit;
+ Object *obj = base->object;
+ if (obj->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;
+ sob_callback(sctx, use_obedit, use_obedit ? obedit : dupli_ob->ob, dupli_ob->mat, data);
+ }
+ free_object_duplilist(lb);
+ }
+
+ use_obedit = obedit && obj->data == obedit->data;
+ sob_callback(sctx, use_obedit, use_obedit ? obedit : obj, obj->obmat, data);
+ }
+ }
+}
/**
@@ -768,6 +780,37 @@ static bool raycastObj(
}
+struct RaycastObjUserData {
+ const float *ray_orig;
+ const float *ray_start;
+ const float *ray_dir;
+ const float *depth_range;
+ const unsigned int ob_index;
+ /* read/write args */
+ float *ray_depth;
+ /* return args */
+ float *r_loc;
+ float *r_no;
+ int *r_index;
+ Object **r_ob;
+ float (*r_obmat)[4];
+ ListBase *r_hit_list;
+ bool ret;
+};
+
+static void raycast_obj_cb(SnapObjectContext *sctx, bool is_obedit, Object *ob, float obmat[4][4], void *data)
+{
+ struct RaycastObjUserData *dt = data;
+ dt->ret |= raycastObj(
+ sctx,
+ dt->ray_orig, dt->ray_start, dt->ray_dir, dt->depth_range,
+ ob, obmat, dt->ob_index, is_obedit,
+ dt->ray_depth,
+ dt->r_loc, dt->r_no, dt->r_index,
+ dt->r_ob, dt->r_obmat,
+ dt->r_hit_list);
+}
+
/**
* Main RayCast Function
* ======================
@@ -808,24 +851,27 @@ static bool raycastObjects(
Object **r_ob, float r_obmat[4][4],
ListBase *r_hit_list)
{
- bool retval = false;
- bool use_obedit;
-
- unsigned int ob_index = 0;
-
- Object *ob, *obedit;
- float (*obmat)[4];
+ Object *obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
+
+ struct RaycastObjUserData data = {
+ .ray_orig = ray_orig,
+ .ray_start = ray_start,
+ .ray_dir = ray_dir,
+ .depth_range = depth_range,
+ .ob_index = 0,
+ .ray_depth = ray_depth,
+ .r_loc = r_loc,
+ .r_no = r_no,
+ .r_index = r_index,
+ .r_ob = r_ob,
+ .r_obmat = r_obmat,
+ .r_hit_list = r_hit_list,
+ .ret = false,
+ };
- 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,
- ob, obmat, ob_index++, use_obedit,
- ray_depth, r_loc, r_no, r_index, r_ob, r_obmat, r_hit_list);
- )
+ iter_snap_objects(sctx, snap_select, obedit, raycast_obj_cb, &data);
- return retval;
+ return data.ret;
}
@@ -1998,6 +2044,33 @@ static bool snapObject(
}
+struct SnapObjUserData {
+ SnapData *snapdata;
+ /* read/write args */
+ float *ray_depth;
+ float *dist_px;
+ /* return args */
+ float *r_loc;
+ float *r_no;
+ Object **r_ob;
+ float (*r_obmat)[4];
+ bool ret;
+};
+
+static void sanp_obj_cb(SnapObjectContext *sctx, bool is_obedit, Object *ob, float obmat[4][4], void *data)
+{
+ struct SnapObjUserData *dt = data;
+ dt->ret |= snapObject(
+ sctx, dt->snapdata,
+ ob, obmat, is_obedit,
+ /* read/write args */
+ dt->ray_depth, dt->dist_px,
+ /* return args */
+ dt->r_loc, dt->r_no,
+ dt->r_ob, dt->r_obmat);
+}
+
+
/**
* Main Snapping Function
* ======================
@@ -2035,21 +2108,22 @@ static bool snapObjectsRay(
float r_loc[3], float r_no[3],
Object **r_ob, float r_obmat[4][4])
{
- bool retval = false;
- bool use_obedit;
-
- Object *ob, *obedit;
- float (*obmat)[4];
+ Object *obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
+
+ struct SnapObjUserData data = {
+ .snapdata = snapdata,
+ .ray_depth = ray_depth,
+ .dist_px = dist_px,
+ .r_loc = r_loc,
+ .r_no = r_no,
+ .r_ob = r_ob,
+ .r_obmat = r_obmat,
+ .ret = false,
+ };
- obedit = use_object_edit_cage ? sctx->scene->obedit : NULL;
- ITER_SNAP_OBJECTS(use_obedit, ob, obmat, sctx, snap_select, obedit,
- retval |= snapObject(
- sctx, snapdata, ob, obmat, use_obedit,
- ray_depth, dist_px,
- r_loc, r_no, r_ob, r_obmat);
- )
+ iter_snap_objects(sctx, snap_select, obedit, sanp_obj_cb, &data);
- return retval;
+ return data.ret;
}
/** \} */