Commit: 12591ea55e5ebe8c60cbdb119d3dc8d0d0898ccb
Author: Lukas Tönne
Date:   Fri Jan 9 08:49:53 2015 +0100
Branches: temp_constraint_volume
https://developer.blender.org/rB12591ea55e5ebe8c60cbdb119d3dc8d0d0898ccb

Generalizing constraint volume preservation.

Moved settings for volume adjustment, limits and smoothing out of the
StretchTo constraint, so they can be reused by other constraints.

===================================================================

M       release/scripts/startup/bl_ui/properties_constraint.py
M       source/blender/blenkernel/BKE_blender.h
M       source/blender/blenkernel/intern/armature.c
M       source/blender/blenkernel/intern/constraint.c
M       source/blender/blenloader/intern/versioning_270.c
M       source/blender/makesdna/DNA_constraint_types.h
M       source/blender/makesrna/intern/rna_constraint.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_constraint.py 
b/release/scripts/startup/bl_ui/properties_constraint.py
index 0c5aae1..6f8f321 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -89,6 +89,27 @@ class ConstraintButtonsPanel():
         col = split.column()
         col.prop(con, "chain_count")
 
+    def volume_settings_template(self, layout, volume):
+        layout.prop(volume, "bulge", text="Volume Variation")
+        split = layout.split()
+        col = split.column(align=True)
+        col.prop(volume, "use_bulge_min", text="Volume Min")
+        sub = col.column()
+        sub.active = volume.use_bulge_min
+        sub.prop(volume, "bulge_min", text="")
+        col = split.column(align=True)
+        col.prop(volume, "use_bulge_max", text="Volume Max")
+        sub = col.column()
+        sub.active = volume.use_bulge_max
+        sub.prop(volume, "bulge_max", text="")
+        col = layout.column()
+        col.active = volume.use_bulge_min or volume.use_bulge_max
+        col.prop(volume, "bulge_smooth", text="Smooth")
+
+        row = layout.row()
+        row.label(text="Volume:")
+        row.prop(volume, "mode", expand=True)
+
     def CHILD_OF(self, context, layout, con):
         self.target_template(layout, con)
 
@@ -501,25 +522,7 @@ class ConstraintButtonsPanel():
         row.prop(con, "rest_length", text="Rest Length")
         row.operator("constraint.stretchto_reset", text="Reset")
 
-        layout.prop(con, "bulge", text="Volume Variation")
-        split = layout.split()
-        col = split.column(align=True)
-        col.prop(con, "use_bulge_min", text="Volume Min")
-        sub = col.column()
-        sub.active = con.use_bulge_min
-        sub.prop(con, "bulge_min", text="")
-        col = split.column(align=True)
-        col.prop(con, "use_bulge_max", text="Volume Max")
-        sub = col.column()
-        sub.active = con.use_bulge_max
-        sub.prop(con, "bulge_max", text="")
-        col = layout.column()
-        col.active = con.use_bulge_min or con.use_bulge_max
-        col.prop(con, "bulge_smooth", text="Smooth")
-
-        row = layout.row()
-        row.label(text="Volume:")
-        row.prop(con, "volume", expand=True)
+        self.volume_settings_template(layout, con.volume)
 
         row.label(text="Plane:")
         row.prop(con, "keep_axis", expand=True)
diff --git a/source/blender/blenkernel/BKE_blender.h 
b/source/blender/blenkernel/BKE_blender.h
index 0215bec..3053c99 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         273
-#define BLENDER_SUBVERSION      2
+#define BLENDER_SUBVERSION      3
 /* 262 was the last editmesh release but it has compatibility code for bmesh 
data */
 #define BLENDER_MINVERSION      270
 #define BLENDER_MINSUBVERSION   5
diff --git a/source/blender/blenkernel/intern/armature.c 
b/source/blender/blenkernel/intern/armature.c
index 03372b9..431c24d 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -2200,7 +2200,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, 
Scene *scene, Object *o
                                        float bulge = powf(1.0f / 
fabsf(scaleFac), ikData->bulge);
                                        
                                        if (bulge > 1.0f) {
-                                               if (ikData->flag & 
STRETCHTOCON_USE_BULGE_MAX) {
+                                               if (ikData->flag & 
CONSTRAINT_SPLINEIK_USE_BULGE_MAX) {
                                                        float bulge_max = 
max_ff(ikData->bulge_max, 1.0f);
                                                        float hard = 
min_ff(bulge, bulge_max);
                                                        
@@ -2212,7 +2212,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, 
Scene *scene, Object *o
                                                }
                                        }
                                        if (bulge < 1.0f) {
-                                               if (ikData->flag & 
STRETCHTOCON_USE_BULGE_MIN) {
+                                               if (ikData->flag & 
CONSTRAINT_SPLINEIK_USE_BULGE_MIN) {
                                                        float bulge_min = 
CLAMPIS(ikData->bulge_min, 0.0f, 1.0f);
                                                        float hard = 
max_ff(bulge, bulge_min);
                                                        
diff --git a/source/blender/blenkernel/intern/constraint.c 
b/source/blender/blenkernel/intern/constraint.c
index f591fe8..1c3c3c6 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -578,6 +578,72 @@ static void constraint_target_to_mat4(Object *ob, const 
char *substring, float m
        }
 }
 
+/* ------------ Volume Preservation ---------- */
+
+static void constraint_volume_init(bConstraintVolumeSettings *vol)
+{
+       vol->mode = CONSTRAINT_VOLUME_XZ;
+       vol->bulge = 1.0f;
+       vol->bulge_min = 1.0f;
+       vol->bulge_max = 1.0f;
+       vol->bulge_smooth = 0.0f;
+       vol->flag = 0;
+}
+
+static void constraint_volume_eval_scale(float result[3], 
bConstraintVolumeSettings *vol, float factor)
+{
+       float bulge = powf(factor, vol->bulge);
+       
+       if (bulge > 1.0f) {
+               if (vol->flag & CONSTRAINT_VOLUME_USE_MAX) {
+                       float bulge_max = max_ff(vol->bulge_max, 1.0f);
+                       float hard = min_ff(bulge, bulge_max);
+                       
+                       float range = bulge_max - 1.0f;
+                       float scale = (range > 0.0f) ? 1.0f / range : 0.0f;
+                       float soft = 1.0f + range * atanf((bulge - 1.0f) * 
scale) / (0.5f * M_PI);
+                       
+                       bulge = interpf(soft, hard, vol->bulge_smooth);
+               }
+       }
+       if (bulge < 1.0f) {
+               if (vol->flag & CONSTRAINT_VOLUME_USE_MIN) {
+                       float bulge_min = CLAMPIS(vol->bulge_max, 0.0f, 1.0f); 
/* bulge_max is not a mistake: used as upper limit for bulge_min! */
+                       float hard = max_ff(bulge, bulge_min);
+                       
+                       float range = 1.0f - bulge_min;
+                       float scale = (range > 0.0f) ? 1.0f / range : 0.0f;
+                       float soft = 1.0f - range * atanf((1.0f - bulge) * 
scale) / (0.5f * M_PI);
+                       
+                       bulge = interpf(soft, hard, vol->bulge_smooth);
+               }
+       }
+       
+       result[1] = factor;
+       switch (vol->mode) {
+               /* volume preserving scaling */
+               case CONSTRAINT_VOLUME_XZ:
+                       result[0] = result[2] = sqrtf(bulge);
+                       break;
+               case CONSTRAINT_VOLUME_X:
+                       result[0] = bulge;
+                       result[2] = 1.0f;
+                       break;
+               case CONSTRAINT_VOLUME_Z:
+                       result[0] = 1.0f;
+                       result[2] = bulge;
+                       break;
+               /* don't care for volume */
+               case CONSTRAINT_NONE:
+                       result[0] = 1.0f;
+                       result[2] = 1.0f;
+                       break;
+               default: /* should not happen */
+                       BLI_assert(false);
+                       break;
+       }
+}
+
 /* ************************* Specific Constraints 
***************************** */
 /* Each constraint defines a set of functions, which will be called at the 
appropriate
  * times. In addition to this, each constraint should have a type-info struct, 
where
@@ -2626,12 +2692,9 @@ static void stretchto_new_data(void *cdata)
 {
        bStretchToConstraint *data = (bStretchToConstraint *)cdata;
        
-       data->volmode = 0;
        data->plane = 0;
        data->orglength = 0.0; 
-       data->bulge = 1.0;
-       data->bulge_max = 1.0f;
-       data->bulge_min = 1.0f;
+       constraint_volume_init(&data->volume);
 }
 
 static void stretchto_id_looper(bConstraint *con, ConstraintIDFunc func, void 
*userdata)
@@ -2677,7 +2740,7 @@ static void stretchto_evaluate(bConstraint *con, 
bConstraintOb *cob, ListBase *t
        if (VALID_CONS_TARGET(ct)) {
                float size[3], scale[3], vec[3], xx[3], zz[3], orth[3];
                float totmat[3][3];
-               float dist, bulge;
+               float dist;
                
                /* store scaling before destroying obmat */
                mat4_to_size(size, cob->matrix);
@@ -2704,57 +2767,7 @@ static void stretchto_evaluate(bConstraint *con, 
bConstraintOb *cob, ListBase *t
                if (data->orglength == 0)
                        data->orglength = dist;
 
-               scale[1] = dist / data->orglength;
-               
-               bulge = powf(data->orglength / dist, data->bulge);
-               
-               if (bulge > 1.0f) {
-                       if (data->flag & STRETCHTOCON_USE_BULGE_MAX) {
-                               float bulge_max = max_ff(data->bulge_max, 1.0f);
-                               float hard = min_ff(bulge, bulge_max);
-                               
-                               float range = bulge_max - 1.0f;
-                               float scale = (range > 0.0f) ? 1.0f / range : 
0.0f;
-                               float soft = 1.0f + range * atanf((bulge - 
1.0f) * scale) / (0.5f * M_PI);
-                               
-                               bulge = interpf(soft, hard, data->bulge_smooth);
-                       }
-               }
-               if (bulge < 1.0f) {
-                       if (data->flag & STRETCHTOCON_USE_BULGE_MIN) {
-                               float bulge_min = CLAMPIS(data->bulge_min, 
0.0f, 1.0f);
-                               float hard = max_ff(bulge, bulge_min);
-                               
-                               float range = 1.0f - bulge_min;
-                               float scale = (range > 0.0f) ? 1.0f / range : 
0.0f;
-                               float soft = 1.0f - range * atanf((1.0f - 
bulge) * scale) / (0.5f * M_PI);
-                               
-                               bulge = interpf(soft, hard, data->bulge_smooth);
-                       }
-               }
-               
-               switch (data->volmode) {
-                       /* volume preserving scaling */
-                       case VOLUME_XZ:
-                               scale[0] = sqrtf(bulge);
-                               scale[2] = scale[0];
-                               break;
-                       case VOLUME_X:
-                               scale[0] = bulge;
-                               scale[2] = 1.0;
-                               break;
-                       case VOLUME_Z:
-                               scale[0] = 1.0;
-                               scale[2] = bulge;
-                               break;
-                       /* don't care for volume */
-                       case NO_VOLUME:
-                               scale[0] = 1.0;
-                               scale[2] = 1.0;
-                               break;
-                       default: /* should not happen, but in case*/
-                               return;
-               } /* switch (data->volmode) */
+               constraint_volume_eval_scale(scale, &data->volume, dist / 
data->orglength);
                
                /* Clear the object's rotation and scale */
                cob->matrix[0][0] = size[0] * scale[0];
diff --git a/source/blender/blenloader/intern/versioning_270.c 
b/source/blender/blenloader/intern/versioning_270.c
index ca54f06..536540b 100644
--- a/source/blender/blenloader/intern/versioning_270.c
+++ b/source/blender/blenloader/intern/versioning_270.c
@@ -126,6 +126,29 @@ static void 
do_version_constraints_stretch_to_limits(ListBase *lb)
        }
 }
 
+/* transfer volume settings to new struct */
+static void do_version_constraints_volume_settings(ListBase *lb)
+{
+       bConstraint *con;
+
+       for (con = lb->first; con; con = con->next) {
+               if (con->type == CONSTRAINT_TYPE_STRETCHTO) {
+                       bStretchToConstraint *data = (bStretchToConstraint 
*)con->data;
+                       
+                       data->volume.mode = data->volmode;
+                       data->volume.flag = 0;
+                       if (data->flag & _STRETCHTOCON_USE_BULGE_MIN)
+                               data->volume.flag |= CONSTRAINT_VOLUME_USE_MIN;
+                       if (data->flag & _STRETCHTOCON_USE_BULGE_MAX)
+                               data->volume.flag |= CONSTRAINT_VOLUME_USE_MAX;
+                       data->volume.bulge = data->bulge;
+                       data->volume.bulge_min = data->bulge_min;
+                       data->volume.bulge_max = data->bulge_max;
+                       data->volume.bulge_smooth = data->bulge_smooth;
+               }


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to