Skip to content

Commit

Permalink
Fix Direct3D states when for primary 2D surface
Browse files Browse the repository at this point in the history
  • Loading branch information
elishacloud committed Mar 9, 2024
1 parent 531f991 commit 8c059ec
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Dllmain/BuildNo.rc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
#define BUILD_NUMBER 6955
#define BUILD_NUMBER 6956
18 changes: 18 additions & 0 deletions ddraw/IDirect3DDeviceX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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);

Expand Down
4 changes: 4 additions & 0 deletions ddraw/IDirect3DDeviceX.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 8c059ec

Please sign in to comment.