@@ -66,9 +66,7 @@ void W3DSmudgeManager::reset ()
6666
6767void W3DSmudgeManager::ReleaseResources ()
6868{
69- #ifdef USE_COPY_RECTS
7069 REF_PTR_RELEASE (m_backgroundTexture);
71- #endif
7270 REF_PTR_RELEASE (m_indexBuffer);
7371}
7472
@@ -85,9 +83,7 @@ void W3DSmudgeManager::ReAcquireResources()
8583 surface->Get_Description (surface_desc);
8684 REF_PTR_RELEASE (surface);
8785
88- #ifdef USE_COPY_RECTS
89- m_backgroundTexture = MSGNEW (" TextureClass" ) TextureClass (TheTacticalView->getWidth (),TheTacticalView->getHeight (),surface_desc.Format ,MIP_LEVELS_1,TextureClass::POOL_DEFAULT, true );
90- #endif
86+ m_backgroundTexture = MSGNEW (" TextureClass" ) TextureClass (surface_desc.Width ,surface_desc.Height ,surface_desc.Format ,MIP_LEVELS_1,TextureClass::POOL_DEFAULT, true );
9187
9288 m_backBufferWidth = surface_desc.Width ;
9389 m_backBufferHeight = surface_desc.Height ;
@@ -207,15 +203,20 @@ Bool W3DSmudgeManager::testHardwareSupport()
207203 { // we have not done the test yet.
208204
209205 IDirect3DTexture8 *backTexture=W3DShaderManager::getRenderTexture ();
210- if (!backTexture)
211- { // do trivial test first to see if render target exists.
206+ if (!backTexture || !W3DShaderManager::isRenderingToTexture ())
207+ {
208+ // TheSuperHackers @bugfix When Render-To-Texture is disabled globally, we fallback
209+ // to copying the backbuffer to a texture.
210+ if (m_backgroundTexture)
211+ {
212+ m_hardwareSupportStatus = SMUDGE_SUPPORT_YES;
213+ return TRUE ;
214+ }
215+
212216 m_hardwareSupportStatus = SMUDGE_SUPPORT_NO;
213217 return FALSE ;
214218 }
215219
216- if (!W3DShaderManager::isRenderingToTexture ())
217- return FALSE ; // can't do the test unless we're rendering to texture.
218-
219220 VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset (VertexMaterialClass::PRELIT_DIFFUSE);
220221 DX8Wrapper::Set_Material (vmat);
221222 REF_PTR_RELEASE (vmat); // no need to keep a reference since it's a preset.
@@ -306,6 +307,22 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
306307 if (!testHardwareSupport ())
307308 return ;
308309
310+ SurfaceClass *backBuffer = DX8Wrapper::_Get_DX8_Back_Buffer ();
311+
312+ if (!backBuffer)
313+ return ;
314+
315+ SurfaceClass *background=m_backgroundTexture ? m_backgroundTexture->Get_Surface_Level () : nullptr ;
316+
317+ if (!background)
318+ {
319+ REF_PTR_RELEASE (backBuffer);
320+ return ;
321+ }
322+
323+ SurfaceClass::SurfaceDescription surface_desc;
324+ backBuffer->Get_Description (surface_desc);
325+
309326 CameraClass &camera=rinfo.Camera ;
310327 Vector3 vsVert;
311328 Vector4 ssVert;
@@ -327,23 +344,6 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
327344 camera.Get_View_Matrix (&view);
328345 camera.Get_Projection_Matrix (&proj);
329346
330- SurfaceClass::SurfaceDescription surface_desc;
331- #ifdef USE_COPY_RECTS
332- SurfaceClass *background=m_backgroundTexture->Get_Surface_Level ();
333- background->Get_Description (surface_desc);
334- #else
335- D3DSURFACE_DESC D3DDesc;
336-
337- IDirect3DTexture8 *backTexture=W3DShaderManager::getRenderTexture ();
338- if (!backTexture || !W3DShaderManager::isRenderingToTexture ())
339- return ; // this card doesn't support render targets.
340-
341- backTexture->GetLevelDesc (0 ,&D3DDesc);
342-
343- surface_desc.Width = D3DDesc.Width ;
344- surface_desc.Height = D3DDesc.Height ;
345- #endif
346-
347347 Real texClampX = (Real)TheTacticalView->getWidth ()/(Real)surface_desc.Width ;
348348 Real texClampY = (Real)TheTacticalView->getHeight ()/(Real)surface_desc.Height ;
349349
@@ -421,23 +421,16 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
421421
422422 if (!count)
423423 {
424- #ifdef USE_COPY_RECTS
425424 REF_PTR_RELEASE (background);
426- # endif
425+ REF_PTR_RELEASE (backBuffer);
427426 return ; // nothing to render.
428427 }
429428
430- #ifdef USE_COPY_RECTS
431- SurfaceClass *backBuffer=DX8Wrapper::_Get_DX8_Back_Buffer ();
432-
433- backBuffer->Get_Description (surface_desc);
434-
435429 // Copy the area of backbuffer occupied by smudges into an alternate buffer.
436430 background->Copy (0 ,0 ,0 ,0 ,surface_desc.Width ,surface_desc.Height ,backBuffer);
437431
438432 REF_PTR_RELEASE (background);
439433 REF_PTR_RELEASE (backBuffer);
440- #endif
441434
442435 Matrix4x4 identity (true );
443436 DX8Wrapper::Set_Transform (D3DTS_WORLD,identity);
@@ -447,18 +440,15 @@ void W3DSmudgeManager::render(RenderInfoClass &rinfo)
447440 // DX8Wrapper::Set_Shader(ShaderClass::_PresetOpaqueSpriteShader);
448441
449442 DX8Wrapper::Set_Shader (ShaderClass::_PresetAlphaShader);
450- # ifdef USE_COPY_RECTS
443+
451444 DX8Wrapper::Set_Texture (0 ,m_backgroundTexture);
452- #else
453- DX8Wrapper::Set_DX8_Texture (0 ,backTexture);
454445 // Need these states in case texture is non-power-of-2
455446 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
456447 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
457448 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP);
458449 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
459450 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_MINFILTER, D3DTEXF_LINEAR);
460451 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_MIPFILTER, D3DTEXF_NONE);
461- #endif
462452 VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset (VertexMaterialClass::PRELIT_DIFFUSE);
463453 DX8Wrapper::Set_Material (vmat);
464454 REF_PTR_RELEASE (vmat);
0 commit comments