void BipedManager::SetBlendAnimation(NodeCtrlArray& ncArray, float weight) { for (auto& nc : ncArray) { BlendTransformController* ctrl = reinterpret_cast<BlendTransformController*>(nc.second.get()); ctrl->SetWeight(weight); } }
//---------------------------------------------------------------------------- void Character::_CalAnimNode(Movable *mov) { const std::string &movName = mov->GetName(); Node *node = DynamicCast<Node>(mov); if (node) { BlendTransformController *btc = DynamicCast<BlendTransformController>( node->GetControllerByName("BTC")); if (!btc) { btc = new0 BlendTransformController(0, 0, true); node->AttachController(btc); btc->SetName("BTC"); } mBTCMap[movName.c_str()] = btc; for (int i = 0; i < node->GetNumChildren(); i++) { _CalAnimNode(node->GetChild(i)); } } }
//---------------------------------------------------------------------------- void Character::_AnimationBlend() { if (mLastAnimObj) { //mLastAnimObj->Update(appSeconds, elapsedSeconds); if (mLastAnimObj->IsBlendOver()) { mLastAnimObj->BeforeRemove(); mLastAnimObj = 0; } } float weight = 1.0f; if (mLastAnimObj) { weight = mLastAnimObj->BlendTime / ANIMATION_BLENDTIME; } Animation3DSkeleton *lastAnim = 0; float lastAnimTime = 0.0f; if (mLastAnimObj) { lastAnim = DynamicCast<Animation3DSkeleton>(mLastAnimObj->TheAnim); lastAnimTime = lastAnim->GetTime(); } Animation3DSkeleton *curAnim = DynamicCast<Animation3DSkeleton>(mCurPlayingAnim); float curAnimTime = 0.0f; if (curAnim) { curAnimTime = curAnim->GetTime(); } std::map<FString, KeyframeControllerPtr> *lastAnimKFCMap = 0; if (lastAnim) { lastAnimKFCMap = &(lastAnim->GetKeyframeCtrlMap()); } std::map<FString, KeyframeControllerPtr> *curAnimKFCMap = 0; bool isUseBlend = true; if (curAnim) { curAnimKFCMap = &(curAnim->GetKeyframeCtrlMap()); isUseBlend = curAnim->IsUseBlend(); } std::map<FString, BlendTransformController*>::iterator it = mBTCMap.begin(); for (; it != mBTCMap.end(); it++) { FString name = it->first; BlendTransformController *ctrl = it->second; if (lastAnimKFCMap && curAnimKFCMap) { if (isUseBlend) { ctrl->SetController01((*lastAnimKFCMap)[name], (*curAnimKFCMap)[name]); ctrl->SetWeight(weight); } else { ctrl->SetController0(0); ctrl->SetController1((*curAnimKFCMap)[name]); ctrl->SetWeight(1.0f); } } if (curAnimKFCMap) { ctrl->SetController0(0); ctrl->SetController1((*curAnimKFCMap)[name]); ctrl->SetWeight(1.0f); } if (!lastAnimKFCMap && !curAnimKFCMap) { ctrl->SetController01(0, 0); } } }