[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