void VFSPlugin_LWO::read_surf(long length) { long stringlength; // Read the surface name char *name = ReadString(&stringlength); length-=stringlength; // Not sure what the source means but read it anyway char *source = ReadString(&stringlength); length-=stringlength; // Build the surface m_vb = m_fileinfo->mesh->AddVertexBuffer(); // Store the surface name m_vb->SetName(name); // Read all the subchunks surfaces has while(length > 0) length -= ReadSubChunk(); // Delete any temporary memory delete name; delete source; }
void LWOReader::ReadTMAP( LWTextureMapping* pTextureMapping, UInt32 pChunkSize ) { UInt32 dataRead = 0; UInt16 subChunkSize; UInt32 subChunkTag; UInt32 bytesHold; LWIndex env; while( dataRead < pChunkSize ) { subChunkTag = ReadSubChunk(subChunkSize,2); dataRead += sizeof(subChunkTag); // Subchunk tag. dataRead += sizeof(subChunkSize); // Subchunk size. bytesHold = dataRead; switch( subChunkTag ) { case ID_CNTR: dataRead += ReadVEC12( pTextureMapping->mCenter ); dataRead += ReadVX( env ); break; case ID_SIZE: dataRead += ReadVEC12( pTextureMapping->mSize ); dataRead += ReadVX( env ); break; case ID_ROTA: dataRead += ReadVEC12( pTextureMapping->mRotation ); dataRead += ReadVX( env ); break; case ID_OREF: dataRead += ReadS0( pTextureMapping->mReferenceObject ); break; case ID_FALL: dataRead += ReadU2( pTextureMapping->mFalloffType ); dataRead += ReadVEC12( pTextureMapping->mFalloffVector ); dataRead += ReadVX( env ); break; case ID_CSYS: dataRead += ReadU2( pTextureMapping->mCoordinateSys ); break; default: dataRead += Skip( subChunkSize ); break; } // Make sure we've read all subchunk bytes (given by the size). if( (subChunkSize - dataRead + bytesHold) > 0 ) dataRead += Skip( subChunkSize - dataRead + bytesHold ); } }
void LWOReader::ReadHEAD( LWSurfaceBlock* pSurfaceBlock, UInt32 pChunkSize ) { UInt32 dataRead = 0; UInt16 subChunkSize; UInt32 subChunkTag; UInt32 bytesHold; LWIndex env; dataRead += ReadS0( pSurfaceBlock->mOrdinalString ); while( dataRead < pChunkSize ) { subChunkTag = ReadSubChunk(subChunkSize,2); dataRead += sizeof(subChunkTag); // Subchunk tag. dataRead += sizeof(subChunkSize); // Subchunk size. bytesHold = dataRead; switch( subChunkTag ) { case ID_CHAN: dataRead += ReadID4( pSurfaceBlock->mTextureChannel ); break; case ID_ENAB: dataRead += ReadU2( pSurfaceBlock->mEnableState ); break; case ID_OPAC: dataRead += ReadU2( pSurfaceBlock->mOpacityType ); dataRead += ReadFP4( pSurfaceBlock->mOpacity ); dataRead += ReadVX( env ); break; default: dataRead += Skip( subChunkSize ); break; } // Make sure we've read all subchunk bytes (given by the size). if( (subChunkSize - dataRead + bytesHold) > 0 ) dataRead += Skip( subChunkSize - dataRead + bytesHold ); } }
void LWOReader::ReadBLOK( LWSurface* pSurface, UInt32 pChunkSize ) { UInt32 dataRead = 0; UInt16 subChunkSize; UInt32 subChunkTag; UInt32 bytesHold; LWSurfaceBlock* newSurfaceBlock = GD_NEW(LWSurfaceBlock, this, "SurfaceBlock"); //dataRead += ReadS0( newSurfaceBlock->mOrdinalString ); // Read all subchunks while( dataRead < pChunkSize ) { subChunkTag = ReadSubChunk(subChunkSize,1); dataRead += sizeof(subChunkTag); // Subchunk tag. dataRead += sizeof(subChunkSize); // Subchunk size. bytesHold = dataRead; switch( subChunkTag ) { case ID_IMAP: case ID_PROC: case ID_GRAD: case ID_SHDR: newSurfaceBlock->mType = subChunkTag; ReadHEAD( newSurfaceBlock, subChunkSize ); dataRead += subChunkSize; break; case ID_TMAP: ReadTMAP( &newSurfaceBlock->mTextureMapping, subChunkSize ); dataRead += subChunkSize; break; case ID_PROJ: dataRead += ReadU2( newSurfaceBlock->mImageMap.mProjectionMode ); break; case ID_AXIS: dataRead += ReadU2( newSurfaceBlock->mImageMap.mProjectionAxis ); break; case ID_IMAG: newSurfaceBlock->mImageMap.mValid = true; dataRead += ReadVX( newSurfaceBlock->mImageMap.mImageMap ); break; case ID_WRAP: dataRead += ReadU2( newSurfaceBlock->mImageMap.mWrapModeWidth ); dataRead += ReadU2( newSurfaceBlock->mImageMap.mWrapModeHeight ); break; case ID_VMAP: dataRead += ReadS0( newSurfaceBlock->mImageMap.mUVVertexMapName ); break; default: dataRead += Skip( subChunkSize ); break; } // Make sure we've read all subchunk bytes (given by the size). if( (subChunkSize - dataRead + bytesHold) > 0 ) dataRead += Skip( subChunkSize - dataRead + bytesHold ); } pSurface->mBlocks.push_back( newSurfaceBlock ); }
void LWOReader::ReadSURF( UInt32 pChunkSize ) { UInt32 dataRead = 0; UInt16 subChunkSize; UInt32 subChunkTag; UInt32 bytesHold; LWIndex env; LWSurface* newSurface = GD_NEW(LWSurface, this, "Surface"); dataRead += ReadS0( newSurface->mSurfaceName ); dataRead += ReadS0( newSurface->mSurfaceFile ); // Read all subchunks while( dataRead < pChunkSize ) { if( (pChunkSize - dataRead) < 6 ) { dataRead += Skip( pChunkSize - dataRead ); return; } subChunkTag = ReadSubChunk(subChunkSize); dataRead += sizeof(subChunkTag); // Subchunk tag. dataRead += sizeof(subChunkSize); // Subchunk size. bytesHold = dataRead; switch( subChunkTag ) { case ID_COLR: dataRead += ReadCOL12( newSurface->mBaseColor ); dataRead += ReadVX( env ); break; case ID_DIFF: dataRead += ReadFP4( newSurface->mDiffuse ); dataRead += ReadVX( env ); break; case ID_LUMI: dataRead += ReadFP4( newSurface->mLuminosity ); dataRead += ReadVX( env ); break; case ID_SPEC: dataRead += ReadFP4( newSurface->mSpecular ); dataRead += ReadVX( env ); break; case ID_REFL: dataRead += ReadFP4( newSurface->mReflection ); dataRead += ReadVX( env ); break; case ID_TRAN: dataRead += ReadFP4( newSurface->mTransparency ); dataRead += ReadVX( env ); break; case ID_TRNL: dataRead += ReadFP4( newSurface->mTranslucency ); dataRead += ReadVX( env ); break; case ID_GLOS: dataRead += ReadFP4( newSurface->mSpecularGlossiness ); dataRead += ReadVX( env ); break; case ID_SHRP: dataRead += ReadFP4( newSurface->mDiffuseSharpness ); dataRead += ReadVX( env ); break; case ID_BUMP: dataRead += ReadFP4( newSurface->mBumpStrength ); dataRead += ReadVX( env ); break; case ID_SIDE: dataRead += ReadU2( newSurface->mPolySide ); break; case ID_SMAN: dataRead += ReadANG4( newSurface->mMaxSmoothingAngle ); break; case ID_RFOP: dataRead += ReadU2( newSurface->mReflectionOptions ); break; case ID_RIMG: dataRead += ReadVX( newSurface->mReflectionMapImage ); break; case ID_RSAN: dataRead += ReadANG4( newSurface->mReflMapSeamAngle ); dataRead += ReadVX( env ); break; case ID_RBLR: dataRead += ReadFP4( newSurface->mReflBlurPercent ); dataRead += ReadVX( env ); break; case ID_CLRH: dataRead += ReadFP4( newSurface->mColorHighlights ); dataRead += ReadVX( env ); break; case ID_TROP: dataRead += ReadU2( newSurface->mTransparencyOptions ); dataRead += Skip( subChunkSize - sizeof(UInt16) ); break; case ID_CLRF: dataRead += ReadFP4( newSurface->mColorFilter ); dataRead += ReadVX( env ); break; case ID_ADTR: dataRead += ReadFP4( newSurface->mAdditiveTransparency ); dataRead += ReadVX( env ); break; case ID_ALPH: dataRead += ReadU2( newSurface->mAlphaMode ); dataRead += ReadFP4( newSurface->mAlphaValue ); break; case ID_BLOK: ReadBLOK( newSurface, subChunkSize ); dataRead += subChunkSize; break; case ID_VCOL: case ID_LINE: case ID_GLOW: case ID_TBLR: case ID_TIMG: case ID_RIND: default: dataRead += Skip( subChunkSize ); break; } // Make sure we've read all subchunk bytes (given by the size). if( (subChunkSize - dataRead + bytesHold) > 0 ) dataRead += Skip( subChunkSize - dataRead + bytesHold ); } mObject->mSurfaces.push_back( newSurface ); }
void LWOReader::ReadCLIP( UInt32 pChunkSize ) { UInt32 dataRead = 0; UInt32 subChunkTag; UInt16 subChunkSize; UInt32 bytesHold; LWClip* newClip = GD_NEW(LWClip, this, "Clip"); dataRead += ReadU4( newClip->mIndex ); // Read all subchunks while( dataRead < pChunkSize ) { if( (pChunkSize - dataRead) < 6 ) { dataRead += Skip( pChunkSize - dataRead ); return; } subChunkTag = ReadSubChunk(subChunkSize); dataRead += sizeof(subChunkTag); // Subchunk tag. dataRead += sizeof(subChunkSize); // Subchunk size. bytesHold = dataRead; switch( subChunkTag ) { case ID_STIL: dataRead += ReadS0( newClip->mStillImage ); break; case ID_XREF: dataRead += ReadVX( newClip->mXRefIndex ); dataRead += ReadS0( newClip->mXRefInstName ); break; case ID_ISEQ: case ID_ANIM: case ID_STCC: case ID_TIME: case ID_CONT: case ID_BRIT: case ID_SATR: case ID_HUE: case ID_GAMM: case ID_NEGA: case ID_IFLT: case ID_PFLT: default: dataRead += Skip( subChunkSize ); break; } // Make sure we've read all subchunk bytes (given by the size). if( (subChunkSize - dataRead + bytesHold) > 0 ) dataRead += Skip( subChunkSize - dataRead + bytesHold ); } mObject->mClips.push_back( newClip ); }