Commit: 37a7421e10afcf2b1394210d5c6afacf224fc311
Author: Antony Riakiotakis
Date:   Fri Oct 3 17:11:01 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB37a7421e10afcf2b1394210d5c6afacf224fc311

Lamp widget:

* Make a lamp widget design for the active lamp.
* Fix some handler errors for widgets + autoupdate for different widget
handles.

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

M       source/blender/editors/include/UI_interface.h
M       source/blender/editors/interface/interface_generic_widgets.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/windowmanager/WM_types.h
M       source/blender/windowmanager/intern/wm_event_system.c
M       source/blender/windowmanager/intern/wm_widgets.c
M       source/blender/windowmanager/wm_event_system.h

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

diff --git a/source/blender/editors/include/UI_interface.h 
b/source/blender/editors/include/UI_interface.h
index f262e1b..ee9adbb 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -78,6 +78,7 @@ struct bNodeSocket;
 struct wmDropBox;
 struct wmDrag;
 struct wmEvent;
+struct wmWidget;
 
 typedef struct uiBut uiBut;
 typedef struct uiBlock uiBlock;
diff --git a/source/blender/editors/interface/interface_generic_widgets.c 
b/source/blender/editors/interface/interface_generic_widgets.c
index f98102f..a19dc06 100644
--- a/source/blender/editors/interface/interface_generic_widgets.c
+++ b/source/blender/editors/interface/interface_generic_widgets.c
@@ -34,9 +34,11 @@
 #include "DNA_object_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_windowmanager_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_math_matrix.h"
+#include "BLI_math.h"
 
 #include "BKE_context.h"
 
@@ -45,59 +47,151 @@
 #include "WM_types.h"
 
 #include "GL/glew.h"
+#include "GPU_select.h"
+
+#include "BIF_glutil.h"
 
 #include "UI_interface.h"
 
 int WIDGET_lamp_handler(struct bContext *C, const struct wmEvent *event, 
struct wmWidget *widget, int active)
-{
-       return 0;
+{      
+       return OPERATOR_FINISHED;
 }
 
-void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget 
*widget, int selectionbase)
-{
-       
-}
-
-void WIDGET_lamp_draw(const struct bContext *C, struct wmWidget *widget)
+static void intern_lamp_draw(const struct bContext *C, int selectoffset, 
wmWidget *widget)
 {
        ARegion *ar = CTX_wm_region(C);
        RegionView3D *rv3d = ar->regiondata;
+       float size = 0.30f;
+       int highlight = widget->active_handle;
 
        Object *ob = CTX_data_active_object(C); 
        Lamp *la = ob->data;
 
        float widgetmat[4][4];  
 
-       glMatrixMode(GL_MODELVIEW);
-       glPushMatrix();
-
        copy_m4_m4(widgetmat, ob->obmat);       
        normalize_m4(widgetmat);
-       mul_mat3_m4_fl(widgetmat, ED_view3d_pixel_size(rv3d, widgetmat[3]) * 
U.tw_size);        
-       
+       glPushMatrix();
        glMultMatrixf(&widgetmat[0][0]);
-       
-       glDisable(GL_DEPTH_TEST);
+
        glDisable(GL_CULL_FACE);
+       glEnable(GL_BLEND);
 
+       if (selectoffset != -1)
+               GPU_select_load_id(selectoffset + 1);
        glShadeModel(GL_SMOOTH);
-       glBegin(GL_TRIANGLES);
-       glColor3f(1.0, 0.0, 0.0);
-       glVertex3f(0.0, 0.0, 1.0);
-       glColor3f(0.0, 1.0, 0.0);
-       glVertex3f(-1.0, 0.0, -1.0);
-       glColor3f(0.0, 0.0, 1.0);
-       glVertex3f(1.0, 0.0, -1.0);
+       glBegin(GL_LINES);
+       
+       if (highlight == 1)
+               glColor4f(1.0, 1.0, 0.4, 1.0);
+       else
+               glColor4f(1.0, 1.0, 1.0, 1.0);
+       glVertex3f(0.0, 0.0, 0.0);
+       if (highlight == 1)
+               glColor4f(1.0, 1.0, 2.0, 1.0);
+       else
+               glColor4f(0.0, 0.0, 0.0, 0.0);
+       glVertex3f(0.0, 0.0, -la->dist);
        glEnd();        
+
+       glDisable(GL_BLEND);    
        
        glPopMatrix();
+       mul_mat3_m4_fl(widgetmat, ED_view3d_pixel_size(rv3d, widgetmat[3]) * 
U.tw_size);        
+       
+       glPushMatrix();
+       glMultMatrixf(&widgetmat[0][0]);
+
+       if (highlight == 2)
+               glColor4f(1.0, 1.0, 1.0, 1.0);
+       else
+               glColor4f(0.8, 0.8, 0.8, 1.0);
+
+       if (selectoffset != -1)
+               GPU_select_load_id(selectoffset + 2);
+       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+       glBegin(GL_QUAD_STRIP);
+       glVertex3f(size, size, 3.0 * size);
+       glVertex3f(-size, size, 3.0 * size);
+       glVertex3f(size, -size, 3.0 * size);
+       glVertex3f(-size, -size, 3.0 * size);
+       glVertex3f(size, -size, 0.0);
+       glVertex3f(-size, -size, 0.0);
+       glVertex3f(size, size, 0.0);
+       glVertex3f(-size, size, 0.0);
+       glVertex3f(size, size, 3.0 * size);
+       glVertex3f(-size, size, 3.0 * size);
+       glEnd();
+       
+       glPushMatrix();
+       glTranslatef(size, 0.0f, 0.0f); 
+       glRotatef(-90.0f * la->spotsize / M_PI, 0.0f, 1.0f, 0.0f);
+       
+       glBegin(GL_QUADS);
+       glVertex3f(0.0f, -size, 0.0);
+       glVertex3f(0.0f, size, 0.0);
+       glVertex3f(0.0f, size, -size);
+       glVertex3f(0.0f, -size, -size); 
+       glEnd();
+       glPopMatrix();  
+
+       glPushMatrix();
+       glTranslatef(-size, 0.0f, 0.0f);
+       glRotatef(90.0f * la->spotsize / M_PI, 0.0f, 1.0f, 0.0f);
+       
+       glBegin(GL_QUADS);
+       glVertex3f(0.0f, -size, 0.0);
+       glVertex3f(0.0f, size, 0.0);
+       glVertex3f(0.0f, size, -size);
+       glVertex3f(0.0f, -size, -size); 
+       glEnd();
+       glPopMatrix();  
+
+       glPushMatrix();
+       glTranslatef(0.0f, size, 0.0f);
+       glRotatef(90.0f * la->spotsize / M_PI, 1.0f, 0.0f, 0.0f);
+       
+       glBegin(GL_QUADS);
+       glVertex3f(-size, 0.0f, 0.0f);
+       glVertex3f(size, 0.0f, 0.0f);
+       glVertex3f(size, 0.0f, -size);
+       glVertex3f(-size, 0.0f, -size); 
+       glEnd();
+       glPopMatrix();  
+
+       glPushMatrix();
+       glTranslatef(0.0f, -size, 0.0f);
+       glRotatef(-90.0f * la->spotsize / M_PI, 1.0f, 0.0f, 0.0f);
+       
+       glBegin(GL_QUADS);
+       glVertex3f(-size, 0.0f, 0.0f);
+       glVertex3f(size, 0.0f, 0.0f);
+       glVertex3f(size, 0.0f, -size);
+       glVertex3f(-size, 0.0f, -size); 
+       glEnd();
+       glPopMatrix();  
+       
+       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+       
+       glPopMatrix();  
+}
+
+void WIDGET_lamp_render_3d_intersect(const struct bContext *C, struct wmWidget 
*widget, int selectionbase)
+{
+       intern_lamp_draw(C, selectionbase, widget);     
+}
+
+void WIDGET_lamp_draw(const struct bContext *C, wmWidget *widget)
+{
+       intern_lamp_draw(C, -1, widget);
 }
 
 bool WIDGET_lamp_poll(const struct bContext *C, struct wmWidget 
*UNUSED(widget))
 {
        Object *ob = CTX_data_active_object(C);
        
-       if (ob->type == OB_LAMP) {
+       if (ob && ob->type == OB_LAMP) {
                Lamp *la = ob->data;
                return (la->type == LA_SPOT);      
        }
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 7e71230..e0c166e 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -695,23 +695,19 @@ static void view3d_widgets(void)
 {
        wmWidget *widget = NULL;
        struct wmWidgetMap *wmap = WM_widgetmap_find("View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW, true);
-       int *realtimeflags = MEM_mallocN(sizeof(int), 
"manipulator_display_flags");
-       *realtimeflags = 0;
-       
        widget = WM_widget_new(WIDGET_manipulator_poll, 
                               WIDGET_manipulator_draw, 
                               WIDGET_manipulator_render_3d_intersect, 
                               NULL, 
-                              WIDGET_manipulator_handler, realtimeflags, true);
+                              WIDGET_manipulator_handler, NULL, false);
        
        WM_widget_register(wmap, widget);
        
-       realtimeflags = MEM_mallocN(sizeof(int), "manipulator_display_flags");
        widget = WM_widget_new(WIDGET_lamp_poll, 
                               WIDGET_lamp_draw,
-                              WIDGET_manipulator_render_3d_intersect, 
+                              WIDGET_lamp_render_3d_intersect, 
                               NULL, 
-                              WIDGET_lamp_handler, realtimeflags, true);       
+                              WIDGET_lamp_handler, NULL, false);       
        WM_widget_register(wmap, widget);
 }
 
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 49d9e8b..00477b4 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1629,6 +1629,27 @@ static void draw_manipulator_rotate_cyl(
 /* main call, does calc centers & orientation too */
 static int drawflags = 0xFFFF;       // only for the calls below, belongs in 
scene...?
 
+static int manipulator_flags_from_active(int active)
+{
+       int val;
+       
+       if (active != -1) {
+               if (active == MAN_SEL_TRANS_C) {
+                       val = MAN_TRANS_C;
+               }
+               else if (active == MAN_SEL_SCALE_C) {
+                       val = MAN_SCALE_C;
+               }
+               else {
+                       val = 1 << active;
+               }
+       }
+       else 
+               val = 0;
+
+       return val;
+}
+
 void WIDGET_manipulator_draw(const bContext *C, wmWidget *widget)
 {
        ScrArea *sa = CTX_wm_area(C);
@@ -1640,7 +1661,7 @@ void WIDGET_manipulator_draw(const bContext *C, wmWidget 
*widget)
        int highlight = 0;
        
        if (widget->flag & WM_WIDGET_HIGHLIGHT)
-               highlight = *((int *)widget->customdata);
+               highlight = 
manipulator_flags_from_active(widget->active_handle);
        
        v3d->twflag &= ~V3D_DRAW_MANIPULATOR;
        
@@ -1744,38 +1765,19 @@ void WIDGET_manipulator_render_3d_intersect(const 
bContext *C, wmWidget *UNUSED(
 }
 
 /* return 0; nothing happened */
-int WIDGET_manipulator_handler(bContext *C, const struct wmEvent *event, 
wmWidget *widget, int active)
+int WIDGET_manipulator_handler(bContext *C, const struct wmEvent *event, 
wmWidget *UNUSED(widget), int active)
 {
        ScrArea *sa = CTX_wm_area(C);
        View3D *v3d = sa->spacedata.first;
-       ARegion *ar = CTX_wm_region(C);
        int constraint_axis[3] = {0, 0, 0};
        int val;
        int shift = event->shift;
-       int *prevval = ((int *)widget->customdata);
 
        struct IDProperty *properties = NULL;   /* operator properties, 
assigned to ptr->data and can be written to a file */
        struct PointerRNA *ptr = NULL;                  /* rna pointer to 
access properties */
-               
-       if (active != -1) {
-               if (active == MAN_SEL_TRANS_C) {
-                       val = MAN_TRANS_C;
-               }
-               else if (active == MAN_SEL_SCALE_C) {
-                       val = MAN_SCALE_C;
-               }
-               else {
-                       val = 1 << active;
-               }
-       }
-       else 
-               val = 0;
-       
-       if (*prevval != val) {
-               *prevval = val;
-               ED_region_tag_redraw(ar);
-       }
        
+       val = manipulator_flags_from_active(active);
+               
        if (!((v3d->twflag & V3D_USE_MANIPULATOR) && (v3d->twflag & 
V3D_DRAW_MANIPULATOR)) ||
            !(event->keymodifier == 0 || event->keymodifier == KM_SHIFT) || 
                !((event->val == KM_PRESS) && (event->type == LEFTMOUSE)))
@@ -1784,11 +1786,8 @@ int WIDGET_manipulator_handler(bContext *C, const struct 
wmEvent *event, wmWidge
        }
        
        if (val) {
-               // drawflags still global, for drawing call above
-               drawflags = val;//manipulator_selectbuf(sa, ar, event->mval, 
0.2f * (float)U.tw_hotspot);
-
-               if (drawflags & MAN_TRANS_C) {
-                       switch (drawflags) {
+               if (val & MAN_TRANS_C) {
+                       switch (val) {
                                case MAN_TRANS_C:
                                        break;
                                case MAN_TRANS_X:
@@ -1824,8 +1823,8 @@ int WIDGET_manipulator_handler(bContext *C, const struct 
wmEvent *event, wmWidge
                        WM_operator_name_call(C, "TRANSFORM_OT_translate", 
WM_OP_INVOKE_DEFAULT, ptr);
                        //wm_operator_invoke(C, 
WM_operatortype_find("TRANSFORM_OT_translate", 0), event, op->ptr, NULL, false);
                }
-               else if (drawflags & MAN_SCALE_C) {
-                       switch (drawflags) {
+               else if (val & MAN_SCALE_C) {
+                       switch (val) {
                                case MAN_SCALE_X:
                                        if (shift) {
                                                

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to