[Bf-blender-cvs] [f9cedb4] wiggly-widgets: Facemap widgets:

Antony Riakiotakis noreply at git.blender.org
Mon Dec 22 11:28:56 CET 2014


Commit: f9cedb48965fa71781290a1c632a569ea4cccdf8
Author: Antony Riakiotakis
Date:   Mon Dec 22 11:28:41 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBf9cedb48965fa71781290a1c632a569ea4cccdf8

Facemap widgets:

* Only draw on mouse over
* Fix crash with highlighted widgets.

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

M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_generic_widgets.c
M	source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 062fd7b..fdd993d 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -808,6 +808,7 @@ static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct w
 	Object *ob = CTX_data_active_object(C);
 	wmWidget *widget;
 	Object *armature;
+	PointerRNA famapptr;
 	ModifierData *md;
 	VirtualModifierData virtualModifierData;
 	int index = 0;
@@ -830,8 +831,10 @@ static void WIDGETGROUP_armature_facemap_draw(const struct bContext *C, struct w
 	for (; fmap; fmap = fmap->next, index++) {
 		if (BKE_pose_channel_find_name(armature->pose, fmap->name)) {
 			widget = WIDGET_facemap_new(wgroup, 0, ob, index);
+			RNA_pointer_create(&ob->id, &RNA_FaceMap, fmap, &famapptr);
+			WM_widget_property(widget, FACEMAP_SLOT_FACEMAP, &famapptr, "name");
 			WIDGET_facemap_set_color(widget, color_shape);
-			
+			WM_widget_set_draw_on_hover_only(widget, true);
 		}
 	}
 }
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7815d36..abd9260 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -532,6 +532,10 @@ enum {
 	RECT_TRANSFORM_SLOT_SCALE = 1
 };
 
+enum {
+	FACEMAP_SLOT_FACEMAP = 0,
+};
+
 struct wmWidget *WIDGET_arrow_new(struct wmWidgetGroup *wgroup, int style);
 void WIDGET_arrow_set_color(struct wmWidget *widget, float color[4]);
 void WIDGET_arrow_set_direction(struct wmWidget *widget, float direction[3]);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 5a66bad..7f48acc 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -1075,6 +1075,13 @@ static void widget_facemap_draw(struct wmWidget *widget, const struct bContext *
 	glPopMatrix();
 }
 
+static void widget_facemap_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase)
+{
+	GPU_select_load_id(selectionbase);
+	widget_facemap_draw(widget, C);
+}
+
+
 void WIDGET_facemap_set_color(struct wmWidget *widget, float color[4])
 {
 	FacemapWidget *fmap_widget = (FacemapWidget *)widget;
@@ -1089,7 +1096,7 @@ struct wmWidget *WIDGET_facemap_new(struct wmWidgetGroup *wgroup, int style, str
 //	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.render_3d_intersection = widget_facemap_render_3d_intersect;
 	fmap_widget->ob = ob;
 	fmap_widget->facemap = facemap;
 	fmap_widget->style = style;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 4afeedf..08ac745 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -305,6 +305,7 @@ void WM_widgets_draw(const bContext *C, wmWidgetMap *wmap)
 					if (widget_iter->flag & WM_WIDGET_HIGHLIGHT) {
 						highlighted = widget_iter;
 						BLI_remlink(&wgroup->widgets, widget_iter);
+						widget_iter->next = widget_iter->prev = NULL;
 					}
 					else {
 						wm_widget_delete(&wgroup->widgets, widget_iter);
@@ -325,6 +326,7 @@ void WM_widgets_draw(const bContext *C, wmWidgetMap *wmap)
 							widget_iter->highlighted_part = highlighted->highlighted_part;
 							wm_widget_delete(&wgroup->widgets, highlighted);
 							highlighted = NULL;
+							break;
 						}
 					}
 				}




More information about the Bf-blender-cvs mailing list