//--------------------------------------------------------------------------- // CROFFSystem::InitROFF2 // Handles stuffing the roff data in the CROFF object for version 2 // // INPUTS: // pass in the file data and the object to stuff the data into. // // RETURN: // returns initialization success or failure //--------------------------------------------------------------------------- qboolean CROFFSystem::InitROFF2( unsigned char *data, CROFF *obj ) { int i; TROFF2Header *hdr = (TROFF2Header *)data; obj->mROFFEntries = hdr->mCount; obj->mMoveRotateList = new TROFF2Entry[(hdr->mCount)]; obj->mFrameTime = hdr->mFrameRate; obj->mLerp = 1000 / hdr->mFrameRate; obj->mNumNoteTracks = hdr->mNumNotes; if ( obj->mMoveRotateList != 0 ) { // Step past the header to get to the goods TROFF2Entry *roff_data = ( TROFF2Entry *)&hdr[1]; // Copy all of the goods into our ROFF cache for ( i = 0; i < hdr->mCount; i++ ) { VectorCopy( roff_data[i].mOriginOffset, obj->mMoveRotateList[i].mOriginOffset ); VectorCopy( roff_data[i].mRotateOffset, obj->mMoveRotateList[i].mRotateOffset ); obj->mMoveRotateList[i].mStartNote = roff_data[i].mStartNote; obj->mMoveRotateList[i].mNumNotes = roff_data[i].mNumNotes; } FixBadAngles(obj); if (obj->mNumNoteTracks) { int size; char *ptr, *start; ptr = start = (char *)&roff_data[i]; size = 0; for(i=0;i<obj->mNumNoteTracks;i++) { size += strlen(ptr) + 1; ptr += strlen(ptr) + 1; } obj->mNoteTrackIndexes = new char *[obj->mNumNoteTracks]; ptr = obj->mNoteTrackIndexes[0] = new char[size]; memcpy(obj->mNoteTrackIndexes[0], start, size); for(i=1;i<obj->mNumNoteTracks;i++) { ptr += strlen(ptr) + 1; obj->mNoteTrackIndexes[i] = ptr; } } } else { return qfalse; } return qtrue; }
//--------------------------------------------------------------------------- // CROFFSystem::InitROFF // Handles stuffing the roff data in the CROFF object // // INPUTS: // pass in the file data and the object to stuff the data into. // // RETURN: // returns initialization success or failure //--------------------------------------------------------------------------- qboolean CROFFSystem::InitROFF( unsigned char *data, CROFF *obj ) { int i; TROFFHeader *hdr = (TROFFHeader *)data; if (LittleLong(hdr->mVersion) == ROFF_NEW_VERSION) { return InitROFF2(data, obj); } obj->mROFFEntries = LittleLong(hdr->mCount); obj->mMoveRotateList = new TROFF2Entry[((int)LittleFloat(hdr->mCount))]; obj->mFrameTime = 1000 / ROFF_SAMPLE_RATE; // default 10 hz obj->mLerp = ROFF_SAMPLE_RATE; obj->mNumNoteTracks = 0; obj->mNoteTrackIndexes = 0; if ( obj->mMoveRotateList != 0 ) { // Step past the header to get to the goods TROFFEntry *roff_data = ( TROFFEntry *)&hdr[1]; // Copy all of the goods into our ROFF cache for ( i = 0; i < LittleLong(hdr->mCount); i++ ) { #ifdef Q3_BIG_ENDIAN obj->mMoveRotateList[i].mOriginOffset[0] = LittleFloat(roff_data[i].mOriginOffset[0]); obj->mMoveRotateList[i].mOriginOffset[1] = LittleFloat(roff_data[i].mOriginOffset[1]); obj->mMoveRotateList[i].mOriginOffset[2] = LittleFloat(roff_data[i].mOriginOffset[2]); obj->mMoveRotateList[i].mRotateOffset[0] = LittleFloat(roff_data[i].mRotateOffset[0]); obj->mMoveRotateList[i].mRotateOffset[1] = LittleFloat(roff_data[i].mRotateOffset[1]); obj->mMoveRotateList[i].mRotateOffset[2] = LittleFloat(roff_data[i].mRotateOffset[2]); #else VectorCopy( roff_data[i].mOriginOffset, obj->mMoveRotateList[i].mOriginOffset ); VectorCopy( roff_data[i].mRotateOffset, obj->mMoveRotateList[i].mRotateOffset ); #endif obj->mMoveRotateList[i].mStartNote = -1; obj->mMoveRotateList[i].mNumNotes = 0; } FixBadAngles(obj); } else { return qfalse; } return qtrue; }