//-------------------------------------------------------------------------- VertexPoseKeyFrame* VertexAnimationTrack::createVertexPoseKeyFrame(Real timePos) { if (mAnimationType != VAT_POSE) { OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Pose keyframes can only be created on vertex tracks of type pose.", "VertexAnimationTrack::createVertexPoseKeyFrame"); } return static_cast<VertexPoseKeyFrame*>(createKeyFrame(timePos)); }
//----------------------------------------------------------------------------// KeyFrame* Affector::createKeyFrame(float position, const String& value, KeyFrame::Progression progression, const String& sourceProperty) { KeyFrame* ret = createKeyFrame(position); ret->setValue(value); ret->setProgression(progression); ret->setSourceProperty(sourceProperty); return ret; }
vector<Mesh*> ModelLoaderOBJ::loadKeyFrame(const FileName &fileName) const { FileText::LINES rawLines = FileText::readLines(fileName); const LINES lines = getLines(rawLines); const LINES nc = stripComments(lines); const vector<vec3> verticesArray = read<vec3>(nc,"v", parseVertex); const vector<vec3> normalsArray = read<vec3>(nc,"vn",parseVertex); const vector<vec2> texcoordsArray = read<vec2>(nc,"vt",parseTexCoord); const vector<Face> facesArray = read<Face>(nc,"f", parseFace); return createKeyFrame(new Mesh(verticesArray, normalsArray, texcoordsArray, facesArray)); }
//-------------------------------------------------------------------------- TransformKeyFrame* NodeAnimationTrack::createNodeKeyFrame(Real timePos) { return static_cast<TransformKeyFrame*>(createKeyFrame(timePos)); }
//-------------------------------------------------------------------------- NumericKeyFrame* NumericAnimationTrack::createNumericKeyFrame(Real timePos) { return static_cast<NumericKeyFrame*>(createKeyFrame(timePos)); }
bool AnimationTrack::loadFromXML(TiXmlElement *xmlNodeTrack) { xmlNodeTrack->QueryStringAttribute("name",&m_name); stringc dataType; xmlNodeTrack->QueryStringAttribute("dataType",&dataType); m_dataType = stringToDataType(dataType); TiXmlHandle hXmlNode(xmlNodeTrack); //load keyframes data TiXmlElement* xmlNodeTimes = hXmlNode.FirstChild( "times" ).Element(); if(xmlNodeTimes!=0) { int kfNum = 0; //times const char* timesStr = xmlNodeTimes->GetText(); if(timesStr!=0) { float *times=0; kfNum = StringUtil::splitOutFloats(times, timesStr); for(int i=0; i<kfNum; ++i) { KeyFrame* kf = createKeyFrame(); if(kf!=0) { kf->setTime(times[i]); m_keyFrames.push_back(kf); } } delete times; } //at least has 1 kf if(kfNum>0) { //KF datas float *kfDatas=0; TiXmlElement* xmlNodeKFs = hXmlNode.FirstChild( "keyframes" ).Element(); if(xmlNodeKFs!=0) { int valueNum = StringUtil::splitOutFloats(kfDatas, xmlNodeKFs->GetText()); u32 dataElemNum = m_keyFrames[0]->getDataElementNum(); FLT_ASSERT(dataElemNum>0 && valueNum/dataElemNum==kfNum); for(int i=0; i<kfNum; ++i) { m_keyFrames[i]->loadValue(kfDatas, i); } delete kfDatas; } //interp datas TiXmlElement* xmlNodeInterps = hXmlNode.FirstChild( "interps" ).Element(); if(xmlNodeInterps!=0) { array_t<stringc> strs; strs = StringUtil::split(xmlNodeInterps->GetText(), ",", kfNum); FLT_ASSERT(strs.size()==kfNum); for(int i=0; i<kfNum; ++i) { m_keyFrames[i]->setInterpTypeByString(strs[i]); } } } //create a computed frame, for interpolation m_computedFrame = createKeyFrame(); } return true; }