[Bf-blender-cvs] [4cfd146] master: 3D Text: textbox selection while in editmode

Campbell Barton noreply at git.blender.org
Tue Mar 11 07:16:45 CET 2014


Commit: 4cfd14644ba271a1a58abed4da606657385ca6ce
Author: Campbell Barton
Date:   Tue Mar 11 17:12:18 2014 +1100
https://developer.blender.org/rB4cfd14644ba271a1a58abed4da606657385ca6ce

3D Text: textbox selection while in editmode

D395 from Henrik Aarnio with some improvements.

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

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/intern/curve.c
M	source/blender/editors/curve/editfont.c
M	source/blender/editors/include/ED_curve.h
M	source/blender/editors/space_view3d/view3d_select.c

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

diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index a9d5ea7..4b8c557 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -43,6 +43,8 @@ struct Nurb;
 struct Object;
 struct Scene;
 struct Path;
+struct TextBox;
+struct rctf;
 
 typedef struct CurveCache {
 	ListBase disp;
@@ -113,6 +115,8 @@ void BKE_curve_bevel_make(struct Scene *scene, struct Object *ob,  struct ListBa
 
 void BKE_curve_forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);
 
+void BKE_curve_rect_from_textbox(const struct Curve *cu, const struct TextBox *tb, struct rctf *r_rect);
+
 /* ** Nurbs ** */
 
 int BKE_nurbList_index_get_co(struct ListBase *editnurb, const int index, float r_co[3]);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 1fe01fa..c304680 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -4222,3 +4222,12 @@ void BKE_curve_material_index_clear(Curve *cu)
 		}
 	}
 }
+
+void BKE_curve_rect_from_textbox(const struct Curve *cu, const struct TextBox *tb, struct rctf *r_rect)
+{
+	r_rect->xmin = (cu->xof * cu->fsize) + tb->x;
+	r_rect->ymax = (cu->yof * cu->fsize) + tb->y + cu->fsize;
+
+	r_rect->xmax = r_rect->xmin + tb->w;
+	r_rect->ymin = r_rect->ymax - tb->h;
+}
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 00195eb..b7b25b2 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -72,6 +72,7 @@
 #include "ED_object.h"
 #include "ED_screen.h"
 #include "ED_util.h"
+#include "ED_view3d.h"
 
 #include "UI_interface.h"
 
@@ -1928,3 +1929,89 @@ void undo_push_font(bContext *C, const char *name)
 {
 	undo_editmode_push(C, name, get_undoFont, free_undoFont, undoFont_to_editFont, editFont_to_undoFont, NULL);
 }
+
+/**
+ * TextBox selection
+ */
+bool mouse_font(bContext *C, const int mval[2], bool extend, bool deselect, bool toggle)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	Curve *cu = obedit->data;
+	ViewContext vc;
+	/* bias against the active, in pixels, allows cycling */
+	const float active_bias_px = 4.0f;
+	const float mval_fl[2] = {UNPACK2(mval)};
+	const int i_actbox = max_ii(0, cu->actbox - 1);
+	int i_iter, actbox_select = -1;
+	const float dist = ED_view3d_select_dist_px();
+	float dist_sq_best = dist * dist;
+
+	view3d_set_viewcontext(C, &vc);
+
+	ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
+
+	/* currently only select active */
+	(void)extend;
+	(void)deselect;
+	(void)toggle;
+
+	for (i_iter = 0; i_iter < cu->totbox; i_iter++) {
+		int i = (i_iter + i_actbox) % cu->totbox;
+		float dist_sq_min;
+		int j, j_prev;
+
+		float obedit_co[4][3];
+		float screen_co[4][2];
+		rctf rect;
+		int project_ok = 0;
+
+
+		BKE_curve_rect_from_textbox(cu, &cu->tb[i], &rect);
+
+		copy_v3_fl3(obedit_co[0], rect.xmin, rect.ymin, 0.0f);
+		copy_v3_fl3(obedit_co[1], rect.xmin, rect.ymax, 0.0f);
+		copy_v3_fl3(obedit_co[2], rect.xmax, rect.ymax, 0.0f);
+		copy_v3_fl3(obedit_co[3], rect.xmax, rect.ymin, 0.0f);
+
+		for (j = 0; j < 4; j++) {
+			if (ED_view3d_project_float_object(vc.ar, obedit_co[j], screen_co[j],
+			                                   V3D_PROJ_TEST_CLIP_BB) == V3D_PROJ_RET_OK)
+			{
+				project_ok |= (1 << j);
+			}
+		}
+
+		dist_sq_min = dist_sq_best;
+		for (j = 0, j_prev = 3; j < 4; j_prev = j++) {
+			if ((project_ok & (1 << j)) &&
+			    (project_ok & (1 << j_prev)))
+			{
+				const float dist_test_sq = dist_squared_to_line_segment_v2(mval_fl, screen_co[j_prev], screen_co[j]);
+				if (dist_sq_min > dist_test_sq) {
+					dist_sq_min = dist_test_sq;
+				}
+			}
+		}
+
+		/* bias in pixels to cycle seletion */
+		if (i_iter == 0) {
+			dist_sq_min += active_bias_px;
+		}
+
+		if (dist_sq_min < dist_sq_best) {
+			dist_sq_best = dist_sq_min;
+			actbox_select = i + 1;
+		}
+	}
+
+	if (actbox_select != -1) {
+		if (cu->actbox != actbox_select) {
+			cu->actbox = actbox_select;
+			WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data);
+		}
+		return true;
+	}
+	else {
+		return false;
+	}
+}
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 2a04840..330147d 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -89,6 +89,8 @@ int ED_curve_updateAnimPaths(struct Curve *cu);
 
 bool ED_curve_active_center(struct Curve *cu, float center[3]);
 
+bool    mouse_font(struct bContext *C, const int mval[2], bool extend, bool deselect, bool toggle);
+
 /* debug only */
 void printknots(struct Object *obedit);
 
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index de15162..a44c116 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2260,6 +2260,8 @@ static int view3d_select_exec(bContext *C, wmOperator *op)
 			retval = mouse_nurb(C, location, extend, deselect, toggle);
 		else if (obedit->type == OB_MBALL)
 			retval = mouse_mball(C, location, extend, deselect, toggle);
+		else if (obedit->type == OB_FONT)
+			retval = mouse_font(C, location, extend, deselect, toggle);
 			
 	}
 	else if (obact && obact->mode & OB_MODE_PARTICLE_EDIT)




More information about the Bf-blender-cvs mailing list