Skip to content

Instantly share code, notes, and snippets.

@adler3d
Created April 2, 2017 22:45
Show Gist options
  • Save adler3d/4b14129dea357b24a4ec7ebb2376d852 to your computer and use it in GitHub Desktop.
Save adler3d/4b14129dea357b24a4ec7ebb2376d852 to your computer and use it in GitHub Desktop.
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