/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include "hsTimer.h" #include "plAnimTimeConvertSDLModifier.h" #include "../plSDL/plSDL.h" #include "../plInterp/plAnimTimeConvert.h" // static vars char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrFlags[]="flags"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrLastStateAnimTime[]="lastStateAnimTime"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrLoopBegin[]="loopBegin"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrLoopEnd[]="loopEnd"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrSpeed[]="speed"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrCurrentEaseCurve[]="currentEaseCurve"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrCurrentEaseBeginWorldTime[]="currentEaseBeginWorldTime"; char plAnimTimeConvertSDLModifier::AnimTimeConvertVarNames::kStrLastStateChange[]="lastStateChange"; // // Copy atcs from current state into sdl // void plAnimTimeConvertSDLModifier::IPutATC(plStateDataRecord* atcStateDataRec, plAnimTimeConvert* animTimeConvert) { plATCState *lastState = animTimeConvert->fStates.front(); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrFlags)->Set(animTimeConvert->fFlags); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrLastStateAnimTime)->Set(lastState->fStartAnimTime); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrLoopEnd)->Set(animTimeConvert->fLoopEnd); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrLoopBegin)->Set(animTimeConvert->fLoopBegin); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrSpeed)->Set(animTimeConvert->fSpeed); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrLastStateChange)->Set(lastState->fStartWorldTime); int curEaseCurve = animTimeConvert->GetCurrentEaseCurve(); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrCurrentEaseCurve)->Set(curEaseCurve); atcStateDataRec->FindVar(AnimTimeConvertVarNames::kStrCurrentEaseBeginWorldTime)->Set(curEaseCurve ? animTimeConvert->fCurrentEaseCurve->fBeginWorldTime : 0); } // // Apply state in SDL record to current animation state // //#include "../pnSceneObject/plSceneObject.h" void plAnimTimeConvertSDLModifier::ISetCurrentATC(const plStateDataRecord* atcStateDataRec, plAnimTimeConvert* objAtc) { // if ( GetTarget(0)->GetKeyName() && stricmp( GetTarget(0)->GetKeyName(), "RTDirLight01" )==0 ) // { // int xx=0; // } if (atcStateDataRec->IsUsed()) { plStateDataRecord::SimpleVarsList vars; int num=atcStateDataRec->GetUsedVars(&vars); int j; hsScalar lastStateAnimTime = 0; double lastStateChange = 0; for(j=0;jIsNamed(AnimTimeConvertVarNames::kStrFlags)) { int f; vars[j]->Get(&f); objAtc->fFlags=f; } else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrLastStateAnimTime)) vars[j]->Get(&lastStateAnimTime); else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrLoopBegin)) vars[j]->Get(&objAtc->fLoopBegin); else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrLoopEnd)) vars[j]->Get(&objAtc->fLoopEnd); else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrSpeed)) vars[j]->Get(&objAtc->fSpeed); else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrLastStateChange)) vars[j]->Get(&lastStateChange); else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrCurrentEaseCurve)) { int ces; vars[j]->Get(&ces); if (ces == plAnimTimeConvert::kEaseSpeed) { // I don't think this ever happens in practice. If it becomes necessary, // we can work around it. But unless it's actually used, I don't want // to waste the space storing a speed ease curve. objAtc->SetCurrentEaseCurve(plAnimTimeConvert::kEaseNone); } else objAtc->SetCurrentEaseCurve(ces); // The ATC will ignore an index out of range } else if (vars[j]->IsNamed(AnimTimeConvertVarNames::kStrCurrentEaseBeginWorldTime) && objAtc->fCurrentEaseCurve) vars[j]->Get(&objAtc->fCurrentEaseCurve->fBeginWorldTime); } objAtc->IClearAllStates(); objAtc->IProcessStateChange(lastStateChange, lastStateAnimTime); objAtc->fCurrentAnimTime = lastStateAnimTime; objAtc->fLastEvalWorldTime = lastStateChange; objAtc->SetFlag(plAnimTimeConvert::kForcedMove, true); } }