static float bez2_time( float x0, float x1, float x2, float x3, float time, float *t0, float *t1 ) { float v, t; t = *t0 + ( *t1 - *t0 ) * 0.5f; v = bezier( x0, x1, x2, x3, t ); if ( fabs( time - v ) > .0001f ) { if ( v > time ) *t1 = t; else *t0 = t; return bez2_time( x0, x1, x2, x3, time, t0, t1 ); } else return t; }
static float bez2( Key *key0, Key *key1, float time ) { float x, y, t, t0 = 0.0f, t1 = 1.0f; if ( key0->shape == SHAPE_BEZ2 ) x = key0->time + key0->param[ 2 ]; else x = key0->time + ( key1->time - key0->time ) / 3.0f; t = bez2_time( key0->time, x, key1->time + key1->param[ 0 ], key1->time, time, &t0, &t1 ); if ( key0->shape == SHAPE_BEZ2 ) y = key0->value + key0->param[ 3 ]; else y = key0->value + outgoing( (lwKey*)key0, key1 ) / 3.0f; return bezier( key0->value, y, key1->param[ 1 ] + key1->value, key1->value, t ); }
static float bez2( lwKey *key0, lwKey *key1, float time ){ float x, y, t, t0 = 0.0f, t1 = 1.0f; if ( key0->shape == ID_BEZ2 ) { x = key0->time + key0->param[ 2 ]; } else{ x = key0->time + ( key1->time - key0->time ) / 3.0f; } t = bez2_time( key0->time, x, key1->time + key1->param[ 0 ], key1->time, time, &t0, &t1 ); if ( key0->shape == ID_BEZ2 ) { y = key0->value + key0->param[ 3 ]; } else{ y = key0->value + key0->param[ 1 ] / 3.0f; } return bezier( key0->value, y, key1->param[ 1 ] + key1->value, key1->value, t ); }