From 4cb53d91ea1843dc0cb2c1d4c846e5a1974a20eb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 9 Sep 2009 18:09:03 +0000 Subject: [PATCH] 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 --- source/blender/blenkernel/BKE_key.h | 5 +- source/blender/blenkernel/intern/anim.c | 10 +- source/blender/blenkernel/intern/curve.c | 4 +- source/blender/blenkernel/intern/key.c | 117 +++++++++++-------- source/blender/blenkernel/intern/lattice.c | 6 +- source/blender/blenkernel/intern/object.c | 2 +- source/blender/blenkernel/intern/particle.c | 6 +- source/blender/blenkernel/intern/texture.c | 4 +- source/blender/blenloader/intern/readfile.c | 1 - source/blender/render/intern/source/strand.c | 4 +- 10 files changed, 92 insertions(+), 67 deletions(-) diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index faf8692b89a..94a7a7482e4 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -51,8 +51,9 @@ struct Key *copy_key(struct Key *key); void make_local_key(struct Key *key); void sort_keys(struct Key *key); -void set_four_ipo(float d, float *data, int type); -void set_afgeleide_four_ipo(float d, float *data, int type); +void key_curve_position_weights(float t, 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! */ void cp_cu_key(struct Curve *cu, struct KeyBlock *kb, int start, int end); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index ffb7ff51b87..e75b31dd892 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -253,7 +253,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK /* note, commented out for follow constraint */ //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[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; /* 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); - else if((nu->type & 7)==CU_BEZIER) set_four_ipo(1.0f-fac, data, KEY_LINEAR); - else if(s0==s1 || p2==p3) set_four_ipo(1.0f-fac, data, KEY_CARDINAL); - else set_four_ipo(1.0f-fac, data, KEY_BSPLINE); + if((nu->type & 7)==CU_POLY) key_curve_position_weights(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) key_curve_position_weights(1.0f-fac, data, KEY_CARDINAL); + 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[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ; diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index a1ad5347f7e..86cfe9d4c6f 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -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 */ tilt_array[a] = prevbezt->alfa + (bezt->alfa - prevbezt->alfa)*(3.0f*fac*fac - 2.0f*fac*fac*fac); } 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; } } @@ -1491,7 +1491,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float * /* reuse interpolation from tilt if we can */ 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; } diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c index 755a41ec4b2..70136afc321 100644 --- a/source/blender/blenkernel/intern/key.c +++ b/source/blender/blenkernel/intern/key.c @@ -258,66 +258,91 @@ void sort_keys(Key *key) /**************** do the key ****************/ - -void set_four_ipo(float d, float *data, int type) +void key_curve_position_weights(float t, float *data, int type) { - float d2, d3, fc; + float t2, t3, fc; if(type==KEY_LINEAR) { - data[0]= 0.0f; - data[1]= 1.0f-d; - data[2]= d; - data[3]= 0.0f; + data[0]= 0.0f; + data[1]= -t + 1.0f; + data[2]= t; + data[3]= 0.0f; } - else { - d2= d*d; - d3= d2*d; + else if(type==KEY_CARDINAL) { + t2= t*t; + 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]= -fc*d3 +2.0f*fc*d2 -fc*d; - data[1]= (2.0f-fc)*d3 +(fc-3.0f)*d2 +1.0f; - 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 ; - } + data[0]= -0.16666666f*t3 + 0.5f*t2 - 0.5f*t + 0.16666666f; + data[1]= 0.5f*t3 - t2 + 0.6666666f; + data[2]= -0.5f*t3 + 0.5f*t2 + 0.5f*t + 0.16666666f; + data[3]= 0.16666666f*t3; } } -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) { - + data[0]= 0.0f; + data[1]= -1.0f; + data[2]= 1.0f; + data[3]= 0.0f; } - else { - d2= d*d; + else if(type==KEY_CARDINAL) { + 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]= -3.0f*fc*d2 +4.0f*fc*d -fc; - data[1]= 3.0f*(2.0f-fc)*d2 +2.0f*(fc-3.0f)*d; - 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; - } - else if(type==KEY_BSPLINE) { + 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]= -0.16666666f*3.0f*d2 +d -0.5f; - data[1]= 1.5f*d2 -2.0f*d; - data[2]= -1.5f*d2 +d +0.5f; - data[3]= 0.16666666f*3.0f*d2 ; - } +/* second derivative */ +void key_curve_normal_weights(float t, float *data, int type) +{ + float fc; + + if(type==KEY_LINEAR) { + data[0]= 0.0f; + data[1]= 0.0f; + 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 */ - set_four_ipo(d, t, k[1]->type); + key_curve_position_weights(d, t, k[1]->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; t[0]= temp*t[0]+ d*fval[0]; diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 6614c657647..07973d0de57 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -367,7 +367,7 @@ void calc_latt_deform(float *co, float weight) u= (vec[0]-lt->fu)/lt->du; ui= (int)floor(u); u -= ui; - set_four_ipo(u, tu, lt->typeu); + key_curve_position_weights(u, tu, lt->typeu); } else { 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; vi= (int)floor(v); v -= vi; - set_four_ipo(v, tv, lt->typev); + key_curve_position_weights(v, tv, lt->typev); } else { 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; wi= (int)floor(w); w -= wi; - set_four_ipo(w, tw, lt->typew); + key_curve_position_weights(w, tw, lt->typew); } else { tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index ec068c35c11..572c217e919 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2312,7 +2312,7 @@ void object_handle_update(Object *ob) 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 */ if(ob->type==OB_MESH) { diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index b5b2c07af9c..e8a84ccceb5 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -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); } 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); @@ -881,12 +881,12 @@ static void interpolate_particle(short type, ParticleKey keys[4], float dt, Part float temp[3]; 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); VECSUB(result->vel, result->co, temp); } 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); VECSUB(result->vel, temp, result->co); } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index be005af7827..f2c2498b39f 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -368,9 +368,9 @@ int do_colorband(ColorBand *coba, float in, float out[4]) CLAMP(fac, 0.0f, 1.0f); if(coba->ipotype==3) - set_four_ipo(fac, t, KEY_CARDINAL); + key_curve_position_weights(fac, t, KEY_CARDINAL); 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[1]= t[3]*cbd3->g +t[2]*cbd2->g +t[1]*cbd1->g +t[0]*cbd0->g; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4e5789d87e8..61192ee0882 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -127,7 +127,6 @@ #include "BKE_global.h" // for G #include "BKE_group.h" #include "BKE_image.h" -#include "BKE_key.h" //void set_four_ipo #include "BKE_lattice.h" #include "BKE_library.h" // for wich_libbase #include "BKE_main.h" // for Main diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c index 05e36160f0e..88c275d0997 100644 --- a/source/blender/render/intern/source/strand.c +++ b/source/blender/render/intern/source/strand.c @@ -122,14 +122,14 @@ void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint) spoint->dtstrandco *= 0.5f; } 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[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->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[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];