//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// // This defines things that allow particle effects to hook into the particle app. #ifndef PARTICLE_PROTOTYPE_H #define PARTICLE_PROTOTYPE_H class CParticleMgr; class RecvTable; // Command-line args can be passed in to set state or options in the effects. class IPrototypeArgAccess { public: virtual const char* FindArg(const char *pName, const char *pDefault=0)=0; }; // You must implement this interface for the prototype app to be able to run your effect. class IPrototypeAppEffect { public: virtual ~IPrototypeAppEffect() {} // Start the effect. You can get command-line args with pArgs. virtual void Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs)=0; // Return false if you don't allow properties to be edited in the prototype app. virtual bool GetPropEditInfo(RecvTable **ppTable, void **ppObj) {return false;} }; // Used internally. typedef IPrototypeAppEffect* (*PrototypeEffectCreateFn)(); class PrototypeEffectLink { public: PrototypeEffectLink(PrototypeEffectCreateFn fn, const char *pName); PrototypeEffectCreateFn m_CreateFn; const char *m_pEffectName; PrototypeEffectLink *m_pNext; }; #ifdef PARTICLEPROTOTYPE_APP extern PrototypeEffectLink *g_pPrototypeEffects; // The list of prototype effects.. // Expose your effect with this macro. #define EXPOSE_PROTOTYPE_EFFECT(effectName, className) \ static IPrototypeAppEffect* ___Create##effectName##() {return new className;} \ static PrototypeEffectLink ___effectlink_##effectName##(___Create##effectName##, #effectName); #else #define EXPOSE_PROTOTYPE_EFFECT(effectName, className) #endif #endif