From b93db28f1ac6a3337c0fc82ca30854849c3602bc Mon Sep 17 00:00:00 2001 From: Lwmte Date: Sun, 1 Aug 2021 11:39:02 +0300 Subject: [PATCH] Use refraction as before but accounting for vertex weight factor --- TR5Main/Renderer/ConstantBuffers/RoomBuffer.h | 6 +++-- TR5Main/Renderer/Renderer11Draw.cpp | 2 +- TR5Main/Shaders/DX11_Items.fx | 11 ++++++--- TR5Main/Shaders/DX11_Rooms.fx | 23 ++++++++----------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/TR5Main/Renderer/ConstantBuffers/RoomBuffer.h b/TR5Main/Renderer/ConstantBuffers/RoomBuffer.h index ce3596ced..1e22121f2 100644 --- a/TR5Main/Renderer/ConstantBuffers/RoomBuffer.h +++ b/TR5Main/Renderer/ConstantBuffers/RoomBuffer.h @@ -1,6 +1,8 @@ #pragma once #include -struct alignas(16) CRoomBuffer { + +struct alignas(16) CRoomBuffer +{ DirectX::SimpleMath::Vector4 AmbientColor; - int water; + int Water; }; diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 697605c3f..ed7c74c6b 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -3074,7 +3074,7 @@ namespace T5M::Renderer m_cbMisc.updateData(m_stMisc, m_context.Get()); m_context->PSSetConstantBuffers(3, 1, m_cbMisc.get()); m_stRoom.AmbientColor = room->AmbientLight; - m_stRoom.water = (room->Room->flags & ENV_FLAG_WATER) != 0 ? 1 : 0; + m_stRoom.Water = (room->Room->flags & ENV_FLAG_WATER) != 0 ? 1 : 0; m_cbRoom.updateData(m_stRoom, m_context.Get()); m_context->VSSetConstantBuffers(5, 1, m_cbRoom.get()); m_context->PSSetConstantBuffers(5, 1, m_cbRoom.get()); diff --git a/TR5Main/Shaders/DX11_Items.fx b/TR5Main/Shaders/DX11_Items.fx index acfcc94cd..e46b44311 100644 --- a/TR5Main/Shaders/DX11_Items.fx +++ b/TR5Main/Shaders/DX11_Items.fx @@ -73,14 +73,19 @@ PixelShaderInput VS(VertexShaderInput input) float2 clipPos = ScreenPos.xy / ScreenPos.w; - if (input.Effects.z > 0.0f) // Refraction + // Setting effect weight on TE side prevents portal vertices from moving. + // Here we just read weight and decide if we should apply refraction or movement effect. + + float weight = input.Effects.z; + + if (input.Effects.y > 0.0f) // Movement FIXME: rewrite this proc to differentiate from refraction! { static const float PI = 3.14159265f; float factor = (Frame + clipPos.x*320); float xOffset = (sin(factor * PI/20.0f)) * (ScreenPos.z/1024)*5; float yOffset = (cos(factor*PI/20.0f))*(ScreenPos.z/1024)*5; - ScreenPos.x += xOffset * input.Effects.z; - ScreenPos.y += yOffset * input.Effects.z; + ScreenPos.x += xOffset * input.Effects.y * weight; + ScreenPos.y += yOffset * input.Effects.y * weight; } output.Position = ScreenPos; diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index 8b69e89ca..bc22497c6 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -34,7 +34,7 @@ cbuffer CShadowLightBuffer : register(b4) cbuffer RoomBuffer : register(b5) { float4 AmbientColor; - int water; // DEPRECATED + int Water; }; struct AnimatedFrameUV { @@ -83,18 +83,19 @@ PixelShaderInput VS(VertexShaderInput input) float4 screenPos = mul(float4(input.Position, 1.0f), ViewProjection); float2 clipPos = screenPos.xy / screenPos.w; - float refract = input.Effects.z; - if (CameraUnderwater) // Always refract if underwater - refract = 1.0f; + // Setting effect weight on TE side prevents portal vertices from moving. + // Here we just read weight and decide if we should apply refraction or movement effect. - if (refract > 0.0f) + float weight = input.Effects.z; + + if (CameraUnderwater != Water) { static const float PI = 3.14159265f; float factor = (Frame + clipPos.x * 320); - float xOffset = (sin(factor * PI/20.0f)) * (screenPos.z/1024) * 8; - float yOffset = (cos(factor * PI/20.0f)) * (screenPos.z/1024) * 8; - screenPos.x += xOffset * refract; - screenPos.y += yOffset * refract; + float xOffset = (sin(factor * PI/20.0f)) * (screenPos.z/1024) * 4; + float yOffset = (cos(factor * PI/20.0f)) * (screenPos.z/1024) * 4; + screenPos.x += xOffset * weight; + screenPos.y += yOffset * weight; } output.Position = screenPos; @@ -102,10 +103,6 @@ PixelShaderInput VS(VertexShaderInput input) output.Color = input.Color; float glow = input.Effects.x; - if (refract > 0.0f) - { - glow = refract; // Override glow value with refraction if exists - } if (glow > 0.0f) {