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:
-rw-r--r--source/blender/blenkernel/BKE_curve.h4
-rw-r--r--source/blender/blenkernel/intern/curve.c9
-rw-r--r--source/blender/editors/curve/editfont.c87
-rw-r--r--source/blender/editors/include/ED_curve.h2
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c2
5 files changed, 104 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index a9d5ea75208..4b8c557f0dd 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 1fe01fa9637..c3046804e59 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 00195eb2f88..b7b25b2fdec 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 2a04840a5b1..330147db077 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 de1516222c3..a44c116f195 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)