@@ -209,6 +209,8 @@ void WaterRenderObjClass::setupJbaWaterShader(void)
209209
210210 DX8Wrapper::Apply_Render_State_Changes (); // force update of view and projection matrices
211211 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_ALPHAOP, D3DTOP_ADD );
212+ if (!m_riverAlphaEdge->Is_Initialized ())
213+ m_riverAlphaEdge->Init ();
212214 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (3 ,m_riverAlphaEdge->Peek_D3D_Texture ());
213215 DX8Wrapper::Set_DX8_Texture_Stage_State (3 , D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
214216 DX8Wrapper::Set_DX8_Texture_Stage_State (3 , D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
@@ -219,7 +221,12 @@ void WaterRenderObjClass::setupJbaWaterShader(void)
219221 Bool doSparkles = true ;
220222
221223 if (m_riverWaterPixelShader && doSparkles) {
224+ if (!m_waterSparklesTexture->Is_Initialized ())
225+ m_waterSparklesTexture->Init ();
222226 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (1 ,m_waterSparklesTexture->Peek_D3D_Texture ());
227+
228+ if (!m_waterNoiseTexture->Is_Initialized ())
229+ m_waterNoiseTexture->Init ();
223230 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (2 ,m_waterNoiseTexture->Peek_D3D_Texture ());
224231
225232 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
@@ -526,7 +533,7 @@ HRESULT WaterRenderObjClass::initBumpMap(LPDIRECT3DTEXTURE8 *pTex, TextureClass
526533 pSrc=(unsigned char *)surf->Lock ((int *)&dwSrcPitch);
527534
528535 // Create the bumpmap's surface and texture objects
529- m_pBumpTexture[i]=DX8Wrapper::_Create_DX8_Texture (d3dsd.Width ,d3dsd.Height ,WW3D_FORMAT_U8V8,MIP_LEVELS_1,D3DPOOL_MANAGED,false );
536+ m_pBumpTexture[i]=DX8Wrapper::_Create_DX8_Texture (d3dsd.Width ,d3dsd.Height ,WW3D_FORMAT_U8V8,TextureClass:: MIP_LEVELS_1,D3DPOOL_MANAGED,false );
530537
531538 // Fill the bits of the new texture surface with bits from
532539 // a private format.
@@ -944,6 +951,22 @@ void WaterRenderObjClass::ReAcquireResources(void)
944951 }
945952 }
946953
954+ // W3D Invalidate textures after losing the device and since we peek at the textures directly, it won't
955+ // know to reinit them for us. Do it here manually:
956+ if (m_riverTexture && !m_riverTexture->Is_Initialized ())
957+ m_riverTexture->Init ();
958+ if (m_waterNoiseTexture && !m_waterNoiseTexture->Is_Initialized ())
959+ m_waterNoiseTexture->Init ();
960+ if (m_riverAlphaEdge && !m_riverAlphaEdge->Is_Initialized ())
961+ m_riverAlphaEdge->Init ();
962+ if (m_waterSparklesTexture && !m_waterSparklesTexture->Is_Initialized ())
963+ m_waterSparklesTexture->Init ();
964+ if (m_whiteTexture && !m_whiteTexture->Is_Initialized ())
965+ { m_whiteTexture->Init ();
966+ SurfaceClass *surface=m_whiteTexture->Get_Surface_Level ();
967+ surface->DrawPixel (0 ,0 ,0xffffffff );
968+ REF_PTR_RELEASE (surface);
969+ }
947970}
948971
949972void WaterRenderObjClass::load (void )
@@ -1428,7 +1451,7 @@ void WaterRenderObjClass::renderMirror(CameraClass *cam)
14281451 Matrix3D reflectedTransform (rRight,rUp,rN,rPos);
14291452
14301453
1431- DX8Wrapper::Set_Render_Target ( m_pReflectionTexture);
1454+ DX8Wrapper::Set_Render_Target_With_Z ((TextureClass*) m_pReflectionTexture);
14321455
14331456 // Clear the backbuffer
14341457 WW3D::Begin_Render (false ,true ,Vector3 (0 .0f ,0 .0f ,0 .0f )); // clearing only z-buffer since background always filled with clouds
@@ -1619,11 +1642,11 @@ void WaterRenderObjClass::Render(RenderInfoClass & rinfo)
16191642 DX8Wrapper::Set_DX8_Render_State (D3DRS_ALPHATESTENABLE, true ); // test pixels if transparent(clipped) before rendering.
16201643
16211644 // Set clipping texture
1622- m_alphaClippingTexture->Set_U_Addr_Mode (TextureFilterClass ::TEXTURE_ADDRESS_CLAMP);
1623- m_alphaClippingTexture->Set_V_Addr_Mode (TextureFilterClass ::TEXTURE_ADDRESS_CLAMP);
1624- m_alphaClippingTexture->Set_Min_Filter (TextureFilterClass ::FILTER_TYPE_NONE);
1625- m_alphaClippingTexture->Set_Mag_Filter (TextureFilterClass ::FILTER_TYPE_NONE);
1626- m_alphaClippingTexture->Set_Mip_Mapping (TextureFilterClass ::FILTER_TYPE_NONE);
1645+ m_alphaClippingTexture->Set_U_Addr_Mode (TextureClass ::TEXTURE_ADDRESS_CLAMP);
1646+ m_alphaClippingTexture->Set_V_Addr_Mode (TextureClass ::TEXTURE_ADDRESS_CLAMP);
1647+ m_alphaClippingTexture->Set_Min_Filter (TextureClass ::FILTER_TYPE_NONE);
1648+ m_alphaClippingTexture->Set_Mag_Filter (TextureClass ::FILTER_TYPE_NONE);
1649+ m_alphaClippingTexture->Set_Mip_Mapping (TextureClass ::FILTER_TYPE_NONE);
16271650
16281651 DX8Wrapper::Set_Texture (0 ,m_alphaClippingTexture);
16291652
@@ -2904,51 +2927,62 @@ void WaterRenderObjClass::drawRiverWater(PolygonTrigger *pTrig)
29042927
29052928void WaterRenderObjClass::setupFlatWaterShader (void )
29062929{
2930+
2931+ DX8Wrapper::Set_Texture (0 ,m_riverTexture);
2932+ if (!TheWaterTransparency->m_additiveBlend )
2933+ DX8Wrapper::Set_Shader (ShaderClass::_PresetAlphaShader);
2934+ else
2935+ DX8Wrapper::Set_Shader (ShaderClass::_PresetAdditiveShader);
2936+
2937+ VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset (VertexMaterialClass::PRELIT_DIFFUSE);
2938+ DX8Wrapper::Set_Material (vmat);
2939+ REF_PTR_RELEASE (vmat);
2940+ m_riverTexture->Get_Filter ().Set_Mag_Filter (TextureFilterClass::FILTER_TYPE_BEST);
2941+ m_riverTexture->Get_Filter ().Set_Min_Filter (TextureFilterClass::FILTER_TYPE_BEST);
2942+ m_riverTexture->Get_Filter ().Set_Mip_Mapping (TextureFilterClass::FILTER_TYPE_BEST);
2943+
2944+ DX8Wrapper::Apply_Render_State_Changes (); // force update of view and projection matrices
2945+
29072946 // Setup shroud to render in same pass as water
29082947 if (m_trapezoidWaterPixelShader)
29092948 { if (TheTerrainRenderObject->getShroud ())
29102949 {
29112950 W3DShaderManager::setTexture (0 ,TheTerrainRenderObject->getShroud ()->getShroudTexture ());
29122951 // Use stage 3 to apply the shroud
29132952 W3DShaderManager::setShader (W3DShaderManager::ST_SHROUD_TEXTURE, 3 );
2914- m_pDev->SetTextureStageState ( 3 , D3DTSS_MINFILTER, D3DTEXF_LINEAR );
2915- m_pDev->SetTextureStageState ( 3 , D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
2916- m_pDev->SetTextureStageState ( 3 , D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
2917- m_pDev->SetTextureStageState ( 3 , D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
29182953 // Shroud shader uses z-compare of EQUAL which wouldn't work on water because it doesn't
29192954 // write to the zbuffer. Change to LESSEQUAL.
29202955 DX8Wrapper::_Get_D3D_Device8 ()->SetRenderState (D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
29212956 }
29222957 else
29232958 { // Assume no shroud, so stage 3 will be "NULL" texture but using actual white because
29242959 // pixel shader on GF4 generates random colors with SetTexture(3,NULL).
2960+ if (!m_whiteTexture->Is_Initialized ())
2961+ { m_whiteTexture->Init ();
2962+ SurfaceClass *surface=m_whiteTexture->Get_Surface_Level ();
2963+ surface->DrawPixel (0 ,0 ,0xffffffff );
2964+ REF_PTR_RELEASE (surface);
2965+ }
29252966 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (3 ,m_whiteTexture->Peek_D3D_Texture ());
29262967 }
29272968 }
29282969
2929- DX8Wrapper::Set_Texture (0 ,m_riverTexture);
2930- if (!TheWaterTransparency->m_additiveBlend )
2931- DX8Wrapper::Set_Shader (ShaderClass::_PresetAlphaShader);
2932- else
2933- DX8Wrapper::Set_Shader (ShaderClass::_PresetAdditiveShader);
2934-
2935- VertexMaterialClass *vmat=VertexMaterialClass::Get_Preset (VertexMaterialClass::PRELIT_DIFFUSE);
2936- DX8Wrapper::Set_Material (vmat);
2937- REF_PTR_RELEASE (vmat);
2938- m_riverTexture->Get_Filter ().Set_Mag_Filter (TextureFilterClass::FILTER_TYPE_BEST);
2939- m_riverTexture->Get_Filter ().Set_Min_Filter (TextureFilterClass::FILTER_TYPE_BEST);
2940- m_riverTexture->Get_Filter ().Set_Mip_Mapping (TextureFilterClass::FILTER_TYPE_BEST);
2941-
2942- DX8Wrapper::Apply_Render_State_Changes (); // force update of view and projection matrices
2943-
29442970 DX8Wrapper::Set_DX8_Texture_Stage_State ( 0 , D3DTSS_ALPHAOP, D3DTOP_ADD );
29452971 DX8Wrapper::Set_DX8_Texture_Stage_State (0 , D3DTSS_TEXCOORDINDEX, 0 );
29462972 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_TEXCOORDINDEX, 0 );
29472973
29482974 Bool doSparkles = true ;
29492975
29502976 if (m_trapezoidWaterPixelShader && doSparkles) {
2977+
2978+ if (!m_waterSparklesTexture->Is_Initialized ())
2979+ m_waterSparklesTexture->Init ();
2980+
29512981 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (1 ,m_waterSparklesTexture->Peek_D3D_Texture ());
2982+
2983+ if (!m_waterNoiseTexture->Is_Initialized ())
2984+ m_waterNoiseTexture->Init ();
2985+
29522986 DX8Wrapper::_Get_D3D_Device8 ()->SetTexture (2 ,m_waterNoiseTexture->Peek_D3D_Texture ());
29532987
29542988 DX8Wrapper::Set_DX8_Texture_Stage_State (1 , D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
0 commit comments