Small code cleanup related to curves, to avoid cryptic names:

renamed set_four_ipo -> key_curve_position_weights
renamed set_afgeleide_four_ipo -> key_curve_tangent_weights
added key_curve_normal_weights
This commit is contained in:
Brecht Van Lommel 2009-09-09 18:09:03 +00:00
parent 183c8e0a0a
commit 4cb53d91ea
10 changed files with 92 additions and 67 deletions

@ -51,8 +51,9 @@ struct Key *copy_key(struct Key *key);
void make_local_key(struct Key *key); void make_local_key(struct Key *key);
void sort_keys(struct Key *key); void sort_keys(struct Key *key);
void set_four_ipo(float d, float *data, int type); void key_curve_position_weights(float t, float *data, int type);
void set_afgeleide_four_ipo(float d, float *data, int type); void key_curve_tangent_weights(float t, float *data, int type);
void key_curve_normal_weights(float t, float *data, int type);
/* only exported to curve.c! */ /* only exported to curve.c! */
void cp_cu_key(struct Curve *cu, struct KeyBlock *kb, int start, int end); void cp_cu_key(struct Curve *cu, struct KeyBlock *kb, int start, int end);

@ -253,7 +253,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
/* note, commented out for follow constraint */ /* note, commented out for follow constraint */
//if(cu->flag & CU_FOLLOW) { //if(cu->flag & CU_FOLLOW) {
set_afgeleide_four_ipo(1.0f-fac, data, KEY_BSPLINE); key_curve_tangent_weights(1.0f-fac, data, KEY_BSPLINE);
dir[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ; dir[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ;
dir[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ; dir[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ;
@ -268,10 +268,10 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK
nu= cu->nurb.first; nu= cu->nurb.first;
/* make sure that first and last frame are included in the vectors here */ /* make sure that first and last frame are included in the vectors here */
if((nu->type & 7)==CU_POLY) set_four_ipo(1.0f-fac, data, KEY_LINEAR); if((nu->type & 7)==CU_POLY) key_curve_position_weights(1.0f-fac, data, KEY_LINEAR);
else if((nu->type & 7)==CU_BEZIER) set_four_ipo(1.0f-fac, data, KEY_LINEAR); else if((nu->type & 7)==CU_BEZIER) key_curve_position_weights(1.0f-fac, data, KEY_LINEAR);
else if(s0==s1 || p2==p3) set_four_ipo(1.0f-fac, data, KEY_CARDINAL); else if(s0==s1 || p2==p3) key_curve_position_weights(1.0f-fac, data, KEY_CARDINAL);
else set_four_ipo(1.0f-fac, data, KEY_BSPLINE); else key_curve_position_weights(1.0f-fac, data, KEY_BSPLINE);
vec[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ; vec[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ;
vec[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ; vec[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ;

@ -1476,7 +1476,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */ if (nu->tilt_interp==3) { /* May as well support for tilt also 2.47 ease interp */
tilt_array[a] = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac); tilt_array[a] = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac);
} else { } else {
set_four_ipo(fac, t, nu->tilt_interp); key_curve_position_weights(fac, t, nu->tilt_interp);
tilt_array[a]= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa; tilt_array[a]= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa;
} }
} }
@ -1491,7 +1491,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
/* reuse interpolation from tilt if we can */ /* reuse interpolation from tilt if we can */
if (tilt_array==NULL || nu->tilt_interp != nu->radius_interp) { if (tilt_array==NULL || nu->tilt_interp != nu->radius_interp) {
set_four_ipo(fac, t, nu->radius_interp); key_curve_position_weights(fac, t, nu->radius_interp);
} }
radius_array[a]= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius; radius_array[a]= t[0]*pprev->radius + t[1]*prevbezt->radius + t[2]*bezt->radius + t[3]*next->radius;
} }

@ -258,66 +258,91 @@ void sort_keys(Key *key)
/**************** do the key ****************/ /**************** do the key ****************/
void key_curve_position_weights(float t, float *data, int type)
void set_four_ipo(float d, float *data, int type)
{ {
float d2, d3, fc; float t2, t3, fc;
if(type==KEY_LINEAR) { if(type==KEY_LINEAR) {
data[0]= 0.0f; data[0]= 0.0f;
data[1]= 1.0f-d; data[1]= -t + 1.0f;
data[2]= d; data[2]= t;
data[3]= 0.0f; data[3]= 0.0f;
} }
else { else if(type==KEY_CARDINAL) {
d2= d*d; t2= t*t;
d3= d2*d; t3= t2*t;
fc= 0.71f;
if(type==KEY_CARDINAL) { data[0]= -fc*t3 + 2.0f*fc*t2 - fc*t;
data[1]= (2.0f-fc)*t3 + (fc-3.0f)*t2 + 1.0f;
data[2]= (fc-2.0f)*t3 + (3.0f-2.0f*fc)*t2 + fc*t;
data[3]= fc*t3 - fc*t2;
}
else if(type==KEY_BSPLINE) {
t2= t*t;
t3= t2*t;
fc= 0.71f; data[0]= -0.16666666f*t3 + 0.5f*t2 - 0.5f*t + 0.16666666f;
data[1]= 0.5f*t3 - t2 + 0.6666666f;
data[0]= -fc*d3 +2.0f*fc*d2 -fc*d; data[2]= -0.5f*t3 + 0.5f*t2 + 0.5f*t + 0.16666666f;
data[1]= (2.0f-fc)*d3 +(fc-3.0f)*d2 +1.0f; data[3]= 0.16666666f*t3;
data[2]= (fc-2.0f)*d3 +(3.0f-2.0f*fc)*d2 +fc*d;
data[3]= fc*d3 -fc*d2;
}
else if(type==KEY_BSPLINE) {
data[0]= -0.16666666f*d3 +0.5f*d2 -0.5f*d +0.16666666f;
data[1]= 0.5f*d3 -d2 +0.6666666f;
data[2]= -0.5f*d3 +0.5f*d2 +0.5f*d +0.16666666f;
data[3]= 0.16666666f*d3 ;
}
} }
} }
void set_afgeleide_four_ipo(float d, float *data, int type) /* first derivative */
void key_curve_tangent_weights(float t, float *data, int type)
{ {
float d2, fc; float t2, fc;
if(type==KEY_LINEAR) { if(type==KEY_LINEAR) {
data[0]= 0.0f;
data[1]= -1.0f;
data[2]= 1.0f;
data[3]= 0.0f;
} }
else { else if(type==KEY_CARDINAL) {
d2= d*d; t2= t*t;
fc= 0.71f;
if(type==KEY_CARDINAL) { data[0]= -3.0f*fc*t2 +4.0f*fc*t - fc;
data[1]= 3.0f*(2.0f-fc)*t2 +2.0f*(fc-3.0f)*t;
data[2]= 3.0f*(fc-2.0f)*t2 +2.0f*(3.0f-2.0f*fc)*t + fc;
data[3]= 3.0f*fc*t2 -2.0f*fc*t;
}
else if(type==KEY_BSPLINE) {
t2= t*t;
fc= 0.71f; data[0]= -0.5f*t2 + t - 0.5f;
data[1]= 1.5f*t2 - 2.0f*t;
data[2]= -1.5f*t2 + t + 0.5f;
data[3]= 0.5f*t2;
}
}
data[0]= -3.0f*fc*d2 +4.0f*fc*d -fc; /* second derivative */
data[1]= 3.0f*(2.0f-fc)*d2 +2.0f*(fc-3.0f)*d; void key_curve_normal_weights(float t, float *data, int type)
data[2]= 3.0f*(fc-2.0f)*d2 +2.0f*(3.0f-2.0f*fc)*d +fc; {
data[3]= 3.0f*fc*d2 -2.0f*fc*d; float fc;
}
else if(type==KEY_BSPLINE) {
data[0]= -0.16666666f*3.0f*d2 +d -0.5f; if(type==KEY_LINEAR) {
data[1]= 1.5f*d2 -2.0f*d; data[0]= 0.0f;
data[2]= -1.5f*d2 +d +0.5f; data[1]= 0.0f;
data[3]= 0.16666666f*3.0f*d2 ; data[2]= 0.0f;
} data[3]= 0.0f;
}
else if(type==KEY_CARDINAL) {
fc= 0.71f;
data[0]= -6.0f*fc*t + 4.0f*fc;
data[1]= 6.0f*(2.0f-fc)*t + 2.0f*(fc-3.0f);
data[2]= 6.0f*(fc-2.0f)*t + 2.0f*(3.0f-2.0f*fc);
data[3]= 6.0f*fc*t - 2.0f*fc;
}
else if(type==KEY_BSPLINE) {
data[0]= -1.0f*t + 1.0f;
data[1]= 3.0f*t - 2.0f;
data[2]= -3.0f*t + 1.0f;
data[3]= 1.0f*t;
} }
} }
@ -428,10 +453,10 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
/* interpolation */ /* interpolation */
set_four_ipo(d, t, k[1]->type); key_curve_position_weights(d, t, k[1]->type);
if(k[1]->type != k[2]->type) { if(k[1]->type != k[2]->type) {
set_four_ipo(d, fval, k[2]->type); key_curve_position_weights(d, fval, k[2]->type);
temp= 1.0f-d; temp= 1.0f-d;
t[0]= temp*t[0]+ d*fval[0]; t[0]= temp*t[0]+ d*fval[0];

@ -367,7 +367,7 @@ void calc_latt_deform(float *co, float weight)
u= (vec[0]-lt->fu)/lt->du; u= (vec[0]-lt->fu)/lt->du;
ui= (int)floor(u); ui= (int)floor(u);
u -= ui; u -= ui;
set_four_ipo(u, tu, lt->typeu); key_curve_position_weights(u, tu, lt->typeu);
} }
else { else {
tu[0]= tu[2]= tu[3]= 0.0; tu[1]= 1.0; tu[0]= tu[2]= tu[3]= 0.0; tu[1]= 1.0;
@ -378,7 +378,7 @@ void calc_latt_deform(float *co, float weight)
v= (vec[1]-lt->fv)/lt->dv; v= (vec[1]-lt->fv)/lt->dv;
vi= (int)floor(v); vi= (int)floor(v);
v -= vi; v -= vi;
set_four_ipo(v, tv, lt->typev); key_curve_position_weights(v, tv, lt->typev);
} }
else { else {
tv[0]= tv[2]= tv[3]= 0.0; tv[1]= 1.0; tv[0]= tv[2]= tv[3]= 0.0; tv[1]= 1.0;
@ -389,7 +389,7 @@ void calc_latt_deform(float *co, float weight)
w= (vec[2]-lt->fw)/lt->dw; w= (vec[2]-lt->fw)/lt->dw;
wi= (int)floor(w); wi= (int)floor(w);
w -= wi; w -= wi;
set_four_ipo(w, tw, lt->typew); key_curve_position_weights(w, tw, lt->typew);
} }
else { else {
tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0; tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0;

@ -2312,7 +2312,7 @@ void object_handle_update(Object *ob)
if(ob->recalc & OB_RECALC_DATA) { if(ob->recalc & OB_RECALC_DATA) {
// printf("recalcdata %s\n", ob->id.name+2); printf("recalc data %s\n", ob->id.name);
/* includes all keys and modifiers */ /* includes all keys and modifiers */
if(ob->type==OB_MESH) { if(ob->type==OB_MESH) {

@ -873,7 +873,7 @@ static void interpolate_particle(short type, ParticleKey keys[4], float dt, Part
VecfCubicInterpol(keys[1].co, keys[1].vel, keys[2].co, keys[2].vel, dt, result->co, result->vel); VecfCubicInterpol(keys[1].co, keys[1].vel, keys[2].co, keys[2].vel, dt, result->co, result->vel);
} }
else { else {
set_four_ipo(dt, t, type); key_curve_position_weights(dt, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, result->co); weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, result->co);
@ -881,12 +881,12 @@ static void interpolate_particle(short type, ParticleKey keys[4], float dt, Part
float temp[3]; float temp[3];
if(dt>0.999f){ if(dt>0.999f){
set_four_ipo(dt-0.001f, t, type); key_curve_position_weights(dt-0.001f, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp); weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
VECSUB(result->vel, result->co, temp); VECSUB(result->vel, result->co, temp);
} }
else{ else{
set_four_ipo(dt+0.001f, t, type); key_curve_position_weights(dt+0.001f, t, type);
weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp); weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, temp);
VECSUB(result->vel, temp, result->co); VECSUB(result->vel, temp, result->co);
} }

@ -368,9 +368,9 @@ int do_colorband(ColorBand *coba, float in, float out[4])
CLAMP(fac, 0.0f, 1.0f); CLAMP(fac, 0.0f, 1.0f);
if(coba->ipotype==3) if(coba->ipotype==3)
set_four_ipo(fac, t, KEY_CARDINAL); key_curve_position_weights(fac, t, KEY_CARDINAL);
else else
set_four_ipo(fac, t, KEY_BSPLINE); key_curve_position_weights(fac, t, KEY_BSPLINE);
out[0]= t[3]*cbd3->r +t[2]*cbd2->r +t[1]*cbd1->r +t[0]*cbd0->r; out[0]= t[3]*cbd3->r +t[2]*cbd2->r +t[1]*cbd1->r +t[0]*cbd0->r;
out[1]= t[3]*cbd3->g +t[2]*cbd2->g +t[1]*cbd1->g +t[0]*cbd0->g; out[1]= t[3]*cbd3->g +t[2]*cbd2->g +t[1]*cbd1->g +t[0]*cbd0->g;

@ -127,7 +127,6 @@
#include "BKE_global.h" // for G #include "BKE_global.h" // for G
#include "BKE_group.h" #include "BKE_group.h"
#include "BKE_image.h" #include "BKE_image.h"
#include "BKE_key.h" //void set_four_ipo
#include "BKE_lattice.h" #include "BKE_lattice.h"
#include "BKE_library.h" // for wich_libbase #include "BKE_library.h" // for wich_libbase
#include "BKE_main.h" // for Main #include "BKE_main.h" // for Main

@ -122,14 +122,14 @@ void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint)
spoint->dtstrandco *= 0.5f; spoint->dtstrandco *= 0.5f;
} }
else { else {
set_four_ipo(t, data, type); key_curve_position_weights(t, data, type);
spoint->co[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0]; spoint->co[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
spoint->co[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1]; spoint->co[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
spoint->co[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2]; spoint->co[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];
spoint->strandco= (1.0f-t)*sseg->v[1]->strandco + t*sseg->v[2]->strandco; spoint->strandco= (1.0f-t)*sseg->v[1]->strandco + t*sseg->v[2]->strandco;
} }
set_afgeleide_four_ipo(t, data, type); key_curve_tangent_weights(t, data, type);
spoint->dtco[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0]; spoint->dtco[0]= data[0]*p[0][0] + data[1]*p[1][0] + data[2]*p[2][0] + data[3]*p[3][0];
spoint->dtco[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1]; spoint->dtco[1]= data[0]*p[0][1] + data[1]*p[1][1] + data[2]*p[2][1] + data[3]*p[3][1];
spoint->dtco[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2]; spoint->dtco[2]= data[0]*p[0][2] + data[1]*p[1][2] + data[2]*p[2][2] + data[3]*p[3][2];