[Bf-blender-cvs] [14686a3] wiggly-widgets: Implement non-3D drawing per widget.
Antony Riakiotakis
noreply at git.blender.org
Mon Oct 13 16:43:43 CEST 2014
Commit: 14686a3677aa4f977790ec7cd8b6c3d4c96e0ead
Author: Antony Riakiotakis
Date: Mon Oct 13 16:43:35 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB14686a3677aa4f977790ec7cd8b6c3d4c96e0ead
Implement non-3D drawing per widget.
Basically, 3D widgets stay the same size whatever the zoom is in 3D
view. Ported over from manipulator code.
===================================================================
M source/blender/editors/include/ED_transform.h
M source/blender/editors/include/UI_interface.h
M source/blender/editors/interface/interface_generic_widgets.c
M source/blender/editors/transform/transform_manipulator.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/WM_types.h
M source/blender/windowmanager/intern/wm_widgets.c
===================================================================
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index b24279e..940580a 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -167,8 +167,8 @@ int WIDGET_manipulator_handler(struct bContext *C, const struct wmEvent *event,
int WIDGET_manipulator_handler_trans(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget);
-void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase);
-void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C);
+void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
+void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C, float scale);
bool WIDGETGROUP_manipulator_poll(struct wmWidgetGroup *wgroup, const struct bContext *C);
void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct bContext *C);
void WIDGETGROUP_manipulator_free(struct wmWidgetGroup *wgroup);
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index e2af928..73fb042 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1000,8 +1000,8 @@ int uiFloatPrecisionCalc(int prec, double value);
/* ui_generic_widgets.c */
int WIDGET_lamp_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget);
-void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase);
-void WIDGET_lamp_draw(struct wmWidget *widget, const struct bContext *C);
+void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
+void WIDGET_lamp_draw(struct wmWidget *widget, const struct bContext *C, float scale);
bool WIDGETGROUP_lamp_poll(struct wmWidgetGroup *widget, const struct bContext *C);
enum {
@@ -1011,7 +1011,6 @@ enum {
struct wmWidget *WIDGET_arrow_new(int style, int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget));
void WIDGET_arrow_set_color(struct wmWidget *widget, float color[4]);
-void WIDGET_arrow_set_origin(struct wmWidget *widget, float origin[3]);
void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3]);
#endif /* __UI_INTERFACE_H__ */
diff --git a/source/blender/editors/interface/interface_generic_widgets.c b/source/blender/editors/interface/interface_generic_widgets.c
index 92eba1a..a5bee08 100644
--- a/source/blender/editors/interface/interface_generic_widgets.c
+++ b/source/blender/editors/interface/interface_generic_widgets.c
@@ -304,12 +304,12 @@ static void intern_lamp_draw(const struct bContext *C, int selectoffset, wmWidge
glPopMatrix();
}
-void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase)
+void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, float UNUSED(scale), int selectionbase)
{
intern_lamp_draw(C, selectionbase, widget);
}
-void WIDGET_lamp_draw(wmWidget *widget, const struct bContext *C)
+void WIDGET_lamp_draw(wmWidget *widget, const struct bContext *C, float UNUSED(scale))
{
intern_lamp_draw(C, -1, widget);
}
@@ -334,12 +334,11 @@ bool WIDGETGROUP_lamp_poll(struct wmWidgetGroup *UNUSED(widget), const struct bC
typedef struct ArrowWidget {
wmWidget widget;
int style;
- float origin[3];
float direction[3];
float color[4];
} ArrowWidget;
-static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight)
+static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, float scale)
{
float rot[3][3];
float mat[4][4];
@@ -355,8 +354,10 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight)
rotation_between_vecs_to_mat3(rot, up, arrow->direction);
copy_m4_m3(mat, rot);
- copy_v3_v3(mat[3], arrow->origin);
+ copy_v3_v3(mat[3], arrow->widget.origin);
+ mul_mat3_m4_fl(mat, scale);
+
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, buf[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * _WIDGET_nverts_arrow, _WIDGET_verts_arrow, GL_STATIC_DRAW);
@@ -418,15 +419,15 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight)
}
}
-static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, int selectionbase)
+static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, float scale, int selectionbase)
{
GPU_select_load_id(selectionbase);
- arrow_draw_intern((ArrowWidget *)widget, true, false);
+ arrow_draw_intern((ArrowWidget *)widget, true, false, scale);
}
-static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C))
+static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C), float scale)
{
- arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0);
+ arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, scale);
}
@@ -456,13 +457,6 @@ void WIDGET_arrow_set_color(struct wmWidget *widget, float color[4])
copy_v4_v4(arrow->color, color);
}
-void WIDGET_arrow_set_origin(struct wmWidget *widget, float origin[3])
-{
- ArrowWidget *arrow = (ArrowWidget *)widget;
-
- copy_v3_v3(arrow->origin, origin);
-}
-
void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3])
{
ArrowWidget *arrow = (ArrowWidget *)widget;
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 4fc760b..ade1348 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1655,7 +1655,7 @@ static int manipulator_flags_from_active(int active)
return val;
}
-void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C)
+void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C, float UNUSED(scale))
{
ScrArea *sa = CTX_wm_area(C);
ARegion *ar = CTX_wm_region(C);
@@ -1760,21 +1760,21 @@ void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct b
if (drawflags & MAN_TRANS_X) {
WM_widget_register(wgroup, manipulator->translate_x);
- WIDGET_arrow_set_origin(manipulator->translate_x, rv3d->twmat[3]);
+ copy_v3_v3(manipulator->translate_x->origin, rv3d->twmat[3]);
WIDGET_arrow_set_direction(manipulator->translate_x, rv3d->twmat[0]);
WIDGET_arrow_set_color(manipulator->translate_x, color_red);
}
if (drawflags & MAN_TRANS_Y) {
WM_widget_register(wgroup, manipulator->translate_y);
- WIDGET_arrow_set_origin(manipulator->translate_y, rv3d->twmat[3]);
+ copy_v3_v3(manipulator->translate_y->origin, rv3d->twmat[3]);
WIDGET_arrow_set_direction(manipulator->translate_y, rv3d->twmat[1]);
WIDGET_arrow_set_color(manipulator->translate_y, color_green);
}
if (drawflags & MAN_TRANS_Z) {
WM_widget_register(wgroup, manipulator->translate_z);
- WIDGET_arrow_set_origin(manipulator->translate_z, rv3d->twmat[3]);
+ copy_v3_v3(manipulator->translate_z->origin, rv3d->twmat[3]);
WIDGET_arrow_set_direction(manipulator->translate_z, rv3d->twmat[2]);
WIDGET_arrow_set_color(manipulator->translate_z, color_blue);
}
@@ -1791,7 +1791,7 @@ bool WIDGETGROUP_manipulator_poll(wmWidgetGroup *UNUSED(wgroup), const struct bC
return ((v3d->twflag & V3D_USE_MANIPULATOR) != 0);
}
-void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), int selectionbase)
+void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), float UNUSED(scale), int selectionbase)
{
ScrArea *sa = CTX_wm_area(C);
View3D *v3d = sa->spacedata.first;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7a8cb00..0639a17 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -468,8 +468,8 @@ struct wmWidgetGroup *WM_widgetgroup_new(bool (*poll)(struct wmWidgetGroup *, co
void (*free)(struct wmWidgetGroup *),
void *customdata);
-struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *),
- void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, int),
+struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *, float scale),
+ void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
int (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
int (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *),
void *customdata, bool free_data);
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 21bfe63..842086c 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -658,16 +658,19 @@ typedef struct wmWidget {
void *customdata;
/* draw widget */
- void (*draw)(struct wmWidget *widget, const struct bContext *C);
+ void (*draw)(struct wmWidget *widget, const struct bContext *C, float scale);
/* determine if the mouse intersects with the widget. The calculation should be done in the callback itself */
int (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget);
/* determines 3d intersetion by rendering the widget in a selection routine. Returns number of max selection ids that
* will be used by the widget */
- void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *widget, int selectionbase);
+ void (*render_3d_intersection)(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
int (*handler
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list