This commit is contained in:
tildearrow 2024-05-16 03:02:45 -05:00
parent 05fe5270cd
commit 7413a15369
3 changed files with 89 additions and 45 deletions

View file

@ -175,6 +175,7 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
}
// Backup the DX9 state
/*
IDirect3DStateBlock9* d3d9_state_block = nullptr;
if (bd->pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0)
return;
@ -182,26 +183,28 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
{
d3d9_state_block->Release();
return;
}
}*/
// Backup the DX9 transform (DX9 documentation suggests that it is included in the StateBlock but it doesn't appear to)
/*
D3DMATRIX last_world, last_view, last_projection;
bd->pd3dDevice->GetTransform(D3DTS_WORLD, &last_world);
bd->pd3dDevice->GetTransform(D3DTS_VIEW, &last_view);
bd->pd3dDevice->GetTransform(D3DTS_PROJECTION, &last_projection);
*/
// Allocate buffers
CUSTOMVERTEX* vtx_dst;
ImDrawIdx* idx_dst;
if (bd->pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0)
{
d3d9_state_block->Release();
//d3d9_state_block->Release();
return;
}
if (bd->pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0)
{
bd->pVB->Unlock();
d3d9_state_block->Release();
//d3d9_state_block->Release();
return;
}
@ -282,13 +285,18 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 0, 0, 0);
// Restore the DX9 transform
// don't. I like this transform.
/*
bd->pd3dDevice->SetTransform(D3DTS_WORLD, &last_world);
bd->pd3dDevice->SetTransform(D3DTS_VIEW, &last_view);
bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &last_projection);
*/
// Restore the DX9 state
/*
d3d9_state_block->Apply();
d3d9_state_block->Release();
*/
}
bool ImGui_ImplDX9_Init(IDirect3DDevice9* device)

View file

@ -271,10 +271,15 @@ void FurnaceGUIRenderDX9::clear(ImVec4 color) {
}
void FurnaceGUIRenderDX9::present() {
if (inScene) {
device->EndScene();
inScene=false;
}
if (device->Present(NULL,NULL,NULL,NULL)==D3DERR_DEVICEREMOVED) {
logI("device is gone");
dead=true;
return false;
return;
}
if (mustResize) {
@ -340,22 +345,32 @@ void FurnaceGUIRenderDX9::destroyFontsTexture() {
}
void FurnaceGUIRenderDX9::renderGUI() {
if (!inScene) {
HRESULT result=device->BeginScene();
if (result==D3D_OK) {
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
device->EndScene();
} else {
if (result!=D3D_OK) {
logW("couldn't render GUI! %.8x",result);
return;
}
inScene=true;
}
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}
void FurnaceGUIRenderDX9::wipe(float alpha) {
if (wipeBuf==NULL) return;
/*
logV("WIPE...");
if (!inScene) {
HRESULT result=device->BeginScene();
if (result==D3D_OK) {
if (result!=D3D_OK) {
logW("couldn't render GUI! %.8x",result);
return;
}
inScene=true;
}
D3DVIEWPORT9 view;
view.X=0;
view.Y=0;
@ -363,12 +378,13 @@ void FurnaceGUIRenderDX9::wipe(float alpha) {
view.Height=outH;
view.MinZ=0.0f;
view.MaxZ=1.0f;
result=device->SetViewport(&view);
HRESULT result=device->SetViewport(&view);
if (result!=D3D_OK) {
logW("could not set viewport! %.8x",result);
}
unsigned int color=alpha*255;
unsigned char alphaU=alpha*255.0f;
unsigned int color=alphaU<<24;
void* lockedData;
WipeVertex vertex[4];
@ -382,14 +398,33 @@ void FurnaceGUIRenderDX9::wipe(float alpha) {
memcpy(lockedData,vertex,sizeof(WipeVertex)*4);
wipeBuf->Unlock();
device->SetStreamSource(0,wipeBuf,0,sizeof(WipeVertex));
device->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
device->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
result=device->SetRenderState(D3DRS_SCISSORTESTENABLE,FALSE);
if (result!=D3D_OK) {
logE("SHIT! scissor, %.8x",result);
}
device->EndScene();
result=device->SetTexture(0,NULL);
if (result!=D3D_OK) {
logE("SHIT! set texture, %.8x",result);
}
result=device->SetStreamSource(0,wipeBuf,0,sizeof(WipeVertex));
if (result!=D3D_OK) {
logE("SHIT! set stream source, %.8x",result);
}
result=device->SetTexture(0,NULL);
if (result!=D3D_OK) {
logE("SHIT! set texture, %.8x",result);
}
result=device->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);
if (result!=D3D_OK) {
logE("SHIT! set FVF, %.8x",result);
}
result=device->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
if (result!=D3D_OK) {
logE("SHIT! draw primitive, %.8x",result);
}
} else {
logE("SHIT! lock, %.8x",result);
}
*/
}
bool FurnaceGUIRenderDX9::getOutputSize(int& w, int& h) {

View file

@ -35,7 +35,7 @@ class FurnaceGUIRenderDX9: public FurnaceGUIRender {
int outW, outH, swapInterval;
bool dead, haveScene, supportsDynamicTex, supportsVSync, mustResize, squareTex;
bool dead, haveScene, supportsDynamicTex, supportsVSync, mustResize, squareTex, inScene;
// SHADERS //
@ -94,6 +94,7 @@ class FurnaceGUIRenderDX9: public FurnaceGUIRender {
supportsVSync(false),
mustResize(false),
squareTex(false),
inScene(false),
maxWidth(8192),
maxHeight(8192) {
}