Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Build Release.bat
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

RMDIR dist /S /Q

cmake -S . --preset=VR --check-stamp-file "build\CMakeFiles\generate.stamp"
cmake -S . --preset=ALL --check-stamp-file "build\CMakeFiles\generate.stamp"
if %ERRORLEVEL% NEQ 0 exit 1
cmake --build build --config Release
if %ERRORLEVEL% NEQ 0 exit 1
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.21)

project(
CommunityShaders
VERSION 0.2.0
VERSION 0.3.2
LANGUAGES CXX
)

Expand Down
35 changes: 28 additions & 7 deletions features/Tree LOD Lighting/Shaders/DistantTree.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,25 @@ cbuffer AlphaTestRefCB : register(b11)
float AlphaTestRefRS : packoffset(c0);
}

cbuffer PerFrame : register(b12)
cbuffer PerFrame : register(b12)
{
float4 UnknownPerFrame1[12] : packoffset(c0);
row_major float4x4 ScreenProj : packoffset(c12);
row_major float4x4 PreviousScreenProj : packoffset(c16);
row_major float4x4 ViewMatrix : packoffset(c0);
row_major float4x4 ProjMatrix : packoffset(c4);
row_major float4x4 ViewProjMatrix : packoffset(c8);
row_major float4x4 ViewProjMatrixUnjittered : packoffset(c12);
row_major float4x4 PreviousViewProjMatrixUnjittered : packoffset(c16);
row_major float4x4 InvProjMatrixUnjittered : packoffset(c20);
row_major float4x4 ProjMatrixUnjittered : packoffset(c24);
row_major float4x4 InvViewMatrix : packoffset(c28);
row_major float4x4 InvViewProjMatrix : packoffset(c32);
row_major float4x4 InvProjMatrix : packoffset(c36);
float4 CurrentPosAdjust : packoffset(c40);
float4 PreviousPosAdjust : packoffset(c41);
// notes: FirstPersonY seems 1.0 regardless of third/first person, could be LE legacy stuff
float4 GammaInvX_FirstPersonY_AlphaPassZ_CreationKitW : packoffset(c42);
float4 DynamicRes_WidthX_HeightY_PreviousWidthZ_PreviousHeightW : packoffset(c43);
float4 DynamicRes_InvWidthX_InvHeightY_WidthClampZ_HeightClampW : packoffset(c44);
}

cbuffer PerTechnique : register(b0)
{
float4 DiffuseColor : packoffset(c0);
Expand Down Expand Up @@ -171,6 +183,10 @@ float3x3 CalculateTBN(float3 N, float3 p, float2 uv)

Texture2D<float4> TexShadowMaskSampler : register(t17);

#if defined(SCREEN_SPACE_SHADOWS)
#include "ScreenSpaceShadows/ShadowsPS.hlsli"
#endif

PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace)
{
PS_OUTPUT psout;
Expand Down Expand Up @@ -207,9 +223,9 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace)
}
#endif

float4 screenPosition = mul(ScreenProj, input.WorldPosition);
float4 screenPosition = mul(ViewProjMatrixUnjittered, input.WorldPosition);
screenPosition.xy = screenPosition.xy / screenPosition.ww;
float4 previousScreenPosition = mul(PreviousScreenProj, input.PreviousWorldPosition);
float4 previousScreenPosition = mul(PreviousViewProjMatrixUnjittered, input.PreviousWorldPosition);
previousScreenPosition.xy = previousScreenPosition.xy / previousScreenPosition.ww;
float2 screenMotionVector = float2(-0.5, 0.5) * (screenPosition.xy - previousScreenPosition.xy);

Expand Down Expand Up @@ -246,6 +262,11 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace)

float3 nsDirLightColor = dirLightColor;

#if defined(SCREEN_SPACE_SHADOWS)
float dirLightSShadow = PrepassScreenSpaceShadows(input.WorldPosition);
shadowColor *= dirLightSShadow;
#endif

dirLightColor *= min(lerp(1, input.TexCoord.zzz, FogDimmerAmount), min(0.5, shadowColor));

float3 diffuseColor = 0;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[Info]
Version = 1-0-0
Version = 1-0-1
140 changes: 36 additions & 104 deletions package/Shaders/RunGrass.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ struct VS_INPUT
float4 InstanceData2 : TEXCOORD5;
float4 InstanceData3 : TEXCOORD6;
float4 InstanceData4 : TEXCOORD7;
uint InstanceID : SV_InstanceID0;
};

struct VS_OUTPUT
Expand All @@ -23,41 +22,36 @@ struct VS_OUTPUT
#endif
float4 WorldPosition : POSITION1;
float4 PreviousWorldPosition : POSITION2;
float o7 : SV_ClipDistance0;
float p7 : SV_CullDistance0;
};

#ifdef VSHADER

cbuffer cb7 : register(b7)
{
float4 cb7[1];
}

cbuffer cb8 : register(b8)
cbuffer PerGeometry : register(b2)
{
float4 cb8[240];
row_major float4x4 WorldViewProj : packoffset(c0);
row_major float4x4 WorldView : packoffset(c4);
row_major float4x4 World : packoffset(c8);
row_major float4x4 PreviousWorld : packoffset(c12);
float4 FogNearColor : packoffset(c16);
float3 WindVector : packoffset(c17);
float WindTimer : packoffset(c17.w);
float3 DirLightDirection : packoffset(c18);
float PreviousWindTimer : packoffset(c18.w);
float3 DirLightColor : packoffset(c19);
float AlphaParam1 : packoffset(c19.w);
float3 AmbientColor : packoffset(c20);
float AlphaParam2 : packoffset(c20.w);
float3 ScaleMask : packoffset(c21);
float ShadowClampValue : packoffset(c21.w);
}

cbuffer PerGeometry : register(b2)
{
float4 cb2[32] : packoffset(c0);
float4 FogNearColor : packoffset(c32);
float3 WindVector : packoffset(c33);
float WindTimer : packoffset(c33.w);
float3 DirLightDirection : packoffset(c34);
float PreviousWindTimer : packoffset(c34.w);
float3 DirLightColor : packoffset(c35);
float AlphaParam1 : packoffset(c35.w);
float3 AmbientColor : packoffset(c36);
float AlphaParam2 : packoffset(c36.w);
float3 ScaleMask : packoffset(c37);
float ShadowClampValue : packoffset(c37.w);
cbuffer cb7 : register(b7)
{
float4 cb7[1];
}

cbuffer cb13 : register(b13)
cbuffer cb8 : register(b8)
{
float4 cb13[3];
float4 cb8[240];
}

#define M_PI 3.1415925 // PI
Expand Down Expand Up @@ -104,24 +98,10 @@ VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT vsout;

float4 r0,r1,r2,r3,r4,r5,r6;
uint4 bitmask, uiDest;
float4 fDest;

r0.x = (int)input.InstanceID & 1;
r0.x = (uint)r0.x;
r0.x = cb13[0].y * r0.x;
r0.x = (uint)r0.x;
r0.z = (uint)r0.x << 2;
r0.y = (uint)r0.x << 2;

float4 msPosition = GetMSPosition(input, WindTimer);

float4 projSpacePosition;
projSpacePosition.x = dot(cb2[r0.z+0].xyzw, msPosition.xyzw);
projSpacePosition.y = dot(cb2[r0.z+1].xyzw, msPosition.xyzw);
projSpacePosition.z = dot(cb2[r0.z+2].xyzw, msPosition.xyzw);
projSpacePosition.w = dot(cb2[r0.z+3].xyzw, msPosition.xyzw);
float4 projSpacePosition = mul(WorldViewProj, msPosition);
vsout.HPosition = projSpacePosition;

#if defined(RENDER_DEPTH)
vsout.Depth = projSpacePosition.zw;
Expand All @@ -143,38 +123,12 @@ VS_OUTPUT main(VS_INPUT input)
vsout.AmbientColor.xyz = input.InstanceData1.www * (AmbientColor.xyz * input.Color.xyz);
vsout.AmbientColor.w = ShadowClampValue;

vsout.WorldPosition.x = dot(cb2[r0.z+16].xyzw, msPosition.xyzw);
vsout.WorldPosition.y = dot(cb2[r0.z+17].xyzw, msPosition.xyzw);
vsout.WorldPosition.z = dot(cb2[r0.z+18].xyzw, msPosition.xyzw);
vsout.WorldPosition.w = dot(cb2[r0.z+19].xyzw, msPosition.xyzw);
vsout.ViewSpacePosition = mul(WorldView, msPosition).xyz;
vsout.WorldPosition = mul(World, msPosition);

float4 previousMsPosition = GetMSPosition(input, PreviousWindTimer);

vsout.PreviousWorldPosition.x = dot(cb2[r0.z+24].xyzw, previousMsPosition.xyzw);
vsout.PreviousWorldPosition.y = dot(cb2[r0.z+25].xyzw, previousMsPosition.xyzw);
vsout.PreviousWorldPosition.z = dot(cb2[r0.z+26].xyzw, previousMsPosition.xyzw);
vsout.PreviousWorldPosition.w = dot(cb2[r0.z+27].xyzw, previousMsPosition.xyzw);

vsout.ViewSpacePosition.x = dot(cb2[r0.z+8].xyzw, msPosition.xyzw);
vsout.ViewSpacePosition.y = dot(cb2[r0.z+9].xyzw, msPosition.xyzw);
vsout.ViewSpacePosition.z = dot(cb2[r0.z+10].xyzw, msPosition.xyzw);

if (0 < cb13[0].y) {
r0.yz = dot(projSpacePosition, cb13[r0.x+1].xyzw);
} else {
r0.yz = float2(1,1);
}

r0.w = 2 + -cb13[0].y;
r0.x = dot(cb13[0].zw, M_IdentityMatrix[r0.x+0].xy);
r0.xw = r0.xw * projSpacePosition.wx;
r0.x = cb13[0].y * r0.x;

vsout.HPosition.x = r0.w * 0.5 + r0.x;
vsout.HPosition.yzw = projSpacePosition.yzw;

vsout.o7.x = r0.z;
vsout.p7.x = r0.y;
vsout.PreviousWorldPosition = mul(PreviousWorld, previousMsPosition);

return vsout;
}
Expand All @@ -200,27 +154,18 @@ SamplerState SampShadowMaskSampler : register(s1);
Texture2D<float4> TexBaseSampler : register(t0);
Texture2D<float4> TexShadowMaskSampler : register(t1);

cbuffer AlphaTestRefCB : register(b13)
cbuffer AlphaTestRefCB : register(b11)
{
float AlphaTestRefRS : packoffset(c0);
}

cbuffer cb0 : register(b0)
cbuffer PerFrame : register(b12)
{
float4 cb0[10];
}

struct PerEye
{
row_major float4x4 ScreenProj;
row_major float4x4 PreviousScreenProj;
float4 UnknownPerFrame1[12] : packoffset(c0);
row_major float4x4 ScreenProj : packoffset(c12);
row_major float4x4 PreviousScreenProj : packoffset(c16);
};

cbuffer cb12 : register(b12)
{
float4 cb12[87];
}

PS_OUTPUT main(PS_INPUT input)
{
PS_OUTPUT psout;
Expand Down Expand Up @@ -250,24 +195,12 @@ PS_OUTPUT main(PS_INPUT input)
psout.Albedo.xyz = input.TexCoord.zzz * (diffuseColor * diffuseFraction + ambientColor);
psout.Albedo.w = 1;

float stereoUV = input.HPosition.x * cb0[9].x + cb0[9].z;
stereoUV = stereoUV * cb12[86].x;

uint eyeIndex = (stereoUV >= 0.5);

float3 screenPosition;
screenPosition.x = dot(cb12[eyeIndex+24].xyzw, input.WorldPosition);
screenPosition.y = dot(cb12[eyeIndex+25].xyzw, input.WorldPosition);
screenPosition.z = dot(cb12[eyeIndex+27].xyzw, input.WorldPosition);
screenPosition.xy = screenPosition.xy / screenPosition.zz;

float3 previousScreenPosition;
previousScreenPosition.x = dot(cb12[eyeIndex+32].xyzw, input.PreviousWorldPosition);
previousScreenPosition.y = dot(cb12[eyeIndex+33].xyzw, input.PreviousWorldPosition);
previousScreenPosition.z = dot(cb12[eyeIndex+35].xyzw, input.PreviousWorldPosition);
previousScreenPosition.xy = previousScreenPosition.xy / previousScreenPosition.zz;

float4 screenPosition = mul(ScreenProj, input.WorldPosition);
screenPosition.xy = screenPosition.xy / screenPosition.ww;
float4 previousScreenPosition = mul(PreviousScreenProj, input.PreviousWorldPosition);
previousScreenPosition.xy = previousScreenPosition.xy / previousScreenPosition.ww;
float2 screenMotionVector = float2(-0.5, 0.5) * (screenPosition.xy - previousScreenPosition.xy);

psout.MotionVectors = screenMotionVector;

float3 ddx = ddx_coarse(input.ViewSpacePosition);
Expand All @@ -276,7 +209,6 @@ PS_OUTPUT main(PS_INPUT input)
float normalScale = max(1.0 / 1000.0, sqrt(normal.z * -8 + 8));
psout.Normal.xy = float2(0.5, 0.5) + normal.xy / normalScale;
psout.Normal.zw = float2(0, 0);

#endif

return psout;
Expand Down
10 changes: 6 additions & 4 deletions src/Features/Clustered.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ void Clustered::UpdateLights()
RE::NiPoint3 eyePosition{};
if (REL::Module::IsVR()) {
// find center of eye position
eyePosition = state->GetVRRuntimeData2().posAdjust.getEye() + state->GetVRRuntimeData2().posAdjust.getEye(1);
eyePosition = state->GetVRRuntimeData().posAdjust.getEye() + state->GetVRRuntimeData().posAdjust.getEye(1);
eyePosition /= 2;
} else
eyePosition = state->GetRuntimeData2().posAdjust.getEye();
eyePosition = state->GetRuntimeData().posAdjust.getEye();

worldPos = worldPos - eyePosition;
logger::trace("Set {}light {} at ({} {} {}) because of eye ({} {} {})", bsShadowLight ? "shadow" : "", niLight->name, worldPos.x, worldPos.y, worldPos.z,
Expand All @@ -75,8 +75,10 @@ void Clustered::UpdateLights()
position.y = worldPos.y;
position.z = worldPos.z;
light.positionWS = XMLoadFloat3(&position);
light.positionVS = XMVector3TransformCoord(light.positionWS, state->GetVRRuntimeData2().cameraData.getEye().viewMat);

if (!REL::Module::IsVR())
light.positionVS = XMVector3TransformCoord(light.positionWS, state->GetRuntimeData().cameraData.getEye().viewMat);
else
light.positionVS = XMVector3TransformCoord(light.positionWS, state->GetVRRuntimeData().cameraData.getEye().viewMat);
light.radius = niLight->GetLightRuntimeData().radius.x;

light.active = true;
Expand Down
9 changes: 6 additions & 3 deletions src/Features/DistantTreeLighting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,16 @@ void DistantTreeLighting::ModifyDistantTree(const RE::BSShader*, const uint32_t
RE::NiPoint3 eyePosition{};
if (REL::Module::IsVR()) {
// find center of eye position
eyePosition = state->GetVRRuntimeData2().posAdjust.getEye() + state->GetVRRuntimeData2().posAdjust.getEye(1);
eyePosition = state->GetVRRuntimeData().posAdjust.getEye() + state->GetVRRuntimeData().posAdjust.getEye(1);
eyePosition /= 2;
} else
eyePosition = state->GetRuntimeData2().posAdjust.getEye();
eyePosition = state->GetRuntimeData().posAdjust.getEye();
perPassData.EyePosition.x = position.x - eyePosition.x;
perPassData.EyePosition.y = position.y - eyePosition.y;
perPassData.EyePosition.z = position.z - eyePosition.z;

if (auto sunLight = (NiDirectionalLight*)accumulator->GetRuntimeData().activeShadowSceneNode->GetRuntimeData().sunLight->light.get()) {
auto sunLight = skyrim_cast<RE::NiDirectionalLight*>(accumulator->GetRuntimeData().activeShadowSceneNode->GetRuntimeData().sunLight->light.get());
if (sunLight) {
auto imageSpaceManager = RE::ImageSpaceManager::GetSingleton();

perPassData.DirLightScale = imageSpaceManager->data.baseData.hdr.sunlightScale * sunLight->GetLightRuntimeData().fade;
Expand Down Expand Up @@ -177,8 +178,10 @@ void DistantTreeLighting::Load(json& o_json)
if (auto value = ini.GetValue("Info", "Version")) {
enabled = true;
version = value;
logger::info("TreeLODLighting.ini successfully loaded");
} else {
enabled = false;
logger::warn("TreeLODLighting.ini not successfully loaded");
}
}

Expand Down
10 changes: 6 additions & 4 deletions src/Features/GrassCollision.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,10 @@ void GrassCollision::UpdateCollisions()
RE::NiPoint3 eyePosition{};
if (REL::Module::IsVR()) {
// find center of eye position
eyePosition = state->GetVRRuntimeData2().posAdjust.getEye() + state->GetVRRuntimeData2().posAdjust.getEye(1);
eyePosition = state->GetVRRuntimeData().posAdjust.getEye() + state->GetVRRuntimeData().posAdjust.getEye(1);
eyePosition /= 2;
} else
eyePosition = state->GetRuntimeData2().posAdjust.getEye();
eyePosition = state->GetRuntimeData().posAdjust.getEye();
data.centre.x = centerPos.x - eyePosition.x;
data.centre.y = centerPos.y - eyePosition.y;
data.centre.z = centerPos.z - eyePosition.z;
Expand Down Expand Up @@ -202,10 +202,10 @@ void GrassCollision::ModifyGrass(const RE::BSShader*, const uint32_t)
RE::NiPoint3 eyePosition{};
if (REL::Module::IsVR()) {
// find center of eye position
eyePosition = state->GetVRRuntimeData2().posAdjust.getEye() + state->GetVRRuntimeData2().posAdjust.getEye(1);
eyePosition = state->GetVRRuntimeData().posAdjust.getEye() + state->GetVRRuntimeData().posAdjust.getEye(1);
eyePosition /= 2;
} else
eyePosition = state->GetRuntimeData2().posAdjust.getEye();
eyePosition = state->GetRuntimeData().posAdjust.getEye();
perFrameData.boundCentre.x = bound.center.x - eyePosition.x;
perFrameData.boundCentre.y = bound.center.y - eyePosition.y;
perFrameData.boundCentre.z = bound.center.z - eyePosition.z;
Expand Down Expand Up @@ -257,8 +257,10 @@ void GrassCollision::Load(json& o_json)
if (auto value = ini.GetValue("Info", "Version")) {
enabledFeature = true;
version = value;
logger::info("GrassCollision.ini successfully loaded");
} else {
enabledFeature = false;
logger::warn("GrassCollision.ini not successfully loaded");
}
}

Expand Down
Loading