diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp index 34ff71f1d1..aa4f7e0b44 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp @@ -1907,7 +1907,19 @@ void W3DVolumetricShadow::updateMeshVolume(Int meshIndex, Int lightIndex, const // system change, not the translations // Real det; - D3DXMatrixInverse((D3DXMATRIX*)&worldToObject, &det, (D3DXMATRIX*)&objectToWorld); + D3DXMATRIX d3dObjectToWorld( + objectToWorld[0][0], objectToWorld[0][1], objectToWorld[0][2], objectToWorld[0][3], + objectToWorld[1][0], objectToWorld[1][1], objectToWorld[1][2], objectToWorld[1][3], + objectToWorld[2][0], objectToWorld[2][1], objectToWorld[2][2], objectToWorld[2][3], + objectToWorld[3][0], objectToWorld[3][1], objectToWorld[3][2], objectToWorld[3][3] + ); + D3DXMATRIX d3dWorldToObject; + D3DXMatrixInverse(&d3dWorldToObject, &det, &d3dObjectToWorld); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + worldToObject[i][j] = d3dWorldToObject.m[i][j]; + } + } // find out light position in object space Matrix4x4::Transform_Vector(worldToObject,lightPosWorld,&lightPosObject); diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp index 91c0d47eea..0020a478a9 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp @@ -788,14 +788,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); } @@ -1066,7 +1067,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 ); @@ -1085,7 +1086,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); } } diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp index 2fedaa86ea..f04f0c2509 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp @@ -1096,7 +1096,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; @@ -1119,8 +1120,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; @@ -1188,8 +1189,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; @@ -1215,18 +1216,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; } @@ -1450,15 +1452,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); @@ -1466,8 +1470,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); @@ -1486,10 +1491,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); } @@ -1497,14 +1503,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; } @@ -1776,7 +1782,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. @@ -1799,11 +1806,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. @@ -1813,21 +1822,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 @@ -1897,14 +1907,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); @@ -2036,7 +2047,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); @@ -2066,11 +2078,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. @@ -2159,7 +2173,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); @@ -2180,33 +2195,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::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(1)->Peek_D3D_Texture()); 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::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(1)->Peek_D3D_Texture()); - 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::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - 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 @@ -2221,7 +2236,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); @@ -2230,7 +2246,9 @@ Int RoadShader2Stage::set(Int pass) DX8Wrapper::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(2)->Peek_D3D_Texture()); - 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); @@ -2262,7 +2280,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; diff --git a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index 258bf46c86..6a15f5e736 100644 --- a/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -235,14 +235,15 @@ void WaterRenderObjClass::setupJbaWaterShader(void) 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; 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 ); @@ -1579,7 +1580,8 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); //get inverse of view matrix(= view to world matrix) - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); //create clipping matrix by inserting our plane equation into the 1st column D3DXMatrixIdentity(&clipMatrix); @@ -2964,14 +2966,15 @@ void WaterRenderObjClass::setupFlatWaterShader(void) 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; 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/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/Generals/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index 699532358d..fdbf126322 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" @@ -301,6 +302,7 @@ 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 Set_DX8_Light(int index,D3DLIGHT8* light); @@ -691,6 +693,16 @@ WWINLINE void DX8Wrapper::Set_Pixel_Shader_Constant(int reg, const void* data, i } // shader system updates KJM ^ +// (bobtista) Helper function to convert Matrix4x4 to D3DXMATRIX +WWINLINE D3DXMATRIX Build_D3DXMATRIX(const Matrix4x4& m) +{ + return D3DXMATRIX( + 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] + ); +} WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m) { @@ -702,7 +714,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)); } } @@ -718,13 +731,26 @@ 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)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + m[i][j] = d3dMat.m[i][j]; + } + } } // ---------------------------------------------------------------------------- @@ -1155,13 +1181,15 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma Matrix4x4 ProjectionMatrix=m.Transpose(); ZFar=0.0f; ZNear=0.0f; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(ProjectionMatrix); + DX8CALL(SetTransform(D3DTS_PROJECTION,&d3dMat)); } break; default: DX8_RECORD_MATRIX_CHANGE(); Matrix4x4 m2=m.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat2 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat2)); break; } } @@ -1183,7 +1211,8 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma default: DX8_RECORD_MATRIX_CHANGE(); m2=m2.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat3 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat3)); break; } } diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp index 7702b77b66..b8ec3df9c8 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp @@ -716,14 +716,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); } @@ -999,7 +1000,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 +1019,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/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp index 5811dccd33..59cd1652c5 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp +++ b/GeneralsMD/Code/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; diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index f3189e931e..80778a5df2 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -242,14 +242,15 @@ void WaterRenderObjClass::setupJbaWaterShader(void) 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; 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 ); @@ -1602,7 +1603,8 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); //get inverse of view matrix(= view to world matrix) - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX d3dCurView = Build_D3DXMATRIX(curView); + D3DXMatrixInverse(&inv, &det, &d3dCurView); //create clipping matrix by inserting our plane equation into the 1st column D3DXMatrixIdentity(&clipMatrix); @@ -2998,14 +3000,15 @@ void WaterRenderObjClass::setupFlatWaterShader(void) 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; 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/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index b763a47880..33c2ab3be5 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" @@ -310,6 +311,7 @@ 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 Set_DX8_Light(int index,D3DLIGHT8* light); @@ -754,6 +756,16 @@ WWINLINE void DX8Wrapper::Set_Pixel_Shader_Constant(int reg, const void* data, i } // shader system updates KJM ^ +// (bobtista) Helper function to convert Matrix4x4 to D3DXMATRIX +WWINLINE D3DXMATRIX Build_D3DXMATRIX(const Matrix4x4& m) +{ + return D3DXMATRIX( + 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] + ); +} WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m) { @@ -765,7 +777,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 +794,26 @@ 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)); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + m[i][j] = d3dMat.m[i][j]; + } + } } // ---------------------------------------------------------------------------- @@ -1265,13 +1291,15 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma Matrix4x4 ProjectionMatrix=m.Transpose(); ZFar=0.0f; ZNear=0.0f; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + D3DXMATRIX d3dMat = Build_D3DXMATRIX(ProjectionMatrix); + DX8CALL(SetTransform(D3DTS_PROJECTION,&d3dMat)); } break; default: DX8_RECORD_MATRIX_CHANGE(); Matrix4x4 m2=m.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat2 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat2)); break; } } @@ -1293,7 +1321,8 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma default: DX8_RECORD_MATRIX_CHANGE(); m2=m2.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DXMATRIX d3dMat3 = Build_D3DXMATRIX(m2); + DX8CALL(SetTransform(transform,&d3dMat3)); break; } } diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp index 68a58c327f..b04184afdd 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp @@ -246,7 +246,19 @@ 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 worldMat( + state->sorting_state.world[0][0], state->sorting_state.world[0][1], state->sorting_state.world[0][2], state->sorting_state.world[0][3], + state->sorting_state.world[1][0], state->sorting_state.world[1][1], state->sorting_state.world[1][2], state->sorting_state.world[1][3], + state->sorting_state.world[2][0], state->sorting_state.world[2][1], state->sorting_state.world[2][2], state->sorting_state.world[2][3], + state->sorting_state.world[3][0], state->sorting_state.world[3][1], state->sorting_state.world[3][2], state->sorting_state.world[3][3] + ); + D3DXMATRIX viewMat( + state->sorting_state.view[0][0], state->sorting_state.view[0][1], state->sorting_state.view[0][2], state->sorting_state.view[0][3], + state->sorting_state.view[1][0], state->sorting_state.view[1][1], state->sorting_state.view[1][2], state->sorting_state.view[1][3], + state->sorting_state.view[2][0], state->sorting_state.view[2][1], state->sorting_state.view[2][2], state->sorting_state.view[2][3], + state->sorting_state.view[3][0], state->sorting_state.view[3][1], state->sorting_state.view[3][2], state->sorting_state.view[3][3] + ); + D3DXMATRIX mtx=worldMat*viewMat; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform( @@ -441,7 +453,9 @@ 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 worldMat2 = Build_D3DXMATRIX(state->sorting_state.world); + D3DXMATRIX viewMat2 = Build_D3DXMATRIX(state->sorting_state.view); + D3DXMATRIX d3d_mtx=worldMat2*viewMat2; const Matrix4x4& mtx=(const Matrix4x4&)d3d_mtx; unsigned short* indices=NULL; @@ -709,7 +723,19 @@ 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 worldMat3( + state->sorting_state.world[0][0], state->sorting_state.world[0][1], state->sorting_state.world[0][2], state->sorting_state.world[0][3], + state->sorting_state.world[1][0], state->sorting_state.world[1][1], state->sorting_state.world[1][2], state->sorting_state.world[1][3], + state->sorting_state.world[2][0], state->sorting_state.world[2][1], state->sorting_state.world[2][2], state->sorting_state.world[2][3], + state->sorting_state.world[3][0], state->sorting_state.world[3][1], state->sorting_state.world[3][2], state->sorting_state.world[3][3] + ); + D3DXMATRIX viewMat3( + state->sorting_state.view[0][0], state->sorting_state.view[0][1], state->sorting_state.view[0][2], state->sorting_state.view[0][3], + state->sorting_state.view[1][0], state->sorting_state.view[1][1], state->sorting_state.view[1][2], state->sorting_state.view[1][3], + state->sorting_state.view[2][0], state->sorting_state.view[2][1], state->sorting_state.view[2][2], state->sorting_state.view[2][3], + state->sorting_state.view[3][0], state->sorting_state.view[3][1], state->sorting_state.view[3][2], state->sorting_state.view[3][3] + ); + D3DXMATRIX mtx=worldMat3*viewMat3; D3DXVECTOR3 vec=(D3DXVECTOR3&)state->bounding_sphere.Center; D3DXVECTOR4 transformed_vec; D3DXVec3Transform(