diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp index afb6045e68..e6eb11b87d 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp @@ -2963,8 +2963,7 @@ void BaseHeightMapRenderObjClass::renderTrees(CameraClass * camera) if (m_map==NULL) return; if (Scene==NULL) return; if (m_treeBuffer) { - Matrix3D tm(Transform); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); DX8Wrapper::Set_Material(m_vertexMaterialClass); RTS3DScene *pMyScene = (RTS3DScene *)Scene; RefRenderObjListIterator pDynamicLightsIterator(pMyScene->getDynamicLights()); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp index 9e923b1d6d..ce936cb4e6 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/TerrainTex.cpp @@ -711,20 +711,20 @@ void LightMapTerrainTextureClass::Apply(unsigned int stage) DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); + 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); } @@ -965,13 +965,13 @@ void CloudMapTerrainTextureClass::Apply(unsigned int stage) DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); + D3DXMATRIX scale; D3DXMatrixScaling(&scale, STRETCH_FACTOR, STRETCH_FACTOR,1); inv *=scale; @@ -999,7 +999,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 +1018,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 6ae6394e28..f1df137feb 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp @@ -1231,13 +1231,12 @@ Int ShroudTextureShader::set(Int stage) W3DShroud *shroud; if ((shroud=TheTerrainRenderObject->getShroud()) != 0) { ///@todo: All this code really only need to be done once per camera/view. Find a way to optimize it out. - D3DXMATRIX inv; - float det; - - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset; @@ -1260,8 +1259,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)); + curView = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView); } m_stageOfSet=stage; return TRUE; @@ -1324,13 +1323,12 @@ Int FlatShroudTextureShader::set(Int stage) W3DShroud *shroud; if ((shroud=TheTerrainRenderObject->getShroud()) != 0) { ///@todo: All this code really only need to be done once per camera/view. Find a way to optimize it out. - D3DXMATRIX inv; - float det; - - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset; @@ -1353,8 +1351,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)); + curView = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView); } m_stageOfSet=stage; return TRUE; @@ -1413,7 +1411,8 @@ Int MaskTextureShader::set(Int pass) shader.Set_Primary_Gradient(ShaderClass::GRADIENT_DISABLE); DX8Wrapper::Set_Shader(shader); DX8Wrapper::Apply_Render_State_Changes(); - Matrix4x4 curView; + + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); @@ -1423,7 +1422,7 @@ Int MaskTextureShader::set(Int pass) float det; //Get inverse view matrix so we can transform camera space points back to world space - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset,offsetTextureCenter; Coord3D centerPos; @@ -1450,17 +1449,19 @@ Int MaskTextureShader::set(Int pass) ///@todo: Fix this to work with non 128x128 textures. if (worldTexelWidth != 0 && worldTexelHeight != 0) - { Real widthScale = 1.0f/(worldTexelWidth*128.0f); + { + 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; + curView = ((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); + { + D3DXMatrixScaling(&scale, 0, 0, 1); //scaling by 0 will set uv coordinates to 0,0 + curView = ((inv * offset) * scale); } - DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, *((Matrix4x4*)&curView)); + DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); return TRUE; } @@ -1691,7 +1692,7 @@ Int TerrainShader2Stage::set(Int pass) break; case 2: // Noise/cloud pass - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); //these states apply to all noise/cloud combination passes @@ -1711,18 +1712,16 @@ Int TerrainShader2Stage::set(Int pass) DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR); DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_ZERO); - D3DXMATRIX inv; float det; - - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); 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 + updateNoise1(&curView,&inv); //update curView with texture matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); //clouds always need bilinear filtering DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); @@ -1731,7 +1730,7 @@ Int TerrainShader2Stage::set(Int pass) //setup noise pass DX8Wrapper::_Get_D3D_Device8()->SetTexture(1, W3DShaderManager::getShaderTexture(3)->Peek_D3D_Texture()); - updateNoise2(((D3DXMATRIX*)&curView),&inv); + updateNoise2(&curView,&inv); DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); //noise always needs point/linear filtering. Why point!? DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); @@ -1754,7 +1753,7 @@ Int TerrainShader2Stage::set(Int pass) 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 + updateNoise1(&curView,&inv); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -1762,14 +1761,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 + updateNoise2(&curView,&inv); //update curView with texture matrix 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, curView); } break; } @@ -2038,12 +2037,12 @@ Int TerrainShaderPixelShader::set(Int pass) if (W3DShaderManager::getCurrentShader() >= W3DShaderManager::ST_TERRAIN_BASE_NOISE1) { - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -2066,10 +2065,10 @@ 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 + terrainShader2Stage.updateNoise1(&curView,&inv); //update curView with texture matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&curView,&inv); //update curView with texture matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE3, curView); DX8Wrapper::Set_DX8_Texture_Stage_State(3, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); @@ -2083,14 +2082,14 @@ Int TerrainShaderPixelShader::set(Int pass) 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(&curView,&inv); //update curView with texture matrix 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(&curView,&inv); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -2158,16 +2157,16 @@ Int CloudTextureShader::init(void) /**Setup a certain texture stage to project our cloud texture*/ Int CloudTextureShader::set(Int stage) { - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); //Get a texture matrix that applies the current cloud position - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv,false); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&curView,&inv,false); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); DX8Wrapper::Set_DX8_Texture_Stage_State(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); @@ -2251,7 +2250,7 @@ Int RoadShaderPixelShader::init( void ) if (res >= DC_GENERIC_PIXEL_SHADER_1_1) { //this shader needs some assets that need to be loaded - //shader decleration + //shader declaration DWORD Declaration[]= { (D3DVSD_STREAM(0)), @@ -2293,12 +2292,12 @@ Int RoadShaderPixelShader::set(Int pass) DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) { DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2330,10 +2329,10 @@ 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 + terrainShader2Stage.updateNoise1(&curView,&inv, false); //get texture projection matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //get texture projection matrix + terrainShader2Stage.updateNoise2(&curView,&inv, false); //get texture projection matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE2, curView); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); @@ -2408,12 +2407,12 @@ Int RoadShader2Stage::set(Int pass) if (W3DShaderManager::getCurrentShader() >= W3DShaderManager::ST_ROAD_BASE_NOISE1) { //second texture unit will contain a noise pass - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2440,7 +2439,7 @@ Int RoadShader2Stage::set(Int pass) 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 + terrainShader2Stage.updateNoise1(&curView, &inv, false); //get texture projection matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); } else @@ -2448,14 +2447,14 @@ Int RoadShader2Stage::set(Int pass) 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(&curView, &inv, false); //update curView with texture matrix 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(&curView,&inv, false); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -2470,12 +2469,12 @@ Int RoadShader2Stage::set(Int pass) } else { //pass 1, apply additional noise pass - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); if (TheGlobalData && TheGlobalData->m_trilinearTerrainTex) DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); @@ -2484,7 +2483,7 @@ Int RoadShader2Stage::set(Int pass) DX8Wrapper::Set_Texture(1,W3DShaderManager::getShaderTexture(2)); - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv, false); //update curView with texture matrix + terrainShader2Stage.updateNoise2(&curView, &inv, false); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -3199,13 +3198,13 @@ Int W3DShaderManager::setShroudTex(Int stage) DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_COLOROP, D3DTOP_MODULATE ); DX8Wrapper::Set_DX8_Texture_Stage_State( stage, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); - D3DXMATRIX inv; - float det; - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset; @@ -3228,8 +3227,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)); + curView = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+stage), curView); return TRUE; } return FALSE; @@ -3318,13 +3317,12 @@ Int FlatTerrainShader2Stage::set(Int pass) W3DShroud *shroud; if ((shroud=TheTerrainRenderObject->getShroud()) != 0) { - D3DXMATRIX inv; - float det; - - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset; @@ -3347,8 +3345,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)); + curView = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0), curView); } } else { DX8Wrapper::Set_DX8_Texture_Stage_State( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); @@ -3371,7 +3369,7 @@ Int FlatTerrainShader2Stage::set(Int pass) break; case 1: // Noise/cloud pass - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); //these states apply to all noise/cloud combination passes @@ -3391,17 +3389,15 @@ Int FlatTerrainShader2Stage::set(Int pass) DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR); DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,D3DBLEND_ZERO); - D3DXMATRIX inv; float det; - - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); if (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE12) { //setup cloud pass - terrainShader2Stage.updateNoise1(((D3DXMATRIX*)&curView),&inv); //update curView with texture matrix + terrainShader2Stage.updateNoise1(&curView,&inv); //update curView with texture matrix DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE0, curView); //clouds always need bilinear filtering DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); @@ -3410,7 +3406,7 @@ Int FlatTerrainShader2Stage::set(Int pass) //setup noise pass - terrainShader2Stage.updateNoise2(((D3DXMATRIX*)&curView),&inv); + terrainShader2Stage.updateNoise2(&curView,&inv); DX8Wrapper::_Set_DX8_Transform(D3DTS_TEXTURE1, curView); //noise always needs point/linear filtering. Why point!? DX8Wrapper::Set_DX8_Texture_Stage_State(1, D3DTSS_MINFILTER, D3DTEXF_POINT); @@ -3434,7 +3430,7 @@ Int FlatTerrainShader2Stage::set(Int pass) 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(&curView,&inv); //update curView with texture matrix DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); } @@ -3442,14 +3438,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(&curView,&inv); //update curView with texture matrix 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, curView); } break; } @@ -3589,13 +3585,12 @@ Int FlatTerrainShaderPixelShader::set(Int pass) //We need to scale so shroud texel stretches over one full terrain cell. Each texel //is 1/128 the size of full texture. (assuming 128x128 vid-mem texture). { - D3DXMATRIX inv; - float det; - - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); D3DXMATRIX scale,offset; @@ -3618,8 +3613,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)); + curView = (inv * offset) * scale; + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), curView); } DX8Wrapper::Set_DX8_Texture_Stage_State( curStage, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); DX8Wrapper::Set_DX8_Texture_Stage_State( curStage, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); @@ -3633,12 +3628,12 @@ Int FlatTerrainShaderPixelShader::set(Int pass) Bool doNoise1 = (W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE1 || W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE12); if (doNoise1) { // Cloud pass. - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -3647,8 +3642,8 @@ 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)); + terrainShader2Stage.updateNoise1(&curView,&inv); //update curView with texture matrix + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), curView); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MINFILTER, D3DTEXF_LINEAR); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); @@ -3660,12 +3655,12 @@ Int FlatTerrainShaderPixelShader::set(Int pass) W3DShaderManager::getCurrentShader() == W3DShaderManager::ST_FLAT_TERRAIN_BASE_NOISE12); if (doNoise2) { - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); D3DXMATRIX inv; float det; - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMatrixInverse(&inv, &det, &curView); DX8Wrapper::Set_DX8_Texture_Stage_State(curStage, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION); // Two output coordinates are used. @@ -3674,8 +3669,8 @@ 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)); + terrainShader2Stage.updateNoise2(&curView,&inv); //update curView with texture matrix + DX8Wrapper::_Set_DX8_Transform((D3DTRANSFORMSTATETYPE )(D3DTS_TEXTURE0+curStage), curView); 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/W3DTerrainTracks.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp index 83a391b5d7..ecb3e0d716 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp @@ -895,8 +895,7 @@ Try improving the fit to vertical surfaces like cliffs. trackStartIndex=0; mod=m_usedModules; - Matrix3D tm(mod->Transform); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + DX8Wrapper::Set_Transform(D3DTS_WORLD,mod->Transform); while (mod) { if (mod->m_activeEdgeCount >= 2 && mod->Is_Really_Visible()) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp index 1b5ba20336..d10768f8d9 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 2addc0e8ba..596da9617b 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -237,19 +237,18 @@ void WaterRenderObjClass::setupJbaWaterShader(void) DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); - D3DXMATRIX inv; - float det; - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); 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 ); @@ -1593,18 +1592,17 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) // Alternate Clipping Method using alpha testing hack! /**************************************************************************************/ - D3DXMATRIX inv; - D3DXMATRIX clipMatrix; - Real det; - Matrix4x4 curView; - //get current view matrix + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); //get inverse of view matrix(= view to world matrix) - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + Real det; + D3DXMatrixInverse(&inv, &det, &curView); //create clipping matrix by inserting our plane equation into the 1st column + D3DXMATRIX clipMatrix; D3DXMatrixIdentity(&clipMatrix); clipMatrix(0,0)=WaterNormal.X; clipMatrix(1,0)=WaterNormal.Y; @@ -1622,7 +1620,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); @@ -1787,9 +1785,7 @@ void WaterRenderObjClass::drawSea(RenderInfoClass & rinfo) matWW3D._23=1.0f; matWW3D._44=1.0f; - Matrix3D tm(Transform); - - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); //position the water surface + DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); //position the water surface DX8Wrapper::Set_Texture(0,NULL); //we'll be setting our own textures, so reset W3D DX8Wrapper::Set_Texture(1,NULL); //we'll be setting our own textures, so reset W3D @@ -1800,8 +1796,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 +1937,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 +1962,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); } @@ -2358,9 +2354,7 @@ void WaterRenderObjClass::renderWaterMesh(void) m_vertexBufferD3D->Unlock(); - Matrix3D tm(Transform); - - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); //position the water surface + DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); //position the water surface DX8Wrapper::Set_Material(m_meshVertexMaterialClass); ShaderClass::CullModeType oldCullMode=m_shaderClass.Get_Cull_Mode(); @@ -2993,19 +2987,18 @@ void WaterRenderObjClass::setupFlatWaterShader(void) DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); DX8Wrapper::Set_DX8_Texture_Stage_State(2, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); - D3DXMATRIX inv; - float det; - Matrix4x4 curView; + D3DXMATRIX curView; DX8Wrapper::_Get_DX8_Transform(D3DTS_VIEW, curView); - D3DXMatrixInverse(&inv, &det, (D3DXMATRIX*)&curView); + D3DXMATRIX inv; + float det; + D3DXMatrixInverse(&inv, &det, &curView); 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/matrix3.cpp b/Core/Libraries/Source/WWVegas/WWMath/matrix3.cpp index 26de94bb92..40a3ea4d14 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix3.cpp +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix3.cpp @@ -290,7 +290,7 @@ void Matrix3x3::Symmetric_Eigen_Solve(void) void Matrix3x3::Multiply(const Matrix3x3 & A,const Matrix3x3 & B,Matrix3x3 * set_res) { Matrix3x3 tmp; - Matrix3x3 * Aptr; + const Matrix3x3 * Aptr; float tmp1,tmp2,tmp3; // Check for aliased parameters, copy the 'A' matrix into a temporary if the @@ -300,7 +300,7 @@ void Matrix3x3::Multiply(const Matrix3x3 & A,const Matrix3x3 & B,Matrix3x3 * set tmp = A; Aptr = &tmp; } else { - Aptr = (Matrix3x3 *)&A; + Aptr = &A; } tmp1 = B[0][0]; diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp index e3c3c46c10..f583321590 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.cpp @@ -64,7 +64,10 @@ #include "matrix3.h" #include "matrix4.h" #include "quat.h" -#include "d3dx8math.h" + +#include "WWLib/win.h" +#include +#include // some static matrices which are sometimes useful const Matrix3D Matrix3D::Identity @@ -509,32 +512,76 @@ void Matrix3D::Obj_Look_At(const Vector3 &p,const Vector3 &t,float roll) * * * HISTORY: * * 8/7/98 GTH : Created. * + * 01/03/2026 TheSuperHackers : Implemented. * *=============================================================================================*/ -void Matrix3D::Get_Inverse(Matrix3D & inv) const +Matrix3D * Matrix3D::Get_Inverse(Matrix3D * out, float * detOut, const Matrix3D * m) { - // TODO: Implement the general purpose inverse function here (once we need it :-) - //Get_Orthogonal_Inverse(inv); + // Read linear + translation elements + + const float m00 = m->Row[0][0], m01 = m->Row[1][0], m02 = m->Row[2][0]; + const float m10 = m->Row[0][1], m11 = m->Row[1][1], m12 = m->Row[2][1]; + const float m20 = m->Row[0][2], m21 = m->Row[1][2], m22 = m->Row[2][2]; + + const float tx = m->Row[0][3]; + const float ty = m->Row[1][3]; + const float tz = m->Row[2][3]; + + // Compute 2x2 sub-determinants (minors) for cofactor expansion + // These correspond to minors of the 4x4 extended matrix (with last row 0,0,0,1) + + const float s0 = m00 * m11 - m10 * m01; + const float s1 = m00 * m12 - m10 * m02; + const float s3 = m01 * m12 - m11 * m02; + + const float c5 = m22; + const float c4 = m21; + const float c2 = m20; + + const float c3 = m21 * tz - ty * m22; + const float c1 = m20 * tz - tx * m22; + const float c0 = m20 * ty - tx * m21; + + // Compute determinant (matches 4x4 extended determinant) + + const float det = s0 * c5 - s1 * c4 + s3 * c2; + + if (detOut) + *detOut = det; + + if (fabsf(det) < 1e-8f) + return NULL; + + const float invDet = 1.0f / det; + + // Compute inverse using adjugate / determinant + // Adjugate = transpose of cofactor matrix + // Multiplies each cofactor by 1/det to get the inverse + // Writes in column-major order to match engine conventions + + out->Row[0][0] = ( m11 * c5 - m12 * c4) * invDet; + out->Row[1][0] = (-m01 * c5 + m02 * c4) * invDet; + out->Row[2][0] = ( s3) * invDet; - Matrix4x4 mat4(*this); - Matrix4x4 mat4Inv; + out->Row[0][1] = (-m10 * c5 + m12 * c2) * invDet; + out->Row[1][1] = ( m00 * c5 - m02 * c2) * invDet; + out->Row[2][1] = ( -s1) * invDet; - float det; - D3DXMatrixInverse((D3DXMATRIX *)&mat4Inv, &det, (D3DXMATRIX*)&mat4); + out->Row[0][2] = ( m10 * c4 - m11 * c2) * invDet; + out->Row[1][2] = (-m00 * c4 + m01 * c2) * invDet; + out->Row[2][2] = ( s0) * invDet; - inv.Row[0][0]=mat4Inv[0][0]; - inv.Row[0][1]=mat4Inv[0][1]; - inv.Row[0][2]=mat4Inv[0][2]; - inv.Row[0][3]=mat4Inv[0][3]; + // Translation (still from 4x4 cofactors) - inv.Row[1][0]=mat4Inv[1][0]; - inv.Row[1][1]=mat4Inv[1][1]; - inv.Row[1][2]=mat4Inv[1][2]; - inv.Row[1][3]=mat4Inv[1][3]; + out->Row[0][3] = (-m10 * c3 + m11 * c1 - m12 * c0) * invDet; + out->Row[1][3] = ( m00 * c3 - m01 * c1 + m02 * c0) * invDet; + out->Row[2][3] = (-tx * s3 + ty * s1 - tz * s0) * invDet; - inv.Row[2][0]=mat4Inv[2][0]; - inv.Row[2][1]=mat4Inv[2][1]; - inv.Row[2][2]=mat4Inv[2][2]; - inv.Row[2][3]=mat4Inv[2][3]; + return out; +} + +void Matrix3D::Get_Inverse(Matrix3D & inv) const +{ + Get_Inverse(&inv, NULL, this); } /*********************************************************************************************** @@ -641,7 +688,7 @@ void Matrix3D::Multiply(const Matrix3D & A,const Matrix3D & B,Matrix3D * set_res assert(set_res != NULL); Matrix3D tmp; - Matrix3D * Aptr; + const Matrix3D * Aptr; // Check for aliased parameters, copy the 'A' matrix into a temporary if the // result is going into 'A'. (in this case, this function is no better than @@ -650,7 +697,7 @@ void Matrix3D::Multiply(const Matrix3D & A,const Matrix3D & B,Matrix3D * set_res tmp = A; Aptr = &tmp; } else { - Aptr = (Matrix3D *)&A; + Aptr = &A; } #ifdef ALLOW_TEMPORARIES @@ -1239,3 +1286,41 @@ bool Matrix3D::Solve_Linear_System(Matrix3D & system) return true; } + + +void To_D3DMATRIX(_D3DMATRIX& dxm, const Matrix3D& m) +{ + 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] = 0.0f; + + 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] = 0.0f; + + 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] = 0.0f; + + 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] = 1.0f; +} + +_D3DMATRIX To_D3DMATRIX(const Matrix3D& m) +{ + _D3DMATRIX dxm; + To_D3DMATRIX(dxm, m); + return dxm; +} + +D3DXMATRIX To_D3DXMATRIX(const Matrix3D& m) +{ + D3DXMATRIX dxm; + To_D3DMATRIX(dxm, m); + return dxm; +} diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.h b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.h index c849c8dab5..6aa4203709 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix3d.h +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix3d.h @@ -115,7 +115,7 @@ class Quaternion; I use column-vectors so normally transformations are post-multiplied and camera transformations should be pre-multiplied. The methods of this class called Translate, Rotate_X, etc. all perform post-multiplication - with the current matix. These methods (Translate, Rotate_X, etc) also + with the current matrix. These methods (Translate, Rotate_X, etc) also have been hand-coded to only perform the necessary arithmetic. The * operator can be used for general purpose matrix multiplication or to transform a vector by a matrix. @@ -231,7 +231,7 @@ class Matrix3D // These functions will give you the approximate amount that the // matrix has been rotated about a given axis. These functions - // cannot be used to re-build a matrx. Use the EulerAnglesClass + // cannot be used to re-build a matrix. Use the EulerAnglesClass // to convert a matrix into a set of three Euler angles. float Get_X_Rotation(void) const; float Get_Y_Rotation(void) const; @@ -306,12 +306,9 @@ class Matrix3D WWINLINE void Get_Z_Vector(Vector3 * set_z) const { set_z->Set(Row[0][2], Row[1][2], Row[2][2]); } // Get the inverse of the matrix. - // TODO: currently the "intended-to-be" general inverse function just calls - // the special case Orthogonal inverse functions. Also, when we implement - // general case, check where we were using Get_Inverse since usually it should - // be changed to Get_Orthogonal_Inverse... - void Get_Inverse(Matrix3D & set_inverse) const; - void Get_Orthogonal_Inverse(Matrix3D & set_inverse) const; + static Matrix3D * Get_Inverse(Matrix3D * out, float * detOut, const Matrix3D * m); + void Get_Inverse(Matrix3D & inv) const; + void Get_Orthogonal_Inverse(Matrix3D & inv) const; // used for importing SurRender matrices void Copy_3x3_Matrix(float matrix[3][3]); @@ -1810,3 +1807,15 @@ class DynamicMatrix3D : public W3DMPO public: Matrix3D Mat; }; + + +// TheSuperHackers @info Always convert Matrix3D to D3DMATRIX or vice versa with the conversion functions below. +// Reason being, D3DMATRIX is row-major, and Matrix3D is column-major and therefore copying one matrix to the +// other will always require a transpose. + +struct _D3DMATRIX; +struct D3DXMATRIX; + +extern void To_D3DMATRIX(_D3DMATRIX& dxm, const Matrix3D& m); +extern _D3DMATRIX To_D3DMATRIX(const Matrix3D& m); +extern D3DXMATRIX To_D3DXMATRIX(const Matrix3D& m); diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp b/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp index 69a0206e51..0b489a40c7 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix4.cpp @@ -43,6 +43,10 @@ #include "matrix4.h" #include +#include "WWLib/win.h" +#include +#include + /*********************************************************************************************** * Matrix4x4::Multiply -- Multiply two Matrix4x4's together * * * @@ -195,3 +199,70 @@ int operator != (const Matrix4x4 & a, const Matrix4x4 & b) return (!(a == b)); } + +void To_D3DMATRIX(_D3DMATRIX& dxm, const Matrix4x4& m) +{ + 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]; +} + +_D3DMATRIX To_D3DMATRIX(const Matrix4x4& m) +{ + _D3DMATRIX dxm; + To_D3DMATRIX(dxm, m); + return dxm; +} + +D3DXMATRIX To_D3DXMATRIX(const Matrix4x4& m) +{ + D3DXMATRIX dxm; + To_D3DMATRIX(dxm, m); + return dxm; +} + +void To_Matrix4x4(Matrix4x4& m, const _D3DMATRIX& dxm) +{ + 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 To_Matrix4x4(const _D3DMATRIX& dxm) +{ + Matrix4x4 m; + To_Matrix4x4(m, dxm); + return m; +} diff --git a/Core/Libraries/Source/WWVegas/WWMath/matrix4.h b/Core/Libraries/Source/WWVegas/WWMath/matrix4.h index 81211850c7..33e151363a 100644 --- a/Core/Libraries/Source/WWVegas/WWMath/matrix4.h +++ b/Core/Libraries/Source/WWVegas/WWMath/matrix4.h @@ -110,6 +110,7 @@ class Matrix4x4 ** Transpose and Inverse */ WWINLINE Matrix4x4 Transpose(void) const; + static WWINLINE Matrix4x4* Inverse(Matrix4x4* out, float* detOut, const Matrix4x4* m); WWINLINE Matrix4x4 Inverse(void) const; /* @@ -520,7 +521,7 @@ WWINLINE Matrix4x4 Matrix4x4::Transpose() const } /*********************************************************************************************** - * Matrix4x4::Inverse -- returns the inverse of the matrix * + * Matrix4x4::Inverse -- returns the inverse of the matrix * * * * INPUT: * * * @@ -530,46 +531,87 @@ WWINLINE Matrix4x4 Matrix4x4::Transpose() const * * * HISTORY: * * 06/02/1997 GH : Created. * + * 01/03/2026 TheSuperHackers : Implemented. * *=============================================================================================*/ -WWINLINE Matrix4x4 Matrix4x4::Inverse() const // Gauss-Jordan elimination with partial pivoting -{ - WWASSERT_PRINT(0,"Matrix4x4::Inverse does not work, re-implement!"); - - Matrix4x4 a(*this); // As a evolves from original mat into identity - Matrix4x4 b(true); // b evolves from identity into inverse(a) - int i, j, i1; - - // Loop over cols of a from left to right, eliminating above and below diagonal - for (j=0; j<4; j++) { - - // Find largest pivot in column j among rows j..3 - i1 = j; - for (i=j+1; i<4; i++) { - if (WWMath::Fabs(a[i][j]) > WWMath::Fabs(a[i1][j])) { - i1 = i; - } - } - - // Swap rows i1 and j in a and b to put pivot on diagonal - Swap(a.Row[i1], a.Row[j]); - Swap(b.Row[i1], b.Row[j]); - - // Scale row j to have a unit diagonal - if (a[j][j]==0.) { - //ALGEBRA_ERROR("Matrix4x4::inverse: singular matrix; can't invert\n"); - } - b.Row[j] /= a.Row[j][j]; - a.Row[j] /= a.Row[j][j]; - - // Eliminate off-diagonal elems in col j of a, doing identical ops to b - for (i=0; i<4; i++) { - if (i != j) { - b.Row[i] -= a[i][j] * b.Row[j]; - a.Row[i] -= a[i][j] * a.Row[j]; - } - } - } - return b; +WWINLINE Matrix4x4* Matrix4x4::Inverse(Matrix4x4* out, float* detOut, const Matrix4x4* m) +{ + // Read matrix elements + // Uses a column-major, column-vector convention (matches D3DXMatrixInverse) + // Row[i][j] stores the element at row i, column j. + + const float m00 = m->Row[0][0], m01 = m->Row[1][0], m02 = m->Row[2][0], m03 = m->Row[3][0]; + const float m10 = m->Row[0][1], m11 = m->Row[1][1], m12 = m->Row[2][1], m13 = m->Row[3][1]; + const float m20 = m->Row[0][2], m21 = m->Row[1][2], m22 = m->Row[2][2], m23 = m->Row[3][2]; + const float m30 = m->Row[0][3], m31 = m->Row[1][3], m32 = m->Row[2][3], m33 = m->Row[3][3]; + + // Compute 2x2 determinants (minors) used for cofactors + // s0..s5: sub-determinants of the upper-left 2x2 blocks, used in cofactor expansion + + const float s0 = m00 * m11 - m10 * m01; + const float s1 = m00 * m12 - m10 * m02; + const float s2 = m00 * m13 - m10 * m03; + const float s3 = m01 * m12 - m11 * m02; + const float s4 = m01 * m13 - m11 * m03; + const float s5 = m02 * m13 - m12 * m03; + + // c0..c5: sub-determinants of the lower-right 2x2 blocks, used in cofactor expansion + + const float c5 = m22 * m33 - m32 * m23; + const float c4 = m21 * m33 - m31 * m23; + const float c3 = m21 * m32 - m31 * m22; + const float c2 = m20 * m33 - m30 * m23; + const float c1 = m20 * m32 - m30 * m22; + const float c0 = m20 * m31 - m30 * m21; + + // Compute determinant of 4x4 matrix + // Using cofactor expansion along the first row + // If det is near zero, the matrix is singular and cannot be inverted + + const float det = + s0 * c5 - s1 * c4 + s2 * c3 + + s3 * c2 - s4 * c1 + s5 * c0; + + if (detOut) + *detOut = det; + + if (fabsf(det) < 1e-8f) + return NULL; + + const float invDet = 1.0f / det; + + // Compute inverse matrix using adjugate / determinant + // The adjugate matrix is the transpose of the cofactor matrix + // Multiplies each cofactor by 1/det to get the inverse + // Writes in column-major order to match engine conventions + + out->Row[0][0] = ( m11 * c5 - m12 * c4 + m13 * c3) * invDet; + out->Row[1][0] = (-m01 * c5 + m02 * c4 - m03 * c3) * invDet; + out->Row[2][0] = ( m31 * s5 - m32 * s4 + m33 * s3) * invDet; + out->Row[3][0] = (-m21 * s5 + m22 * s4 - m23 * s3) * invDet; + + out->Row[0][1] = (-m10 * c5 + m12 * c2 - m13 * c1) * invDet; + out->Row[1][1] = ( m00 * c5 - m02 * c2 + m03 * c1) * invDet; + out->Row[2][1] = (-m30 * s5 + m32 * s2 - m33 * s1) * invDet; + out->Row[3][1] = ( m20 * s5 - m22 * s2 + m23 * s1) * invDet; + + out->Row[0][2] = ( m10 * c4 - m11 * c2 + m13 * c0) * invDet; + out->Row[1][2] = (-m00 * c4 + m01 * c2 - m03 * c0) * invDet; + out->Row[2][2] = ( m30 * s4 - m31 * s2 + m33 * s0) * invDet; + out->Row[3][2] = (-m20 * s4 + m21 * s2 - m23 * s0) * invDet; + + out->Row[0][3] = (-m10 * c3 + m11 * c1 - m12 * c0) * invDet; + out->Row[1][3] = ( m00 * c3 - m01 * c1 + m02 * c0) * invDet; + out->Row[2][3] = (-m30 * s3 + m31 * s1 - m32 * s0) * invDet; + out->Row[3][3] = ( m20 * s3 - m21 * s1 + m22 * s0) * invDet; + + return out; +} + +WWINLINE Matrix4x4 Matrix4x4::Inverse() const +{ + Matrix4x4 inv; + Inverse(&inv, NULL, this); + return inv; } /*********************************************************************************************** @@ -836,3 +878,18 @@ 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); } + + +// TheSuperHackers @info Always convert Matrix4x4 to D3DMATRIX or vice versa with the conversion functions below. +// Reason being, D3DMATRIX is row-major, and Matrix4x4 is column-major and therefore copying one matrix to the +// other will always require a transpose. + +struct _D3DMATRIX; +struct D3DXMATRIX; + +extern void To_D3DMATRIX(_D3DMATRIX& dxm, const Matrix4x4& m); +extern _D3DMATRIX To_D3DMATRIX(const Matrix4x4& m); +extern D3DXMATRIX To_D3DXMATRIX(const Matrix4x4& m); + +extern void To_Matrix4x4(Matrix4x4& m, const _D3DMATRIX& dxm); +extern Matrix4x4 To_Matrix4x4(const _D3DMATRIX& dxm); diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp index 9bcf74d80e..49d2ab7f02 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp @@ -1351,11 +1351,8 @@ void W3DVolumetricShadow::RenderMeshVolume(Int meshIndex, Int lightIndex, const if( numVerts == 0 || numPolys == 0 ) return; - Matrix4x4 mWorld(*meshXform); - - ///@todo: W3D always does transpose on all of matrix sets. Slow??? Better to hack view matrix. - Matrix4x4 mWorldTransposed = mWorld.Transpose(); - m_pDev->SetTransform(D3DTS_WORLD,(_D3DMATRIX *)&mWorldTransposed); + D3DMATRIX dxmWorld = To_D3DMATRIX(*meshXform); + m_pDev->SetTransform(D3DTS_WORLD,&dxmWorld); W3DBufferManager::W3DVertexBufferSlot *vbSlot=m_shadowVolumeVB[lightIndex][ meshIndex ]; if (!vbSlot) @@ -1468,9 +1465,8 @@ void W3DVolumetricShadow::RenderDynamicMeshVolume(Int meshIndex, Int lightIndex, m_pDev->SetIndices(shadowIndexBufferD3D,nShadowStartBatchVertex); - Matrix4x4 mWorld(*meshXform); - Matrix4x4 mWorldTransposed = mWorld.Transpose(); - m_pDev->SetTransform(D3DTS_WORLD,(_D3DMATRIX *)&mWorldTransposed); + D3DMATRIX dxmWorld = To_D3DMATRIX(*meshXform); + m_pDev->SetTransform(D3DTS_WORLD,&dxmWorld); if (shadowVertexBufferD3D != lastActiveVertexBuffer) { m_pDev->SetStreamSource(0,shadowVertexBufferD3D,sizeof(SHADOW_DYNAMIC_VOLUME_VERTEX)); @@ -1624,8 +1620,8 @@ void W3DVolumetricShadow::RenderMeshVolumeBounds(Int meshIndex, Int lightIndex, //todo: replace this with mesh transform Matrix4x4 mWorld(1); //identity since boxes are pre-transformed to world space. - Matrix4x4 mWorldTransposed = mWorld.Transpose(); - m_pDev->SetTransform(D3DTS_WORLD,(_D3DMATRIX *)&mWorldTransposed); + D3DMATRIX dxmWorld = To_D3DMATRIX(mWorld); + m_pDev->SetTransform(D3DTS_WORLD,&dxmWorld); m_pDev->SetStreamSource(0,shadowVertexBufferD3D,sizeof(SHADOW_DYNAMIC_VOLUME_VERTEX)); m_pDev->SetVertexShader(SHADOW_DYNAMIC_VOLUME_FVF); @@ -2053,7 +2049,7 @@ void W3DVolumetricShadow::updateMeshVolume(Int meshIndex, Int lightIndex, const // system change, not the translations // Real det; - D3DXMatrixInverse((D3DXMATRIX*)&worldToObject, &det, (D3DXMATRIX*)&objectToWorld); + Matrix4x4::Inverse(&worldToObject, &det, &objectToWorld); // find out light position in object space Matrix4x4::Transform_Vector(worldToObject,lightPosWorld,&lightPosObject); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp index 9fa4fa0686..77f4f12b53 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.cpp @@ -168,8 +168,8 @@ bool DX8Wrapper::IsDeviceLost; int DX8Wrapper::ZBias; float DX8Wrapper::ZNear; float DX8Wrapper::ZFar; -Matrix4x4 DX8Wrapper::ProjectionMatrix; -Matrix4x4 DX8Wrapper::DX8Transforms[D3DTS_WORLD+1]; +D3DMATRIX DX8Wrapper::ProjectionMatrix; +D3DMATRIX DX8Wrapper::DX8Transforms[D3DTS_WORLD+1]; DX8Caps* DX8Wrapper::CurrentCaps = 0; @@ -484,13 +484,7 @@ void DX8Wrapper::Invalidate_Cached_Render_States(void) Release_Render_State(); // (gth) clear the matrix shadows too - for (int i=0; i_11 = 1.0f; + dxm->_22 = 1.0f; + dxm->_33 = 1.0f; + dxm->_44 = 1.0f; +} +} // namespace wrapper + +void DX8Wrapper::Set_World_Identity() +{ + if (render_state_changed&(unsigned)WORLD_IDENTITY) + return; + wrapper::D3DMatrixIdentity(&render_state.world); + render_state_changed|=(unsigned)WORLD_CHANGED|(unsigned)WORLD_IDENTITY; +} + +void DX8Wrapper::Set_View_Identity() +{ + if (render_state_changed&(unsigned)VIEW_IDENTITY) + return; + wrapper::D3DMatrixIdentity(&render_state.view); + render_state_changed|=(unsigned)VIEW_CHANGED|(unsigned)VIEW_IDENTITY; +} + //********************************************************************************************** //! Resets render device to default state /*! diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index db5b93030c..05adcc9589 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -179,8 +179,8 @@ struct RenderStateStruct D3DLIGHT8 Lights[4]; bool LightEnable[4]; //unsigned lightsHash; - Matrix4x4 world; - Matrix4x4 view; + D3DMATRIX world; + D3DMATRIX view; unsigned vertex_buffer_types[MAX_VERTEX_STREAMS]; unsigned index_buffer_type; unsigned short vba_offset; @@ -301,16 +301,15 @@ class DX8Wrapper static void Set_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m); static void Set_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m); static void Get_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m); - static void Set_World_Identity(); + static void Set_World_Identity(); static void Set_View_Identity(); - static bool Is_World_Identity(); + static bool Is_World_Identity(); static bool Is_View_Identity(); // Note that *_DX8_Transform() functions take the matrix in DX8 format - transposed from Westwood convention. - static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix4x4& m); - static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m); - static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m); + static void _Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform, const D3DMATRIX& m); + static void _Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DMATRIX& m); static void Set_DX8_Light(int index,D3DLIGHT8* light); static void Set_DX8_Render_State(D3DRENDERSTATETYPE state, unsigned value); @@ -622,7 +621,7 @@ class DX8Wrapper static RenderStateStruct render_state; static unsigned render_state_changed; - static Matrix4x4 DX8Transforms[D3DTS_WORLD+1]; + static D3DMATRIX DX8Transforms[D3DTS_WORLD+1]; static bool IsInitted; static bool IsDeviceLost; @@ -702,7 +701,7 @@ class DX8Wrapper static int ZBias; static float ZNear; static float ZFar; - static Matrix4x4 ProjectionMatrix; + static D3DMATRIX ProjectionMatrix; friend void DX8_Assert(); friend class WW3D; @@ -754,40 +753,27 @@ 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); -#if 0 // (gth) this optimization is breaking generals because they set the transform behind our backs. - if (m!=DX8Transforms[transform]) -#endif - { - 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)); - } -} - - -WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m) +WWINLINE void DX8Wrapper::_Set_DX8_Transform(D3DTRANSFORMSTATETYPE transform, const D3DMATRIX& m) { WWASSERT(transform<=D3DTS_WORLD); - Matrix4x4 mtx(m); #if 0 // (gth) this optimization is breaking generals because they set the transform behind our backs. if (mtx!=DX8Transforms[transform]) #endif { - 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])); + DX8Transforms[transform]=m; + SNAPSHOT_SAY(("DX8 - SetTransform %d [%f,%f,%f,%f][%f,%f,%f,%f][%f,%f,%f,%f]", + transform, + m.m[0][0],m.m[0][1],m.m[0][2],m.m[0][3], + m.m[1][0],m.m[1][1],m.m[1][2],m.m[1][3], + m.m[2][0],m.m[2][1],m.m[2][2],m.m[2][3])); DX8_RECORD_MATRIX_CHANGE(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m)); + DX8CALL(SetTransform(transform,&m)); } } -WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m) +WWINLINE void DX8Wrapper::_Get_DX8_Transform(D3DTRANSFORMSTATETYPE transform, D3DMATRIX& m) { - DX8CALL(GetTransform(transform,(D3DMATRIX*)&m)); + DX8CALL(GetTransform(transform,&m)); } // ---------------------------------------------------------------------------- @@ -1212,18 +1198,18 @@ WWINLINE void DX8Wrapper::Set_Projection_Transform_With_Z_Bias(const Matrix4x4& { ZFar=zfar; ZNear=znear; - ProjectionMatrix=matrix.Transpose(); + ProjectionMatrix=To_D3DMATRIX(matrix); if (!Get_Current_Caps()->Support_ZBias() && ZNear!=ZFar) { - Matrix4x4 tmp=ProjectionMatrix; + D3DMATRIX tmp=ProjectionMatrix; float tmp_zbias=ZBias; tmp_zbias*=(1.0f/16.0f); tmp_zbias*=1.0f / (ZFar - ZNear); - tmp[2][2]-=tmp_zbias*tmp[3][2]; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&tmp)); + tmp.m[2][2]-=tmp_zbias*tmp.m[3][2]; + DX8CALL(SetTransform(D3DTS_PROJECTION,&tmp)); } else { - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + DX8CALL(SetTransform(D3DTS_PROJECTION,&ProjectionMatrix)); } } @@ -1235,12 +1221,12 @@ WWINLINE void DX8Wrapper::Set_DX8_ZBias(int zbias) ZBias=zbias; if (!Get_Current_Caps()->Support_ZBias() && ZNear!=ZFar) { - Matrix4x4 tmp=ProjectionMatrix; + D3DMATRIX tmp=ProjectionMatrix; float tmp_zbias=ZBias; tmp_zbias*=(1.0f/16.0f); tmp_zbias*=1.0f / (ZFar - ZNear); - tmp[2][2]-=tmp_zbias*tmp[3][2]; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&tmp)); + tmp.m[2][2]-=tmp_zbias*tmp.m[3][2]; + DX8CALL(SetTransform(D3DTS_PROJECTION,&tmp)); } else { Set_DX8_Render_State (D3DRS_ZBIAS, ZBias); @@ -1251,67 +1237,52 @@ WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Ma { switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m.Transpose(); + render_state.world=To_D3DMATRIX(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=To_D3DMATRIX(m); render_state_changed|=(unsigned)VIEW_CHANGED; render_state_changed&=~(unsigned)VIEW_IDENTITY; break; case D3DTS_PROJECTION: { - Matrix4x4 ProjectionMatrix=m.Transpose(); + D3DMATRIX ProjectionMatrix=To_D3DMATRIX(m); ZFar=0.0f; ZNear=0.0f; - DX8CALL(SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&ProjectionMatrix)); + DX8CALL(SetTransform(D3DTS_PROJECTION,&ProjectionMatrix)); } break; default: DX8_RECORD_MATRIX_CHANGE(); - Matrix4x4 m2=m.Transpose(); - DX8CALL(SetTransform(transform,(D3DMATRIX*)&m2)); + D3DMATRIX dxm=To_D3DMATRIX(m); + DX8CALL(SetTransform(transform,&dxm)); break; } } WWINLINE void DX8Wrapper::Set_Transform(D3DTRANSFORMSTATETYPE transform,const Matrix3D& m) { - Matrix4x4 m2(m); switch ((int)transform) { case D3DTS_WORLD: - render_state.world=m2.Transpose(); + render_state.world=To_D3DMATRIX(m); render_state_changed|=(unsigned)WORLD_CHANGED; render_state_changed&=~(unsigned)WORLD_IDENTITY; break; case D3DTS_VIEW: - render_state.view=m2.Transpose(); + render_state.view=To_D3DMATRIX(m); 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)); + D3DMATRIX dxm=To_D3DMATRIX(m); + DX8CALL(SetTransform(transform,&dxm)); break; } } -WWINLINE void DX8Wrapper::Set_World_Identity() -{ - if (render_state_changed&(unsigned)WORLD_IDENTITY) return; - render_state.world.Make_Identity(); - 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(); - render_state_changed|=(unsigned)VIEW_CHANGED|(unsigned)VIEW_IDENTITY; -} - WWINLINE bool DX8Wrapper::Is_World_Identity() { return !!(render_state_changed&(unsigned)WORLD_IDENTITY); @@ -1324,21 +1295,19 @@ WWINLINE bool DX8Wrapper::Is_View_Identity() WWINLINE void DX8Wrapper::Get_Transform(D3DTRANSFORMSTATETYPE transform, Matrix4x4& m) { - D3DMATRIX mat; - switch ((int)transform) { case D3DTS_WORLD: if (render_state_changed&WORLD_IDENTITY) m.Make_Identity(); - else m=render_state.world.Transpose(); + else m=To_Matrix4x4(render_state.world); break; case D3DTS_VIEW: if (render_state_changed&VIEW_IDENTITY) m.Make_Identity(); - else m=render_state.view.Transpose(); + else m=To_Matrix4x4(render_state.view); break; default: - DX8CALL(GetTransform(transform,&mat)); - m=*(Matrix4x4*)&mat; - m=m.Transpose(); + D3DMATRIX dxm; + DX8CALL(GetTransform(transform,&dxm)); + m=To_Matrix4x4(dxm); break; } }