diff --git a/src/camera.h b/src/camera.h index 13b9c78..f5cdb15 100644 --- a/src/camera.h +++ b/src/camera.h @@ -580,11 +580,13 @@ struct Camera : ICamera { q.z = -1.0f; q.w = (1.0f + Core::mProj.e22) / Core::mProj.e23; - vec4 c = p * (2.0f / p.dot(q)); + float f = GAPI::getProjRange() == mat4::PROJ_NEG_POS ? 2.0f : 1.0f; + + vec4 c = p * (f / p.dot(q)); Core::mProj.e20 = c.x; Core::mProj.e21 = c.y; - Core::mProj.e22 = c.z + 1.0f; + Core::mProj.e22 = c.z + (f - 1.0f); Core::mProj.e23 = c.w; } diff --git a/src/gapi/c3d.h b/src/gapi/c3d.h index 2be7147..0fc476c 100644 --- a/src/gapi/c3d.h +++ b/src/gapi/c3d.h @@ -509,16 +509,20 @@ namespace GAPI { C3D_Fini(); gfxExit(); } + + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_NEG_ZERO; + } mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_NEG_ZERO, l, r, b, t, znear, zfar, true); + m.ortho(getProjRange(), l, r, b, t, znear, zfar, true); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_NEG_ZERO, fov, aspect, znear, zfar, eye, true); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye, true); return m; } diff --git a/src/gapi/d3d11.h b/src/gapi/d3d11.h index cb6ef7e..125e91f 100644 --- a/src/gapi/d3d11.h +++ b/src/gapi/d3d11.h @@ -187,6 +187,7 @@ namespace GAPI { case 1 : SHADER ( filter_downsample, v ); SHADER ( filter_downsample, f ); break; case 3 : SHADER ( filter_grayscale, v ); SHADER ( filter_grayscale, f ); break; case 4 : SHADER ( filter_blur, v ); SHADER ( filter_blur, f ); break; + case 5 : SHADER ( filter_blur, v ); SHADER ( filter_blur, f ); break; // TODO anaglyph default : ASSERT(false); } break; @@ -606,7 +607,6 @@ namespace GAPI { support.texHalfLinear = true; support.texHalf = true; support.tex3D = true; - support.clipDist = true; #ifdef PROFILE support.profMarker = false; @@ -717,15 +717,19 @@ namespace GAPI { } } + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_ZERO_POS; + } + mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_ZERO_POS, l, r, b, t, znear, zfar); + m.ortho(getProjRange(), l, r, b, t, znear, zfar); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_ZERO_POS, fov, aspect, znear, zfar, eye); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye); return m; } diff --git a/src/gapi/d3d9.h b/src/gapi/d3d9.h index f6cad47..07338ca 100644 --- a/src/gapi/d3d9.h +++ b/src/gapi/d3d9.h @@ -195,6 +195,7 @@ namespace GAPI { case 1 : vSrc = SHADER ( filter_downsample, v ); fSrc = SHADER ( filter_downsample, f ); break; case 3 : vSrc = SHADER ( filter_grayscale, v ); fSrc = SHADER ( filter_grayscale, f ); break; case 4 : vSrc = SHADER ( filter_blur, v ); fSrc = SHADER ( filter_blur, f ); break; + case 5 : vSrc = SHADER ( filter_blur, v ); fSrc = SHADER ( filter_blur, f ); break; // TODO anaglyph default : ASSERT(false); } break; @@ -249,6 +250,7 @@ namespace GAPI { int width, height, depth, origWidth, origHeight, origDepth; TexFormat fmt; uint32 opt; + D3DFORMAT d3dformat; Texture(int width, int height, int depth, uint32 opt) : tex2D(NULL), texCube(NULL), width(width), height(height), depth(depth), origWidth(width), origHeight(height), origDepth(depth), fmt(FMT_RGBA), opt(opt) {} @@ -283,6 +285,8 @@ namespace GAPI { D3DPOOL pool = (isTarget || isDepth) ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED; + d3dformat = desc.format; + if (cube) { D3DCHECK(device->CreateCubeTexture(width, 1, usage, desc.format, pool, &texCube, NULL)); } else { @@ -290,14 +294,18 @@ namespace GAPI { if (data && !isTarget) { D3DLOCKED_RECT rect; D3DCHECK(tex2D->LockRect(0, &rect, NULL, 0)); - if (width != origWidth || height != origHeight) { - memset(rect.pBits, 0, width * height * (desc.bpp / 8)); + if (fmt == FMT_RGBA) { uint8 *dst = (uint8*)rect.pBits; uint8 *src = (uint8*)data; - for (int y = 0; y < origHeight; y++) { - memcpy(dst, src, origWidth * (desc.bpp / 8)); - src += origWidth * (desc.bpp / 8); - dst += width * (desc.bpp / 8); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + dst[3] = src[3]; + dst += 4; + src += 4; + } } } else { memcpy(rect.pBits, data, width * height * (desc.bpp / 8)); @@ -473,7 +481,6 @@ namespace GAPI { support.texFloat = true; support.texHalfLinear = true; support.texHalf = true; - support.clipDist = true; #ifdef PROFILE support.profMarker = false; @@ -484,8 +491,8 @@ namespace GAPI { {0, OFFSETOF(Vertex, coord), D3DDECLTYPE_SHORT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, // aCoord {0, OFFSETOF(Vertex, normal), D3DDECLTYPE_SHORT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, // aNormal {0, OFFSETOF(Vertex, texCoord), D3DDECLTYPE_SHORT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, // aTexCoord - {0, OFFSETOF(Vertex, color), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, // aColor - {0, OFFSETOF(Vertex, light), D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1}, // aLight + {0, OFFSETOF(Vertex, color), D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, // aColor + {0, OFFSETOF(Vertex, light), D3DDECLTYPE_UBYTE4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1}, // aLight D3DDECL_END() }; @@ -539,15 +546,19 @@ namespace GAPI { } } + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_ZERO_POS; + } + mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_ZERO_POS, l, r, b, t, znear, zfar); + m.ortho(getProjRange(), l, r, b, t, znear, zfar); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_ZERO_POS, fov, aspect, znear, zfar, eye); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye); return m; } @@ -764,7 +775,7 @@ namespace GAPI { LPDIRECT3DSURFACE9 surface, texSurface; D3DCHECK(t->tex2D->GetSurfaceLevel(0, &texSurface)); - D3DCHECK(device->CreateOffscreenPlainSurface(t->width, t->height, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &surface, NULL)); + D3DCHECK(device->CreateOffscreenPlainSurface(t->width, t->height, t->d3dformat, D3DPOOL_SYSTEMMEM, &surface, NULL)); D3DCHECK(device->GetRenderTargetData(texSurface, surface)); RECT r = { x, y, x + 1, y + 1 }; diff --git a/src/gapi/gl.h b/src/gapi/gl.h index 70b3c0f..560a327 100644 --- a/src/gapi/gl.h +++ b/src/gapi/gl.h @@ -1337,15 +1337,19 @@ namespace GAPI { } } + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_NEG_POS; + } + mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_NEG_POS, l, r, b, t, znear, zfar); + m.ortho(getProjRange(), l, r, b, t, znear, zfar); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_NEG_POS, fov, aspect, znear, zfar, eye); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye); return m; } diff --git a/src/gapi/gu.h b/src/gapi/gu.h index 81ec0fe..76d1441 100644 --- a/src/gapi/gu.h +++ b/src/gapi/gu.h @@ -295,15 +295,19 @@ namespace GAPI { delete[] cmdBuf; } + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_NEG_POS; + } + mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_NEG_POS, l, r, b, t, znear, zfar); + m.ortho(getProjRange(), l, r, b, t, znear, zfar); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_NEG_POS, fov, aspect, znear, zfar, eye); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye); return m; } diff --git a/src/gapi/gxm.h b/src/gapi/gxm.h index 7478d20..810da17 100644 --- a/src/gapi/gxm.h +++ b/src/gapi/gxm.h @@ -1205,15 +1205,19 @@ namespace GAPI { sceGxmTerminate(); } + inline mat4::ProjRange getProjRange() { + return mat4::PROJ_ZERO_POS; + } + mat4 ortho(float l, float r, float b, float t, float znear, float zfar) { mat4 m; - m.ortho(mat4::PROJ_ZERO_POS, l, r, b, t, znear, zfar); + m.ortho(getProjRange(), l, r, b, t, znear, zfar); return m; } mat4 perspective(float fov, float aspect, float znear, float zfar, float eye) { mat4 m; - m.perspective(mat4::PROJ_ZERO_POS, fov, aspect, znear, zfar, eye); + m.perspective(getProjRange(), fov, aspect, znear, zfar, eye); return m; } diff --git a/src/platform/win/OpenLara.vcxproj b/src/platform/win/OpenLara.vcxproj index 7df4d2b..528511c 100644 --- a/src/platform/win/OpenLara.vcxproj +++ b/src/platform/win/OpenLara.vcxproj @@ -5,10 +5,6 @@ Debug Win32 - - Editor - Win32 - Profile Win32 @@ -31,12 +27,6 @@ v141_xp NotSet - - Application - true - v120_xp - NotSet - Application false @@ -57,9 +47,6 @@ - - - @@ -73,11 +60,6 @@ ..\..\;$(VC_IncludePath);$(WindowsSdk_71A_IncludePath); ..\..\libs\openvr\;$(VC_LibraryPath_x86);$(WindowsSdk_71A_LibraryPath_x86); - - true - ..\..\..\bin\ - ..\..\;$(VC_IncludePath);$(WindowsSdk_71A_IncludePath); - false ..\..\..\bin\ @@ -109,23 +91,6 @@ wsock32.lib;d3d9.lib;d3d11.lib;opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - - - - Level3 - Disabled - LEVEL_EDITOR;STB_VORBIS_NO_STDIO;NOMINMAX;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) - Strict - - - - - Console - true - opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - - Level3 @@ -179,7 +144,7 @@ false true true - wcrt.lib;wsock32.lib;openvr_api.lib;opengl32.lib;d3d11.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + wcrt.lib;wsock32.lib;opengl32.lib;d3d11.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) true false false diff --git a/src/shaders/common.hlsl b/src/shaders/common.hlsl index e9bbf6c..5ed42b4 100644 --- a/src/shaders/common.hlsl +++ b/src/shaders/common.hlsl @@ -24,10 +24,6 @@ static const float3 SHADOW_TEXEL = float3(1.0 / SHADOW_SIZE, 1.0 / SHADOW_SIZE, #define FLAGS_TYPE float4 #endif -#ifndef _GAPI_GXM - #define CLIP_PLANE -#endif - struct VS_INPUT { int4 aCoord : POSITION; int4 aNormal : NORMAL; diff --git a/src/shaders/compose_entity.hlsl b/src/shaders/compose_entity.hlsl index 40aa4bc..2cdc0fb 100644 --- a/src/shaders/compose_entity.hlsl +++ b/src/shaders/compose_entity.hlsl @@ -1,6 +1,6 @@ #include "common.hlsl" -// ALPHA_TEST, UNDERWATER, CLIP_PLANE (D3D9 only), OPT_SHADOW, OPT_CAUSTICS, OPT_AMBIENT +// ALPHA_TEST, UNDERWATER, OPT_SHADOW, OPT_CAUSTICS, OPT_AMBIENT struct VS_OUTPUT { float4 pos : POSITION; @@ -12,9 +12,6 @@ struct VS_OUTPUT { float3 ambient : TEXCOORD5; float4 light : TEXCOORD6; float4 lightProj : TEXCOORD7; -#ifdef _GAPI_GXM - float clipDist : CLP0; -#endif }; #ifdef VERTEX @@ -76,10 +73,6 @@ VS_OUTPUT main(VS_INPUT In) { Out.pos = mul(uViewProj, float4(Out.coord, rBasisPos.w)); Out.lightProj = mul(uLightProj, float4(Out.coord, 1.0)); -#ifdef _GAPI_GXM - Out.clipDist = Out.viewVec.w; -#endif - return Out; } @@ -92,10 +85,6 @@ float4 main(VS_OUTPUT In) : COLOR0 { clip(color.w - ALPHA_REF); #endif - #ifdef CLIP_PLANE - clip(In.viewVec.w); - #endif - color *= In.diffuse; float3 lightVec = (uLightPos[0].xyz - In.coord) * uLightColor[0].w; diff --git a/src/shaders/compose_flash.hlsl b/src/shaders/compose_flash.hlsl index a8e3ad2..8cfb95f 100644 --- a/src/shaders/compose_flash.hlsl +++ b/src/shaders/compose_flash.hlsl @@ -1,16 +1,9 @@ #include "common.hlsl" -// CLIP_PLANE (D3D9 only) - struct VS_OUTPUT { float4 pos : POSITION; float4 texCoord : TEXCOORD0; float3 diffuse : TEXCOORD1; -#ifdef _GAPI_GXM - float clipDist : CLP0; -#else - float clipDist : TEXCOORD2; -#endif }; #ifdef VERTEX @@ -28,8 +21,6 @@ VS_OUTPUT main(VS_INPUT In) { Out.diffuse = In.aColor.rgb * (uMaterial.x * 1.8) + uMaterial.w; Out.texCoord = In.aTexCoord * (1.0 / 32767.0); Out.texCoord.xy *= Out.texCoord.zw; - - Out.clipDist = uParam.w - coord.y * uParam.z; return Out; } @@ -39,10 +30,6 @@ VS_OUTPUT main(VS_INPUT In) { float4 main(VS_OUTPUT In) : COLOR0 { float4 color = SAMPLE_2D(sDiffuse, In.texCoord.xy / In.texCoord.zw); - #ifdef CLIP_PLANE - clip(In.clipDist); - #endif - color.xyz *= In.diffuse.xyz; return color; } diff --git a/src/shaders/compose_mirror.hlsl b/src/shaders/compose_mirror.hlsl index 2ea9fd6..86e4fd8 100644 --- a/src/shaders/compose_mirror.hlsl +++ b/src/shaders/compose_mirror.hlsl @@ -1,14 +1,9 @@ #include "common.hlsl" -// CLIP_PLANE (D3D9 only) - struct VS_OUTPUT { float4 pos : POSITION; float4 viewVec : TEXCOORD0; float4 normal : TEXCOORD1; -#ifdef _GAPI_GXM - float clipDist : CLP0; -#endif }; #ifdef VERTEX @@ -28,10 +23,6 @@ VS_OUTPUT main(VS_INPUT In) { Out.normal.w = saturate(1.0 / exp(length(Out.viewVec.xyz))); Out.pos = mul(uViewProj, float4(coord, rBasisPos.w)); - -#ifdef _GAPI_GXM - Out.clipDist = Out.viewVec.w; -#endif return Out; } @@ -42,10 +33,6 @@ float4 main(VS_OUTPUT In) : COLOR0 { float3 rv = reflect(-In.viewVec.xyz, In.normal.xyz); float4 color = SAMPLE_CUBE(sEnvironment, normalize(rv)); - #ifdef CLIP_PLANE - clip(In.viewVec.w); - #endif - color *= uMaterial; color.xyz = saturate(color.xyz); diff --git a/src/shaders/compose_room.hlsl b/src/shaders/compose_room.hlsl index 3ace73b..4709adc 100644 --- a/src/shaders/compose_room.hlsl +++ b/src/shaders/compose_room.hlsl @@ -1,6 +1,6 @@ #include "common.hlsl" -// ALPHA_TEST, UNDERWATER, CLIP_PLANE (D3D9 only), OPT_SHADOW, OPT_CAUSTICS, OPT_CONTACT +// ALPHA_TEST, UNDERWATER, OPT_SHADOW, OPT_CAUSTICS, OPT_CONTACT struct VS_OUTPUT { float4 pos : POSITION; @@ -12,11 +12,6 @@ struct VS_OUTPUT { float3 lightMap : TEXCOORD5; float4 light : TEXCOORD6; float4 lightProj : TEXCOORD7; -#ifdef _GAPI_GXM - float clipDist : CLP0; -#else - float clipDist : TEXCOORD8; -#endif }; #ifdef VERTEX @@ -31,7 +26,7 @@ VS_OUTPUT main(VS_INPUT In) { Out.coord = mulBasis(rBasisRot, rBasisPos.xyz, In.aCoord.xyz); Out.texCoord.xy *= Out.texCoord.zw; - Out.normal.xyz = mulQuat(rBasisRot, normalize(In.aNormal.xyz)); + Out.normal.xyz = normalize(In.aNormal.xyz); float3 lv1 = (uLightPos[1].xyz - Out.coord) * uLightColor[1].w; float3 lv2 = (uLightPos[2].xyz - Out.coord) * uLightColor[2].w; @@ -74,8 +69,6 @@ VS_OUTPUT main(VS_INPUT In) { Out.pos = mul(uViewProj, float4(Out.coord, rBasisPos.w)); Out.lightProj = mul(uLightProj, float4(Out.coord, 1.0)); - Out.clipDist = uParam.w - Out.coord.y * uParam.z; - return Out; } @@ -88,10 +81,6 @@ float4 main(VS_OUTPUT In) : COLOR0 { clip(color.w - ALPHA_REF); #endif - #ifdef CLIP_PLANE - clip(In.clipDist); - #endif - color *= In.diffuse; float3 lightVec = (uLightPos[0].xyz - In.coord) * uLightColor[0].w; diff --git a/src/shaders/compose_sprite.hlsl b/src/shaders/compose_sprite.hlsl index 313600a..92e886d 100644 --- a/src/shaders/compose_sprite.hlsl +++ b/src/shaders/compose_sprite.hlsl @@ -1,6 +1,6 @@ #include "common.hlsl" -// ALPHA_TEST, UNDERWATER, OPT_CAUSTICS, CLIP_PLANE (D3D9 only) +// ALPHA_TEST, UNDERWATER, OPT_CAUSTICS struct VS_OUTPUT { float4 pos : POSITION; @@ -9,11 +9,6 @@ struct VS_OUTPUT { float4 normal : TEXCOORD2; float4 diffuse : TEXCOORD3; float4 light : TEXCOORD4; -#ifdef _GAPI_GXM - float clipDist : CLP0; -#else - float clipDist : TEXCOORD5; -#endif }; #ifdef VERTEX @@ -64,8 +59,6 @@ VS_OUTPUT main(VS_INPUT In) { Out.pos = mul(uViewProj, float4(Out.coord, rBasisPos.w)); - Out.clipDist = uParam.w - Out.coord.y * uParam.z; - return Out; } @@ -78,10 +71,6 @@ float4 main(VS_OUTPUT In) : COLOR0 { clip(color.w - ALPHA_REF); #endif - #ifdef CLIP_PLANE - clip(In.clipDist); - #endif - color *= In.diffuse; float3 normal = normalize(In.normal.xyz); diff --git a/src/shaders/water.glsl b/src/shaders/water.glsl index 9e83f1b..fd16319 100644 --- a/src/shaders/water.glsl +++ b/src/shaders/water.glsl @@ -229,7 +229,7 @@ vec3 calcNormal(vec2 tc, float base) { vec2 tc = vProjCoord.xy / vProjCoord.w * 0.5 + 0.5; vec4 refrA = texture2D(sDiffuse, uParam.xy * clamp(tc + dudv * uParam.z, 0.0, 0.999) ); - vec4 refrB = texture2D(sDiffuse, uParam.xy * tc ); + vec4 refrB = texture2D(sDiffuse, uParam.xy * tc); vec4 refr = vec4(mix(refrA.xyz, refrB.xyz, refrA.w), 1.0); vec4 refl = texture2D(sReflect, vec2(tc.x, 1.0 - tc.y) + dudv * uParam.w); diff --git a/src/shaders/water_compose.hlsl b/src/shaders/water_compose.hlsl index 1c8cb43..3472a37 100644 --- a/src/shaders/water_compose.hlsl +++ b/src/shaders/water_compose.hlsl @@ -20,10 +20,10 @@ VS_OUTPUT main(VS_INPUT In) { float4 uv = float4(coord.x, coord.y, coord.x, -coord.y) * 0.5 + 0.5; Out.maskCoord = uv.xy * uRoomSize.zw; Out.texCoord = uv.zw * uTexParam.zw; - #ifndef _GAPI_GXM + #ifdef _GAPI_D3D9 Out.texCoord += 0.5 * uTexParam.xy; - #endif - + #endif + coord = float3(coord.x, 0.0, coord.y) * uPosScale[1].xyz + uPosScale[0].xyz; Out.pos = mul(uViewProj, float4(coord, 1.0)); @@ -45,28 +45,28 @@ VS_OUTPUT main(VS_INPUT In) { half4 main(VS_OUTPUT In) : COLOR0 { float3 viewVec = normalize(In.viewVec.xyz); - - float base = SAMPLE_2D_LINEAR(sNormal, In.texCoord).x; - float3 normal = calcHeightMapNormal(In.texCoordR, In.texCoordB, base); - - float2 dudv = mul(uViewProj, float4(normal.x, 0.0, normal.z, 0.0)).xy * uParam.z; + + float value = SAMPLE_2D_LINEAR(sNormal, In.texCoord).x; + float3 normal = calcHeightMapNormal(In.texCoordR, In.texCoordB, value); + + float2 dudv = mul(uViewProj, float4(normal.x, 0.0, normal.z, 0.0)).xy; float3 rv = reflect(-viewVec, normal); float3 lv = normalize(In.lightVec); - half specular = pow(max(0.0, dot(rv, lv)), 64.0) * 0.75; + half spec = pow(max(0.0, dot(rv, lv)), 64.0) * 0.5; float2 tc = In.hpos.xy / In.hpos.z * 0.5 + 0.5; - half4 refrA = SAMPLE_2D_LINEAR(sDiffuse, tc - dudv); + half4 refrA = SAMPLE_2D_LINEAR(sDiffuse, clamp(tc + dudv * uParam.z, 0.0, 0.999)); half4 refrB = SAMPLE_2D_POINT(sDiffuse, tc); half3 refr = lerp(refrA.xyz, refrB.xyz, refrA.w); - half3 refl = SAMPLE_2D_LINEAR(sReflect, tc + dudv).xyz; + half3 refl = SAMPLE_2D_LINEAR(sReflect, float2(tc.x, tc.y) + dudv * uParam.w).xyz; half fresnel = calcFresnel(max(0.0, dot(normal, viewVec)), 0.12); half mask = SAMPLE_2D_POINT(sMask, In.maskCoord).a; half4 color = half4(lerp(refr, refl, fresnel), mask); - color.xyz += specular; + color.xyz += spec * 1.5; float dist = (In.viewVec.y / viewVec.y) * In.viewVec.w; color.xyz *= lerp((half3)1.0, UNDERWATER_COLOR_H, (half)clamp(dist * WATER_COLOR_DIST, 0.0, 2.0));