Created
April 2, 2017 22:45
-
-
Save adler3d/4b14129dea357b24a4ec7ebb2376d852 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void AVISceneRenderEx() | |
{ | |
auto&Dev=D9Dev; | |
vec2i ClientSize=win.GetClientSize(); | |
if(!Dev.BeginScene())return; | |
{ | |
D3DVIEWPORT9 ViewPort={0,0,ClientSize.x,ClientSize.y,-1.f,+1.f}; | |
Dev.pDev->SetViewport(&ViewPort); | |
Dev.Set2D(vec2i(0,0),1.0,0,&ClientSize); | |
Dev.Clear2D(0xffc8c8c8); | |
qDev.NextFrame(); | |
SceneDoDraw(); | |
} | |
if(!Dev.EndScene())return; | |
} | |
void UpdateAVISYS2(const string&fn="foo.avi",int FPS=60,int onkey=VK_F9){ | |
auto&rec=avirecsys2; | |
if(kb.OnDown(onkey)){ | |
inv(rec.enabled); | |
if(rec.enabled)rec.start(this,fn); | |
if(!rec.enabled)rec.stop(); | |
} | |
rec.update(FPS); | |
} | |
template<class TGame> | |
struct t_avirecsys2:t_avi{ | |
#define DEF_PRO_VARIABLE(ADD)\ | |
ADD(bool,enabled,false)\ | |
ADD(IDirect3DSurface9*,surface,nullptr)\ | |
ADD(IDirect3DSurface9*,rt,nullptr)\ | |
ADD(IDirect3DSurface9*,pold,nullptr)\ | |
ADD(TGame*,pgame,nullptr)\ | |
ADD(QapTexMem,mem,mem)\ | |
//=== | |
#include "defprovar.inl" | |
//=== | |
t_avirecsys2(){DoReset();} | |
~t_avirecsys2(){stop();} | |
void start(TGame*pgame,const string&fn){ | |
this->pgame=pgame; | |
auto&pDev=pgame->qDev.pDev; | |
QapAssert(!surface&&!rt&&!pold); | |
auto sm=GetScreenMode();auto W=sm.W;auto H=sm.H;mem.Init(W,H); | |
pDev->CreateRenderTarget(W,H,pgame->D9Dev.PresParams.pp.BackBufferFormat,D3DMULTISAMPLE_NONE,0,0,&rt,0); | |
pDev->CreateOffscreenPlainSurface(W,H,pgame->D9Dev.PresParams.pp.BackBufferFormat,D3DPOOL_SYSTEMMEM,&surface,NULL); | |
QapAssert(rt);QapAssert(surface); | |
START_AVI(fn.c_str()); | |
} | |
template<class TYPE>static void comfree(TYPE*&ptr){if(ptr)ptr->Release();ptr=nullptr;} | |
void stop(){ | |
if(!surface)return; | |
STOP_AVI(); | |
comfree(surface);comfree(rt);comfree(pold); | |
} | |
void update(int FPS){ | |
if(!enabled){return;} | |
auto&pDev=pgame->qDev.pDev; | |
QapAssert(surface&&rt&&!pold); | |
pDev->GetRenderTarget(0,&pold); | |
pDev->SetRenderTarget(0,rt); | |
QapAssert(pold); | |
pgame->AVISceneRenderEx(); | |
if(pDev->GetRenderTargetData(rt,surface)){QapDebugMsg("GetFrontBufferData - failed");return;} | |
{ | |
D3DLOCKED_RECT LockedRect; | |
surface->LockRect(&LockedRect,NULL,D3DLOCK_READONLY); | |
auto*p=(QapColor*)LockedRect.pBits; | |
auto W=mem.W;auto H=mem.H;QapColor*pix=mem.get(); | |
for(int y=0;y<H;y++)for(int x=0;x<W;x++)pix[(H-y-1)*W+x]=p[y*W+x]; | |
QapBitmapInfo QBI(W,H);ADD_FRAME_FROM_DIB_TO_AVI(&QBI.BH,pix,"XVID",FPS); | |
surface->UnlockRect(); | |
} | |
pDev->SetRenderTarget(0,pold); | |
comfree(pold); | |
} | |
bool is_avi_pass()const{return pold;} | |
}; | |
t_avirecsys2<TGame> avirecsys2; | |
bool is_avi_pass()const{return avirecsys2.is_avi_pass();} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment