[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15624] branches/harmonic-skeleton/source/ blender/src/autoarmature.c: Fix misceleanous errors/ tweaks in cost calculations
Martin Poirier
theeth at yahoo.com
Fri Jul 18 19:57:36 CEST 2008
Revision: 15624
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15624
Author: theeth
Date: 2008-07-18 19:57:34 +0200 (Fri, 18 Jul 2008)
Log Message:
-----------
Fix misceleanous errors/tweaks in cost calculations
- Angle cost could easily balloon up, don't use relative difference
- fix error with ends (wrong indexes)
- add missing out of bound preventions
Modified Paths:
--------------
branches/harmonic-skeleton/source/blender/src/autoarmature.c
Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c 2008-07-18 14:40:24 UTC (rev 15623)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c 2008-07-18 17:57:34 UTC (rev 15624)
@@ -569,6 +569,29 @@
return mode;
}
+static void printCostCube(float *cost_cube, int nb_joints)
+{
+ int i;
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i]);
+ }
+ printf("\n");
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i + 1]);
+ }
+ printf("\n");
+
+ for (i = 0; i < nb_joints; i++)
+ {
+ printf("%0.3f ", cost_cube[3 * i + 2]);
+ }
+ printf("\n");
+}
+
static void printPositions(int *positions, int nb_positions)
{
int i;
@@ -638,14 +661,7 @@
{
current_angle = saacos(Inpf(vec_first, vec_second));
- if (original_angle > 0)
- {
- return G.scene->toolsettings->skgen_retarget_angle_weight * fabs((current_angle - original_angle) / original_angle);
- }
- else
- {
- return G.scene->toolsettings->skgen_retarget_angle_weight * fabs(current_angle);
- }
+ return G.scene->toolsettings->skgen_retarget_angle_weight * fabs(current_angle - original_angle);
}
else
{
@@ -711,7 +727,7 @@
if (index == 0)
{
- i0 = iter->start;
+ i0 = 0;
}
else
{
@@ -722,7 +738,7 @@
if (index +1 == nb_joints)
{
- i2 = iter->end;
+ i2 = iter->length;
}
else
{
@@ -739,6 +755,10 @@
{
cost_cube[index * 3 + 2] = MAX_COST;
}
+ else if (next_position > iter->length) /* positions are indexed at 1, so length is last */
+ {
+ cost_cube[index * 3 + 2] = MAX_COST;
+ }
else
{
bucket = peekBucket(iter, next_position);
@@ -761,6 +781,10 @@
{
cost_cube[index * 3] = MAX_COST;
}
+ else if (next_position < 1) /* positions are indexed at 1, so 1 is first */
+ {
+ cost_cube[index * 3] = MAX_COST;
+ }
else
{
bucket = peekBucket(iter, next_position);
@@ -864,8 +888,6 @@
int first_pass = 1;
int must_move = nb_joints - 1;
int i;
-
- printf("aggressive\n");
positions = MEM_callocN(sizeof(int) * nb_joints, "Aggresive positions");
best_positions = MEM_callocN(sizeof(int) * nb_joints, "Best Aggresive positions");
@@ -1045,6 +1067,7 @@
{
RigEdge *previous;
float *cost_cube;
+ float cost;
#ifdef ANNEALING_ITERATION
int k, kmax = 100000;
#else
@@ -1066,7 +1089,7 @@
vec_cache[i + 1] = bucket->p;
}
- min_cost = 0;
+ cost = 0;
/* init cost cube */
for (previous = iarc->edges.first, edge = previous->next, i = 0;
@@ -1075,10 +1098,10 @@
{
calcGradient(previous, edge, &iter, i, nb_joints, cost_cube, positions, vec_cache);
- min_cost += cost_cube[3 * i + 1];
+ cost += cost_cube[3 * i + 1];
}
- printf("initial cost: %f\n", min_cost);
+ printf("initial cost: %f\n", cost);
#ifdef ANNEALING_ITERATION
for (k = 0; k < kmax; k++)
@@ -1118,9 +1141,7 @@
bucket = peekBucket(&iter, positions[moving_joint]);
vec_cache[moving_joint + 1] = bucket->p;
- min_cost += delta_cost;
-
- //printf("%i: %0.3f\n", k, delta_cost);
+ cost += delta_cost;
/* update cost cube */
for (previous = iarc->edges.first, edge = previous->next, i = 0;
@@ -1137,8 +1158,10 @@
}
}
- printf("k = %i\n", k);
+ min_cost = cost;
+// printf("k = %i\n", k);
+
memcpy(best_positions, positions, sizeof(int) * nb_joints);
MEM_freeN(cost_cube);
@@ -1175,11 +1198,8 @@
int moving_joint = -1;
int move_direction = -1;
- printf("-----------------\n");
-
for (i = 0; i < nb_joints; i++)
{
- printf("%i[%i]: %f\t\t(%f)\t\t%f\n", i, positions[i], cost_cube[i * 3], cost_cube[i * 3 + 1], cost_cube[i * 3 + 2]);
if (cost_cube[i * 3] < min_gradient)
{
min_gradient = cost_cube[i * 3];
@@ -1255,12 +1275,6 @@
{
VECCOPY(bone->head, vec0);
VECCOPY(bone->tail, vec1);
- printf("===\n");
- printvecf("vec0", vec0);
- printvecf("vec1", vec1);
- if (i < nb_joints)
- printf("position: %i\n", best_positions[i]);
- printf("last_index: %i\n", last_index);
}
vec0 = vec1;
More information about the Bf-blender-cvs
mailing list