Use refraction as before but accounting for vertex weight factor

This commit is contained in:
Lwmte 2021-08-01 11:39:02 +03:00
parent 9aec905bae
commit b93db28f1a
4 changed files with 23 additions and 19 deletions

View file

@ -1,6 +1,8 @@
#pragma once
#include <SimpleMath.h>
struct alignas(16) CRoomBuffer {
struct alignas(16) CRoomBuffer
{
DirectX::SimpleMath::Vector4 AmbientColor;
int water;
int Water;
};

View file

@ -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());

View file

@ -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;

View file

@ -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)
{