Skip to content

Commit 9d43b89

Browse files
committed
refactor(dx8): Replace unsafe Matrix4x4/D3DMATRIX casts with proper transpose conversion
1 parent e6c28a4 commit 9d43b89

File tree

10 files changed

+306
-97
lines changed

10 files changed

+306
-97
lines changed

Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,7 +1237,8 @@ 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 = Build_D3DXMATRIX(curView);
1241+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
12411242

12421243
D3DXMATRIX scale,offset;
12431244

@@ -1260,8 +1261,8 @@ Int ShroudTextureShader::set(Int stage)
12601261
width = 1.0f/(width*shroud->getTextureWidth());
12611262
height = 1.0f/(height*shroud->getTextureHeight());
12621263
D3DXMatrixScaling(&scale, width, height, 1);
1263-
*((D3DXMATRIX *)&curView) = (inv * offset) * scale;
1264-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView));
1264+
D3DXMATRIX texTransform = (inv * offset) * scale;
1265+
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
12651266
}
12661267
m_stageOfSet=stage;
12671268
return TRUE;
@@ -1330,7 +1331,8 @@ Int FlatShroudTextureShader::set(Int stage)
13301331
Matrix4x4 curView;
13311332
DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView);
13321333

1333-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1334+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
1335+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
13341336

13351337
D3DXMATRIX scale,offset;
13361338

@@ -1353,8 +1355,8 @@ Int FlatShroudTextureShader::set(Int stage)
13531355
width = 1.0f/(width*shroud->getTextureWidth());
13541356
height = 1.0f/(height*shroud->getTextureHeight());
13551357
D3DXMatrixScaling(&scale, width, height, 1);
1356-
*((D3DXMATRIX *)&curView) = (inv * offset) * scale;
1357-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView));
1358+
D3DXMATRIX texTransform = (inv * offset) * scale;
1359+
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform);
13581360
}
13591361
m_stageOfSet=stage;
13601362
return TRUE;
@@ -1422,8 +1424,8 @@ Int MaskTextureShader::set(Int pass)
14221424
D3DXMATRIX inv;
14231425
float det;
14241426

1425-
//Get inverse view matrix so we can transform camera space points back to world space
1426-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1427+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
1428+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
14271429

14281430
D3DXMATRIX scale,offset,offsetTextureCenter;
14291431
Coord3D centerPos;
@@ -1449,18 +1451,19 @@ Int MaskTextureShader::set(Int pass)
14491451
Real worldTexelHeight=(1.0f-fadeLevel)*25.0f;
14501452

14511453
///@todo: Fix this to work with non 128x128 textures.
1454+
D3DXMATRIX texTransform;
14521455
if (worldTexelWidth != 0 && worldTexelHeight != 0)
14531456
{ Real widthScale = 1.0f/(worldTexelWidth*128.0f);
14541457
Real heightScale = 1.0f/(worldTexelHeight*128.0f);
14551458
D3DXMatrixScaling(&scale, widthScale, heightScale, 1);
1456-
*((D3DXMATRIX *)&curView) = ((inv * offset) * scale)*offsetTextureCenter;
1459+
texTransform = ((inv * offset) * scale)*offsetTextureCenter;
14571460
}
14581461
else
14591462
{ D3DXMatrixScaling(&scale, 0, 0, 1); //scaling by 0 will set uv coordinates to 0,0
1460-
*((D3DXMATRIX *)&curView) = ((inv * offset) * scale);
1463+
texTransform = ((inv * offset) * scale);
14611464
}
14621465

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

14651468
return TRUE;
14661469
}
@@ -1715,24 +1718,27 @@ Int TerrainShader2Stage::set(Int pass)
17151718
D3DXMATRIX inv;
17161719
float det;
17171720

1718-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
1721+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
1722+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
17191723

17201724
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE12)
17211725
{
17221726
//setup cloud pass
17231727
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
17241728

1725-
updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1726-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView);
1729+
D3DXMATRIX texTransform;
1730+
terrainShader2Stage.updateNoise1(&texTransform,&inv);
1731+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform);
17271732
//clouds always need bilinear filtering
17281733
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17291734
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17301735

17311736
//setup noise pass
17321737
DX8Wrapper::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
17331738

1734-
updateNoise2(((D3DXMATRIX*)&curView),&inv);
1735-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
1739+
D3DXMATRIX texTransform2;
1740+
terrainShader2Stage.updateNoise2(&texTransform2,&inv);
1741+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform2);
17361742
//noise always needs point/linear filtering. Why point!?
17371743
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
17381744
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
@@ -1751,25 +1757,26 @@ Int TerrainShader2Stage::set(Int pass)
17511757
else
17521758
{ //only 1 noise or cloud texture
17531759
// Now setup the texture pipeline.
1760+
D3DXMATRIX texTransform3;
17541761
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
17551762
{ //setup cloud pass
17561763
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
1757-
updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1764+
terrainShader2Stage.updateNoise1(&texTransform3,&inv);
17581765
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
17591766
DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17601767
}
17611768
else
17621769
{
17631770
//setup noise pass
17641771
DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
1765-
updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
1772+
terrainShader2Stage.updateNoise2(&texTransform3,&inv);
17661773
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
17671774
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
17681775
}
17691776

17701777
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
17711778
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
1772-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView));
1779+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform3);
17731780
}
17741781
break;
17751782
}
@@ -2043,7 +2050,8 @@ Int TerrainShaderPixelShader::set(Int pass)
20432050

20442051
D3DXMATRIX inv;
20452052
float det;
2046-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2053+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
2054+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
20472055

20482056
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20492057
// Two output coordinates are used.
@@ -2066,11 +2074,13 @@ Int TerrainShaderPixelShader::set(Int pass)
20662074
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MINFILTER, D3DTEXF_POINT);
20672075
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20682076

2069-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2070-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2077+
D3DXMATRIX texTransform1;
2078+
terrainShader2Stage.updateNoise1(&texTransform1,&inv);
2079+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform1);
20712080

2072-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2073-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, curView);
2081+
D3DXMATRIX texTransform2;
2082+
terrainShader2Stage.updateNoise2(&texTransform2,&inv);
2083+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, texTransform2);
20742084

20752085
DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
20762086
// Two output coordinates are used.
@@ -2080,21 +2090,22 @@ Int TerrainShaderPixelShader::set(Int pass)
20802090
{ //single noise texture shader
20812091
DX8Wrapper::_Get_D3D_Device8()->SetPixelShader(m_dwBaseNoise1PixelShader);
20822092

2093+
D3DXMATRIX texTransform3;
20832094
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1)
20842095
{ //cloud map
20852096
DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture());
2086-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2097+
terrainShader2Stage.updateNoise1(&texTransform3,&inv);
20872098
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
20882099
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20892100
}
20902101
else
20912102
{ //light map
20922103
DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture());
2093-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix
2104+
terrainShader2Stage.updateNoise2(&texTransform3,&inv);
20942105
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT);
20952106
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
20962107
}
2097-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2108+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform3);
20982109
}
20992110
}
21002111
else
@@ -2164,14 +2175,15 @@ Int CloudTextureShader::set(Int stage)
21642175
D3DXMATRIX inv;
21652176
float det;
21662177

2167-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2178+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
2179+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
21682180

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

21722185
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
21732186
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
2174-
DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView);
21752187
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
21762188
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
21772189
DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
@@ -2298,7 +2310,8 @@ Int RoadShaderPixelShader::set(Int pass)
22982310

22992311
D3DXMATRIX inv;
23002312
float det;
2301-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2313+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
2314+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
23022315

23032316
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
23042317
{ DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2330,11 +2343,13 @@ Int RoadShaderPixelShader::set(Int pass)
23302343
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT);
23312344
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
23322345

2333-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2334-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
2346+
D3DXMATRIX texTransform1;
2347+
terrainShader2Stage.updateNoise1(&texTransform1,&inv, false);
2348+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform1);
23352349

2336-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2337-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView);
2350+
D3DXMATRIX texTransform2;
2351+
terrainShader2Stage.updateNoise2(&texTransform2,&inv, false);
2352+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform2);
23382353

23392354
DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
23402355
// Two output coordinates are used.
@@ -2413,7 +2428,8 @@ Int RoadShader2Stage::set(Int pass)
24132428

24142429
D3DXMATRIX inv;
24152430
float det;
2416-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2431+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
2432+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
24172433

24182434
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
24192435
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2434,33 +2450,33 @@ Int RoadShader2Stage::set(Int pass)
24342450
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT );
24352451
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
24362452

2453+
D3DXMATRIX texTransform3;
24372454
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE12)
24382455
{ //full shader, apply noise 1 in pass 0.
24392456
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1));
24402457
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24412458
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24422459

2443-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix
2444-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
2460+
terrainShader2Stage.updateNoise1(&texTransform3,&inv, false);
24452461
}
24462462
else
24472463
{ //single noise texture shader
24482464
if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE1)
24492465
{ //cloud map
24502466
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1));
2451-
terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2467+
terrainShader2Stage.updateNoise1(&texTransform3,&inv, false);
24522468
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
24532469
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24542470
}
24552471
else
24562472
{ //light map
24572473
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2));
2458-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2474+
terrainShader2Stage.updateNoise2(&texTransform3,&inv, false);
24592475
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
24602476
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24612477
}
2462-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView);
24632478
}
2479+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform3);
24642480
}
24652481
else
24662482
{ //just base texturing
@@ -2475,7 +2491,8 @@ Int RoadShader2Stage::set(Int pass)
24752491

24762492
D3DXMATRIX inv;
24772493
float det;
2478-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
2494+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
2495+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
24792496

24802497
if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex)
24812498
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
@@ -2484,7 +2501,9 @@ Int RoadShader2Stage::set(Int pass)
24842501

24852502
DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2));
24862503

2487-
terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix
2504+
D3DXMATRIX texTransform;
2505+
terrainShader2Stage.updateNoise2(&texTransform,&inv, false);
2506+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform);
24882507
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT);
24892508
DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
24902509

@@ -2516,7 +2535,7 @@ Int RoadShader2Stage::set(Int pass)
25162535
DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_ZERO);
25172536
DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
25182537

2519-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView);
2538+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform);
25202539
}
25212540

25222541
return TRUE;

Core/Libraries/Source/WWVegas/WWMath/matrix4.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,6 @@ class Matrix4x4
181181
static WWINLINE void Transform_Vector(const Matrix4x4 & tm,const Vector3 & in,Vector4 * out);
182182
static WWINLINE void Transform_Vector(const Matrix4x4 & tm,const Vector4 & in,Vector4 * out);
183183

184-
protected:
185-
186184
Vector4 Row[4];
187185

188186
};
@@ -836,3 +834,4 @@ WWINLINE void Matrix4x4::Transform_Vector(const Matrix4x4 & A,const Vector4 & in
836834
out->Z = (A[2][0] * v->X + A[2][1] * v->Y + A[2][2] * v->Z + A[2][3] * v->W);
837835
out->W = (A[3][0] * v->X + A[3][1] * v->Y + A[3][2] * v->Z + A[3][3] * v->W);
838836
}
837+

Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,19 @@ void W3DVolumetricShadow::updateMeshVolume(Int meshIndex, Int lightIndex, const
19071907
// system change, not the translations
19081908
//
19091909
Real det;
1910-
D3DXMatrixInverse((D3DXMATRIX*)&worldToObject, &det, (D3DXMATRIX*)&objectToWorld);
1910+
D3DXMATRIX d3dObjectToWorld(
1911+
objectToWorld[0][0], objectToWorld[0][1], objectToWorld[0][2], objectToWorld[0][3],
1912+
objectToWorld[1][0], objectToWorld[1][1], objectToWorld[1][2], objectToWorld[1][3],
1913+
objectToWorld[2][0], objectToWorld[2][1], objectToWorld[2][2], objectToWorld[2][3],
1914+
objectToWorld[3][0], objectToWorld[3][1], objectToWorld[3][2], objectToWorld[3][3]
1915+
);
1916+
D3DXMATRIX d3dWorldToObject;
1917+
D3DXMatrixInverse(&d3dWorldToObject, &det, &d3dObjectToWorld);
1918+
for (int i = 0; i < 4; i++) {
1919+
for (int j = 0; j < 4; j++) {
1920+
worldToObject[i][j] = d3dWorldToObject.m[i][j];
1921+
}
1922+
}
19111923

19121924
// find out light position in object space
19131925
Matrix4x4::Transform_Vector(worldToObject,lightPosWorld,&lightPosObject);

Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -788,14 +788,15 @@ void LightMapTerrainTextureClass::Apply(unsigned int stage)
788788

789789
D3DXMATRIX inv;
790790
float det;
791-
D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView);
791+
D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView);
792+
D3DXMatrixInverse(&inv, &det, &d3dCurView);
792793
D3DXMATRIX scale;
793794
D3DXMatrixScaling(&scale, STRETCH_FACTOR, STRETCH_FACTOR,1);
794795
inv *=scale;
795796
if (stage==0) {
796-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&inv));
797+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, inv);
797798
} if (stage==1) {
798-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, *((Matrix4x4*)&inv));
799+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, inv);
799800
}
800801

801802

@@ -1066,7 +1067,7 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage)
10661067
DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
10671068
DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
10681069

1069-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&inv));
1070+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, inv);
10701071

10711072
// Disable 3rd stage just in case.
10721073
DX8Wrapper::Set_DX8_Texture_Stage_State( 2, D3DTSS_COLOROP, D3DTOP_DISABLE );
@@ -1085,7 +1086,7 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage)
10851086
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT );
10861087
DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
10871088

1088-
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, *((Matrix4x4*)&inv));
1089+
DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, inv);
10891090
}
10901091
}
10911092

0 commit comments

Comments
 (0)