[Bf-blender-cvs] [380a325] wiggly-widgets: Stubs for new facemap widget, fixes for facemaps.

Antony Riakiotakis noreply at git.blender.org
Wed Dec 17 18:08:46 CET 2014


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;




More information about the Bf-blender-cvs mailing list