Advertisement
expired6978

ScaleformCallbacks.h

Apr 12th, 2014
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.69 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "skse/ScaleformAPI.h"
  4. #include "skse/ScaleformTypes.h"
  5. #include "skse/Utilities.h"
  6. #include <typeinfo>
  7. #include <map>
  8.  
  9. // see RakNet/DependentExtensions/GFx3/FxGameDelegate.h
  10.  
  11. class FxDelegateHandler;
  12. class GFxMovieView;
  13. class GFxMovieRoot;
  14.  
  15. // the double in GFxValue is causing very weird alignment issues
  16. #pragma pack (push, 4)
  17.  
  18. // 10
  19. class GFxValue
  20. {
  21. public:
  22.     GFxValue()
  23.         :objectInterface(NULL), type(kType_Undefined) { }
  24.     ~GFxValue();
  25.  
  26.     enum
  27.     {
  28.         kType_Undefined =   0,
  29.         kType_Null,
  30.         kType_Bool,
  31.         kType_Number,
  32.         kType_String,
  33.         kType_WideString,
  34.         kType_Object,
  35.         kType_Array,
  36.         kType_DisplayObject,
  37.  
  38.         kTypeFlag_Managed = 1 << 6,
  39.  
  40.         kMask_Type =        0x8F,   // not sure why it checks the top bit
  41.     };
  42.  
  43.     union Data
  44.     {
  45.         double          number;
  46.         bool            boolean;
  47.         const char      * string;
  48.         const char      ** managedString;
  49.         const wchar_t   * wideString;
  50.         const wchar_t   ** managedWideString;
  51.         void            * obj;
  52.     };
  53.  
  54. #pragma pack (push, 8)
  55.     class DisplayInfo
  56.     {
  57.     public:
  58.         DisplayInfo() : _varsSet(0) {}
  59.         enum
  60.         {
  61.             kChange_x               = (1 << 0),
  62.             kChange_y               = (1 << 1),
  63.             kChange_rotation        = (1 << 2),
  64.             kChange_xscale          = (1 << 3),
  65.             kChange_yscale          = (1 << 4),
  66.             kChange_alpha           = (1 << 5),
  67.             kChange_visible         = (1 << 6),
  68.             kChange_z               = (1 << 7),
  69.             kChange_xrotation       = (1 << 8),
  70.             kChange_yrotation       = (1 << 9),
  71.             kChange_zscale          = (1 << 10),
  72.             kChange_FOV             = (1 << 11),
  73.             kChange_projMatrix3D    = (1 << 12),
  74.             kChange_viewMatrix3D    = (1 << 13)
  75.         };
  76.  
  77.         double      _x;
  78.         double      _y;
  79.         double      _rotation;
  80.         double      _xScale;
  81.         double      _yScale;
  82.         double      _alpha;
  83.         bool        _visible;
  84.         double      _z;
  85.         double      _xRotation;
  86.         double      _yRotation;
  87.         double      _zScale;
  88.         double      _perspFOV;
  89.         GMatrix3D   _viewMatrix3D;
  90.         GMatrix3D   _perspectiveMatrix3D;
  91.         UInt16      _varsSet;
  92.  
  93.         void SetX(double x)                 { SetFlags(kChange_x); _x = x; }
  94.         void SetY(double y)                 { SetFlags(kChange_y); _y = y; }
  95.         void SetRotation(double degrees)    { SetFlags(kChange_rotation); _rotation = degrees; }
  96.         void SetXScale(double xscale)       { SetFlags(kChange_xscale); _xScale = xscale; }
  97.         void SetYScale(double yscale)       { SetFlags(kChange_yscale); _yScale = yscale; }
  98.         void SetAlpha(double alpha)         { SetFlags(kChange_alpha); _alpha = alpha; }
  99.         void SetVisible(bool visible)       { SetFlags(kChange_visible); _visible = visible; }
  100.         void SetZ(double z)                 { SetFlags(kChange_z); _z = z; }
  101.         void SetXRotation(double degrees)   { SetFlags(kChange_xrotation); _xRotation = degrees; }
  102.         void SetYRotation(double degrees)   { SetFlags(kChange_yrotation); _yRotation = degrees; }
  103.         void SetZScale(double zscale)       { SetFlags(kChange_zscale); _zScale = zscale; }
  104.         void SetFOV(double fov)             { SetFlags(kChange_FOV); _perspFOV = fov; }
  105.         void SetProjectionMatrix3D(const GMatrix3D *pmat)  
  106.         {
  107.             if (pmat) {
  108.                 SetFlags(kChange_projMatrix3D);
  109.                 _perspectiveMatrix3D = *pmat;
  110.             } else
  111.                 ClearFlags(kChange_projMatrix3D);
  112.         }
  113.         void SetViewMatrix3D(const GMatrix3D *pmat)
  114.         {
  115.             if (pmat) {
  116.                 SetFlags(kChange_viewMatrix3D);
  117.                 _viewMatrix3D = *pmat;
  118.             } else
  119.                 ClearFlags(kChange_viewMatrix3D);
  120.         }
  121.  
  122.         // Convenience functions
  123.         void SetPosition(double x, double y) { SetFlags(kChange_x | kChange_y); _x = x; _y = y; }
  124.         void SetScale(double xscale, double yscale)  { SetFlags(kChange_xscale | kChange_yscale); _xScale = xscale; _yScale = yscale; }
  125.  
  126.         void SetFlags(UInt32 flags) { _varsSet |= flags; }
  127.         void ClearFlags(UInt32 flags) { _varsSet &= ~flags; }
  128.     };
  129. #pragma pack (pop)
  130.  
  131.     // 4
  132.     class ObjectInterface
  133.     {
  134.     public:
  135.         GFxMovieRoot    * root;
  136.  
  137.         MEMBER_FN_PREFIX(ObjectInterface);
  138.         DEFINE_MEMBER_FN(HasMember, bool, 0x00920C50, void * obj, const char * name, bool isDisplayObj);
  139.         DEFINE_MEMBER_FN(SetMember, bool, 0x00920D20, void * obj, const char * name, GFxValue * value, bool isDisplayObj);
  140.         DEFINE_MEMBER_FN(DeleteMember, bool, 0x00920DE0, void * obj, const char * name, bool isDisplayObj);
  141.         DEFINE_MEMBER_FN(GetMember, bool, 0x00923960, void * obj, const char * name, GFxValue * value, bool isDisplayObj);
  142.         DEFINE_MEMBER_FN(Invoke, bool, 0x00922ED0, void * obj, GFxValue * result, const char * name, GFxValue * args, UInt32 numArgs, bool isDisplayObj);
  143.         DEFINE_MEMBER_FN(AttachMovie, bool, 0x00923060, void * obj, GFxValue * value, const char * symbolName, const char * instanceName, SInt32 depth, void * initArgs);
  144.         DEFINE_MEMBER_FN(PushBack, bool, 0x00920EF0, void * obj, GFxValue * value);
  145.         DEFINE_MEMBER_FN(SetText, bool, 0x009233A0, void * obj, const wchar_t * text, bool html);
  146.         //DEFINE_MEMBER_FN(PopBack, bool, 0x00000000, void * obj, GFxValue * value);
  147.         DEFINE_MEMBER_FN(GetArraySize, UInt32, 0x00920E80, void * obj);
  148.         //DEFINE_MEMBER_FN(SetArraySize, bool, 0x00000000, void * obj, UInt32 size);
  149.         DEFINE_MEMBER_FN(GetElement, bool, 0x00923AD0, void * obj, UInt32 index, GFxValue * value);
  150.         //DEFINE_MEMBER_FN(SetElement, bool, 0x00000000, void * obj, UInt32 index, GFxValue * value);
  151.         //DEFINE_MEMBER_FN(GotoLabeledFrame, bool, 0x00000000, void * obj, const char * frameLabel, bool stop);
  152.         //DEFINE_MEMBER_FN(GotoFrame, bool, 0x00000000, void * obj, UInt32 frameNumber, bool stop);
  153.         DEFINE_MEMBER_FN(GetDisplayInfo, bool, 0x00920F90, void * obj, DisplayInfo * displayInfo);
  154.         DEFINE_MEMBER_FN(SetDisplayInfo, bool, 0x009211B0, void * obj, DisplayInfo * displayInfo);
  155.  
  156.         DEFINE_MEMBER_FN(AddManaged_Internal, void, 0x00921DA0, GFxValue * value, void * obj);
  157.         DEFINE_MEMBER_FN(ReleaseManaged_Internal, void, 0x00922660, GFxValue * value, void * obj);
  158.     };
  159.  
  160.     ObjectInterface * objectInterface;  // 00
  161.     UInt32          type;               // 04
  162.     Data            data;               // 08
  163.  
  164.     UInt32  GetType(void) const     { return type & kMask_Type; }
  165.     bool    IsManaged(void) const   { return (type & kTypeFlag_Managed) != 0; }
  166.     void    CleanManaged(void);
  167.     void    AddManaged(void);
  168.  
  169.     bool    IsObject(void) const        { return GetType() == kType_Object; }
  170.     bool    IsDisplayObject(void) const { return GetType() == kType_DisplayObject; }
  171.  
  172.     bool            GetBool(void);
  173.     const char *    GetString(void);
  174.     const wchar_t * GetWideString(void);
  175.     double          GetNumber(void);
  176.  
  177.     void    SetUndefined(void);
  178.     void    SetNull(void);
  179.     void    SetBool(bool value);
  180.     void    SetNumber(double value);
  181.     void    SetString(const char * value);
  182.     void    SetWideString(const wchar_t * value);
  183.  
  184.     UInt32  GetArraySize();
  185.     bool    GetElement(UInt32 index, GFxValue * value);
  186.     bool    HasMember(const char * name);
  187.     bool    SetMember(const char * name, GFxValue * value);
  188.     bool    GetMember(const char * name, GFxValue * value);
  189.     bool    DeleteMember(const char * name);
  190.     bool    Invoke(const char * name, GFxValue * result, GFxValue * args, UInt32 numArgs);
  191.     bool    PushBack(GFxValue * value);
  192.     bool    GetDisplayInfo(DisplayInfo * displayInfo);
  193.     bool    SetDisplayInfo(DisplayInfo * displayInfo);
  194. };
  195.  
  196. STATIC_ASSERT(sizeof(GFxValue) == 0x10);
  197.  
  198. #pragma pack (pop)
  199.  
  200. class GFxFunctionHandler : public GRefCountBase
  201. {
  202. public:
  203.     GFxFunctionHandler();
  204.     virtual ~GFxFunctionHandler();
  205.  
  206.     // 1C
  207.     class Args
  208.     {
  209.     public:
  210.         GFxValue        * result;   // 00
  211.         GFxMovieView    * movie;    // 04
  212.         GFxValue        * thisObj;  // 08
  213.         GFxValue        * unk0C;    // 0C
  214.         GFxValue        * args;     // 10
  215.         UInt32          numArgs;    // 14
  216.         void            * refCon;   // 18
  217.     };
  218.  
  219.     virtual void    Invoke(Args * args) = 0;
  220.  
  221.     MEMBER_FN_PREFIX(GFxFunctionHandler);
  222.     DEFINE_MEMBER_FN(Destroy, GFxFunctionHandler *, 0x00859490, UInt32 flags);
  223. };
  224.  
  225. typedef std::map <const std::type_info *, GFxFunctionHandler *> FunctionHandlerCache;
  226. extern FunctionHandlerCache g_functionHandlerCache;
  227.  
  228. template <typename T>
  229. void RegisterFunction(GFxValue * dst, GFxMovieView * movie, const char * name)
  230. {
  231.     // either allocate the object or retrieve an existing instance from the cache
  232.     GFxFunctionHandler  * fn = NULL;
  233.  
  234.     // check the cache
  235.     FunctionHandlerCache::iterator iter = g_functionHandlerCache.find(&typeid(T));
  236.     if(iter != g_functionHandlerCache.end())
  237.         fn = iter->second;
  238.  
  239.     if(!fn)
  240.     {
  241.         // not found, allocate a new one
  242.         fn = new T;
  243.  
  244.         // add it to the cache
  245.         // cache now owns the object as far as refcounting goes
  246.         g_functionHandlerCache[&typeid(T)] = fn;
  247.     }
  248.  
  249.     // create the function object
  250.     GFxValue    fnValue;
  251.     movie->CreateFunction(&fnValue, fn);
  252.  
  253.     // register it
  254.     dst->SetMember(name, &fnValue);
  255. }
  256.  
  257. // 04
  258. class FxResponseArgsBase
  259. {
  260. public:
  261.     FxResponseArgsBase();
  262.     virtual ~FxResponseArgsBase();
  263.  
  264.     virtual UInt32  GetValues(GFxValue ** params);
  265.  
  266. //  void    ** _vtbl;   // 00
  267. };
  268.  
  269. // 0C + T_numArgs * 0x10
  270. template <UInt32 T_numArgs>
  271. class FxResponseArgs : public FxResponseArgsBase
  272. {
  273. public:
  274.     FxResponseArgs();
  275.     virtual ~FxResponseArgs();
  276.  
  277.     UInt32      align04;                // 04 - needed because GFxValue contains a double
  278.     GFxValue    args[T_numArgs + 1];    // 08
  279.     UInt32      curArg;                 // 28 - offsets assume one argument
  280. };
  281.  
  282. // ?
  283. class FxResponseArgsList : public FxResponseArgsBase
  284. {
  285. public:
  286.     FxResponseArgsList();
  287.  
  288.     GArray <GFxValue>   args;
  289. };
  290.  
  291. // 20
  292. class FxDelegateArgs
  293. {
  294. public:
  295.     FxDelegateArgs();
  296.     ~FxDelegateArgs();
  297.  
  298.     GFxValue            responseID;
  299.     FxDelegateHandler   * menu;     // 10
  300.     GFxMovieView        * movie;    // 14
  301.     GFxValue            * args;     // 18
  302.     UInt32              numArgs;    // 1C
  303. };
  304.  
  305. // 08
  306. class FxDelegateHandler : public GRefCountBase
  307. {
  308. public:
  309.     //FxDelegateHandler();
  310.     //~FxDelegateHandler();
  311.  
  312.     typedef void (* Callback)(const FxDelegateArgs & params);
  313.  
  314.     class CallbackProcessor
  315.     {
  316.     public:
  317.         CallbackProcessor();
  318.         virtual ~CallbackProcessor();
  319.  
  320.         virtual void    Process(const GString & name, Callback method);
  321.     };
  322.  
  323.     class AddCallbackVisitor : public CallbackProcessor
  324.     {
  325.     public:
  326.         AddCallbackVisitor();
  327.         virtual ~AddCallbackVisitor();
  328.  
  329.         FxDelegateHandler   * parent;
  330.         void                * callbackHashTable;
  331.     };
  332.  
  333.     virtual void    Accept(CallbackProcessor * processor) = 0;
  334. };
  335.  
  336. extern const FxDelegateHandler::Callback PlaySoundCallback;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement