[Bf-blender-cvs] [67d2de8] master: Transform Volume rewrite/refactor

Germano Cavalcante noreply at git.blender.org
Wed May 11 12:15:20 CEST 2016


Commit: 67d2de882841f56c9cd35f0f0e7329b0c9190c97
Author: Germano Cavalcante
Date:   Wed May 11 19:59:02 2016 +1000
Branches: master
https://developer.blender.org/rB67d2de882841f56c9cd35f0f0e7329b0c9190c97

Transform Volume rewrite/refactor

Take advantage of the efficiency provided by the snap_context.

Also fixes errors:
- volume snap fails based on view angle (T48394).
- multiple instances of dupli-objects break volume calculation.

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

M	source/blender/blenkernel/BKE_sketch.h
M	source/blender/blenkernel/intern/sketch.c
M	source/blender/editors/armature/editarmature_sketch.c
M	source/blender/editors/include/ED_transform.h
M	source/blender/editors/include/ED_transform_snap_object_context.h
M	source/blender/editors/transform/transform_snap.c
M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h
index c4cfcba..9b9c125 100644
--- a/source/blender/blenkernel/BKE_sketch.h
+++ b/source/blender/blenkernel/BKE_sketch.h
@@ -82,7 +82,6 @@ typedef struct SK_Intersection {
 
 typedef struct SK_Sketch {
 	ListBase   strokes;
-	ListBase   depth_peels;
 	SK_Stroke *active_stroke;
 	SK_Stroke *gesture;
 	SK_Point   next_point;
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
index 0d355ab..6f5c264 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -50,8 +50,6 @@ void freeSketch(SK_Sketch *sketch)
 		sk_freeStroke(stk);
 	}
 
-	BLI_freelistN(&sketch->depth_peels);
-
 	MEM_freeN(sketch);
 }
 
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index 508bbca..7685829 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -970,100 +970,30 @@ static int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, S
 	ToolSettings *ts = CTX_data_tool_settings(C);
 	int point_added = 0;
 
-	if (ts->snap_mode == SCE_SNAP_MODE_VOLUME) {
-		DepthPeel *p1, *p2;
-		float *last_p = NULL;
-		float dist = FLT_MAX;
-		float p[3] = {0};
-		float size = 0;
-		float mvalf[2];
-
-		BLI_freelistN(&sketch->depth_peels);
-		BLI_listbase_clear(&sketch->depth_peels);
-
-		mvalf[0] = dd->mval[0];
-		mvalf[1] = dd->mval[1];
-		peelObjectsContext(C, mvalf, SNAP_ALL, &sketch->depth_peels);
-
-		if (stk->nb_points > 0 && stk->points[stk->nb_points - 1].type == PT_CONTINUOUS) {
-			last_p = stk->points[stk->nb_points - 1].p;
-		}
-		else if (LAST_SNAP_POINT_VALID) {
-			last_p = LAST_SNAP_POINT;
-		}
-
-
-		for (p1 = sketch->depth_peels.first; p1; p1 = p1->next) {
-			if (p1->flag == 0) {
-				float vec[3];
-				float new_dist;
-				float new_size = 0;
-
-				p2 = NULL;
-				p1->flag = 1;
-
-				/* if peeling objects, take the first and last from each object */
-				if (ts->snap_flag & SCE_SNAP_PEEL_OBJECT) {
-					DepthPeel *peel;
-					for (peel = p1->next; peel; peel = peel->next) {
-						if (peel->ob == p1->ob) {
-							peel->flag = 1;
-							p2 = peel;
-						}
-					}
-				}
-				/* otherwise, pair first with second and so on */
-				else {
-					for (p2 = p1->next; p2 && p2->ob != p1->ob; p2 = p2->next) {
-						/* nothing to do here */
-					}
-				}
-
-				if (p2) {
-					p2->flag = 1;
-
-					add_v3_v3v3(vec, p1->p, p2->p);
-					mul_v3_fl(vec, 0.5f);
-					new_size = len_v3v3(p1->p, p2->p);
-				}
-				else {
-					copy_v3_v3(vec, p1->p);
-				}
-
-				if (last_p == NULL) {
-					copy_v3_v3(p, vec);
-					size = new_size;
-					dist = 0;
-					break;
-				}
-
-				new_dist = len_v3v3(last_p, vec);
+	struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
+	        CTX_data_main(C), CTX_data_scene(C), 0,
+	        CTX_wm_region(C), CTX_wm_view3d(C));
 
-				if (new_dist < dist) {
-					copy_v3_v3(p, vec);
-					dist = new_dist;
-					size = new_size;
-				}
-			}
-		}
+	float mvalf[2] = {UNPACK2(dd->mval)};
+	float r_loc[3], dummy_no[3];
 
-		if (dist != FLT_MAX) {
+	if (ts->snap_mode == SCE_SNAP_MODE_VOLUME) {
+		float size;
+		if (peelObjectsSnapContext(
+		        snap_context, mvalf, SNAP_ALL,
+		        (ts->snap_flag & SCE_SNAP_PEEL_OBJECT) != 0,
+		        r_loc, dummy_no, &size))
+		{
 			pt->type = dd->type;
 			pt->mode = PT_SNAP;
 			pt->size = size / 2;
-			copy_v3_v3(pt->p, p);
+			copy_v3_v3(pt->p, r_loc);
 
 			point_added = 1;
 		}
-
-		//BLI_freelistN(&depth_peels);
 	}
 	else {
 		SK_Stroke *snap_stk;
-		float vec[3];
-		float no[3];
-		float mval[2];
-		int found = 0;
 		float dist_px = SNAP_MIN_DISTANCE; // Use a user defined value here
 
 		/* snap to strokes */
@@ -1082,37 +1012,28 @@ static int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, S
 				point_added = 1;
 			}
 		}
-		
-		mval[0] = dd->mval[0];
-		mval[1] = dd->mval[1];
 
 		/* try to snap to closer object */
 		{
-			struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create_view3d(
-			        CTX_data_main(C), CTX_data_scene(C), 0,
-			        CTX_wm_region(C), CTX_wm_view3d(C));
-
-			found = ED_transform_snap_object_project_view3d(
+			if (ED_transform_snap_object_project_view3d(
 			        snap_context,
 			        &(const struct SnapObjectParams){
 			            .snap_select = SNAP_NOT_SELECTED,
 			            .snap_to = ts->snap_mode,
 			        },
-			        mval, &dist_px, NULL,
-			        vec, no);
-
-			ED_transform_snap_object_context_destroy(snap_context);
-		}
-
-		if (found == 1) {
-			pt->type = dd->type;
-			pt->mode = PT_SNAP;
-			copy_v3_v3(pt->p, vec);
+			        mvalf, &dist_px, NULL,
+			        r_loc, dummy_no))
+			{
+				pt->type = dd->type;
+				pt->mode = PT_SNAP;
+				copy_v3_v3(pt->p, r_loc);
 
-			point_added = 1;
+				point_added = 1;
+			}
 		}
 	}
 
+	ED_transform_snap_object_context_destroy(snap_context);
 	return point_added;
 }
 
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index c881e84..933f480 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -158,19 +158,6 @@ void BIF_draw_manipulator(const struct bContext *C);
 
 /* Snapping */
 
-
-typedef struct DepthPeel {
-	struct DepthPeel *next, *prev;
-
-	float depth;
-	float p[3];
-	float no[3];
-	struct Object *ob;
-	int flag;
-} DepthPeel;
-
-struct ListBase;
-
 typedef enum SnapSelect {
 	SNAP_ALL = 0,
 	SNAP_NOT_SELECTED = 1,
@@ -179,14 +166,18 @@ typedef enum SnapSelect {
 
 #define SNAP_MIN_DISTANCE 30
 
-bool peelObjectsTransForm(
-        struct TransInfo *t, const float mval[2], SnapSelect snap_select,
+bool peelObjectsTransform(
+        struct TransInfo *t, const float mval[2],
+        SnapSelect snap_select, bool use_peel_object,
         /* return args */
-        struct ListBase *r_depth_peels);
-bool peelObjectsContext(
-        struct bContext *C, const float mval[2], SnapSelect snap_select,
+        float r_loc[3], float r_no[3], float *r_thickness);
+bool peelObjectsSnapContext(
+        struct SnapObjectContext *sctx,
+        const float mval[2],
+        SnapSelect snap_select, bool use_peel_object,
         /* return args */
-        struct ListBase *r_depth_peels);
+        float r_loc[3], float r_no[3], float *r_thickness);
+
 bool snapObjectsTransform(
         struct TransInfo *t, const float mval[2], SnapSelect snap_select,
         float *dist_px,
diff --git a/source/blender/editors/include/ED_transform_snap_object_context.h b/source/blender/editors/include/ED_transform_snap_object_context.h
index e591a91..900b759 100644
--- a/source/blender/editors/include/ED_transform_snap_object_context.h
+++ b/source/blender/editors/include/ED_transform_snap_object_context.h
@@ -29,6 +29,7 @@ struct BMVert;
 struct BMEdge;
 struct BMFace;
 
+struct ListBase;
 struct Scene;
 struct Main;
 struct Object;
@@ -38,6 +39,24 @@ struct View3D;
 /* transform_snap_object.c */
 
 /* ED_transform_snap_object_*** API */
+
+/** used for storing multiple hits */
+struct SnapObjectHitDepth {
+	struct SnapObjectHitDepth *next, *prev;
+
+	float depth;
+	float co[3];
+	float no[3];
+	int index;
+
+	struct Object *ob;
+	float obmat[4][4];
+
+	/* needed to tell which ray-cast this was part of,
+	 * the same object may be part of many ray-casts when dupli's are used. */
+	unsigned int ob_uuid;
+};
+
 struct SnapObjectParams {
 	int snap_select;  /* SnapSelect */
 	union {
@@ -81,9 +100,16 @@ bool ED_transform_snap_object_project_ray_ex(
         struct Object **r_ob, float r_obmat[4][4]);
 bool ED_transform_snap_object_project_ray(
         SnapObjectContext *sctx,
-        const float ray_origin[3], const float ray_direction[3], float *ray_dist,
+        const float ray_origin[3], const float ray_direction[3], float *ray_depth,
         float r_co[3], float r_no[3]);
 
+bool ED_transform_snap_object_project_ray_all(
+        SnapObjectContext *sctx,
+        const struct SnapObjectParams *params,
+        const float ray_start[3], const float ray_normal[3],
+        float ray_depth, bool sort,
+        struct ListBase *r_hit_list);
+
 bool ED_transform_snap_object_project_view3d_ex(
         struct SnapObjectContext *sctx,
         const struct SnapObjectParams *params,
@@ -104,4 +130,11 @@ bool ED_transform_snap_object_project_view3d_mixed(
         bool use_depth,
         float r_co[3], float r_no[3]);
 
+bool ED_transform_snap_object_project_all_view3d_ex(
+        SnapObjectContext *sctx,
+        const struct SnapObjectParams *params,
+        const float mval[2],
+        float ray_depth, bool sort,
+        ListBase *r_hit_list);
+
 #endif  /* __ED_TRANSFORM_SNAP_OBJECT_CONTEXT_H__ */
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index bcbe1f5..38f1d37 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -963,86 +963,10 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
 		mval[1] = t->mval[1];
 		
 		if (t->tsnap.mode == SCE_SNAP_MODE_VOLUME) {
-			ListBase depth_peels;
-			DepthPeel *p1, *p2;
-			const float *last_p = NULL;
-			float max_dist = FLT_MAX;
-			float p[3] = {0.0f, 0.0f, 0.0f};
-			
-			BLI_listbase_clear(&depth_peels);
-			
-			peelObjectsTransForm(t, mval, t->tsnap.modeSelect, &depth_peels);
-			
-//			if (LAST_SNAP_POINT_VALID)
-//			{
-//				last_p = LAST_SNAP_POINT;
-//			}
-//			else
-			{
-				last_p = t->tsnap.snapPoint;
-			}
-			
-			
-			for (p1 = depth_peels.first; p1; p1 = p1->next) {
-				if (p1->flag == 0) {
-					float vec[3];
-					float new_dist;
-					
-					p2 = NULL;
-					p1->flag = 1;
-		
-					/* if peeling objects, take the first and last from each object */
-					if (t->settings->snap_flag & SCE_SNAP_PEEL_OBJECT) {
-						DepthPeel *peel;
-						for (peel = p1->next; peel; peel = peel->next) {
-							if (peel->ob == p1->ob) {
-								peel->flag = 1;
-								

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list