예제 #1
0
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;
    
}
예제 #2
0
파일: player.c 프로젝트: 8bitter/Arduino
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(&note, 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;
    }
  }
}