Skip to content

Commit 93986cd

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

File tree

11 files changed

+270
-99
lines changed

11 files changed

+270
-99
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.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,76 @@ int operator != (const Matrix4x4 & a, const Matrix4x4 & b)
195195
return (!(a == b));
196196
}
197197

198+
#ifdef BUILD_WITH_D3D8
199+
#define WIN32_LEAN_AND_MEAN
200+
#include <windows.h>
201+
#include "d3d8types.h"
202+
#include "d3dx8.h"
203+
204+
void Build_D3DMATRIX(D3DMATRIX& dxm, const Matrix4x4& m)
205+
{
206+
// Transpose: dxm.m[i][j] = m[j][i]
207+
dxm.m[0][0] = m[0][0];
208+
dxm.m[0][1] = m[1][0];
209+
dxm.m[0][2] = m[2][0];
210+
dxm.m[0][3] = m[3][0];
211+
212+
dxm.m[1][0] = m[0][1];
213+
dxm.m[1][1] = m[1][1];
214+
dxm.m[1][2] = m[2][1];
215+
dxm.m[1][3] = m[3][1];
216+
217+
dxm.m[2][0] = m[0][2];
218+
dxm.m[2][1] = m[1][2];
219+
dxm.m[2][2] = m[2][2];
220+
dxm.m[2][3] = m[3][2];
221+
222+
dxm.m[3][0] = m[0][3];
223+
dxm.m[3][1] = m[1][3];
224+
dxm.m[3][2] = m[2][3];
225+
dxm.m[3][3] = m[3][3];
226+
}
227+
228+
D3DXMATRIX Build_D3DXMATRIX(const Matrix4x4& m)
229+
{
230+
// Transpose: result[i][j] = m[j][i]
231+
return D3DXMATRIX(
232+
m[0][0], m[1][0], m[2][0], m[3][0],
233+
m[0][1], m[1][1], m[2][1], m[3][1],
234+
m[0][2], m[1][2], m[2][2], m[3][2],
235+
m[0][3], m[1][3], m[2][3], m[3][3]
236+
);
237+
}
238+
239+
void Build_Matrix4(Matrix4x4& m, const D3DMATRIX& dxm)
240+
{
241+
// Transpose: m[i][j] = dxm.m[j][i]
242+
m[0][0] = dxm.m[0][0];
243+
m[0][1] = dxm.m[1][0];
244+
m[0][2] = dxm.m[2][0];
245+
m[0][3] = dxm.m[3][0];
246+
247+
m[1][0] = dxm.m[0][1];
248+
m[1][1] = dxm.m[1][1];
249+
m[1][2] = dxm.m[2][1];
250+
m[1][3] = dxm.m[3][1];
251+
252+
m[2][0] = dxm.m[0][2];
253+
m[2][1] = dxm.m[1][2];
254+
m[2][2] = dxm.m[2][2];
255+
m[2][3] = dxm.m[3][2];
256+
257+
m[3][0] = dxm.m[0][3];
258+
m[3][1] = dxm.m[1][3];
259+
m[3][2] = dxm.m[2][3];
260+
m[3][3] = dxm.m[3][3];
261+
}
262+
263+
Matrix4x4 Build_Matrix4(const D3DMATRIX& dxm)
264+
{
265+
Matrix4x4 m;
266+
Build_Matrix4(m, dxm);
267+
return m;
268+
}
269+
#endif
270+

0 commit comments

Comments
 (0)