Revision | 64da57d15fc65b0395663c377962163eb1ef2532 (tree) |
---|---|
Time | 2019-11-06 10:44:54 |
Author | <jarmonik@c0f5...> |
- Merge of r.1203
@@ -132,7 +132,7 @@ | ||
132 | 132 | // ========================================================================================================== |
133 | 133 | // Object Self Shadows |
134 | 134 | // ========================================================================================================== |
135 | - | |
135 | +/* | |
136 | 136 | float ProjectShadows(float2 sp) |
137 | 137 | { |
138 | 138 | if (!gShadowsEnabled) return 0.0f; |
@@ -159,14 +159,13 @@ | ||
159 | 159 | if ((tex2D(ShadowS, sp + dx).r) > pd) va++; |
160 | 160 | |
161 | 161 | return va / 9.0f; |
162 | -} | |
162 | +}*/ | |
163 | 163 | |
164 | 164 | |
165 | 165 | // --------------------------------------------------------------------------------------------------- |
166 | 166 | // |
167 | 167 | float SampleShadows(float2 sp, float pd) |
168 | 168 | { |
169 | - if (!gShadowsEnabled) return 0.0f; | |
170 | 169 | |
171 | 170 | float2 dx = float2(gSHD[1], 0) * 1.5f; |
172 | 171 | float2 dy = float2(0, gSHD[1]) * 1.5f; |
@@ -193,8 +192,7 @@ | ||
193 | 192 | // |
194 | 193 | float SampleShadows2(float2 sp, float pd) |
195 | 194 | { |
196 | - if (!gShadowsEnabled) return 0.0f; | |
197 | - | |
195 | + | |
198 | 196 | float val = 0; |
199 | 197 | float m = KERNEL_RADIUS * gSHD[1]; |
200 | 198 |
@@ -210,7 +208,6 @@ | ||
210 | 208 | // |
211 | 209 | float SampleShadows3(float2 sp, float pd, float4 frame) |
212 | 210 | { |
213 | - if (!gShadowsEnabled) return 0.0f; | |
214 | 211 | |
215 | 212 | float val = 0; |
216 | 213 | frame *= KERNEL_RADIUS * gSHD[1]; |
@@ -228,6 +225,7 @@ | ||
228 | 225 | // |
229 | 226 | float SampleShadowsEx(float2 sp, float pd, float4 sc) |
230 | 227 | { |
228 | + | |
231 | 229 | #if SHDMAP == 1 |
232 | 230 | return SampleShadows(sp, pd); |
233 | 231 | #elif SHDMAP == 2 || SHDMAP == 4 |
@@ -245,12 +243,17 @@ | ||
245 | 243 | // |
246 | 244 | float ComputeShadow(float4 shdH, float dLN, float4 sc) |
247 | 245 | { |
246 | + if (!gShadowsEnabled) return 1.0f; | |
247 | + | |
248 | 248 | shdH.xyz /= shdH.w; |
249 | 249 | shdH.z = 1 - shdH.z; |
250 | 250 | float2 sp = shdH.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); |
251 | 251 | |
252 | 252 | sp += gSHD[1] * 0.5f; |
253 | 253 | |
254 | + if (sp.x < 0 || sp.y < 0) return 1.0f; // If a sample is outside border -> fully lit | |
255 | + if (sp.x > 1 || sp.y > 1) return 1.0f; | |
256 | + | |
254 | 257 | float fShadow; |
255 | 258 | |
256 | 259 | float kr = gSHD[0] * KERNEL_RADIUS; |
@@ -258,17 +261,12 @@ | ||
258 | 261 | float ofs = kr / (dLN * dx); |
259 | 262 | float omx = min(0.05 + ofs, 0.5); |
260 | 263 | |
261 | - if (gBaseBuilding) { | |
264 | + float pd = shdH.z + omx * gSHD[3]; | |
262 | 265 | |
263 | - // It's a surface base building | |
264 | - fShadow = ProjectShadows(sp); | |
265 | - } | |
266 | - else { | |
266 | + if (pd < 0) pd = 0; | |
267 | + if (pd > 1) pd = 1; | |
267 | 268 | |
268 | - // It's a vessel | |
269 | - float pd = shdH.z + omx * gSHD[3]; | |
270 | - fShadow = SampleShadowsEx(sp, pd, sc); | |
271 | - } | |
272 | - | |
269 | + fShadow = SampleShadowsEx(sp, pd, sc); | |
270 | + | |
273 | 271 | return 1 - fShadow; |
274 | 272 | } |
\ No newline at end of file |
@@ -323,6 +323,7 @@ | ||
323 | 323 | // ------------------------------------------------------------------------------------------------------------- |
324 | 324 | // Project shadows on surface |
325 | 325 | // |
326 | +/* | |
326 | 327 | float ProjectShadows(float2 sp) |
327 | 328 | { |
328 | 329 | if (sp.x < 0 || sp.y < 0) return 1.0f; |
@@ -347,6 +348,38 @@ | ||
347 | 348 | if ((tex2D(ShadowS, sp + dx).r) < pd) va++; |
348 | 349 | |
349 | 350 | return va / 9.0f; |
351 | +}*/ | |
352 | + | |
353 | + | |
354 | + | |
355 | +// --------------------------------------------------------------------------------------------------- | |
356 | +// | |
357 | +float SampleShadows(float2 sp, float pd) | |
358 | +{ | |
359 | + if (sp.x < 0 || sp.y < 0) return 0.0f; // If a sample is outside border -> fully lit | |
360 | + if (sp.x > 1 || sp.y > 1) return 0.0f; | |
361 | + | |
362 | + if (pd < 0) pd = 0; | |
363 | + if (pd > 2) pd = 2; | |
364 | + | |
365 | + float2 dx = float2(vSHD[1], 0) * 1.5f; | |
366 | + float2 dy = float2(0, vSHD[1]) * 1.5f; | |
367 | + float va = 0; | |
368 | + | |
369 | + sp -= dy; | |
370 | + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; | |
371 | + if ((tex2D(ShadowS, sp).r) > pd) va++; | |
372 | + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; | |
373 | + sp += dy; | |
374 | + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; | |
375 | + if ((tex2D(ShadowS, sp).r) > pd) va++; | |
376 | + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; | |
377 | + sp += dy; | |
378 | + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; | |
379 | + if ((tex2D(ShadowS, sp).r) > pd) va++; | |
380 | + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; | |
381 | + | |
382 | + return va * 0.1111111f; | |
350 | 383 | } |
351 | 384 | |
352 | 385 | // ------------------------------------------------------------------------------------------------------------- |
@@ -698,8 +731,10 @@ | ||
698 | 731 | #if defined(_SHDMAP) |
699 | 732 | if (bShadows) { |
700 | 733 | frg.shdH.xyz /= frg.shdH.w; |
734 | + frg.shdH.z = 1 - frg.shdH.z; | |
701 | 735 | float2 sp = frg.shdH.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); |
702 | - fShadow = ProjectShadows(sp); | |
736 | + float pd = frg.shdH.z + 0.05f * vSHD[3]; | |
737 | + fShadow = 1.0f - SampleShadows(sp, pd); | |
703 | 738 | } |
704 | 739 | #endif |
705 | 740 |
@@ -795,9 +795,9 @@ | ||
795 | 795 | |
796 | 796 | if (sqrt(D3DXVec3Dot(&bc, &bc) - x*x) < (shd->rad + mesh->bsRad)) { |
797 | 797 | float s = float(shd->size); |
798 | - float qw = 1.0f / float(Config->ShadowMapSize); | |
798 | + float sr = 2.0f * shd->rad / s; | |
799 | 799 | HR(Shader->SetMatrix(TileManager2Base::smLVP, &shd->mViewProj)); |
800 | - HR(Shader->SetVector(TileManager2Base::svSHD, &D3DXVECTOR4(s, 1.0f / s, qw, 0))); | |
800 | + HR(Shader->SetVector(TileManager2Base::svSHD, &D3DXVECTOR4(sr, 1.0f / s, 0, 1.0f / shd->depth))); | |
801 | 801 | HR(Shader->SetTexture(TileManager2Base::stShadowMap, shd->pShadowMap)); |
802 | 802 | HR(Shader->SetBool(TileManager2Base::sbShadows, true)); |
803 | 803 | } |
@@ -665,15 +665,13 @@ | ||
665 | 665 | |
666 | 666 | float s = float(shd->size); |
667 | 667 | float sr = 2.0f * shd->rad / s; |
668 | - float qw = 1.0f / float(Config->ShadowMapSize); | |
669 | 668 | |
670 | 669 | HR(D3D9Effect::FX->SetBool(D3D9Effect::eEnvMapEnable, false)); |
671 | 670 | HR(D3D9Effect::FX->SetMatrix(D3D9Effect::eLVP, &shd->mViewProj)); |
672 | 671 | |
673 | 672 | if (shd->pShadowMap && (scn->GetRenderPass() == RENDERPASS_MAINSCENE)) { |
674 | 673 | HR(D3D9Effect::FX->SetTexture(D3D9Effect::eShadowMap, shd->pShadowMap)); |
675 | - //HR(D3D9Effect::FX->SetVector(D3D9Effect::eSHD, &D3DXVECTOR4(sr, 1.0f/s, float(oapiRand()), float(CamDist())))); | |
676 | - HR(D3D9Effect::FX->SetVector(D3D9Effect::eSHD, &D3DXVECTOR4(sr, 1.0f / s, float(oapiRand()), 1.0f/shd->depth))); | |
674 | + HR(D3D9Effect::FX->SetVector(D3D9Effect::eSHD, &D3DXVECTOR4(sr, 1.0f / s, float(oapiRand()), 1.0f / shd->depth))); | |
677 | 675 | HR(D3D9Effect::FX->SetBool(D3D9Effect::eShadowToggle, true)); |
678 | 676 | } |
679 | 677 | else { |