| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /*
- ** Command & Conquer Generals(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- ////////////////////////////////////////////////////////////////////////////////
- // //
- // (c) 2001-2003 Electronic Arts Inc. //
- // //
- ////////////////////////////////////////////////////////////////////////////////
- // FILE: Anim2D.h /////////////////////////////////////////////////////////////////////////////////
- // Author: Colin Day, July 2002
- // Desc: A collection of 2D images to make animation
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- #pragma once
- #ifndef __ANIM_2D_H_
- #define __ANIM_2D_H_
- // INCLUDES ///////////////////////////////////////////////////////////////////////////////////////
- #include "Common/Snapshot.h"
- // FORWARD REFERENCES /////////////////////////////////////////////////////////////////////////////
- class Image;
- // ------------------------------------------------------------------------------------------------
- // ------------------------------------------------------------------------------------------------
- enum Anim2DMode
- {
-
- ANIM_2D_INVALID = 0,
- ANIM_2D_ONCE,
- ANIM_2D_ONCE_BACKWARDS,
- ANIM_2D_LOOP,
- ANIM_2D_LOOP_BACKWARDS,
- ANIM_2D_PING_PONG,
- ANIM_2D_PING_PONG_BACKWARDS,
- // dont' forget to add new animation mode names to Anim2DModeNames[] below
- ANIM_2D_NUM_MODES // keep this last please
- };
- #ifdef DEFINE_ANIM_2D_MODE_NAMES
- static char *Anim2DModeNames[] =
- {
- "NONE",
- "ONCE",
- "ONCE_BACKWARDS",
- "LOOP",
- "LOOP_BACKWARDS",
- "PING_PONG",
- "PING_PONG_BACKWARDS",
- NULL
- };
- #endif
- // ------------------------------------------------------------------------------------------------
- /** A template of a 2D animation */
- // ------------------------------------------------------------------------------------------------
- class Anim2DTemplate : public MemoryPoolObject
- {
- MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(Anim2DTemplate, "Anim2DTemplate")
- public:
- Anim2DTemplate( AsciiString name );
- //virtual ~Anim2DTemplate( void );
- AsciiString getName( void ) const { return m_name; }
- const Image *getFrame( UnsignedShort frameNumber ) const;
- UnsignedShort getNumFrames( void ) const { return m_numFrames; }
- UnsignedShort getNumFramesBetweenUpdates( void ) const { return m_framesBetweenUpdates; }
- Anim2DMode getAnimMode( void ) const { return m_animMode; }
- Bool isRandomizedStartFrame( void ) const { return m_randomizeStartFrame; }
- // list access for use by the Anim2DCollection only
- void friend_setNextTemplate( Anim2DTemplate *animTemplate ) { m_nextTemplate = animTemplate; }
- Anim2DTemplate *friend_getNextTemplate( void ) const { return m_nextTemplate; };
-
- // INI methods
- const FieldParse *getFieldParse( void ) const { return s_anim2DFieldParseTable; }
- void storeImage( const Image *image ); ///< store image in next available slot
- void allocateImages( UnsignedShort numFrames ); ///< allocate the array of image pointers to use
- protected:
- static void parseImage( INI *ini, void *instance, void *store, const void *userData );
- static void parseNumImages( INI *ini, void *instance, void *store, const void *userData );
- static void parseImageSequence( INI *ini, void *instance, void *store, const void *userData );
- protected:
- enum { NUM_FRAMES_INVALID = 0 }; ///< initialization value for num frames
- Anim2DTemplate* m_nextTemplate; ///< next animation in collections animation list
- AsciiString m_name; ///< name of this 2D animation
- const Image** m_images; ///< array of image pointers that make up this animation
- UnsignedShort m_numFrames; ///< total number of frames in this animation
- UnsignedShort m_framesBetweenUpdates; ///< frames between frame updates
- Anim2DMode m_animMode; ///< the animation mode
- Bool m_randomizeStartFrame; ///< randomize animation instance start frames
- protected:
- static const FieldParse s_anim2DFieldParseTable[]; ///< the parse table for INI definition
- };
- // ------------------------------------------------------------------------------------------------
- // ------------------------------------------------------------------------------------------------
- enum Anim2DStatus
- {
- ANIM_2D_STATUS_NONE = 0x00,
- ANIM_2D_STATUS_FROZEN = 0x01,
- ANIM_2D_STATUS_REVERSED = 0x02, // used for ping pong direction tracking
- ANIM_2D_STATUS_COMPLETE = 0x04, // set when uni-directional things reach their last frame
- };
- // ------------------------------------------------------------------------------------------------
- // ------------------------------------------------------------------------------------------------
- class Anim2D : public MemoryPoolObject,
- public Snapshot
- {
- friend class Anim2DCollection;
- MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( Anim2D, "Anim2D" );
- public:
- Anim2D( Anim2DTemplate *animTemplate, Anim2DCollection *collectionSystem );
- // virtual destructor prototype provided by memory pool object
- UnsignedShort getCurrentFrame( void ) const { return m_currentFrame; } ///< get our current frame #
- void setCurrentFrame( UnsignedShort frame ); ///< set the current frame #
- void randomizeCurrentFrame( void ); ///< randomize the current frame #
- void reset( void ); ///< reset the current frame to the "start"
- void setStatus( UnsignedByte statusBits ); ///< set status bit(s)
- void clearStatus( UnsignedByte statusBits ); ///< clear status bit(s)
- UnsignedByte getStatus( void ) const { return m_status; } ///< return status bits(s)
- void setAlpha( Real alpha ) { m_alpha = alpha; } ///< set alpha value
- Real getAlpha( void ) const { return m_alpha; } ///< return the current alpha value
- //Allows you to play a segment of an animation.
- void setMinFrame( UnsignedShort frame ) { m_minFrame = frame; }
- void setMaxFrame( UnsignedShort frame ) { m_maxFrame = frame; }
- // info about the size of the current frame
- UnsignedInt getCurrentFrameWidth( void ) const; ///< return natural width of image in the current frame
- UnsignedInt getCurrentFrameHeight( void ) const; ///< return natural height of image in the current frame
- const Anim2DTemplate *getAnimTemplate( void ) const { return m_template; } ///< return our template
- void draw( Int x, Int y ); ///< draw iamge at location using natural width/height
- void draw( Int x, Int y, Int width, Int height ); ///< draw image at location using forced width/height
- protected:
- // snapshot methods
- virtual void crc( Xfer *xfer ) { }
- virtual void xfer( Xfer *xfer );
- virtual void loadPostProcess( void ) { }
- void tryNextFrame( void ); ///< we've just drawn ... try to update our frame if necessary
- UnsignedShort m_currentFrame; ///< current frame of our animation
- UnsignedInt m_lastUpdateFrame; ///< last frame we updated on
- Anim2DTemplate *m_template; ///< pointer back to the template that defines this animation
- UnsignedByte m_status; ///< status bits (see Anim2DStatus)
- UnsignedShort m_minFrame; ///< min animation frame used inclusively.
- UnsignedShort m_maxFrame; ///< max animation frame used inclusively.
- UnsignedInt m_framesBetweenUpdates; ///< duration between each frame.
- Real m_alpha;
- Anim2DCollection *m_collectionSystem; ///< system collection (if any) we're registered with
- Anim2D *m_collectionSystemNext; ///< system instance tracking list
- Anim2D *m_collectionSystemPrev; ///< system instance tracking list
- };
- // ------------------------------------------------------------------------------------------------
- // ------------------------------------------------------------------------------------------------
- class Anim2DCollection : public SubsystemInterface
- {
- public:
- Anim2DCollection( void );
- virtual ~Anim2DCollection( void );
- virtual void init( void ); ///< initialize system
- virtual void reset( void ) { }; ///< reset system
- virtual void update( void ); ///< update system
- Anim2DTemplate *findTemplate( const AsciiString& name ); ///< find animation template
- Anim2DTemplate *newTemplate( const AsciiString& name ); ///< allocate a new template to be loaded
- void registerAnimation( Anim2D *anim ); ///< register animation with system
- void unRegisterAnimation( Anim2D *anim ); ///< un-register animation from system
- Anim2DTemplate* getTemplateHead() const { return m_templateList; }
- Anim2DTemplate* getNextTemplate( Anim2DTemplate *animTemplate ) const;
- protected:
- Anim2DTemplate *m_templateList; ///< list of available animation templates
- Anim2D *m_instanceList; ///< list of all the anim 2D instance we're tracking
- };
- // EXTERNALS //////////////////////////////////////////////////////////////////////////////////////
- extern Anim2DCollection *TheAnim2DCollection;
- #endif // end __ANIM_2D_H_
|