Skip to content

Commit ca8771c

Browse files
committed
Replace unsafe Matrix4/D3DMATRIX casts in W3DShaderManager for GeneralsMD
1 parent 0dfe140 commit ca8771c

File tree

1 file changed

+109
-45
lines changed

1 file changed

+109
-45
lines changed

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

Lines changed: 109 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,7 +1237,13 @@ Int ShroudTextureShader::set(Int stage)
12371237
Matrix4x4 curView;
12381238
DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView);
12391239

1240-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1240+
D3DXMATRIX d3dCurView(
1241+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
1242+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
1243+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
1244+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
1245+
);
1246+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
12411247

12421248
D3DXMATRIX scale,offset;
12431249

@@ -1260,8 +1266,8 @@ Int ShroudTextureShader::set(Int stage)
12601266
width = 1.0f/(width*shroud->getTextureWidth());
12611267
height = 1.0f/(height*shroud->getTextureHeight());
12621268
D3DXMatrixScaling(&scale, width, height, 1);
1263-
*((D3DXMATRIX *)&curView) = (inv * offset) * scale;
1264-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView));
1269+
D3DXMATRIX texTransform = (inv * offset) * scale;
1270+
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
12651271
}
12661272
m_stageOfSet=stage;
12671273
return TRUE;
@@ -1330,7 +1336,13 @@ Int FlatShroudTextureShader::set(Int stage)
13301336
Matrix4x4 curView;
13311337
DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView);
13321338

1333-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1339+
D3DXMATRIX d3dCurView(
1340+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
1341+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
1342+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
1343+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
1344+
);
1345+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
13341346

13351347
D3DXMATRIX scale,offset;
13361348

@@ -1353,8 +1365,8 @@ Int FlatShroudTextureShader::set(Int stage)
13531365
width = 1.0f/(width*shroud->getTextureWidth());
13541366
height = 1.0f/(height*shroud->getTextureHeight());
13551367
D3DXMatrixScaling(&scale, width, height, 1);
1356-
*((D3DXMATRIX *)&curView) = (inv * offset) * scale;
1357-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView));
1368+
D3DXMATRIX texTransform = (inv * offset) * scale;
1369+
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
13581370
}
13591371
m_stageOfSet=stage;
13601372
return TRUE;
@@ -1422,8 +1434,13 @@ Int MaskTextureShader::set(Int pass)
14221434
D3DXMATRIX inv;
14231435
float det;
14241436

1425-
//Get inverse view matrix so we can transform camera space points back to world space
1426-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1437+
D3DXMATRIX d3dCurView(
1438+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
1439+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
1440+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
1441+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
1442+
);
1443+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
14271444

14281445
D3DXMATRIX scale,offset,offsetTextureCenter;
14291446
Coord3D centerPos;
@@ -1449,18 +1466,19 @@ Int MaskTextureShader::set(Int pass)
14491466
Real worldTexelHeight=(1.0f-fadeLevel)*25.0f;
14501467

14511468
///@todo: Fix this to work with non 128x128 textures.
1469+
D3DXMATRIX texTransform;
14521470
if (worldTexelWidth != 0 && worldTexelHeight != 0)
14531471
{ Real widthScale = 1.0f/(worldTexelWidth*128.0f);
14541472
Real heightScale = 1.0f/(worldTexelHeight*128.0f);
14551473
D3DXMatrixScaling(&scale, widthScale, heightScale, 1);
1456-
*((D3DXMATRIX *)&curView) = ((inv * offset) * scale)*offsetTextureCenter;
1474+
texTransform = ((inv * offset) * scale)*offsetTextureCenter;
14571475
}
14581476
else
14591477
{ D3DXMatrixScaling(&scale, 0, 0, 1); //scaling by 0 will set uv coordinates to 0,0
1460-
*((D3DXMATRIX *)&curView) = ((inv * offset) * scale);
1478+
texTransform = ((inv * offset) * scale);
14611479
}
14621480

1463-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView));
1481+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform);
14641482

14651483
return TRUE;
14661484
}
@@ -1715,24 +1733,32 @@ Int TerrainShader2Stage::set(Int pass)
17151733
D3DXMATRIX inv;
17161734
float det;
17171735

1718-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1736+
D3DXMATRIX d3dCurView(
1737+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
1738+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
1739+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
1740+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
1741+
);
1742+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
17191743

17201744
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE12)
17211745
{
17221746
//setup cloud pass
17231747
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
17241748

1725-
updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1726-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView);
1749+
D3DXMATRIX texTransform;
1750+
terrainShader2Stage.updateNoise1(&texTransform,&inv);
1751+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform);
17271752
//clouds always need bilinear filtering
17281753
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17291754
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17301755

17311756
//setup noise pass
17321757
DX8Wrapper::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
17331758

1734-
updateNoise2(((D3DXMATRIX*)&curView),&inv);
1735-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
1759+
D3DXMATRIX texTransform2;
1760+
terrainShader2Stage.updateNoise2(&texTransform2,&inv);
1761+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform2);
17361762
//noise always needs point/linear filtering. Why point!?
17371763
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
17381764
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
@@ -1751,25 +1777,26 @@ Int TerrainShader2Stage::set(Int pass)
17511777
else
17521778
{ //only 1 noise or cloud texture
17531779
// Now setup the texture pipeline.
1780+
D3DXMATRIX texTransform3;
17541781
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
17551782
{ //setup cloud pass
17561783
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
1757-
updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1784+
terrainShader2Stage.updateNoise1(&texTransform3,&inv);
17581785
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17591786
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17601787
}
17611788
else
17621789
{
17631790
//setup noise pass
17641791
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
1765-
updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1792+
terrainShader2Stage.updateNoise2(&texTransform3,&inv);
17661793
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
17671794
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17681795
}
17691796

17701797
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
17711798
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
1772-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView));
1799+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform3);
17731800
}
17741801
break;
17751802
}
@@ -2043,7 +2070,13 @@ Int TerrainShaderPixelShader::set(Int pass)
20432070

20442071
D3DXMATRIX inv;
20452072
float det;
2046-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2073+
D3DXMATRIX d3dCurView(
2074+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
2075+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
2076+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
2077+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
2078+
);
2079+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
20472080

20482081
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20492082
// Two output coordinates are used.
@@ -2066,11 +2099,13 @@ Int TerrainShaderPixelShader::set(Int pass)
20662099
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MINFILTER, D3DTEXF_POINT);
20672100
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20682101

2069-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2070-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2102+
D3DXMATRIX texTransform1;
2103+
terrainShader2Stage.updateNoise1(&texTransform1,&inv);
2104+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform1);
20712105

2072-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2073-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, curView);
2106+
D3DXMATRIX texTransform2;
2107+
terrainShader2Stage.updateNoise2(&texTransform2,&inv);
2108+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, texTransform2);
20742109

20752110
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20762111
// Two output coordinates are used.
@@ -2080,21 +2115,22 @@ Int TerrainShaderPixelShader::set(Int pass)
20802115
{ //single noise texture shader
20812116
DX8Wrapper::_Get_D3D_Device8()->SetPixelShader(m_dwBaseNoise1PixelShader);
20822117

2118+
D3DXMATRIX texTransform3;
20832119
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
20842120
{ //cloud map
20852121
DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
2086-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2122+
terrainShader2Stage.updateNoise1(&texTransform3,&inv);
20872123
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
20882124
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20892125
}
20902126
else
20912127
{ //light map
20922128
DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
2093-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2129+
terrainShader2Stage.updateNoise2(&texTransform3,&inv);
20942130
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT);
20952131
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20962132
}
2097-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2133+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform3);
20982134
}
20992135
}
21002136
else
@@ -2164,14 +2200,20 @@ Int CloudTextureShader::set(Int stage)
21642200
D3DXMATRIX inv;
21652201
float det;
21662202

2167-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2203+
D3DXMATRIX d3dCurView(
2204+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
2205+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
2206+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
2207+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
2208+
);
2209+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
21682210

2169-
//Get a texture matrix that applies the current cloud position
2170-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv,false); //update curView with texture matrix
2211+
D3DXMATRIX texTransform;
2212+
terrainShader2Stage.updateNoise1(&texTransform,&inv,false);
2213+
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
21712214

21722215
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
21732216
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
2174-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView);
21752217
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
21762218
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
21772219
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
@@ -2298,7 +2340,13 @@ Int RoadShaderPixelShader::set(Int pass)
22982340

22992341
D3DXMATRIX inv;
23002342
float det;
2301-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2343+
D3DXMATRIX d3dCurView(
2344+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
2345+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
2346+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
2347+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
2348+
);
2349+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
23022350

23032351
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
23042352
{ DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2330,11 +2378,13 @@ Int RoadShaderPixelShader::set(Int pass)
23302378
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT);
23312379
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
23322380

2333-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2334-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
2381+
D3DXMATRIX texTransform1;
2382+
terrainShader2Stage.updateNoise1(&texTransform1,&inv, false);
2383+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform1);
23352384

2336-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2337-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2385+
D3DXMATRIX texTransform2;
2386+
terrainShader2Stage.updateNoise2(&texTransform2,&inv, false);
2387+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform2);
23382388

23392389
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
23402390
// Two output coordinates are used.
@@ -2413,7 +2463,13 @@ Int RoadShader2Stage::set(Int pass)
24132463

24142464
D3DXMATRIX inv;
24152465
float det;
2416-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2466+
D3DXMATRIX d3dCurView(
2467+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
2468+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
2469+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
2470+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
2471+
);
2472+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
24172473

24182474
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
24192475
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2434,33 +2490,33 @@ Int RoadShader2Stage::set(Int pass)
24342490
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
24352491
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
24362492

2493+
D3DXMATRIX texTransform3;
24372494
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE12)
24382495
{ //full shader, apply noise 1 in pass 0.
24392496
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1));
24402497
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24412498
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24422499

2443-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2444-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
2500+
terrainShader2Stage.updateNoise1(&texTransform3,&inv, false);
24452501
}
24462502
else
24472503
{ //single noise texture shader
24482504
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE1)
24492505
{ //cloud map
24502506
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1));
2451-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2507+
terrainShader2Stage.updateNoise1(&texTransform3,&inv, false);
24522508
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24532509
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24542510
}
24552511
else
24562512
{ //light map
24572513
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2));
2458-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2514+
terrainShader2Stage.updateNoise2(&texTransform3,&inv, false);
24592515
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
24602516
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24612517
}
2462-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
24632518
}
2519+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform3);
24642520
}
24652521
else
24662522
{ //just base texturing
@@ -2475,7 +2531,13 @@ Int RoadShader2Stage::set(Int pass)
24752531

24762532
D3DXMATRIX inv;
24772533
float det;
2478-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2534+
D3DXMATRIX d3dCurView(
2535+
curView[0][0], curView[0][1], curView[0][2], curView[0][3],
2536+
curView[1][0], curView[1][1], curView[1][2], curView[1][3],
2537+
curView[2][0], curView[2][1], curView[2][2], curView[2][3],
2538+
curView[3][0], curView[3][1], curView[3][2], curView[3][3]
2539+
);
2540+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
24792541

24802542
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
24812543
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2484,7 +2546,9 @@ Int RoadShader2Stage::set(Int pass)
24842546

24852547
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2));
24862548

2487-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2549+
D3DXMATRIX texTransform;
2550+
terrainShader2Stage.updateNoise2(&texTransform,&inv, false);
2551+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform);
24882552
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
24892553
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24902554

@@ -2516,7 +2580,7 @@ Int RoadShader2Stage::set(Int pass)
25162580
DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_ZERO);
25172581
DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
25182582

2519-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView);
2583+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform);
25202584
}
25212585

25222586
return TRUE;

0 commit comments

Comments
 (0)