From 36a4d2166cd9bf222986dfcb2e8ffb398469a9e1 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 4 Oct 2026 07:47:00 -0400 Subject: [PATCH 1/4] refactor(ww3d2): Route Clear, Set_Viewport, Set_Gamma via the backend --- .../Source/W3DDevice/GameClient/W3DDisplay.cpp | 3 ++- .../W3DDevice/GameClient/W3DShaderManager.cpp | 3 ++- .../Source/W3DDevice/GameClient/W3DView.cpp | 3 ++- .../W3DDevice/GameClient/Water/W3DWater.cpp | 3 ++- Core/Tools/W3DView/GammaDialog.cpp | 6 +++--- Core/Tools/W3DView/MainFrm.cpp | 6 +++--- .../Source/W3DDevice/GameClient/W3DScene.cpp | 5 +++-- .../Libraries/Source/WWVegas/WW3D2/camera.cpp | 17 +++++++++-------- .../Libraries/Source/WWVegas/WW3D2/render2d.cpp | 17 +++++++++-------- .../Libraries/Source/WWVegas/WW3D2/scene.cpp | 3 ++- 10 files changed, 37 insertions(+), 29 deletions(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp index b7d6a44a5b5..ac8c8fa6cc0 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp @@ -86,6 +86,7 @@ static void drawFramerateBar(); #include "WWMath/wwmath.h" #include "WWLib/registry.h" #include "WW3D2/ww3d.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/predlod.h" #include "WW3D2/part_emt.h" #include "WW3D2/part_ldr.h" @@ -549,7 +550,7 @@ void W3DDisplay::setGamma(Real gamma, Real bright, Real contrast, Bool calibrate if (m_windowed) return; //we don't allow gamma to change in window because it would affect desktop. - DX8Wrapper::Set_Gamma(gamma,bright,contrast,calibrate, false); + WW3D::Get_Render_Backend()->Set_Gamma(gamma,bright,contrast,calibrate, false); } /** Set resolution of display */ diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp index bed86510ad0..9673e73d2d4 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DShaderManager.cpp @@ -54,6 +54,7 @@ //----------------------------------------------------------------------------- #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/assetmgr.h" #include "Lib/BaseType.h" #include "Common/file.h" @@ -2906,7 +2907,7 @@ void W3DShaderManager::startRenderToTexture() DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE); //disable writes to alpha } else //normal clear that overwrites everything. - DX8Wrapper::Clear(true, false, Vector3( 0.0f, 0.0f, 0.0f ), TheWaterTransparency->m_minWaterOpacity); + WW3D::Get_Render_Backend()->Clear(true, false, Vector3( 0.0f, 0.0f, 0.0f ), TheWaterTransparency->m_minWaterOpacity); } } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp index d438761a744..531acf34b17 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp @@ -94,6 +94,7 @@ #include "WW3D2/light.h" #include "WW3D2/predlod.h" #include "WW3D2/ww3d.h" +#include "WW3D2/IRenderBackend.h" #include "W3DDevice/GameClient/CameraShakeSystem.h" @@ -1916,7 +1917,7 @@ void W3DView::draw() //The pass that rendered into a texture may have left the z-buffer in a weird state //so clear it before rendering normal scene. ///@todo: Don't clear z-buffer unless shader uses z-bias or anything else that would cause <= z to fail on normal render. - DX8Wrapper::Clear(false, true, Vector3(0.0f,0.0f,0.0f), TheWaterTransparency->m_minWaterOpacity); // Clear z but not color + WW3D::Get_Render_Backend()->Clear(false, true, Vector3(0.0f,0.0f,0.0f), TheWaterTransparency->m_minWaterOpacity); // Clear z but not color W3DDisplay::m_3DScene->setCustomPassMode(SCENE_PASS_DEFAULT); W3DDisplay::m_3DScene->doRender( m_3DCamera ); Coord2D deltaScroll; diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index b2375cb1269..67ffa309ae5 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -43,6 +43,7 @@ #include "WW3D2/camera.h" #include "WW3D2/scene.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/light.h" #include "d3dx8math.h" #include "WWLib/simplevec.h" @@ -1711,7 +1712,7 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo) rinfo.Camera.Apply(); //force an update of all the camera dependent parameters like frustum clip planes //clear the z-buffer to remove changes made by objects inside mirror - DX8Wrapper::Clear(false,true,Vector3(0.1f,0.1f,0.1f)); + WW3D::Get_Render_Backend()->Clear(false,true,Vector3(0.1f,0.1f,0.1f)); } #endif diff --git a/Core/Tools/W3DView/GammaDialog.cpp b/Core/Tools/W3DView/GammaDialog.cpp index 4b9467b11f9..87af72ba4cf 100644 --- a/Core/Tools/W3DView/GammaDialog.cpp +++ b/Core/Tools/W3DView/GammaDialog.cpp @@ -22,7 +22,7 @@ #include "StdAfx.h" #include "W3DView.h" #include "GammaDialog.h" -#include "WW3D2/dx8wrapper.h" +#include "WW3D2/ww3d.h" #ifdef RTS_DEBUG #define new DEBUG_NEW @@ -94,7 +94,7 @@ void GammaDialogClass::OnOK() if (m_gamma<10) m_gamma=10; if (m_gamma>30) m_gamma=30; ::AfxGetApp()->WriteProfileInt("Config","Gamma",m_gamma); - DX8Wrapper::Set_Gamma(m_gamma/10.0f,0.0f,1.0f); + WW3D::Set_Gamma(m_gamma/10.0f,0.0f,1.0f); CDialog::OnOK(); } @@ -103,7 +103,7 @@ void GammaDialogClass::OnReleasedcaptureGammaSlider(NMHDR* pNMHDR, LRESULT* pRes { // TODO: Add your control notification handler code here m_gamma=m_gammaslider.GetPos(); - DX8Wrapper::Set_Gamma(m_gamma/10.0f,0.0f,1.0f); + WW3D::Set_Gamma(m_gamma/10.0f,0.0f,1.0f); CString string; string.Format("%3.2f",m_gamma/10.0f); SetDlgItemText(IDC_GAMMA_DISPLAY,string); diff --git a/Core/Tools/W3DView/MainFrm.cpp b/Core/Tools/W3DView/MainFrm.cpp index e42303f5ee4..34e72ced8f9 100644 --- a/Core/Tools/W3DView/MainFrm.cpp +++ b/Core/Tools/W3DView/MainFrm.cpp @@ -587,7 +587,7 @@ CMainFrame::OnCreateClient gamma=gamma/10.0f; if (gamma<1.0) gamma=1.0; if (gamma>3.0) gamma=3.0; - DX8Wrapper::Set_Gamma(gamma,0.0f,1.0f); + WW3D::Set_Gamma(gamma,0.0f,1.0f); } } } @@ -4206,9 +4206,9 @@ void CMainFrame::OnEnableGammaCorrection() gamma=gamma/10.0f; if (gamma<1.0) gamma=1.0; if (gamma>3.0) gamma=3.0; - DX8Wrapper::Set_Gamma(gamma,0.0f,1.0f); + WW3D::Set_Gamma(gamma,0.0f,1.0f); } else { - DX8Wrapper::Set_Gamma(1.0,0.0f,1.0f); + WW3D::Set_Gamma(1.0,0.0f,1.0f); } } diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp index aedda9bc0da..f41488fad77 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp @@ -57,6 +57,7 @@ #include "WW3D2/dx8renderer.h" #include "WW3D2/sortingrenderer.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/light.h" #include "WW3D2/matpass.h" #include "WW3D2/shader.h" @@ -1015,7 +1016,7 @@ void RTS3DScene::Render(RenderInfoClass & rinfo) //a projected alpha texture which will later be used to determine where //wireframe should be visible. ///@todo: Clearing to black may not be needed if the scene already did the clear. - DX8Wrapper::Clear(true, false, Vector3(0.0f,0.0f,0.0f),1.0f); // Clear color but not z + WW3D::Get_Render_Backend()->Clear(true, false, Vector3(0.0f,0.0f,0.0f),1.0f); // Clear color but not z DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_ALPHA); DX8Wrapper::Set_DX8_Render_State (D3DRS_ZBIAS, 0); @@ -1075,7 +1076,7 @@ void RTS3DScene::Render(RenderInfoClass & rinfo) Customized_Render(rinfo); break; case EXTRA_PASS_CLEAR_LINE: - DX8Wrapper::Clear(true, false, Vector3(0.0f,0.0f,0.0f), 0.0f); // Clear color but not z + WW3D::Get_Render_Backend()->Clear(true, false, Vector3(0.0f,0.0f,0.0f), 0.0f); // Clear color but not z WW3D::Enable_Texturing(false); WW3D::Enable_Coloring(0xff008000); DX8Wrapper::Set_DX8_Render_State(D3DRS_FILLMODE,D3DFILL_WIREFRAME); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp index 9666f20940b..9dac26bff5d 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp @@ -73,6 +73,7 @@ #include "camera.h" #include "ww3d.h" +#include "IRenderBackend.h" #include "WWMath/matrix4.h" #include "dx8wrapper.h" @@ -738,14 +739,14 @@ void CameraClass::Apply() bool windowed; WW3D::Get_Render_Target_Resolution(width,height,bits,windowed); - D3DVIEWPORT8 vp; - vp.X = (DWORD)(Viewport.Min.X * (float)width); - vp.Y = (DWORD)(Viewport.Min.Y * (float)height); - vp.Width = (DWORD)((Viewport.Max.X - Viewport.Min.X) * (float)width); - vp.Height = (DWORD)((Viewport.Max.Y - Viewport.Min.Y) * (float)height); - vp.MinZ = ZBufferMin; - vp.MaxZ = ZBufferMax; - DX8Wrapper::Set_Viewport(&vp); + RenderBackendViewport vp; + vp.x = (unsigned int)(Viewport.Min.X * (float)width); + vp.y = (unsigned int)(Viewport.Min.Y * (float)height); + vp.width = (unsigned int)((Viewport.Max.X - Viewport.Min.X) * (float)width); + vp.height = (unsigned int)((Viewport.Max.Y - Viewport.Min.Y) * (float)height); + vp.min_z = ZBufferMin; + vp.max_z = ZBufferMax; + WW3D::Get_Render_Backend()->Set_Viewport(vp); Matrix4x4 d3dprojection; Get_D3D_Projection_Matrix(&d3dprojection); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp index 085a938fe72..0a9e1ccead7 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp @@ -42,6 +42,7 @@ #include "render2d.h" #include "WWLib/mutex.h" #include "ww3d.h" +#include "IRenderBackend.h" #include "font3d.h" #include "WWMath/rect.h" #include "texture.h" @@ -617,14 +618,14 @@ void Render2DClass::Render() int width, height, bits; bool windowed; WW3D::Get_Device_Resolution( width, height, bits, windowed ); - D3DVIEWPORT8 vp = { 0 }; - vp.X = 0; - vp.Y = 0; - vp.Width = width; - vp.Height = height; - vp.MinZ = 0; - vp.MaxZ = 1; - DX8Wrapper::Set_Viewport(&vp); + RenderBackendViewport vp; + vp.x = 0; + vp.y = 0; + vp.width = width; + vp.height = height; + vp.min_z = 0; + vp.max_z = 1; + WW3D::Get_Render_Backend()->Set_Viewport(vp); DX8Wrapper::Set_Texture(0,Texture); VertexMaterialClass *vm=VertexMaterialClass::Get_Preset(VertexMaterialClass::PRELIT_DIFFUSE); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp index f7b975da694..a42c81658be 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp @@ -65,6 +65,7 @@ #include "WWMath/plane.h" #include "camera.h" #include "ww3d.h" +#include "IRenderBackend.h" #include "rinfo.h" #include "WWLib/chunkio.h" #include "dx8renderer.h" @@ -233,7 +234,7 @@ void SceneClass::Render(RenderInfoClass & rinfo) Customized_Render(rinfo); break; case EXTRA_PASS_CLEAR_LINE: - DX8Wrapper::Clear(true, false, Vector3(0.0f,0.0f,0.0f)); // Clear color but not z + WW3D::Get_Render_Backend()->Clear(true, false, Vector3(0.0f,0.0f,0.0f)); // Clear color but not z WW3D::Enable_Texturing(false); DX8Wrapper::Set_DX8_Render_State(D3DRS_FILLMODE,D3DFILL_WIREFRAME); DX8Wrapper::Set_DX8_Render_State (D3DRS_ZBIAS, 7); From 9ef857e87d743b04f738c6b8f1250924f739418d Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 4 Oct 2026 07:49:23 -0400 Subject: [PATCH 2/4] refactor(ww3d2): Route device and display queries via IRenderBackend --- .../W3DDevice/GameClient/BaseHeightMap.cpp | 5 +- .../W3DDevice/GameClient/FlatHeightMap.cpp | 3 +- .../Source/W3DDevice/GameClient/HeightMap.cpp | 3 +- .../W3DDevice/GameClient/W3DDisplay.cpp | 2 +- .../W3DDevice/GameClient/Water/W3DWater.cpp | 2 +- .../WWVegas/WW3D2/Backend/DX8Backend.cpp | 60 +++++++++++++++++++ .../Source/WWVegas/WW3D2/Backend/DX8Backend.h | 13 ++++ .../Source/WWVegas/WW3D2/IRenderBackend.h | 27 ++++++--- .../Source/WWVegas/WW3D2/dx8wrapper.h | 1 + Core/Libraries/Source/WWVegas/WW3D2/ww3d.cpp | 24 ++++---- .../GameClient/Shadow/W3DVolumetricShadow.cpp | 3 +- .../Source/W3DDevice/GameClient/W3DScene.cpp | 8 +-- 12 files changed, 119 insertions(+), 32 deletions(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp index 4cbe7db3bad..b8f3e52ea8c 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp @@ -83,6 +83,7 @@ #include "W3DDevice/GameClient/W3DWater.h" #include "W3DDevice/GameClient/W3DShroud.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/light.h" #include "WW3D2/scene.h" #include "W3DDevice/GameClient/W3DPoly.h" @@ -2296,7 +2297,7 @@ void BaseHeightMapRenderObjClass::renderShoreLines(CameraClass *pCamera) return; //Check if video card is capable of using this effect - if (DX8Wrapper::getBackBufferFormat() != WW3D_FORMAT_A8R8G8B8) + if (WW3D::Get_Render_Backend()->Get_Back_Buffer_Format() != WW3D_FORMAT_A8R8G8B8) return; //can't apply effect on cards without destination alpha Int vertexCount = 0; @@ -2461,7 +2462,7 @@ void BaseHeightMapRenderObjClass::renderShoreLinesSorted(CameraClass *pCamera) return; //Check if video card is capable of using this effect - if (DX8Wrapper::getBackBufferFormat() != WW3D_FORMAT_A8R8G8B8) + if (WW3D::Get_Render_Backend()->Get_Back_Buffer_Format() != WW3D_FORMAT_A8R8G8B8) return; //can't apply effect on cards without destination alpha Int vertexCount = 0; diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp index 0dc03cfb1bb..4c6ac103cec 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp @@ -82,6 +82,7 @@ #include "W3DDevice/GameClient/W3DWater.h" #include "W3DDevice/GameClient/W3DShroud.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/light.h" #include "WW3D2/scene.h" #include "W3DDevice/GameClient/W3DPoly.h" @@ -537,7 +538,7 @@ void FlatHeightMapRenderObjClass::Render(RenderInfoClass & rinfo) W3DShaderManager::setTexture(2,m_stageTwoTexture); //cloud W3DShaderManager::setTexture(3,m_stageThreeTexture);//noise //Disable writes to destination alpha channel (if there is one) - if (DX8Wrapper::getBackBufferFormat() == WW3D_FORMAT_A8R8G8B8) { + if (WW3D::Get_Render_Backend()->Get_Back_Buffer_Format() == WW3D_FORMAT_A8R8G8B8) { DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp index cea9b8e7275..cff9c53c5cd 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp @@ -83,6 +83,7 @@ #include "W3DDevice/GameClient/W3DWater.h" #include "W3DDevice/GameClient/W3DShroud.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/light.h" #include "WW3D2/scene.h" #include "W3DDevice/GameClient/W3DPoly.h" @@ -2019,7 +2020,7 @@ void HeightMapRenderObjClass::Render(RenderInfoClass & rinfo) W3DShaderManager::setTexture(2,m_stageTwoTexture); //cloud W3DShaderManager::setTexture(3,m_stageThreeTexture);//noise //Disable writes to destination alpha channel (if there is one) - if (DX8Wrapper::getBackBufferFormat() == WW3D_FORMAT_A8R8G8B8) + if (WW3D::Get_Render_Backend()->Get_Back_Buffer_Format() == WW3D_FORMAT_A8R8G8B8) DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED); } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp index ac8c8fa6cc0..fcac1d9d5fd 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp @@ -2937,7 +2937,7 @@ VideoBuffer* W3DDisplay::createVideoBuffer() // first try to use the native format - WW3DFormat displayFormat = DX8Wrapper::getBackBufferFormat(); + WW3DFormat displayFormat = WW3D::Get_Render_Backend()->Get_Back_Buffer_Format(); if ( DX8Wrapper::Get_Current_Caps()->Support_Texture_Format( displayFormat )) { diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index 67ffa309ae5..cfbf09f880f 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -3284,7 +3284,7 @@ void WaterRenderObjClass::drawTrapezoidWater(Vector3 points[4]) setupFlatWaterShader();// lorenzen sez use the alpha shader //If video card supports it and it's enabled, feather the water edge using destination alpha - if (DX8Wrapper::getBackBufferFormat() == WW3D_FORMAT_A8R8G8B8 && TheGlobalData->m_showSoftWaterEdge && TheWaterTransparency->m_transparentWaterDepth !=0) + if (WW3D::Get_Render_Backend()->Get_Back_Buffer_Format() == WW3D_FORMAT_A8R8G8B8 && TheGlobalData->m_showSoftWaterEdge && TheWaterTransparency->m_transparentWaterDepth !=0) { DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND, D3DBLEND_DESTALPHA ); if (!TheWaterTransparency->m_additiveBlend) DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND, D3DBLEND_INVDESTALPHA ); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp index fac042dc906..50f3b06689b 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp @@ -59,6 +59,66 @@ DX8Backend *DX8Backend::Create(void * window, bool lite) return new DX8Backend(lite); } +int DX8Backend::Get_Render_Device_Count() const +{ + return DX8Wrapper::Get_Render_Device_Count(); +} + +int DX8Backend::Get_Render_Device() const +{ + return DX8Wrapper::Get_Render_Device(); +} + +const char * DX8Backend::Get_Render_Device_Name(int device_index) const +{ + return DX8Wrapper::Get_Render_Device_Name(device_index); +} + +void DX8Backend::Get_Device_Resolution(int & width, int & height, int & bits, bool & windowed) const +{ + DX8Wrapper::Get_Device_Resolution(width, height, bits, windowed); +} + +void DX8Backend::Get_Render_Target_Resolution(int & width, int & height, int & bits, bool & windowed) const +{ + DX8Wrapper::Get_Render_Target_Resolution(width, height, bits, windowed); +} + +int DX8Backend::Get_Device_Resolution_Width() const +{ + return DX8Wrapper::Get_Device_Resolution_Width(); +} + +int DX8Backend::Get_Device_Resolution_Height() const +{ + return DX8Wrapper::Get_Device_Resolution_Height(); +} + +bool DX8Backend::Is_Windowed() const +{ + return DX8Wrapper::Is_Windowed(); +} + +int DX8Backend::Get_Texture_Bitdepth() const +{ + return DX8Wrapper::Get_Texture_Bitdepth(); +} + +int DX8Backend::Get_Swap_Interval() const +{ + return DX8Wrapper::Get_Swap_Interval(); +} + +bool DX8Backend::Has_Stencil() const +{ + return DX8Wrapper::Has_Stencil(); +} + +WW3DFormat DX8Backend::Get_Back_Buffer_Format() const +{ + return DX8Wrapper::getBackBufferFormat(); +} + void DX8Backend::Set_Gamma(float gamma, float bright, float contrast, bool calibrate, bool uselimit) { DX8Wrapper::Set_Gamma(gamma, bright, contrast, calibrate, uselimit); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h index a5597c9edef..6eab3aa1a67 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h @@ -31,6 +31,19 @@ class DX8Backend : public IRenderBackend virtual ~DX8Backend() override; + virtual int Get_Render_Device_Count() const override; + virtual int Get_Render_Device() const override; + virtual const char * Get_Render_Device_Name(int device_index) const override; + virtual void Get_Device_Resolution(int & width, int & height, int & bits, bool & windowed) const override; + virtual void Get_Render_Target_Resolution(int & width, int & height, int & bits, bool & windowed) const override; + virtual int Get_Device_Resolution_Width() const override; + virtual int Get_Device_Resolution_Height() const override; + virtual bool Is_Windowed() const override; + virtual int Get_Texture_Bitdepth() const override; + virtual int Get_Swap_Interval() const override; + virtual bool Has_Stencil() const override; + virtual WW3DFormat Get_Back_Buffer_Format() const override; + virtual void Set_Gamma(float gamma, float bright, float contrast, bool calibrate, bool uselimit) override; virtual void Begin_Scene() override; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h index 28dd3b14ec8..3989829e8f8 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h @@ -22,8 +22,10 @@ #pragma once +#include "WW3D2/ww3dformat.h" + // Forward declarations keep this header includable without pulling in the full -// WW3D2 header graph. All W3D types below are passed by pointer or reference. +// WW3D2 header graph. All W3D classes below are passed by pointer or reference. class LightEnvironmentClass; class Vector3; @@ -38,20 +40,27 @@ struct RenderBackendViewport float max_z; }; -// A method appears here once a caller routes through it, not in anticipation of -// one. The set below is what current callers route through; the rest of the -// DX8Wrapper API stays reachable through DX8Wrapper's static methods until a -// caller migrates, at which point the method it needs moves here. -// -// Method names intentionally match the existing DX8Wrapper names so migrating a -// caller is a mechanical DX8Wrapper::X(...) -> Get_Render_Backend()->X(...) -// rewrite. +// The interface holds only the methods that callers route through. The rest of +// the DX8Wrapper API is called directly. class IRenderBackend { public: virtual ~IRenderBackend() {} + virtual int Get_Render_Device_Count() const = 0; + virtual int Get_Render_Device() const = 0; + virtual const char * Get_Render_Device_Name(int device_index) const = 0; + virtual void Get_Device_Resolution(int & width, int & height, int & bits, bool & windowed) const = 0; + virtual void Get_Render_Target_Resolution(int & width, int & height, int & bits, bool & windowed) const = 0; + virtual int Get_Device_Resolution_Width() const = 0; + virtual int Get_Device_Resolution_Height() const = 0; + virtual bool Is_Windowed() const = 0; + virtual int Get_Texture_Bitdepth() const = 0; + virtual int Get_Swap_Interval() const = 0; + virtual bool Has_Stencil() const = 0; + virtual WW3DFormat Get_Back_Buffer_Format() const = 0; + virtual void Set_Gamma(float gamma, float bright, float contrast, bool calibrate = true, bool uselimit = true) = 0; virtual void Begin_Scene() = 0; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h b/Core/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h index 746dbedc75c..ce99aa2b6a6 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/dx8wrapper.h @@ -703,6 +703,7 @@ class DX8Wrapper friend void DX8_Assert(); friend class WW3D; + friend class DX8Backend; friend class DX8IndexBufferClass; friend class DX8VertexBufferClass; }; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/ww3d.cpp b/Core/Libraries/Source/WWVegas/WW3D2/ww3d.cpp index c43588d279d..52dd5850ae7 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/ww3d.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/ww3d.cpp @@ -512,7 +512,7 @@ void *WW3D::Get_Window() *=============================================================================================*/ bool WW3D::Is_Windowed() { - return DX8Wrapper::Is_Windowed(); + return Get_Render_Backend()->Is_Windowed(); } /*********************************************************************************************** @@ -556,7 +556,7 @@ WW3DErrorType WW3D::Toggle_Windowed () *=============================================================================================*/ int WW3D::Get_Render_Device() { - return DX8Wrapper::Get_Render_Device(); + return Get_Render_Backend()->Get_Render_Device(); } @@ -595,7 +595,7 @@ const RenderDeviceDescClass & WW3D::Get_Render_Device_Desc(int deviceidx) *=============================================================================================*/ int WW3D::Get_Render_Device_Count() { - return DX8Wrapper::Get_Render_Device_Count(); + return Get_Render_Backend()->Get_Render_Device_Count(); } @@ -614,7 +614,7 @@ int WW3D::Get_Render_Device_Count() *=============================================================================================*/ const char * WW3D::Get_Render_Device_Name(int device_index) { - return DX8Wrapper::Get_Render_Device_Name(device_index); + return Get_Render_Backend()->Get_Render_Device_Name(device_index); } @@ -657,7 +657,7 @@ WW3DErrorType WW3D::Set_Device_Resolution(int width,int height,int bits,int wind *=============================================================================================*/ void WW3D::Get_Render_Target_Resolution(int & set_w,int & set_h,int & set_bits,bool & set_windowed) { - DX8Wrapper::Get_Render_Target_Resolution(set_w,set_h,set_bits,set_windowed); + Get_Render_Backend()->Get_Render_Target_Resolution(set_w,set_h,set_bits,set_windowed); } @@ -676,7 +676,7 @@ void WW3D::Get_Render_Target_Resolution(int & set_w,int & set_h,int & set_bits,b *=============================================================================================*/ void WW3D::Get_Device_Resolution(int & set_w,int & set_h,int & set_bits,bool & set_windowed) { - DX8Wrapper::Get_Device_Resolution(set_w,set_h,set_bits,set_windowed); + Get_Render_Backend()->Get_Device_Resolution(set_w,set_h,set_bits,set_windowed); } @@ -1242,7 +1242,7 @@ void WW3D::Set_Ext_Swap_Interval(long swap) *=============================================================================================*/ long WW3D::Get_Ext_Swap_Interval() { - return DX8Wrapper::Get_Swap_Interval(); + return Get_Render_Backend()->Get_Swap_Interval(); } @@ -1299,12 +1299,12 @@ int WW3D::Get_Collision_Box_Display_Mask() void WW3D::Normalize_Coordinates(int x, int y, float &fx, float &fy) { // clip the coordinates back into the resolution of the screen - x = Bound(x, 0, DX8Wrapper::Get_Device_Resolution_Width()); - y = Bound(y, 0, DX8Wrapper::Get_Device_Resolution_Height()); + x = Bound(x, 0, Get_Render_Backend()->Get_Device_Resolution_Width()); + y = Bound(y, 0, Get_Render_Backend()->Get_Device_Resolution_Height()); // now that the coordinates are clipped convert them to their normalized values. - fx = (float)x / DX8Wrapper::Get_Device_Resolution_Width(); - fy = (float)y / DX8Wrapper::Get_Device_Resolution_Height(); + fx = (float)x / Get_Render_Backend()->Get_Device_Resolution_Width(); + fy = (float)y / Get_Render_Backend()->Get_Device_Resolution_Height(); } @@ -2034,7 +2034,7 @@ void WW3D::Set_Texture_Bitdepth(int bitdepth) int WW3D::Get_Texture_Bitdepth() { - return DX8Wrapper::Get_Texture_Bitdepth(); + return Get_Render_Backend()->Get_Texture_Bitdepth(); } void WW3D::Set_MSAA_Mode(MultiSampleModeEnum mode) diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp index e2ca0168767..b8cd89722cb 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DVolumetricShadow.cpp @@ -43,6 +43,7 @@ #include "WW3D2/camera.h" #include "WW3D2/light.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/hlod.h" #include "WW3D2/mesh.h" #include "WW3D2/meshmdl.h" @@ -3850,7 +3851,7 @@ void W3DVolumetricShadowManager::reset() // ============================================================================ W3DVolumetricShadow* W3DVolumetricShadowManager::addShadow(RenderObjClass *robj, Shadow::ShadowTypeInfo *shadowInfo, Drawable *draw) { - if (!DX8Wrapper::Has_Stencil() || !robj || !TheGlobalData->m_useShadowVolumes) + if (!WW3D::Get_Render_Backend()->Has_Stencil() || !robj || !TheGlobalData->m_useShadowVolumes) return nullptr; //right now we require a stencil buffer W3DShadowGeometry *sg=nullptr; diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp index f41488fad77..f21b80938a0 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp @@ -859,7 +859,7 @@ void RTS3DScene::Flush(RenderInfoClass & rinfo) #ifdef USE_NON_STENCIL_OCCLUSION flushOccludedObjects(rinfo); #else - if (DX8Wrapper::Has_Stencil()) + if (WW3D::Get_Render_Backend()->Has_Stencil()) flushOccludedObjectsIntoStencil(rinfo); #endif @@ -975,7 +975,7 @@ void RTS3DScene::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_Fog(FogEnabled, FogColor, FogStart, FogEnd); //Override the behind building selection if it's not available on current hardware (needs stencil). - TheWritableGlobalData->m_enableBehindBuildingMarkers = TheWritableGlobalData->m_enableBehindBuildingMarkers && DX8Wrapper::Has_Stencil(); + TheWritableGlobalData->m_enableBehindBuildingMarkers = TheWritableGlobalData->m_enableBehindBuildingMarkers && WW3D::Get_Render_Backend()->Has_Stencil(); if (Get_Extra_Pass_Polygon_Mode() == EXTRA_PASS_DISABLE) { @@ -1575,7 +1575,7 @@ void RTS3DScene::flushOccludedObjects(RenderInfoClass & rinfo) { const Int localPlayerIndex = rts::getObservedOrLocalPlayerIndex_Safe(); - if (DX8Wrapper::Has_Stencil()) //just in case we have shadows, disable them over occluded pixels. + if (WW3D::Get_Render_Backend()->Has_Stencil()) //just in case we have shadows, disable them over occluded pixels. { //Set all stencil pixels of potentially occluded objects to 128. DX8Wrapper::Set_DX8_Render_State(D3DRS_STENCILENABLE, TRUE ); @@ -1614,7 +1614,7 @@ void RTS3DScene::flushOccludedObjects(RenderInfoClass & rinfo) //Now draw the normal models so they cover up the colored models on any pixels that //Normal models will clear stencil value from 128 back to 0 where the object pixels are //not occluded but will leave 128 in stencil where still occluded. - if (DX8Wrapper::Has_Stencil()) + if (WW3D::Get_Render_Backend()->Has_Stencil()) DX8Wrapper::Set_DX8_Render_State(D3DRS_STENCILREF, 0 ); for (i=0; i Date: Sun, 4 Oct 2026 07:52:04 -0400 Subject: [PATCH 3/4] refactor(ww3d2): Route transforms via IRenderBackend --- .../W3DDevice/GameClient/BaseHeightMap.cpp | 6 +-- .../W3DDevice/GameClient/FlatHeightMap.cpp | 2 +- .../Source/W3DDevice/GameClient/HeightMap.cpp | 4 +- .../W3DDevice/GameClient/W3DDebugIcons.cpp | 3 +- .../Source/W3DDevice/GameClient/W3DSmudge.cpp | 5 ++- .../Source/W3DDevice/GameClient/W3DSnow.cpp | 5 ++- .../W3DDevice/GameClient/W3DTerrainTracks.cpp | 3 +- .../W3DDevice/GameClient/W3DTreeBuffer.cpp | 3 +- .../W3DDevice/GameClient/Water/W3DWater.cpp | 14 +++--- .../GameClient/Water/W3DWaterTracks.cpp | 3 +- .../WWVegas/WW3D2/Backend/DX8Backend.cpp | 45 +++++++++++++++++++ .../Source/WWVegas/WW3D2/Backend/DX8Backend.h | 7 +++ .../Source/WWVegas/WW3D2/IRenderBackend.h | 16 +++++++ .../Source/WWVegas/WW3D2/dx8renderer.cpp | 5 ++- .../Source/WWVegas/WW3D2/dynamesh.cpp | 3 +- .../Libraries/Source/WWVegas/WW3D2/line3d.cpp | 3 +- .../Source/WWVegas/WW3D2/pointgr.cpp | 19 ++++---- .../Source/WWVegas/WW3D2/ringobj.cpp | 5 ++- .../Source/WWVegas/WW3D2/seglinerenderer.cpp | 9 ++-- .../Source/WWVegas/WW3D2/sortingrenderer.cpp | 9 ++-- .../Source/WWVegas/WW3D2/sphereobj.cpp | 11 ++--- .../Source/WWVegas/WW3D2/streakRender.cpp | 9 ++-- .../GameClient/Shadow/W3DProjectedShadow.cpp | 3 +- .../W3DDevice/GameClient/W3DInGameUI.cpp | 3 +- .../W3DDevice/GameClient/W3DStatusCircle.cpp | 5 ++- .../Source/WWVegas/WW3D2/boxrobj.cpp | 5 ++- .../Libraries/Source/WWVegas/WW3D2/camera.cpp | 5 +-- .../Libraries/Source/WWVegas/WW3D2/dazzle.cpp | 23 +++++----- .../Source/WWVegas/WW3D2/decalmsh.cpp | 5 ++- .../Source/WWVegas/WW3D2/linegrp.cpp | 9 ++-- .../Libraries/Source/WWVegas/WW3D2/mapper.cpp | 7 +-- .../Libraries/Source/WWVegas/WW3D2/mesh.cpp | 7 +-- .../Source/WWVegas/WW3D2/render2d.cpp | 14 +++--- .../Tools/WorldBuilder/src/DrawObject.cpp | 12 ++--- 34 files changed, 190 insertions(+), 97 deletions(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp index b8f3e52ea8c..8136dbb6d0e 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/BaseHeightMap.cpp @@ -2319,7 +2319,7 @@ void BaseHeightMapRenderObjClass::renderShoreLines(CameraClass *pCamera) DX8Wrapper::Set_Material(vmat); REF_PTR_RELEASE(vmat); DX8Wrapper::Set_Texture(0,m_destAlphaTexture); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Matrix3D(true)); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Matrix3D(true)); //Enabled writes to destination alpha only DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_ALPHA); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_TEXCOORDINDEX, 0); @@ -2505,7 +2505,7 @@ void BaseHeightMapRenderObjClass::renderShoreLinesSorted(CameraClass *pCamera) DX8Wrapper::Set_Material(vmat); REF_PTR_RELEASE(vmat); DX8Wrapper::Set_Texture(0,m_destAlphaTexture); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Matrix3D(true)); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Matrix3D(true)); //Enabled writes to destination alpha only DX8Wrapper::Set_DX8_Render_State(D3DRS_COLORWRITEENABLE,D3DCOLORWRITEENABLE_ALPHA); DX8Wrapper::Set_DX8_Texture_Stage_State(0, D3DTSS_TEXCOORDINDEX, 0); @@ -2809,7 +2809,7 @@ void BaseHeightMapRenderObjClass::renderTrees(CameraClass * camera) if (m_map==nullptr) return; if (Scene==nullptr) return; if (m_treeBuffer) { - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); DX8Wrapper::Set_Material(m_vertexMaterialClass); RTS3DScene *pMyScene = (RTS3DScene *)Scene; RefRenderObjListIterator pDynamicLightsIterator(pMyScene->getDynamicLights()); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp index 4c6ac103cec..f33bb6e4da0 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp @@ -494,7 +494,7 @@ void FlatHeightMapRenderObjClass::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_Texture(1,nullptr); ShaderClass::Invalidate(); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); DX8Wrapper::Set_Material(m_vertexMaterialClass); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp index cff9c53c5cd..274aa838929 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp @@ -1932,7 +1932,7 @@ void HeightMapRenderObjClass::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_Texture(1,nullptr); ShaderClass::Invalidate(); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); //Apply the shader and material @@ -2150,7 +2150,7 @@ void HeightMapRenderObjClass::Render(RenderInfoClass & rinfo) ///Performs additional terrain rendering pass, blending in the black shroud texture. void HeightMapRenderObjClass::renderTerrainPass(CameraClass *pCamera) { - DX8Wrapper::Set_Transform(D3DTS_WORLD,Matrix3D(true)); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Matrix3D(true)); //Apply the shader and material diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDebugIcons.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDebugIcons.cpp index 5842874f376..9d3ac1a059a 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDebugIcons.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DDebugIcons.cpp @@ -52,6 +52,7 @@ #include "GameLogic/GameLogic.h" #include "Common/MapObject.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #if defined(RTS_DEBUG) @@ -221,7 +222,7 @@ void W3DDebugIcons::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_Texture(0, nullptr); DX8Wrapper::Apply_Render_State_Changes(); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); Int numRect = m_numDebugIcons; static Real offset = 30; diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSmudge.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSmudge.cpp index 37fc8609328..37490f9e920 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSmudge.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSmudge.cpp @@ -37,6 +37,7 @@ #include "WW3D2/texture.h" #include "WW3D2/dx8indexbuffer.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/rinfo.h" #include "WW3D2/camera.h" #include "WW3D2/sortingrenderer.h" @@ -446,8 +447,8 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo) REF_PTR_RELEASE(backBuffer); Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); DX8Wrapper::Set_Index_Buffer(m_indexBuffer,0); //DX8Wrapper::Set_Shader(ShaderClass::_PresetOpaqueSpriteShader); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSnow.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSnow.cpp index a2d46136211..bab48f73afb 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSnow.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DSnow.cpp @@ -22,6 +22,7 @@ #include "W3DDevice/GameClient/HeightMap.h" #include "GameClient/View.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/rinfo.h" #include "WW3D2/camera.h" #include "WW3D2/assetmgr.h" @@ -397,7 +398,7 @@ void W3DSnowManager::render(RenderInfoClass &rinfo) m_heightTraveled=m_time*m_velocity+cameraOffset; //height that snow flake traveled this frame. Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); DX8Wrapper::Set_Shader(ShaderClass::_PresetAlphaShader); @@ -488,7 +489,7 @@ void W3DSnowManager::renderAsQuads(RenderInfoClass &rinfo, Int cubeOriginX, Int } Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); DX8Wrapper::Set_Index_Buffer(m_indexBuffer,0); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp index b43c690cc82..d78f5d8f245 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTerrainTracks.cpp @@ -55,6 +55,7 @@ #include "WW3D2/camera.h" #include "WW3D2/assetmgr.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/scene.h" #include "GameLogic/TerrainLogic.h" #include "GameLogic/Object.h" @@ -906,7 +907,7 @@ Try improving the fit to vertical surfaces like cliffs. trackStartIndex=0; mod=m_usedModules; - DX8Wrapper::Set_Transform(D3DTS_WORLD,mod->Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_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 95a80e521e9..5156067a434 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/W3DTreeBuffer.cpp @@ -83,6 +83,7 @@ enum #include "W3DDevice/GameClient/W3DProjectedShadow.h" #include "WW3D2/camera.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/dx8renderer.h" #include "WW3D2/matinfo.h" #include "WW3D2/mesh.h" @@ -1628,7 +1629,7 @@ void W3DTreeBuffer::drawTrees(CameraClass * camera, RefRenderObjListIterator *pD DX8Wrapper::Set_Vertex_Buffer(vb_access); Matrix3D tm(1); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Draw_Triangles( 0,2, 0, 4); //draw a quad, 2 triangles, 4 verts #endif diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index cfbf09f880f..5012b17f2c4 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -1818,7 +1818,7 @@ void WaterRenderObjClass::drawSea(RenderInfoClass & rinfo) matWW3D._23=1.0f; matWW3D._44=1.0f; - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); //position the water surface + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); //position the water surface DX8Wrapper::Set_Texture(0,nullptr); //we'll be setting our own textures, so reset W3D DX8Wrapper::Set_Texture(1,nullptr); //we'll be setting our own textures, so reset W3D @@ -2138,7 +2138,7 @@ void WaterRenderObjClass::renderSky() Matrix3D tm(1); tm.Set_Translation(Vector3(0,0,0)); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Draw_Triangles( 0,2, 0, 4); //draw a quad, 2 triangles, 4 verts } @@ -2180,7 +2180,7 @@ void WaterRenderObjClass::renderSkyBody(Matrix3D *mat) tm.Adjust_Translation(Vector3(SKYBODY_X,SKYBODY_Y,SKYBODY_HEIGHT)); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset(VertexMaterialClass::PRELIT_DIFFUSE); @@ -2389,7 +2389,7 @@ void WaterRenderObjClass::renderWaterMesh() m_vertexBufferD3D->Unlock(); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); //position the water surface + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); //position the water surface DX8Wrapper::Set_Material(m_meshVertexMaterialClass); ShaderClass::CullModeType oldCullMode=m_shaderClass.Get_Cull_Mode(); @@ -2913,7 +2913,7 @@ void WaterRenderObjClass::drawRiverWater(PolygonTrigger *pTrig) Matrix3D tm(1); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); //position the water surface + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); //position the water surface DX8Wrapper::Set_Index_Buffer(ib_access,0); DX8Wrapper::Set_Vertex_Buffer(vb_access); DX8Wrapper::Set_Texture(0,m_riverTexture); //set to blue @@ -3277,7 +3277,7 @@ void WaterRenderObjClass::drawTrapezoidWater(Vector3 points[4]) Matrix3D tm(1); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); //position the water surface + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); //position the water surface DX8Wrapper::Set_Index_Buffer(ib_access,0); DX8Wrapper::Set_Vertex_Buffer(vb_access); @@ -3442,7 +3442,7 @@ void WaterRenderObjClass::renderSkyBody(Matrix3D *mat) Matrix3D tm(1); //set position of skybody in world // tm.Set_Translation(Vector3(40,0,0)); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Draw_Triangles( 0,2, 0, 4); //draw a quad, 2 triangles, 4 verts } diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWaterTracks.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWaterTracks.cpp index 9e34695c46a..fb9273c7e45 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWaterTracks.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWaterTracks.cpp @@ -62,6 +62,7 @@ #include "WW3D2/camera.h" #include "WW3D2/assetmgr.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" //number of vertex pages allocated - allows double buffering of vertex updates. //while one is being rendered, another is being updated. Improves HW parallelism. @@ -898,7 +899,7 @@ Try improving the fit to vertical surfaces like cliffs. diffuseLight=REAL_TO_INT(shadeB) | (REAL_TO_INT(shadeG) << 8) | (REAL_TO_INT(shadeR) << 16); Matrix3D tm(1); ///set to identity - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); //position the water surface + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); //position the water surface DX8Wrapper::Set_Material(m_vertexMaterialClass); DX8Wrapper::Set_Shader(m_shaderClass); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp index 50f3b06689b..d2688ffe21e 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp @@ -35,6 +35,21 @@ IRenderBackend *Create_Render_Backend(void * window, bool lite) return DX8Backend::Create(window, lite); } +static D3DTRANSFORMSTATETYPE To_D3D_Transform(RenderBackendTransform transform) +{ + switch (transform) + { + case RB_TRANSFORM_WORLD: + return D3DTS_WORLD; + case RB_TRANSFORM_VIEW: + return D3DTS_VIEW; + case RB_TRANSFORM_PROJECTION: + return D3DTS_PROJECTION; + } + WWASSERT(0); + return D3DTS_WORLD; +} + DX8Backend::DX8Backend(bool lite) : Lite(lite) { } @@ -163,6 +178,36 @@ void DX8Backend::Invalidate_Cached_Render_States() DX8Wrapper::Invalidate_Cached_Render_States(); } +void DX8Backend::Set_Transform(RenderBackendTransform transform, const Matrix4x4 & m) +{ + DX8Wrapper::Set_Transform(To_D3D_Transform(transform), m); +} + +void DX8Backend::Set_Transform(RenderBackendTransform transform, const Matrix3D & m) +{ + DX8Wrapper::Set_Transform(To_D3D_Transform(transform), m); +} + +void DX8Backend::Get_Transform(RenderBackendTransform transform, Matrix4x4 & m) const +{ + DX8Wrapper::Get_Transform(To_D3D_Transform(transform), m); +} + +void DX8Backend::Set_World_Identity() +{ + DX8Wrapper::Set_World_Identity(); +} + +void DX8Backend::Set_View_Identity() +{ + DX8Wrapper::Set_View_Identity(); +} + +void DX8Backend::Set_Projection_Transform_With_Z_Bias(const Matrix4x4 & matrix, float znear, float zfar) +{ + DX8Wrapper::Set_Projection_Transform_With_Z_Bias(matrix, znear, zfar); +} + void DX8Backend::Set_Ambient(const Vector3 & color) { DX8Wrapper::Set_Ambient(color); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h index 6eab3aa1a67..67af262d77c 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h @@ -55,6 +55,13 @@ class DX8Backend : public IRenderBackend virtual void Set_Viewport(const RenderBackendViewport & viewport) override; virtual void Invalidate_Cached_Render_States() override; + virtual void Set_Transform(RenderBackendTransform transform, const Matrix4x4 & m) override; + virtual void Set_Transform(RenderBackendTransform transform, const Matrix3D & m) override; + virtual void Get_Transform(RenderBackendTransform transform, Matrix4x4 & m) const override; + virtual void Set_World_Identity() override; + virtual void Set_View_Identity() override; + virtual void Set_Projection_Transform_With_Z_Bias(const Matrix4x4 & matrix, float znear, float zfar) override; + virtual void Set_Ambient(const Vector3 & color) override; virtual void Set_Light_Environment(LightEnvironmentClass * light_env) override; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h index 3989829e8f8..2071af762a7 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h @@ -28,6 +28,8 @@ // WW3D2 header graph. All W3D classes below are passed by pointer or reference. class LightEnvironmentClass; +class Matrix3D; +class Matrix4x4; class Vector3; struct RenderBackendViewport @@ -40,6 +42,13 @@ struct RenderBackendViewport float max_z; }; +enum RenderBackendTransform +{ + RB_TRANSFORM_WORLD, + RB_TRANSFORM_VIEW, + RB_TRANSFORM_PROJECTION +}; + // The interface holds only the methods that callers route through. The rest of // the DX8Wrapper API is called directly. @@ -72,6 +81,13 @@ class IRenderBackend virtual void Set_Viewport(const RenderBackendViewport & viewport) = 0; virtual void Invalidate_Cached_Render_States() = 0; + virtual void Set_Transform(RenderBackendTransform transform, const Matrix4x4 & m) = 0; + virtual void Set_Transform(RenderBackendTransform transform, const Matrix3D & m) = 0; + virtual void Get_Transform(RenderBackendTransform transform, Matrix4x4 & m) const = 0; + virtual void Set_World_Identity() = 0; + virtual void Set_View_Identity() = 0; + virtual void Set_Projection_Transform_With_Z_Bias(const Matrix4x4 & matrix, float znear, float zfar) = 0; + virtual void Set_Ambient(const Vector3 & color) = 0; virtual void Set_Light_Environment(LightEnvironmentClass * light_env) = 0; }; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp b/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp index 579a467f6c2..1931bddc07a 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp @@ -42,6 +42,7 @@ #include "dx8renderer.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8polygonrenderer.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" @@ -1860,11 +1861,11 @@ void DX8TextureCategoryClass::Render() if (identity) { SNAPSHOT_SAY(("Set_World_Identity")); - DX8Wrapper::Set_World_Identity(); + WW3D::Get_Render_Backend()->Set_World_Identity(); } else { SNAPSHOT_SAY(("Set_World_Transform")); - DX8Wrapper::Set_Transform(D3DTS_WORLD,*world_transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,*world_transform); } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/dynamesh.cpp b/Core/Libraries/Source/WWVegas/WW3D2/dynamesh.cpp index 3a93a8cfa56..445db431598 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/dynamesh.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/dynamesh.cpp @@ -38,6 +38,7 @@ #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "sortingrenderer.h" #include "rinfo.h" #include "camera.h" @@ -432,7 +433,7 @@ void DynamicMeshClass::Render(RenderInfoClass & rinfo) const FrustumClass & frustum = rinfo.Camera.Get_Frustum(); if (CollisionMath::Overlap_Test(frustum, Get_Bounding_Box()) != CollisionMath::OUTSIDE) { - DX8Wrapper::Set_Transform(D3DTS_WORLD, Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD, Transform); Model->Render(rinfo); } } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/line3d.cpp b/Core/Libraries/Source/WWVegas/WW3D2/line3d.cpp index b2baa3f81aa..0a26ac64227 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/line3d.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/line3d.cpp @@ -54,6 +54,7 @@ #include "ww3d.h" #include "rinfo.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "dx8fvf.h" @@ -273,7 +274,7 @@ void Line3DClass::Render(RenderInfoClass & rinfo) DX8Wrapper::Set_Material(vm); REF_PTR_RELEASE(vm); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); DynamicVBAccessClass vb(BUFFER_TYPE_DYNAMIC_DX8,dynamic_fvf_type,8); { diff --git a/Core/Libraries/Source/WWVegas/WW3D2/pointgr.cpp b/Core/Libraries/Source/WWVegas/WW3D2/pointgr.cpp index 58b9dfaf712..71852591e63 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/pointgr.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/pointgr.cpp @@ -81,6 +81,7 @@ #include "WWMath/vp.h" #include "WWMath/matrix4.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "rinfo.h" @@ -880,7 +881,7 @@ void PointGroupClass::Render(RenderInfoClass &rinfo) // Get the world and view matrices Matrix4x4 view; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); // Transform the point locations from worldspace to camera space if needed // (i.e. if they are not already in camera space): @@ -919,8 +920,8 @@ void PointGroupClass::Render(RenderInfoClass &rinfo) // so set world and view matrices to identity and render Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); DX8Wrapper::Set_Material(PointMaterial); DX8Wrapper::Set_Shader(Shader); @@ -996,7 +997,7 @@ void PointGroupClass::Render(RenderInfoClass &rinfo) } // restore the matrices - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); } @@ -1220,7 +1221,7 @@ void PointGroupClass::Update_Arrays( Matrix4x4 view; Vector4 result; if (!Billboard) { - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); } // Scale vertex offsets and add them to point locations to get vertex locations @@ -1710,7 +1711,7 @@ void PointGroupClass::RenderVolumeParticle(RenderInfoClass &rinfo, unsigned int // Get the world and view matrices Matrix4x4 view; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); @@ -1849,8 +1850,8 @@ void PointGroupClass::RenderVolumeParticle(RenderInfoClass &rinfo, unsigned int // so set world and view matrices to identity and render Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); DX8Wrapper::Set_Material(PointMaterial); DX8Wrapper::Set_Shader(Shader); @@ -1932,5 +1933,5 @@ void PointGroupClass::RenderVolumeParticle(RenderInfoClass &rinfo, unsigned int // restore the matrices - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/ringobj.cpp b/Core/Libraries/Source/WWVegas/WW3D2/ringobj.cpp index e82c97476ca..5c44f9654ed 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/ringobj.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/ringobj.cpp @@ -89,6 +89,7 @@ #include "statistics.h" #include "predlod.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8indexbuffer.h" #include "dx8vertexbuffer.h" #include "sortingrenderer.h" @@ -720,9 +721,9 @@ void RingRenderObjClass::Render(RenderInfoClass & rinfo) Matrix3D temp; temp.Look_At(obj_position, obj_position + camera_z_vector, 0.0f); - DX8Wrapper::Set_Transform(D3DTS_WORLD, temp); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD, temp); } else { - DX8Wrapper::Set_Transform(D3DTS_WORLD, Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD, Transform); } // diff --git a/Core/Libraries/Source/WWVegas/WW3D2/seglinerenderer.cpp b/Core/Libraries/Source/WWVegas/WW3D2/seglinerenderer.cpp index 14ea0a98d74..d66371d8a51 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/seglinerenderer.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/seglinerenderer.cpp @@ -41,6 +41,7 @@ #include "ww3d.h" #include "rinfo.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "sortingrenderer.h" #include "WWMath/vp.h" #include "WWMath/Vector3i.h" @@ -218,11 +219,11 @@ void SegLineRendererClass::Render ) { Matrix4x4 view; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); /* ** Handle texture UV offset animation (done once for entire line). @@ -1191,7 +1192,7 @@ void SegLineRendererClass::Render } - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp b/Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp index 4ae57efd214..fd30b5f0a6d 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/sortingrenderer.cpp @@ -42,6 +42,7 @@ #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "vertmaterial.h" #include "texture.h" #include "d3d8.h" @@ -603,8 +604,8 @@ void SortingRendererClass::Flush() WWPROFILE("SortingRenderer::Flush"); Matrix4x4 old_view; Matrix4x4 old_world; - DX8Wrapper::Get_Transform(D3DTS_VIEW,old_view); - DX8Wrapper::Get_Transform(D3DTS_WORLD,old_world); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,old_view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_WORLD,old_world); // TheSuperHackers @perf stephanmeesters 04/07/2026 // Splice nodes that have no bounding information (Z=0.0) at the correct location into the sorted list. @@ -644,8 +645,8 @@ void SortingRendererClass::Flush() DynamicVBAccessClass::_Reset(false); - DX8Wrapper::Set_Transform(D3DTS_VIEW,old_view); - DX8Wrapper::Set_Transform(D3DTS_WORLD,old_world); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,old_view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,old_world); } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/sphereobj.cpp b/Core/Libraries/Source/WWVegas/WW3D2/sphereobj.cpp index b4d3cde9dad..3a6a8d0e5d3 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/sphereobj.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/sphereobj.cpp @@ -86,6 +86,7 @@ #include "camera.h" #include "statistics.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "sortingrenderer.h" @@ -659,7 +660,7 @@ void SphereRenderObjClass::Render(RenderInfoClass & rinfo) // Camera Align if (Flags & USE_CAMERA_ALIGN) { Matrix4x4 view,ident(true); - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); Vector4 wpos(Transform[0][3],Transform[1][3],Transform[2][3],1); Vector4 cpos; @@ -670,12 +671,12 @@ void SphereRenderObjClass::Render(RenderInfoClass & rinfo) 1.0f, 0.0f, 0.0f, cpos.Z); tm.Scale(real_scale); - DX8Wrapper::Set_Transform(D3DTS_WORLD,ident); - DX8Wrapper::Set_Transform(D3DTS_VIEW,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,ident); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,tm); render_sphere(); - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); } else { - DX8Wrapper::Set_Transform(D3DTS_WORLD,temp); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,temp); render_sphere(); } } diff --git a/Core/Libraries/Source/WWVegas/WW3D2/streakRender.cpp b/Core/Libraries/Source/WWVegas/WW3D2/streakRender.cpp index 6fd2028dfb4..493b4cdc038 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/streakRender.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/streakRender.cpp @@ -29,6 +29,7 @@ #include "ww3d.h" #include "rinfo.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "sortingrenderer.h" #include "WWMath/vp.h" #include "WWMath/Vector3i.h" @@ -311,11 +312,11 @@ void StreakRendererClass::RenderStreak ) { Matrix4x4 view; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD,identity); - DX8Wrapper::Set_Transform(D3DTS_VIEW,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,identity); /* ** Handle texture UV offset animation (done once for entire line). @@ -1383,7 +1384,7 @@ void StreakRendererClass::RenderStreak } - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); } diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DProjectedShadow.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DProjectedShadow.cpp index e0ac3a3d310..a87d0968ee8 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DProjectedShadow.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/Shadow/W3DProjectedShadow.cpp @@ -37,6 +37,7 @@ #include "WW3D2/camera.h" #include "WW3D2/light.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/hlod.h" #include "WW3D2/mesh.h" #include "WW3D2/meshmdl.h" @@ -659,7 +660,7 @@ void TestBlendRender(RenderInfoClass & rinfo) DX8Wrapper::Set_Shader(ShaderClass::_PresetOpaqueShader); Matrix3D tm(1); //identity - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); //grass RenderVBTile(grass,580.0f,480.0f,0.0f,0.0f); RenderVBTile(grass,590.0f,480.0f,0.25f,0.0f); diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DInGameUI.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DInGameUI.cpp index cf193188048..2a38ef0d75a 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DInGameUI.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DInGameUI.cpp @@ -48,6 +48,7 @@ #include "W3DDevice/GameClient/W3DScene.h" #include "W3DDevice/Common/W3DConvert.h" #include "WW3D2/ww3d.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/hanim.h" #include "Common/UnitTimings.h" //Contains the DO_UNIT_TIMINGS define jba. @@ -249,7 +250,7 @@ void DebugHintObject::Render(RenderInfoClass & rinfo) Matrix3D tm = Transform; Vector3 vec(m_myLoc.x, m_myLoc.y, m_myLoc.z); tm.Set_Translation(vec); - DX8Wrapper::Set_Transform(D3DTS_WORLD, tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD, tm); DX8Wrapper::Draw_Triangles( 0, 1, 0, 3); } diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DStatusCircle.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DStatusCircle.cpp index 796279e802f..8fd1e2ce28d 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DStatusCircle.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DStatusCircle.cpp @@ -34,6 +34,7 @@ #include #include #include "WW3D2/dx8wrapper.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/shader.h" #include "Common/GlobalData.h" #include "Common/MapObject.h" @@ -329,7 +330,7 @@ void W3DStatusCircle::Render(RenderInfoClass & rinfo) tm.Set_Translation(vec); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Draw_Triangles( 0,NUM_TRI, 0, (m_numTriangles*3)); } @@ -350,7 +351,7 @@ void W3DStatusCircle::Render(RenderInfoClass & rinfo) Int clr = 255*intensity; Int diffuse = (0xff<<24)|(clr<<16)|(clr<<8)|clr; // b g<<8 r<<16 a<<24. updateScreenVB(diffuse); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Set_Shader(ShaderClass(SC_ADD)); DX8Wrapper::Set_Vertex_Buffer(m_vertexBufferScreen); DX8Wrapper::Apply_Render_State_Changes(); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/boxrobj.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/boxrobj.cpp index 1256e5d41eb..be803ee827a 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/boxrobj.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/boxrobj.cpp @@ -98,6 +98,7 @@ #include "coltest.h" #include "inttest.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8indexbuffer.h" #include "dx8vertexbuffer.h" #include "dx8fvf.h" @@ -701,7 +702,7 @@ void AABoxRenderObjClass::Render(RenderInfoClass & rinfo) { Matrix3D temp(1); temp.Translate(Transform.Get_Translation()); - DX8Wrapper::Set_Transform(D3DTS_WORLD,temp); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,temp); render_box(rinfo,ObjSpaceCenter,ObjSpaceExtent); } @@ -1085,7 +1086,7 @@ int OBBoxRenderObjClass::Class_ID() const *=============================================================================================*/ void OBBoxRenderObjClass::Render(RenderInfoClass & rinfo) { - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); render_box(rinfo,ObjSpaceCenter,ObjSpaceExtent); } diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp index 9dac26bff5d..e4634fec905 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/camera.cpp @@ -75,7 +75,6 @@ #include "ww3d.h" #include "IRenderBackend.h" #include "WWMath/matrix4.h" -#include "dx8wrapper.h" /*********************************************************************************************** @@ -750,8 +749,8 @@ void CameraClass::Apply() Matrix4x4 d3dprojection; Get_D3D_Projection_Matrix(&d3dprojection); - DX8Wrapper::Set_Projection_Transform_With_Z_Bias(d3dprojection,ZNear,ZFar); - DX8Wrapper::Set_Transform(D3DTS_VIEW,CameraInvTransform); + WW3D::Get_Render_Backend()->Set_Projection_Transform_With_Z_Bias(d3dprojection,ZNear,ZFar); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,CameraInvTransform); } void CameraClass::Set_Clip_Planes(float znear,float zfar) diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dazzle.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dazzle.cpp index cfe2e251433..ba2dda313e2 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dazzle.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dazzle.cpp @@ -58,6 +58,7 @@ #include "WWSaveLoad/persistfactory.h" #include "ww3dids.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "sortingrenderer.h" @@ -944,8 +945,8 @@ void DazzleRenderObjClass::Render(RenderInfoClass & rinfo) // visibility = _VisibilityHandler->Compute_Dazzle_Visibility(rinfo,this,position); Matrix4x4 view_transform,projection_transform; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view_transform); - DX8Wrapper::Get_Transform(D3DTS_PROJECTION,projection_transform); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view_transform); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_PROJECTION,projection_transform); Vector3 camera_loc(rinfo.Camera.Get_Position()); Vector3 camera_dir(-view_transform[2][0],-view_transform[2][1],-view_transform[2][2]); // const Matrix3D& cam = rinfo.Camera.Get_Transform(); @@ -1021,9 +1022,9 @@ void DazzleRenderObjClass::Render_Dazzle(CameraClass* camera) Matrix4x4 view_transform; Matrix4x4 world_transform; Matrix4x4 projection_transform; - DX8Wrapper::Get_Transform(D3DTS_VIEW,view_transform); - DX8Wrapper::Get_Transform(D3DTS_WORLD,world_transform); - DX8Wrapper::Get_Transform(D3DTS_PROJECTION,projection_transform); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view_transform); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_WORLD,world_transform); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_PROJECTION,projection_transform); old_view_transform=view_transform; old_world_transform=world_transform; old_projection_transform=projection_transform; @@ -1219,9 +1220,9 @@ void DazzleRenderObjClass::Render_Dazzle(CameraClass* camera) } } - DX8Wrapper::Set_World_Identity(); - DX8Wrapper::Set_View_Identity(); - DX8Wrapper::Set_Transform(D3DTS_PROJECTION,Matrix4x4(true)); + WW3D::Get_Render_Backend()->Set_World_Identity(); + WW3D::Get_Render_Backend()->Set_View_Identity(); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_PROJECTION,Matrix4x4(true)); if (halo_poly_count) { DX8Wrapper::Set_Index_Buffer(ib_access,dazzle_vertex_count); @@ -1244,9 +1245,9 @@ void DazzleRenderObjClass::Render_Dazzle(CameraClass* camera) DX8Wrapper::Draw_Triangles(0,lensflare_poly_count,0,vertex_count); } - DX8Wrapper::Set_Transform(D3DTS_PROJECTION,old_projection_transform); - DX8Wrapper::Set_Transform(D3DTS_VIEW,old_view_transform); - DX8Wrapper::Set_Transform(D3DTS_WORLD,old_world_transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_PROJECTION,old_projection_transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,old_view_transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,old_world_transform); } // ---------------------------------------------------------------------------- diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/decalmsh.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/decalmsh.cpp index 99453e40d98..c452af2a7cd 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/decalmsh.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/decalmsh.cpp @@ -63,6 +63,7 @@ #include "WWLib/simplevec.h" #include "texture.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "dx8caps.h" #define DISABLE_CLIPPING 0 @@ -298,7 +299,7 @@ void RigidDecalMeshClass::Render() ** transform between the time that the mesh is rendered and the time that the decal ** mesh is rendered... It shouldn't happen though. */ - DX8Wrapper::Set_Transform(D3DTS_WORLD,Parent->Get_Transform()); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Parent->Get_Transform()); /* ** Copy the vertices into the dynamic vb @@ -788,7 +789,7 @@ void SkinDecalMeshClass::Render() /* ** Skin decals coordinates are in world space */ - DX8Wrapper::Set_Transform(D3DTS_WORLD,Matrix3D::Identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Matrix3D::Identity); /* ** Skin decals have to get the deformed vertices of their parent meshes. For this diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/linegrp.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/linegrp.cpp index 797b36fbcb9..aeac2af767e 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/linegrp.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/linegrp.cpp @@ -42,6 +42,7 @@ #include "texture.h" #include "vertmaterial.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "WWMath/wwmath.h" #include "rinfo.h" #include "camera.h" @@ -281,10 +282,10 @@ void LineGroupClass::Render(RenderInfoClass &rinfo) // Save off the view matrix Matrix4x4 view; - DX8Wrapper::Get_Transform(D3DTS_VIEW, view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW, view); Matrix4x4 identity(true); - DX8Wrapper::Set_Transform(D3DTS_WORLD, identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD, identity); // if the points are in world space, transform the offsets if (Get_Flag(TRANSFORM)) { @@ -296,7 +297,7 @@ void LineGroupClass::Render(RenderInfoClass &rinfo) Matrix3D::Transform_Vector(xform_mat, offset[i], &offset[i]); } } else { - DX8Wrapper::Set_Transform(D3DTS_VIEW, identity); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW, identity); } int num_tris=0; @@ -475,7 +476,7 @@ void LineGroupClass::Render(RenderInfoClass &rinfo) } // restore the matrices - DX8Wrapper::Set_Transform(D3DTS_VIEW, view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW, view); } int LineGroupClass::Get_Polygon_Count() diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mapper.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mapper.cpp index 21d44498110..8e92be1e162 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mapper.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mapper.cpp @@ -42,6 +42,7 @@ #include "w3derr.h" #include "meshmatdesc.h" #include "dx8wrapper.h" +#include "IRenderBackend.h" #include "WWDebug/wwdebug.h" #include "matinfo.h" #include "rendobj.h" @@ -794,7 +795,7 @@ void WSEnvMapperClass::Calculate_Texture_Matrix(Matrix4x4 &tex_matrix) } // multiply by inverse of view transform Matrix4x4 mat; - DX8Wrapper::Get_Transform(D3DTS_VIEW,mat); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,mat); Matrix4x4 mat2( mat[0].X, mat[1].X, mat[2].X, 0.0f, mat[0].Y, mat[1].Y, mat[2].Y, 0.0f, mat[0].Z, mat[1].Z, mat[2].Z, 0.0f, @@ -927,7 +928,7 @@ void ScreenMapperClass::Calculate_Texture_Matrix(Matrix4x4 &tex_matrix) // multiply by projection matrix // followed by scale and translation - DX8Wrapper::Get_Transform(D3DTS_PROJECTION, tex_matrix); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_PROJECTION, tex_matrix); tex_matrix[0] *= Scale.X; // entire row since we're pre-multiplying tex_matrix[1] *= Scale.Y; Vector4 last(tex_matrix[3]); // this gets the w @@ -1154,7 +1155,7 @@ void GridWSEnvMapperClass::Calculate_Texture_Matrix(Matrix4x4 &tex_matrix) { // multiply by inverse of view transform Matrix4x4 mat; - DX8Wrapper::Get_Transform(D3DTS_VIEW,mat); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,mat); Matrix4x4 mv ( mat[0].X, mat[1].X, mat[2].X, 0.0f, mat[0].Y, mat[1].Y, mat[2].Y, 0.0f, mat[0].Z, mat[1].Z, mat[2].Z, 0.0f, diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp index 11ffb49fe0d..17eacec14d2 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp @@ -105,6 +105,7 @@ #include "meshmdl.h" #include "meshgeometry.h" #include "ww3d.h" +#include "IRenderBackend.h" #include "camera.h" #include "texture.h" #include "rinfo.h" @@ -855,7 +856,7 @@ void MeshClass::Render_Material_Pass(MaterialPassClass * pass,IndexBufferClass * DX8Wrapper::Set_Index_Buffer(ib,0); SNAPSHOT_SAY(("Set_World_Identity")); - DX8Wrapper::Set_World_Identity(); + WW3D::Get_Render_Backend()->Set_World_Identity(); DX8PolygonRendererListIterator it(&Model->PolygonRendererList); while (!it.Is_Done()) { @@ -947,7 +948,7 @@ void MeshClass::Render_Material_Pass(MaterialPassClass * pass,IndexBufferClass * int vertex_offset = Model->PolygonRendererList.Peek_Head()->Get_Vertex_Offset(); pass->Install_Materials(); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Get_Transform()); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Get_Transform()); DX8Wrapper::Set_Index_Buffer(dynamic_ib,vertex_offset); DX8Wrapper::Draw_Triangles( @@ -983,7 +984,7 @@ void MeshClass::Render_Material_Pass(MaterialPassClass * pass,IndexBufferClass * DX8Wrapper::Set_Index_Buffer(ib,0); SNAPSHOT_SAY(("Set_World_Transform")); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); DX8PolygonRendererListIterator it(&Model->PolygonRendererList); while (!it.Is_Done()) { diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp index 0a9e1ccead7..965731c9103 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp @@ -609,8 +609,8 @@ void Render2DClass::Render() Matrix4x4 view,proj; Matrix4x4 identity(true); - DX8Wrapper::Get_Transform(D3DTS_VIEW,view); - DX8Wrapper::Get_Transform(D3DTS_PROJECTION,proj); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_VIEW,view); + WW3D::Get_Render_Backend()->Get_Transform(RB_TRANSFORM_PROJECTION,proj); // // Configure the viewport for entire screen @@ -632,9 +632,9 @@ void Render2DClass::Render() DX8Wrapper::Set_Material(vm); REF_PTR_RELEASE(vm); - DX8Wrapper::Set_World_Identity(); - DX8Wrapper::Set_View_Identity(); - DX8Wrapper::Set_Transform(D3DTS_PROJECTION,identity); + WW3D::Get_Render_Backend()->Set_World_Identity(); + WW3D::Get_Render_Backend()->Set_View_Identity(); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_PROJECTION,identity); DynamicVBAccessClass vb(BUFFER_TYPE_DYNAMIC_DX8,dynamic_fvf_type,Vertices.Count()); { @@ -698,8 +698,8 @@ void Render2DClass::Render() DX8Wrapper::Set_Shader(Shader); DX8Wrapper::Draw_Triangles(0,Indices.Count()/3,0,Vertices.Count()); - DX8Wrapper::Set_Transform(D3DTS_VIEW,view); - DX8Wrapper::Set_Transform(D3DTS_PROJECTION,proj); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_VIEW,view); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_PROJECTION,proj); if (IsGrayScale) ShaderClass::Invalidate(); //force both stages to be reset. diff --git a/GeneralsMD/Code/Tools/WorldBuilder/src/DrawObject.cpp b/GeneralsMD/Code/Tools/WorldBuilder/src/DrawObject.cpp index f2fe2bc5621..331f727d98c 100644 --- a/GeneralsMD/Code/Tools/WorldBuilder/src/DrawObject.cpp +++ b/GeneralsMD/Code/Tools/WorldBuilder/src/DrawObject.cpp @@ -35,6 +35,8 @@ #include "W3DDevice/GameClient/W3DAssetManager.h" #include "W3DDevice/GameClient/W3DWater.h" #include "WW3D2/dx8wrapper.h" +#include "WW3D2/ww3d.h" +#include "WW3D2/IRenderBackend.h" #include "WW3D2/mesh.h" #include "WW3D2/meshmdl.h" #include "WW3D2/shader.h" @@ -2213,7 +2215,7 @@ if (pMapObj->isSelected()) { polyCount -= NUM_ARROW_TRI+NUM_SELECT_TRI; } - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); if (isTree) { DX8Wrapper::Draw_Triangles( NUM_TRI*3,polyCount, 0, (m_numTriangles*3)); } else { @@ -2271,10 +2273,10 @@ if (pMapObj->isSelected()) { } DX8Wrapper::Set_Index_Buffer(m_indexBuffer,0); - DX8Wrapper::Set_Transform(D3DTS_WORLD,tm); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tm); DX8Wrapper::Draw_Triangles( 0,polyCount, 0, (m_numTriangles*3)); } - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); DX8Wrapper::Set_Vertex_Buffer(m_vertexBufferTile1); updatePolygonVB(pTrig, polySelected, polySelected && PolygonTool::isSelectedOpen()); DX8Wrapper::Set_Vertex_Buffer(m_vertexFeedback); @@ -2323,7 +2325,7 @@ if (pMapObj->isSelected()) { } #if 1 - DX8Wrapper::Set_Transform(D3DTS_WORLD,tmXX); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,tmXX); DX8Wrapper::Draw_Triangles( 0,polyCountA, 0, (m_numTriangles*3)); #endif @@ -2332,7 +2334,7 @@ if (pMapObj->isSelected()) { DX8Wrapper::Set_Index_Buffer(m_indexBuffer,0); DX8Wrapper::Set_Vertex_Buffer(m_vertexBufferWater); - DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); + WW3D::Get_Render_Backend()->Set_Transform(RB_TRANSFORM_WORLD,Transform); if (m_drawWaypoints) { updateWaypointVB(); From 94b423855b5e8d4f0da11a73ed1b44cd0600c710 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sun, 4 Oct 2026 07:54:01 -0400 Subject: [PATCH 4/4] refactor(ww3d2): Route lights and fog via IRenderBackend --- .../Source/W3DDevice/GameClient/FlatHeightMap.cpp | 2 +- .../Source/W3DDevice/GameClient/HeightMap.cpp | 2 +- .../W3DDevice/GameClient/Water/W3DWater.cpp | 8 ++++---- .../Source/WWVegas/WW3D2/Backend/DX8Backend.cpp | 15 +++++++++++++++ .../Source/WWVegas/WW3D2/Backend/DX8Backend.h | 3 +++ .../Source/WWVegas/WW3D2/IRenderBackend.h | 4 ++++ .../Source/WWVegas/WW3D2/dx8renderer.cpp | 2 +- .../Source/W3DDevice/GameClient/W3DScene.cpp | 2 +- .../Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp | 2 +- .../Code/Libraries/Source/WWVegas/WW3D2/scene.cpp | 12 ++++++------ 10 files changed, 37 insertions(+), 15 deletions(-) diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp index f33bb6e4da0..eff4ce53546 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/FlatHeightMap.cpp @@ -486,7 +486,7 @@ void FlatHeightMapRenderObjClass::Render(RenderInfoClass & rinfo) } #endif - DX8Wrapper::Set_Light_Environment(rinfo.light_environment); + WW3D::Get_Render_Backend()->Set_Light_Environment(rinfo.light_environment); // Force shaders to update. m_stageTwoTexture->restore(); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp index 274aa838929..589ac221f6c 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/HeightMap.cpp @@ -1924,7 +1924,7 @@ void HeightMapRenderObjClass::Render(RenderInfoClass & rinfo) } #endif - DX8Wrapper::Set_Light_Environment(rinfo.light_environment); + WW3D::Get_Render_Backend()->Set_Light_Environment(rinfo.light_environment); // Force shaders to update. m_stageTwoTexture->restore(); diff --git a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp index 5012b17f2c4..e1bb771d777 100644 --- a/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp +++ b/Core/GameEngineDevice/Source/W3DDevice/GameClient/Water/W3DWater.cpp @@ -2407,10 +2407,10 @@ void WaterRenderObjClass::renderWaterMesh() DX8Wrapper::Set_Texture(0,setting->waterTexture); DX8Wrapper::Set_Texture(1,setting->waterTexture); - DX8Wrapper::Set_Light(0,*m_meshLight); - DX8Wrapper::Set_Light(1,nullptr); - DX8Wrapper::Set_Light(2,nullptr); - DX8Wrapper::Set_Light(3,nullptr); + WW3D::Get_Render_Backend()->Set_Light(0,*m_meshLight); + WW3D::Get_Render_Backend()->Clear_Light(1); + WW3D::Get_Render_Backend()->Clear_Light(2); + WW3D::Get_Render_Backend()->Clear_Light(3); /* DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENT,0); //turn off scene ambient DX8Wrapper::Set_DX8_Render_State(D3DRS_SPECULARENABLE,TRUE); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp index d2688ffe21e..042d910958b 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.cpp @@ -217,3 +217,18 @@ void DX8Backend::Set_Light_Environment(LightEnvironmentClass * light_env) { DX8Wrapper::Set_Light_Environment(light_env); } + +void DX8Backend::Set_Light(unsigned index, const LightClass & light) +{ + DX8Wrapper::Set_Light(index, light); +} + +void DX8Backend::Clear_Light(unsigned index) +{ + DX8Wrapper::Set_Light(index, nullptr); +} + +void DX8Backend::Set_Fog(bool enable, const Vector3 & color, float start, float end) +{ + DX8Wrapper::Set_Fog(enable, color, start, end); +} diff --git a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h index 67af262d77c..02f0478e583 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/Backend/DX8Backend.h @@ -64,6 +64,9 @@ class DX8Backend : public IRenderBackend virtual void Set_Ambient(const Vector3 & color) override; virtual void Set_Light_Environment(LightEnvironmentClass * light_env) override; + virtual void Set_Light(unsigned index, const LightClass & light) override; + virtual void Clear_Light(unsigned index) override; + virtual void Set_Fog(bool enable, const Vector3 & color, float start, float end) override; private: explicit DX8Backend(bool lite); diff --git a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h index 2071af762a7..ea1760c5a89 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h +++ b/Core/Libraries/Source/WWVegas/WW3D2/IRenderBackend.h @@ -27,6 +27,7 @@ // Forward declarations keep this header includable without pulling in the full // WW3D2 header graph. All W3D classes below are passed by pointer or reference. +class LightClass; class LightEnvironmentClass; class Matrix3D; class Matrix4x4; @@ -90,4 +91,7 @@ class IRenderBackend virtual void Set_Ambient(const Vector3 & color) = 0; virtual void Set_Light_Environment(LightEnvironmentClass * light_env) = 0; + virtual void Set_Light(unsigned index, const LightClass & light) = 0; + virtual void Clear_Light(unsigned index) = 0; + virtual void Set_Fog(bool enable, const Vector3 & color, float start, float end) = 0; }; diff --git a/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp b/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp index 1931bddc07a..da364390575 100644 --- a/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp +++ b/Core/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp @@ -1813,7 +1813,7 @@ void DX8TextureCategoryClass::Render() LightEnvironmentClass * lenv = mesh->Get_Lighting_Environment(); if (lenv != nullptr) { SNAPSHOT_SAY(("LightEnvironment, lights: %d",lenv->Get_Light_Count())); - DX8Wrapper::Set_Light_Environment(lenv); + WW3D::Get_Render_Backend()->Set_Light_Environment(lenv); } else { SNAPSHOT_SAY(("No light environment")); diff --git a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp index f21b80938a0..692931a1b69 100644 --- a/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp +++ b/GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp @@ -972,7 +972,7 @@ void RTS3DScene::updatePlayerColorPasses() void RTS3DScene::Render(RenderInfoClass & rinfo) { //USE_PERF_TIMER(NonTerrainRender) - DX8Wrapper::Set_Fog(FogEnabled, FogColor, FogStart, FogEnd); + WW3D::Get_Render_Backend()->Set_Fog(FogEnabled, FogColor, FogStart, FogEnd); //Override the behind building selection if it's not available on current hardware (needs stencil). TheWritableGlobalData->m_enableBehindBuildingMarkers = TheWritableGlobalData->m_enableBehindBuildingMarkers && WW3D::Get_Render_Backend()->Has_Stencil(); diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp index 17eacec14d2..c8a9cd50386 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp @@ -828,7 +828,7 @@ void MeshClass::Render_Material_Pass(MaterialPassClass * pass,IndexBufferClass * Vector3 oldEmissive(-1,-1,-1); if (LightEnvironment != nullptr) { - DX8Wrapper::Set_Light_Environment(LightEnvironment); + WW3D::Get_Render_Backend()->Set_Light_Environment(LightEnvironment); } if (Model->Get_Flag(MeshModelClass::SKIN)) { diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp index a42c81658be..2be3cebb2d8 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/scene.cpp @@ -216,7 +216,7 @@ void SceneClass::Render(RenderInfoClass & rinfo) // Any stuff that needs to get done before anything else Pre_Render_Processing(rinfo); - DX8Wrapper::Set_Fog(FogEnabled, FogColor, FogStart, FogEnd); + WW3D::Get_Render_Backend()->Set_Fog(FogEnabled, FogColor, FogStart, FogEnd); if (Get_Extra_Pass_Polygon_Mode()==EXTRA_PASS_DISABLE) { Customized_Render(rinfo); @@ -557,10 +557,10 @@ void SimpleSceneClass::Customized_Render(RenderInfoClass & rinfo) // derived classes should use light environment WWASSERT(rinfo.light_environment==nullptr); // Turn off lights in case we have none - DX8Wrapper::Set_Light(0,nullptr); - DX8Wrapper::Set_Light(1,nullptr); - DX8Wrapper::Set_Light(2,nullptr); - DX8Wrapper::Set_Light(3,nullptr); + WW3D::Get_Render_Backend()->Clear_Light(0); + WW3D::Get_Render_Backend()->Clear_Light(1); + WW3D::Get_Render_Backend()->Clear_Light(2); + WW3D::Get_Render_Backend()->Clear_Light(3); // (gth) WWShade only works with light environments. We need to upgrade LightEnvironment to // support real point lights, etc. It will likely just evolve into "the n most important" lights @@ -571,7 +571,7 @@ void SimpleSceneClass::Customized_Render(RenderInfoClass & rinfo) { if (count<4) { - DX8Wrapper::Set_Light(count,*(LightClass*)it.Peek_Obj()); + WW3D::Get_Render_Backend()->Set_Light(count,*(LightClass*)it.Peek_Obj()); } else { // Simple scene only supports 4 global lights