Skip to content

Commit 8a83a1d

Browse files
committed
[ZH] Fix the bugged smudge or heat haze effect of the USA Microwave Tank
1 parent e8b55f5 commit 8a83a1d

File tree

1 file changed

+18
-4
lines changed
  • GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient

1 file changed

+18
-4
lines changed

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DSmudge.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ void W3DSmudgeManager::ReleaseResources(void)
8080
//Make sure (SMUDGE_DRAW_SIZE * 12) < 65535 because that's the max index buffer size.
8181
#define SMUDGE_DRAW_SIZE 500 //draw at most 50 smudges per call. Tweak value to improve CPU/GPU parallelism.
8282

83+
static_assert(SMUDGE_DRAW_SIZE * 12 < 65535, "Must not exceed the max index buffer size");
84+
85+
8386
void W3DSmudgeManager::ReAcquireResources(void)
8487
{
8588
ReleaseResources();
@@ -467,12 +470,12 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
467470
VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset(VertexMaterialClass::PRELIT_DIFFUSE);
468471
DX8Wrapper::Set_Material(vmat);
469472
REF_PTR_RELEASE(vmat);
470-
DX8Wrapper::Apply_Render_State_Changes();
471473

472474
//Disable reading texture alpha since it's undefined.
473475
//DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
474476
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG2);
475477

478+
Int smudgesBatchCount=0;
476479
Int smudgesRemaining=count;
477480
set=m_usedSmudgeSetList.Head(); //first smudge set that needs rendering.
478481
Smudge *remainingSmudgeStart=set->getUsedSmudgeList().Head(); //first smudge that needs rendering.
@@ -502,7 +505,8 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
502505

503506
//Check if we exceeded maximum number of smudges allowed per draw call.
504507
if (smudgesInRenderBatch >= count)
505-
{ remainingSmudgeStart = smudge;
508+
{
509+
remainingSmudgeStart = smudge;
506510
goto flushSmudges;
507511
}
508512

@@ -535,9 +539,10 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
535539
if (set) //start next batch at beginning of set.
536540
remainingSmudgeStart = set->getUsedSmudgeList().Head();
537541
}
538-
flushSmudges:
539-
DX8Wrapper::Set_Vertex_Buffer(vb_access);
540542
}
543+
flushSmudges:
544+
++smudgesBatchCount;
545+
DX8Wrapper::Set_Vertex_Buffer(vb_access);
541546

542547
DX8Wrapper::Draw_Triangles( 0,smudgesInRenderBatch*4, 0, smudgesInRenderBatch*5);
543548

@@ -553,6 +558,15 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
553558
smudgesRemaining -= smudgesInRenderBatch;
554559
}
555560

561+
// TheSuperHackers @bugfix xezon 15/06/2025 Draw a dummy point with the last vertex buffer
562+
// to force the GPU to flush all current pipeline state and commit the previous draw call.
563+
// This is required for some AMD models and drivers that refuse to flush a single draw call
564+
// for the smudges. This draw call is invisible and harmless.
565+
if (smudgesBatchCount == 1)
566+
{
567+
DX8Wrapper::_Get_D3D_Device8()->DrawPrimitive(D3DPT_POINTLIST, 0, 1);
568+
}
569+
556570
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
557571
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
558572

0 commit comments

Comments
 (0)