diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp index 9e923b1d6dd..0c97b7d3c0f 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp @@ -717,14 +717,15 @@ void LightMapTerrainTextureClass::Apply(unsigned int stage) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale; D3DXMatrixScaling(&scale, STRETCH_FACTOR, STRETCH_FACTOR,1); inv *=scale; if (stage==0) { - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&inv)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, inv); } if (stage==1) { - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, *((Matrix4x4*)&inv)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, inv); } @@ -971,7 +972,8 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale; D3DXMatrixScaling(&scale, STRETCH_FACTOR, STRETCH_FACTOR,1); inv *=scale; @@ -999,7 +1001,7 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage) DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&inv)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, inv); // Disable 3rd stage just in case. DX8Wrapper::Set_DX8_Texture_Stage_State( 2, D3DTSS_COLOROP, D3DTOP_DISABLE ); @@ -1018,7 +1020,7 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage) DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT ); DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, *((Matrix4x4*)&inv)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, inv); } #endif } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp index 6ae6394e28f..d561668b534 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp @@ -1237,7 +1237,8 @@ Int ShroudTextureShader::set(Int stage) Matrix4x4 curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset; @@ -1260,8 +1261,8 @@ Int ShroudTextureShader::set(Int stage) width = 1.0f/(width*shroud->getTextureWidth()); height = 1.0f/(height*shroud->getTextureHeight()); D3DXMatrixScaling(&scale, width, height, 1); - *((D3DXMATRIX *)&curView) = (inv * offset) * scale; - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform); } m_stageOfSet=stage; return TRUE; @@ -1330,7 +1331,8 @@ Int FlatShroudTextureShader::set(Int stage) Matrix4x4 curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset; @@ -1353,8 +1355,8 @@ Int FlatShroudTextureShader::set(Int stage) width = 1.0f/(width*shroud->getTextureWidth()); height = 1.0f/(height*shroud->getTextureHeight()); D3DXMatrixScaling(&scale, width, height, 1); - *((D3DXMATRIX *)&curView) = (inv * offset) * scale; - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform); } m_stageOfSet=stage; return TRUE; @@ -1422,8 +1424,8 @@ Int MaskTextureShader::set(Int pass) D3DXMATRIX inv; float det; - //Get inverse view matrix so we can transform camera space points back to world space - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset,offsetTextureCenter; Coord3D centerPos; @@ -1449,18 +1451,19 @@ Int MaskTextureShader::set(Int pass) Real worldTexelHeight=(1.0f-fadeLevel)*25.0f; ///@todo: Fix this to work with non 128x128 textures. + D3DXMATRIX texTransform; if (worldTexelWidth != 0 && worldTexelHeight != 0) { Real widthScale = 1.0f/(worldTexelWidth*128.0f); Real heightScale = 1.0f/(worldTexelHeight*128.0f); D3DXMatrixScaling(&scale, widthScale, heightScale, 1); - *((D3DXMATRIX *)&curView) = ((inv * offset) * scale)*offsetTextureCenter; + texTransform = ((inv * offset) * scale)*offsetTextureCenter; } else { D3DXMatrixScaling(&scale, 0, 0, 1); //scaling by 0 will set uv coordinates to 0,0 - *((D3DXMATRIX *)&curView) = ((inv * offset) * scale); + texTransform = ((inv * offset) * scale); } - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform); return TRUE; } @@ -1715,15 +1718,17 @@ Int TerrainShader2Stage::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE12) { //setup cloud pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); + D3DXMATRIX texTransform; + terrainShader2Stage.updateNoise1(&texTransform,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform); //clouds always need bilinear filtering DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -1731,8 +1736,9 @@ Int TerrainShader2Stage::set(Int pass) //setup noise pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - updateNoise2(((D3DXMATRIX*)&curView),&inv); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); + D3DXMATRIX texTransform2; + terrainShader2Stage.updateNoise2(&texTransform2,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform2); //noise always needs point/linear filtering. Why point!? DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -1751,10 +1757,11 @@ Int TerrainShader2Stage::set(Int pass) else { //only 1 noise or cloud texture // Now setup the texture pipeline. + D3DXMATRIX texTransform3; if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1) { //setup cloud pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -1762,14 +1769,14 @@ Int TerrainShader2Stage::set(Int pass) { //setup noise pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform3); } break; } @@ -2043,7 +2050,8 @@ Int TerrainShaderPixelShader::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -2066,11 +2074,13 @@ Int TerrainShaderPixelShader::set(Int pass) DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView); + D3DXMATRIX texTransform1; + terrainShader2Stage.updateNoise1(&texTransform1,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform1); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, curView); + D3DXMATRIX texTransform2; + terrainShader2Stage.updateNoise2(&texTransform2,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, texTransform2); DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -2080,21 +2090,22 @@ Int TerrainShaderPixelShader::set(Int pass) { //single noise texture shader DX8Wrapper::_Get_D3D_Device8()->SetPixelShader(m_dwBaseNoise1PixelShader); + D3DXMATRIX texTransform3; if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_TERRAIN_BASE_NOISE1) { //cloud map DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } else { //light map DX8Wrapper::_Get_D3D_Device8()->SetTexture(2, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform3); } } else @@ -2164,14 +2175,15 @@ Int CloudTextureShader::set(Int stage) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); - //Get a texture matrix that applies the current cloud position - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv,false); //update curView with texture matrix + D3DXMATRIX texTransform; + terrainShader2Stage.updateNoise1(&texTransform,&inv,false); + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); @@ -2298,7 +2310,8 @@ Int RoadShaderPixelShader::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) { DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2330,11 +2343,13 @@ Int RoadShaderPixelShader::set(Int pass) DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); + D3DXMATRIX texTransform1; + terrainShader2Stage.updateNoise1(&texTransform1,&inv, false); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform1); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView); + D3DXMATRIX texTransform2; + terrainShader2Stage.updateNoise2(&texTransform2,&inv, false); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, texTransform2); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -2413,7 +2428,8 @@ Int RoadShader2Stage::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2434,33 +2450,33 @@ Int RoadShader2Stage::set(Int pass) DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + D3DXMATRIX texTransform3; if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE12) { //full shader, apply noise 1 in pass 0. DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1)); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); + terrainShader2Stage.updateNoise1(&texTransform3,&inv, false); } else { //single noise texture shader if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_ROAD_BASE_NOISE1) { //cloud map DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(1)); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&texTransform3,&inv, false); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } else { //light map DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2)); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&texTransform3,&inv, false); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); } + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform3); } else { //just base texturing @@ -2475,7 +2491,8 @@ Int RoadShader2Stage::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2484,7 +2501,9 @@ Int RoadShader2Stage::set(Int pass) DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2)); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix + D3DXMATRIX texTransform; + terrainShader2Stage.updateNoise2(&texTransform,&inv, false); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -2516,7 +2535,7 @@ Int RoadShader2Stage::set(Int pass) DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_ZERO); DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform); } return TRUE; @@ -3205,7 +3224,8 @@ Int W3DShaderManager::setShroudTex(Int stage) Matrix4x4 curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset; @@ -3228,8 +3248,8 @@ Int W3DShaderManager::setShroudTex(Int stage) width = 1.0f/(width*shroud->getTextureWidth()); height = 1.0f/(height*shroud->getTextureHeight()); D3DXMatrixScaling(&scale, width, height, 1); - *((D3DXMATRIX *)&curView) = (inv * offset) * scale; - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), texTransform); return TRUE; } return FALSE; @@ -3324,7 +3344,8 @@ Int FlatTerrainShader2Stage::set(Int pass) Matrix4x4 curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset; @@ -3347,8 +3368,8 @@ Int FlatTerrainShader2Stage::set(Int pass) width = 1.0f/(width*shroud->getTextureWidth()); height = 1.0f/(height*shroud->getTextureHeight()); D3DXMatrixScaling(&scale, width, height, 1); - *((D3DXMATRIX *)&curView) = (inv * offset) * scale; - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0), texTransform); } } else { DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); @@ -3395,23 +3416,24 @@ Int FlatTerrainShader2Stage::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE12) { //setup cloud pass - - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); + D3DXMATRIX texTransform1; + terrainShader2Stage.updateNoise1(&texTransform1,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform1); //clouds always need bilinear filtering DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); //setup noise pass - - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); + D3DXMATRIX texTransform2; + terrainShader2Stage.updateNoise2(&texTransform2,&inv); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, texTransform2); //noise always needs point/linear filtering. Why point!? DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -3431,10 +3453,11 @@ Int FlatTerrainShader2Stage::set(Int pass) else { //only 1 noise or cloud texture // Now setup the texture pipeline. + D3DXMATRIX texTransform3; if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE1) { //setup cloud pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -3442,14 +3465,14 @@ Int FlatTerrainShader2Stage::set(Int pass) { //setup noise pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(0, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&texTransform3,&inv); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); DX8Wrapper::Set_DX8_Texture_Stage_State( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, texTransform3); } break; } @@ -3595,7 +3618,8 @@ Int FlatTerrainShaderPixelShader::set(Int pass) Matrix4x4 curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale,offset; @@ -3618,8 +3642,8 @@ Int FlatTerrainShaderPixelShader::set(Int pass) width = 1.0f/(width*shroud->getTextureWidth()); height = 1.0f/(height*shroud->getTextureHeight()); D3DXMatrixScaling(&scale, width, height, 1); - *((D3DXMATRIX *)&curView) = (inv * offset) * scale; - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), texTransform); } DX8Wrapper::Set_DX8_Texture_Stage_State( curStage, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); DX8Wrapper::Set_DX8_Texture_Stage_State( curStage, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); @@ -3638,7 +3662,8 @@ Int FlatTerrainShaderPixelShader::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -3647,8 +3672,9 @@ Int FlatTerrainShaderPixelShader::set(Int pass) DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); DX8Wrapper::_Get_D3D_Device8()->SetTexture(curStage, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform; + terrainShader2Stage.updateNoise1(&texTransform,&inv); + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), texTransform); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -3665,7 +3691,8 @@ Int FlatTerrainShaderPixelShader::set(Int pass) D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -3674,8 +3701,9 @@ Int FlatTerrainShaderPixelShader::set(Int pass) DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); DX8Wrapper::_Get_D3D_Device8()->SetTexture(curStage, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix - DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), *((Matrix4x4*)&curView)); + D3DXMATRIX texTransform; + terrainShader2Stage.updateNoise2(&texTransform,&inv); + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), texTransform); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp index 1b5ba203361..d10768f8d9a 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp @@ -1717,9 +1717,9 @@ void W3DTreeBuffer::drawTrees(CameraClass * camera, RefRenderObjListIterator *pD if (m_dwTreeVertexShader) { D3DXMATRIX matProj, matView, matWorld; - DX8Wrapper::_Get_DX8_Transform(D3DTS_WORLD, *(Matrix4x4*)&matWorld); - DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, *(Matrix4x4*)&matView); - DX8Wrapper::_Get_DX8_Transform(D3DTS_PROJECTION, *(Matrix4x4*)&matProj); + DX8Wrapper::_Get_DX8_Transform(D3DTS_WORLD, matWorld); + DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, matView); + DX8Wrapper::_Get_DX8_Transform(D3DTS_PROJECTION, matProj); D3DXMATRIX mat; D3DXMatrixMultiply( &mat, &matView, &matProj ); D3DXMatrixMultiply( &mat, &matWorld, &mat ); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index 2addc0e8ba6..753c41bdaa8 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -240,16 +240,16 @@ void WaterRenderObjClass::setupJbaWaterShader(void) D3DXMATRIX inv; float det; - Matrix4x4 curView; - DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView; + DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, d3dCurView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale; D3DXMatrixScaling(&scale, NOISE_REPEAT_FACTOR, NOISE_REPEAT_FACTOR,1); D3DXMATRIX destMatrix = inv * scale; D3DXMatrixTranslation(&scale, m_riverVOrigin, m_riverVOrigin,0); destMatrix = destMatrix*scale; - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, *(Matrix4x4*)&destMatrix); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, destMatrix); } m_pDev->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); @@ -1596,13 +1596,13 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) D3DXMATRIX inv; D3DXMATRIX clipMatrix; Real det; - Matrix4x4 curView; //get current view matrix - DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); + D3DXMATRIX d3dCurView; + DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, d3dCurView); //get inverse of view matrix(= view to world matrix) - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); //create clipping matrix by inserting our plane equation into the 1st column D3DXMatrixIdentity(&clipMatrix); @@ -1622,7 +1622,7 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); // Set texture generation matrix for stage 1 - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, *((Matrix4*)&inv)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, inv); // Disable bilinear filtering DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); @@ -1800,8 +1800,8 @@ void WaterRenderObjClass::drawSea(RenderInfoClass & rinfo) rinfo.Camera.Get_Transform().Get_Translation(&camTran); - DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, *(Matrix4x4*)&matView); - DX8Wrapper::_Get_DX8_Transform(D3DTS_PROJECTION, *(Matrix4x4*)&matProj); + DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, matView); + DX8Wrapper::_Get_DX8_Transform(D3DTS_PROJECTION, matProj); //default setup from Kenny's demo m_pDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); @@ -1941,8 +1941,8 @@ void WaterRenderObjClass::drawSea(RenderInfoClass & rinfo) m_pDev->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); //Restore old transforms - DX8Wrapper::_Set_DX8_Transform(D3DTS_VIEW, *(Matrix4x4*)&matView); - DX8Wrapper::_Set_DX8_Transform(D3DTS_PROJECTION, *(Matrix4x4*)&matProj); + DX8Wrapper::_Set_DX8_Transform(D3DTS_VIEW, matView); + DX8Wrapper::_Set_DX8_Transform(D3DTS_PROJECTION, matProj); m_pDev->SetPixelShader(0); //turn off pixel shader m_pDev->SetVertexShader(DX8_FVF_XYZDUV1); //turn off custom vertex shader @@ -1966,7 +1966,7 @@ void WaterRenderObjClass::drawSea(RenderInfoClass & rinfo) D3DXMatrixMultiply(&matTemp, &patchMatrix, &matWW3D); - DX8Wrapper::_Set_DX8_Transform(D3DTS_WORLD, *(Matrix4x4*)&matTemp); + DX8Wrapper::_Set_DX8_Transform(D3DTS_WORLD, matTemp); m_pDev->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,m_numVertices,0,m_numIndices); } @@ -2996,16 +2996,16 @@ void WaterRenderObjClass::setupFlatWaterShader(void) D3DXMATRIX inv; float det; - Matrix4x4 curView; - DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView; + DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, d3dCurView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); D3DXMATRIX scale; D3DXMatrixScaling(&scale, NOISE_REPEAT_FACTOR, NOISE_REPEAT_FACTOR,1); D3DXMATRIX destMatrix = inv * scale; D3DXMatrixTranslation(&scale, m_riverVOrigin, m_riverVOrigin,0); destMatrix = destMatrix*scale; - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, *(Matrix4x4*)&destMatrix); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, destMatrix); } m_pDev->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp index e3c3c46c105..fa82f03a143 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp @@ -519,7 +519,10 @@ void Matrix3D::Get_Inverse(Matrix3D & inv) const Matrix4x4 mat4Inv; float det; - D3DXMatrixInverse((D3DXMATRIX *)&mat4Inv, &det, (D3DXMATRIX*)&mat4); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(mat4); + D3DXMATRIX d3dMatInv; + D3DXMatrixInverse(&d3dMatInv, &det, &d3dMat); + Build_Matrix4(mat4Inv, d3dMatInv); inv.Row[0][0]=mat4Inv[0][0]; inv.Row[0][1]=mat4Inv[0][1]; diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp b/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp index 69a0206e51b..c9eec3a88a0 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp @@ -195,3 +195,86 @@ int operator != (const Matrix4x4 & a, const Matrix4x4 & b) return (!(a == b)); } +#ifdef BUILD_WITH_D3D8 +#define WIN32_LEAN_AND_MEAN +#include +#include "d3d8types.h" +#include "d3dx8.h" + +void Build_D3DMATRIX(D3DMATRIX& dxm, const Matrix4x4& m) +{ + // Transpose: dxm.m[i][j] = m[j][i] + dxm.m[0][0] = m[0][0]; + dxm.m[0][1] = m[1][0]; + dxm.m[0][2] = m[2][0]; + dxm.m[0][3] = m[3][0]; + + dxm.m[1][0] = m[0][1]; + dxm.m[1][1] = m[1][1]; + dxm.m[1][2] = m[2][1]; + dxm.m[1][3] = m[3][1]; + + dxm.m[2][0] = m[0][2]; + dxm.m[2][1] = m[1][2]; + dxm.m[2][2] = m[2][2]; + dxm.m[2][3] = m[3][2]; + + dxm.m[3][0] = m[0][3]; + dxm.m[3][1] = m[1][3]; + dxm.m[3][2] = m[2][3]; + dxm.m[3][3] = m[3][3]; +} + +D3DXMATRIX Build_D3DXMATRIX(const Matrix4x4& m) +{ + // Transpose: result[i][j] = m[j][i] + return D3DXMATRIX( + m[0][0], m[1][0], m[2][0], m[3][0], + m[0][1], m[1][1], m[2][1], m[3][1], + m[0][2], m[1][2], m[2][2], m[3][2], + m[0][3], m[1][3], m[2][3], m[3][3] + ); +} + +void Build_Matrix4(Matrix4x4& m, const D3DMATRIX& dxm) +{ + // Transpose: m[i][j] = dxm.m[j][i] + m[0][0] = dxm.m[0][0]; + m[0][1] = dxm.m[1][0]; + m[0][2] = dxm.m[2][0]; + m[0][3] = dxm.m[3][0]; + + m[1][0] = dxm.m[0][1]; + m[1][1] = dxm.m[1][1]; + m[1][2] = dxm.m[2][1]; + m[1][3] = dxm.m[3][1]; + + m[2][0] = dxm.m[0][2]; + m[2][1] = dxm.m[1][2]; + m[2][2] = dxm.m[2][2]; + m[2][3] = dxm.m[3][2]; + + m[3][0] = dxm.m[0][3]; + m[3][1] = dxm.m[1][3]; + m[3][2] = dxm.m[2][3]; + m[3][3] = dxm.m[3][3]; +} + +Matrix4x4 Build_Matrix4(const D3DMATRIX& dxm) +{ + Matrix4x4 m; + Build_Matrix4(m, dxm); + return m; +} + +void Build_Matrix4(Matrix4x4& m, const D3DXMATRIX& dxm) +{ + Build_Matrix4(m, (const D3DMATRIX&)dxm); +} + +Matrix4x4 Build_Matrix4(const D3DXMATRIX& dxm) +{ + return Build_Matrix4((const D3DMATRIX&)dxm); +} +#endif + diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix4.h b/Core/Libraries/Source/WWVegas/WWMath/matrix4.h index 81211850c79..75cb4a72f3e 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix4.h +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix4.h @@ -836,3 +836,22 @@ WWINLINE void Matrix4x4::Transform_Vector(const Matrix4x4 & A,const Vector4 & in out->Z = (A[2][0] * v->X + A[2][1] * v->Y + A[2][2] * v->Z + A[2][3] * v->W); out->W = (A[3][0] * v->X + A[3][1] * v->Y + A[3][2] * v->Z + A[3][3] * v->W); } + +#ifdef BUILD_WITH_D3D8 +struct _D3DMATRIX; +typedef struct _D3DMATRIX D3DMATRIX; +struct D3DXMATRIX; + +// When converting Matrix4x4 to D3DMATRIX or vice versa always use conversion functions below. +// Reason being, D3DMATRIX is row major matrix, and Matrix4x4 is column major matrix. +// Thus copying from one to another will always require a transpose (or invert). + +void Build_D3DMATRIX(D3DMATRIX& dxm, const Matrix4x4& m); +D3DXMATRIX Build_D3DXMATRIX(const Matrix4x4& m); + +void Build_Matrix4(Matrix4x4& m, const D3DMATRIX& dxm); +Matrix4x4 Build_Matrix4(const D3DMATRIX& dxm); +void Build_Matrix4(Matrix4x4& m, const D3DXMATRIX& dxm); +Matrix4x4 Build_Matrix4(const D3DXMATRIX& dxm); +#endif + diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp index 94caea0b449..aafe8275626 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp @@ -1907,7 +1907,10 @@ void W3DVolumetricShadow::updateMeshVolume(Int meshIndex, Int lightIndex, const // system change, not the translations // Real det; - D3DXMatrixInverse((D3DXMATRIX*)&worldToObject, &det, (D3DXMATRIX*)&objectToWorld); + D3DXMATRIX d3dObjectToWorld = Build_D3DXMATRIX(objectToWorld); + D3DXMATRIX d3dWorldToObject; + D3DXMatrixInverse(&d3dWorldToObject, &det, &d3dObjectToWorld); + Build_Matrix4(worldToObject, (D3DMATRIX&)d3dWorldToObject); // find out light position in object space Matrix4x4::Transform_Vector(worldToObject,lightPosWorld,&lightPosObject); diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index f72ce2e13ee..9d0c66e59e1 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -41,6 +41,7 @@ #include "always.h" #include "dllist.h" #include "d3d8.h" +#include "d3dx8.h" #include "matrix4.h" #include "statistics.h" #include "wwstring.h" @@ -173,8 +174,8 @@ struct RenderStateStruct TextureBaseClass * Textures[MAX_TEXTURE_STAGES]; D3DLIGHT8 Lights[4]; bool LightEnable[4]; - Matrix4x4 world; - Matrix4x4 view; + D3DXMATRIX world; + D3DXMATRIX view; unsigned vertex_buffer_type; unsigned index_buffer_type; unsigned short vba_offset; @@ -301,7 +302,9 @@ class DX8Wrapper static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m); static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m); + static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const D3DXMATRIX& m); static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m); + static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DXMATRIX& m); static void Set_DX8_Light(int index,D3DLIGHT8* light); static void Set_DX8_Render_State(D3DRENDERSTATETYPE state, unsigned value); @@ -745,7 +748,6 @@ WWINLINE void DX8Wrapper::Set_Pixel_Shader_Constant(int reg, const void* data, i } // shader system updates KJM ^ - WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m) { WWASSERT(transform<=D3DTS_WORLD); @@ -756,7 +758,8 @@ WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,con DX8Transforms[transform]=m; SNAPSHOT_SAY(("DX8 - SetTransform %d [%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f]",transform,m[0][0],m[0][1],m[0][2],m[0][3],m[1][0],m[1][1],m[1][2],m[1][3],m[2][0],m[2][1],m[2][2],m[2][3],m[3][0],m[3][1],m[3][2],m[3][3])); DX8_RECORD_MATRIX_CHANGE(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(transform, &d3dMat)); } } @@ -772,13 +775,27 @@ WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,con DX8Transforms[transform]=mtx; SNAPSHOT_SAY(("DX8 - SetTransform %d [%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f]",transform,m[0][0],m[0][1],m[0][2],m[0][3],m[1][0],m[1][1],m[1][2],m[1][3],m[2][0],m[2][1],m[2][2],m[2][3])); DX8_RECORD_MATRIX_CHANGE(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(mtx); + DX8CALL(SetTransform(transform, &d3dMat)); } } +WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const D3DXMATRIX& m) +{ + DX8_RECORD_MATRIX_CHANGE(); + DX8CALL(SetTransform(transform, &m)); +} + WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m) { - DX8CALL(GetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat; + DX8CALL(GetTransform(transform,&d3dMat)); + Build_Matrix4(m, d3dMat); +} + +WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DXMATRIX& m) +{ + DX8CALL(GetTransform(transform, &m)); } // ---------------------------------------------------------------------------- @@ -1195,27 +1212,27 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma { switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m.Transpose(); + render_state.world=Build_D3DXMATRIX(m); render_state_changed|=(unsigned)WORLD_CHANGED; render_state_changed&=~(unsigned)WORLD_IDENTITY; break; case D3DTS_VIEW: - render_state.view=m.Transpose(); + render_state.view=Build_D3DXMATRIX(m); render_state_changed|=(unsigned)VIEW_CHANGED; render_state_changed&=~(unsigned)VIEW_IDENTITY; break; case D3DTS_PROJECTION: { - Matrix4x4 ProjectionMatrix=m.Transpose(); ZFar=0.0f; ZNear=0.0f; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(D3DTS_PROJECTION,&d3dMat)); } break; default: DX8_RECORD_MATRIX_CHANGE(); - Matrix4x4 m2=m.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat2 = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(transform,&d3dMat2)); break; } } @@ -1225,19 +1242,19 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma Matrix4x4 m2(m); switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m2.Transpose(); + render_state.world=Build_D3DXMATRIX(m2); render_state_changed|=(unsigned)WORLD_CHANGED; render_state_changed&=~(unsigned)WORLD_IDENTITY; break; case D3DTS_VIEW: - render_state.view=m2.Transpose(); + render_state.view=Build_D3DXMATRIX(m2); render_state_changed|=(unsigned)VIEW_CHANGED; render_state_changed&=~(unsigned)VIEW_IDENTITY; break; default: DX8_RECORD_MATRIX_CHANGE(); - m2=m2.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat3 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat3)); break; } } @@ -1245,14 +1262,14 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma WWINLINE void DX8Wrapper::Set_World_Identity() { if (render_state_changed&(unsigned)WORLD_IDENTITY) return; - render_state.world.Make_Identity(); + D3DXMatrixIdentity(&render_state.world); render_state_changed|=(unsigned)WORLD_CHANGED|(unsigned)WORLD_IDENTITY; } WWINLINE void DX8Wrapper::Set_View_Identity() { if (render_state_changed&(unsigned)VIEW_IDENTITY) return; - render_state.view.Make_Identity(); + D3DXMatrixIdentity(&render_state.view); render_state_changed|=(unsigned)VIEW_CHANGED|(unsigned)VIEW_IDENTITY; } @@ -1273,16 +1290,15 @@ WWINLINE void DX8Wrapper::Get_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4 switch ((int)transform) { case D3DTS_WORLD: if (render_state_changed&WORLD_IDENTITY) m.Make_Identity(); - else m=render_state.world.Transpose(); + else Build_Matrix4(m, render_state.world); break; case D3DTS_VIEW: if (render_state_changed&VIEW_IDENTITY) m.Make_Identity(); - else m=render_state.view.Transpose(); + else Build_Matrix4(m, render_state.view); break; default: DX8CALL(GetTransform(transform,&mat)); - m=*(Matrix4x4*)&mat; - m=m.Transpose(); + Build_Matrix4(m, mat); break; } } diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp index f17ba4de0d1..6b93a5ce3fe 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp @@ -351,7 +351,7 @@ void SortingRendererClass::Insert_Triangles( WWASSERT(vertex_buffer); WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count()); - D3DXMATRIX mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; + D3DXMATRIX mtx=state->sorting_state.world*state->sorting_state.view; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform( @@ -552,8 +552,7 @@ void SortingRendererClass::Flush_Sorting_Pool() src_verts+=state->sorting_state.index_base_offset; src_verts+=state->min_vertex_index; - D3DXMATRIX d3d_mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; - D3DXMatrixTranspose(&d3d_mtx,&d3d_mtx); + D3DXMATRIX d3d_mtx=state->sorting_state.world*state->sorting_state.view; const Matrix4x4& mtx=(const Matrix4x4&)d3d_mtx; unsigned i=0; for (;ivertex_count;++i,++src_verts) { @@ -817,7 +816,7 @@ void SortingRendererClass::Insert_VolumeParticle( // Transform the center point to view space for sorting - D3DXMATRIX mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; + D3DXMATRIX mtx=state->sorting_state.world*state->sorting_state.view; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform( diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp index 9bcf74d80ee..5d8f36d6311 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp @@ -2053,7 +2053,10 @@ void W3DVolumetricShadow::updateMeshVolume(Int meshIndex, Int lightIndex, const // system change, not the translations // Real det; - D3DXMatrixInverse((D3DXMATRIX*)&worldToObject, &det, (D3DXMATRIX*)&objectToWorld); + D3DXMATRIX d3dObjectToWorld = Build_D3DXMATRIX(objectToWorld); + D3DXMATRIX d3dWorldToObject; + D3DXMatrixInverse(&d3dWorldToObject, &det, &d3dObjectToWorld); + Build_Matrix4(worldToObject, (D3DMATRIX&)d3dWorldToObject); // find out light position in object space Matrix4x4::Transform_Vector(worldToObject,lightPosWorld,&lightPosObject); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index db5b93030cb..881503251b7 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -44,6 +44,7 @@ #include "always.h" #include "dllist.h" #include "d3d8.h" +#include "d3dx8.h" #include "matrix4.h" #include "statistics.h" #include "wwstring.h" @@ -179,8 +180,8 @@ struct RenderStateStruct D3DLIGHT8 Lights[4]; bool LightEnable[4]; //unsigned lightsHash; - Matrix4x4 world; - Matrix4x4 view; + D3DXMATRIX world; + D3DXMATRIX view; unsigned vertex_buffer_types[MAX_VERTEX_STREAMS]; unsigned index_buffer_type; unsigned short vba_offset; @@ -310,7 +311,9 @@ class DX8Wrapper static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m); static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m); + static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const D3DXMATRIX& m); static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m); + static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DXMATRIX& m); static void Set_DX8_Light(int index,D3DLIGHT8* light); static void Set_DX8_Render_State(D3DRENDERSTATETYPE state, unsigned value); @@ -754,7 +757,6 @@ WWINLINE void DX8Wrapper::Set_Pixel_Shader_Constant(int reg, const void* data, i } // shader system updates KJM ^ - WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m) { WWASSERT(transform<=D3DTS_WORLD); @@ -765,7 +767,8 @@ WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,con DX8Transforms[transform]=m; SNAPSHOT_SAY(("DX8 - SetTransform %d [%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f]",transform,m[0][0],m[0][1],m[0][2],m[0][3],m[1][0],m[1][1],m[1][2],m[1][3],m[2][0],m[2][1],m[2][2],m[2][3],m[3][0],m[3][1],m[3][2],m[3][3])); DX8_RECORD_MATRIX_CHANGE(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(transform, &d3dMat)); } } @@ -781,13 +784,27 @@ WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,con DX8Transforms[transform]=mtx; SNAPSHOT_SAY(("DX8 - SetTransform %d [%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f]",transform,m[0][0],m[0][1],m[0][2],m[0][3],m[1][0],m[1][1],m[1][2],m[1][3],m[2][0],m[2][1],m[2][2],m[2][3])); DX8_RECORD_MATRIX_CHANGE(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(mtx); + DX8CALL(SetTransform(transform, &d3dMat)); } } +WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const D3DXMATRIX& m) +{ + DX8_RECORD_MATRIX_CHANGE(); + DX8CALL(SetTransform(transform, &m)); +} + WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m) { - DX8CALL(GetTransform(transform,(D3DMATRIX*)&m)); + D3DXMATRIX d3dMat; + DX8CALL(GetTransform(transform,&d3dMat)); + Build_Matrix4(m, d3dMat); +} + +WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DXMATRIX& m) +{ + DX8CALL(GetTransform(transform, &m)); } // ---------------------------------------------------------------------------- @@ -1251,27 +1268,27 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma { switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m.Transpose(); + render_state.world=Build_D3DXMATRIX(m); render_state_changed|=(unsigned)WORLD_CHANGED; render_state_changed&=~(unsigned)WORLD_IDENTITY; break; case D3DTS_VIEW: - render_state.view=m.Transpose(); + render_state.view=Build_D3DXMATRIX(m); render_state_changed|=(unsigned)VIEW_CHANGED; render_state_changed&=~(unsigned)VIEW_IDENTITY; break; case D3DTS_PROJECTION: { - Matrix4x4 ProjectionMatrix=m.Transpose(); ZFar=0.0f; ZNear=0.0f; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(D3DTS_PROJECTION,&d3dMat)); } break; default: DX8_RECORD_MATRIX_CHANGE(); - Matrix4x4 m2=m.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat2 = Build_D3DXMATRIX(m); + DX8CALL(SetTransform(transform,&d3dMat2)); break; } } @@ -1281,19 +1298,19 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma Matrix4x4 m2(m); switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m2.Transpose(); + render_state.world=Build_D3DXMATRIX(m2); render_state_changed|=(unsigned)WORLD_CHANGED; render_state_changed&=~(unsigned)WORLD_IDENTITY; break; case D3DTS_VIEW: - render_state.view=m2.Transpose(); + render_state.view=Build_D3DXMATRIX(m2); render_state_changed|=(unsigned)VIEW_CHANGED; render_state_changed&=~(unsigned)VIEW_IDENTITY; break; default: DX8_RECORD_MATRIX_CHANGE(); - m2=m2.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat3 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat3)); break; } } @@ -1301,14 +1318,14 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma WWINLINE void DX8Wrapper::Set_World_Identity() { if (render_state_changed&(unsigned)WORLD_IDENTITY) return; - render_state.world.Make_Identity(); + D3DXMatrixIdentity(&render_state.world); render_state_changed|=(unsigned)WORLD_CHANGED|(unsigned)WORLD_IDENTITY; } WWINLINE void DX8Wrapper::Set_View_Identity() { if (render_state_changed&(unsigned)VIEW_IDENTITY) return; - render_state.view.Make_Identity(); + D3DXMatrixIdentity(&render_state.view); render_state_changed|=(unsigned)VIEW_CHANGED|(unsigned)VIEW_IDENTITY; } @@ -1329,16 +1346,15 @@ WWINLINE void DX8Wrapper::Get_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4 switch ((int)transform) { case D3DTS_WORLD: if (render_state_changed&WORLD_IDENTITY) m.Make_Identity(); - else m=render_state.world.Transpose(); + else Build_Matrix4(m, render_state.world); break; case D3DTS_VIEW: if (render_state_changed&VIEW_IDENTITY) m.Make_Identity(); - else m=render_state.view.Transpose(); + else Build_Matrix4(m, render_state.view); break; default: DX8CALL(GetTransform(transform,&mat)); - m=*(Matrix4x4*)&mat; - m=m.Transpose(); + Build_Matrix4(m, mat); break; } } diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp index 68a58c327ff..06c0d7be5a4 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp @@ -246,7 +246,7 @@ void SortingRendererClass::Insert_Triangles( WWASSERT(vertex_buffer); WWASSERT(state->vertex_count<=vertex_buffer->Get_Vertex_Count()); - D3DXMATRIX mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; + D3DXMATRIX mtx=state->sorting_state.world*state->sorting_state.view; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform( @@ -441,7 +441,7 @@ void SortingRendererClass::Flush_Sorting_Pool() memcpy(dest_verts, src_verts, sizeof(VertexFormatXYZNDUV2)*state->vertex_count); dest_verts += state->vertex_count; - D3DXMATRIX d3d_mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; + D3DXMATRIX d3d_mtx=state->sorting_state.world*state->sorting_state.view; const Matrix4x4& mtx=(const Matrix4x4&)d3d_mtx; unsigned short* indices=NULL; @@ -709,7 +709,7 @@ void SortingRendererClass::Insert_VolumeParticle( // Transform the center point to view space for sorting - D3DXMATRIX mtx=(D3DXMATRIX&)state->sorting_state.world*(D3DXMATRIX&)state->sorting_state.view; + D3DXMATRIX mtx=state->sorting_state.world*state->sorting_state.view; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform(