From 8c059ecaa4f5f30d2277bcf80bb9c9bb6054626b Mon Sep 17 00:00:00 2001 From: Elisha Riedlinger Date: Fri, 8 Mar 2024 20:52:05 -0800 Subject: [PATCH] Fix Direct3D states when for primary 2D surface --- Dllmain/BuildNo.rc | 2 +- ddraw/IDirect3DDeviceX.cpp | 18 ++++++++++++++++++ ddraw/IDirect3DDeviceX.h | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Dllmain/BuildNo.rc b/Dllmain/BuildNo.rc index fd0b7e29..27936d7d 100644 --- a/Dllmain/BuildNo.rc +++ b/Dllmain/BuildNo.rc @@ -1 +1 @@ -#define BUILD_NUMBER 6955 +#define BUILD_NUMBER 6956 diff --git a/ddraw/IDirect3DDeviceX.cpp b/ddraw/IDirect3DDeviceX.cpp index eb446eeb..a14d6c6a 100644 --- a/ddraw/IDirect3DDeviceX.cpp +++ b/ddraw/IDirect3DDeviceX.cpp @@ -1115,6 +1115,7 @@ HRESULT m_IDirect3DDeviceX::SetTextureStageState(DWORD dwStage, D3DTEXTURESTAGES if (!CheckTextureStageStateType(dwState)) { LOG_LIMIT(100, __FUNCTION__ << " Warning: Texture state type not implemented: " << dwState); + return DD_OK; // Just return OK for now! } return (*d3d9Device)->SetTextureStageState(dwStage, dwState, dwValue); @@ -2247,6 +2248,7 @@ HRESULT m_IDirect3DDeviceX::SetRenderState(D3DRENDERSTATETYPE dwRenderStateType, if (!CheckRenderStateType(dwRenderStateType)) { LOG_LIMIT(100, __FUNCTION__ << " Warning: Render state type not implemented: " << dwRenderStateType); + return DD_OK; // Just return OK for now! } return (*d3d9Device)->SetRenderState(dwRenderStateType, dwRenderState); @@ -3390,16 +3392,26 @@ inline void m_IDirect3DDeviceX::SetDrawStates(DWORD dwVertexTypeDesc, DWORD dwFl } if (dwFlags & D3DDP_DXW_DRAW2DSURFACE) { + // Set by DirectDrawSurface (*d3d9Device)->GetRenderState(D3DRS_LIGHTING, &DrawStates.rsLighting); (*d3d9Device)->GetSamplerState(0, D3DSAMP_MAGFILTER, &DrawStates.ssMagFilter); + // Other states + (*d3d9Device)->GetTextureStageState(0, D3DTSS_COLOROP, &DrawStates.tsColorOP); (*d3d9Device)->GetRenderState(D3DRS_ALPHABLENDENABLE, &DrawStates.rsAlphaBlendEnable); + (*d3d9Device)->GetRenderState(D3DRS_ALPHAREF, &DrawStates.rsAlphaRef); + (*d3d9Device)->GetRenderState(D3DRS_ALPHAFUNC, &DrawStates.rsAlphaFunc); (*d3d9Device)->GetRenderState(D3DRS_SRCBLEND, &DrawStates.rsSrcBlend); (*d3d9Device)->GetRenderState(D3DRS_DESTBLEND, &DrawStates.rsDestBlend); + (*d3d9Device)->GetRenderState(D3DRS_FOGENABLE, &DrawStates.rsFogEnable); + (*d3d9Device)->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); (*d3d9Device)->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + (*d3d9Device)->SetRenderState(D3DRS_ALPHAREF, 0x00000000); + (*d3d9Device)->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_ALWAYS); (*d3d9Device)->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); (*d3d9Device)->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); + (*d3d9Device)->SetRenderState(D3DRS_FOGENABLE, FALSE); } } @@ -3427,10 +3439,16 @@ inline void m_IDirect3DDeviceX::RestoreDrawStates(DWORD dwVertexTypeDesc, DWORD } if (dwFlags & D3DDP_DXW_DRAW2DSURFACE) { + // Other states + (*d3d9Device)->SetTextureStageState(0, D3DTSS_COLOROP, DrawStates.tsColorOP); (*d3d9Device)->SetRenderState(D3DRS_ALPHABLENDENABLE, DrawStates.rsAlphaBlendEnable); + (*d3d9Device)->SetRenderState(D3DRS_ALPHAREF, DrawStates.rsAlphaRef); + (*d3d9Device)->SetRenderState(D3DRS_ALPHAFUNC, DrawStates.rsAlphaFunc); (*d3d9Device)->SetRenderState(D3DRS_SRCBLEND, DrawStates.rsSrcBlend); (*d3d9Device)->SetRenderState(D3DRS_DESTBLEND, DrawStates.rsDestBlend); + (*d3d9Device)->SetRenderState(D3DRS_FOGENABLE, DrawStates.rsFogEnable); + // Set by DirectDrawSurface (*d3d9Device)->SetRenderState(D3DRS_LIGHTING, DrawStates.rsLighting); (*d3d9Device)->SetSamplerState(0, D3DSAMP_MAGFILTER, DrawStates.ssMagFilter); diff --git a/ddraw/IDirect3DDeviceX.h b/ddraw/IDirect3DDeviceX.h index 6ff3fdf4..0122164a 100644 --- a/ddraw/IDirect3DDeviceX.h +++ b/ddraw/IDirect3DDeviceX.h @@ -26,9 +26,13 @@ class m_IDirect3DDeviceX : public IUnknown, public AddressLookupTableDdrawObject DWORD rsClipping = 0; DWORD rsLighting = 0; DWORD rsExtents = 0; + DWORD tsColorOP = 0; DWORD rsAlphaBlendEnable = 0; + DWORD rsAlphaRef = 0; + DWORD rsAlphaFunc = 0; DWORD rsSrcBlend = 0; DWORD rsDestBlend = 0; + DWORD rsFogEnable = 0; DWORD ssMagFilter = 0; DWORD dwColorSpaceLowValue = 0; DWORD dwColorSpaceHighValue = 0;