- Main Page
- Related Pages
- Modules
- Classes
- Examples

# geometryCacheFile.h

    #ifndef _GEOMETRY_CACHE_FILE
    #define _GEOMETRY_CACHE_FILE

    //-
    // ==========================================================================
    // Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
    //
    // Use of this software is subject to the terms of the Autodesk
    // license agreement provided at the time of installation or download,
    // or which otherwise accompanies this software in either electronic
    // or hard copy form.
    // ==========================================================================
    //+

    //
    // File Name: geometryCacheFile.h
    //
    // Description :
    //      An interface used for reading cache file data, storing it
    //      and converting it to ASCII.  The geometry cache file data is
    //      currently being stored in the Maya IFF format.  However, note that
    //      the file format is subject to change in future versions of Maya.
    //      The following is the typical tag format for a single file cache.
    //
    //  |---CACH (Group)    // Header
    //  |     |---VRSN      // Version Number (char*)
    //  |     |---STIM      // Start Time of the Cache File (int)
    //  |     |---ETIM      // End Time of the Cache File (int)
    //  |
    //  |---MYCH (Group)    // 1st Time
    //  |     |---TIME      // Time (int)
    //  |     |---CHNM      // 1st Channel Name (char*)
    //  |     |---SIZE      // 1st Channel Size
    //  |     |---DVCA      // 1st Channel Data (Double Vector Array)
    //  |     |---CHNM      // n-th Channel Name
    //  |     |---SIZE      // n-th Channel Size
    //  |     |---DVCA      // n-th Channel Data (Double Vector Array)
    //  |     |..
    //  |
    //  |---MYCH (Group)    // 2nd Time
    //  |     |---TIME      // Time
    //  |     |---CHNM      // 1st Channel Name
    //  |     |---SIZE      // 1st Channel Size
    //  |     |---DVCA      // 1st Channel Data (Double Vector Array)
    //  |     |---CHNM      // n-th Channel Name
    //  |     |---SIZE      // n-th Channel Size
    //  |     |---DVCA      // n-th Channel Data (Double Vector Array)
    //  |     |..
    //  |
    //  |---..
    //  |
    //
    //      The above example shows a cache file containing channels of double
    //      vector array data.  Maya can also store float vector array data,
    //      using the IFF key "FVCA".
    //
    //      In a multiple file caches, the only difference is that after the
    //      header "CACH" group, there is only one MYCH group and there is no
    //      TIME chunk. Note that the value of the header's STIM and ETIM chunk
    //      are only relevant with multiple file caches.
    //

    // Project includes
    //
    #include <geometryCacheBlockBase.h>

    // Maya includes
    //
    #include <maya/MString.h>
    #include <maya/MIffFile.h>

    // Other includes
    //
    #include <list>

    // Typedef of STL containers to store our chunks of data
    //
    typedef std::list<geometryCacheBlockBase*> cacheBlockList;
    typedef std::list<geometryCacheBlockBase*>::iterator cacheBlockIterator;

    class geometryCacheFile
    {
    public:
        // Constructor / Destructor methods
        //
                    geometryCacheFile( const MString& fileName, MIffFile* iffFile );
        virtual     ~geometryCacheFile();

        // Accessor methods
        //
        const MString&  fileName();
        const bool&     isRead();

        // Read cache method
        //
        bool    readCacheFiles();

        // Convert cache method
        //
        bool    convertToAscii();

    private:
        // Read header methods
        //
        bool    readHeaderGroup( MStatus& status );
        bool    readHeaderVersion();
        bool    readHeaderTimeRange();

        // Read channel methods
        //
        bool    readChannelGroup( MStatus& groupStatus );

        bool    readChannelTime();
        bool    readChannel( MStatus& channelStatus );
        bool    readChannelName( MStatus& channelStatus );
        bool    readChannelData();

        // These methods are for modifying the data in the
        // cacheBlockList member called "blockList"
        //
        void    storeCacheBlock( const MString& tag );
        void    storeCacheBlock( const MString& tag, const int& value );
        void    storeCacheBlock( const MString& tag, const MString& value  );
        void    storeCacheBlock( const MString& tag,
                            const double* value,
                            const uint& size );
        void    storeCacheBlock( const MString& tag,
                            const float* value,
                            const uint& size );

        // Data members
        //
        MIffFile*           iffFilePtr;     // Object that reads the cache files
        MString             cacheFileName;  // The cache file name
        bool                readStatus;     // Indicates if the file was read
        cacheBlockList      blockList;      // List of read data blocks from file
    };

    #endif