Commit: 380a32581fdaf9a834393c8a3992e6cd292dd0f0
Author: Antony Riakiotakis
Date:   Wed Dec 17 18:08:11 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB380a32581fdaf9a834393c8a3992e6cd292dd0f0

Stubs for new facemap widget, fixes for facemaps.

Move/remove facemap not working well (probably was never working but by
displaying them has actually made the issue apparent)

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

M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/object/object_fmap.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/space_view3d/view3d_intern.h
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index c606525..a629504 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -305,6 +305,8 @@ void ED_view3d_check_mats_rv3d(struct RegionView3D *rv3d);
 #endif
 int ED_view3d_scene_layer_set(int lay, const int *values, int *active);
 
+void ED_draw_object_facemap(struct Scene *scene, struct Object *ob, int 
facemap);
+
 bool ED_view3d_context_activate(struct bContext *C);
 void ED_view3d_draw_offscreen_init(struct Scene *scene, struct View3D *v3d);
 void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct 
ARegion *ar,
diff --git a/source/blender/editors/object/object_fmap.c 
b/source/blender/editors/object/object_fmap.c
index ce76b9e..fb36ae9 100644
--- a/source/blender/editors/object/object_fmap.c
+++ b/source/blender/editors/object/object_fmap.c
@@ -218,7 +218,7 @@ static void object_fmap_swap_object_mode(Object *ob, int 
num1, int num2)
        if (ob->type == OB_MESH) {
                Mesh *me = ob->data;
                
-               if (me->mface) {
+               if (CustomData_has_layer(&me->pdata, CD_FACEMAP)) {
                        int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
                        int i;
                        
@@ -283,7 +283,7 @@ static void object_fmap_remove_object_mode(Object *ob, 
bFaceMap *fmap)
        if (ob->type == OB_MESH) {
                Mesh *me = ob->data;
                
-               if (me->mface) {
+               if (CustomData_has_layer(&me->pdata, CD_FACEMAP)) {
                        int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
                        int i;
                        
@@ -605,13 +605,14 @@ static int face_map_move_exec(bContext *C, wmOperator *op)
        Object *ob = ED_object_context(C);
        bFaceMap *fmap;
        int dir = RNA_enum_get(op->ptr, "direction");
-       int pos1, pos2 = -1;
+       int pos1, pos2 = -1, count;
 
        fmap = BLI_findlink(&ob->fmaps, ob->actfmap - 1);
        if (!fmap) {
                return OPERATOR_CANCELLED;
        }
 
+       count = BLI_listbase_count(&ob->fmaps);
        pos1 = BLI_findindex(&ob->fmaps, fmap);
        
        if (dir == 1) { /*up*/
@@ -620,6 +621,9 @@ static int face_map_move_exec(bContext *C, wmOperator *op)
                if (prev) {
                        pos2 = pos1 - 1;
                }
+               else {
+                       pos2 = count - 1;
+               }
                
                BLI_remlink(&ob->fmaps, fmap);
                BLI_insertlinkbefore(&ob->fmaps, prev, fmap);
@@ -630,6 +634,9 @@ static int face_map_move_exec(bContext *C, wmOperator *op)
                if (next) {
                        pos2 = pos1 + 1;
                }
+               else {
+                       pos2 = 0;
+               }
                
                BLI_remlink(&ob->fmaps, fmap);
                BLI_insertlinkafter(&ob->fmaps, next, fmap);
@@ -638,6 +645,8 @@ static int face_map_move_exec(bContext *C, wmOperator *op)
        /* iterate through mesh and substitute the indices as necessary */
        object_facemap_swap(ob, pos2, pos1);
        
+       ob->actfmap = pos2 +1;
+       
        DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP, ob);
 
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index e842277..db9fe51 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4015,7 +4015,7 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, 
View3D *v3d, RegionView3
                        GPU_end_object_materials();
 
                        if (ob->fmaps.first)
-                               draw_object_facemap(scene, ob, ob->actfmap - 1);
+                               ED_draw_object_facemap(scene, ob, ob->actfmap - 
1);
                        
                        if (me->totvert == 0) retval = true;
                }
@@ -8185,7 +8185,7 @@ static void draw_object_mesh_instance(Scene *scene, 
View3D *v3d, RegionView3D *r
        if (dm) dm->release(dm);
 }
 
-void draw_object_facemap(Scene *scene, struct Object *ob, int facemap)
+void ED_draw_object_facemap(Scene *scene, struct Object *ob, int facemap)
 {
        DerivedMesh *dm = NULL;
        
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index ec63e6c..7724014 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -776,13 +776,53 @@ static void WIDGETGROUP_shapekey_draw(const struct 
bContext *C, struct wmWidgetG
 }
 #endif
 
+static int WIDGETGROUP_armature_facemap_poll(const struct bContext *C, struct 
wmWidgetGroupType *UNUSED(wgrouptype))
+{
+       Object *ob = CTX_data_active_object(C);
+
+       if (ob && ob->type == OB_MESH) {
+               Key *key = BKE_key_from_object(ob);
+               KeyBlock *kb;
+       
+               if (key == NULL)
+                       return false;
+               
+               kb = BLI_findlink(&key->block, ob->shapenr - 1);
+               
+               if (kb)
+                       return true;
+       }
+       return false;
+}
+
+static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct 
wmWidgetGroup *wgroup)
+{
+       float color_shape[4] = {1.0f, 0.3f, 0.0f, 1.0f};
+       Object *ob = CTX_data_active_object(C);
+       Key *key = BKE_key_from_object(ob);
+       KeyBlock *kb = BLI_findlink(&key->block, ob->shapenr - 1);
+       wmWidget *widget;
+       PointerRNA shapeptr;
+       float dir[3];
+
+       widget = WIDGET_arrow_new(wgroup, WIDGET_ARROW_STYLE_NORMAL);
+       WM_widget_set_3d_scale(widget, false);
+       WIDGET_arrow_set_color(widget, color_shape);
+       RNA_pointer_create(&key->id, &RNA_ShapeKey, kb, &shapeptr);
+       WM_widget_set_origin(widget, ob->obmat[3]);
+       WM_widget_property(widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &shapeptr, 
"value");
+       negate_v3_v3(dir, ob->obmat[2]);
+       WIDGET_arrow_set_direction(widget, dir);
+}
+
+
 static void view3d_widgets(void)
 {
        WM_widgetmaptype_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true, 
true);
        
        WM_widgetgrouptype_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_draw, 
NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
        WM_widgetgrouptype_new(WIDGETGROUP_camera_poll, 
WIDGETGROUP_camera_draw, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
-//     WM_widgetgrouptype_new(WIDGETGROUP_shapekey_poll, 
WIDGETGROUP_shapekey_draw, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
+       WM_widgetgrouptype_new(WIDGETGROUP_armature_facemap_poll, 
WIDGETGROUP_armature_facemap_draw, NULL, "View3D", SPACE_VIEW3D, 
RGN_TYPE_WINDOW, true);
 
 #if 0
        wgroup_manipulator = WM_widgetgrouptype_new(
diff --git a/source/blender/editors/space_view3d/view3d_intern.h 
b/source/blender/editors/space_view3d/view3d_intern.h
index fbc701a..d3a9f5c 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -136,7 +136,6 @@ void draw_motion_paths_cleanup(View3D *v3d);
 void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, 
const short dflag);
 bool draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, const 
char dt);
 void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, 
struct Object *ob, const char dt, int outline);
-void draw_object_facemap(Scene *scene, struct Object *ob, int UNUSED_facemap);
 void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, 
struct Object *ob);
 void drawaxes(float size, char drawtype);
 
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index e7efae5..45176ae 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -74,6 +74,7 @@ struct ImageFormatData;
 struct ARegion;
 struct wmNDOFMotionData;
 struct Main;
+struct Object;
 
 typedef struct wmJob wmJob;
 
@@ -543,6 +544,8 @@ void WIDGET_dial_set_direction(struct wmWidget *widget, 
float direction[3]);
 
 struct wmWidget *WIDGET_rect_transform_new(struct wmWidgetGroup *wgroup, int 
style, float width, float height);
 
+struct wmWidget *WIDGET_facemap_new(struct wmWidgetGroup *wgroup, int style, 
struct Object *ob, int facemap);
+
 #ifdef WITH_INPUT_IME
 bool        WM_event_is_ime_switch(const struct wmEvent *event);
 #endif
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 4e89c56..0bb50a7 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -1055,6 +1055,46 @@ struct wmWidget *WIDGET_rect_transform_new(struct 
wmWidgetGroup *wgroup, int sty
        return (wmWidget *)cage;
 }
 
+/********* Facemap widget ************/
+
+typedef struct FacemapWidget {
+       wmWidget widget;
+       Object *ob;
+       int facemap;
+       int style;
+} FacemapWidget;
+
+
+static void widget_facemap_draw(struct wmWidget *widget, const struct bContext 
*C)
+{
+       FacemapWidget *fmap_widget = (FacemapWidget *)widget;
+       glPushMatrix();
+       glMultMatrixf(&fmap_widget->ob->obmat[0][0]);
+       ED_draw_object_facemap(CTX_data_scene(C), fmap_widget->ob, 
fmap_widget->facemap);
+       glPopMatrix();
+}
+
+
+struct wmWidget *WIDGET_facemap_new(struct wmWidgetGroup *wgroup, int style, 
struct Object *ob, int facemap)
+{
+       FacemapWidget *fmap_widget = MEM_callocN(sizeof(RectTransformWidget), 
"CageWidget");
+
+       fmap_widget->widget.draw = widget_facemap_draw;
+//     fmap_widget->widget.invoke = NULL;
+//     fmap_widget->widget.bind_to_prop = NULL;
+//     fmap_widget->widget.handler = NULL;
+       fmap_widget->widget.render_3d_intersection = NULL;
+       fmap_widget->widget.max_prop = 2;
+       fmap_widget->ob = ob;
+       fmap_widget->facemap = facemap;
+       fmap_widget->style = style;
+       
+       wm_widget_register(wgroup, &fmap_widget->widget);
+       
+       return (wmWidget *)fmap_widget;
+}
+
+
 void fix_linking_widget_lib(void)
 {
        (void) 0;

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

Reply via email to