Esempio n. 1
0
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];
            }
        }
    }
}