[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