void anim_staraptor_oam_callback(oam_object *self){ FIXED period = INT_TO_FIXED(32); FIXED amplitude = INT_TO_FIXED(3); FIXED x = INT_TO_FIXED((self->private[0])++); x = FIXED_DIV(x, period); FIXED y = FIXED_COS(x); y = FIXED_MUL(y, amplitude); int y2 = FIXED_TO_INT(y); self->y2 = (s16)y2; }
void playerUpdate(PlayerData* pData, unsigned long dt) { Note note; if (pData->pNote == 0) { // end of data reached return; } pData->elapsedMsec += FIXED_MAKE(dt); if (pData->elapsedMsec < pData->t) { dprintf( "interpolate: elapsedMsec=%d t=%d\n", FIXED_TO_INT(pData->elapsedMsec), FIXED_TO_INT(pData->t)); // interpolate FIXED tt = (pData->t == 0) ? FIXED_MAKE(1) : FIXED_DIV(pData->elapsedMsec, pData->t); pData->r = lerp(pData->r0, pData->r1, tt); pData->g = lerp(pData->g0, pData->g1, tt); pData->b = lerp(pData->b0, pData->b1, tt); } else { while (pData->elapsedMsec >= pData->t) { // advance index and see if end of data reached ++pData->pNote; memcpy_P(¬e, pData->pNote, sizeof(note)); if (note.msec < 0) { // set the final color pData->r = pData->r1; pData->g = pData->g1; pData->b = pData->b1; pData->pNote = 0; return; } pData->r = pData->r0 = pData->r1; pData->g = pData->g0 = pData->g1; pData->b = pData->b0 = pData->b1; pData->r1 = FIXED_MAKE(note.r); pData->g1 = FIXED_MAKE(note.g); pData->b1 = FIXED_MAKE(note.b); pData->t = FIXED_MAKE(note.msec); pData->elapsedMsec -= pData->t; } } }