コード例 #1
0
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;
}
コード例 #2
0
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 );
    }
}
コード例 #3
0
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 );
    }
}
コード例 #4
0
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 );
}
コード例 #5
0
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 );
}
コード例 #6
0
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 );
}