/* =========================================================================== Doom 3 BFG Edition GPL Source Code Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code"). Doom 3 BFG Edition Source Code 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. Doom 3 BFG Edition Source Code 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 Doom 3 BFG Edition Source Code. If not, see . In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __SWF_SPRITEINSTANCE_H__ #define __SWF_SPRITEINSTANCE_H__ /* ================================================ There can be multiple instances of a single sprite running ================================================ */ class idSWFSpriteInstance { public: idSWFSpriteInstance(); ~idSWFSpriteInstance(); void Init( idSWFSprite* sprite, idSWFSpriteInstance* parent, int depth ); bool Run(); bool RunActions(); const char* GetName() const { return name.c_str(); } idSWFScriptObject* GetScriptObject() { return scriptObject; } void SetAlignment( float x, float y ) { xOffset = x; yOffset = y; } void SetMaterial( const idMaterial* material, int width = -1, int height = -1 ); void SetVisible( bool visible ); bool IsVisible() { return isVisible; } void PlayFrame( const idSWFParmList& parms ); void PlayFrame( const char* frameName ) { idSWFParmList parms; parms.Append( frameName ); PlayFrame( parms ); } void PlayFrame( const int frameNum ) { idSWFParmList parms; parms.Append( frameNum ); PlayFrame( parms ); } void StopFrame( const idSWFParmList& parms ); void StopFrame( const char* frameName ) { idSWFParmList parms; parms.Append( frameName ); StopFrame( parms ); } void StopFrame( const int frameNum ) { idSWFParmList parms; parms.Append( frameNum ); StopFrame( parms ); } // FIXME: Why do all the Set functions have defaults of -1.0f? This seems arbitrar. // Probably better to not have a default at all, so any non-parametized calls throw a // compilation error. float GetXPos() const; float GetYPos( bool overallPos = false ) const; void SetXPos( float xPos = -1.0f ); void SetYPos( float yPos = -1.0f ); void SetPos( float xPos = -1.0f, float yPos = -1.0f ); void SetAlpha( float val ); void SetScale( float x = -1.0f, float y = -1.0f ); void SetMoveToScale( float x = -1.0f, float y = -1.0f ); bool UpdateMoveToScale( float speed ); // returns true if the update was successful void SetRotation( float rot ); uint16 GetCurrentFrame() { return currentFrame; } bool IsPlaying() const { return isPlaying; } int GetStereoDepth() { return stereoDepth; } // Removing the private access control statement due to cl 214702 // Apparently MS's C++ compiler supports the newer C++ standard, and GCC supports C++03 // In the new C++ standard, nested members of a friend class have access to private/protected members of the class granting friendship // In C++03, nested members defined in a friend class do NOT have access to private/protected members of the class granting friendship friend class idSWF; bool isPlaying; bool isVisible; bool childrenRunning; bool firstRun; // currentFrame is the frame number currently in the displayList // we use 1 based frame numbers because currentFrame = 0 means nothing is in the display list // it's also convenient because Flash also uses 1 based frame numbers uint16 currentFrame; uint16 frameCount; // the sprite this is an instance of idSWFSprite* sprite; // sprite instances can be nested idSWFSpriteInstance* parent; // depth of this sprite instance in the parent's display list int depth; // if this is set, apply this material when rendering any child shapes int itemIndex; const idMaterial* materialOverride; uint16 materialWidth; uint16 materialHeight; float xOffset; float yOffset; float moveToXScale; float moveToYScale; float moveToSpeed; int stereoDepth; idSWFScriptObject* scriptObject; // children display entries idList< swfDisplayEntry_t, TAG_SWF > displayList; swfDisplayEntry_t* FindDisplayEntry( int depth ); // name of this sprite instance idStr name; struct swfAction_t { const byte* data; uint32 dataLength; }; idList< swfAction_t, TAG_SWF > actions; idSWFScriptFunction_Script* actionScript; idSWFScriptVar onEnterFrame; //idSWFScriptVar onLoad; // Removing the private access control statement due to cl 214702 // Apparently MS's C++ compiler supports the newer C++ standard, and GCC supports C++03 // In the new C++ standard, nested members of a friend class have access to private/protected members of the class granting friendship // In C++03, nested members defined in a friend class do NOT have access to private/protected members of the class granting friendship //---------------------------------- // SWF_PlaceObject.cpp //---------------------------------- void PlaceObject2( idSWFBitStream& bitstream ); void PlaceObject3( idSWFBitStream& bitstream ); void RemoveObject2( idSWFBitStream& bitstream ); //---------------------------------- // SWF_Sounds.cpp //---------------------------------- void StartSound( idSWFBitStream& bitstream ); //---------------------------------- // SWF_SpriteInstance.cpp //---------------------------------- void NextFrame(); void PrevFrame(); void RunTo( int frameNum ); void Play(); void Stop(); void FreeDisplayList(); swfDisplayEntry_t* AddDisplayEntry( int depth, int characterID ); void RemoveDisplayEntry( int depth ); void SwapDepths( int depth1, int depth2 ); void DoAction( idSWFBitStream& bitstream ); idSWFSpriteInstance* FindChildSprite( const char* childName ); idSWFSpriteInstance* ResolveTarget( const char* targetName ); uint32 FindFrame( const char* frameLabel ) const; bool FrameExists( const char* frameLabel ) const; bool IsBetweenFrames( const char* frameLabel1, const char* frameLabel2 ) const; }; /* ================================================ This is the prototype object that all the sprite instance script objects reference ================================================ */ class idSWFScriptObject_SpriteInstancePrototype : public idSWFScriptObject { public: idSWFScriptObject_SpriteInstancePrototype(); #define SWF_SPRITE_FUNCTION_DECLARE( x ) \ class idSWFScriptFunction_##x : public idSWFScriptFunction { \ public: \ void AddRef() {} \ void Release() {} \ idSWFScriptVar Call( idSWFScriptObject * thisObject, const idSWFParmList & parms ); \ } scriptFunction_##x SWF_SPRITE_FUNCTION_DECLARE( duplicateMovieClip ); SWF_SPRITE_FUNCTION_DECLARE( gotoAndPlay ); SWF_SPRITE_FUNCTION_DECLARE( gotoAndStop ); SWF_SPRITE_FUNCTION_DECLARE( swapDepths ); SWF_SPRITE_FUNCTION_DECLARE( nextFrame ); SWF_SPRITE_FUNCTION_DECLARE( prevFrame ); SWF_SPRITE_FUNCTION_DECLARE( play ); SWF_SPRITE_FUNCTION_DECLARE( stop ); SWF_NATIVE_VAR_DECLARE( _x ); SWF_NATIVE_VAR_DECLARE( _y ); SWF_NATIVE_VAR_DECLARE( _xscale ); SWF_NATIVE_VAR_DECLARE( _yscale ); SWF_NATIVE_VAR_DECLARE( _alpha ); SWF_NATIVE_VAR_DECLARE( _brightness ); SWF_NATIVE_VAR_DECLARE( _visible ); SWF_NATIVE_VAR_DECLARE( _width ); SWF_NATIVE_VAR_DECLARE( _height ); SWF_NATIVE_VAR_DECLARE( _rotation ); SWF_NATIVE_VAR_DECLARE_READONLY( _name ); SWF_NATIVE_VAR_DECLARE_READONLY( _currentframe ); SWF_NATIVE_VAR_DECLARE_READONLY( _totalframes ); SWF_NATIVE_VAR_DECLARE_READONLY( _target ); SWF_NATIVE_VAR_DECLARE_READONLY( _framesloaded ); SWF_NATIVE_VAR_DECLARE_READONLY( _droptarget ); SWF_NATIVE_VAR_DECLARE_READONLY( _url ); SWF_NATIVE_VAR_DECLARE_READONLY( _highquality ); SWF_NATIVE_VAR_DECLARE_READONLY( _focusrect ); SWF_NATIVE_VAR_DECLARE_READONLY( _soundbuftime ); SWF_NATIVE_VAR_DECLARE_READONLY( _quality ); SWF_NATIVE_VAR_DECLARE_READONLY( _mousex ); SWF_NATIVE_VAR_DECLARE_READONLY( _mousey ); SWF_NATIVE_VAR_DECLARE( _stereoDepth ); SWF_NATIVE_VAR_DECLARE( _itemindex ); SWF_NATIVE_VAR_DECLARE( material ); SWF_NATIVE_VAR_DECLARE( materialWidth ); SWF_NATIVE_VAR_DECLARE( materialHeight ); SWF_NATIVE_VAR_DECLARE( xOffset ); SWF_NATIVE_VAR_DECLARE( onEnterFrame ); //SWF_NATIVE_VAR_DECLARE( onLoad ); }; #endif