void psEffectAnchor::FillInLerps() { // this code is crap, but doing it this way allows everything else to be decently nice, clean, and efficient size_t a,b,nextIndex; for (size_t k=0; k<psEffectAnchorKeyFrame::KA_COUNT; ++k) { a = 0; while (FindNextKeyFrameWithAction(a+1, k, nextIndex)) { for (b=a+1; b<nextIndex; ++b) { switch(lerpTypes[k]) { case psEffectAnchorKeyFrame::IT_FLOOR: keyFrames->Get(b)->actions[k] = keyFrames->Get(a)->actions[k]; break; case psEffectAnchorKeyFrame::IT_CEILING: keyFrames->Get(b)->actions[k] = keyFrames->Get(nextIndex)->actions[k]; break; case psEffectAnchorKeyFrame::IT_LERP: keyFrames->Get(b)->actions[k] = lerp(keyFrames->Get(a)->actions[k], keyFrames->Get(nextIndex)->actions[k], keyFrames->Get(a)->time, keyFrames->Get(nextIndex)->time, keyFrames->Get(b)->time); break; } } a = nextIndex; } // no matter what the interpolation type (as long as we have one), just clamp the end if (lerpTypes[k] != psEffectAnchorKeyFrame::IT_NONE) { for (b=a+1; b<keyFrames->GetSize(); ++b) keyFrames->Get(b)->actions[k] = keyFrames->Get(a)->actions[k]; } } }
void psEffectObj::FillInLerps() { // this code is crap, but doing it this way allows everything else to be decently nice, clean, and efficient size_t a,b,nextIndex; for (size_t k=0; k<psEffectObjKeyFrame::KA_VEC_COUNT; ++k) { a = 0; size_t i = k - psEffectObjKeyFrame::KA_COUNT; while (FindNextKeyFrameWithAction(a+1, k, nextIndex)) { psEffectObjKeyFrame* keyA = keyFrames->Get(a); psEffectObjKeyFrame* keyNext = keyFrames->Get(nextIndex); for (b=a+1; b<nextIndex; ++b) { psEffectObjKeyFrame* keyB = keyFrames->Get(b); switch(lerpTypes[k]) { case psEffectObjKeyFrame::IT_FLOOR: { if(k < psEffectObjKeyFrame::KA_COUNT) keyB->actions[k] = keyA->actions[k]; else keyB->vecActions[i] = keyA->vecActions[i]; break; } case psEffectObjKeyFrame::IT_CEILING: { if(k < psEffectObjKeyFrame::KA_COUNT) keyB->actions[k] = keyNext->actions[k]; else keyB->vecActions[i] = keyNext->vecActions[i]; break; } case psEffectObjKeyFrame::IT_LERP: { float lerpFact = lerpFactor(keyA->time, keyNext->time, keyB->time); if(k < psEffectObjKeyFrame::KA_COUNT) keyB->actions[k] = lerp(keyA->actions[k], keyNext->actions[k], lerpFact); else keyB->vecActions[i] = lerpVec(keyA->vecActions[i], keyNext->vecActions[i], lerpFact); break; } } } a = nextIndex; } // no matter what the interpolation type (as long as we have one), just clamp the end if (lerpTypes[k] != psEffectObjKeyFrame::IT_NONE && a < keyFrames->GetSize()) { psEffectObjKeyFrame* keyA = keyFrames->Get(a); for (b = a + 1; b < keyFrames->GetSize(); ++b) { psEffectObjKeyFrame* keyB = keyFrames->Get(b); if(k < psEffectObjKeyFrame::KA_COUNT) keyB->actions[k] = keyA->actions[k]; else keyB->vecActions[i] = keyA->vecActions[i]; } } } }