[Bf-blender-cvs] [cf1cdba] wiggly-widgets: Get rid of overkill arrow widget custom line vec drawing
Julian Eisel
noreply at git.blender.org
Mon Sep 14 16:50:34 CEST 2015
Commit: cf1cdba64e667626b7dfad4f2aa3cf5b679d6aa8
Author: Julian Eisel
Date: Mon Sep 14 16:43:54 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rBcf1cdba64e667626b7dfad4f2aa3cf5b679d6aa8
Get rid of overkill arrow widget custom line vec drawing
Instead, we now can use widget offset property to define starting point and a new arrow widget length property to define line length.
===================================================================
M source/blender/editors/transform/transform_manipulator.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_generic_widgets.c
===================================================================
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index be0e67c..cd023bb 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -972,32 +972,33 @@ static void manipulator_prepare_mat(Scene *scene, View3D *v3d, RegionView3D *rv3
}
/**
- * Sets up \a r_vec for custom arrow widget line drawing. Needed to
- * adjust line drawing for combined manipulator axis types.
+ * Sets up \a r_start and \a r_len to define arrow line range.
+ * Needed to adjust line drawing for combined manipulator axis types.
*/
-static void manipulator_line_vec(const View3D *v3d, float r_vec[2][3], const short axis_type)
+static void manipulator_line_range(const View3D *v3d, const short axis_type, float *r_start, float *r_len)
{
const float ofs = 0.2f;
- float start[3] = {0.0f, 0.0f, 0.2f};
- float end[3] = {0.0f, 0.0f, 1.0f};
+
+ *r_start = 0.2f;
+ *r_len = 1.0f;
switch (axis_type) {
case MAN_AXES_TRANSLATE:
if (v3d->twtype & V3D_MANIP_SCALE) {
- start[2] = end[2] - ofs + 0.075f;
+ *r_start = *r_len - ofs + 0.075f;
}
if (v3d->twtype & V3D_MANIP_ROTATE) {
- end[2] += ofs;
+ *r_len += ofs;
}
break;
case MAN_AXES_SCALE:
if (v3d->twtype & (V3D_MANIP_TRANSLATE | V3D_MANIP_ROTATE)) {
- end[2] -= ofs + 0.025f;
+ *r_len -= ofs + 0.025f;
}
break;
}
- copy_v3_v3(r_vec[0], start);
- copy_v3_v3(r_vec[1], end);
+
+ *r_len -= *r_start;
}
@@ -1128,12 +1129,14 @@ void WIDGETGROUP_manipulator_create(const struct bContext *C, struct wmWidgetGro
case MAN_AXIS_SCALE_Y:
case MAN_AXIS_SCALE_Z:
{
- float line_vec[2][3];
+ float start_co[3] = {0.0f, 0.0f, 0.0f};
+ float len;
- manipulator_line_vec(v3d, line_vec, axis_type);
+ manipulator_line_range(v3d, axis_type, &start_co[2], &len);
WIDGET_arrow_set_direction(axis, rv3d->twmat[aidx_norm]);
- WIDGET_arrow_set_line_vec(axis, (const float (*)[3])line_vec, ARRAY_SIZE(line_vec));
+ WIDGET_arrow_set_line_len(axis, len);
+ WM_widget_set_offset(axis, start_co);
WM_widget_set_line_width(axis, MAN_AXIS_LINE_WIDTH);
break;
}
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 919e7ce..5caceca 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -580,7 +580,7 @@ enum {
struct wmWidget *WIDGET_arrow_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
void WIDGET_arrow_set_direction(struct wmWidget *widget, const float direction[3]);
void WIDGET_arrow_set_up_vector(struct wmWidget *widget, const float direction[3]);
-void WIDGET_arrow_set_line_vec(struct wmWidget *widget, const float (*vec)[3], const int tot_points);
+void WIDGET_arrow_set_line_len(struct wmWidget *widget, const float len);
void WIDGET_arrow_set_ui_range(struct wmWidget *widget, const float min, const float max);
void WIDGET_arrow_set_range_fac(struct wmWidget *widget, const float range_fac);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index c7ffc27..faeee8f 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -164,12 +164,11 @@ typedef struct ArrowWidget {
wmWidget widget;
int style;
int flag;
+
+ float len; /* arrow line length */
float direction[3];
float up[3];
- float (*line)[3]; /* custom coords for arrow line drawing */
- int tot_line_points; /* amount of points for arrow line drawing */
-
float range_fac; /* factor for arrow min/max distance */
float offset;
/* property range and minimum for constrained arrows */
@@ -231,50 +230,33 @@ static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
#ifdef WIDGET_USE_CUSTOM_ARROWS
widget_draw_intern(&arrow_head_draw_info, select);
#else
- const int last_co_idx = arrow->tot_line_points - 1;
- float rot[3][3];
- float mat[4][4];
- float co_norm1[3], co_norm2[3];
+ const float vec[2][3] = {
+ {0.0f, 0.0f, 0.0f},
+ {0.0f, 0.0f, arrow->len},
+ };
glLineWidth(arrow->widget.line_width);
glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, arrow->line);
- glDrawArrays(GL_LINE_STRIP, 0, arrow->tot_line_points);
+ glVertexPointer(3, GL_FLOAT, 0, vec);
+ glDrawArrays(GL_LINE_STRIP, 0, ARRAY_SIZE(vec));
glDisableClientState(GL_VERTEX_ARRAY);
glLineWidth(1.0);
/* *** draw arrow head *** */
- /* prepare matrix for local head drawing, based on rotation of last line segment */
-
- normalize_v3_v3(co_norm1, arrow->line[last_co_idx - 1]);
- normalize_v3_v3(co_norm2, arrow->line[last_co_idx]);
- rotation_between_vecs_to_mat3(rot, co_norm1, co_norm2);
- if ((arrow->flag & ARROW_CUSTOM_LINE_SET) == 0) {
- negate_m3(rot);
- }
-
- copy_m4_m3(mat, rot);
- copy_v3_v3(mat[3], arrow->line[last_co_idx]);
+ glPushMatrix();
if (arrow->style & WIDGET_ARROW_STYLE_BOX) {
const float size = 0.05f;
- float loc[3];
- /* add some extra offset so box starts exactly where line ends */
- normalize_v3_v3(loc, arrow->line[last_co_idx]);
- madd_v3_v3fl(mat[3], loc, size);
+ /* translate to line end with some extra offset so box starts exactly where line ends */
+ glTranslatef(0.0f, 0.0f, arrow->len + size);
/* scale down to box size */
- mul_mat3_m4_fl(mat, size);
-
- glPushMatrix();
- glMultMatrixf(mat);
+ glScalef(size, size, size);
/* draw cube */
widget_draw_intern(&cube_draw_info, select);
-
- glPopMatrix();
}
else {
GLUquadricObj *qobj = gluNewQuadric();
@@ -282,8 +264,8 @@ static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
const float width = 0.06f;
const bool use_lighting = !select && ((U.tw_flag & V3D_SHADED_WIDGETS) != 0);
- glPushMatrix();
- glMultMatrixf(mat);
+ /* translate to line end */
+ glTranslatef(0.0f, 0.0f, arrow->len);
if (use_lighting) {
glShadeModel(GL_SMOOTH);
@@ -298,10 +280,9 @@ static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
if (use_lighting) {
glShadeModel(GL_FLAT);
}
-
- glPopMatrix();
}
+ glPopMatrix();
(void)select;
#endif
}
@@ -602,10 +583,6 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const char *name, const int st
{
ArrowWidget *arrow = MEM_callocN(sizeof(ArrowWidget), name);
const float dir_default[3] = {0.0f, 0.0f, 1.0f};
- const float line_default[2][3] = {
- {0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 1.0f}
- };
int real_style = style;
#ifdef WIDGET_USE_CUSTOM_ARROWS
@@ -644,13 +621,9 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const char *name, const int st
arrow->widget.flag |= WM_WIDGET_SCALE_3D;
arrow->style = real_style;
+ arrow->len = 1.0f;
arrow->range_fac = 1.0f;
-
- /* defaults */
copy_v3_v3(arrow->direction, dir_default);
- arrow->tot_line_points = ARRAY_SIZE(line_default);
- arrow->line = MEM_mallocN(sizeof(line_default), __func__);
- memcpy(arrow->line, line_default, sizeof(line_default));
wm_widget_register(wgroup, &arrow->widget, name);
@@ -680,20 +653,12 @@ void WIDGET_arrow_set_up_vector(wmWidget *widget, const float direction[3])
}
/**
- * Define a custom coord vec for arrow line drawing
+ * Define a custom arrow line length
*/
-void WIDGET_arrow_set_line_vec(wmWidget *widget, const float (*vec)[3], const int tot_points)
+void WIDGET_arrow_set_line_len(wmWidget *widget, const float len)
{
ArrowWidget *arrow = (ArrowWidget *)widget;
- const size_t vec_size = 3 * tot_points * sizeof(float);
-
- BLI_assert(tot_points > 1);
-
- arrow->tot_line_points = tot_points;
- arrow->line = MEM_reallocN(arrow->line, vec_size);
- memcpy(arrow->line, vec, vec_size);
-
- arrow->flag |= ARROW_CUSTOM_LINE_SET;
+ arrow->len = len;
}
/**
More information about the Bf-blender-cvs
mailing list