44 if (track->
nkeys == nkeys)
48 if (nkeys > track->
nkeys) {
58 float tm, cm,
cp, bm,
bp, tmcm, tmcp, ksm, ksp, kdm, kdp,
c;
60 float delm[3], delp[3];
75 tm = 0.5f * (1.0f - pc->
tens);
86 for (i = 0; i <
n; ++
i) delm[i] = delp[i] = 0;
88 for (i = 0; i <
n; ++
i) delm[i] = pc->
value[i] - pp->
value[i];
91 for (i = 0; i <
n; ++
i) delp[i] = pn->
value[i] - pc->
value[i];
94 for (i = 0; i <
n; ++
i) delm[i] = delp[i];
97 for (i = 0; i <
n; ++
i) delp[i] = delm[i];
100 for (i = 0; i <
n; ++
i) {
101 ds[
i] = ksm * delm[
i] + ksp * delp[
i];
102 dd[
i] = kdm * delm[
i] + kdp * delp[
i];
109 float tm, cm,
cp, bm,
bp, tmcm, tmcp, ksm, ksp, kdm, kdp,
c;
111 float q[4], qm[4], qp[4], qa[4], qb[4];
139 cm = 1.0f - cur->
cont;
145 fp = fp + c - c * fp;
146 fn = fn + c - c * fn;
149 tm = 0.5f * (1.0f - cur->
tens);
151 bm = 1.0f - cur->
bias;
155 ksm = 1.0f - tmcm * bp * fp;
156 ksp = -tmcp * bm * fp;
157 kdm = tmcp * bp * fn;
158 kdp = tmcm * bm * fn - 1.0f;
160 for (i = 0; i < 4; i++) {
161 qa[
i] = 0.5f * (kdm * qm[
i] + kdp * qp[
i]);
162 qb[
i] = 0.5f * (ksm * qm[
i] + ksp * qp[
i]);
177 for (i = 0; i <=
index; ++
i) {
193 if (track->
nkeys <= 1)
199 nt = (float)fmod(t - t0, t1 - t0) +
t0;
211 for (i = 1; i < track->
nkeys; ++
i) {
212 if (nt < track->keys[i].frame)
219 assert((*u >= 0.0
f) && (*u <= 1.0
f));
231 *pp = track->
keys[index - 2];
234 ip = track->
nkeys - 2;
240 *p0 = track->
keys[index - 1];
243 if (index < (
int)track->
nkeys - 1) {
245 *pn = track->
keys[index + 1];
249 *pn = track->
keys[1];
256 if (pp->
frame >= 0) {
266 if (pn->
frame >= 0) {
293 if (index >= track->
nkeys) {
294 *b = !(track->
nkeys & 1);
307 float dsp[3], ddp[3], dsn[3], ddn[3];
312 for (i = 0; i < track->
type; ++
i) value[i] = 0.0
f;
320 for (i = 0; i < track->
type; ++
i) value[i] = track->
keys[0].
value[i];
323 if (index >= track->
nkeys) {
373 float ap[4],
bp[4], an[4], bn[4];
385 if (index >= track->
nkeys) {
432 switch (track->
type) {
434 for (i = 0; i < nkeys; ++
i) {
441 for (i = 0; i < nkeys; ++
i) {
449 for (i = 0; i < nkeys; ++
i) {
457 for (i = 0; i < nkeys; ++
i) {
509 switch (track->
type) {
511 for (i = 0; i < track->
nkeys; ++
i) {
518 for (i = 0; i < track->
nkeys; ++
i) {
526 for (i = 0; i < track->
nkeys; ++
i) {
534 for (i = 0; i < track->
nkeys; ++
i) {
LIB3DSAPI void lib3ds_track_resize(Lib3dsTrack *track, int nkeys)
LIB3DSAPI void lib3ds_math_cubic_interp(float *v, float *a, float *p, float *q, float *b, int n, float t)
static void tcb_read(Lib3dsKey *key, Lib3dsIo *io)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
void lib3ds_io_write_intd(Lib3dsIo *io, int32_t d)
int32_t lib3ds_io_read_intd(Lib3dsIo *io)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum GLenum type
static void pos_key_setup(int n, Lib3dsKey *pp, Lib3dsKey *pc, Lib3dsKey *pn, float *dd, float *ds)
LIB3DSAPI void lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t)
LIB3DSAPI void lib3ds_quat_exp(float c[4])
void lib3ds_io_read_vector(Lib3dsIo *io, float v[3])
GLboolean GLboolean GLboolean GLboolean a
LIB3DSAPI void lib3ds_quat_neg(float c[4])
LIB3DSAPI void lib3ds_quat_identity(float c[4])
uint32_t lib3ds_io_read_dword(Lib3dsIo *io)
static int find_index(Lib3dsTrack *track, float t, float *u)
LIB3DSAPI void lib3ds_quat_ln_dif(float c[4], float a[4], float b[4])
void lib3ds_track_read(Lib3dsTrack *track, Lib3dsIo *io)
static void track_eval_linear(Lib3dsTrack *track, float *value, float t)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
void lib3ds_io_write_vector(Lib3dsIo *io, float v[3])
void lib3ds_io_write_float(Lib3dsIo *io, float l)
LIB3DSAPI void lib3ds_track_eval_vector(Lib3dsTrack *track, float v[3], float t)
LIB3DSAPI void lib3ds_track_eval_bool(Lib3dsTrack *track, int *b, float t)
LIB3DSAPI void lib3ds_quat_ln(float c[4])
LIB3DSAPI void lib3ds_vector_zero(float c[3])
static void setup_segment(Lib3dsTrack *track, int index, Lib3dsKey *pp, Lib3dsKey *p0, Lib3dsKey *p1, Lib3dsKey *pn)
LIB3DSAPI void lib3ds_track_eval_quat(Lib3dsTrack *track, float q[4], float t)
LIB3DSAPI float lib3ds_quat_dot(float a[4], float b[4])
uint16_t lib3ds_io_read_word(Lib3dsIo *io)
float lib3ds_io_read_float(Lib3dsIo *io)
EGLSurface EGLint void ** value
LIB3DSAPI void lib3ds_track_eval_float(Lib3dsTrack *track, float *f, float t)
static void quat_for_index(Lib3dsTrack *track, int index, float q[4])
GLdouble GLdouble GLdouble GLdouble q
LIB3DSAPI void lib3ds_quat_mul(float c[4], float a[4], float b[4])
GLdouble GLdouble GLdouble b
LIB3DSAPI void lib3ds_track_free(Lib3dsTrack *track)
void lib3ds_track_write(Lib3dsTrack *track, Lib3dsIo *io)
void lib3ds_io_write_dword(Lib3dsIo *io, uint32_t d)
static void rot_key_setup(Lib3dsKey *prev, Lib3dsKey *cur, Lib3dsKey *next, float a[4], float b[4])
LIB3DSAPI void lib3ds_quat_axis_angle(float c[4], float axis[3], float angle)
void tcb_write(Lib3dsKey *key, Lib3dsIo *io)
LIB3DSAPI Lib3dsTrack * lib3ds_track_new(Lib3dsTrackType type, int nkeys)
LIB3DSAPI void lib3ds_quat_copy(float dest[4], float src[4])
void lib3ds_io_write_word(Lib3dsIo *io, uint16_t w)