• [MetaHook] Quake Bink function


    If you want to play Bink video in game, maybe you need this code.

    QBink.h

     1 #ifndef QBINK_H
     2 #define QBINK_H
     3 
     4 #include "bink.h"
     5 
     6 extern void PTR4* (RADEXPLINK *qBinkLogoAddress)(void);
     7 extern void (RADEXPLINK *qBinkSetError)(const char PTR4* err);
     8 extern char PTR4* (RADEXPLINK *qBinkGetError)(void);
     9 extern HBINK (RADEXPLINK *qBinkOpen)(const char PTR4* name,U32 flags);
    10 extern void (RADEXPLINK *qBinkGetFrameBuffersInfo)( HBINK bink, BINKFRAMEBUFFERS * fbset );
    11 extern void (RADEXPLINK *qBinkRegisterFrameBuffers)( HBINK bink, BINKFRAMEBUFFERS * fbset );
    12 extern S32  (RADEXPLINK *qBinkDoFrame)(HBINK bnk);
    13 extern void (RADEXPLINK *qBinkNextFrame)(HBINK bnk);
    14 extern S32  (RADEXPLINK *qBinkWait)(HBINK bnk);
    15 extern void (RADEXPLINK *qBinkClose)(HBINK bnk);
    16 extern S32  (RADEXPLINK *qBinkPause)(HBINK bnk,S32 pause);
    17 extern S32  (RADEXPLINK *qBinkCopyToBuffer)(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 flags);
    18 extern S32  (RADEXPLINK *qBinkCopyToBufferRect)(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 srcx, U32 srcy, U32 srcw, U32 srch, U32 flags);
    19 extern S32  (RADEXPLINK *qBinkGetRects)(HBINK bnk,U32 flags);
    20 extern void (RADEXPLINK *qBinkGoto)(HBINK bnk,U32 frame,S32 flags);  // use 1 for the first frame
    21 extern U32  (RADEXPLINK *qBinkGetKeyFrame)(HBINK bnk,U32 frame,S32 flags);
    22 extern S32  (RADEXPLINK *qBinkSetVideoOnOff)(HBINK bnk,S32 onoff);
    23 extern S32  (RADEXPLINK *qBinkSetSoundOnOff)(HBINK bnk,S32 onoff);
    24 extern void (RADEXPLINK *qBinkFreeGlocalMemory)( void );
    25 extern void (RADEXPLINK *qBinkSetVolume)(HBINK bnk, U32 trackid, S32 volume);
    26 extern void (RADEXPLINK *qBinkSetPan)(HBINK bnk,U32 trackid, S32 pan);
    27 extern void (RADEXPLINK *qBinkSetMixBins)(HBINK bnk,U32 trackid, U32 PTR4* mix_bins, U32 total);
    28 extern void (RADEXPLINK *qBinkSetMixBinVolumes)(HBINK bnk,U32 trackid, U32 PTR4* vol_mix_bins, S32 PTR4* volumes, U32 total);
    29 extern void (RADEXPLINK *qBinkService)(HBINK bink);
    30 extern S32  (RADEXPLINK *qBinkShouldSkip)(HBINK bink);
    31 extern void (RADEXPLINK *qBinkGetPalette)( void * out_pal );
    32 extern S32  (RADEXPLINK *qBinkControlBackgroundIO)(HBINK bink,U32 control);
    33 extern HBINKTRACK (RADEXPLINK *qBinkOpenTrack)(HBINK bnk,U32 trackindex);
    34 extern void (RADEXPLINK *qBinkCloseTrack)(HBINKTRACK bnkt);
    35 extern U32  (RADEXPLINK *qBinkGetTrackData)(HBINKTRACK bnkt,void PTR4* dest);
    36 extern U32  (RADEXPLINK *qBinkGetTrackType)(HBINK bnk,U32 trackindex);
    37 extern U32  (RADEXPLINK *qBinkGetTrackMaxSize)(HBINK bnk,U32 trackindex);
    38 extern U32  (RADEXPLINK *qBinkGetTrackID)(HBINK bnk,U32 trackindex);
    39 extern void (RADEXPLINK *qBinkGetSummary)(HBINK bnk,BINKSUMMARY PTR4* sum);
    40 extern void (RADEXPLINK *qBinkGetRealtime)(HBINK bink,BINKREALTIME PTR4* run,U32 frames);
    41 extern void (RADEXPLINK *qBinkSetSoundTrack)(U32 total_tracks, U32 PTR4* tracks);
    42 extern void (RADEXPLINK *qBinkSetIO)(BINKIOOPEN io);
    43 extern void (RADEXPLINK *qBinkSetFrameRate)(U32 forcerate,U32 forceratediv);
    44 extern void (RADEXPLINK *qBinkSetSimulate)(U32 sim);
    45 extern void (RADEXPLINK *qBinkSetIOSize)(U32 iosize);
    46 extern S32  (RADEXPLINK *qBinkSetSoundSystem)(BINKSNDSYSOPEN open, U32 param);
    47 extern void (RADEXPLINK *qBinkControlCPUFeatures)( S32 use, S32 dont_use );
    48 extern BINKSNDOPEN (RADEXPLINK *qBinkOpenDirectSound)(U32 param); // don't call directly
    49 extern BINKSNDOPEN (RADEXPLINK *qBinkOpenWaveOut)(U32 param); // don't call directly
    50 extern BINKSNDOPEN (RADEXPLINK *qBinkOpenMiles)(U32 param); // don't call directly
    51 extern S32 (RADEXPLINK *qBinkDX8SurfaceType)(void* lpD3Ds);
    52 extern S32 (RADEXPLINK *qBinkDX9SurfaceType)(void* lpD3Ds);
    53 extern HBINKBUFFER (RADEXPLINK *qBinkBufferOpen)( void* /*HWND*/ wnd, U32 width, U32 height, U32 bufferflags);
    54 extern S32 (RADEXPLINK *qBinkBufferSetHWND)( HBINKBUFFER buf, void* /*HWND*/ newwnd);
    55 extern S32 (RADEXPLINK *qBinkDDSurfaceType)(void PTR4* lpDDS);
    56 extern S32 (RADEXPLINK *qBinkIsSoftwareCursor)(void PTR4* lpDDSP, void* /*HCURSOR*/ cur);
    57 extern S32 (RADEXPLINK *qBinkCheckCursor)(void* /*HWND*/ wnd,S32 x,S32 y,S32 w,S32 h);
    58 extern S32 (RADEXPLINK *qBinkBufferSetDirectDraw)(void PTR4* lpDirectDraw, void PTR4* lpPrimary);
    59 extern void (RADEXPLINK *qBinkBufferClose)( HBINKBUFFER buf);
    60 extern S32 (RADEXPLINK *qBinkBufferLock)( HBINKBUFFER buf);
    61 extern S32 (RADEXPLINK *qBinkBufferUnlock)( HBINKBUFFER buf);
    62 extern void (RADEXPLINK *qBinkBufferSetResolution)( S32 w, S32 h, S32 bits);
    63 extern void (RADEXPLINK *qBinkBufferCheckWinPos)( HBINKBUFFER buf, S32 PTR4* NewWindowX, S32 PTR4* NewWindowY);
    64 extern S32 (RADEXPLINK *qBinkBufferSetOffset)( HBINKBUFFER buf, S32 destx, S32 desty);
    65 extern void (RADEXPLINK *qBinkBufferBlit)( HBINKBUFFER buf, BINKRECT PTR4* rects, U32 numrects );
    66 extern S32 (RADEXPLINK *qBinkBufferSetScale)( HBINKBUFFER buf, U32 w, U32 h);
    67 extern char PTR4* (RADEXPLINK *qBinkBufferGetDescription)( HBINKBUFFER buf);
    68 extern char PTR4* (RADEXPLINK *qBinkBufferGetError)();
    69 extern void (RADEXPLINK *qBinkRestoreCursor)(S32 checkcount);
    70 extern S32 (RADEXPLINK *qBinkBufferClear)(HBINKBUFFER buf, U32 RGB);
    71 extern void (RADEXPLINK *qBinkSetMemory)(BINKMEMALLOC a,BINKMEMFREE f);
    72 
    73 void QBink_Init(void);
    74 void QBink_Shutdown(void);
    75 
    76 #endif

    QBink.cpp

      1 #include <metahook.h>
      2 
      3 #include "bink.h"
      4 
      5 static HMODULE hBink = NULL;
      6 
      7 void PTR4* (RADEXPLINK *qBinkLogoAddress)(void) = 0;
      8 void (RADEXPLINK *qBinkSetError)(const char PTR4* err) = 0;
      9 char PTR4* (RADEXPLINK *qBinkGetError)(void) = 0;
     10 HBINK (RADEXPLINK *qBinkOpen)(const char PTR4* name,U32 flags) = 0;
     11 void (RADEXPLINK *qBinkGetFrameBuffersInfo)( HBINK bink, BINKFRAMEBUFFERS * fbset ) = 0;
     12 void (RADEXPLINK *qBinkRegisterFrameBuffers)( HBINK bink, BINKFRAMEBUFFERS * fbset ) = 0;
     13 S32  (RADEXPLINK *qBinkDoFrame)(HBINK bnk) = 0;
     14 void (RADEXPLINK *qBinkNextFrame)(HBINK bnk) = 0;
     15 S32  (RADEXPLINK *qBinkWait)(HBINK bnk) = 0;
     16 void (RADEXPLINK *qBinkClose)(HBINK bnk) = 0;
     17 S32  (RADEXPLINK *qBinkPause)(HBINK bnk,S32 pause) = 0;
     18 S32  (RADEXPLINK *qBinkCopyToBuffer)(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 flags) = 0;
     19 S32  (RADEXPLINK *qBinkCopyToBufferRect)(HBINK bnk,void* dest,S32 destpitch,U32 destheight,U32 destx,U32 desty,U32 srcx, U32 srcy, U32 srcw, U32 srch, U32 flags) = 0;
     20 S32  (RADEXPLINK *qBinkGetRects)(HBINK bnk,U32 flags) = 0;
     21 void (RADEXPLINK *qBinkGoto)(HBINK bnk,U32 frame,S32 flags) = 0;  // use 1 for the first frame
     22 U32  (RADEXPLINK *qBinkGetKeyFrame)(HBINK bnk,U32 frame,S32 flags) = 0;
     23 S32  (RADEXPLINK *qBinkSetVideoOnOff)(HBINK bnk,S32 onoff) = 0;
     24 S32  (RADEXPLINK *qBinkSetSoundOnOff)(HBINK bnk,S32 onoff) = 0;
     25 void (RADEXPLINK *qBinkSetVolume)(HBINK bnk, U32 trackid, S32 volume) = 0;
     26 void (RADEXPLINK *qBinkSetPan)(HBINK bnk,U32 trackid, S32 pan) = 0;
     27 void (RADEXPLINK *qBinkSetMixBins)(HBINK bnk,U32 trackid, U32 PTR4* mix_bins, U32 total) = 0;
     28 void (RADEXPLINK *qBinkSetMixBinVolumes)(HBINK bnk,U32 trackid, U32 PTR4* vol_mix_bins, S32 PTR4* volumes, U32 total) = 0;
     29 void (RADEXPLINK *qBinkService)(HBINK bink) = 0;
     30 S32  (RADEXPLINK *qBinkShouldSkip)(HBINK bink) = 0;
     31 void (RADEXPLINK *qBinkGetPalette)( void * out_pal ) = 0;
     32 S32  (RADEXPLINK *qBinkControlBackgroundIO)(HBINK bink,U32 control) = 0;
     33 HBINKTRACK (RADEXPLINK *qBinkOpenTrack)(HBINK bnk,U32 trackindex) = 0;
     34 void (RADEXPLINK *qBinkCloseTrack)(HBINKTRACK bnkt) = 0;
     35 U32  (RADEXPLINK *qBinkGetTrackData)(HBINKTRACK bnkt,void PTR4* dest) = 0;
     36 U32  (RADEXPLINK *qBinkGetTrackType)(HBINK bnk,U32 trackindex) = 0;
     37 U32  (RADEXPLINK *qBinkGetTrackMaxSize)(HBINK bnk,U32 trackindex) = 0;
     38 U32  (RADEXPLINK *qBinkGetTrackID)(HBINK bnk,U32 trackindex) = 0;
     39 void (RADEXPLINK *qBinkGetSummary)(HBINK bnk,BINKSUMMARY PTR4* sum) = 0;
     40 void (RADEXPLINK *qBinkGetRealtime)(HBINK bink,BINKREALTIME PTR4* run,U32 frames) = 0;
     41 void (RADEXPLINK *qBinkSetSoundTrack)(U32 total_tracks, U32 PTR4* tracks) = 0;
     42 void (RADEXPLINK *qBinkSetIO)(BINKIOOPEN io) = 0;
     43 void (RADEXPLINK *qBinkSetFrameRate)(U32 forcerate,U32 forceratediv) = 0;
     44 void (RADEXPLINK *qBinkSetSimulate)(U32 sim) = 0;
     45 void (RADEXPLINK *qBinkSetIOSize)(U32 iosize) = 0;
     46 S32  (RADEXPLINK *qBinkSetSoundSystem)(BINKSNDSYSOPEN open, U32 param) = 0;
     47 BINKSNDOPEN (RADEXPLINK *qBinkOpenDirectSound)(U32 param) = 0; // don't call directly
     48 BINKSNDOPEN (RADEXPLINK *qBinkOpenWaveOut)(U32 param) = 0; // don't call directly
     49 BINKSNDOPEN (RADEXPLINK *qBinkOpenMiles)(U32 param) = 0; // don't call directly
     50 S32 (RADEXPLINK *qBinkDX8SurfaceType)(void* lpD3Ds) = 0;
     51 S32 (RADEXPLINK *qBinkDX9SurfaceType)(void* lpD3Ds) = 0;
     52 HBINKBUFFER (RADEXPLINK *qBinkBufferOpen)( void* /*HWND*/ wnd, U32 width, U32 height, U32 bufferflags) = 0;
     53 S32 (RADEXPLINK *qBinkBufferSetHWND)( HBINKBUFFER buf, void* /*HWND*/ newwnd) = 0;
     54 S32 (RADEXPLINK *qBinkDDSurfaceType)(void PTR4* lpDDS) = 0;
     55 S32 (RADEXPLINK *qBinkIsSoftwareCursor)(void PTR4* lpDDSP, void* /*HCURSOR*/ cur) = 0;
     56 S32 (RADEXPLINK *qBinkCheckCursor)(void* /*HWND*/ wnd,S32 x,S32 y,S32 w,S32 h) = 0;
     57 S32 (RADEXPLINK *qBinkBufferSetDirectDraw)(void PTR4* lpDirectDraw, void PTR4* lpPrimary) = 0;
     58 void (RADEXPLINK *qBinkBufferClose)( HBINKBUFFER buf) = 0;
     59 S32 (RADEXPLINK *qBinkBufferLock)( HBINKBUFFER buf) = 0;
     60 S32 (RADEXPLINK *qBinkBufferUnlock)( HBINKBUFFER buf) = 0;
     61 void (RADEXPLINK *qBinkBufferSetResolution)( S32 w, S32 h, S32 bits) = 0;
     62 void (RADEXPLINK *qBinkBufferCheckWinPos)( HBINKBUFFER buf, S32 PTR4* NewWindowX, S32 PTR4* NewWindowY) = 0;
     63 S32 (RADEXPLINK *qBinkBufferSetOffset)( HBINKBUFFER buf, S32 destx, S32 desty) = 0;
     64 void (RADEXPLINK *qBinkBufferBlit)( HBINKBUFFER buf, BINKRECT PTR4* rects, U32 numrects ) = 0;
     65 S32 (RADEXPLINK *qBinkBufferSetScale)( HBINKBUFFER buf, U32 w, U32 h) = 0;
     66 char PTR4* (RADEXPLINK *qBinkBufferGetDescription)( HBINKBUFFER buf) = 0;
     67 char PTR4* (RADEXPLINK *qBinkBufferGetError)() = 0;
     68 void (RADEXPLINK *qBinkRestoreCursor)(S32 checkcount) = 0;
     69 S32 (RADEXPLINK *qBinkBufferClear)(HBINKBUFFER buf, U32 RGB) = 0;
     70 void (RADEXPLINK *qBinkSetMemory)(BINKMEMALLOC a,BINKMEMFREE f) = 0;
     71 
     72 void QBink_Init(void)
     73 {
     74     hBink = LoadLibrary("binkw32.dll");
     75 
     76     if (hBink)
     77     {
     78         qBinkLogoAddress = (void PTR4* (RADEXPLINK *)(void))GetProcAddress(hBink, "_BinkLogoAddress@0");
     79         qBinkSetError = (void (RADEXPLINK *)(const char PTR4*))GetProcAddress(hBink, "_BinkSetError@4");
     80         qBinkGetError = (char PTR4* (RADEXPLINK *)(void))GetProcAddress(hBink, "_BinkGetError@0");
     81         qBinkOpen = (HBINK (RADEXPLINK *)(const char PTR4*,U32))GetProcAddress(hBink, "_BinkOpen@8");
     82         qBinkGetFrameBuffersInfo = (void (RADEXPLINK *)( HBINK, BINKFRAMEBUFFERS *))GetProcAddress(hBink, "_BinkGetFrameBuffersInfo@8");
     83         qBinkRegisterFrameBuffers = (void (RADEXPLINK *)( HBINK, BINKFRAMEBUFFERS *))GetProcAddress(hBink, "_BinkRegisterFrameBuffers@8");
     84         qBinkDoFrame = (S32  (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkDoFrame@4");
     85         qBinkNextFrame = (void (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkNextFrame@4");
     86         qBinkWait = (S32  (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkWait@4");
     87         qBinkClose = (void (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkClose@4");
     88         qBinkPause = (S32  (RADEXPLINK *)(HBINK,S32))GetProcAddress(hBink, "_BinkPause@8");
     89         qBinkCopyToBuffer = (S32  (RADEXPLINK *)(HBINK,void*,S32,U32,U32,U32,U32))GetProcAddress(hBink, "_BinkCopyToBuffer@28");
     90         qBinkCopyToBufferRect = (S32  (RADEXPLINK *)(HBINK,void*,S32,U32,U32,U32,U32, U32, U32, U32, U32))GetProcAddress(hBink, "_BinkCopyToBufferRect@44");
     91         qBinkGetRects = (S32  (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkGetRects@8");
     92         qBinkGoto = (void (RADEXPLINK *)(HBINK,U32,S32))GetProcAddress(hBink, "_BinkGoto@12");  // use 1 for the first frame
     93         qBinkGetKeyFrame = (U32  (RADEXPLINK *)(HBINK,U32,S32))GetProcAddress(hBink, "_BinkGetKeyFrame@12");
     94         qBinkSetVideoOnOff = (S32  (RADEXPLINK *)(HBINK,S32))GetProcAddress(hBink, "_BinkSetVideoOnOff@8");
     95         qBinkSetSoundOnOff = (S32  (RADEXPLINK *)(HBINK,S32))GetProcAddress(hBink, "_BinkSetSoundOnOff@8");
     96         qBinkSetVolume = (void (RADEXPLINK *)(HBINK, U32, S32))GetProcAddress(hBink, "_BinkSetVolume@12");
     97         qBinkSetPan = (void (RADEXPLINK *)(HBINK,U32, S32))GetProcAddress(hBink, "_BinkSetPan@12");
     98         qBinkSetMixBins = (void (RADEXPLINK *)(HBINK,U32, U32 PTR4*, U32))GetProcAddress(hBink, "_BinkSetMixBins@16");
     99         qBinkSetMixBinVolumes = (void (RADEXPLINK *)(HBINK,U32, U32 PTR4*, S32 PTR4*, U32))GetProcAddress(hBink, "_BinkSetMixBinVolumes@20");
    100         qBinkService = (void (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkService@4");
    101         qBinkShouldSkip = (S32  (RADEXPLINK *)(HBINK))GetProcAddress(hBink, "_BinkShouldSkip@4");
    102         qBinkGetPalette = (void (RADEXPLINK *)( void * ))GetProcAddress(hBink, "_BinkGetPalette@4");
    103         qBinkControlBackgroundIO = (S32  (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkControlBackgroundIO@8");
    104         qBinkOpenTrack = (HBINKTRACK (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkOpenTrack@8");
    105         qBinkCloseTrack = (void (RADEXPLINK *)(HBINKTRACK))GetProcAddress(hBink, "_BinkCloseTrack@4");
    106         qBinkGetTrackData = (U32  (RADEXPLINK *)(HBINKTRACK,void PTR4*))GetProcAddress(hBink, "_BinkGetTrackData@8");
    107         qBinkGetTrackType = (U32  (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkGetTrackType@8");
    108         qBinkGetTrackMaxSize = (U32  (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkGetTrackMaxSize@8");
    109         qBinkGetTrackID = (U32  (RADEXPLINK *)(HBINK,U32))GetProcAddress(hBink, "_BinkGetTrackID@8");
    110         qBinkGetSummary = (void (RADEXPLINK *)(HBINK,BINKSUMMARY PTR4*))GetProcAddress(hBink, "_BinkGetSummary@8");
    111         qBinkGetRealtime = (void (RADEXPLINK *)(HBINK,BINKREALTIME PTR4*,U32))GetProcAddress(hBink, "_BinkGetRealtime@12");
    112         qBinkSetSoundTrack = (void (RADEXPLINK *)(U32, U32 PTR4*))GetProcAddress(hBink, "_BinkSetSoundTrack@8");
    113         qBinkSetIO = (void (RADEXPLINK *)(BINKIOOPEN))GetProcAddress(hBink, "_BinkSetIO@4");
    114         qBinkSetFrameRate = (void (RADEXPLINK *)(U32,U32))GetProcAddress(hBink, "_BinkSetFrameRate@8");
    115         qBinkSetSimulate = (void (RADEXPLINK *)(U32))GetProcAddress(hBink, "_BinkSetSimulate@4");
    116         qBinkSetIOSize = (void (RADEXPLINK *)(U32))GetProcAddress(hBink, "_BinkSetIOSize@4");
    117         qBinkSetSoundSystem = (S32  (RADEXPLINK *)(BINKSNDSYSOPEN, U32))GetProcAddress(hBink, "_BinkSetSoundSystem@8");
    118         qBinkOpenDirectSound = (BINKSNDOPEN (RADEXPLINK *)(U32))GetProcAddress(hBink, "_BinkOpenDirectSound@4"); // don't call directly
    119         qBinkOpenWaveOut = (BINKSNDOPEN (RADEXPLINK *)(U32))GetProcAddress(hBink, "_BinkOpenWaveOut@4"); // don't call directly
    120         qBinkOpenMiles = (BINKSNDOPEN (RADEXPLINK *)(U32))GetProcAddress(hBink, "_BinkOpenMiles@4"); // don't call directly
    121         qBinkDX8SurfaceType = (S32 (RADEXPLINK *)(void*))GetProcAddress(hBink, "_BinkDX8SurfaceType@4");
    122         qBinkDX9SurfaceType = (S32 (RADEXPLINK *)(void*))GetProcAddress(hBink, "_BinkDX9SurfaceType@4");
    123         qBinkBufferOpen = (HBINKBUFFER (RADEXPLINK *)( void* /*HWND*/, U32, U32, U32))GetProcAddress(hBink, "_BinkBufferOpen@16");
    124         qBinkBufferSetHWND = (S32 (RADEXPLINK *)( HBINKBUFFER, void* /*HWND*/))GetProcAddress(hBink, "_BinkBufferSetHWND@8");
    125         qBinkDDSurfaceType = (S32 (RADEXPLINK *)(void PTR4*))GetProcAddress(hBink, "_BinkDDSurfaceType@4");
    126         qBinkIsSoftwareCursor = (S32 (RADEXPLINK *)(void PTR4*, void* /*HCURSOR*/))GetProcAddress(hBink, "_BinkIsSoftwareCursor@8");
    127         qBinkCheckCursor = (S32 (RADEXPLINK *)(void* /*HWND*/,S32,S32,S32,S32))GetProcAddress(hBink, "_BinkCheckCursor@20");
    128         qBinkBufferSetDirectDraw = (S32 (RADEXPLINK *)(void PTR4*, void PTR4*))GetProcAddress(hBink, "_BinkBufferSetDirectDraw@8");
    129         qBinkBufferClose = (void (RADEXPLINK *)( HBINKBUFFER))GetProcAddress(hBink, "_BinkBufferClose@4");
    130         qBinkBufferLock = (S32 (RADEXPLINK *)( HBINKBUFFER))GetProcAddress(hBink, "_BinkBufferLock@4");
    131         qBinkBufferUnlock = (S32 (RADEXPLINK *)( HBINKBUFFER))GetProcAddress(hBink, "_BinkBufferUnlock@4");
    132         qBinkBufferSetResolution = (void (RADEXPLINK *)( S32, S32, S32))GetProcAddress(hBink, "_BinkBufferSetResolution@12");
    133         qBinkBufferCheckWinPos = (void (RADEXPLINK *)( HBINKBUFFER, S32 PTR4*, S32 PTR4*))GetProcAddress(hBink, "_BinkBufferCheckWinPos@12");
    134         qBinkBufferSetOffset = (S32 (RADEXPLINK *)( HBINKBUFFER, S32, S32))GetProcAddress(hBink, "_BinkBufferSetOffset@12");
    135         qBinkBufferBlit = (void (RADEXPLINK *)( HBINKBUFFER, BINKRECT PTR4*, U32 ))GetProcAddress(hBink, "_BinkBufferBlit@12");
    136         qBinkBufferSetScale = (S32 (RADEXPLINK *)( HBINKBUFFER, U32, U32))GetProcAddress(hBink, "_BinkBufferSetScale@12");
    137         qBinkBufferGetDescription = (char PTR4* (RADEXPLINK *)( HBINKBUFFER))GetProcAddress(hBink, "_BinkBufferGetDescription@4");
    138         qBinkBufferGetError = (char PTR4* (RADEXPLINK *)())GetProcAddress(hBink, "_BinkBufferGetError@0");
    139         qBinkRestoreCursor = (void (RADEXPLINK *)(S32))GetProcAddress(hBink, "_BinkRestoreCursor@4");
    140         qBinkBufferClear = (S32 (RADEXPLINK *)(HBINKBUFFER, U32))GetProcAddress(hBink, "_BinkBufferClear@8");
    141         qBinkSetMemory = (void (RADEXPLINK *)(BINKMEMALLOC,BINKMEMFREE))GetProcAddress(hBink, "_BinkSetMemory@8");
    142     }
    143 }
    144 
    145 void QBink_Shutdown(void)
    146 {
    147     if (hBink)
    148         FreeLibrary(hBink);
    149 }

    How to play a Bink video file? Look here.

    CBink.h

     1 #ifndef CBINK_H
     2 #define CBINK_H
     3 
     4 #include "bink.h"
     5 
     6 class CBink
     7 {
     8 public:
     9     CBink();
    10     ~CBink();
    11 public:
    12     BOOL Load(char *pszFileName);
    13     void SetPos(Vector vec1, Vector vec2, Vector vec3, Vector vec4);
    14     void Draw(void);
    15     bool IsValid(void);
    16     char *GetName(void);
    17     void Play(void);
    18     void Pause(void);
    19     void Stop(void);
    20     void Free(void);
    21 private:
    22     int m_iTexID;
    23     HBINK m_hBink;
    24     char *m_pszName;
    25     int m_iWidth;
    26     int m_iHeight;
    27     BYTE *m_pBuffer;
    28     Vector m_vecRect[4];
    29     bool m_bPlay;
    30     float m_flStartTime;
    31     int m_iCurFrame;
    32     int m_iLastFrame;
    33 };
    34 
    35 #endif

    CBink.cpp

      1 #include <metahook.h>
      2 
      3 #include "qbink.h"
      4 #include "surface.h"
      5 #include "qgl.h"
      6 
      7 #include "cbink.h"
      8 
      9 extern IFileSystem *g_pFileSystem;
     10 
     11 CBink::CBink()
     12 {
     13     m_iTexID = 0;
     14     m_hBink = NULL;
     15     m_pszName = NULL;
     16     m_iWidth = 0;
     17     m_iHeight = 0;
     18     m_pBuffer = NULL;
     19     m_bPlay = false;
     20     m_flStartTime = 0.0f;
     21     m_iCurFrame = 0;
     22     m_iLastFrame = 0;
     23 }
     24 
     25 CBink::~CBink()
     26 {
     27     Free();
     28 }
     29 
     30 BOOL CBink::Load(char *pszFileName)
     31 {
     32     if (IsValid())
     33         return FALSE;
     34 
     35     FileHandle_t pFile = g_pFileSystem->Open(pszFileName, "rb");
     36 
     37     if (!pFile)
     38         return FALSE;
     39 
     40     uint32 iFileLength;
     41     BYTE *pBuffer;
     42 
     43     g_pFileSystem->Seek(pFile, 0, FILESYSTEM_SEEK_TAIL);
     44     iFileLength = g_pFileSystem->Tell(pFile);
     45     g_pFileSystem->Seek(pFile, 0, FILESYSTEM_SEEK_HEAD);
     46 
     47     pBuffer = (BYTE *)malloc(iFileLength);
     48     g_pFileSystem->Read(pBuffer, iFileLength, pFile);
     49 
     50     g_pFileSystem->Close(pFile);
     51 
     52     m_hBink = qBinkOpen((char *)pBuffer, BINKFROMMEMORY);
     53     free(pBuffer);
     54 
     55     if (!m_hBink)
     56         return FALSE;
     57 
     58     if (!m_pszName)
     59         m_pszName = (char *)malloc(strlen(pszFileName) * sizeof(char) + 1);
     60 
     61     strcpy(m_pszName, pszFileName);
     62 
     63     if (!m_iTexID)
     64         m_iTexID = g_pSurface->CreateNewTextureID();
     65 
     66     m_iWidth = m_hBink->Width;
     67     m_iHeight = m_hBink->Height;
     68 
     69     DWORD dwBufferSize = m_iWidth * m_iHeight * 3;
     70 
     71     m_pBuffer = (BYTE *)malloc(dwBufferSize);
     72     m_bPlay = false;
     73     m_flStartTime = 0.0f;
     74     m_iCurFrame = 0;
     75     m_iLastFrame = 0;
     76 
     77     qglBindTexture(GL_TEXTURE_2D, m_iTexID);
     78     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     79     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     80 
     81     memset(m_pBuffer, 0, dwBufferSize);
     82     qglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_iWidth, m_iHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, m_pBuffer);
     83 
     84     qBinkGoto(m_hBink, 1, 0);
     85 
     86     return TRUE;
     87 }
     88 
     89 void CBink::SetPos(Vector vec1, Vector vec2, Vector vec3, Vector vec4)
     90 {
     91     if (!IsValid())
     92         return;
     93 
     94     m_vecRect[0] = vec1;
     95     m_vecRect[1] = vec2;
     96     m_vecRect[2] = vec3;
     97     m_vecRect[3] = vec4;
     98 }
     99 
    100 void CBink::Draw(void)
    101 {
    102     if (!IsValid())
    103         return;
    104 
    105     if (!m_bPlay)
    106         return;
    107 
    108     float flCurTime = gEngfuncs.GetClientTime();
    109 
    110     if (m_iLastFrame != m_iCurFrame)
    111     {
    112 #if 0
    113         int iSub = m_iCurFrame - m_iLastFrame;
    114 
    115         for (int i = 0; i < iSub; ++i)
    116         {
    117             qBinkDoFrame(m_hBink);
    118             qBinkNextFrame(m_hBink);
    119         }
    120 #else
    121         qBinkGoto(m_hBink, m_iCurFrame, 0);
    122         qBinkDoFrame(m_hBink);
    123         qBinkNextFrame(m_hBink);
    124 #endif
    125 
    126         qBinkCopyToBuffer(m_hBink, m_pBuffer, m_iWidth * 3, m_iHeight, 0, 0, BINKSURFACE24R);
    127 
    128         qglBindTexture(GL_TEXTURE_2D, m_iTexID);
    129         qglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_iWidth, m_iHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, m_pBuffer);
    130 
    131         m_iLastFrame = m_iCurFrame;
    132     }
    133 
    134     if (m_iCurFrame > 0)
    135     {
    136         qglEnable(GL_TEXTURE_2D);
    137         qglDisable(GL_CULL_FACE);
    138 
    139         qglEnable(GL_BLEND);
    140         qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    141 
    142         qglBindTexture(GL_TEXTURE_2D, m_iTexID);
    143         qglColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    144 
    145         qglBegin(GL_QUADS);
    146         qglTexCoord2f(0.0f, 0.0f);
    147         qglVertex3f(m_vecRect[0].x, m_vecRect[0].y, m_vecRect[0].z);
    148         qglTexCoord2f(1.0f, 0.0f);
    149         qglVertex3f(m_vecRect[1].x, m_vecRect[1].y, m_vecRect[1].z);
    150         qglTexCoord2f(1.0f, 1.0f);
    151         qglVertex3f(m_vecRect[2].x, m_vecRect[2].y, m_vecRect[2].z);
    152         qglTexCoord2f(0.0f, 1.0f);
    153         qglVertex3f(m_vecRect[3].x, m_vecRect[3].y, m_vecRect[3].z);
    154         qglEnd();
    155 
    156         qglEnable(GL_CULL_FACE);
    157     }
    158 
    159     float flPlayTime, flSubTime, flRot;
    160     int iDoFrame;
    161 
    162     flPlayTime = m_hBink->Frames * ((float)m_hBink->FrameRateDiv / (float)m_hBink->FrameRate);
    163     flSubTime = flCurTime - m_flStartTime;
    164     flRot = flSubTime / flPlayTime;
    165 
    166     iDoFrame = (int)((float)m_hBink->Frames * flRot);
    167 
    168     m_iCurFrame = iDoFrame;
    169 
    170     if (m_iCurFrame > (int)m_hBink->Frames)
    171         Stop();
    172 }
    173 
    174 bool CBink::IsValid(void)
    175 {
    176     return m_pBuffer != NULL;
    177 }
    178 
    179 char *CBink::GetName(void)
    180 {
    181     return m_pszName;
    182 }
    183 
    184 void CBink::Play(void)
    185 {
    186     if (!IsValid())
    187         return;
    188 
    189     m_bPlay = true;
    190     m_flStartTime = gEngfuncs.GetClientTime();
    191     m_iCurFrame = 0;
    192     m_iLastFrame = 0;
    193 }
    194 
    195 void CBink::Pause(void)
    196 {
    197     if (!IsValid())
    198         return;
    199 }
    200 
    201 void CBink::Stop(void)
    202 {
    203     if (!IsValid())
    204         return;
    205 
    206     m_bPlay = false;
    207 }
    208 
    209 void CBink::Free(void)
    210 {
    211     if (!IsValid())
    212         return;
    213 
    214     Stop();
    215 
    216     if (m_hBink)
    217         qBinkClose(m_hBink);
    218 
    219     if (m_pszName)
    220         free(m_pszName);
    221 
    222     if (m_pBuffer)
    223         free(m_pBuffer);
    224 
    225     m_hBink = NULL;
    226     m_pszName = NULL;
    227     m_iWidth = 0;
    228     m_iHeight = 0;
    229     m_pBuffer = NULL;
    230 }
  • 相关阅读:
    BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
    BZOJ 2134: 单选错位( 期望 )
    BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )
    BZOJ 2599: [IOI2011]Race( 点分治 )
    BZOJ 3238: [Ahoi2013]差异( 后缀数组 + 单调栈 )
    ZOJ3732 Graph Reconstruction Havel-Hakimi定理
    HDU5653 Bomber Man wants to bomb an Array 简单DP
    HDU 5651 xiaoxin juju needs help 水题一发
    HDU 5652 India and China Origins 并查集
    HDU4725 The Shortest Path in Nya Graph dij
  • 原文地址:https://www.cnblogs.com/crsky/p/4702960.html
Copyright © 2020-2023  润新知