[BotW] Major FPS++ improvements, tree/shadow draw distance, ultrawide GUI

Made by Exzap, me and Skalfate.
This commit is contained in:
Crementif 2021-12-26 20:31:17 +01:00
parent 7a27d2fdc1
commit 39a464b65e
No known key found for this signature in database
GPG Key ID: 453870E0401C94C0
28 changed files with 6993 additions and 1684 deletions

View File

@ -0,0 +1,98 @@
#version 430
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable
// shader 7cd338ce4c6ea935
// Used for: Ultrawide cutscenes (when enabled)
float aspectRatio = float(($gameWidth/$gameHeight)/($width/$height));
float reverseAspectRatio = float(($width/$height)/($gameWidth/$gameHeight));
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
#else
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
#endif
#ifdef VULKAN
layout(set = 1, binding = 1) uniform ufBlock
{
uniform ivec4 uf_remappedPS[1];
uniform vec4 uf_fragCoordScale;
};
#else
uniform ivec4 uf_remappedPS[1];
uniform vec2 uf_fragCoordScale;
#endif
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
layout(location = 0) in vec4 passParameterSem0;
layout(location = 0) out vec4 passPixelColor0;
// end of shader inputs/outputs
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return floatBitsToInt(1.0);
else if( v == 0xFFFFFFFF )
return floatBitsToInt(0.0);
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
void main()
{
vec4 R0f = vec4(0.0);
vec4 R127f = vec4(0.0);
float backupReg0f, backupReg1f, backupReg2f, backupReg3f, backupReg4f;
vec4 PV0f = vec4(0.0), PV1f = vec4(0.0);
float PS0f = 0.0, PS1f = 0.0;
vec4 tempf = vec4(0.0);
float tempResultf;
int tempResulti;
ivec4 ARi = ivec4(0);
bool predResult = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
R0f = passParameterSem0;
R0f.xyzw = (texture(textureUnitPS0, (R0f.xy*vec2(reverseAspectRatio, 1.0))+vec2(-aspectRatio, 0.0)).xyzw);
// 0
backupReg0f = R0f.x;
tempResultf = max(0.0, backupReg0f);
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
PS0f = tempResultf;
// 1
R127f.z = mul_nonIEEE(PS0f, intBitsToFloat(uf_remappedPS[0].x));
tempResultf = max(0.0, R0f.y);
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
PS1f = tempResultf;
// 2
R127f.w = mul_nonIEEE(PS1f, intBitsToFloat(uf_remappedPS[0].x));
tempResultf = max(0.0, R0f.z);
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
PS0f = tempResultf;
// 3
R127f.x = mul_nonIEEE(PS0f, intBitsToFloat(uf_remappedPS[0].x));
PS1f = exp2(R127f.z);
// 4
R0f.x = PS1f;
PS0f = exp2(R127f.w);
// 5
R0f.y = PS0f;
PS1f = exp2(R127f.x);
// 6
R0f.z = PS1f;
// export
#if $ultrawideHUD == 1
bool isOutsideEdges = (passParameterSem0.x > (aspectRatio/2.0f)*1.0f) && (passParameterSem0.x < ((aspectRatio/2.0f)*3.0f));
passPixelColor0 = vec4(isOutsideEdges ? R0f.x : 0.0, isOutsideEdges ? R0f.y : 0.0, isOutsideEdges ? R0f.z : 0.0, isOutsideEdges ? R0f.w : 0.0);
#else
passPixelColor0 = vec4(R0f.x, R0f.y, R0f.z, R0f.w);
#endif
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Graphics name = Graphics
path = "The Legend of Zelda: Breath of the Wild/Graphics" path = "The Legend of Zelda: Breath of the Wild/Graphics"
description = Allows you to change the game resolution, shadow resolution and anti-aliasing.||Made by Kiri, Skalfate, rajkosto and NAVras. description = Allows you to change the game resolution, shadow resolution and anti-aliasing.||Made by Kiri, Skalfate, rajkosto and NAVras.
version = 6 version = 7
[Default] [Default]
$width = 1280 $width = 1280
@ -12,12 +12,18 @@ $gameWidth = 1280
$gameHeight = 720 $gameHeight = 720
$aspectRatioWidth = 16 $aspectRatioWidth = 16
$aspectRatioHeight = 9 $aspectRatioHeight = 9
$ultrawideHUD:int = 0
$fxaa:int = 1 $fxaa:int = 1
$shadowRes = 1 $shadowRes = 1
$subPix:int = 1.0 $subPix:int = 1.0
$edgeThreshold:int = 0.125 $edgeThreshold:int = 0.125
$edgeThresholdMin:int = 0.0156 $edgeThresholdMin:int = 0.0156
$shadowNearbyStart = 1.0 # the starting distance should be kept at 1.0
$shadowNearbyEnd = 1.0
$shadowFarStart = 1.0
$shadowFarEnd = 1.0
# Aspect Ratio # Aspect Ratio
@ -36,24 +42,28 @@ name = 21:9
category = Aspect Ratio category = Aspect Ratio
$aspectRatioWidth = 21 $aspectRatioWidth = 21
$aspectRatioHeight = 9 $aspectRatioHeight = 9
$ultrawideHUD:int = 1
[Preset] [Preset]
name = 32:9 name = 32:9
category = Aspect Ratio category = Aspect Ratio
$aspectRatioWidth = 32 $aspectRatioWidth = 32
$aspectRatioHeight = 9 $aspectRatioHeight = 9
$ultrawideHUD:int = 1
[Preset] [Preset]
name = 32:10 name = 32:10
category = Aspect Ratio category = Aspect Ratio
$aspectRatioWidth = 32 $aspectRatioWidth = 32
$aspectRatioHeight = 10 $aspectRatioHeight = 10
$ultrawideHUD:int = 1
[Preset] [Preset]
name = 48:9 name = 48:9
category = Aspect Ratio category = Aspect Ratio
$aspectRatioWidth = 48 $aspectRatioWidth = 48
$aspectRatioHeight = 9 $aspectRatioHeight = 9
$ultrawideHUD:int = 1
[Preset] [Preset]
name = 4:3 name = 4:3
@ -427,6 +437,47 @@ name = Extreme (400%, Unstable)
category = Shadows category = Shadows
$shadowRes = 4 $shadowRes = 4
[Preset]
category = Shadow Draw Distance
name = Low (Low Draw Distance, Sharp Shadows)
$shadowNearbyEnd = 0.6
$shadowFarStart = 0.6
$shadowFarEnd = 0.75
[Preset]
name = Medium (Lower Draw Distance, Sharper Shadows)
category = Shadow Draw Distance
$shadowNearbyEnd = 0.8
$shadowFarStart = 0.8
$shadowFarEnd = 0.9
[Preset]
name = High (Default)
category = Shadow Draw Distance
default = 1
[Preset]
name = Very High (Recommended)
category = Shadow Draw Distance
$shadowNearbyEnd = 1.25
$shadowFarStart = 1.25
$shadowFarEnd = 1.30
[Preset]
name = Ultra (Higher Draw Distance, Slightly Blurrier Shadows)
category = Shadow Draw Distance
$shadowNearbyEnd = 1.3
$shadowFarStart = 1.3
$shadowFarEnd = 1.5
[Preset]
name = Extreme (Higher Draw Distance, Blurry Shadows)
category = Shadow Draw Distance
$shadowNearbyEnd = 1.4
$shadowFarStart = 1.4
$shadowFarEnd = 1.55
# All 720p textures: # All 720p textures:
# - 0x001=World Lighting Red8 # - 0x001=World Lighting Red8
# - 0x005=Link and Objects Depth # - 0x005=Link and Objects Depth

View File

@ -41,3 +41,10 @@ blr
0x0313A60C = bla _setObjectDrawDistanceDivider 0x0313A60C = bla _setObjectDrawDistanceDivider
0x0313A678 = bla _setObjectDrawDistanceDivider 0x0313A678 = bla _setObjectDrawDistanceDivider
; Tree billboard draw distance
; either one of these actually do stuff
0x102E94D8 = .float $tree
0x102BC438 = .float $tree

View File

@ -2,12 +2,13 @@
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Draw Distance name = Draw Distance
path = "The Legend of Zelda: Breath of the Wild/Mods/Draw Distance" path = "The Legend of Zelda: Breath of the Wild/Mods/Draw Distance"
description = Extend the draw distance of objects and entities in the game, which will see a small performance decrease when making it higher. Lowering this will not offer more performance.|You can also make distant textures appear as higher resolution variants.||Made By Crementif. description = Extend the draw distance of objects and entities in the game, which will see a small performance decrease when making it higher.|Lowering this will not offer more performance.|You can also make distant textures appear as higher resolution variants.||Made By Crementif.
version = 6 version = 6
[Default] [Default]
$actor = 1.0 $actor = 1.0
$object = 1.0 $object = 1.0
$tree = 1.0
$textureLODBias:int = 0 $textureLODBias:int = 0
@ -46,38 +47,73 @@ $actor = 2
# Objects Draw Distance # Objects Draw Distance
[Preset] # People ran into issues with events spawning
name = Potato (0.2x) # [Preset]
category = Trees, Bushes, Landscape And Other Objects # name = Potato (0.2x)
$object = 0.2 # category = Terrain, Buildings, Bushes And Other Objects
# $object = 0.2
[Preset] #
name = Very Low (0.5x) # [Preset]
category = Trees, Bushes, Landscape And Other Objects # name = Very Low (0.5x)
$object = 0.5 # category = Terrain, Buildings, Bushes And Other Objects
# $object = 0.5
[Preset] [Preset]
name = Low (0.75x) name = Low (0.75x)
category = Trees, Bushes, Landscape And Other Objects category = Terrain, Buildings, Bushes And Other Objects
$object = 0.75 $object = 0.75
[Preset] [Preset]
name = Medium (1x) name = Medium (1x)
category = Trees, Bushes, Landscape And Other Objects category = Terrain, Buildings, Bushes And Other Objects
default = 1 default = 1
$object = 1.0 $object = 1.0
[Preset] [Preset]
name = High (1.25x) name = High (1.25x)
category = Trees, Bushes, Landscape And Other Objects category = Terrain, Buildings, Bushes And Other Objects
$object = 1.25 $object = 1.25
[Preset] [Preset]
name = Ultra (1.5x, requires Extended Memory pack!) name = Ultra (1.5x, requires Extended Memory pack!)
category = Trees, Bushes, Landscape And Other Objects category = Terrain, Buildings, Bushes And Other Objects
$object = 1.5 $object = 1.5
# Tree Billboard Draw Distance
[Preset]
name = Potato
category = Trees (2D Billboards)
$tree = 1.5
[Preset]
name = Low
category = Trees (2D Billboards)
$tree = 1.25
[Preset]
name = Medium (Default)
category = Trees (2D Billboards)
default = 1
$tree = 1.0
[Preset]
name = High
category = Trees (2D Billboards)
$tree = 0.66
[Preset]
name = Ultra
category = Trees (2D Billboards)
$tree = 0.33
[Preset]
name = Extreme
category = Trees (2D Billboards)
$tree = 0.05
# Texture LOD Bias # Texture LOD Bias
[Preset] [Preset]

View File

@ -2,3 +2,5 @@ Since this work isn't wholly mine anymore I feel it needs a readme.
Thanks to the contributors Crementif and epigramx and as always rajkosto for the input early on and for making it possible to begin with. Also thanks to the Cemu dev team for creating such a fun emulator. They recently added a debugger to aid in projects like this and I can't wait to try it out. Thanks to the contributors Crementif and epigramx and as always rajkosto for the input early on and for making it possible to begin with. Also thanks to the Cemu dev team for creating such a fun emulator. They recently added a debugger to aid in projects like this and I can't wait to try it out.
Credits for the arrow fix go to epigramx and the initial porting of it to FPS++ by Crementif. It's always nice to see people contribute to make something better. I fully welcome others messing around with this and have added comments to all the original code in hope that it is easier to understand. But I suck at comments as much as I suck at code. If you have questions about patching feel free to ask me on Discord. I would like to avoid situations where a whole bunch of lines are copy pasted into FPS++, where 90% of them don't do anything, claiming it fixes things it doesn't. And fragmenting the user base with regards to which FPS++ they should use. Credits for the arrow fix go to epigramx and the initial porting of it to FPS++ by Crementif. It's always nice to see people contribute to make something better. I fully welcome others messing around with this and have added comments to all the original code in hope that it is easier to understand. But I suck at comments as much as I suck at code. If you have questions about patching feel free to ask me on Discord. I would like to avoid situations where a whole bunch of lines are copy pasted into FPS++, where 90% of them don't do anything, claiming it fixes things it doesn't. And fragmenting the user base with regards to which FPS++ they should use.
To clarify the statement above, we don't give permission for redistributing FPS++ **or parts of it** in any form unless it's done with explicit permission.

View File

@ -1,96 +1,267 @@
[BotW_ControllerScrollSpeed_V208] [BotW_ControllerScrollSpeed_V208]
moduleMatches = 0x6267BFD0 moduleMatches = 0x6267BFD0
.origin = codecave .origin = codecave
0x03053bd4 = blr ; disable scroll speed adjustment (would require a bigger rewrite for dynamic FPS support)
0x030BD694 = ba _ZN4sead14ControllerBase23updateDerivativeParams_Ejj ; redirect to our re-implementation
const_roundUpModifier: 0x10327D60 = scrollSpeed:
.float $roundUpModifier ; .float 1.0
_ZN4sead14ControllerBase21createStickCrossMask_Ev:
averageFPS1IntInvIgnore: stwu r1,-16(r1)
.int 0 stw r31,12(r1)
averageFPS1IntInvValue: mr r31,r1
.int 1 lwz r10,252(r3)
li r9,0
disableFastScrolling: cmpwi r10,0
.int 0 BLT _87c9cb495aa50099_L2
li r9,15
; The game initializes two tables for intial and repeated delay. One entry for each button (up to 32). Counts in frames. slw r9,r9,r10
; This is a very imperfect fix, which is why it's an opt-in fix that's even then only enabled for those that are above 60FPS in the menus. _87c9cb495aa50099_L2:
lwz r8,256(r3)
; This calculates dynamic FPS system. cmpwi r8,0
_calculateAverageFPSInt: BLT _87c9cb495aa50099_L3
lis r8, averageFPS1@ha li r10,15
lfs f0, averageFPS1@l(r8) slw r10,r10,r8
lis r8, const_roundUpModifier@ha or r9,r9,r10
lfs f13, const_roundUpModifier@l(r8) _87c9cb495aa50099_L3:
fadds f0, f0, f13 mr r3,r9
fctiwz f0, f0 addi r11,r31,16
lis r8, averageFPS1IntInvIgnore@ha lwz r31,-4(r11)
stfd f0, averageFPS1IntInvIgnore@l(r8) mr r1,r11
li r8, 0
lis r10, disableFastScrolling@ha
stw r8, disableFastScrolling@l(r10)
lis r8, averageFPS1IntInvValue@ha
lwz r10, averageFPS1IntInvValue@l(r8)
cmpwi r10, $cursorFixAbove
ble disabledFix
lis r8, averageFPS1IntInvValue@ha
stw r10, averageFPS1IntInvValue@l(r8)
li r8, 1
lis r10, disableFastScrolling@ha
stw r8, disableFastScrolling@l(r10)
add r8, r29, r6
blr blr
_ZN4sead14ControllerBase23updateDerivativeParams_Ejj:
disabledFix: stwu r1,-128(r1)
li r8, 1 mflr r0
lis r10, averageFPS1IntInvValue@ha stw r0,132(r1)
stw r8, averageFPS1IntInvValue@l(r10) stfd f30,112(r1)
add r8, r29, r6 stfd f31,120(r1)
blr stw r19,60(r1)
stw r20,64(r1)
_scaleRepeatInputDelay: stw r21,68(r1)
lis r7, averageFPS1IntInvValue@ha stw r22,72(r1)
lwz r7, averageFPS1IntInvValue@l(r7) stw r23,76(r1)
lbz r10, 0xC8(r8) ; read repeat delay (in frames) from table stw r24,80(r1)
mullw r10, r10, r7 stw r25,84(r1)
blr stw r26,88(r1)
stw r27,92(r1)
_scaleInitialInputDelay: stw r28,96(r1)
lis r7, averageFPS1IntInvValue@ha stw r29,100(r1)
lwz r7, averageFPS1IntInvValue@l(r7) stw r30,104(r1)
lbz r8, 0xA8(r4) ; read initial delay (in frames) from table stw r31,108(r1)
mullw r8, r8, r7 mr r31,r1
lwzx r7, r9, r11 mr r30,r3
blr mr r29,r4
mr r24,r5
; Patch sead::ControllerBase::updateDerivativeParams_ lwz r6,252(r3)
0x030BD76C = bla _calculateAverageFPSInt
0x030bd770 = bla _scaleRepeatInputDelay
0x030BD77C = nop
0x030bd784 = bla _scaleInitialInputDelay
; Disable fast scrolling function
_disableFastScrolling:
lis r12, disableFastScrolling@ha
lwz r10, disableFastScrolling@l(r12)
cmpwi r10, 1
beq disableFastScrollingPath
lis r12, 4
addi r12, r12, 0x68C
cmpwi r6,0 cmpwi r6,0
add r12, r3, r12 BLT _87c9cb495aa50099_L7
addi r5,r30,280
lfs f1,232(r30)
lfs f2,240(r30)
lis r9,0x30b
ori r9,r9,53900
mtctr r9
bctrl
mr r28,r3
lwz r6,256(r30)
cmpwi r6,0
BLT _87c9cb495aa50099_L8
_87c9cb495aa50099_L25:
mr r3,r30
mr r4,r29
addi r5,r30,288
lfs f1,236(r30)
lfs f2,244(r30)
lis r9,0x30b
ori r9,r9,53900
mtctr r9
bctrl
or r28,r28,r3
lwz r8,252(r30)
li r9,0
cmpwi r8,0
BLT _87c9cb495aa50099_L9
_87c9cb495aa50099_L23:
li r10,15
slw r9,r10,r8
_87c9cb495aa50099_L9:
lwz r8,256(r30)
cmpwi r8,0
BLT _87c9cb495aa50099_L10
li r10,15
slw r10,r10,r8
or r9,r9,r10
.align 4
_87c9cb495aa50099_L10:
lwz r10,268(r30)
andc r10,r10,r9
or r9,r10,r28
stw r9,268(r30)
andc r10,r29,r9
stw r10,4(r30)
andc r9,r9,r29
stw r9,0(r30)
li r9,0
stw r9,8(r30)
lis r9,averageFPS30@ha
lfs f31,averageFPS30@l(r9)
lis r9,scrollSpeed@ha
lfs f30,scrollSpeed@l(r9)
lwz r9,248(r30)
cmpwi r9,0
BEQ _87c9cb495aa50099_L11
addi r27,r30,199
addi r28,r30,104
li r29,0
lis r23,_87c9cb495aa50099_LC0@ha
lis r26,_87c9cb495aa50099_LC1@ha
li r21,1
li r25,0
_87c9cb495aa50099_L18:
lbzu r8,1(r27)
lbz r10,-32(r27)
lwz r9,268(r30)
srw r9,r9,r29
andi. r7,r9,1
BNE cr0, _87c9cb495aa50099_L12
sth r25,-64(r28)
sth r25,0(r28)
b _87c9cb495aa50099_L13
_87c9cb495aa50099_L12:
mr r20,r28
lfs f0,_87c9cb495aa50099_LC0@l(r23)
fdivs f0,f0,f31
fmuls f0,f0,f30
lfs f12,_87c9cb495aa50099_LC1@l(r26)
fcmpu f0,f12
cror 30,29,30
BEQ _87c9cb495aa50099_L14
fctiwz f0,f0
stfd f0,8(r31)
lwz r7,12(r31)
b _87c9cb495aa50099_L15
_87c9cb495aa50099_L14:
lfs f12,_87c9cb495aa50099_LC1@l(r26)
fsubs f0,f0,f12
fctiwz f0,f0
stfd f0,16(r31)
lwz r7,20(r31)
addis r7,r7,0x8000
_87c9cb495aa50099_L15:
lhz r9,0(r20)
add r9,r7,r9
rlwinm r9, r9, 0, 16, 31
cmplwi r9,1091
BGT _87c9cb495aa50099_L16
sth r9,0(r20)
b _87c9cb495aa50099_L13
_87c9cb495aa50099_L16:
addi r9,r9,-1092
sth r9,0(r20)
lhz r19,-64(r20)
cmpwi r8,0
BEQ _87c9cb495aa50099_L17
cmplw r10,r19
BGT _87c9cb495aa50099_L17
subf r10,r10,r19
divwu r9,r10,r8
mullw r8,r9,r8
cmpw r10,r8
BNE _87c9cb495aa50099_L17
slw r9,r21,r29
lwz r10,8(r30)
or r9,r10,r9
stw r9,8(r30)
_87c9cb495aa50099_L17:
addi r19,r19,1
sth r19,-64(r20)
_87c9cb495aa50099_L13:
addi r29,r29,1
addi r28,r28,2
lwz r9,248(r30)
cmpw r29,r9
BLT _87c9cb495aa50099_L18
_87c9cb495aa50099_L11:
cmpwi r24,0
BNE _87c9cb495aa50099_L19
lwz r9,12(r30)
andi. r8,r9,1
BEQ cr0, _87c9cb495aa50099_L20
rlwinm r9,r9,0,30,28
ori r9,r9,2
stw r9,12(r30)
b _87c9cb495aa50099_L21
_87c9cb495aa50099_L24:
ori r10,r10,4
stw r10,12(r30)
lfs f0,272(r30)
fctiwz f0,f0
stfd f0,24(r31)
lwz r9,28(r31)
stw r9,16(r30)
lfs f0,276(r30)
fctiwz f0,f0
stfd f0,32(r31)
lwz r9,36(r31)
stw r9,20(r30)
b _87c9cb495aa50099_L6
_87c9cb495aa50099_L20:
li r9,0
stw r9,12(r30)
_87c9cb495aa50099_L21:
lfs f0,272(r30)
fctiwz f0,f0
stfd f0,40(r31)
lwz r9,44(r31)
stw r9,16(r30)
lfs f0,276(r30)
fctiwz f0,f0
stfd f0,48(r31)
lwz r9,52(r31)
stw r9,20(r30)
b _87c9cb495aa50099_L6
_87c9cb495aa50099_L8:
lwz r8,252(r30)
li r9,0
cmpwi r8,0
BLT _87c9cb495aa50099_L10
b _87c9cb495aa50099_L23
_87c9cb495aa50099_L19:
lwz r9,12(r30)
rlwinm r10,r9,0,31,29
andi. r7,r9,1
BNE cr0, _87c9cb495aa50099_L20
b _87c9cb495aa50099_L24
_87c9cb495aa50099_L7:
lwz r6,256(r3)
li r28,0
li r9,0
cmpwi r6,0
BLT _87c9cb495aa50099_L10
b _87c9cb495aa50099_L25
_87c9cb495aa50099_L6:
addi r11,r31,128
lwz r0,4(r11)
mtlr r0
lwz r19,-68(r11)
lwz r20,-64(r11)
lwz r21,-60(r11)
lwz r22,-56(r11)
lwz r23,-52(r11)
lwz r24,-48(r11)
lwz r25,-44(r11)
lwz r26,-40(r11)
lwz r27,-36(r11)
lwz r28,-32(r11)
lwz r29,-28(r11)
lwz r30,-24(r11)
lwz r31,-20(r11)
lfd f30,-16(r11)
lfd f31,-8(r11)
mr r1,r11
blr blr
_87c9cb495aa50099_LC0:
disableFastScrollingPath: .int 1191182336
mtlr r9 _87c9cb495aa50099_LC1:
blr .int 1325400064
0x03053AF8 = mflr r9
0x03053AFC = bla _disableFastScrolling
0x03053B00 = mtlr r9
0x03053B04 = nop

View File

@ -0,0 +1,211 @@
[BotW_Cutscene_V208]
moduleMatches = 0x6267BFD0
.origin = codecave
cutsceneMode:
.int $cutsceneFPSLimitMode
lastCutsceneId:
.int 0
cutsceneFPSLimit:
.float 0
_setCutsceneFPSLimit:
stw r0, 4(r31) ; Original instruction
; Register r9 still holds the ID of this cutscene
; Register r29 is the parameter structure that this object is created with which also holds the event name
lwz r12, 8(r29)
; Check if the event name is not 0
cmpwi r12, 0
beqlr
; Check if the to-be-created event is a cutscene by checking if the event name starts with *emo
lbz r3, 1(r12)
cmpwi r3, 0x65 ; e
bnelr
lbz r3, 2(r12)
cmpwi r3, 0x6D ; m
bnelr
lbz r3, 3(r12)
cmpwi r3, 0x6F ; o
bnelr
; Enforce cutscene mode settings
lis r3, cutsceneMode@ha
lwz r3, cutsceneMode@l(r3)
cmpwi r3, 0
beqlr
cmpwi r3, 2
beq _setCutscene60FPSLimit
cmpwi r3, 3
beq _setCutscene30FPSLimit
; Load each digit of the "Demo000_0" string pointer in the params, then add the numbers together
li r22, 0
lbz r3, 4(r12)
addi r3, r3, -0x30
mulli r3, r3, 1000
add r22, r22, r3
lbz r3, 5(r12)
addi r3, r3, -0x30
mulli r3, r3, 100
add r22, r22, r3
lbz r3, 6(r12)
addi r3, r3, -0x30
mulli r3, r3, 10
add r22, r22, r3
lbz r3, 8(r12)
addi r3, r3, -0x30
mulli r3, r3, 1
add r22, r22, r3
cmpwi r22, 3480 ; demo348_0 ; Could be part of the crash at the Rito Village bridge
beq _setCutscene30FPSLimit
cmpwi r22, 3481 ; demo348_1 ; Crash at the Rito Village bridge
beq _setCutscene30FPSLimit
cmpwi r22, 1620 ; demo162_0 ; Perhaps the crash at the end of vah ruta
beq _setCutscene30FPSLimit
cmpwi r22, 1630 ; demo163_0 ; Perhaps the crash at the end of vah ruta
beq _setCutscene30FPSLimit
cmpwi r22, 3340 ; demo334_0 ; Perhaps the crash at the end of vah ruta
beq _setCutscene30FPSLimit
; A bunch of divine beast enter and exit events. Could definitely be narrowed down in the future.
cmpwi r22, 1110 ; demo110_0
beq _setCutscene30FPSLimit
cmpwi r22, 1110 ; demo111_0
beq _setCutscene30FPSLimit
cmpwi r22, 1120 ; demo112_0
beq _setCutscene30FPSLimit
cmpwi r22, 1130 ; demo113_0
beq _setCutscene30FPSLimit
cmpwi r22, 1140 ; demo114_0
beq _setCutscene30FPSLimit
cmpwi r22, 1150 ; demo115_0
beq _setCutscene30FPSLimit
cmpwi r22, 1160 ; demo116_0
beq _setCutscene30FPSLimit
cmpwi r22, 1170 ; demo117_0
beq _setCutscene30FPSLimit
cmpwi r22, 1180 ; demo118_0
beq _setCutscene30FPSLimit
cmpwi r22, 1190 ; demo119_0
beq _setCutscene30FPSLimit
cmpwi r22, 1200 ; demo120_0
beq _setCutscene30FPSLimit
cmpwi r22, 1210 ; demo121_0
beq _setCutscene30FPSLimit
cmpwi r22, 1220 ; demo122_0
beq _setCutscene30FPSLimit
cmpwi r22, 1230 ; demo123_0
beq _setCutscene30FPSLimit
cmpwi r22, 1240 ; demo124_0
beq _setCutscene30FPSLimit
cmpwi r22, 1250 ; demo125_0
beq _setCutscene30FPSLimit
blr
; 30FPS limit case
_setCutscene30FPSLimit:
lis r3, const_30@ha
lfs f10, const_30@l(r3)
b _returnWithCutsceneFPSLimit
; 60FPS limit case
_setCutscene60FPSLimit:
lis r3, const_60@ha
lfs f10, const_60@l(r3)
b _returnWithCutsceneFPSLimit
_returnWithCutsceneFPSLimit:
lis r3, lastCutsceneId@ha
stw r9, lastCutsceneId@l(r3)
lis r3, cutsceneFPSLimit@ha
stfs f10, cutsceneFPSLimit@l(r3)
blr
_removeCutsceneFPSLimit:
lwz r11, 0x27C(r30) ; Original instruction
lwz r9, 0x274(r30)
lis r8, lastCutsceneId@ha
lwz r8, lastCutsceneId@l(r8)
cmpw r9, r8
bnelr
lis r8, const_0.0@ha
lfs f10, const_0.0@l(r8)
lis r8, cutsceneFPSLimit@ha
stfs f10, cutsceneFPSLimit@l(r8)
blr
; Check if a cutscene is ongoing with a set FPS limit
_checkCutsceneFPSLimit:
lis r11, const_0.0@ha
lfs f7, const_0.0@l(r11)
lis r11, cutsceneFPSLimit@ha
lfs f12, cutsceneFPSLimit@l(r11)
fcmpu cr0, f12, f7
beq _calculateDynamicFPS
; If a cutscene FPS limit is set, lower FPS
_lowerCutsceneFPS:
; Calculate how many ticks a frame has to take to render at the given FPS limit
lis r11, const_1@ha
lfs f7, const_1@l(r11)
fdivs f12, f7, f12
lis r11, timerTickSpeed@ha
lfs f7, timerTickSpeed@l(r11)
fmuls f12, f7, f12
; Subtract the time that it took for the actual frame to render and make sure that it's not negative (which means a frame already took longer to render then the FPS limit)
fsubs f12, f12, f10
lis r12, const_0.0@ha
lfs f7, const_0.0@l(r12)
fcmpu cr0, f7, f12
ble .+0x8
fmr f12, f7
; Convert the remaining ticks that should be spend idling to an integer (but it requires storing it in memory)
fctiwz f12, f12
lis r11, floatConvHa@ha
stfd f12, floatConvHa@l(r11)
; Load the converted integer ticks and sleep for the given amount of time
mr r12, r4
li r3, 0
lis r11, floatConvL@ha
lwz r4, floatConvL@l(r11)
mflr r11
bl import.coreinit.OSSleepTicks
mtlr r11
mr r4, r12
lis r11, cutsceneFPSLimit@ha
lfs f10, cutsceneFPSLimit@l(r11)
; Skip dynamic FPS code when cutscene FPS limit is in place since the game should always run at 30FPS
b _setGamespeed
; Hook evt::EventFlowBase's ctor (event object creation)
0x031D2D2C = bla _setCutsceneFPSLimit
; Hook evt::EventFlowBase's dtor (event object destruction)
0x031D3798 = bla _removeCutsceneFPSLimit

View File

@ -16,7 +16,10 @@ const_1.5:
.float 1.5 .float 1.5
const_30: const_30:
.float 30 .float 30
const_60:
.float 60
timerTickSpeed:
busSpeed: busSpeed:
.float 62156250 .float 62156250
@ -24,17 +27,16 @@ convSub:
.uint 0x43300000 .uint 0x43300000
.uint 0x80000000 .uint 0x80000000
floatConv:
floatConvHa:
.uint 0
floatConvL:
.uint 0
# Variables # Variables
; Cemu doesn't parse the variables correctly until it saves all the settings. This is just a temporary test of a workaround to make it work.
; To change this workaround back, change the lines from
; ($advancedMode * $fpsLimitAdvanced) + ((($advancedMode+1) % 2) * $fpsLimitNormal)
; to
; $fpsLimit
fpsLimit: fpsLimit:
.float (($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal) .float $fpsLimit
lowFPSLimit: lowFPSLimit:
.float $lowFPSLimit .float $lowFPSLimit
@ -43,45 +45,42 @@ bufferSizeDivider:
.float $frameAverageAmount .float $frameAverageAmount
averageFPS30: averageFPS30:
.float (($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal) .float $fpsLimit
averageFPS30Inv: averageFPS30Inv:
.float 900/((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal)) .float 900/$fpsLimit
averageFPS1.5: averageFPS1.5:
.float (1.5*((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal)))/30 .float (1.5*$fpsLimit)/30
averageFPS1.5Inv: averageFPS1.5Inv:
.float 45/((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal)) .float 45/$fpsLimit
averageFPS1: averageFPS1:
.float ((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal))/30 .float $fpsLimit/30
averageFPS1Inv: averageFPS1Inv:
.float 30/((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal)) .float 30/$fpsLimit
averageFPS0.5: averageFPS0.5:
.float ((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal))/60 .float $fpsLimit/60
averageFPS0.5Inv: averageFPS0.5Inv:
.float 30/(2*((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal))) .float 30/(2*$fpsLimit)
averageSum: averageSum:
.float ((($advancedMode == 0) * $fpsLimitAdvanced) + (($advancedMode == 1) * $fpsLimitNormal))*$frameAverageAmount .float $fpsLimit*$frameAverageAmount
initBuffer: buffer:
.byte 0 .float 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; buffer can only store a max length of 32 frames
bufferStart: bufferIndex:
.ptr 0xDC .int 0
bufferCurrEntry: bufferIndexEnd:
.ptr 0xDC .int (4*$frameAverageAmount)
bufferEnd: ; Useful for trying potential FPS values. Need to set debugMode = 1 to enable the debugging options in the graphic pack selection and code.
.ptr 0xDC+(4*$frameAverageAmount)
; Useful for trying potential FPS values. Need to set debugMode = 1 to enable the debugging in the interface and code.
debugAddr: debugAddr:
.ptr 0x00000000 .ptr 0x00000000
@ -94,13 +93,15 @@ debugMultiplier:
_calculateGamespeed: _calculateGamespeed:
stw r0, 0x78(r30) ; Execute original instruction that got replaced with a jump to this function stw r0, 0x78(r30) ; Execute original instruction that got replaced with a jump to this function
; If static FPS is enabled, always set currently "running" FPS to $fpsLimit ; Check and set the cursor speed value if it has been set by the Menu Cursor Speed graphic pack
li r3, $staticFPSMode ; Load the $staticFPSMode setting into r3 _checkCursorSpeed:
cmpwi r3, 1 ; Compare with 1, which is when it's enabled lis r11, const_0.0@ha ; Load a 0 float...
bne _checkExternalSpeed ; If the comparison is not equal, run lfs f12, const_0.0@l(r11) ; ...into f12
lis r3, fpsLimit@ha ; Load current FPS limit... lfs f7, 0xD4(r30) ; Load the external cursor speed offset
lfs f10, fpsLimit@l(r3) ; ...into f10 fcmpu cr0, f7, f12 ; Compare the value stored in the external memory offset to 0 (f12)
b _setGamespeed ; Skip dynamic FPS code when static mode is enabled and go to the game speed setting code beq _convertTicksToFrametime ; Don't change the value if the menu cursor speed isn't manually set
lis r3, scrollSpeed@ha ; Load the address of the scrollSpeed from the cutscene patch...
stfs f7, scrollSpeed@l(r3) ; ...and then store the external cursor speed from f7 into that address
; If the manual speed has been set by an external program to something other then 0, use that as the static speed ; If the manual speed has been set by an external program to something other then 0, use that as the static speed
_checkExternalSpeed: _checkExternalSpeed:
@ -108,71 +109,68 @@ lis r11, const_0.0@ha ; Load a 0 float...
lfs f12, const_0.0@l(r11) ; ...into f12 lfs f12, const_0.0@l(r11) ; ...into f12
lfs f10, 0xD0(r30) ; Load the external speed offset lfs f10, 0xD0(r30) ; Load the external speed offset
fcmpu cr0, f10, f12 ; Compare the value stored in the external memory offset to 0 (f12) fcmpu cr0, f10, f12 ; Compare the value stored in the external memory offset to 0 (f12)
beq _calculateDynamicFPS ; Compare the bne _setGamespeed
b _setGamespeed
; If static FPS is enabled, always set currently "running" FPS to $fpsLimit
_checkStaticFPS:
li r3, $staticFPSMode ; Load the $staticFPSMode setting into r3
cmpwi r3, 1 ; Compare with 1, which is when it's enabled
bne _calcAverageFPS ; If the comparison is not equal, run
lis r3, fpsLimit@ha ; Load current FPS limit...
lfs f10, fpsLimit@l(r3) ; ...into f10
b _setGamespeed ; Skip dynamic FPS code when static mode is enabled and go to the game speed setting code
; Calculate speed of current frame (FPS). It's calculated by using the ticks between the previous frame and now, which is stored in r12, and the amount of ticks that the Wii U executes in a second (the bus speed).
_convertTicksToFrametime:
xoris r12, r12, 0x8000 ; Flip the sign bit of int ticks for floating point conversion
lis r11, floatConv@ha ; Load upper half of the int to float address to then...
stw r12, floatConv@l+0x4(r11) ; ...store sign flipped ticks in memory as lower half of double
lis r12, 0x4330 ; Create upper half of ticks double
stw r12, floatConv@l+0x0(r11) ; Store it in upper half of memory
lfd f10, floatConv@l+0x0(r11) ; Load full double ticks into f10
lis r12, convSub@ha ; Load number required to convert the raw integer...
lfd f12, convSub@l(r12) ; ... to an actual ticks float into f12
fsub f10, f10, f12 ; Do the subtraction that changes the integer representation to a float representation of the tick number
frsp f10, f10 ; Round the ticks to single precision and store the ticks back to f10
; Call externalized cutscene FPS function which will return to checkExternalSpeed
b _checkCutsceneFPSLimit
; Calculate speed of current frame (FPS). It's calculated by using the ticks between the previous frame and now, which is stored in r12, and the amount of ticks that the Wii U executes in a second (the bus speed). ; Calculate speed of current frame (FPS). It's calculated by using the ticks between the previous frame and now, which is stored in r12, and the amount of ticks that the Wii U executes in a second (the bus speed).
_calculateDynamicFPS: _calculateDynamicFPS:
xoris r12, r12, 0x8000 ; Flip the sign bit of int ticks for floating point conversion
stw r12, 0xD8(r30) ; Store sign flipped ticks in memory as lower half of double
lis r12, 0x4330 ; Create upper half of ticks double
stw r12, 0xD4(r30) ; Store it in upper half of memory
lfd f10, 0xD4(r30) ; Load full double ticks into f10
lis r12, convSub@ha ; Load number to subtract from tick double...
lfd f12, convSub@l(r12) ; ...to create tick float into f12
fsub f10, f10, f12 ; Do the subtraction
frsp f10, f10 ; Round to single precision and tick float is in f10
lis r12, const_1@ha ; Load float of 1... lis r12, const_1@ha ; Load float of 1...
lfs f12, const_1@l(r12) ; ...into f12 lfs f12, const_1@l(r12) ; ...into f12
fdivs f10, f12, f10 ; Divide 1 by ticks fdivs f10, f12, f10 ; Divide 1 by ticks
lis r12, busSpeed@ha ; Load wii u bus speed... lis r12, timerTickSpeed@ha ; Load wii u bus speed...
lfs f12, busSpeed@l(r12) ; ...into f12 lfs f12, timerTickSpeed@l(r12) ; ...into f12
fmuls f10, f12, f10 ; Multiply bus speed to have current fps in f10. (1/ticks)*bus speed fmuls f10, f12, f10 ; Multiply bus speed to have current fps in f10. (1/ticks)*bus speed
; Initialize the circular buffer with default values whenever a setting gets changed
_initializeAverageBuffer:
lis r12, initBuffer@ha ; Load the initBuffer variable to see whether the buffer has to be initialized/reset again
lbz r11, initBuffer@l(r12) ; ...to check whether/what the current buffer settings are
cmpwi r11, 1 ; Compare the previously $frameAverageAmount with the current $frameAverageAmount
beq _calcAverageFPS ; Continue to calulating the average FPS if the previous settings are the same as the permanently set settings
li r11, 1 ; Load "1" into r11
stb r11, initBuffer@l(r12) ; Store that 1 into the initBuffer so that it will only initialize this once
lis r12, fpsLimit@ha ; Load current FPS limit...
lfs f10, fpsLimit@l(r12) ; ...into f10
lis r12, bufferStart@ha ; Load offset to the start of the averaging buffer...
lwz r12, bufferStart@l(r12) ; ...into r12
lis r3, bufferEnd@ha ; Load offset to the end of the averaging buffer...
lwz r3, bufferEnd@l(r3) ; ...into r3
add r11, r12, r30 ; Make full offset by adding r30 (the empty buffer offset) to r12, which is the buffer offset.
stfs f10, 0x0(r11) ; Store f10 to the address in r12 + 0x04 using this specific instruction, which also adds the 0x04 to r12
addi r12, r12, 0x04 ; Add 0x04 to the buffer offset to make the next entry offset
cmpw r12, r3 ; Compare the current address offset in r12 with the address offset in r3
ble .-0x10 ; Loop back until the whole buffer is initialized with the value from f12
; Calculate the rolling average FPS over the last N amount of frames which are stored in the circular buffer ; Calculate the rolling average FPS over the last N amount of frames which are stored in the circular buffer
_calcAverageFPS: _calcAverageFPS:
lis r3, bufferCurrEntry@ha ; Load the offset to the current value lis r3, averageSum@ha ; Load the current average sum
lwz r12, bufferCurrEntry@l(r3) ; Load the current buffer offset lfs f7, averageSum@l(r3) ; ...into f7
lis r11, averageSum@ha ; Load the current average sum lis r11, buffer@ha ; Load the address of buffer...
lfs f7, averageSum@l(r11) ; ...into f7 addi r11, r11, buffer@l ; ...into r11 for later
lis r12, bufferIndex@ha ; Load the offset to the current value
lwz r12, bufferIndex@l(r12) ; Load the current buffer offset
add r3, r12, r30 ; Add r12 to r30 to create the whole offset, since Cemu's assembly doesn't support LFSX and STFX .int 0x7d8b642e ; Load the value that's stored at the current index
lfs f12, 0x0(r3) ; Load the value that's stored in the current offset ;lfsx f12, r11, r12 ; Cemu only supports the lfsx instruction on the very latest version, so use assembled instruction bytes for legacy support
fadds f7, f7, f10 ; Add the FPS from this current frame
fsubs f7, f7, f12 ; Subtract this value from the current average sum fsubs f7, f7, f12 ; Subtract this value from the current average sum
stfs f7, averageSum@l(r11) ; Store this new average sum again fadds f7, f7, f10 ; Add the FPS from this current frame
stfs f10, 0x0(r3) ; Store the FPS value from this current frame in place of the old value .int 0x7d4b652e ; Store the FPS value from this current frame in place of the old value
;stfsx f10, r11, r12 ; Cemu only supports the stfsx instruction on the very latest version, so use assembled instruction bytes for legacy support
stfs f7, averageSum@l(r3) ; Store this new average sum again
; Store the offset to the next buffer entry ; Store the offset to the next buffer entry
lis r11, bufferEnd@ha ; Load offset to the end of the averaging buffer lis r11, bufferIndexEnd@ha ; Load offset to the end of the averaging buffer
lwz r11, bufferEnd@l(r11) ; ...into r11 lwz r11, bufferIndexEnd@l(r11) ; ...into r11
addi r12, r12, 0x04 ; Add 0x04 to the current entry offset to have the next entry offset addi r12, r12, 0x04 ; Add 0x04 to the current buffer index to have the next buffer index
cmpw r11, r12 ; Compare this new entry offset to the end offset cmpw r11, r12 ; Compare this new buffer index to the end index
bgt .+0x0C ; Skip the next 2 lines if the next entry offset is smaller bgt .+0x08 ; Skip the next line if the next index is smaller then the end index
lis r12, bufferStart@ha ; Load start of the buffer offset... li r12, 0 ; Set the current index to 0 if the end of the buffer was reached
lwz r12, bufferStart@l(r12) ; ...into r12 lis r3, bufferIndex@ha ; Load current buffer index
lis r3, bufferCurrEntry@ha ; Load current buffer entry stw r12, bufferIndex@l(r3) ; ...into r12
stw r12, bufferCurrEntry@l(r3) ; ...into r12
lis r3, bufferSizeDivider@ha ; Load the buffer size divider lis r3, bufferSizeDivider@ha ; Load the buffer size divider
lfs f10, bufferSizeDivider@l(r3); ...into f10 lfs f10, bufferSizeDivider@l(r3); ...into f10

View File

@ -0,0 +1,36 @@
[BotW_KorokChasing_V208]
moduleMatches = 0x6267BFD0
.origin = codecave
; --------------------------
; This set of patches fixes the speed with which hidden Koroks (shown as sparkles on the ground) move along their path
; In unpatched state, the speed would scale directly with FPS, so at 60 FPS the Koroks would move twice as fast
_constFloatTimestepKorok:
.float 30.0
0x0348ba3c = bla _HiddenKorokMoveCalcTimestep
_HiddenKorokMoveCalcTimestep:
; replaced instruction:
; 0348ba3c fdivs f25,f27,f13
; calculates:
; f25 = 1.0 / timeStepInSeconds
; available registers: r4
lis r4, _constFloatTimestepKorok@ha
lfs f25, _constFloatTimestepKorok@lo(r4)
blr
; 0344acd8 ec 0d 58 24 fdivs f0,f13,f11
; general korok move function? maybe should be patched too?
; Hidden korok rest time is measured in frames. Normally it also counts +1.0 each frame but we use a dynamic timestep instead
0x022ac944 = bla _HiddenKorokRestActionCalcTimestep
_HiddenKorokRestActionCalcTimestep:
; replaced instruction:
; 022ac944 fadds f0,f12,f0
; available registers: r3
lis r3, averageFPS1Inv@ha
lfs f0, averageFPS1Inv@lo(r3)
fadds f0, f12, f0
blr

View File

@ -0,0 +1,42 @@
[BotW_Ragdolls_V208]
moduleMatches = 0x6267BFD0
.origin = codecave
const_ragdollTimestepA:
.float 0.03333334 ; the expected timestep at 30 FPS (1/30)
; -----------------------------
; Patch RagdollApplyForce function to always use the expected timestep of 1/30
; and disable the timestep scaling as its incorrect to scale one-frame impulses by time
; f12 is the timestep in seconds (so for 30 FPS thats 1/30 -> 0.03333)
RagdollHit_TimestepPatch1:
lis r6, const_ragdollTimestepA@ha
lfs f12, const_ragdollTimestepA@lo(r6)
blr
0x0333d350 = bla RagdollHit_TimestepPatch1 ; replaced instruction: lfs f12,0x48(r25)
; disable more timestep scaling
; 0333d80c fnmsubs f9,f9,f9,f31
0x0333d80c = fmr f9, f31
; 0333dc78 fnmsubs f9,f9,f9,f30
0x0333dc78 = fmr f9, f30
; 0333dd58 fnmsubs f9,f9,f9,f30
0x0333dd58 = fmr f9, f30
;_changeImpulsePower:
;lis r10, averageFPS1Inv@ha
;lfs f13, averageFPS1Inv@l(r10)
;lis r10, debugMultiplier@ha
;lfs f11, debugMultiplier@l(r10)
;fmuls f13, f13, f11
;fmuls f1, f1, f13
;lwz r10, 0x2C(r28)
;blr
;
;0x0333E3D0 = bla _changeImpulsePower

View File

@ -0,0 +1,49 @@
[BotW_WaterPhysics_V208]
moduleMatches = 0x6267BFD0
.origin = codecave
; turn quadratic scaling of timesteps into mostly linear scaling by setting one of the two timestep variables closer to 1.0
; this is the more correct behavior as the applied velocities also scale linearly with timestep, but not exactly due to external factors like friction (probably)
;
; fixes objects not decelerating fast enough when falling into water
; fixes object drifting speed when pushed by water currents
_constFloat1:
.float 1.0
_constTimestepDampingFactor:
.float 0.45 ; damping factor 0.0 -> linear scaling by timestep, 1.0 -> quadratic scaling by timestep
_constInverse30:
.float 1.0 / 30.0
0x034a804c = bla _water_physics_timestep_fix
; input:
; f30 <-- Timestep30 (Timestep scale factor where 30 FPS is 1.0. 60 FPS is ~0.5, 90 FPS is ~0.333)
; f1 <-- TimescaleProperty (a property from the object, usually 1.0)
; output:
; f30 --> Scaled timestep. Normally only f30 * f1 but we introduce a damping factor:
; f30 = ((f30 - 1.0) * _constTimestepDampingFactor + 1.0) * f1
; available registers:
; f12, r28
_water_physics_timestep_fix:
; replaced instruction: fmr f30, f1
; scale f30 to be close to 1/30 FPS
; - 1.0
lis r28, _constFloat1@ha
lfs f12, _constFloat1@lo(r28)
fsubs f30, f30, f12
; * _constTimestepDampingFactor
lis r28, _constTimestepDampingFactor@ha
lfs f12, _constTimestepDampingFactor@lo(r28)
fmuls f30, f30, f12
; + 1.0
lis r28, _constFloat1@ha
lfs f12, _constFloat1@lo(r28)
fadds f30, f30, f12
; * f1 (property from object)
fmuls f30, f30, f1
blr

View File

@ -2,7 +2,7 @@
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500 titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = FPS++ name = FPS++
path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++" path = "The Legend of Zelda: Breath of the Wild/Mods/FPS++"
description = Allows you to change the FPS and the speed that most things run at.|Some elements aren't patched though which can cause some physics issues. To bypass any issues you can enable the Temporary 30FPS Limit.||Made by Xalphenos, rajkosto, epigramx, Crementif, leoetlino and Pig. description = Allows you to change the FPS and the speed that most things run at.|Some bugs might still occur if you run at high FPS.||Made by Xalphenos, rajkosto, epigramx, Crementif, leoetlino, Pig and Exzap.
version = 6 version = 6
[Default] [Default]
@ -17,7 +17,7 @@ $fpsLimit = 0
$frameAverageAmount = 8 $frameAverageAmount = 8
$fenceMethod = 1 $fenceMethod = 1
$lowFPSLimit = 20 $lowFPSLimit = 20
$cursorFixAbove:int = 999 $cutsceneFPSLimitMode:int = 1
$roundUpModifier = 0.8 $roundUpModifier = 0.8
$showDebugModeOptions:int = 0 $showDebugModeOptions:int = 0
@ -205,26 +205,32 @@ condition = $advancedMode == 1
$fpsLimitAdvanced = 20 $fpsLimitAdvanced = 20
# Cursor Fix Mode # Cutscene FPS Limit Mode
[Preset] [Preset]
name = Disabled (Default) name = Automatically Limit In Few Cutscenes (Recommended)
category = Menu Cursor Fix (Experimental) category = Cutscene FPS Limit
condition = ($advancedMode-$staticFPSMode == 1) condition = $advancedMode == 1
$cursorFixAbove:int = 999 default = 1
$cutsceneFPSLimitMode:int = 1
[Preset] [Preset]
name = Enabled At 72FPS And Higher (Recommended) name = Limit all cutscenes to 60FPS
category = Menu Cursor Fix (Experimental) category = Cutscene FPS Limit
condition = ($advancedMode-$staticFPSMode == 1) condition = $advancedMode == 1
$cursorFixAbove:int = 2 $cutsceneFPSLimitMode:int = 2
[Preset] [Preset]
name = Enabled (For Testing, Not Recommended!) name = Limit all cutscenes to 30FPS
category = Menu Cursor Fix (Experimental) category = Cutscene FPS Limit
condition = ($advancedMode-$staticFPSMode == 1) condition = $advancedMode == 1
$cursorFixAbove:int = 1 $cutsceneFPSLimitMode:int = 3
[Preset]
name = Disabled (Causes Crashes Above 30-60FPS)
category = Cutscene FPS Limit
condition = $advancedMode == 1
$cutsceneFPSLimitMode:int = 0
# Static Mode # Static Mode

View File

@ -1,398 +0,0 @@
#version 430
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable
// shader 6ef3887dc83ac35e
// Used for: Fog Clouds
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
#else
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
#endif
#ifdef VULKAN
layout(set = 1, binding = 5) uniform ufBlock
{
uniform ivec4 uf_remappedPS[9];
uniform float uf_alphaTestRef;
uniform vec4 uf_fragCoordScale;
};
#else
uniform ivec4 uf_remappedPS[9];
uniform float uf_alphaTestRef;
uniform vec2 uf_fragCoordScale;
#endif
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
TEXTURE_LAYOUT(1, 1, 1) uniform sampler2D textureUnitPS1;
TEXTURE_LAYOUT(2, 1, 2) uniform sampler2D textureUnitPS2;
TEXTURE_LAYOUT(4, 1, 3) uniform sampler2D textureUnitPS4;
TEXTURE_LAYOUT(10, 1, 4) uniform samplerCubeArray textureUnitPS10;
layout(location = 0) in vec4 passParameterSem0;
layout(location = 1) in vec4 passParameterSem1;
layout(location = 2) in vec4 passParameterSem3;
layout(location = 3) in vec4 passParameterSem4;
layout(location = 4) in vec4 passParameterSem8;
layout(location = 5) in vec4 passParameterSem9;
layout(location = 6) in vec4 passParameterSem11;
layout(location = 7) in vec4 passParameterSem14;
layout(location = 8) in vec4 passParameterSem15;
layout(location = 9) in vec4 passParameterSem16;
layout(location = 0) out vec4 passPixelColor0;
// end of shader inputs/outputs
void redcCUBE(vec4 src0, vec4 src1, out vec3 stm, out int faceId)
{
// stm -> x .. s, y .. t, z .. MajorAxis*2.0
vec3 inputCoord = normalize(vec3(src1.y, src1.x, src0.x));
float rx = inputCoord.x;
float ry = inputCoord.y;
float rz = inputCoord.z;
if( abs(rx) > abs(ry) && abs(rx) > abs(rz) )
{
stm.z = rx*2.0;
stm.xy = vec2(ry,rz);
if( rx >= 0.0 )
{
faceId = 0;
}
else
{
faceId = 1;
}
}
else if( abs(ry) > abs(rx) && abs(ry) > abs(rz) )
{
stm.z = ry*2.0;
stm.xy = vec2(rx,rz);
if( ry >= 0.0 )
{
faceId = 2;
}
else
{
faceId = 3;
}
}
else //if( abs(rz) > abs(ry) && abs(rz) > abs(rx) )
{
stm.z = rz*2.0;
stm.xy = vec2(rx,ry);
if( rz >= 0.0 )
{
faceId = 4;
}
else
{
faceId = 5;
}
}
}
vec3 redcCUBEReverse(vec2 st, int faceId)
{
st.yx = st.xy;
vec3 v;
float majorAxis = 1.0;
if( faceId == 0 )
{
v.yz = (st-vec2(1.5))*(majorAxis*2.0);
v.x = 1.0;
}
else if( faceId == 1 )
{
v.yz = (st-vec2(1.5))*(majorAxis*2.0);
v.x = -1.0;
}
else if( faceId == 2 )
{
v.xz = (st-vec2(1.5))*(majorAxis*2.0);
v.y = 1.0;
}
else if( faceId == 3 )
{
v.xz = (st-vec2(1.5))*(majorAxis*2.0);
v.y = -1.0;
}
else if( faceId == 4 )
{
v.xy = (st-vec2(1.5))*(majorAxis*2.0);
v.z = 1.0;
}
else
{
v.xy = (st-vec2(1.5))*(majorAxis*2.0);
v.z = -1.0;
}
return v;
}
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return floatBitsToInt(1.0);
else if( v == 0xFFFFFFFF )
return floatBitsToInt(0.0);
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
void main()
{
vec4 R0f = vec4(0.0);
vec4 R1f = vec4(0.0);
vec4 R2f = vec4(0.0);
vec4 R3f = vec4(0.0);
vec4 R4f = vec4(0.0);
vec4 R5f = vec4(0.0);
vec4 R6f = vec4(0.0);
vec4 R7f = vec4(0.0);
vec4 R8f = vec4(0.0);
vec4 R9f = vec4(0.0);
vec4 R10f = vec4(0.0);
vec4 R11f = vec4(0.0);
vec4 R122f = vec4(0.0);
vec4 R123f = vec4(0.0);
vec4 R126f = vec4(0.0);
vec4 R127f = vec4(0.0);
float backupReg0f, backupReg1f, backupReg2f, backupReg3f, backupReg4f;
vec4 PV0f = vec4(0.0), PV1f = vec4(0.0);
float PS0f = 0.0, PS1f = 0.0;
vec4 tempf = vec4(0.0);
float tempResultf;
int tempResulti;
ivec4 ARi = ivec4(0);
bool predResult = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
float cubeMapArrayIndex10 = 0.0;
R0f = passParameterSem0;
R1f = passParameterSem1;
R2f = passParameterSem3;
R3f = passParameterSem4;
R4f = passParameterSem8;
R5f = passParameterSem9;
R6f = passParameterSem11;
R7f = passParameterSem14;
R8f = passParameterSem15;
R9f = passParameterSem16;
R10f.xw = (texture(textureUnitPS0, R4f.xy).xw);
R10f.y = (texture(textureUnitPS2, R5f.xy).w);
// 0
R11f.x = R0f.x + -(R1f.x);
R123f.y = (R10f.w * 2.0 + -(1.0));
PV0f.y = R123f.y;
R123f.z = (R10f.x * 2.0 + -(1.0));
PV0f.z = R123f.z;
R127f.w = R10f.y * 1.0;
R127f.z = 1.0 / R2f.w;
PS0f = R127f.z;
// 1
PV1f.x = mul_nonIEEE(R3f.y, PV0f.z);
PV1f.y = mul_nonIEEE(R3f.y, PV0f.y);
R11f.z = mul_nonIEEE(R2f.x, PS0f);
R10f.w = intBitsToFloat(uf_remappedPS[0].x);
R11f.y = mul_nonIEEE(R2f.y, PS0f);
PS1f = R11f.y;
// 2
PV0f.x = R2f.z * R127f.z;
R2f.y = R0f.y + -(R1f.y);
PV0f.z = mul_nonIEEE(PV1f.x, R127f.w);
PV0f.w = mul_nonIEEE(R127f.w, PV1f.y);
R2f.w = R7f.x + 0.0;
PS0f = R2f.w;
// 3
R4f.xyz = vec3(R4f.z,R4f.w,R5f.x) + vec3(PV0f.z,PV0f.w,PV0f.z);
R4f.w = R5f.y + PV0f.w;
R122f.x = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[1].w),PV0f.x) + -(intBitsToFloat(uf_remappedPS[1].y)));
PS1f = R122f.x;
// 4
R5f.x = dot(vec4(R6f.x,R6f.y,R6f.z,-0.0),vec4(intBitsToFloat(uf_remappedPS[2].x),intBitsToFloat(uf_remappedPS[2].y),intBitsToFloat(uf_remappedPS[2].z),0.0));
PV0f.x = R5f.x;
PV0f.y = R5f.x;
PV0f.z = R5f.x;
PV0f.w = R5f.x;
R127f.z = 1.0 / PS1f;
PS0f = R127f.z;
// 5
backupReg0f = R0f.z;
tempf.x = dot(vec4(R6f.x,R6f.y,R6f.z,-0.0),vec4(intBitsToFloat(uf_remappedPS[3].x),intBitsToFloat(uf_remappedPS[3].y),intBitsToFloat(uf_remappedPS[3].z),0.0));
PV1f.x = tempf.x;
PV1f.y = tempf.x;
PV1f.z = tempf.x;
PV1f.w = tempf.x;
R127f.y = tempf.x;
R5f.y = backupReg0f + -(R1f.z);
PS1f = R5f.y;
// 6
tempf.x = dot(vec4(R6f.x,R6f.y,R6f.z,-0.0),vec4(intBitsToFloat(uf_remappedPS[4].x),intBitsToFloat(uf_remappedPS[4].y),intBitsToFloat(uf_remappedPS[4].z),0.0));
PV0f.x = tempf.x;
PV0f.y = tempf.x;
PV0f.z = tempf.x;
PV0f.w = tempf.x;
R2f.z = tempf.x;
R3f.z = R7f.y + 0.0;
PS0f = R3f.z;
// 7
backupReg0f = R6f.z;
tempf.x = dot(vec4(R6f.x,R6f.y,R6f.z,-0.0),vec4(intBitsToFloat(uf_remappedPS[5].x),intBitsToFloat(uf_remappedPS[5].y),intBitsToFloat(uf_remappedPS[5].z),0.0));
PV1f.x = tempf.x;
PV1f.y = tempf.x;
PV1f.z = tempf.x;
PV1f.w = tempf.x;
R127f.w = tempf.x;
R6f.z = -(backupReg0f);
PS1f = R6f.z;
// 8
redcCUBE(vec4(PS1f,PS1f,R6f.x,R6f.y),vec4(R6f.y,R6f.x,PS1f,PS1f),cubeMapSTM,cubeMapFaceId);
R126f.x = cubeMapSTM.x;
R126f.y = cubeMapSTM.y;
R126f.z = cubeMapSTM.z;
R126f.w = intBitsToFloat(cubeMapFaceId);
PV0f.x = R126f.x;
PV0f.y = R126f.y;
PV0f.z = R126f.z;
PV0f.w = R126f.w;
R6f.y = -(intBitsToFloat(uf_remappedPS[1].z)) * R127f.z;
PS0f = R6f.y;
// 9
backupReg0f = R0f.w;
PV1f.x = R127f.w * R127f.w;
R0f.y = R7f.z + 0.0;
R10f.z = PV0f.w;
R0f.w = (backupReg0f * 2.0 + -(1.0));
PS1f = 1.0 / abs(PV0f.z);
// 10
R123f.x = (R2f.z * R2f.z + PV1f.x);
PV0f.x = R123f.x;
R123f.z = (mul_nonIEEE(R126f.y,PS1f) + 1.5);
PV0f.z = R123f.z;
R123f.w = (mul_nonIEEE(R126f.x,PS1f) + 1.5);
PV0f.w = R123f.w;
// 11
R10f.x = PV0f.z;
R10f.y = PV0f.w;
R0f.x = (R127f.y * R127f.y + PV0f.x);
PS1f = R0f.x;
R10f.xyz = (textureLod(textureUnitPS10, vec4(redcCUBEReverse(R10f.xy,floatBitsToInt(R10f.z)),cubeMapArrayIndex10),R10f.w).xyz);
R7f.xyzw = (texture(textureUnitPS1, R4f.xy).xyzw);
R4f.y = (texture(textureUnitPS4, R11f.zy).x);
R11f.y = (texture(textureUnitPS0, R4f.zw).w);
// 0
R123f.x = (R5f.x * R5f.x + R0f.x);
PV0f.x = R123f.x;
PV0f.y = R10f.x * 1.0;
PV0f.z = R10f.y * 1.0;
PV0f.w = R10f.z * 1.0;
R126f.x = mul_nonIEEE(R7f.z, R7f.z);
PS0f = R126f.x;
// 1
R127f.x = (mul_nonIEEE(PV0f.w,intBitsToFloat(uf_remappedPS[6].y)) + 0.0);
R123f.y = (mul_nonIEEE(PV0f.z,intBitsToFloat(uf_remappedPS[6].y)) + 0.0);
PV1f.y = R123f.y;
R123f.z = (mul_nonIEEE(PV0f.y,intBitsToFloat(uf_remappedPS[6].y)) + 0.0);
PV1f.z = R123f.z;
R126f.w = mul_nonIEEE(R7f.x, R7f.x);
tempResultf = 1.0 / sqrt(PV0f.x);
PS1f = tempResultf;
// 2
backupReg0f = R126f.x;
R126f.x = (mul_nonIEEE(R5f.y,backupReg0f) + R1f.z);
PV0f.y = mul_nonIEEE(R7f.y, R7f.y);
PV0f.z = mul_nonIEEE(R2f.z, PS1f);
R127f.w = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[0].w),PV1f.z) + R2f.w);
R126f.z = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[0].w),PV1f.y) + R3f.z);
PS0f = R126f.z;
// 3
R123f.x = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[0].w),R127f.x) + R0f.y);
PV1f.x = R123f.x;
PV1f.y = max(PV0f.z, -(PV0f.z));
R123f.z = (mul_nonIEEE(R11f.x,R126f.w) + R1f.x);
PV1f.z = R123f.z;
R123f.w = (mul_nonIEEE(R2f.y,PV0f.y) + R1f.y);
PV1f.w = R123f.w;
// 4
backupReg0f = R126f.z;
PV0f.x = max(PV1f.y, intBitsToFloat(0x3e99999a));
R127f.y = mul_nonIEEE(PV1f.z, R127f.w);
PV0f.y = R127f.y;
R126f.z = mul_nonIEEE(R126f.x, PV1f.x);
PV0f.z = R126f.z;
R127f.w = mul_nonIEEE(PV1f.w, backupReg0f);
PV0f.w = R127f.w;
PS0f = R11f.y + R0f.w;
PS0f = clamp(PS0f, 0.0, 1.0);
// 5
PV1f.x = -(PV0f.w) + intBitsToFloat(uf_remappedPS[7].y);
PV1f.y = -(PV0f.y) + intBitsToFloat(uf_remappedPS[7].x);
PV1f.z = -(PV0f.z) + intBitsToFloat(uf_remappedPS[7].z);
PV1f.w = min(PV0f.x, 1.0);
PS1f = mul_nonIEEE(R7f.w, PS0f);
// 6
backupReg0f = R1f.w;
R126f.x = (mul_nonIEEE(PV1f.y,R9f.y) + R127f.y);
PV0f.x = R126f.x;
R127f.y = (mul_nonIEEE(PV1f.x,R9f.y) + R127f.w);
PV0f.y = R127f.y;
PV0f.z = PV1f.w + intBitsToFloat(0xbe99999a);
R127f.w = (mul_nonIEEE(PV1f.z,R9f.y) + R126f.z);
PV0f.w = R127f.w;
R1f.w = mul_nonIEEE(backupReg0f, PS1f);
PS0f = R1f.w;
// 7
PV1f.x = R8f.z + -(PV0f.w);
PV1f.y = PV0f.z * intBitsToFloat(0x3fb6db6e);
PV1f.z = R8f.y + -(PV0f.y);
PV1f.w = R8f.x + -(PV0f.x);
// 8
backupReg0f = R127f.y;
PV0f.x = -(PV1f.y) + 1.0;
R127f.y = (mul_nonIEEE(PV1f.w,R8f.w) + R126f.x);
PV0f.y = R127f.y;
R126f.z = (mul_nonIEEE(PV1f.x,R8f.w) + R127f.w);
PV0f.z = R126f.z;
R127f.w = (mul_nonIEEE(PV1f.z,R8f.w) + backupReg0f);
PV0f.w = R127f.w;
// 9
PV1f.x = -(PV0f.w) + intBitsToFloat(uf_remappedPS[8].y);
PV1f.y = -(PV0f.y) + intBitsToFloat(uf_remappedPS[8].x);
PV1f.z = -(PV0f.z) + intBitsToFloat(uf_remappedPS[8].z);
PV1f.w = mul_nonIEEE(PV0f.x, PV0f.x);
// 10
backupReg0f = R6f.y;
R6f.x = (mul_nonIEEE(PV1f.y,R9f.x) + R127f.y);
R6f.y = (mul_nonIEEE(PV1f.x,R9f.x) + R127f.w);
R8f.z = (PV1f.w * intBitsToFloat(0x42c80000) + backupReg0f);
R6f.z = (mul_nonIEEE(PV1f.z,R9f.x) + R126f.z);
PS0f = R6f.z;
// 0
R123f.y = (mul_nonIEEE(R4f.y,intBitsToFloat(uf_remappedPS[1].w)) + intBitsToFloat(uf_remappedPS[1].x));
PV0f.y = R123f.y;
// 1
PV1f.y = PV0f.y + -(R8f.z);
// 2
PV0f.x = max(PV1f.y, 0.0);
// 3
PV1f.w = min(PV0f.x, intBitsToFloat(0x42c80000));
// 4
PV0f.z = PV1f.w + -0.0;
// 5
PV1f.y = PV0f.z * intBitsToFloat(0x3c23d70a);
PV1f.y = clamp(PV1f.y, 0.0, 1.0);
// 6
PV0f.x = mul_nonIEEE(R1f.w, PV1f.y);
PV0f.x = clamp(PV0f.x, 0.0, 1.0);
// 7
R6f.w = mul_nonIEEE(R3f.x, PV0f.x);
// export
if( ((vec4(R6f.x, R6f.y, R6f.z, R6f.w)).a > uf_alphaTestRef) == false) discard;
#if ($enableFogCloudsColor == 0)
passPixelColor0 = vec4(R6f.x, R6f.y, R6f.z, R6f.w*$fogCloudsOpacity);
#else
passPixelColor0 = vec4($fogCloudsRed, $fogCloudsGreen, $fogCloudsBlue, R6f.w*$fogCloudsOpacity);
#endif
}

View File

@ -1,983 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Fog and Mist
path = "The Legend of Zelda: Breath of the Wild/Mods/Fog and Mist"
description = Allows you to make various fog types in the game less visible or change their colors.||Made by Skalfate.
version = 6
[Default]
$setting:int = 0
$enableGroundFogColor:int = 1
$groundFogRed = 1.0
$groundFogGreen = 1.0
$groundFogBlue = 1.0
$groundFogOpacity = 1.0
$groundFogBrightness = 1.0
$enableWaterFogColor:int = 1
$waterFogRed = 1.0
$waterFogGreen = 1.0
$waterFogBlue = 1.0
$waterFogOpacity = 1.0
$enableGreeneryFogColor:int = 1
$greeneryFogRed = 1.0
$greeneryFogGreen = 1.0
$greeneryFogBlue = 1.0
$greeneryFogOpacity = 1.0
$greeneryFogBrightness = 1.0
$enableDistanceFogColor:int = 1
$distanceFogRed = 1.0
$distanceFogGreen = 1.0
$distanceFogBlue = 1.0
$distanceFogOpacity = 1.0
$enableFogCloudsColor:int = 1
$fogCloudsRed = 1.0
$fogCloudsGreen = 1.0
$fogCloudsBlue = 1.0
$fogCloudsOpacity = 1.0
$enableCastleFogColor:int = 1
$castleFogRed = 1.0
$castleFogGreen = 1.0
$castleFogBlue = 1.0
$castleFogOpacity = 1.0
$enableGanonAuraColor:int = 1
$ganonAuraRed = 1.0
$ganonAuraGreen = 1.0
$ganonAuraBlue = 1.0
$ganonAuraOpacity = 1.0
# Setting Selector
[Preset]
name = Ground Fog
category = Fog Settings
default = 1
$setting:int = 0
[Preset]
name = Water Fog
category = Fog Settings
$setting:int = 1
[Preset]
name = Greenery Fog (e.g. trees, bushes and vines)
category = Fog Settings
default = 1
$setting:int = 2
[Preset]
name = Distance Fog
category = Fog Settings
$setting:int = 3
[Preset]
name = Mist Clouds
category = Fog Settings
$setting:int = 4
[Preset]
name = Hyrule Castle Fog/Aura
category = Fog Settings
$setting:int = 5
# Ground Fog
[Preset]
name = 100% Opacity (Default)
category = Ground Fog Visibility
condition = $setting == 0
default = 1
$groundFogOpacity = 1.0
[Preset]
name = 80% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.8
[Preset]
name = 60% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.6
[Preset]
name = 50% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.5
[Preset]
name = 40% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.4
[Preset]
name = 20% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.2
[Preset]
name = 10% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.1
[Preset]
name = 0% Opacity
category = Ground Fog Visibility
condition = $setting == 0
$groundFogOpacity = 0.0
[Preset]
name = 0.5x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 0.5
[Preset]
name = 0.75x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 0.75
[Preset]
name = 1x Brightness (Default)
category = Ground Fog Brightness
default = 1
condition = $setting == 0
$groundFogBrightness = 1.0
[Preset]
name = 1.5x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 1.5
[Preset]
name = 2x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 2.0
[Preset]
name = 3x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 3.0
[Preset]
name = 4x Brightness
category = Ground Fog Brightness
condition = $setting == 0
$groundFogBrightness = 4.0
[Preset]
name = Normal (Default)
category = Ground Fog Color
condition = $setting == 0
default = 1
$enableGroundFogColor:int = 0
[Preset]
name = Black Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 1.0
$groundFogGreen = 1.0
$groundFogBlue = 1.0
[Preset]
name = Gray Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 0.75
$groundFogGreen = 0.75
$groundFogBlue = 0.75
[Preset]
name = Navy Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 0.0
$groundFogGreen = 0.0
$groundFogBlue = 0.5
[Preset]
name = Blue Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 0.0
$groundFogGreen = 0.0
$groundFogBlue = 1.0
[Preset]
name = Cyan Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 0.0
$groundFogGreen = 0.5
$groundFogBlue = 0.5
[Preset]
name = Green Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 0.0
$groundFogGreen = 1.0
$groundFogBlue = 0.0
[Preset]
name = Red Fog
category = Ground Fog Color
condition = $setting == 0
$groundFogRed = 1.0
$groundFogGreen = 0.0
$groundFogBlue = 0.0
# Water Fog
[Preset]
name = 100% Opacity (Default)
category = Water Fog Visibility
condition = $setting == 1
default = 1
$waterFogOpacity = 1.0
[Preset]
name = 80% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.8
[Preset]
name = 60% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.6
[Preset]
name = 50% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.5
[Preset]
name = 40% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.4
[Preset]
name = 20% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.2
[Preset]
name = 10% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.1
[Preset]
name = 0% Opacity
category = Water Fog Visibility
condition = $setting == 1
$waterFogOpacity = 0.0
[Preset]
name = Normal (Default)
category = Water Fog Color
condition = $setting == 1
default = 1
$enableWaterFogColor:int = 0
[Preset]
name = Black Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 1.0
$waterFogGreen = 1.0
$waterFogBlue = 1.0
[Preset]
name = Gray Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 0.75
$waterFogGreen = 0.75
$waterFogBlue = 0.75
[Preset]
name = Navy Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 0.0
$waterFogGreen = 0.0
$waterFogBlue = 0.5
[Preset]
name = Blue Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 0.0
$waterFogGreen = 0.0
$waterFogBlue = 1.0
[Preset]
name = Cyan Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 0.0
$waterFogGreen = 0.5
$waterFogBlue = 0.5
[Preset]
name = Green Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 0.0
$waterFogGreen = 1.0
$waterFogBlue = 0.0
[Preset]
name = Red Fog
category = Water Fog Color
condition = $setting == 1
$waterFogRed = 1.0
$waterFogGreen = 0.0
$waterFogBlue = 0.0
# Greenery Fog
[Preset]
name = 100% Opacity (Default)
category = Greenery Fog Visibility
condition = $setting == 2
default = 1
$greeneryFogOpacity = 1.0
[Preset]
name = 80% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.8
[Preset]
name = 60% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.6
[Preset]
name = 50% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.5
[Preset]
name = 40% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.4
[Preset]
name = 20% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.2
[Preset]
name = 10% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.1
[Preset]
name = 0% Opacity
category = Greenery Fog Visibility
condition = $setting == 2
$greeneryFogOpacity = 0.0
[Preset]
name = 0.5x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 0.5
[Preset]
name = 0.75x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 0.75
[Preset]
name = 1x Brightness (Default)
category = Greenery Fog Brightness
default = 1
condition = $setting == 2
$greeneryFogBrightness = 1.0
[Preset]
name = 1.5x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 1.5
[Preset]
name = 2x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 2.0
[Preset]
name = 3x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 3.0
[Preset]
name = 4x Brightness
category = Greenery Fog Brightness
condition = $setting == 2
$greeneryFogBrightness = 4.0
[Preset]
name = Normal (Default)
category = Greenery Fog Color
condition = $setting == 2
default = 1
$enableGreeneryFogColor:int = 0
[Preset]
name = Black Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 1.0
$greeneryFogGreen = 1.0
$greeneryFogBlue = 1.0
[Preset]
name = Gray Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 0.75
$greeneryFogGreen = 0.75
$greeneryFogBlue = 0.75
[Preset]
name = Navy Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 0.0
$greeneryFogGreen = 0.0
$greeneryFogBlue = 0.5
[Preset]
name = Blue Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 0.0
$greeneryFogGreen = 0.0
$greeneryFogBlue = 1.0
[Preset]
name = Cyan Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 0.0
$greeneryFogGreen = 0.5
$greeneryFogBlue = 0.5
[Preset]
name = Green Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 0.0
$greeneryFogGreen = 1.0
$greeneryFogBlue = 0.0
[Preset]
name = Red Fog
category = Greenery Fog Color
condition = $setting == 2
$greeneryFogRed = 1.0
$greeneryFogGreen = 0.0
$greeneryFogBlue = 0.0
# Distance Fog
[Preset]
name = 100% Opacity (Default)
category = Distance Fog Visibility
condition = $setting == 3
default = 1
$distanceFogOpacity = 1.0
[Preset]
name = 80% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.8
[Preset]
name = 60% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.6
[Preset]
name = 50% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.5
[Preset]
name = 40% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.4
[Preset]
name = 20% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.2
[Preset]
name = 10% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.1
[Preset]
name = 0% Opacity
category = Distance Fog Visibility
condition = $setting == 3
$distanceFogOpacity = 0.0
[Preset]
name = Normal (Default)
category = Distance Fog Color
condition = $setting == 3
default = 1
$enableDistanceFogColor:int = 0
[Preset]
name = Black Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 1.0
$distanceFogGreen = 1.0
$distanceFogBlue = 1.0
[Preset]
name = Gray Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 0.75
$distanceFogGreen = 0.75
$distanceFogBlue = 0.75
[Preset]
name = Navy Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 0.0
$distanceFogGreen = 0.0
$distanceFogBlue = 0.5
[Preset]
name = Blue Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 0.0
$distanceFogGreen = 0.0
$distanceFogBlue = 1.0
[Preset]
name = Cyan Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 0.0
$distanceFogGreen = 0.5
$distanceFogBlue = 0.5
[Preset]
name = Green Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 0.0
$distanceFogGreen = 1.0
$distanceFogBlue = 0.0
[Preset]
name = Red Fog
category = Distance Fog Color
condition = $setting == 3
$distanceFogRed = 1.0
$distanceFogGreen = 0.0
$distanceFogBlue = 0.0
# Fog Clouds
[Preset]
name = 100% Opacity (Default)
category = Fog Clouds Visibility
condition = $setting == 4
default = 1
$fogCloudsOpacity = 1.0
[Preset]
name = 80% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.8
[Preset]
name = 60% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.6
[Preset]
name = 50% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.5
[Preset]
name = 40% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.4
[Preset]
name = 20% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.2
[Preset]
name = 10% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.1
[Preset]
name = 0% Opacity
category = Fog Clouds Visibility
condition = $setting == 4
$fogCloudsOpacity = 0.0
[Preset]
name = Normal (Default)
category = Fog Clouds Color
condition = $setting == 4
default = 1
$enableFogCloudsColor:int = 0
[Preset]
name = Black Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 1.0
$fogCloudsGreen = 1.0
$fogCloudsBlue = 1.0
[Preset]
name = Gray Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 0.75
$fogCloudsGreen = 0.75
$fogCloudsBlue = 0.75
[Preset]
name = Navy Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 0.0
$fogCloudsGreen = 0.0
$fogCloudsBlue = 0.5
[Preset]
name = Blue Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 0.0
$fogCloudsGreen = 0.0
$fogCloudsBlue = 1.0
[Preset]
name = Cyan Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 0.0
$fogCloudsGreen = 0.5
$fogCloudsBlue = 0.5
[Preset]
name = Green Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 0.0
$fogCloudsGreen = 1.0
$fogCloudsBlue = 0.0
[Preset]
name = Red Fog
category = Fog Clouds Color
condition = $setting == 4
$fogCloudsRed = 1.0
$fogCloudsGreen = 0.0
$fogCloudsBlue = 0.0
# Hyrule Castle Fog
[Preset]
name = 100% Opacity (Default)
category = Castle Fog Visibility
condition = $setting == 5
default = 1
$castleFogOpacity = 1.0
[Preset]
name = 80% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.8
[Preset]
name = 60% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.6
[Preset]
name = 50% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.5
[Preset]
name = 40% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.4
[Preset]
name = 20% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.2
[Preset]
name = 10% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.1
[Preset]
name = 0% Opacity
category = Castle Fog Visibility
condition = $setting == 5
$castleFogOpacity = 0.0
[Preset]
name = Normal (Default)
category = Castle Fog Color
condition = $setting == 5
default = 1
$enableCastleFogColor:int = 0
[Preset]
name = Black Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 1.0
$castleFogGreen = 1.0
$castleFogBlue = 1.0
[Preset]
name = Gray Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 0.75
$castleFogGreen = 0.75
$castleFogBlue = 0.75
[Preset]
name = Navy Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 0.0
$castleFogGreen = 0.0
$castleFogBlue = 0.5
[Preset]
name = Blue Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 0.0
$castleFogGreen = 0.0
$castleFogBlue = 1.0
[Preset]
name = Cyan Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 0.0
$castleFogGreen = 0.5
$castleFogBlue = 0.5
[Preset]
name = Green Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 0.0
$castleFogGreen = 1.0
$castleFogBlue = 0.0
[Preset]
name = Red Fog
category = Castle Fog Color
condition = $setting == 5
$castleFogRed = 1.0
$castleFogGreen = 0.0
$castleFogBlue = 0.0
# Hyrule Castle Ganon's Aura
[Preset]
name = 300% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 2.0
[Preset]
name = 200% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 2.0
[Preset]
name = 150% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 1.5
[Preset]
name = 100% Opacity (Default)
category = Ganon's Aura Visibility
condition = $setting == 6
default = 1
$ganonAuraOpacity = 1.0
[Preset]
name = 80% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.8
[Preset]
name = 60% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.6
[Preset]
name = 50% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.5
[Preset]
name = 40% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.4
[Preset]
name = 20% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.2
[Preset]
name = 10% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.2
[Preset]
name = 0% Opacity
category = Ganon's Aura Visibility
condition = $setting == 6
$ganonAuraOpacity = 0.0
[Preset]
name = Normal (Default)
category = Ganon's Aura Color
condition = $setting == 6
default = 1
$enableGanonAuraColor:int = 0
[Preset]
name = Black Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 1.0
$ganonAuraGreen = 1.0
$ganonAuraBlue = 1.0
[Preset]
name = Navy Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 0.0
$ganonAuraGreen = 0.0
$ganonAuraBlue = 0.5
[Preset]
name = Blue Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 0.0
$ganonAuraGreen = 0.0
$ganonAuraBlue = 1.0
[Preset]
name = Cyan Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 0.0
$ganonAuraGreen = 0.5
$ganonAuraBlue = 0.5
[Preset]
name = Green Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 0.0
$ganonAuraGreen = 1.0
$ganonAuraBlue = 0.0
[Preset]
name = Red Aura
category = Ganon's Aura Color
condition = $setting == 6
$ganonAuraRed = 1.0
$ganonAuraGreen = 0.0
$ganonAuraBlue = 0.0

View File

@ -0,0 +1,4 @@
[BotW_MenuCursorSpeed_V208]
moduleMatches = 0x6267BFD0
0x10327D60 = .float $cursorSpeed ; sets cursor speed in a static memory address that's also used by the GameSpeed patch to read the cursor speed

View File

@ -0,0 +1,80 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Menu Navigation Speed
path = "The Legend of Zelda: Breath of the Wild/Mods/Menu Navigation Speed"
description = Change the speed at which you can navigate the cursor through the menus.|Requires you to use FPS++.||Made by Exzap.
version = 6
[Default]
$cursorSpeed = 1.0
[Preset]
name = 0.7x
category = Menu Navigation Speed
$cursorSpeed = 0.7
[Preset]
name = 0.8x
category = Menu Navigation Speed
$cursorSpeed = 0.8
[Preset]
name = 0.9x
category = Menu Navigation Speed
$cursorSpeed = 0.9
[Preset]
name = 1.0x (Default)
category = Menu Navigation Speed
default = 1
[Preset]
name = 1.05x
category = Menu Navigation Speed
$cursorSpeed = 1.05
[Preset]
name = 1.1x
category = Menu Navigation Speed
$cursorSpeed = 1.1
[Preset]
name = 1.15x
category = Menu Navigation Speed
$cursorSpeed = 1.15
[Preset]
name = 1.2x
category = Menu Navigation Speed
$cursorSpeed = 1.2
[Preset]
name = 1.25x
category = Menu Navigation Speed
$cursorSpeed = 1.2
[Preset]
name = 1.5x
category = Menu Navigation Speed
$cursorSpeed = 1.5
[Preset]
name = 1.75x
category = Menu Navigation Speed
$cursorSpeed = 1.75
[Preset]
name = 2.0x
category = Menu Navigation Speed
$cursorSpeed = 2.0
[Preset]
name = 2.5x
category = Menu Navigation Speed
$cursorSpeed = 2.5
[Preset]
name = 3x
category = Menu Navigation Speed
$cursorSpeed = 3

View File

@ -0,0 +1,822 @@
#version 430
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable
// shader 1c7db40ff5d693ab -- Links and all NPCs RGb renderer, all npcs fog rgb renderer, sun-side facing brightness
#define npcfogopacity $npcfogopacity
#define npcfogred $npcfogred
#define npcfoggreen $npcfoggreen
#define npcfogblue $npcfogblue
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
#else
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
#endif
#ifdef VULKAN
layout(set = 1, binding = 11) uniform ufBlock
{
uniform ivec4 uf_remappedPS[33];
uniform vec4 uf_fragCoordScale;
};
#else
uniform ivec4 uf_remappedPS[33];
uniform vec2 uf_fragCoordScale;
#endif
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
TEXTURE_LAYOUT(2, 1, 1) uniform sampler2D textureUnitPS2;
TEXTURE_LAYOUT(3, 1, 2) uniform sampler2D textureUnitPS3;
TEXTURE_LAYOUT(4, 1, 3) uniform sampler2D textureUnitPS4;
TEXTURE_LAYOUT(5, 1, 4) uniform sampler2D textureUnitPS5;
TEXTURE_LAYOUT(6, 1, 5) uniform sampler2D textureUnitPS6;
TEXTURE_LAYOUT(7, 1, 6) uniform samplerCubeArray textureUnitPS7;
TEXTURE_LAYOUT(11, 1, 7) uniform sampler2D textureUnitPS11;
TEXTURE_LAYOUT(12, 1, 8) uniform sampler2D textureUnitPS12;
TEXTURE_LAYOUT(14, 1, 9) uniform sampler2D textureUnitPS14;
TEXTURE_LAYOUT(15, 1, 10) uniform sampler2D textureUnitPS15;
layout(location = 0) in vec4 passParameterSem0;
layout(location = 1) in vec4 passParameterSem2;
layout(location = 2) in vec4 passParameterSem6;
layout(location = 0) out vec4 passPixelColor0;
layout(location = 1) out vec4 passPixelColor1;
layout(location = 2) out vec4 passPixelColor2;
layout(location = 3) out vec4 passPixelColor3;
layout(location = 4) out vec4 passPixelColor4;
// end of shader inputs/outputs
void redcCUBE(vec4 src0, vec4 src1, out vec3 stm, out int faceId)
{
// stm -> x .. s, y .. t, z .. MajorAxis*2.0
vec3 inputCoord = normalize(vec3(src1.y, src1.x, src0.x));
float rx = inputCoord.x;
float ry = inputCoord.y;
float rz = inputCoord.z;
if( abs(rx) > abs(ry) && abs(rx) > abs(rz) )
{
stm.z = rx*2.0;
stm.xy = vec2(ry,rz);
if( rx >= 0.0 )
{
faceId = 0;
}
else
{
faceId = 1;
}
}
else if( abs(ry) > abs(rx) && abs(ry) > abs(rz) )
{
stm.z = ry*2.0;
stm.xy = vec2(rx,rz);
if( ry >= 0.0 )
{
faceId = 2;
}
else
{
faceId = 3;
}
}
else //if( abs(rz) > abs(ry) && abs(rz) > abs(rx) )
{
stm.z = rz*2.0;
stm.xy = vec2(rx,ry);
if( rz >= 0.0 )
{
faceId = 4;
}
else
{
faceId = 5;
}
}
}
vec3 redcCUBEReverse(vec2 st, int faceId)
{
st.yx = st.xy;
vec3 v;
float majorAxis = 1.0;
if( faceId == 0 )
{
v.yz = (st-vec2(1.5))*(majorAxis*2.0);
v.x = 1.0;
}
else if( faceId == 1 )
{
v.yz = (st-vec2(1.5))*(majorAxis*2.0);
v.x = -1.0;
}
else if( faceId == 2 )
{
v.xz = (st-vec2(1.5))*(majorAxis*2.0);
v.y = 1.0;
}
else if( faceId == 3 )
{
v.xz = (st-vec2(1.5))*(majorAxis*2.0);
v.y = -1.0;
}
else if( faceId == 4 )
{
v.xy = (st-vec2(1.5))*(majorAxis*2.0);
v.z = 1.0;
}
else
{
v.xy = (st-vec2(1.5))*(majorAxis*2.0);
v.z = -1.0;
}
return v;
}
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return floatBitsToInt(1.0);
else if( v == 0xFFFFFFFF )
return floatBitsToInt(0.0);
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
void main()
{
ivec4 R0i = ivec4(0);
ivec4 R1i = ivec4(0);
ivec4 R2i = ivec4(0);
ivec4 R3i = ivec4(0);
ivec4 R4i = ivec4(0);
ivec4 R5i = ivec4(0);
ivec4 R6i = ivec4(0);
ivec4 R7i = ivec4(0);
ivec4 R8i = ivec4(0);
ivec4 R9i = ivec4(0);
ivec4 R10i = ivec4(0);
ivec4 R11i = ivec4(0);
ivec4 R12i = ivec4(0);
ivec4 R13i = ivec4(0);
ivec4 R14i = ivec4(0);
ivec4 R15i = ivec4(0);
ivec4 R16i = ivec4(0);
ivec4 R17i = ivec4(0);
ivec4 R122i = ivec4(0);
ivec4 R123i = ivec4(0);
ivec4 R124i = ivec4(0);
ivec4 R125i = ivec4(0);
ivec4 R126i = ivec4(0);
ivec4 R127i = ivec4(0);
int backupReg0i, backupReg1i, backupReg2i, backupReg3i, backupReg4i;
ivec4 PV0i = ivec4(0), PV1i = ivec4(0);
int PS0i = 0, PS1i = 0;
ivec4 tempi = ivec4(0);
float tempResultf;
int tempResulti;
ivec4 ARi = ivec4(0);
bool predResult = true;
bool activeMaskStack[2];
bool activeMaskStackC[3];
activeMaskStack[0] = false;
activeMaskStackC[0] = false;
activeMaskStackC[1] = false;
activeMaskStack[0] = true;
activeMaskStackC[0] = true;
activeMaskStackC[1] = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
float cubeMapArrayIndex7 = 0.0;
R0i = floatBitsToInt(passParameterSem0);
R1i = floatBitsToInt(passParameterSem2);
R2i = floatBitsToInt(passParameterSem6);
if( activeMaskStackC[1] == true ) {
R3i.w = floatBitsToInt(texture(textureUnitPS6, intBitsToFloat(R0i.xy)).x);
R7i.xyzw = floatBitsToInt(texture(textureUnitPS3, intBitsToFloat(R2i.zw)).xyzw);
R15i.xyzw = floatBitsToInt(texture(textureUnitPS2, intBitsToFloat(R2i.zw)).xyzw);
R2i.xy = floatBitsToInt(texture(textureUnitPS14, intBitsToFloat(R0i.xy)).xw);
R4i.xy = floatBitsToInt(texture(textureUnitPS15, intBitsToFloat(R0i.xy)).xy);
R16i.xyz = floatBitsToInt(texture(textureUnitPS4, intBitsToFloat(R2i.zw)).xyz);
R14i.x = floatBitsToInt(texture(textureUnitPS11, intBitsToFloat(R2i.zw)).x);
}
if( activeMaskStackC[1] == true ) {
// 0
R124i.x = floatBitsToInt((intBitsToFloat(R7i.x) * 2.0 + -(1.0)));
R125i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R3i.w),intBitsToFloat(uf_remappedPS[0].x)) + intBitsToFloat(uf_remappedPS[1].x)));
PV0i.y = R125i.y;
R3i.z = 0;
R5i.w = 0x3f800000;
R126i.y = floatBitsToInt((intBitsToFloat(R7i.y) * 2.0 + -(1.0)));
PS0i = R126i.y;
// 1
R126i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R0i.z), -(intBitsToFloat(PV0i.y))));
PV1i.x = R126i.x;
R127i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R0i.w), -(intBitsToFloat(PV0i.y))));
PV1i.y = R127i.y;
R127i.z = floatBitsToInt(-(intBitsToFloat(PV0i.y)));
PV1i.z = R127i.z;
R127i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.y),intBitsToFloat(uf_remappedPS[2].x)) + -(intBitsToFloat(uf_remappedPS[2].y))));
R127i.w = clampFI32(R127i.w);
R126i.z = floatBitsToInt(-(intBitsToFloat(uf_remappedPS[3].w)) + 1.0);
PS1i = R126i.z;
// 2
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(PV1i.x),intBitsToFloat(PV1i.y),intBitsToFloat(PV1i.z),-0.0),vec4(intBitsToFloat(PV1i.x),intBitsToFloat(PV1i.y),intBitsToFloat(PV1i.z),0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
PS0i = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.x), intBitsToFloat(uf_remappedPS[4].x)));
// 3
R127i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R127i.y),intBitsToFloat(uf_remappedPS[4].y)) + intBitsToFloat(PS0i)));
R3i.y = floatBitsToInt(-(intBitsToFloat(R127i.w)) + 1.0);
PV1i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.x), intBitsToFloat(uf_remappedPS[5].x)));
R10i.w = floatBitsToInt(-(intBitsToFloat(R127i.z)) * intBitsToFloat(0x3ba3d70a));
PS1i = floatBitsToInt(sqrt(intBitsToFloat(PV0i.x)));
// 4
R125i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R127i.y),intBitsToFloat(uf_remappedPS[5].y)) + intBitsToFloat(PV1i.z)));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.x), intBitsToFloat(uf_remappedPS[6].x)));
R125i.z = floatBitsToInt((intBitsToFloat(R7i.z) * 2.0 + -(1.0)));
R127i.w = floatBitsToInt(max(intBitsToFloat(R15i.y), intBitsToFloat(R15i.z)));
PS0i = floatBitsToInt(1.0 / intBitsToFloat(PS1i));
// 5
backupReg0i = R127i.x;
R127i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R127i.y),intBitsToFloat(uf_remappedPS[6].y)) + intBitsToFloat(PV0i.y)));
R0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R127i.y), intBitsToFloat(PS0i)));
PV1i.y = R0i.y;
R5i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R127i.z), intBitsToFloat(PS0i)));
R123i.w = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R125i.y)),intBitsToFloat(uf_remappedPS[4].z)) + intBitsToFloat(backupReg0i)));
PV1i.w = R123i.w;
R3i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.x), intBitsToFloat(PS0i)));
PS1i = R3i.x;
// 6
R123i.x = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(PV1i.y)),intBitsToFloat(PV1i.y)) + 1.0));
PV0i.x = R123i.x;
R6i.y = floatBitsToInt(max(intBitsToFloat(R15i.x), intBitsToFloat(R127i.w)));
R9i.z = floatBitsToInt(intBitsToFloat(uf_remappedPS[4].w) + intBitsToFloat(PV1i.w));
PV0i.z = R9i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R125i.y)),intBitsToFloat(uf_remappedPS[5].z)) + intBitsToFloat(R125i.x)));
PV0i.w = R123i.w;
tempResultf = max(0.0, intBitsToFloat(R3i.y));
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
R127i.y = floatBitsToInt(tempResultf);
PS0i = R127i.y;
// 7
R5i.x = floatBitsToInt(intBitsToFloat(uf_remappedPS[5].w) + intBitsToFloat(PV0i.w));
PV1i.x = R5i.x;
R8i.y = PV0i.z;
R123i.z = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R125i.y)),intBitsToFloat(uf_remappedPS[6].z)) + intBitsToFloat(R127i.x)));
PV1i.z = R123i.z;
R126i.w = floatBitsToInt(intBitsToFloat(R1i.w) + intBitsToFloat(0xbe99999a));
tempResultf = 1.0 / sqrt(intBitsToFloat(PV0i.x));
R4i.z = floatBitsToInt(tempResultf);
PS1i = R4i.z;
// 8
R9i.x = floatBitsToInt(intBitsToFloat(PV1i.x) * intBitsToFloat(0x3a83126f));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[3].y), intBitsToFloat(R127i.y)));
R8i.z = floatBitsToInt(intBitsToFloat(uf_remappedPS[6].w) + intBitsToFloat(PV1i.z));
PV0i.z = R8i.z;
R127i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[3].x), intBitsToFloat(R127i.y)));
R13i.x = floatBitsToInt(min(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y)));
PS0i = R13i.x;
// 9
R127i.x = uf_remappedPS[7].y;
R9i.y = floatBitsToInt(intBitsToFloat(PV0i.z) * intBitsToFloat(0x3a83126f));
R127i.z = uf_remappedPS[8].y;
R125i.w = floatBitsToInt(min(intBitsToFloat(R15i.y), intBitsToFloat(R15i.z)));
PS1i = floatBitsToInt(exp2(intBitsToFloat(PV0i.y)));
// 10
backupReg0i = R127i.w;
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R126i.z),intBitsToFloat(PS1i)) + intBitsToFloat(uf_remappedPS[3].w))/2.0);
PV0i.x = R123i.x;
R2i.y = floatBitsToInt(intBitsToFloat(R6i.y) + intBitsToFloat(0x2edbe6ff));
R126i.z = uf_remappedPS[9].y;
R127i.w = floatBitsToInt(intBitsToFloat(R13i.x) + intBitsToFloat(0xbecccccd));
R125i.x = floatBitsToInt(exp2(intBitsToFloat(backupReg0i)));
PS0i = R125i.x;
// 11
backupReg0i = R126i.w;
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R125i.y),intBitsToFloat(uf_remappedPS[10].x)) + -(intBitsToFloat(uf_remappedPS[10].y))));
R123i.x = clampFI32(R123i.x);
PV1i.x = R123i.x;
R11i.y = floatBitsToInt(intBitsToFloat(PV0i.x) + 0.5);
R124i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R125i.y), intBitsToFloat(uf_remappedPS[11].y)));
R126i.w = floatBitsToInt(intBitsToFloat(backupReg0i) * intBitsToFloat(0x40200001));
R126i.w = clampFI32(R126i.w);
R14i.y = floatBitsToInt((intBitsToFloat(0xbf59999a) * intBitsToFloat(R4i.y) + 1.0));
PS1i = R14i.y;
// 12
backupReg0i = R0i.y;
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R127i.x),intBitsToFloat(R127i.z),intBitsToFloat(R126i.z),-0.0),vec4(intBitsToFloat(R3i.x),intBitsToFloat(backupReg0i),intBitsToFloat(R5i.z),0.0)));
tempi.x = clampFI32(tempi.x);
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
R127i.x = floatBitsToInt(-(intBitsToFloat(PV1i.x)) + 1.0);
PS0i = R127i.x;
// 13
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R124i.x),intBitsToFloat(R126i.y),intBitsToFloat(R125i.z),-0.0),vec4(intBitsToFloat(R124i.x),intBitsToFloat(R126i.y),intBitsToFloat(R125i.z),0.0)));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
tempResultf = max(0.0, intBitsToFloat(PV0i.x));
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
PS1i = floatBitsToInt(tempResultf);
// 14
R0i.x = floatBitsToInt(min(intBitsToFloat(R15i.x), intBitsToFloat(R125i.w)));
R12i.y = floatBitsToInt(intBitsToFloat(R127i.w) * intBitsToFloat(0x41200000));
R12i.y = clampFI32(R12i.y);
R127i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[12].z), intBitsToFloat(PS1i)));
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[3].z),-(intBitsToFloat(R125i.x))) + intBitsToFloat(uf_remappedPS[3].z)));
PV0i.w = R123i.w;
PS0i = floatBitsToInt(sqrt(intBitsToFloat(PV1i.x)));
// 15
R125i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R125i.y),intBitsToFloat(uf_remappedPS[13].x)) + intBitsToFloat(uf_remappedPS[14].w)));
R125i.x = clampFI32(R125i.x);
R127i.y = floatBitsToInt((intBitsToFloat(PS0i) * 4.0 + intBitsToFloat(0xc0400000)));
R127i.y = clampFI32(R127i.y);
R126i.z = floatBitsToInt(intBitsToFloat(R126i.w) * intBitsToFloat(0x3dcccccd));
R2i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.w), intBitsToFloat(R14i.y)));
PS1i = floatBitsToInt(1.0 / intBitsToFloat(PS0i));
// 16
R17i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R124i.x), intBitsToFloat(PS1i)));
R17i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.y), intBitsToFloat(PS1i)));
R13i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R125i.z), intBitsToFloat(PS1i)));
R127i.w = floatBitsToInt((intBitsToFloat(R125i.y) * intBitsToFloat(0x3ba3d70a) + intBitsToFloat(0xbfe66666)));
tempResultf = max(0.0, intBitsToFloat(R127i.x));
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
PS0i = floatBitsToInt(tempResultf);
// 17
R6i.x = floatBitsToInt(intBitsToFloat(R1i.x) * intBitsToFloat(0x3f4ccccd));
R13i.y = floatBitsToInt(intBitsToFloat(R127i.y) + -(0.5));
R13i.y = floatBitsToInt(intBitsToFloat(R13i.y) * 4.0);
R13i.y = clampFI32(R13i.y);
PV1i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[12].x), intBitsToFloat(PS0i)));
R6i.w = floatBitsToInt(intBitsToFloat(R1i.y) * intBitsToFloat(0x3f4ccccd));
PS1i = floatBitsToInt(exp2(intBitsToFloat(R127i.z)));
// 18
R8i.x = floatBitsToInt(intBitsToFloat(R1i.z) * intBitsToFloat(0x3f4ccccd));
R123i.y = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R126i.z)),intBitsToFloat(R127i.w)) + intBitsToFloat(R127i.w)));
R123i.y = clampFI32(R123i.y);
PV0i.y = R123i.y;
R2i.z = floatBitsToInt(-(intBitsToFloat(R2i.w)) + 1.0);
R123i.w = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(uf_remappedPS[12].w)),intBitsToFloat(PS1i)) + 1.0));
PV0i.w = R123i.w;
PS0i = floatBitsToInt(exp2(intBitsToFloat(PV1i.z)));
// 19
R12i.x = R1i.w;
R12i.x = clampFI32(R12i.x);
R123i.y = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(PS0i)),intBitsToFloat(PV0i.w)) + intBitsToFloat(PV0i.w)));
PV1i.y = R123i.y;
R6i.z = floatBitsToInt((intBitsToFloat(R126i.w) * intBitsToFloat(0x3dcccccd) + intBitsToFloat(PV0i.y)));
PV1i.w = floatBitsToInt(intBitsToFloat(R13i.y) + intBitsToFloat(0x3f4ccccd));
PV1i.w = clampFI32(PV1i.w);
PS1i = floatBitsToInt(1.0 / intBitsToFloat(R124i.z));
// 20
R2i.x = floatBitsToInt((intBitsToFloat(PS1i) * intBitsToFloat(0x3dcccccd) + 1.0));
R5i.y = R6i.y;
R5i.y = clampFI32(R5i.y);
R0i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.y), intBitsToFloat(uf_remappedPS[15].w)));
R3i.w = floatBitsToInt(intBitsToFloat(PV1i.w) + -(1.0));
tempResultf = max(0.0, intBitsToFloat(R125i.x));
tempResultf = log2(tempResultf);
if( isinf(tempResultf) == true ) tempResultf = -3.40282347E+38F;
R0i.w = floatBitsToInt(tempResultf);
PS0i = R0i.w;
}
if( activeMaskStackC[1] == true ) {
// 0
R126i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[16].x), intBitsToFloat(uf_remappedPS[17].w)));
PV0i.x = R126i.x;
R125i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[16].y), intBitsToFloat(uf_remappedPS[17].w)));
PV0i.y = R125i.y;
R10i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R0i.z), intBitsToFloat(R14i.y)));
PV0i.z = R10i.z;
R4i.w = floatBitsToInt(intBitsToFloat(R2i.x) * intBitsToFloat(0x42960000));
R126i.w = floatBitsToInt(1.0 / intBitsToFloat(R2i.y));
PS0i = R126i.w;
// 1
R125i.x = PV0i.x;
R127i.y = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R0i.x)),intBitsToFloat(PS0i)) + 1.0));
R126i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[16].z), intBitsToFloat(uf_remappedPS[17].w)));
PV1i.z = R126i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(PV0i.y)),intBitsToFloat(PV0i.y)) + 1.0));
PV1i.w = R123i.w;
R0i.z = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(PV0i.z)),intBitsToFloat(R2i.z)) + intBitsToFloat(R2i.z)));
PS1i = R0i.z;
// 2
R127i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[13].y), intBitsToFloat(R0i.w)));
PV0i.y = PV1i.z;
R2i.z = floatBitsToInt(intBitsToFloat(uf_remappedPS[18].x) + -(intBitsToFloat(R6i.x)));
R0i.w = floatBitsToInt(intBitsToFloat(uf_remappedPS[18].y) + -(intBitsToFloat(R6i.w)));
tempResultf = 1.0 / sqrt(intBitsToFloat(PV1i.w));
PS0i = floatBitsToInt(tempResultf);
// 3
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R3i.x),intBitsToFloat(R5i.z),intBitsToFloat(R5i.z),-0.0),vec4(intBitsToFloat(R125i.x),intBitsToFloat(PV0i.y),intBitsToFloat(R3i.z),0.0)));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
PS1i = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PS0i), intBitsToFloat(R4i.z)));
// 4
backupReg0i = R127i.y;
backupReg1i = R127i.x;
R127i.x = floatBitsToInt(intBitsToFloat(R127i.y) + intBitsToFloat(0x2edbe6ff));
R127i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PS1i), intBitsToFloat(PV1i.x)));
R124i.z = backupReg0i;
R124i.z = clampFI32(R124i.z);
R8i.w = floatBitsToInt(intBitsToFloat(uf_remappedPS[18].z) + -(intBitsToFloat(R8i.x)));
PS0i = floatBitsToInt(exp2(intBitsToFloat(backupReg1i)));
// 5
backupReg0i = R0i.y;
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R3i.x),intBitsToFloat(backupReg0i),intBitsToFloat(R5i.z),-0.0),vec4(intBitsToFloat(R126i.x),intBitsToFloat(R125i.y),intBitsToFloat(R126i.z),0.0)));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
PS1i = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PS0i), intBitsToFloat(uf_remappedPS[19].w)));
// 6
R3i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R4i.y), intBitsToFloat(PS1i)));
R126i.y = R4i.x;
R126i.y = clampFI32(R126i.y);
PV0i.z = floatBitsToInt(max(-(intBitsToFloat(PV1i.x)), 0.0));
PV0i.w = floatBitsToInt(intBitsToFloat(PV1i.x) + -(intBitsToFloat(R127i.y)));
PS0i = floatBitsToInt(1.0 / intBitsToFloat(R127i.x));
// 7
R125i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R124i.z), intBitsToFloat(PS0i)));
PV1i.y = floatBitsToInt(min(intBitsToFloat(PV0i.z), 1.0));
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.w),intBitsToFloat(R3i.y)) + intBitsToFloat(R127i.y)));
PV1i.z = R123i.z;
R127i.w = floatBitsToInt(intBitsToFloat(R15i.w) * intBitsToFloat(0x437f0000));
R127i.y = floatBitsToInt(-(intBitsToFloat(R6i.z)) + 1.0);
PS1i = R127i.y;
// 8
R127i.x = floatBitsToInt(intBitsToFloat(R15i.x) + -(intBitsToFloat(R6i.y)));
PV0i.y = floatBitsToInt(max(-(intBitsToFloat(PV1i.z)), intBitsToFloat(0xbf7d70a4)));
PV0i.y = floatBitsToInt(intBitsToFloat(PV0i.y) / 2.0);
PV0i.z = floatBitsToInt(intBitsToFloat(PV1i.y) * intBitsToFloat(0x40a00000));
PV0i.z = clampFI32(PV0i.z);
R125i.w = floatBitsToInt(intBitsToFloat(R15i.y) + -(intBitsToFloat(R6i.y)));
R124i.w = floatBitsToInt(intBitsToFloat(R15i.z) + -(intBitsToFloat(R6i.y)));
PS0i = R124i.w;
// 9
backupReg0i = R127i.y;
backupReg1i = R6i.z;
R124i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R3i.w),intBitsToFloat(PV0i.z)) + 1.0));
R127i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R126i.w), intBitsToFloat(R5i.y)));
R6i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(backupReg0i),intBitsToFloat(R126i.y)) + intBitsToFloat(backupReg1i)));
R126i.w = floatBitsToInt(intBitsToFloat(PV0i.y) + 0.5);
PV1i.w = R126i.w;
R3i.w = 0;
PS1i = R3i.w;
// 10
backupReg0i = R127i.x;
backupReg1i = R127i.w;
R127i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(backupReg0i),intBitsToFloat(R125i.x)) + intBitsToFloat(R6i.y)));
R126i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R125i.w),intBitsToFloat(R125i.x)) + intBitsToFloat(R6i.y)));
PV0i.z = floatBitsToInt(-(intBitsToFloat(PV1i.w)) + 1.0);
R123i.w = floatBitsToInt((intBitsToFloat(PV1i.w) * intBitsToFloat(0xbc996e30) + intBitsToFloat(0x3d981626)));
PV0i.w = R123i.w;
R127i.w = int(intBitsToFloat(backupReg1i));
PS0i = R127i.w;
// 11
backupReg0i = R125i.x;
R125i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R124i.w),intBitsToFloat(backupReg0i)) + intBitsToFloat(R6i.y)));
R6i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R1i.y), intBitsToFloat(R124i.x)));
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R126i.w),intBitsToFloat(PV0i.w)) + intBitsToFloat(0xbe593484)));
PV1i.z = R123i.z;
R9i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R1i.x), intBitsToFloat(R124i.x)));
PS1i = floatBitsToInt(sqrt(intBitsToFloat(PV0i.z)));
// 12
R4i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R1i.z), intBitsToFloat(R124i.x)));
PV0i.y = floatBitsToInt(intBitsToFloat(PS1i) * intBitsToFloat(0x3f22f983));
PV0i.z = floatBitsToInt(intBitsToFloat(0x3f895ef0) * intBitsToFloat(R127i.y));
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R126i.w),intBitsToFloat(PV1i.z)) + intBitsToFloat(0x3fc90da4)));
PV0i.w = R123i.w;
R127i.y = R127i.w & int(1);
PS0i = R127i.y;
// 13
backupReg0i = R2i.w;
backupReg0i = R2i.w;
R11i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.y),-(intBitsToFloat(PV0i.w))) + 1.0));
R5i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.z),intBitsToFloat(R127i.x)) + intBitsToFloat(0xba0a8ec8)));
R5i.y = clampFI32(R5i.y);
R5i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.z),intBitsToFloat(R126i.y)) + intBitsToFloat(0xba0a8ec8)));
R5i.z = clampFI32(R5i.z);
R2i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(backupReg0i),-(intBitsToFloat(R10i.z))) + intBitsToFloat(backupReg0i)));
R3i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.z),intBitsToFloat(R125i.x)) + intBitsToFloat(0xba0a8ec8)));
R3i.z = clampFI32(R3i.z);
PS1i = R3i.z;
// 14
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R17i.x),intBitsToFloat(R17i.y),intBitsToFloat(R13i.z),-0.0),vec4(intBitsToFloat(uf_remappedPS[16].x),intBitsToFloat(uf_remappedPS[16].y),intBitsToFloat(uf_remappedPS[16].z),0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
PS0i = floatBitsToInt(float(R127i.y));
// 15
R2i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.x), intBitsToFloat(PS0i)));
R2i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.y), intBitsToFloat(PS0i)));
R4i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.z), intBitsToFloat(PS0i)));
PV1i.w = floatBitsToInt(max(-(intBitsToFloat(PV0i.x)), 0.0));
PS1i = floatBitsToInt(intBitsToFloat(R7i.z) * intBitsToFloat(0x3eaaaaab));
// 16
R123i.x = floatBitsToInt((intBitsToFloat(R7i.y) * intBitsToFloat(0x3eaaaaab) + intBitsToFloat(PS1i)));
PV0i.x = R123i.x;
PV0i.z = floatBitsToInt(min(intBitsToFloat(PV1i.w), 1.0));
PS0i = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R13i.z), -(intBitsToFloat(R3i.w))));
// 17
backupReg0i = R7i.x;
R7i.x = floatBitsToInt((intBitsToFloat(backupReg0i) * intBitsToFloat(0x3eaaaaab) + intBitsToFloat(PV0i.x)));
PV1i.y = floatBitsToInt(intBitsToFloat(PV0i.z) + intBitsToFloat(0xbecccccd));
R122i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R13i.z),-(intBitsToFloat(R126i.z))) + intBitsToFloat(PS0i)));
PS1i = R122i.x;
// 18
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R17i.y),-(intBitsToFloat(R125i.y))) + intBitsToFloat(PS1i)));
PV0i.x = R123i.x;
R7i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.y), intBitsToFloat(R4i.w)));
R7i.z = clampFI32(R7i.z);
// 19
R12i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R17i.x),-(intBitsToFloat(R126i.x))) + intBitsToFloat(PV0i.x)));
PV1i.z = R12i.z;
// 20
PV0i.y = PV1i.z;
PV0i.y = clampFI32(PV0i.y);
// 21
R14i.z = floatBitsToInt(intBitsToFloat(PV0i.y) + intBitsToFloat(0xbecccccd));
}
if( activeMaskStackC[1] == true ) {
// 0
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R5i.x),intBitsToFloat(R8i.y),intBitsToFloat(R8i.z),intBitsToFloat(R5i.w)),vec4(intBitsToFloat(uf_remappedPS[20].x),intBitsToFloat(uf_remappedPS[20].y),intBitsToFloat(uf_remappedPS[20].z),intBitsToFloat(uf_remappedPS[20].w))));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
// 1
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R5i.x),intBitsToFloat(R8i.y),intBitsToFloat(R8i.z),intBitsToFloat(R5i.w)),vec4(intBitsToFloat(uf_remappedPS[21].x),intBitsToFloat(uf_remappedPS[21].y),intBitsToFloat(uf_remappedPS[21].z),intBitsToFloat(uf_remappedPS[21].w))));
PV1i.x = tempi.x;
PV1i.y = tempi.x;
PV1i.z = tempi.x;
PV1i.w = tempi.x;
R126i.z = floatBitsToInt(1.0 / intBitsToFloat(PV0i.x));
PS1i = R126i.z;
// 2
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R5i.x),intBitsToFloat(R8i.y),intBitsToFloat(R8i.z),intBitsToFloat(R5i.w)),vec4(intBitsToFloat(uf_remappedPS[22].x),intBitsToFloat(uf_remappedPS[22].y),intBitsToFloat(uf_remappedPS[22].z),intBitsToFloat(uf_remappedPS[22].w))));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
R10i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.x), intBitsToFloat(PS1i)));
PS0i = R10i.x;
// 3
R10i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.x), intBitsToFloat(R126i.z)));
}
if( activeMaskStackC[1] == true ) {
R9i.y = floatBitsToInt(textureLod(textureUnitPS0, intBitsToFloat(R9i.xy),0.0).x);
R10i.w = floatBitsToInt(textureLod(textureUnitPS5, intBitsToFloat(R10i.xy),intBitsToFloat(R10i.w)).x);
R11i.xyz = floatBitsToInt(texture(textureUnitPS12, intBitsToFloat(R11i.xy)).xyz);
}
if( activeMaskStackC[1] == true ) {
// 0
backupReg0i = R9i.y;
PV0i.x = floatBitsToInt(intBitsToFloat(R10i.w) + intBitsToFloat(uf_remappedPS[23].z));
PV0i.x = clampFI32(PV0i.x);
R9i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R11i.x), intBitsToFloat(R6i.z)));
R123i.z = floatBitsToInt((intBitsToFloat(backupReg0i) * 2.0 + -(1.0)));
PV0i.z = R123i.z;
R5i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R11i.y), intBitsToFloat(R6i.z)));
R11i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R11i.z), intBitsToFloat(R6i.z)));
PS0i = R11i.y;
// 1
R123i.x = floatBitsToInt((intBitsToFloat(PV0i.z) * intBitsToFloat(0x41c80000) + intBitsToFloat(R9i.z)));
PV1i.x = R123i.x;
R3i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.x), intBitsToFloat(uf_remappedPS[24].z)));
PV1i.y = R3i.y;
// 2
R4i.y = PV1i.y;
PV0i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.y), intBitsToFloat(R12i.y)));
R10i.w = floatBitsToInt(-(intBitsToFloat(PV1i.x)) + intBitsToFloat(uf_remappedPS[25].x));
// 3
PV1i.z = floatBitsToInt(intBitsToFloat(R1i.w) + intBitsToFloat(PV0i.z));
PV1i.z = clampFI32(PV1i.z);
PV1i.w = floatBitsToInt(intBitsToFloat(PV0i.z) + -(1.0));
// 4
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R8i.w),intBitsToFloat(PV1i.z)) + intBitsToFloat(R8i.x)));
PV0i.x = R123i.x;
R123i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R0i.w),intBitsToFloat(PV1i.z)) + intBitsToFloat(R6i.w)));
PV0i.y = R123i.y;
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV1i.z)) + intBitsToFloat(R6i.x)));
PV0i.z = R123i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV1i.w),intBitsToFloat(R12i.x)) + 1.0));
PV0i.w = R123i.w;
// 5
PV1i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.w), intBitsToFloat(R7i.z)));
PV1i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.x), intBitsToFloat(uf_remappedPS[26].z)));
PV1i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.y), intBitsToFloat(uf_remappedPS[26].y)));
PV1i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.z), intBitsToFloat(uf_remappedPS[26].x)));
// 6
PV0i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[17].w), intBitsToFloat(PV1i.y)));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[17].w), intBitsToFloat(PV1i.z)));
PV0i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[17].w), intBitsToFloat(PV1i.w)));
PV0i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R13i.y), intBitsToFloat(PV1i.x)));
// 7
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.z),intBitsToFloat(PV0i.w)) + intBitsToFloat(R9i.w)));
PV1i.x = R123i.x;
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.x),intBitsToFloat(PV0i.w)) + intBitsToFloat(R4i.x)));
PV1i.z = R123i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(PV0i.y),intBitsToFloat(PV0i.w)) + intBitsToFloat(R6i.y)));
PV1i.w = R123i.w;
// 8
PV0i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.w), intBitsToFloat(R5i.z)));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.x), intBitsToFloat(R5i.y)));
PV0i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.z), intBitsToFloat(R3i.z)));
// 9
R0i.x = floatBitsToInt((intBitsToFloat(PV0i.y) * intBitsToFloat(0x3f6e896b) + intBitsToFloat(0x3a011b1e)));
R0i.y = floatBitsToInt((intBitsToFloat(PV0i.x) * intBitsToFloat(0x3f6e896b) + intBitsToFloat(0x3a011b1e)));
R2i.z = floatBitsToInt((intBitsToFloat(PV0i.w) * intBitsToFloat(0x3f6e896b) + intBitsToFloat(0x3a011b1e)));
}
if( activeMaskStackC[1] == true ) {
activeMaskStack[1] = activeMaskStack[0];
activeMaskStackC[2] = activeMaskStackC[1];
// 0
R123i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R10i.w),intBitsToFloat(uf_remappedPS[27].x)) + intBitsToFloat(uf_remappedPS[28].w)));
R123i.y = clampFI32(R123i.y);
PV0i.y = R123i.y;
// 1
PV1i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.y), intBitsToFloat(uf_remappedPS[29].w)));
// 2
PV0i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV1i.z), intBitsToFloat(R14i.y)));
// 3
R123i.x = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(PV0i.w)),intBitsToFloat(R0i.z)) + intBitsToFloat(R0i.z)));
PV1i.x = R123i.x;
PV1i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(PV0i.w), intBitsToFloat(R0i.z)));
// 4
PV0i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[29].y), intBitsToFloat(PV1i.y)));
PV0i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[29].z), intBitsToFloat(PV1i.y)));
PV0i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(uf_remappedPS[29].x), intBitsToFloat(PV1i.y)));
PV0i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R3i.x), intBitsToFloat(PV1i.x)));
R5i.z = floatBitsToInt((mul_nonIEEE(-(intBitsToFloat(R3i.x)),intBitsToFloat(PV1i.x)) + intBitsToFloat(PV1i.x)));
PS0i = R5i.z;
// 5
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[19].z),intBitsToFloat(PV0i.w)) + intBitsToFloat(PV0i.y)));
PV1i.x = R123i.x;
R123i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[19].x),intBitsToFloat(PV0i.w)) + intBitsToFloat(PV0i.z)));
PV1i.y = R123i.y;
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[19].y),intBitsToFloat(PV0i.w)) + intBitsToFloat(PV0i.x)));
PV1i.z = R123i.z;
R4i.w = 0;
// 6
R123i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R9i.y),intBitsToFloat(R2i.w)) + intBitsToFloat(PV1i.y)));
PV0i.y = R123i.y;
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R5i.w),intBitsToFloat(R2i.w)) + intBitsToFloat(PV1i.z)));
PV0i.z = R123i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R11i.y),intBitsToFloat(R2i.w)) + intBitsToFloat(PV1i.x)));
PV0i.w = R123i.w;
// 7
R4i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[15].x),intBitsToFloat(R10i.z)) + intBitsToFloat(PV0i.y)));
R5i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[15].y),intBitsToFloat(R10i.z)) + intBitsToFloat(PV0i.z)));
R6i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[15].z),intBitsToFloat(R10i.z)) + intBitsToFloat(PV0i.w)));
// 8
predResult = (intBitsToFloat(R14i.x) != intBitsToFloat(0x3dc0c0c1));
activeMaskStack[1] = predResult;
activeMaskStackC[2] = predResult == true && activeMaskStackC[1] == true;
}
else {
activeMaskStack[1] = false;
activeMaskStackC[2] = false;
}
if( activeMaskStackC[2] == true ) {
// 0
R3i.xyz = floatBitsToInt(vec3(intBitsToFloat(R2i.x),intBitsToFloat(R2i.y),intBitsToFloat(R4i.z)) + vec3(intBitsToFloat(R0i.x),intBitsToFloat(R0i.y),intBitsToFloat(R2i.z)));
R3i.w = 0x3f800000;
R0i.x = 0;
PS0i = R0i.x;
// 1
R0i.yzw = ivec3(0,0,0);
}
activeMaskStack[1] = activeMaskStack[1] == false;
activeMaskStackC[2] = activeMaskStack[1] == true && activeMaskStackC[1] == true;
if( activeMaskStackC[2] == true ) {
// 0
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R17i.x),intBitsToFloat(R17i.y),intBitsToFloat(R13i.z),-0.0),vec4(intBitsToFloat(uf_remappedPS[30].x),intBitsToFloat(uf_remappedPS[30].y),intBitsToFloat(uf_remappedPS[30].z),0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
R0i.w = 0x40400000;
PS0i = R0i.w;
// 1
R127i.x = floatBitsToInt(dot(vec4(intBitsToFloat(R17i.x),intBitsToFloat(R17i.y),intBitsToFloat(R13i.z),-0.0),vec4(intBitsToFloat(uf_remappedPS[31].x),intBitsToFloat(uf_remappedPS[31].y),intBitsToFloat(uf_remappedPS[31].z),0.0)));
PV1i.x = R127i.x;
PV1i.y = R127i.x;
PV1i.z = R127i.x;
PV1i.w = R127i.x;
R127i.z = floatBitsToInt(-(intBitsToFloat(PV0i.x)));
PS1i = R127i.z;
// 2
tempi.x = floatBitsToInt(dot(vec4(intBitsToFloat(R17i.x),intBitsToFloat(R17i.y),intBitsToFloat(R13i.z),-0.0),vec4(intBitsToFloat(uf_remappedPS[32].x),intBitsToFloat(uf_remappedPS[32].y),intBitsToFloat(uf_remappedPS[32].z),0.0)));
PV0i.x = tempi.x;
PV0i.y = tempi.x;
PV0i.z = tempi.x;
PV0i.w = tempi.x;
R127i.y = tempi.x;
PS0i = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R12i.z), intBitsToFloat(R13i.x)));
// 3
backupReg0i = R127i.x;
backupReg0i = R127i.x;
backupReg1i = R127i.z;
backupReg1i = R127i.z;
redcCUBE(vec4(intBitsToFloat(R127i.z),intBitsToFloat(R127i.z),intBitsToFloat(backupReg0i),intBitsToFloat(PV0i.x)),vec4(intBitsToFloat(PV0i.x),intBitsToFloat(backupReg0i),intBitsToFloat(backupReg1i),intBitsToFloat(backupReg1i)),cubeMapSTM,cubeMapFaceId);
R127i.x = floatBitsToInt(cubeMapSTM.x);
R127i.y = floatBitsToInt(cubeMapSTM.y);
R127i.z = floatBitsToInt(cubeMapSTM.z);
R127i.w = cubeMapFaceId;
PV1i.x = R127i.x;
PV1i.y = R127i.y;
PV1i.z = R127i.z;
PV1i.w = R127i.w;
R2i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R3i.y), intBitsToFloat(PS0i)));
R2i.z = clampFI32(R2i.z);
PS1i = R2i.z;
// 4
PV0i.x = floatBitsToInt(intBitsToFloat(R14i.z) * intBitsToFloat(0x42960000));
PV0i.x = clampFI32(PV0i.x);
R0i.z = PV1i.w;
PS0i = floatBitsToInt(1.0 / abs(intBitsToFloat(PV1i.z)));
// 5
backupReg0i = R1i.y;
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R127i.x),intBitsToFloat(PS0i)) + 1.5));
PV1i.x = R123i.x;
R1i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].y),intBitsToFloat(PV0i.x)) + intBitsToFloat(backupReg0i)));
R123i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].x),intBitsToFloat(PV0i.x)) + intBitsToFloat(R1i.x)));
PV1i.z = R123i.z;
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R127i.y),intBitsToFloat(PS0i)) + 1.5));
PV1i.w = R123i.w;
R1i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].z),intBitsToFloat(PV0i.x)) + intBitsToFloat(R1i.z)));
PS1i = R1i.x;
// 6
R0i.x = PV1i.w;
R0i.y = PV1i.x;
R3i.x = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.x), intBitsToFloat(PV1i.z)));
PS0i = R3i.x;
}
if( activeMaskStackC[2] == true ) {
R0i.xyz = floatBitsToInt(textureLod(textureUnitPS7, vec4(redcCUBEReverse(intBitsToFloat(R0i.xy),R0i.z),cubeMapArrayIndex7),intBitsToFloat(R0i.w)).xyz);
}
if( activeMaskStackC[2] == true ) {
// 0
R123i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].y),intBitsToFloat(R2i.z)) + intBitsToFloat(R0i.y)));
PV0i.x = R123i.x;
R123i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].x),intBitsToFloat(R2i.z)) + intBitsToFloat(R0i.x)));
PV0i.y = R123i.y;
R3i.z = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.z), intBitsToFloat(R1i.x)));
R123i.w = floatBitsToInt((mul_nonIEEE(intBitsToFloat(uf_remappedPS[18].z),intBitsToFloat(R2i.z)) + intBitsToFloat(R0i.z)));
PV0i.w = R123i.w;
R3i.y = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R16i.y), intBitsToFloat(R1i.y)));
PS0i = R3i.y;
// 1
R0i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R15i.x),intBitsToFloat(PV0i.y)) + intBitsToFloat(R2i.x)));
R0i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R15i.y),intBitsToFloat(PV0i.x)) + intBitsToFloat(R2i.y)));
R0i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R15i.z),intBitsToFloat(PV0i.w)) + intBitsToFloat(R4i.z)));
R0i.w = 0;
R3i.w = 0x3f800000;
PS1i = R3i.w;
}
activeMaskStackC[1] = activeMaskStack[0] == true && activeMaskStackC[0] == true;
if( activeMaskStackC[1] == true ) {
// 0
R1i.w = 0x3f800000;
// 1
backupReg0i = R3i.x;
backupReg1i = R3i.y;
backupReg2i = R3i.z;
backupReg3i = R3i.w;
R3i.xyz = ivec3(backupReg0i,backupReg1i,backupReg2i);
R3i.w = backupReg3i;
// 2
R2i.xyz = ivec3(R0i.x,R0i.y,R0i.z);
R2i.w = R0i.w;
// 3
backupReg0i = R1i.w;
R1i.xyz = ivec3(R4i.x,R5i.y,R6i.z);
R1i.w = backupReg0i;
// 4
R0i.xyz = ivec3(R13i.x,R4i.y,R5i.z);
R0i.w = R4i.w;
// 5
R4i.xyz = ivec3(R7i.x,R7i.x,R7i.x);
R4i.w = R7i.x;
}
// export
passPixelColor0 = vec4(intBitsToFloat(R0i.x), intBitsToFloat(R0i.y), intBitsToFloat(R0i.z), intBitsToFloat(R0i.w)); // light/shadows on link when sun face side
passPixelColor1 = vec4(intBitsToFloat(R1i.x) * npcfogred, intBitsToFloat(R1i.y) * npcfoggreen, intBitsToFloat(R1i.z) * npcfogblue, intBitsToFloat(R1i.w) * npcfogopacity); // link and all npcs body fog rgb
passPixelColor2 = vec4(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y), intBitsToFloat(R2i.z), intBitsToFloat(R2i.w)); // link rgb only in celshade removal mode
passPixelColor3 = vec4(intBitsToFloat(R3i.x), intBitsToFloat(R3i.y), intBitsToFloat(R3i.z), intBitsToFloat(R3i.w));
passPixelColor4 = vec4(intBitsToFloat(R4i.x), intBitsToFloat(R4i.y), intBitsToFloat(R4i.z), intBitsToFloat(R4i.w));
}

View File

@ -1,9 +1,12 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader 29c30aaa023dc7e6
// Used for: Big Bottom Swirls of Ganon's Aura around Hyrule Castle
// shader 29c30aaa023dc7e6 -- Ganons middle and bottom big swirl
#define aurared $castleaurared
#define auragreen $castleauragreen
#define aurablue $castleaurablue
#define auraopacity $castleauraopacity
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -163,19 +166,14 @@ PV0f.y = R127f.y;
R127f.w = (mul_nonIEEE(PV1f.z,R8f.w) + backupReg0f); R127f.w = (mul_nonIEEE(PV1f.z,R8f.w) + backupReg0f);
PV0f.w = R127f.w; PV0f.w = R127f.w;
// 9 // 9
PV1f.x = -(PV0f.w) + intBitsToFloat(uf_remappedPS[1].z); PV1f.x = -(PV0f.w) + intBitsToFloat(uf_remappedPS[1].z); // blue rgb
PV1f.y = -(PV0f.x) + intBitsToFloat(uf_remappedPS[1].y); PV1f.y = -(PV0f.x) + intBitsToFloat(uf_remappedPS[1].y); // green rgb
PV1f.z = -(PV0f.y) + intBitsToFloat(uf_remappedPS[1].x); PV1f.z = -(PV0f.y) + intBitsToFloat(uf_remappedPS[1].x); // red rgb
// 10 // 10
R1f.x = (mul_nonIEEE(PV1f.z,R9f.x) + R127f.y); R1f.x = (mul_nonIEEE(PV1f.z,R9f.x) + R127f.y); // red rgb
R1f.y = (mul_nonIEEE(PV1f.y,R9f.x) + R127f.x); R1f.y = (mul_nonIEEE(PV1f.y,R9f.x) + R127f.x); // green rgb
R1f.z = (mul_nonIEEE(PV1f.x,R9f.x) + R127f.w); R1f.z = (mul_nonIEEE(PV1f.x,R9f.x) + R127f.w); // blue rgb
// export // export
if( ((vec4(R1f.x, R1f.y, R1f.z, R1f.w)).a > uf_alphaTestRef) == false) discard; if( ((vec4(R1f.x, R1f.y, R1f.z, R1f.w)).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(R1f.x * aurared, R1f.y * auragreen, R1f.z * aurablue, R1f.w * auraopacity); // rgb color and opacity for the middle swirl effect
#if ($enableGanonAuraColor == 0)
passPixelColor0 = vec4(R1f.x, R1f.y, R1f.z, R1f.w*$ganonAuraOpacity);
#else
passPixelColor0 = vec4($ganonAuraRed, $ganonAuraGreen, $ganonAuraBlue, R1f.w*$ganonAuraOpacity);
#endif
} }

View File

@ -1,13 +1,12 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader 2e2543216c04766d
// Used for: Fog Around Water
float fogOpacity = float($waterFogOpacity); // shader 2e2543216c04766d -- Water RGB and edge clarity and Distant Water Fog
float fogRed = float($waterFogOpacity); #define waterfoglevel $distantfoglevel
float fogGreen = float($waterFogOpacity); #define waterfogred $distantfogred
float fogBlue = float($waterFogOpacity); #define waterfoggreen $distantfoggreen
#define waterfogblue $distantfogred
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -687,19 +686,13 @@ R3i.w = floatBitsToInt((intBitsToFloat(R125i.w) * intBitsToFloat(0x3f6e896b) + i
R6i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R127i.z), intBitsToFloat(R126i.w))); R6i.w = floatBitsToInt(mul_nonIEEE(intBitsToFloat(R127i.z), intBitsToFloat(R126i.w)));
PS1i = R6i.w; PS1i = R6i.w;
// 22 // 22
PV0i.y = floatBitsToInt(intBitsToFloat(R4i.x) + intBitsToFloat(R3i.w)); PV0i.y = floatBitsToInt(intBitsToFloat(R4i.x) + intBitsToFloat(R3i.w)); // blue color body water
PV0i.z = floatBitsToInt(intBitsToFloat(R9i.y) + intBitsToFloat(R8i.y)); PV0i.z = floatBitsToInt(intBitsToFloat(R9i.y) + intBitsToFloat(R8i.y)); // green color body water
PV0i.w = floatBitsToInt(intBitsToFloat(R4i.z) + intBitsToFloat(R4i.y)); PV0i.w = floatBitsToInt(intBitsToFloat(R4i.z) + intBitsToFloat(R4i.y)); // red color body water
// 23 // 23
R6i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.w)) + intBitsToFloat(R3i.x))); R6i.x = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.w)) + intBitsToFloat(R3i.x) * waterfogred )); // R3i is water fog color red
R6i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.z)) + intBitsToFloat(R3i.y))); R6i.y = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.z)) + intBitsToFloat(R3i.y) * waterfoggreen )); // R3i is water fog green
R6i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.y)) + intBitsToFloat(R3i.z))); R6i.z = floatBitsToInt((mul_nonIEEE(intBitsToFloat(R2i.z),intBitsToFloat(PV0i.y)) + intBitsToFloat(R3i.z) * waterfogblue )); // R3i is water fog blue
// export // export
#if ($enableWaterFogColor == 0) passPixelColor0 = vec4(intBitsToFloat(R6i.x), intBitsToFloat(R6i.y), intBitsToFloat(R6i.z), intBitsToFloat(R6i.w)) * waterfoglevel; // xyz is RGB for water color, and w is edge see through clarity
passPixelColor0 = vec4(intBitsToFloat(R6i.x), intBitsToFloat(R6i.y), intBitsToFloat(R6i.z), intBitsToFloat(R6i.w) * fogOpacity);
#else
passPixelColor0 = vec4(fogRed, fogGreen, fogBlue, intBitsToFloat(R6i.w)*fogOpacity);
#endif
} }

View File

@ -1,9 +1,12 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader 397f3d8521c96e30
// Used for: Small Top Swirls of Ganon's Aura around Hyrule Castle
// shader 397f3d8521c96e30 -- ganons castle swirl shader
#define aurared $castleaurared
#define auragreen $castleauragreen
#define aurablue $castleaurablue
#define auraopacity $castleauraopacity
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -196,10 +199,5 @@ R8f.y = (mul_nonIEEE(PV0f.y,R10f.x) + R127f.x);
R8f.z = (mul_nonIEEE(PV0f.x,R10f.x) + R127f.w); R8f.z = (mul_nonIEEE(PV0f.x,R10f.x) + R127f.w);
// export // export
if( ((vec4(R8f.x, R8f.y, R8f.z, R8f.w)).a > uf_alphaTestRef) == false) discard; if( ((vec4(R8f.x, R8f.y, R8f.z, R8f.w)).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(R8f.x * aurared, R8f.y * auragreen, R8f.z * aurablue, R8f.w * auraopacity); // rgb color for the top swirls effect
#if ($enableGanonAuraColor == 0)
passPixelColor0 = vec4(R8f.x, R8f.y, R8f.z, R8f.w*$ganonAuraOpacity);
#else
passPixelColor0 = vec4($ganonAuraRed, $ganonAuraGreen, $ganonAuraBlue, R8f.w*$ganonAuraOpacity);
#endif
} }

View File

@ -1,9 +1,13 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader 527591781440691a
// Used for: Distance Fog
// shader 527591781440691a -- Controls RGb and Opacity of the Fog Clouds in the distance
#define ffcOpacity $fieldfogcloudsopacity
#define ffcRed $fieldfogcloudsred
#define ffcGreen $fieldfogcloudsgreen
#define ffcBlue $fieldfogcloudsblue
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -343,10 +347,5 @@ PV1f.x = mul_nonIEEE(R1f.w, PV0f.y);
R10f.w = mul_nonIEEE(R3f.x, PV1f.x); R10f.w = mul_nonIEEE(R3f.x, PV1f.x);
// export // export
if( ((vec4(R10f.x, R10f.y, R10f.z, R10f.w)).a > uf_alphaTestRef) == false) discard; if( ((vec4(R10f.x, R10f.y, R10f.z, R10f.w)).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(R10f.x * ffcRed, R10f.y * ffcGreen, R10f.z * ffcBlue, R10f.w * ffcOpacity); // RGB for fog fields in the distance
#if ($enableDistanceFogColor == 0)
passPixelColor0 = vec4(R10f.x, R10f.y, R10f.z, R10f.w*$distanceFogOpacity);
#else
passPixelColor0 = vec4($distanceFogRed, $distanceFogGreen, $distanceFogBlue, R10f.w*$distanceFogOpacity);
#endif
} }

View File

@ -0,0 +1,243 @@
#version 430
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable
// shader 5a8eb2055c65a0c2 -- Something Close to Aura RGB
#define aurared $castleaurared
#define auragreen $castleauragreen
#define aurablue $aurablue
#define auraopacity $castleauraopacity
// start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN
#define ATTR_LAYOUT(__vkSet, __location) layout(set = __vkSet, location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(set = __vkSet, binding = __vkLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale.xy,gl_FragCoord.zw)
#else
#define ATTR_LAYOUT(__vkSet, __location) layout(location = __location)
#define UNIFORM_BUFFER_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation, std140)
#define TEXTURE_LAYOUT(__glLocation, __vkSet, __vkLocation) layout(binding = __glLocation)
#define GET_FRAGCOORD() vec4(gl_FragCoord.xy*uf_fragCoordScale,gl_FragCoord.zw)
#endif
#ifdef VULKAN
layout(set = 1, binding = 4) uniform ufBlock
{
uniform ivec4 uf_remappedPS[5];
uniform float uf_alphaTestRef;
uniform vec4 uf_fragCoordScale;
};
#else
uniform ivec4 uf_remappedPS[5];
uniform float uf_alphaTestRef;
uniform vec2 uf_fragCoordScale;
#endif
TEXTURE_LAYOUT(0, 1, 0) uniform sampler2D textureUnitPS0;
TEXTURE_LAYOUT(1, 1, 1) uniform sampler2D textureUnitPS1;
TEXTURE_LAYOUT(2, 1, 2) uniform sampler2D textureUnitPS2;
TEXTURE_LAYOUT(4, 1, 3) uniform sampler2D textureUnitPS4;
layout(location = 0) in vec4 passParameterSem0;
layout(location = 1) in vec4 passParameterSem1;
layout(location = 2) in vec4 passParameterSem2;
layout(location = 3) in vec4 passParameterSem3;
layout(location = 4) in vec4 passParameterSem4;
layout(location = 5) in vec4 passParameterSem5;
layout(location = 6) in vec4 passParameterSem7;
layout(location = 7) in vec4 passParameterSem8;
layout(location = 8) in vec4 passParameterSem9;
layout(location = 9) in vec4 passParameterSem11;
layout(location = 10) in vec4 passParameterSem14;
layout(location = 11) in vec4 passParameterSem15;
layout(location = 12) in vec4 passParameterSem16;
layout(location = 0) out vec4 passPixelColor0;
// end of shader inputs/outputs
int clampFI32(int v)
{
if( v == 0x7FFFFFFF )
return floatBitsToInt(1.0);
else if( v == 0xFFFFFFFF )
return floatBitsToInt(0.0);
return floatBitsToInt(clamp(intBitsToFloat(v), 0.0, 1.0));
}
float mul_nonIEEE(float a, float b){ if( a == 0.0 || b == 0.0 ) return 0.0; return a*b; }
void main()
{
vec4 R0f = vec4(0.0);
vec4 R1f = vec4(0.0);
vec4 R2f = vec4(0.0);
vec4 R3f = vec4(0.0);
vec4 R4f = vec4(0.0);
vec4 R5f = vec4(0.0);
vec4 R6f = vec4(0.0);
vec4 R7f = vec4(0.0);
vec4 R8f = vec4(0.0);
vec4 R9f = vec4(0.0);
vec4 R10f = vec4(0.0);
vec4 R11f = vec4(0.0);
vec4 R12f = vec4(0.0);
vec4 R13f = vec4(0.0);
vec4 R122f = vec4(0.0);
vec4 R123f = vec4(0.0);
vec4 R125f = vec4(0.0);
vec4 R126f = vec4(0.0);
vec4 R127f = vec4(0.0);
float backupReg0f, backupReg1f, backupReg2f, backupReg3f, backupReg4f;
vec4 PV0f = vec4(0.0), PV1f = vec4(0.0);
float PS0f = 0.0, PS1f = 0.0;
vec4 tempf = vec4(0.0);
float tempResultf;
int tempResulti;
ivec4 ARi = ivec4(0);
bool predResult = true;
vec3 cubeMapSTM;
int cubeMapFaceId;
R0f = passParameterSem0;
R1f = passParameterSem1;
R2f = passParameterSem2;
R3f = passParameterSem3;
R4f = passParameterSem4;
R5f = passParameterSem5;
R6f = passParameterSem7;
R7f = passParameterSem8;
R8f = passParameterSem9;
R9f = passParameterSem11;
R10f = passParameterSem14;
R11f = passParameterSem15;
R12f = passParameterSem16;
R5f.xw = (texture(textureUnitPS0, R7f.xy).xw);
// 0
R127f.x = R2f.z * R2f.z;
R123f.y = (R5f.x * 2.0 + -(1.0));
PV0f.y = R123f.y;
R4f.z = -(intBitsToFloat(uf_remappedPS[0].z)) + intBitsToFloat(uf_remappedPS[0].w);
R123f.w = (R5f.w * 2.0 + -(1.0));
PV0f.w = R123f.w;
PS0f = 1.0 / R3f.w;
// 1
R13f.x = mul_nonIEEE(R3f.x, PS0f);
PV1f.y = mul_nonIEEE(R5f.y, PV0f.w);
PV1f.z = mul_nonIEEE(R4f.y, PV0f.y);
R13f.w = mul_nonIEEE(R3f.y, PS0f);
R6f.y = 1.0 / R3f.w;
PS1f = R6f.y;
// 2
backupReg0f = R5f.z;
backupReg0f = R5f.z;
R5f.x = R7f.z + PV1f.z;
R5f.y = R7f.w + PV1f.y;
R5f.z = (mul_nonIEEE(backupReg0f,PV1f.z) + R8f.x);
R5f.w = (mul_nonIEEE(backupReg0f,PV1f.y) + R8f.y);
R7f.x = (R2f.y * R2f.y + R127f.x);
PS0f = R7f.x;
R5f.x = (texture(textureUnitPS1, R5f.xy).w);
R8f.xw = (texture(textureUnitPS2, R5f.zw).xw);
R5f.z = (texture(textureUnitPS4, R13f.xw).x);
// 0
R123f.x = (mul_nonIEEE(R6f.w,R5f.x) + -(R0f.w));
PV0f.x = R123f.x;
PV0f.y = R3f.z * R6f.y;
R123f.z = (R2f.x * R2f.x + R7f.x);
PV0f.z = R123f.z;
R127f.w = mul_nonIEEE(R8f.w, R8f.w);
R126f.w = (mul_nonIEEE(intBitsToFloat(uf_remappedPS[1].w),R5f.z) + intBitsToFloat(uf_remappedPS[1].x));
PS0f = R126f.w;
// 1
PV1f.x = mul_nonIEEE(R8f.x, R8f.x);
R127f.y = (mul_nonIEEE(PV0f.y,intBitsToFloat(uf_remappedPS[1].w)) + -(intBitsToFloat(uf_remappedPS[1].y)));
R125f.w = mul_nonIEEE(R1f.w, PV0f.x);
R125f.w = clamp(R125f.w, 0.0, 1.0);
PV1f.w = R125f.w;
tempResultf = 1.0 / sqrt(PV0f.z);
PS1f = tempResultf;
// 2
backupReg0f = R127f.w;
PV0f.x = mul_nonIEEE(R2f.x, PS1f);
PV0f.y = mul_nonIEEE(R2f.y, PS1f);
PV0f.z = mul_nonIEEE(R2f.z, PS1f);
R127f.w = mul_nonIEEE(backupReg0f, PV1f.w);
PV0f.w = R127f.w;
R127f.z = mul_nonIEEE(PV1f.x, PV1f.w);
PS0f = R127f.z;
// 3
backupReg0f = R0f.x;
tempf.x = dot(vec4(R9f.x,R9f.y,R9f.z,-0.0),vec4(PV0f.x,PV0f.y,PV0f.z,0.0));
PV1f.x = tempf.x;
PV1f.y = tempf.x;
PV1f.z = tempf.x;
PV1f.w = tempf.x;
R122f.x = (mul_nonIEEE(backupReg0f,PV0f.w) + intBitsToFloat(0x3c75c28f));
PS1f = R122f.x;
// 4
backupReg0f = R0f.y;
PV0f.x = max(PV1f.x, -(PV1f.x));
R0f.y = (mul_nonIEEE(R1f.x,R127f.z) + PS1f);
R123f.z = (mul_nonIEEE(R0f.z,R127f.w) + intBitsToFloat(0x3d23d70a));
PV0f.z = R123f.z;
R123f.w = (mul_nonIEEE(backupReg0f,R127f.w) + intBitsToFloat(0x3c75c28f));
PV0f.w = R123f.w;
PS0f = 1.0 / R127f.y;
// 5
R1f.x = (mul_nonIEEE(R1f.y,R127f.z) + PV0f.w);
PV1f.y = -(intBitsToFloat(uf_remappedPS[1].z)) * PS0f;
PV1f.z = PV0f.x + -(intBitsToFloat(uf_remappedPS[0].z));
R1f.w = (mul_nonIEEE(R1f.z,R127f.z) + PV0f.z);
PS1f = 1.0 / R4f.z;
// 6
PV0f.x = PV1f.z * PS1f;
PV0f.x = clamp(PV0f.x, 0.0, 1.0);
R127f.y = R125f.w;
R127f.y = clamp(R127f.y, 0.0, 1.0);
PV0f.z = -(PV1f.y) + R126f.w;
PS0f = 1.0 / intBitsToFloat(uf_remappedPS[2].y);
// 7
PV1f.x = PV0f.z * PS0f;
PV1f.x = clamp(PV1f.x, 0.0, 1.0);
R123f.z = (intBitsToFloat(0xc0000000) * PV0f.x + intBitsToFloat(0x40400000));
PV1f.z = R123f.z;
PV1f.w = mul_nonIEEE(PV0f.x, PV0f.x);
// 8
PV0f.y = mul_nonIEEE(PV1f.w, PV1f.z);
PV0f.w = mul_nonIEEE(R127f.y, PV1f.x);
// 9
PV1f.x = mul_nonIEEE(PV0f.w, PV0f.y);
// 10
PV0f.w = mul_nonIEEE(R4f.x, PV1f.x);
// 11
backupReg0f = R10f.w;
R10f.w = mul_nonIEEE(backupReg0f, PV0f.w);
// 0
backupReg0f = R0f.y;
PV0f.x = -(R1f.w) + intBitsToFloat(uf_remappedPS[3].z);
PV0f.y = -(R1f.x) + intBitsToFloat(uf_remappedPS[3].y);
PV0f.z = -(backupReg0f) + intBitsToFloat(uf_remappedPS[3].x);
// 1
R127f.y = (mul_nonIEEE(PV0f.x,R12f.y) + R1f.w);
PV1f.y = R127f.y;
R127f.z = (mul_nonIEEE(PV0f.y,R12f.y) + R1f.x);
PV1f.z = R127f.z;
R126f.w = (mul_nonIEEE(PV0f.z,R12f.y) + R0f.y);
PV1f.w = R126f.w;
// 2
PV0f.x = R11f.x + -(PV1f.w);
PV0f.z = R11f.z + -(PV1f.y);
PV0f.w = R11f.y + -(PV1f.z);
// 3
backupReg0f = R127f.y;
R127f.x = (mul_nonIEEE(PV0f.w,R11f.w) + R127f.z);
PV1f.x = R127f.x;
R127f.y = (mul_nonIEEE(PV0f.x,R11f.w) + R126f.w);
PV1f.y = R127f.y;
R126f.w = (mul_nonIEEE(PV0f.z,R11f.w) + backupReg0f);
PV1f.w = R126f.w;
// 4
PV0f.x = -(PV1f.w) + intBitsToFloat(uf_remappedPS[4].z);
PV0f.y = -(PV1f.x) + intBitsToFloat(uf_remappedPS[4].y);
PV0f.z = -(PV1f.y) + intBitsToFloat(uf_remappedPS[4].x);
// 5
R10f.x = (mul_nonIEEE(PV0f.z,R12f.x) + R127f.y);
R10f.y = (mul_nonIEEE(PV0f.y,R12f.x) + R127f.x);
R10f.z = (mul_nonIEEE(PV0f.x,R12f.x) + R126f.w);
// export
if( ((vec4(R10f.x, R10f.y, R10f.z, R10f.w)).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(R10f.x * aurared, R10f.y * auragreen, R10f.z * aurablue, R10f.w * auraopacity);
}

View File

@ -1,9 +1,13 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader 699b238ae15d113b
// Used for: Fog Hyrule Castle
// shader 699b238ae15d113b -- Ganons Castle Moat Fog
#define basefogred $castlebasefogred
#define basefoggreen $castlebasefoggreen
#define basefogblue $castlebasefogblue
#define basefogopacity $castlebasefogopacity
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -43,6 +47,7 @@ layout(location = 8) in vec4 passParameterSem15;
layout(location = 9) in vec4 passParameterSem16; layout(location = 9) in vec4 passParameterSem16;
layout(location = 0) out vec4 passPixelColor0; layout(location = 0) out vec4 passPixelColor0;
// end of shader inputs/outputs // end of shader inputs/outputs
int clampFI32(int v) int clampFI32(int v)
{ {
if( v == 0x7FFFFFFF ) if( v == 0x7FFFFFFF )
@ -190,10 +195,5 @@ R7f.y = (mul_nonIEEE(PV0f.y,R9f.x) + R127f.x);
R7f.z = (mul_nonIEEE(PV0f.x,R9f.x) + R127f.w); R7f.z = (mul_nonIEEE(PV0f.x,R9f.x) + R127f.w);
// export // export
if( ((vec4(R7f.x, R7f.y, R7f.z, R7f.w)).a > uf_alphaTestRef) == false) discard; if( ((vec4(R7f.x, R7f.y, R7f.z, R7f.w)).a > uf_alphaTestRef) == false) discard;
passPixelColor0 = vec4(R7f.x * basefogred, R7f.y * basefoggreen, R7f.z * basefogblue, R7f.w * basefogopacity); // rgb and opacity
#if ($enableCastleFogColor == 0)
passPixelColor0 = vec4(R7f.x, R7f.y, R7f.z, R7f.w*$castleFogOpacity);
#else
passPixelColor0 = vec4($castleFogRed, $castleFogGreen, $castleFogBlue, R7f.w*$castleFogOpacity);
#endif
} }

View File

@ -1,14 +1,13 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader bec68ec6f40a864f
// Used for: Ground Fog
float fogOpacity = float($groundFogOpacity); // shader bec68ec6f40a864f -- Affects distant area fog rgb, distance lighting, ground lighting
float fogBrightness = float($groundFogBrightness); #define distantlight $distantlighting
float fogRed = float($groundFogOpacity); #define dflevel $distantfoglevel
float fogGreen = float($groundFogOpacity); #define dfred $distantfogred
float fogBlue = float($groundFogOpacity); #define dfgreen $distantfoggreen
#define dfblue $distantfogblue
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -987,16 +986,8 @@ R0i.w = R24i.w;
R2i.xyz = ivec3(R25i.x,R25i.y,R25i.z); R2i.xyz = ivec3(R25i.x,R25i.y,R25i.z);
R2i.w = R25i.w; R2i.w = R25i.w;
// export // export
passPixelColor0 = vec4(intBitsToFloat(R0i.x), intBitsToFloat(R0i.y), intBitsToFloat(R0i.z) * distantlight, intBitsToFloat(R0i.w)); // x affects shadows sharpness, and z affects distant area lighting brightness
passPixelColor0 = vec4(intBitsToFloat(R0i.x), intBitsToFloat(R0i.y), intBitsToFloat(R0i.z)*fogBrightness, intBitsToFloat(R0i.w)); passPixelColor1 = vec4(intBitsToFloat(R1i.x) * dfred, intBitsToFloat(R1i.y) * dfgreen, intBitsToFloat(R1i.z) * dfblue, intBitsToFloat(R1i.w)) * dflevel; // x,y,z affects the color red,green,blue of the fog, w does
passPixelColor2 = vec4(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y), intBitsToFloat(R2i.z), intBitsToFloat(R2i.w)); // affects ground color rgb
#if ($enableGroundFogColor == 0) passPixelColor3 = vec4(intBitsToFloat(R3i.x), intBitsToFloat(R3i.y), intBitsToFloat(R3i.z), intBitsToFloat(R3i.w)); // xyz - RGB for body of waters edge surfaces
passPixelColor1 = vec4(intBitsToFloat(R1i.x), intBitsToFloat(R1i.y), intBitsToFloat(R1i.z), intBitsToFloat(R1i.w)*fogOpacity);
#else
passPixelColor1 = vec4(fogRed, fogGreen, fogBlue, intBitsToFloat(R1i.w)*fogOpacity);
#endif
passPixelColor1 = vec4(intBitsToFloat(R1i.x), intBitsToFloat(R1i.y), intBitsToFloat(R1i.z), intBitsToFloat(R1i.w));
passPixelColor2 = vec4(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y), intBitsToFloat(R2i.z), intBitsToFloat(R2i.w));
passPixelColor3 = vec4(intBitsToFloat(R3i.x), intBitsToFloat(R3i.y), intBitsToFloat(R3i.z), intBitsToFloat(R3i.w));
} }

View File

@ -1,14 +1,13 @@
#version 430 #version 430
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_separate_shader_objects : enable
// shader fb2e18ae56397ca7
// Used for: Fog around trees, bushes and vines
float fogOpacity = float($greeneryFogOpacity); // shader fb2e18ae56397ca7 -- Affects Trees Bushes and Vines
float fogBrightness = float($greeneryFogBrightness); #define gli $distantlighting
float fogRed = float($greeneryFogOpacity); #define gfoglevel $distantfoglevel
float fogGreen = float($greeneryFogOpacity); #define gred $distantfogred
float fogBlue = float($greeneryFogOpacity); #define ggreen $distantfoggreen
#define gblue $distantfogblue
// start of shader inputs/outputs, predetermined by Cemu. Do not touch // start of shader inputs/outputs, predetermined by Cemu. Do not touch
#ifdef VULKAN #ifdef VULKAN
@ -980,16 +979,9 @@ R0i.w = R25i.w;
// 13 // 13
R2i.xyz = ivec3(R26i.x,R26i.y,R26i.z); R2i.xyz = ivec3(R26i.x,R26i.y,R26i.z);
R2i.w = R26i.w; R2i.w = R26i.w;
// export // export
passPixelColor0 = vec4(intBitsToFloat(R0i.x), intBitsToFloat(R0i.y), intBitsToFloat(R0i.z) * fogBrightness, intBitsToFloat(R0i.w)); passPixelColor0 = vec4(intBitsToFloat(R0i.x), intBitsToFloat(R0i.y), intBitsToFloat(R0i.z) * gli, intBitsToFloat(R0i.w)); // x affects shadows, z affects lighting of trees,bushes,flowers,vines
passPixelColor1 = vec4(intBitsToFloat(R1i.x) * gred, intBitsToFloat(R1i.y) * ggreen, intBitsToFloat(R1i.z) * gblue, intBitsToFloat(R1i.w)) * gfoglevel; // rgb fog for distant trees
#if ($enableGreeneryFogColor == 0) passPixelColor2 = vec4(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y), intBitsToFloat(R2i.z), intBitsToFloat(R2i.w)); // xyz - RGB Bloom/Glowness - to tress and bushes and vines multiply by 20 to see
passPixelColor1 = vec4(intBitsToFloat(R1i.x), intBitsToFloat(R1i.y), intBitsToFloat(R1i.z), intBitsToFloat(R1i.w)*fogOpacity); passPixelColor3 = vec4(intBitsToFloat(R3i.x), intBitsToFloat(R3i.y), intBitsToFloat(R3i.z), intBitsToFloat(R3i.w)); // xyz - RGB Bloom for on water objects like korok rings
#else
passPixelColor1 = vec4(fogRed, fogGreen, fogBlue, intBitsToFloat(R1i.w)*fogOpacity);
#endif
passPixelColor2 = vec4(intBitsToFloat(R2i.x), intBitsToFloat(R2i.y), intBitsToFloat(R2i.z), intBitsToFloat(R2i.w));
passPixelColor3 = vec4(intBitsToFloat(R3i.x), intBitsToFloat(R3i.y), intBitsToFloat(R3i.z), intBitsToFloat(R3i.w));
} }

View File

@ -0,0 +1,662 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = Remove (Distant) Fog, Haze and Clouds
path = "The Legend of Zelda: Breath of the Wild/Mods/Remove Distant Fog"
description = Allows you to remove or customize each type of fog in the game.|NPC fog will conflict with the remove cel-shading graphic packs.||Made by Skalfate."
version = 6
[Default]
# Settings will show a set of options and exclude other sets of options
# Settings 0 = Shows Settings related to Distant Fog that affects all, the world, the trees, the water, the npc
# Settings 1 = Shows Settings related to Field Fog Clouds
# Settings 2 = Shows Settings related to NPC Fog
# Settings 3 = Shows Settings related to Castle Aura & Moat
# Settings 4 = Shows Settings related to Custom Preset edited by the user
$settings = 0
# -----------------
# Distant Fog affects the world Fog, the water fog, the greenery objects like trees and bushes fog
$distantlighting = 1
$distantfoglevel = 1
$distantfogred = 1
$distantfoggreen = 1
$distantfogblue = 1
# -----------------
# Field Fog Clouds that move around on the grounds
$fieldfogcloudsopacity = 1
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 1
# -----------------
# NPC in the distance have a fogy haze around them that immitates the world haze
$npcfogopacity = 1
$npcfogred = 1
$npcfoggreen = 1
$npcfogblue = 1
# -----------------
# Castle Base Moat Fog
$castlebasefogopacity = 1
$castlebasefogred = 1
$castlebasefoggreen = 1
$castlebasefogblue = 1
# -----------------
# Castle Aura
$castleauraopacity = 1
$castleaurared = 1
$castleauragreen = 1
$castleaurablue = 1
# Main Menu # ------------------------------
[Preset]
category = Main Menu
name = Distant Fog Settings
$settings = 0
[Preset]
category = Main Menu
name = Field Fog Clouds Settings
$settings = 1
[Preset]
category = Main Menu
name = NPC Fog Settings
$settings = 2
[Preset]
category = Main Menu
name = Castle Fog Settings
$settings = 3
[Preset]
category = Main Menu
name = Custom Preset Settings
$settings = 4
# Seconday Menus ------------------------------
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Default Fog Levels
$distantfoglevel = 1
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 0%
$distantfoglevel = 0
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 10%
$distantfoglevel = 0.1
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 20%
$distantfoglevel = 0.2
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 30%
$distantfoglevel = 0.3
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 40%
$distantfoglevel = 0.4
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 50%
$distantfoglevel = 0.5
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 60%
$distantfoglevel = 0.6
[Preset]
condition = $settings == 0
category = Distant World Fog
name = Fog 80%
$distantfoglevel = 0.8
# ------------------------------
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Default Distant Lighting 1x
$distantlighting = 1
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Distant Lighting x2
$distantlighting = 2
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Distant Lighting x3
$distantlighting = 3
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Distant Lighting x4
$distantlighting = 4
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Distant Lighting x6
$distantlighting = 6
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Distant Lighting x8
$distantlighting = 8
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Darker Distant Lighting 20%
$distantlighting = 0.8
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Darker Distant Lighting 40%
$distantlighting = 0.6
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Darker Distant Lighting 60%
$distantlighting = 0.4
[Preset]
condition = $settings == 0
category = Distant Lighting
name = Darker Distant Lighting 80%
$distantlighting = 0.2
# ------------------------------
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Default Fog RGB
$distantfogred = 1
$distantfoggreen = 1
$distantfogblue = 1
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Red Fog x1
$distantfogred = 1
$distantfoggreen = 0
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Red Fog x2
$distantfogred = 2
$distantfoggreen = 0
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Red Fog x3
$distantfogred = 3
$distantfoggreen = 0
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Blue Fog x1
$distantfogred = 0
$distantfoggreen = 0
$distantfogblue = 1
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Blue Fog x2
$distantfogred = 0
$distantfoggreen = 0
$distantfogblue = 2
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Blue Fog x3
$distantfogred = 0
$distantfoggreen = 0
$distantfogblue = 3
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Green Fog x1
$distantfogred = 0
$distantfoggreen = 1
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Green Fog x2
$distantfogred = 0
$distantfoggreen = 2
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Green Fog x3
$distantfogred = 0
$distantfoggreen = 3
$distantfogblue = 0
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Purple Fog x2
# blue and red makes purple
$distantfogred = 2
$distantfoggreen = 0
$distantfogblue = 2
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Purple Fog x3
$distantfogred = 3
$distantfoggreen = 0
$distantfogblue = 3
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Cyan Fog x2
# blue and green makes cyan
$distantfogred = 0
$distantfoggreen = 2
$distantfogblue = 2
[Preset]
condition = $settings == 0
category = Distant Fog RGB
name = Cyan Fog x3
$distantfogred = 0
$distantfoggreen = 3
$distantfogblue = 3
# ------------------------------
[Preset]
condition = $settings == 1
category = Field Fog Clouds
name = Default Field Fog Clouds Enabled
$fieldfogcloudsopacity = 1
[Preset]
condition = $settings == 1
category = Field Fog Clouds
name = Field Fog Clouds Disabled
$fieldfogcloudsopacity = 0
# Field Fog Clouds ------------------------------
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Default RGB Field Fog Clouds
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 1
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Red Field Fog Clouds
$fieldfogcloudsred = 30 # red needs amplified levels to be visible
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 1
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Blue Field Fog Clouds
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 4
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Green Field Fog Clouds
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 4
$fieldfogcloudsblue = 1
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Purple Field Fog Clouds
# blue and red makes purple
$fieldfogcloudsred = 30 # red needs amplified levels to be visible
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 3
[Preset]
condition = $settings == 1
category = Field Fog Clouds RGB
name = Cyan Field Fog Clouds
#blue and green makes cyan
$fieldfogcloudsred = 1 # red needs amplified levels to be visible
$fieldfogcloudsgreen = 3
$fieldfogcloudsblue = 3
# Distant NPC Fog ------------------------------
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Default Distant NPC Fog Enabled
$npcfogred = 1
$npcfoggreen = 1
$npcfogblue = 1
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 0%
$npcfogred = 0
$npcfoggreen = 0
$npcfogblue = 0
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 10%
$npcfogred = 0.1
$npcfoggreen = 0.1
$npcfogblue = 0.1
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 20%
$npcfogred = 0.2
$npcfoggreen = 0.2
$npcfogblue = 0.2
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 30%
$npcfogred = 0.3
$npcfoggreen = 0.3
$npcfogblue = 0.3
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 40%
$npcfogred = 0.4
$npcfoggreen = 0.4
$npcfogblue = 0.4
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 60%
$npcfogred = 0.6
$npcfoggreen = 0.6
$npcfogblue = 0.6
[Preset]
condition = $settings == 2
category = Distant NPC Fog Percentage
name = Distant NPC Fog 80%
$npcfogred = 0.8
$npcfoggreen = 0.8
$npcfogblue = 0.8
# Castle Fog Values ------------------------------
# Castle Aura
[Preset]
condition = $settings == 3
category = Castle Aura
name = Castle Aura Enabled
$castleauraopacity = 1
[Preset]
condition = $settings == 3
category = Castle Aura
name = Castle Aura Disabled
$castleauraopacity = 0
[Preset]
condition = $settings == 3
category = Castle Aura
name = Castle Aura 30%
$castleauraopacity = 0.3
[Preset]
condition = $settings == 3
category = Castle Aura
name = Castle Aura 50%
$castleauraopacity = 0.5
[Preset]
condition = $settings == 3
category = Castle Aura
name = Castle Aura 80%
$castleauraopacity = 0.8
# Castle Swirling Aura RGB
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Default RGB Castle Aura
$castleaurared = 1
$castleauragreen = 1
$castleaurablue = 1
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Red Castle Aura
$castleaurared = 18
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Green Castle Aura
$castleauragreen = 2
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Blue Castle Aura
$castleaurablue = 2
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Purple Castle Aura
$castleaurared = 4
$castleaurablue = 4
[Preset]
condition = $settings == 3
category = Castle Aura RGB
name = Cyan Castle Aura
$castleaurared = 4
$castleauragreen = 4
# Castle Moat Fog -------------------------------------
[Preset]
condition = $settings == 3
category = Castle Fog
name = Castle Moat Fog Enabled
$castlebasefogopacity = 1
[Preset]
condition = $settings == 3
category = Castle Fog
name = Castle Moat Fog Disabled
$castlebasefogopacity = 0
[Preset]
condition = $settings == 3
category = Castle Fog
name = Castle Moat Fog 30%
$castlebasefogopacity = 0.3
[Preset]
condition = $settings == 3
category = Castle Fog
name = Castle Moat Fog 50%
$castlebasefogopacity = 0.5
[Preset]
condition = $settings == 3
category = Castle Fog
name = Castle Moat Fog 80%
$castlebasefogopacity = 0.8
# Castle Moat RGB
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Default RGB Castle Moat Fog
$castlebasefogred = 1
$castlebasefoggreen = 1
$castlebasefogblue = 1
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Red Castle Moat Fog
$castlebasefogred = 18
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Green Castle Moat Fog
$castlebasefoggreen = 2
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Blue Castle Moat Fog
$castlebasefogblue = 2
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Purple Castle Moat Fog
$castlebasefogred = 4
$castlebasefogblue = 4
[Preset]
condition = $settings == 3
category = Castle Moat Fog RGB
name = Cyan Castle Moat Fog
$castlebasefogred = 4
$castlebasefoggreen = 4
# Custom Preset Values ------------------------------
[Preset]
condition = $settings == 4
category = CustomPreset
name = Default Preset
$distantlighting = 1
$distantfogred = 1
$distantfoggreen = 1
$distantfogblue = 1
#
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 1
#
$npcfogred = 1
$npcfoggreen = 1
$npcfogblue = 1
[Preset]
condition = $settings == 4
category = CustomPreset
name = Custom Preset (edit the rules.txt)
$distantlighting = 1
#
$distantfoglevel = 1
#
$distantfogred = 1
$distantfoggreen = 1
$distantfogblue = 1
#
$fieldfogcloudsopacity = 1
$fieldfogcloudsred = 1
$fieldfogcloudsgreen = 1
$fieldfogcloudsblue = 1
#
$npcfogopacity = 1
$npcfogred = 1
$npcfoggreen = 1
$npcfogblue = 1
#
$castlebasefogopacity = 1
$castlebasefogred = 1
$castlebasefoggreen = 1
$castlebasefogblue = 1
#
$castleauraopacity = 1
$castleaurared = 1
$castleauragreen = 1
$castleaurablue = 1
# Information
# by SkalFate
# ----------------------
# Distant lighting - is for distant area lighting of the land and how far in the distance everything is lit up
# ------ Game Values are multiplied, so if you want to lower a value, use 0.01-0.99, or if you want to go higher go from 1.0-X.X
# Greenery lighting - is the same as above but for trees vines, bushes
# ------ Game Values are multiplied, so if you want to lower a value, use 0.01-0.99, or if you want to go higher go from 1.0-X.X
# RGB - Red, Green, Blue - is self explanatory for the color of the fog, trees, water.
# ------ Game Values are multiplied so if you want to lower a value, use 0.01-0.99, or if you want to go higher go from 1.0-X.X
# ----------------------
# (fieldfogopacity) = Fog Transparency/Opacity - how thick or thin you want the fog fields to look
# ------ Values are multiplied, so if you want to lower use [0.01 - 0.99], or if you want to go higher go from [1.0 - X.X]
# (fieldfogcloudsred, fieldfogcloudsgreen, fieldfogcloudsblue ) = RGB - Red, Green, Blue - Changes the color of the fog fields.
# ------ Values are multiplied so if you want to lower use [0.01 - 0.99], or if you want to go higher go from [1.0 - X.X]
# (npcfogred, npcfoggreen, npcblue ) = RGB - Red, Green, Blue - Changes the color of distant npcs fog.
# ------ Values are multiplied so if you want to lower use [0.01 - 0.99], or if you want to go higher go from [1.0 - X.X]