[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24750] trunk/blender: * Re-implemented/ refactored 3D View hooks menu.

Matt Ebb matt at mke3.net
Sun Nov 22 07:20:56 CET 2009


Revision: 24750
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24750
Author:   broken
Date:     2009-11-22 07:20:56 +0100 (Sun, 22 Nov 2009)

Log Message:
-----------
* Re-implemented/refactored 3D View hooks menu.
Now shares the same operators as the modifier buttons, works context-sensitive, and uses Python menu too.

* Cleanups/tweaks in 3D View vertex group menu

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2009-11-22 06:19:30 UTC (rev 24749)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2009-11-22 06:20:56 UTC (rev 24750)
@@ -746,11 +746,42 @@
     def draw(self, context):
         layout = self.layout
         layout.operator_context = 'EXEC_AREA'
-        layout.items_enumO("object.hook_add", "type")
-        # layout.itemS()
-        # Other operators still need porting
+        layout.itemO("object.hook_add_newob")
+        layout.itemO("object.hook_add_selob")
+        
+        if [mod.type == 'HOOK' for mod in context.active_object.modifiers]:
+            layout.itemS()
+            layout.item_menu_enumO("object.hook_assign", "modifier")
+            layout.item_menu_enumO("object.hook_remove", "modifier")
+            layout.itemS()
+            layout.item_menu_enumO("object.hook_select", "modifier")
+            layout.item_menu_enumO("object.hook_reset", "modifier")
+            layout.item_menu_enumO("object.hook_recenter", "modifier")
 
 
+class VIEW3D_MT_vertex_group(bpy.types.Menu):
+    bl_label = "Vertex Groups"
+
+    def draw(self, context):
+        layout = self.layout
+        layout.operator_context = 'EXEC_AREA'
+        layout.item_booleanO("object.vertex_group_assign", "new", True, text="Assign to New Group")
+        
+        ob = context.active_object
+        if ob.mode == 'EDIT':
+            if ob.vertex_groups and ob.active_vertex_group:
+                layout.itemS()
+                layout.itemO("object.vertex_group_assign", text="Assign to Active Group")
+                layout.itemO("object.vertex_group_remove_from", text="Remove from Active Group")
+                layout.item_booleanO("object.vertex_group_remove_from", "all", True, text="Remove from All")
+                layout.itemS()
+        
+        if ob.vertex_groups and ob.active_vertex_group:
+            layout.item_menu_enumO("object.vertex_group_set_active", "group", text="Set Active Group")
+            layout.itemO("object.vertex_group_remove", text="Remove Active Group")
+            layout.item_booleanO("object.vertex_group_remove", "all", True, text="Remove All Groups")
+
+
 # ********** Sculpt menu **********
 
 
@@ -1062,6 +1093,7 @@
 
         layout.itemS()
 
+        layout.itemM("VIEW3D_MT_vertex_group")
         layout.itemM("VIEW3D_MT_hook")
 
 
@@ -1830,6 +1862,7 @@
 bpy.types.register(VIEW3D_MT_make_links)
 
 bpy.types.register(VIEW3D_MT_hook)
+bpy.types.register(VIEW3D_MT_vertex_group)
 
 bpy.types.register(VIEW3D_MT_sculpt) # Sculpt Menu
 

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-11-22 06:19:30 UTC (rev 24749)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-11-22 06:20:56 UTC (rev 24750)
@@ -297,9 +297,6 @@
 	
 	WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, 0, KKEY);
 
-	// TODO: this should probably be made to a menu instead...
-	WM_keymap_add_item(keymap, "OBJECT_OT_vertex_group_menu", GKEY, KM_PRESS, KM_CTRL, 0);
-	
 	/* menus */
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_specials", WKEY, KM_PRESS, 0, 0);
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_faces", FKEY, KM_PRESS, KM_CTRL, 0);
@@ -307,7 +304,8 @@
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_vertices", VKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_add_menu(keymap, "VIEW3D_MT_uv_map", UKEY, KM_PRESS, 0, 0);
-
+	WM_keymap_add_menu(keymap, "VIEW3D_MT_vertex_group", GKEY, KM_PRESS, KM_CTRL, 0);
+	
 	ED_object_generic_keymap(keyconf, keymap, TRUE);
 }
 

Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c	2009-11-22 06:19:30 UTC (rev 24749)
+++ trunk/blender/source/blender/editors/object/object_hook.c	2009-11-22 06:20:56 UTC (rev 24750)
@@ -35,6 +35,7 @@
 #include "BLI_listbase.h"
 #include "BLI_string.h"
 
+#include "DNA_action_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_mesh_types.h"
@@ -45,12 +46,15 @@
 #include "DNA_view3d_types.h"
 #include "DNA_windowmanager_types.h"
 
+#include "BKE_action.h"
 #include "BKE_context.h"
 #include "BKE_customdata.h"
 #include "BKE_depsgraph.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
 
 #include "RNA_define.h"
 #include "RNA_access.h"
@@ -59,14 +63,16 @@
 #include "ED_mesh.h"
 #include "ED_object.h"
 #include "ED_view3d.h"
+#include "ED_screen.h"
 
 #include "WM_types.h"
 #include "WM_api.h"
 
+#include "UI_interface.h"
+#include "UI_resources.h"
+
 #include "object_intern.h"
 
-/* XXX operators for this are not implemented yet */
-
 static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float *cent)
 {
 	EditVert *eve;
@@ -286,7 +292,7 @@
 	return totvert;
 }
 
-int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
 {
 	*indexar= NULL;
 	*tot= 0;
@@ -368,7 +374,7 @@
 	}
 }
 
-void object_hook_select(Object *ob, HookModifierData *hmd) 
+static void object_hook_select(Object *ob, HookModifierData *hmd) 
 {
 	if (hmd->indexar == NULL)
 		return;
@@ -379,281 +385,440 @@
 	else if(ob->type==OB_SURF) select_editcurve_hook(ob, hmd);
 }
 
+static Object *add_hook_object_new(Scene *scene, Object *obedit)
+{
+	Base *base, *basedit;
+	Object *ob;
 
-void add_hook(Scene *scene, View3D *v3d, int mode)
+	ob= add_object(scene, OB_EMPTY);
+	
+	basedit = object_in_scene(obedit, scene);
+	base = object_in_scene(ob, scene);
+	base->lay = ob->lay = obedit->lay;
+	
+	/* icky, add_object sets new base as active.
+	 * so set it back to the original edit object */
+	scene->basact = basedit;
+
+	return ob;
+}
+
+
+static void add_hook_object(Scene *scene, Object *obedit, Object *ob, int mode)
 {
-	ModifierData *md = NULL;
+	ModifierData *md=NULL;
 	HookModifierData *hmd = NULL;
-	Object *ob=NULL;
-	Object *obedit= scene->obedit;  // XXX get from context
+	float cent[3];
+	int tot, ok, *indexar;
+	char name[32];
 	
-	if(obedit==NULL) return;
+	ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
 	
-	/* preconditions */
-	if(mode==2) { /* selected object */
-		Base *base;
-		for(base= FIRSTBASE; base; base= base->next) {
-			if(TESTBASELIB(v3d, base)) {
-				if(base!=BASACT) {
-					ob= base->object;
-					break;
-				}
-			}
-		}
-		if(ob==NULL) {
-			// XXX error("Requires selected Object");
-			return;
-		}
-	}
-	else if(mode!=1) {
-		int maxlen=0, a, nr;
-		char *cp;
+	if (!ok) return;	// XXX error("Requires selected vertices or active Vertex Group");
+	
+	if (mode==OBJECT_ADDHOOK_NEWOB && !ob) {
 		
-		/* make pupmenu with hooks */
-		for(md=obedit->modifiers.first; md; md= md->next) {
-			if (md->type==eModifierType_Hook) 
-				maxlen+=32;
-		}
+		ob = add_hook_object_new(scene, obedit);
 		
-		if(maxlen==0) {
-			// XXX error("Object has no hooks yet");
-			return;
-		}
-		
-		cp= MEM_callocN(maxlen+32, "temp string");
-		if(mode==3) strcpy(cp, "Remove %t|");
-		else if(mode==4) strcpy(cp, "Reassign %t|");
-		else if(mode==5) strcpy(cp, "Select %t|");
-		else if(mode==6) strcpy(cp, "Clear Offset %t|");
-		
-		for(md=obedit->modifiers.first; md; md= md->next) {
-			if (md->type==eModifierType_Hook) {
-				strcat(cp, md->name);
-				strcat(cp, " |");
-			}
-		}
-		
-		nr= 0; // XXX pupmenu(cp);
-		MEM_freeN(cp);
-		
-		if(nr<1) return;
-		
-		a= 1;
-		for(md=obedit->modifiers.first; md; md=md->next) {
-			if (md->type==eModifierType_Hook) {
-				if(a==nr) break;
-				a++;
-			}
-		}
-		
-		hmd = (HookModifierData*) md;
-		ob= hmd->object;
+		/* transform cent to global coords for loc */
+		mul_v3_m4v3(ob->loc, obedit->obmat, cent);
 	}
+	
+	md = obedit->modifiers.first;
+	while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
+		md = md->next;
+	}
+	
+	hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
+	BLI_insertlinkbefore(&obedit->modifiers, md, hmd);
+	sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);
+	modifier_unique_name(&obedit->modifiers, (ModifierData*)hmd);
+	
+	hmd->object= ob;
+	hmd->indexar= indexar;
+	copy_v3_v3(hmd->cent, cent);
+	hmd->totindex= tot;
+	BLI_strncpy(hmd->name, name, 32);
+	
+	/* matrix calculus */
+	/* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
+	/*        (parentinv         )                          */
+	where_is_object(scene, ob);
+	
+	invert_m4_m4(ob->imat, ob->obmat);
+	/* apparently this call goes from right to left... */
+	mul_serie_m4(hmd->parentinv, ob->imat, obedit->obmat, NULL, 
+				 NULL, NULL, NULL, NULL, NULL);
+	
+	DAG_scene_sort(scene);
+}
 
-	/* do it, new hooks or reassign */
-	if(mode==1 || mode==2 || mode==4) {
-		float cent[3];
-		int tot, ok, *indexar;
-		char name[32];
-		
-		ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
-		
-		if(ok==0) {
-			// XXX error("Requires selected vertices or active Vertex Group");
+static int object_add_hook_selob_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene= CTX_data_scene(C);
+	Object *obedit = CTX_data_edit_object(C);
+	Object *obsel=NULL;
+	
+	CTX_DATA_BEGIN(C, Object*, ob, selected_objects)
+	{
+		if (ob != obedit) {
+			obsel = ob;
+			break;
 		}
-		else {
-			
-			if(mode==1) {
-				Base *base= BASACT, *newbase;
-				
-				ob= add_object(scene, OB_EMPTY);
-				/* set layers OK */
-				newbase= BASACT;
-				newbase->lay= base->lay;
-				ob->lay= newbase->lay;
-				
-				/* transform cent to global coords for loc */
-				mul_v3_m4v3(ob->loc, obedit->obmat, cent);
-				
-				/* restore, add_object sets active */
-				BASACT= base;
-			}
-			/* if mode is 2 or 4, ob has been set */
-			
-			/* new hook */
-			if(mode==1 || mode==2) {
-				ModifierData *md = obedit->modifiers.first;
-				
-				while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
-					md = md->next;
-				}
-				
-				hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
-				BLI_insertlinkbefore(&obedit->modifiers, md, hmd);
-				sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list