void Loaders::t3DSLoader::ProcessNextKeyFrameChunk(t3DModel *pModel, tChunk *pPreviousChunk) { char strKeyFrameObject[50] = {0}; float temp = 0.0f; m_CurrentChunk = new tChunk; while (pPreviousChunk->bytesRead < pPreviousChunk->length) { ReadChunk(m_CurrentChunk); switch (m_CurrentChunk->ID) { case KEYFRAME_MESH_INFO: ProcessNextKeyFrameChunk(pModel, m_CurrentChunk); break; case KEYFRAME_OBJECT_NAME: m_CurrentChunk->bytesRead += GetString(strKeyFrameObject); SetCurrentObject(pModel, strKeyFrameObject); m_CurrentChunk->bytesRead += fread(gBuffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; case KEYFRAME_START_AND_END: m_CurrentChunk->bytesRead += fread(&(pModel->numberOfFrames), 1, 4, m_FilePointer); m_CurrentChunk->bytesRead += fread(&(pModel->numberOfFrames), 1, 4, m_FilePointer); break; case PIVOT: m_CurrentChunk->bytesRead += fread(&(m_CurrentObject->vPivot), 1, sizeof(CVector3), m_FilePointer); temp = m_CurrentObject->vPivot.y; m_CurrentObject->vPivot.y = m_CurrentObject->vPivot.z; m_CurrentObject->vPivot.z = -temp; break; case POSITION_TRACK_TAG: ReadKeyFramePositions(pModel, m_CurrentChunk); break; case ROTATION_TRACK_TAG: ReadKeyFrameRotations(pModel, m_CurrentChunk); break; case SCALE_TRACK_TAG: ReadKeyFrameScales(pModel, m_CurrentChunk); break; default: m_CurrentChunk->bytesRead += fread(gBuffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; } pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead; } delete m_CurrentChunk; m_CurrentChunk = pPreviousChunk; }
int Load3ds::ProcessNextKeyFrameChunk(Chunk * aPreviousChunk) { mCurrentChunk = new Chunk; size_t numberOfBytesRead; short int lCurrentID, lCurrentParentID; while (aPreviousChunk->mBytesRead < aPreviousChunk->mLength) { ReadChunk(mCurrentChunk); switch (mCurrentChunk->mID) { case KFMESH: ProcessNextKeyFrameChunk(mCurrentChunk); break; case KFHEIRARCHY: mCurrentChunk->mBytesRead += numberOfBytesRead = fread(&lCurrentID, 1, 2, mFile); #ifdef __BIG_ENDIAN__ lCurrentID = OSReadSwapInt16(&lCurrentID,0); #endif // lCurrentID now contains the ID of the current object being described // Save this if you want to support an object hierarchy break; case KFNAME: mCurrentChunk->mBytesRead += GetString((char *)mBuffer); // mBuffer now contains the name of the object whose KF info will // be described mCurrentChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, 4, mFile); // useless, ignore #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif mCurrentChunk->mBytesRead += numberOfBytesRead = fread(&lCurrentParentID, 1, 2, mFile); #ifdef __BIG_ENDIAN__ lCurrentParentID = OSReadSwapInt16(&lCurrentParentID,0); #endif // lCurrentParentID now contains the ID of the parent of the current object // being described break; default: // unrecognized/unsupported chunk mCurrentChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, mCurrentChunk->mLength - mCurrentChunk->mBytesRead, mFile); #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif break; } aPreviousChunk->mBytesRead += mCurrentChunk->mBytesRead; } delete mCurrentChunk; mCurrentChunk = aPreviousChunk; return 1; }
int Load3ds::ProcessNextChunk(Chunk * aPreviousChunk) { mCurrentChunk = new Chunk; size_t numberOfBytesRead; while (aPreviousChunk->mBytesRead < aPreviousChunk->mLength) { // Read next chunk ReadChunk(mCurrentChunk); switch (mCurrentChunk->mID) { case VERSION: // Check version (must be 3 or less) mCurrentChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, mCurrentChunk->mLength - mCurrentChunk->mBytesRead, mFile); #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif if (*(unsigned short *) mBuffer > 0x03) exit(1107); break; case EDITMATERIAL: // Proceed to material loading function ProcessNextMaterialChunk(mCurrentChunk); break; case EDIT3DS: // Check mesh version, then proceed to mesh loading function ReadChunk(mTempChunk); mTempChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, mTempChunk->mLength - mTempChunk->mBytesRead, mFile); #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif mCurrentChunk->mBytesRead += mTempChunk->mBytesRead; if (mTempChunk->mID != MESHVERSION || *(unsigned short *)mBuffer > 0x03) exit(1107); ProcessNextChunk(mCurrentChunk); break; case EDITOBJECT: mCurrentChunk->mBytesRead += GetString((char *)mBuffer); // mBuffer now contains name of the object to be edited ProcessNextObjectChunk(mCurrentChunk); break; case EDITKEYFRAME: ProcessNextKeyFrameChunk(mCurrentChunk); break; default: // unrecognized/unsupported chunk mCurrentChunk->mBytesRead += numberOfBytesRead = fread(mBuffer, 1, mCurrentChunk->mLength - mCurrentChunk->mBytesRead, mFile); #ifdef __BIG_ENDIAN__ for (int i = 0; i < numberOfBytesRead; i++) { static_cast<short *>(mBuffer)[i] = OSReadSwapInt16(&static_cast<short*>(mBuffer)[i],0); } #endif break; } aPreviousChunk->mBytesRead += mCurrentChunk->mBytesRead; } delete mCurrentChunk; mCurrentChunk = aPreviousChunk; return 1; }
void Loaders::t3DSLoader::ProcessNextChunk(t3DModel *pModel, tChunk *pPreviousChunk) { t3DObject newObject; tMaterialInfo newTexture = {0}; int version = 0; m_CurrentChunk = new tChunk; while (pPreviousChunk->bytesRead < pPreviousChunk->length) { ReadChunk(m_CurrentChunk); switch (m_CurrentChunk->ID) { case VERSION: m_CurrentChunk->bytesRead += fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); if (version > 0x03) MessageBox(NULL, "This 3DS file is over version 3 so it may load incorrectly", "Warning", MB_OK); break; case OBJECTINFO: ReadChunk(m_TempChunk); m_TempChunk->bytesRead += fread(&version, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer); m_CurrentChunk->bytesRead += m_TempChunk->bytesRead; ProcessNextChunk(pModel, m_CurrentChunk); break; case MATERIAL: pModel->numOfMaterials++; pModel->pMaterials.push_back(newTexture); ProcessNextMaterialChunk(pModel, m_CurrentChunk); break; case OBJECT: pModel->numOfObjects++; pModel->pObject.push_back(newObject); memset(&(pModel->pObject[pModel->numOfObjects - 1]), 0, sizeof(t3DObject)); m_CurrentChunk->bytesRead += GetString(pModel->pObject[pModel->numOfObjects - 1].strName); ProcessNextObjectChunk(pModel, &(pModel->pObject[pModel->numOfObjects - 1]), m_CurrentChunk); break; case KEYFRAME: ProcessNextKeyFrameChunk(pModel, m_CurrentChunk); m_CurrentChunk->bytesRead += fread(gBuffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; default: m_CurrentChunk->bytesRead += fread(gBuffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer); break; } pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead; } delete m_CurrentChunk; m_CurrentChunk = pPreviousChunk; }