[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23892] trunk/blender: shape key mirror tool, access from shapekey list buttons

Campbell Barton ideasman42 at gmail.com
Fri Oct 16 15:04:59 CEST 2009


Revision: 23892
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23892
Author:   campbellbarton
Date:     2009-10-16 15:04:59 +0200 (Fri, 16 Oct 2009)

Log Message:
-----------
shape key mirror tool, access from shapekey list buttons

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/buttons_data_mesh.py
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_shapekey.c

Modified: trunk/blender/release/scripts/ui/buttons_data_mesh.py
===================================================================
--- trunk/blender/release/scripts/ui/buttons_data_mesh.py	2009-10-16 12:08:47 UTC (rev 23891)
+++ trunk/blender/release/scripts/ui/buttons_data_mesh.py	2009-10-16 13:04:59 UTC (rev 23892)
@@ -125,6 +125,7 @@
 		subcol = col.column(align=True)
 		subcol.itemO("object.shape_key_add", icon='ICON_ZOOMIN', text="")
 		subcol.itemO("object.shape_key_remove", icon='ICON_ZOOMOUT', text="")
+		subcol.itemO("object.shape_key_mirror", icon='ICON_MOD_MIRROR', text="")
 
 		if kb:
 			col.itemS()

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h	2009-10-16 12:08:47 UTC (rev 23891)
+++ trunk/blender/source/blender/editors/object/object_intern.h	2009-10-16 13:04:59 UTC (rev 23892)
@@ -176,6 +176,7 @@
 void OBJECT_OT_shape_key_add(struct wmOperatorType *ot);
 void OBJECT_OT_shape_key_remove(struct wmOperatorType *ot);
 void OBJECT_OT_shape_key_clear(struct wmOperatorType *ot);
+void OBJECT_OT_shape_key_mirror(struct wmOperatorType *ot);
 
 /* object_group.c */
 void OBJECT_OT_group_add(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/object/object_ops.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_ops.c	2009-10-16 12:08:47 UTC (rev 23891)
+++ trunk/blender/source/blender/editors/object/object_ops.c	2009-10-16 13:04:59 UTC (rev 23892)
@@ -172,6 +172,7 @@
 	WM_operatortype_append(OBJECT_OT_shape_key_add);
 	WM_operatortype_append(OBJECT_OT_shape_key_remove);
 	WM_operatortype_append(OBJECT_OT_shape_key_clear);
+	WM_operatortype_append(OBJECT_OT_shape_key_mirror);
 
 	WM_operatortype_append(LATTICE_OT_select_all_toggle);
 	WM_operatortype_append(LATTICE_OT_make_regular);

Modified: trunk/blender/source/blender/editors/object/object_shapekey.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_shapekey.c	2009-10-16 12:08:47 UTC (rev 23891)
+++ trunk/blender/source/blender/editors/object/object_shapekey.c	2009-10-16 13:04:59 UTC (rev 23892)
@@ -70,6 +70,7 @@
 #include "BLO_sys_types.h" // for intptr_t support
 
 #include "ED_object.h"
+#include "ED_mesh.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -401,7 +402,7 @@
 
 /*********************** add shape key ***********************/
 
-void ED_object_shape_key_add(bContext *C, Scene *scene, Object *ob)
+static void ED_object_shape_key_add(bContext *C, Scene *scene, Object *ob)
 {
 	Key *key;
 
@@ -417,7 +418,7 @@
 
 /*********************** remove shape key ***********************/
 
-int ED_object_shape_key_remove(bContext *C, Object *ob)
+static int ED_object_shape_key_remove(bContext *C, Object *ob)
 {
 	Main *bmain= CTX_data_main(C);
 	KeyBlock *kb, *rkb;
@@ -480,6 +481,63 @@
 	return 1;
 }
 
+static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
+{
+	KeyBlock *kb;
+	Key *key;
+
+	key= ob_get_key(ob);
+	if(key==NULL)
+		return 0;
+	
+	kb= BLI_findlink(&key->block, ob->shapenr-1);
+
+	if(kb) {
+		int i1, i2;
+		float *fp1, *fp2;
+		float tvec[3];
+		char *tag_elem= MEM_callocN(sizeof(char) * kb->totelem, "shape_key_mirror");
+
+
+		if(ob->type==OB_MESH) {
+			Mesh *me= ob->data;
+			MVert *mv;
+
+			mesh_octree_table(ob, NULL, NULL, 's');
+
+			for(i1=0, mv=me->mvert; i1<me->totvert; i1++, mv++) {
+				i2= mesh_get_x_mirror_vert(ob, i1);
+				if(i2 != -1) {
+					if(tag_elem[i1]==0 && tag_elem[i2]==0) {
+						fp1= ((float *)kb->data) + i1*3;
+						fp2= ((float *)kb->data) + i2*3;
+
+						VECCOPY(tvec,	fp1);
+						VECCOPY(fp1,	fp2);
+						VECCOPY(fp2,	tvec);
+
+						/* flip x axis */
+						fp1[0] = -fp1[0];
+						fp2[0] = -fp2[0];
+					}
+					tag_elem[i1]= tag_elem[i2]= 1;
+				}
+
+			}
+
+			mesh_octree_table(ob, NULL, NULL, 'e');
+		}
+		/* todo, other types? */
+
+		MEM_freeN(tag_elem);
+	}
+	
+	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+
+	return 1;
+}
+
 /********************** shape key operators *********************/
 
 static int shape_key_poll(bContext *C)
@@ -572,3 +630,29 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+
+static int shape_key_mirror_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene= CTX_data_scene(C);
+	Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+
+	if(!ED_object_shape_key_mirror(C, scene, ob))
+		return OPERATOR_CANCELLED;
+
+	return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_shape_key_mirror(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Mirror Shape Key";
+	ot->idname= "OBJECT_OT_shape_key_mirror";
+
+	/* api callbacks */
+	ot->poll= shape_key_poll;
+	ot->exec= shape_key_mirror_exec;
+
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+





More information about the Bf-blender-cvs mailing list