[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49866] trunk/blender: add hook now has option to add to active bone (mango request).

Campbell Barton ideasman42 at gmail.com
Mon Aug 13 10:54:34 CEST 2012


Revision: 49866
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49866
Author:   campbellbarton
Date:     2012-08-13 08:54:33 +0000 (Mon, 13 Aug 2012)
Log Message:
-----------
add hook now has option to add to active bone (mango request).

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
    trunk/blender/source/blender/editors/interface/view2d_ops.c
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_intern.h

Modified: trunk/blender/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-08-13 04:39:42 UTC (rev 49865)
+++ trunk/blender/release/scripts/startup/bl_ui/space_view3d.py	2012-08-13 08:54:33 UTC (rev 49866)
@@ -1183,6 +1183,7 @@
         layout.operator_context = 'EXEC_AREA'
         layout.operator("object.hook_add_newob")
         layout.operator("object.hook_add_selob")
+        layout.operator("object.hook_add_selob", text="Hook to Selected Object Bone").use_bone = True
 
         if [mod.type == 'HOOK' for mod in context.active_object.modifiers]:
             layout.separator()

Modified: trunk/blender/source/blender/editors/interface/view2d_ops.c
===================================================================
--- trunk/blender/source/blender/editors/interface/view2d_ops.c	2012-08-13 04:39:42 UTC (rev 49865)
+++ trunk/blender/source/blender/editors/interface/view2d_ops.c	2012-08-13 08:54:33 UTC (rev 49866)
@@ -1198,13 +1198,13 @@
 static float smooth_view_rect_to_fac(const rctf *rect_a, const rctf *rect_b)
 {
 	float size_a[2] = {rect_a->xmax - rect_a->xmin,
-					   rect_a->ymax - rect_a->ymin};
+	                   rect_a->ymax - rect_a->ymin};
 	float size_b[2] = {rect_b->xmax - rect_b->xmin,
-					   rect_b->ymax - rect_b->ymin};
+	                   rect_b->ymax - rect_b->ymin};
 	float cent_a[2] = {(rect_a->xmax + rect_a->xmin) * 0.5f,
-					   (rect_a->ymax + rect_a->ymin) * 0.5f};
+	                   (rect_a->ymax + rect_a->ymin) * 0.5f};
 	float cent_b[2] = {(rect_b->xmax + rect_b->xmin) * 0.5f,
-					   (rect_b->ymax + rect_b->ymin) * 0.5f};
+	                   (rect_b->ymax + rect_b->ymin) * 0.5f};
 
 	float fac_max = 0.0f;
 	float tfac;
@@ -1228,7 +1228,7 @@
 /* will start timer if appropriate */
 /* the arguments are the desired situation */
 void UI_view2d_smooth_view(bContext *C, ARegion *ar,
-						   const rctf *cur)
+                           const rctf *cur)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
 	wmWindow *win = CTX_wm_window(C);

Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c	2012-08-13 04:39:42 UTC (rev 49865)
+++ trunk/blender/source/blender/editors/object/object_hook.c	2012-08-13 08:54:33 UTC (rev 49866)
@@ -38,6 +38,7 @@
 #include "BLI_string.h"
 #include "BLI_utildefines.h"
 
+#include "DNA_armature_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_mesh_types.h"
@@ -430,7 +431,7 @@
 	return ob;
 }
 
-static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *ob, int mode)
+static int add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *ob, int mode, ReportList *reports)
 {
 	ModifierData *md = NULL;
 	HookModifierData *hmd = NULL;
@@ -439,9 +440,12 @@
 	char name[MAX_NAME];
 	
 	ok = object_hook_index_array(scene, obedit, &tot, &indexar, name, cent);
-	
-	if (!ok) return;    // XXX error("Requires selected vertices or active Vertex Group");
-	
+
+	if (!ok) {
+		BKE_report(reports, RPT_ERROR, "Requires selected vertices or active Vertex Group");
+		return FALSE;
+	}
+
 	if (mode == OBJECT_ADDHOOK_NEWOB && !ob) {
 		
 		ob = add_hook_object_new(scene, obedit);
@@ -466,6 +470,17 @@
 	hmd->totindex = tot;
 	BLI_strncpy(hmd->name, name, sizeof(hmd->name));
 	
+	if (mode == OBJECT_ADDHOOK_SELOB_BONE) {
+		bArmature *arm = ob->data;
+		BLI_assert(ob->type == OB_ARMATURE);
+		if (arm->act_bone) {
+			BLI_strncpy(hmd->subtarget, arm->act_bone->name, sizeof(hmd->subtarget));
+		}
+		else {
+			BKE_report(reports, RPT_WARNING, "Armature has no active object bone");
+		}
+	}
+
 	/* matrix calculus */
 	/* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
 	/*        (parentinv         )                          */
@@ -477,6 +492,8 @@
 	             NULL, NULL, NULL, NULL, NULL);
 	
 	DAG_scene_sort(bmain, scene);
+
+	return TRUE;
 }
 
 static int object_add_hook_selob_exec(bContext *C, wmOperator *op)
@@ -485,6 +502,8 @@
 	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
 	Object *obsel = NULL;
+	const int use_bone = RNA_boolean_get(op->ptr, "use_bone");
+	const int mode = use_bone ? OBJECT_ADDHOOK_SELOB_BONE : OBJECT_ADDHOOK_SELOB;
 	
 	CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
 	{
@@ -499,11 +518,19 @@
 		BKE_report(op->reports, RPT_ERROR, "Can't add hook with no other selected objects");
 		return OPERATOR_CANCELLED;
 	}
+
+	if (use_bone && obsel->type != OB_ARMATURE) {
+		BKE_report(op->reports, RPT_ERROR, "Can't add hook bone for a non armature object");
+		return OPERATOR_CANCELLED;
+	}
 	
-	add_hook_object(bmain, scene, obedit, obsel, OBJECT_ADDHOOK_SELOB);
-	
-	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obedit);
-	return OPERATOR_FINISHED;
+	if (add_hook_object(bmain, scene, obedit, obsel, mode, op->reports)) {
+		WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obedit);
+		return OPERATOR_FINISHED;
+	}
+	else {
+		return OPERATOR_CANCELLED;
+	}
 }
 
 void OBJECT_OT_hook_add_selobj(wmOperatorType *ot)
@@ -519,19 +546,25 @@
 	
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	RNA_def_boolean(ot->srna, "use_bone", FALSE, "Active Bone",
+	                "Assign the hook to the hook objects active bone");
 }
 
-static int object_add_hook_newob_exec(bContext *C, wmOperator *UNUSED(op))
+static int object_add_hook_newob_exec(bContext *C, wmOperator *op)
 {
 	Main *bmain = CTX_data_main(C);
 	Scene *scene = CTX_data_scene(C);
 	Object *obedit = CTX_data_edit_object(C);
 
-	add_hook_object(bmain, scene, obedit, NULL, OBJECT_ADDHOOK_NEWOB);
-	
-	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
-	WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obedit);
-	return OPERATOR_FINISHED;
+	if (add_hook_object(bmain, scene, obedit, NULL, OBJECT_ADDHOOK_NEWOB, op->reports)) {
+		WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
+		WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, obedit);
+		return OPERATOR_FINISHED;
+	}
+	else {
+		return OPERATOR_CANCELLED;
+	}
 }
 
 void OBJECT_OT_hook_add_newobj(wmOperatorType *ot)

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h	2012-08-13 04:39:42 UTC (rev 49865)
+++ trunk/blender/source/blender/editors/object/object_intern.h	2012-08-13 08:54:33 UTC (rev 49866)
@@ -43,6 +43,7 @@
 enum {
 	OBJECT_ADDHOOK_NEWOB = 1,
 	OBJECT_ADDHOOK_SELOB,
+	OBJECT_ADDHOOK_SELOB_BONE
 } eObject_Hook_Add_Mode;
 
 /* internal exports only */




More information about the Bf-blender-cvs mailing list