AnimationPtr ModelInstance::playOneShot(const std::string anim, float speed, float fadeInTime, float fadeOutTime, TimeFunction* control) { CoreAnimationPtrC coreAnim = this->findAnimToUse(anim); if(nearZero(coreAnim->duration())) { return m_mixer->oneshot(AnimationPtr(new Animation(coreAnim, speed))); } // Note: same as in playCycle. TimeFunction* pWeightFun = new FadeOutTF(fadeOutTime/coreAnim->duration(), new FadeInTF(fadeInTime/coreAnim->duration(), new ConstantTF(1.0f))); return m_mixer->oneshot(AnimationPtr(new Animation(m_coremdl->animation(anim), speed, control, pWeightFun))); }
AnimationPtr ModelInstance::playCycle(const std::string anim, float speed, float fadeInTime, float weight, TimeFunction* control) { CoreAnimationPtrC coreAnim = this->findAnimToUse(anim); if(nearZero(coreAnim->duration())) { return m_mixer->play(AnimationPtr(new Animation(coreAnim, speed))); } // Note: as the FadeInTF uses normalized-time, we need to divide our // absolue time by the animation's duration in order to normalize it. TimeFunction* pWeightFun = new FadeInTF(fadeInTime/coreAnim->duration(), new ConstantTF(weight)); return m_mixer->play(AnimationPtr(new Animation(coreAnim, speed, control, pWeightFun))); }
AnimationPtr Location::findAnimation(const char *name) { for (AnimationList::iterator it = _animations.begin(); it != _animations.end(); ++it) if (!scumm_stricmp((*it)->_name, name)) return *it; return AnimationPtr(); }
void ProgramParser_br::parseRValue(ScriptVar &v, const char *str) { if (isdigit(static_cast<unsigned char>(str[0])) || str[0] == '-') { v.setImmediate(atoi(str)); return; } int index = _program->findLocal(str); if (index != -1) { v.setLocal(&ctxt.locals[index]); return; } AnimationPtr a; if (str[1] == '.') { a = _vm->_location.findAnimation(&str[2]); if (!a) { error("unknown animation '%s' in script", &str[2]); } } else a = AnimationPtr(ctxt.a); if (str[0] == 'X') { v.setField(a.get(), &Animation::getX); } else if (str[0] == 'Y') { v.setField(a.get(), &Animation::getY); } else if (str[0] == 'Z') { v.setField(a.get(), &Animation::getZ); } else if (str[0] == 'F') { v.setField(a.get(), &Animation::getF); } else if (str[0] == 'N') { v.setImmediate(a->getFrameNum()); } else if (str[0] == 'R') { v.setRandom(atoi(&str[1])); } else if (str[0] == 'L') { #if 0 // disabled because no references to lip sync has been found in the scripts v.setField(&_vm->_lipSyncVal); #endif warning("Lip sync instruction encountered! Please notify the team"); } }
void LocationParser_ns::parseAnimation(AnimationList &list, char *name) { debugC(5, kDebugParser, "parseAnimation(name: %s)", name); if (_vm->_location.findAnimation(name)) { _zoneProg++; _script->skip("endanimation"); return; } AnimationPtr a(new Animation); _zoneProg++; strncpy(a->_name, name, ZONENAME_LENGTH); a->_flags |= kFlagsIsAnimation; list.push_front(AnimationPtr(a)); ctxt.a = a; _parser->pushTables(&_locationAnimParsers, _locationAnimStmt); }
void Node::setAnimation(AnimationPtr const & animation) { setAnimation(AnimationPtr(new Animation(*animation))); }
AnimationPtr AssetLoader::LoadAnimation(std::string fileName) { FILE * f = nullptr; fopen_s(&f,fileName.c_str(),"rb"); unsigned int number; fread_s(&number,4,4,1,f); if(number != 2) return AnimationPtr(true); float dur; float fps; unsigned int numOfBones; fread_s(&dur,4,4,1,f); fread_s(&fps,4,4,1,f); fread_s(&numOfBones,4,4,1,f); if(numOfBones > MAX_BONES) return AnimationPtr(true); AnimationPtr ptr(Heap::GetPtr()->Animations.New()); Animation * anim = ptr.Get(); anim->Init(); anim->duration = dur; anim->fps = fps; anim->numberOfBoneChannels = numOfBones; fread_s(anim->channelHaveData,sizeof(bool) * anim->numberOfBoneChannels,sizeof(bool),anim->numberOfBoneChannels,f); DirectX::XMFLOAT3 tempVec; DirectX::XMFLOAT4 tempQuat; for (unsigned int i = 0; i< anim->numberOfBoneChannels; i++) { BoneAnimationData & data = anim->channels[i]; fread_s(&data.numberOfTranslationKeys,4,4,1,f); data.translationKeys = new TranslationKey[data.numberOfTranslationKeys]; for (unsigned int t = 0; t < data.numberOfTranslationKeys; t++) { fread_s(&data.translationKeys[t].time,4,4,1,f); fread_s(&data.translationKeys[t].val,12,12,1,f); } fread_s(&data.numberOfRotationKeys,4,4,1,f); data.rotationKeys = new RotationKey[data.numberOfRotationKeys]; for (unsigned int r = 0; r < data.numberOfRotationKeys; r++) { fread_s(&data.rotationKeys[r].time,4,4,1,f); fread_s(&data.rotationKeys[r].val,16,16,1,f); } fread_s(&data.numberOfScalingKeys,4,4,1,f); data.scalingKeys = new ScalingKey[data.numberOfScalingKeys]; for (unsigned int s = 0; s < data.numberOfScalingKeys; s++) { fread_s(&data.scalingKeys[s].time,4,4,1,f); fread_s(&data.scalingKeys[s].val,12,12,1,f); } } fclose(f); return ptr; }