[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