Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-11-05 13:09:45 +0300
committerJoshua Leung <aligorith@gmail.com>2009-11-05 13:09:45 +0300
commit06d5d53a240cf98aee52a45317ac2f979be7e58a (patch)
tree8f2db7b18112826826213f86aa0a8e20fad0b9c9 /source
parent751f07d6d486b6388d4eeb78ee0fb672c95739ed (diff)
Bugfixes + Spline IK Tweaks:
* #19819: 'Select' operator for Hooks was crashing when Hooks didn't have any vertices assigned yet * Default twist resolution mode for curves is now 'Minimise'. This seems to work better for Curve Deforms and other purposes. Can be changed if other ways are better after some more testing. * Spline IK now has more options for controlling how the x and z axis scaling is determined. There is now a choice between using the radius of the curve, the x+z scaling from the bones, or no scaling (default). This does break old files a bit, but this is to have a more stable base for later.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/armature.c29
-rw-r--r--source/blender/blenkernel/intern/curve.c1
-rw-r--r--source/blender/editors/object/object_hook.c3
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h14
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c13
5 files changed, 48 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 3a8a3d4efc9..f178553d796 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1891,14 +1891,33 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
}
/* step 4: set the scaling factors for the axes */
+ // TODO: include a no-scale option?
{
/* only multiply the y-axis by the scaling factor to get nice volume-preservation */
VecMulf(poseMat[1], scaleFac);
-
- /* set the scaling factors of the x and z axes from the average radius of the curve? */
- if (ikData->flag & CONSTRAINT_SPLINEIK_RAD2FAT) {
- VecMulf(poseMat[0], radius);
- VecMulf(poseMat[2], radius);
+
+ /* set the scaling factors of the x and z axes from... */
+ switch (ikData->xzScaleMode) {
+ case CONSTRAINT_SPLINEIK_XZS_RADIUS:
+ {
+ /* radius of curve */
+ VecMulf(poseMat[0], radius);
+ VecMulf(poseMat[2], radius);
+ }
+ break;
+ case CONSTRAINT_SPLINEIK_XZS_ORIGINAL:
+ {
+ /* original scales get used */
+ float scale;
+
+ /* x-axis scale */
+ scale= VecLength(pchan->pose_mat[0]);
+ VecMulf(poseMat[0], scale);
+ /* z-axis scale */
+ scale= VecLength(pchan->pose_mat[2]);
+ VecMulf(poseMat[2], scale);
+ }
+ break;
}
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 5580070b922..1410e5d29c2 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -145,6 +145,7 @@ Curve *add_curve(char *name, int type)
cu->fsize= 1.0;
cu->ulheight = 0.05;
cu->texflag= CU_AUTOSPACE;
+ cu->twist_mode= CU_TWIST_MINIMUM; // XXX: this one seems to be the best one in most cases, at least for curve deform...
cu->bb= unit_boundbox();
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 4643b875872..22a6329a097 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -362,6 +362,9 @@ static void select_editcurve_hook(Object *obedit, HookModifierData *hmd)
void object_hook_select(Object *ob, HookModifierData *hmd)
{
+ if (hmd->indexar == NULL)
+ return;
+
if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd);
else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd);
else if(ob->type==OB_CURVE) select_editcurve_hook(ob, hmd);
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index f5a08764c42..2b24b673185 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -169,7 +169,7 @@ typedef struct bSplineIKConstraint {
/* settings */
short flag; /* general settings for constraint */
- short upflag; /* axis of bone that points up */
+ short xzScaleMode; /* method used for determining the x & z scaling of the bones */
} bSplineIKConstraint;
@@ -551,10 +551,16 @@ typedef enum B_CONSTRAINTCHANNEL_FLAG {
#define CONSTRAINT_SPLINEIK_NO_ROOT (1<<1)
/* bones in the chain should not scale to fit the curve */
#define CONSTRAINT_SPLINEIK_SCALE_LIMITED (1<<2)
- /* bones in the chain should take their x/z scales from the curve radius */
-#define CONSTRAINT_SPLINEIK_RAD2FAT (1<<3)
/* evenly distribute the bones along the path regardless of length */
-#define CONSTRAINT_SPLINEIK_EVENSPLITS (1<<4)
+#define CONSTRAINT_SPLINEIK_EVENSPLITS (1<<3)
+
+/* bSplineIKConstraint->xzScaleMode */
+ /* no x/z scaling */
+#define CONSTRAINT_SPLINEIK_XZS_NONE 0
+ /* bones in the chain should take their x/z scales from the curve radius */
+#define CONSTRAINT_SPLINEIK_XZS_RADIUS 1
+ /* bones in the chain should take their x/z scales from the original scaling */
+#define CONSTRAINT_SPLINEIK_XZS_ORIGINAL 2
/* MinMax (floor) flags */
#define MINMAX_STICKY 0x01
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 02cf44dcc7a..7f7976c365f 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -1679,6 +1679,12 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+
+ static EnumPropertyItem splineik_xz_scale_mode[] = {
+ {CONSTRAINT_SPLINEIK_XZS_NONE, "NONE", 0, "None", "Don't scale the x and z axes, giving a volume preservation effect. (Default)"},
+ {CONSTRAINT_SPLINEIK_XZS_RADIUS, "CURVE_RADIUS", 0, "Curve Radius", "Use the radius of the curve."},
+ {CONSTRAINT_SPLINEIK_XZS_ORIGINAL, "ORIGINAL", 0, "Original", "Use the original scaling of the bones."},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "SplineIKConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Spline IK Constraint", "Align 'n' bones along a curve.");
@@ -1715,9 +1721,10 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Keep Max Length", "Maintain the maximum length of the chain when spline is stretched.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- prop= RNA_def_property(srna, "radius_to_thickness", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_SPLINEIK_RAD2FAT);
- RNA_def_property_ui_text(prop, "Radius to Thickness", "Radius of the spline affects the x/z scaling of the bones.");
+ prop= RNA_def_property(srna, "xz_scaling_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "xzScaleMode");
+ RNA_def_property_enum_items(prop, splineik_xz_scale_mode);
+ RNA_def_property_ui_text(prop, "XZ Scale Mode", "Method used for determining the scaling of the X and Z axes of the bone.");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}