[Bf-blender-cvs] [334b25a] wiggly-widgets: * Manipulator Y 3D arrow moved and rotated correctly. * Light manipulator doing undo now * Scons should be fixed.

Antony Riakiotakis noreply at git.blender.org
Wed Oct 8 19:34:34 CEST 2014


Commit: 334b25a226739ee652c5b8ae9f1440b37a7164c0
Author: Antony Riakiotakis
Date:   Wed Oct 8 19:34:16 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB334b25a226739ee652c5b8ae9f1440b37a7164c0

* Manipulator Y 3D arrow moved and rotated correctly.
* Light manipulator doing undo now
* Scons should be fixed.

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/SConscript
M	source/blender/editors/interface/interface_generic_widgets.c
M	source/blender/editors/transform/transform_manipulator.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 3ece454..e2af928 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1011,5 +1011,7 @@ 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/SConscript b/source/blender/editors/interface/SConscript
index 303ab7f..beb2f09 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -28,6 +28,7 @@
 Import ('env')
 
 sources = env.Glob('*.c')
+sources += env.Glob('3d_widgets/*.c')
 
 incs = [
     '#/intern/guardedalloc',
@@ -44,6 +45,7 @@ incs = [
     # python button eval
     '../../python',
     '../../windowmanager',
+    '3d_widgets'
     ]
 
 defs = env['BF_GL_DEFINITIONS']
diff --git a/source/blender/editors/interface/interface_generic_widgets.c b/source/blender/editors/interface/interface_generic_widgets.c
index 86bca1a..f05bcdd 100644
--- a/source/blender/editors/interface/interface_generic_widgets.c
+++ b/source/blender/editors/interface/interface_generic_widgets.c
@@ -171,7 +171,7 @@ void UI_OT_lamp_position(struct wmOperatorType *ot)
 	ot->poll = lamp_position_poll;
 
 	/* flags */
-	ot->flag = OPTYPE_BLOCKING;
+	ot->flag = OPTYPE_BLOCKING | OPTYPE_UNDO;
 
 	/* properties */	
 }
@@ -338,14 +338,21 @@ typedef struct ArrowWidget {
 	float color[4];
 } ArrowWidget;
 
-static void widget_draw_intern(ArrowWidget *widget, bool select, bool highlight)
+static void widget_draw_intern(ArrowWidget *arrow, bool select, bool highlight)
 {
+	float rot[3][3];
+	float mat[4][4];
+	float up[3] = {0.0f, 0.0f, 1.0f};
 	GLuint buf[3];
 	if (!select)
 		glGenBuffers(3, buf);
 	else
 		glGenBuffers(2, buf);
 	
+	rotation_between_vecs_to_mat3(rot, up, arrow->direction);
+	copy_m4_m3(mat, rot);
+	copy_v3_v3(mat[3], arrow->origin);
+	
 	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);
@@ -378,11 +385,16 @@ static void widget_draw_intern(ArrowWidget *widget, bool select, bool highlight)
 	if (highlight)
 		glColor3f(1.0, 1.0, 0.0);
 	else 
-		glColor3fv(widget->color);
+		glColor3fv(arrow->color);
 
 	glEnable(GL_CULL_FACE);
 	glEnable(GL_DEPTH_TEST);
+	glPushMatrix();
+	glMultMatrixf(&mat[0][0]);	
+	
 	glDrawElements(GL_TRIANGLES, _WIDGET_nfaces_arrow * 3, GL_UNSIGNED_SHORT, NULL);
+
+	glPopMatrix();
 	glDisable(GL_DEPTH_TEST);
 	glDisable(GL_CULL_FACE);
 
@@ -416,6 +428,7 @@ static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UN
 
 wmWidget *WIDGET_arrow_new(int style, int (*handler)(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget))
 {
+	float dir_default[3] = {0.0f, 0.0f, 1.0f};
 	ArrowWidget *arrow;
 	
 	arrow = MEM_callocN(sizeof(ArrowWidget), "arrowwidget");
@@ -427,6 +440,7 @@ wmWidget *WIDGET_arrow_new(int style, int (*handler)(struct bContext *C, const s
 	arrow->widget.customdata = NULL;
 	
 	arrow->style = style;
+	copy_v3_v3(arrow->direction, dir_default);
 	
 	return (wmWidget *)arrow;
 }
@@ -437,3 +451,18 @@ 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;
+	
+	copy_v3_v3(arrow->direction, direction);
+	normalize_v3(arrow->direction);
+}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index a2aefb6..c7391d0 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -70,6 +70,7 @@
 #include "ED_screen.h"
 
 #include "UI_resources.h"
+#include "UI_interface.h"
 
 /* local module include */
 #include "transform.h"
@@ -1685,6 +1686,11 @@ void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C)
 	}
 }
 
+static void manipulator_unregister(wmWidgetGroup *wgroup, ManipulatorGroup *manipulator)
+{
+	WM_widget_unregister(wgroup, manipulator->translate_y);	
+}
+
 void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct bContext *C)
 {
 	ScrArea *sa = CTX_wm_area(C);
@@ -1696,6 +1702,8 @@ void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct b
 
 	int totsel;
 	
+	manipulator_unregister(wgroup, manipulator);
+	
 	v3d->twflag &= ~V3D_DRAW_MANIPULATOR;
 	
 	totsel = calc_manipulator_stats(C);
@@ -1737,11 +1745,14 @@ void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct b
 
 	test_manipulator_axis(C);
 	drawflags = rv3d->twdrawflag;    /* set in calc_manipulator_stats */	
-	
-	if (drawflags & MAN_TRANS_Y)
-		WM_widget_register(wgroup, manipulator->translate_y);
-	else
-		WM_widget_unregister(wgroup, manipulator->translate_y);	
+
+	if (v3d->twtype & V3D_MANIP_TRANSLATE) {
+		if (drawflags & MAN_TRANS_Y) {
+			WM_widget_register(wgroup, manipulator->translate_y);
+			WIDGET_arrow_set_origin(manipulator->translate_y, rv3d->twmat[3]);
+			WIDGET_arrow_set_direction(manipulator->translate_y, rv3d->twmat[1]);
+		}
+	}
 }




More information about the Bf-blender-cvs mailing list