void read(NIFStream *nif, bool force=false) { size_t count = nif->getInt(); if(count == 0 && !force) return; mInterpolationType = nif->getInt(); mKeys.resize(count); if(mInterpolationType == sLinearInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); } } else if(mInterpolationType == sQuadraticInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); key.mForwardValue = (nif->*getValue)(); key.mBackwardValue = (nif->*getValue)(); } } else if(mInterpolationType == sTBCInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); key.mTension = nif->getFloat(); key.mBias = nif->getFloat(); key.mContinuity = nif->getFloat(); } } else nif->file->warn("Unhandled interpolation type: "+Ogre::StringConverter::toString(mInterpolationType)); }
void read(NIFStream *nif, bool force=false) { size_t count = nif->getInt(); if(count == 0 && !force) return; mInterpolationType = nif->getInt(); mKeys.resize(count); if(mInterpolationType == sLinearInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); } } else if(mInterpolationType == sQuadraticInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); key.mForwardValue = (nif->*getValue)(); key.mBackwardValue = (nif->*getValue)(); } } else if(mInterpolationType == sTBCInterpolation) { for(size_t i = 0;i < count;i++) { KeyT<T> &key = mKeys[i]; key.mTime = nif->getFloat(); key.mValue = (nif->*getValue)(); key.mTension = nif->getFloat(); key.mBias = nif->getFloat(); key.mContinuity = nif->getFloat(); } } //\FIXME This now reads the correct amount of data in the file, but doesn't actually do anything with it. else if(mInterpolationType == sXYZInterpolation) { if (count != 1) { nif->file->fail("count should always be '1' for XYZ_ROTATION_KEY. Retrieved Value: "+Ogre::StringConverter::toString(count)); return; } //KeyGroup (see http://niftools.sourceforge.net/doc/nif/NiKeyframeData.html) //Chomp unknown and possibly unused float nif->getFloat(); for(size_t i=0;i<3;++i) { unsigned int numKeys = nif->getInt(); if(numKeys != 0) { int interpolationTypeAgain = nif->getInt(); if( interpolationTypeAgain != sLinearInterpolation) { nif->file->fail("XYZ_ROTATION_KEY's KeyGroup keyType must be '1' (Linear Interpolation). Retrieved Value: "+Ogre::StringConverter::toString(interpolationTypeAgain)); return; } for(size_t j = 0;j < numKeys;j++) { //For now just chomp these nif->getFloat(); nif->getFloat(); } } nif->file->warn("XYZ_ROTATION_KEY read, but not used!"); } } else if (mInterpolationType == 0) { if (count != 0) nif->file->fail("Interpolation type 0 doesn't work with keys"); } else nif->file->fail("Unhandled interpolation type: "+Ogre::StringConverter::toString(mInterpolationType)); }