Starlike v0.1.1

This commit is contained in:
zumbiepig 2025-01-20 11:13:17 -08:00
parent d8637f6863
commit fdb046cdce
No known key found for this signature in database
GPG Key ID: B50A3F986EC14691
2173 changed files with 42692 additions and 147442 deletions

71
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,71 @@
name: Build
on: [push, pull_request, workflow_dispatch]
jobs:
build:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "21"
cache: "gradle"
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v3
- name: Compile JavaScript
run: ./gradlew generateJavaScript
- name: Compile assets
run: bash ./CompileEPK.sh
- name: Generate offline download
if: github.ref != 'refs/heads/main'
run: bash ./MakeOfflineDownload.sh
- name: Generate signed client
if: github.ref == 'refs/heads/main'
run: source ./SIGNED_CLIENT.env && echo -e "${{ vars.SIGNED_CLIENT_INPUT }}${{ secrets.SIGNED_CLIENT_SECRET }}" | bash ./MakeSignedClient.sh
- name: Prepare files - standard
if: github.ref != 'refs/heads/main'
run: |
mkdir -p ${{ runner.temp }}/gh-pages
cp -t ${{ runner.temp }}/gh-pages \
javascript/assets.epk \
javascript/classes.js \
javascript/classes.js.map \
javascript/favicon.png \
javascript/index.html
cp javascript/Starlike_Client_Offline.html ${{ runner.temp }}/gh-pages/offline.html
- name: Prepare files - signed
if: github.ref == 'refs/heads/main'
run: |
mkdir -p ${{ runner.temp }}/gh-pages
cp -t ${{ runner.temp }}/gh-pages \
javascript/assets.epk \
javascript/classes.js \
javascript/classes.js.map \
javascript/favicon.png \
javascript/index.html
cp javascript/Starlike_Client_Offline_Signed.html ${{ runner.temp }}/gh-pages/offline.html
cp javascript/Starlike_Client_Offline_Signed.html.dat ${{ runner.temp }}/gh-pages/latest_update.dat
- name: Upload web files
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: web_files
path: ${{ runner.temp }}/gh-pages
retention-days: 1
compression-level: 9
- name: Deploy to GitHub Pages
if: github.ref == 'refs/heads/main'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ${{ runner.temp }}/gh-pages
cname: starlike.orionzleon.me
force_orphan: true
user_name: 'github-actions[bot]'
user_email: '41898282+github-actions[bot]@users.noreply.github.com'
commit_message: 'github-actions: deploy'

3
.gitignore vendored
View File

@ -1,7 +1,5 @@
.gradle
.settings
.classpath
.project
build
bin
proxyServer/bin
@ -19,3 +17,4 @@ javascript/assets.epk
javascript/classes.js
javascript/classes.js.map
javascript/Starlike_Client_Offline.html
/.metadata/

0
CompileEPK.sh Normal file → Executable file
View File

0
CompileJS.sh Normal file → Executable file
View File

View File

@ -1,4 +1,4 @@
@echo off
title MakeOfflineDownload
java -cp "desktopRuntime/MakeOfflineDownload.jar;desktopRuntime/CompileEPK.jar" net.lax1dude.eaglercraft.v1_8.buildtools.workspace.MakeOfflineDownload "javascript/OfflineDownloadTemplate.txt" "javascript/classes.js" "javascript/assets.epk" "NUL" "javascript/Starlike_Client_Offline.html" "javascript/lang"
java -cp "desktopRuntime/MakeOfflineDownload.jar;desktopRuntime/CompileEPK.jar" net.lax1dude.eaglercraft.v1_8.buildtools.workspace.MakeOfflineDownload "javascript/OfflineDownloadTemplate.txt" "javascript/classes.js" "javascript/assets.epk" "javascript/Starlike_Client_Offline.html"
pause

2
MakeOfflineDownload.sh Normal file → Executable file
View File

@ -1,2 +1,2 @@
#!/bin/sh
java -cp "desktopRuntime/MakeOfflineDownload.jar:desktopRuntime/CompileEPK.jar" net.lax1dude.eaglercraft.v1_8.buildtools.workspace.MakeOfflineDownload "javascript/OfflineDownloadTemplate.txt" "javascript/classes.js" "javascript/assets.epk" "/dev/null" "javascript/Starlike_Client_Offline.html" "javascript/lang"
java -cp "desktopRuntime/MakeOfflineDownload.jar:desktopRuntime/CompileEPK.jar" net.lax1dude.eaglercraft.v1_8.buildtools.workspace.MakeOfflineDownload "javascript/OfflineDownloadTemplate.txt" "javascript/classes.js" "javascript/assets.epk" "javascript/Starlike_Client_Offline.html"

0
MakeSignedClient.sh Normal file → Executable file
View File

View File

@ -45,7 +45,7 @@ teavm.js {
obfuscated = true
sourceMap = true
targetFileName = "../" + name
optimization = OptimizationLevel.BALANCED // Change to "AGGRESSIVE" for release
optimization = OptimizationLevel.AGGRESSIVE
outOfProcess = false
fastGlobalAnalysis = false
processMemory = 512
@ -69,4 +69,4 @@ tasks.named("generateJavaScript") {
dest = dest.substring(0, j + 34) + "\n" + file(folder + "/ES6ShimScript.txt").getText("UTF-8") + "\n" + dest.substring(j + 34)
phile.write(dest, "UTF-8")
}
}
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src_main_java"/>
<classpathentry kind="src" path="src_game_java"/>
<classpathentry kind="src" path="src_protocol-game_java"/>
<classpathentry kind="src" path="src_protocol-relay_java"/>
<classpathentry kind="src" path="src_lwjgl_java"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="deps_fix/codecjorbis-20101023.jar"/>
<classpathentry kind="lib" path="deps_fix/codecwav-20101023.jar"/>
<classpathentry kind="lib" path="deps_fix/Java-WebSocket-1.5.1-with-dependencies.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl-egl.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl-glfw.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl-jemalloc.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl-openal.jar"/>
<classpathentry kind="lib" path="deps_fix/lwjgl-opengles.jar"/>
<classpathentry kind="lib" path="deps_fix/soundsystem-20120107.jar"/>
<classpathentry kind="lib" path="deps_fix/webrtc-java-0.8.0.jar"/>
<classpathentry kind="lib" path="deps_fix/UnsafeMemcpy.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>eclipseProject</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
<linkedResources>
<link>
<name>src_main_java</name>
<type>2</type>
<locationURI>PARENT-2-PROJECT_LOC../src/main/java</locationURI>
</link>
<link>
<name>src_game_java</name>
<type>2</type>
<locationURI>PARENT-2-PROJECT_LOC../src/game/java</locationURI>
</link>
<link>
<name>src_protocol-game_java</name>
<type>2</type>
<locationURI>PARENT-2-PROJECT_LOC../src/protocol-game/java</locationURI>
</link>
<link>
<name>src_protocol-relay_java</name>
<type>2</type>
<locationURI>PARENT-2-PROJECT_LOC../src/protocol-relay/java</locationURI>
</link>
<link>
<name>src_lwjgl_java</name>
<type>2</type>
<locationURI>PARENT-2-PROJECT_LOC../src/lwjgl/java</locationURI>
</link>
</linkedResources>
</projectDescription>

File diff suppressed because it is too large Load Diff

View File

@ -1,88 +1,88 @@
<style type="text/css" style="display:none !important;">{% embed eval `boot_menu_style.css` %}</style>
<div class="_eaglercraftX_boot_menu {% global `root_class_gen` %}">
<div class="_eaglercraftX_boot_menu_inner">
<div class="_eaglercraftX_boot_menu_header">
<p class="_eaglercraftX_boot_menu_header_title">EaglercraftX 1.8 Boot Manager</p>
</div>
<div class="_eaglercraftX_boot_menu_content">
<div class="_eaglercraftX_boot_menu_content_inner">
<div class="_eaglercraftX_boot_menu_content_view_selection" style="display:none;">
<div class="_eaglercraftX_boot_menu_content_selection"></div>
</div>
<div class="_eaglercraftX_boot_menu_content_view_editor" style="display:none;">
<div class="_eaglercraftX_boot_menu_launch_conf">
<div class="_eaglercraftX_boot_menu_launch_conf_inner">
<div class="_eaglercraftX_boot_menu_launch_conf_item_wide" style="padding: 20px;">
<p>Profile Name: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_profile_name"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item_wide">
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_data_format">
<p>Data Format: <span class="_eaglercraftX_boot_menu_launch_conf_val_data_format">Standard Offline</span></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_launch_type">
<p>Launch Type:
<select class="_eaglercraftX_boot_menu_launch_conf_val_launch_type">
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLERX_SIGNED_V1">EaglercraftX Signed Client</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLERX_V1">EaglercraftX Standard Offline</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_1_5_V2">Eaglercraft 1.5 (post-22w34a)</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_1_5_V1">Eaglercraft 1.5 (pre-22w34a)</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_BETA_V1">Eaglercraft Beta 1.3</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V1">PeytonPlayz585 Indev</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V2">PeytonPlayz585 Alpha/Beta</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="STANDARD_OFFLINE_V1">Standard Offline</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="IFRAME_SANDBOX_V1">IFrame HTML File</option>
</select>
</p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_join_server" style="display:none;">
<p>Join Server: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_join_server"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_opts_name" style="display:none;">
<p>Opt Variable Name: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_opts_name"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_assetsURI" style="display:none;">
<p>Assets URI Opt: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_assetsURI"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_container" style="display:none;">
<p>Container ID Opt: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_container"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_main_func" style="display:none;">
<p>Main function: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_main_func"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_clear_cookies">
<p>Clear Cookies Before Launch: <input type="checkbox" class="_eaglercraftX_boot_menu_launch_conf_val_clear_cookies"></p>
</div>
</div>
</div>
</div>
<textarea class="_eaglercraftX_boot_menu_launch_opt_editor" spellcheck="false"></textarea>
</div>
<div class="_eaglercraftX_boot_menu_popup" style="display:none;">
<div class="_eaglercraftX_boot_menu_popup_inner">
<div class="_eaglercraftX_boot_menu_popup_view_confirm" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_confirm_title"></p>
<p class="_eaglercraftX_boot_menu_popup_confirm_opts"></p>
</div>
<div class="_eaglercraftX_boot_menu_popup_view_selection" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_selection_title"></p>
<div class="_eaglercraftX_boot_menu_popup_selection"></div>
</div>
<div class="_eaglercraftX_boot_menu_popup_view_input" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_input_title"></p>
<p class="_eaglercraftX_boot_menu_popup_input_val_container"><input class="_eaglercraftX_boot_menu_popup_input_val" type="text"></p>
<p class="_eaglercraftX_boot_menu_popup_input_opts"><span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_cancel">&nbsp;&lt;&nbsp;Cancel&nbsp;&gt;&nbsp;</span> &emsp; <span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_done _eaglercraftX_boot_menu_popup_input_opt_selected">&nbsp;&lt;&nbsp;Done&nbsp;&gt;&nbsp;</span></p>
</div>
</div>
</div>
</div>
</div>
<div class="_eaglercraftX_boot_menu_footer">
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_select" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to boot the selected client, `e' to edit eaglercraft opts before booting, or ESC to exit and boot normally.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_select_count" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to boot the selected client, `e' to edit eaglercraft opts before booting.<br>The first option will be executed in <span class="_eaglercraftX_boot_menu_footer_text_boot_countdown">0</span> seconds. Press any key to cancel.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_menu_select" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to select, or ESC return to the previous screen.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_opts_editor" style="display:none;">Press CTRL+SHIFT to open editor menu.<br>Press CTRL+ENTER to boot, or ESC return to the previous menu.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_opts_editor_alt" style="display:none;">Press CTRL+SHIFT to open editor menu.<br>Press CTRL+ENTER to save, or ESC return to the previous menu.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_order" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press CTRL+&uarr; and CTRL+&darr; to adjust item order, or ESC to cancel.</p>
</div>
</div>
<style type="text/css" style="display:none !important;">{% embed eval `boot_menu_style.css` %}</style>
<div class="_eaglercraftX_boot_menu {% global `root_class_gen` %}">
<div class="_eaglercraftX_boot_menu_inner">
<div class="_eaglercraftX_boot_menu_header">
<p class="_eaglercraftX_boot_menu_header_title">EaglercraftX 1.8 Boot Manager</p>
</div>
<div class="_eaglercraftX_boot_menu_content">
<div class="_eaglercraftX_boot_menu_content_inner">
<div class="_eaglercraftX_boot_menu_content_view_selection" style="display:none;">
<div class="_eaglercraftX_boot_menu_content_selection"></div>
</div>
<div class="_eaglercraftX_boot_menu_content_view_editor" style="display:none;">
<div class="_eaglercraftX_boot_menu_launch_conf">
<div class="_eaglercraftX_boot_menu_launch_conf_inner">
<div class="_eaglercraftX_boot_menu_launch_conf_item_wide" style="padding: 20px;">
<p>Profile Name: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_profile_name"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item_wide">
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_data_format">
<p>Data Format: <span class="_eaglercraftX_boot_menu_launch_conf_val_data_format">Standard Offline</span></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_launch_type">
<p>Launch Type:
<select class="_eaglercraftX_boot_menu_launch_conf_val_launch_type">
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLERX_SIGNED_V1">EaglercraftX Signed Client</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLERX_V1">EaglercraftX Standard Offline</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_1_5_V2">Eaglercraft 1.5 (post-22w34a)</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_1_5_V1">Eaglercraft 1.5 (pre-22w34a)</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="EAGLER_BETA_V1">Eaglercraft Beta 1.3</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V1">PeytonPlayz585 Indev</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="PEYTON_V2">PeytonPlayz585 Alpha/Beta</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="STANDARD_OFFLINE_V1">Standard Offline</option>
<option class="_eaglercraftX_boot_menu_launch_conf_val_launch_type_opt" value="IFRAME_SANDBOX_V1">IFrame HTML File</option>
</select>
</p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_join_server" style="display:none;">
<p>Join Server: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_join_server"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_opts_name" style="display:none;">
<p>Opt Variable Name: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_opts_name"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_assetsURI" style="display:none;">
<p>Assets URI Opt: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_assetsURI"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_container" style="display:none;">
<p>Container ID Opt: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_container"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_main_func" style="display:none;">
<p>Main function: <input type="text" class="_eaglercraftX_boot_menu_launch_conf_val_main_func"></p>
</div>
<div class="_eaglercraftX_boot_menu_launch_conf_item _eaglercraftX_boot_menu_launch_conf_clear_cookies">
<p>Clear Cookies Before Launch: <input type="checkbox" class="_eaglercraftX_boot_menu_launch_conf_val_clear_cookies"></p>
</div>
</div>
</div>
</div>
<textarea class="_eaglercraftX_boot_menu_launch_opt_editor" spellcheck="false"></textarea>
</div>
<div class="_eaglercraftX_boot_menu_popup" style="display:none;">
<div class="_eaglercraftX_boot_menu_popup_inner">
<div class="_eaglercraftX_boot_menu_popup_view_confirm" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_confirm_title"></p>
<p class="_eaglercraftX_boot_menu_popup_confirm_opts"></p>
</div>
<div class="_eaglercraftX_boot_menu_popup_view_selection" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_selection_title"></p>
<div class="_eaglercraftX_boot_menu_popup_selection"></div>
</div>
<div class="_eaglercraftX_boot_menu_popup_view_input" style="display:none;">
<p class="_eaglercraftX_boot_menu_popup_input_title"></p>
<p class="_eaglercraftX_boot_menu_popup_input_val_container"><input class="_eaglercraftX_boot_menu_popup_input_val" type="text"></p>
<p class="_eaglercraftX_boot_menu_popup_input_opts"><span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_cancel">&nbsp;&lt;&nbsp;Cancel&nbsp;&gt;&nbsp;</span> &emsp; <span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_done _eaglercraftX_boot_menu_popup_input_opt_selected">&nbsp;&lt;&nbsp;Done&nbsp;&gt;&nbsp;</span></p>
</div>
</div>
</div>
</div>
</div>
<div class="_eaglercraftX_boot_menu_footer">
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_select" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to boot the selected client, `e' to edit eaglercraft opts before booting, or ESC to exit and boot normally.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_select_count" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to boot the selected client, `e' to edit eaglercraft opts before booting.<br>The first option will be executed in <span class="_eaglercraftX_boot_menu_footer_text_boot_countdown">0</span> seconds. Press any key to cancel.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_menu_select" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press enter to select, or ESC return to the previous screen.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_opts_editor" style="display:none;">Press CTRL+SHIFT to open editor menu.<br>Press CTRL+ENTER to boot, or ESC return to the previous menu.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_opts_editor_alt" style="display:none;">Press CTRL+SHIFT to open editor menu.<br>Press CTRL+ENTER to save, or ESC return to the previous menu.</p>
<p class="_eaglercraftX_boot_menu_footer_text _eaglercraftX_boot_menu_footer_text_boot_order" style="display:none;">Use the &uarr; and &darr; keys to select which entry is highlighted.<br>Press CTRL+&uarr; and CTRL+&darr; to adjust item order, or ESC to cancel.</p>
</div>
</div>
</div>

View File

@ -1,328 +1,328 @@
@font-face {
font-family: "{% global `root_class_gen` %}_font0";
src: url("data:font/woff;base64,{% embed base64 `web_cl_eagleiii_8x16.woff` %}") format("woff");
}
.{% global `root_class_gen` %} {
font: 24px "{% global `root_class_gen` %}_font0";
color: #CCCCCC;
background-color: #000000;
user-select: none;
width: 100%;
height: 100%;
overflow-y: auto;
}
.{% global `root_class_gen` %}::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::-webkit-scrollbar {
width: 12px;
}
.{% global `root_class_gen` %} ::-webkit-scrollbar {
width: 12px;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-track, .{% global `root_class_gen` %} ::-webkit-scrollbar-track {
background-color: #000000;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-thumb, .{% global `root_class_gen` %} ::-webkit-scrollbar-thumb {
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-button, .{% global `root_class_gen` %} ::-webkit-scrollbar-button {
display: none;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-corner, .{% global `root_class_gen` %} ::-webkit-scrollbar-corner {
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_inner {
width: 100%;
height: 100%;
min-height: 480px;
display: flex;
flex-flow: column;
}
.{% global `root_class_gen` %} p {
margin-block-start: 0px;
margin-block-end: 0px;
-webkit-margin-before:0px;
-webkit-margin-after:0px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_header {
flex: 0 1 auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_header_title {
text-align: center;
padding: 32px 0px 0px 0px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content {
flex: 1 1 auto;
position: relative;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_inner {
position: absolute;
top: 32px;
left: 32px;
bottom: 32px;
right: 32px;
border: 2px solid white;
z-index: 1;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup {
position: absolute;
top: 128px;
left: 64px;
bottom: 64px;
right: 64px;
z-index: 10;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_inner {
width: 50%;
min-width: min(calc(100% - 20px), 400px);
max-width: 800px;
max-height: calc(100% - 20px);
margin-left: auto;
margin-right: auto;
border: 2px solid white;
background-color: #000000;
padding: 10px;
overflow-y: auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opts {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt {
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_selection_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_selection {
width: calc(100% - 8px);
padding: 8px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opts {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt {
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val_container {
text-align: center;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val {
min-width: 15em;
width: calc(90% - 50px);
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_view_selection {
width: 100%;
height: 100%;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_selection {
width: calc(100% - 8px);
height: calc(100% - 16px);
padding: 8px 4px;
overflow-y: auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item {
width: 100%;
overflow-y: auto;
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item::before {
content: "\00a0";
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_selected::before {
content: "*";
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_view_editor {
width: 100%;
height: 100%;
position: relative;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf {
position: absolute;
top: 0px;
left: 0px;
right: 0px;
height: calc(25% - 20px);
padding: 10px;
overflow-x: hidden;
overflow-y: auto;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item_wide {
width: 100%;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item {
display: inline-block;
padding: 20px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=text] {
min-width: 15em;
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=text]:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=checkbox] {
zoom: 2;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item select {
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item option:checked {
background-color: #CCCCCC;
color: #000000;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item option:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name {
width: calc(100% - 10em);
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_data_format {
padding: 2px 4px;
border: 2px solid white;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor {
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
height: calc(75% - 22px);
width: calc(100% - 20px);
margin: 0px;
padding: 10px;
font: 24px "{% global `root_class_gen` %}_font0";
border: none;
border-top: 2px solid white;
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
overflow: auto;
tab-size: 4;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_footer {
flex: 0 1 auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_footer_text {
text-align: left;
padding: 0px 0px 32px 64px;
color: #CCCCCC;
@font-face {
font-family: "{% global `root_class_gen` %}_font0";
src: url("data:font/woff;base64,{% embed base64 `web_cl_eagleiii_8x16.woff` %}") format("woff");
}
.{% global `root_class_gen` %} {
font: 24px "{% global `root_class_gen` %}_font0";
color: #CCCCCC;
background-color: #000000;
user-select: none;
width: 100%;
height: 100%;
overflow-y: auto;
}
.{% global `root_class_gen` %}::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::-webkit-scrollbar {
width: 12px;
}
.{% global `root_class_gen` %} ::-webkit-scrollbar {
width: 12px;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-track, .{% global `root_class_gen` %} ::-webkit-scrollbar-track {
background-color: #000000;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-thumb, .{% global `root_class_gen` %} ::-webkit-scrollbar-thumb {
background-color: #CCCCCC;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-button, .{% global `root_class_gen` %} ::-webkit-scrollbar-button {
display: none;
}
.{% global `root_class_gen` %}::-webkit-scrollbar-corner, .{% global `root_class_gen` %} ::-webkit-scrollbar-corner {
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_inner {
width: 100%;
height: 100%;
min-height: 480px;
display: flex;
flex-flow: column;
}
.{% global `root_class_gen` %} p {
margin-block-start: 0px;
margin-block-end: 0px;
-webkit-margin-before:0px;
-webkit-margin-after:0px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_header {
flex: 0 1 auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_header_title {
text-align: center;
padding: 32px 0px 0px 0px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content {
flex: 1 1 auto;
position: relative;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_inner {
position: absolute;
top: 32px;
left: 32px;
bottom: 32px;
right: 32px;
border: 2px solid white;
z-index: 1;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup {
position: absolute;
top: 128px;
left: 64px;
bottom: 64px;
right: 64px;
z-index: 10;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_inner {
width: 50%;
min-width: min(calc(100% - 20px), 400px);
max-width: 800px;
max-height: calc(100% - 20px);
margin-left: auto;
margin-right: auto;
border: 2px solid white;
background-color: #000000;
padding: 10px;
overflow-y: auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opts {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt {
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_confirm_opt_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_selection_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_selection {
width: calc(100% - 8px);
padding: 8px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_title {
text-align: center;
padding: 16px;
color: #CCCCCC;
white-space: pre-wrap;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opts {
text-align: center;
padding: 16px;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt {
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_opt_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val_container {
text-align: center;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val {
min-width: 15em;
width: calc(90% - 50px);
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_popup_input_val::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_view_selection {
width: 100%;
height: 100%;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_selection {
width: calc(100% - 8px);
height: calc(100% - 16px);
padding: 8px 4px;
overflow-y: auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item {
width: 100%;
overflow-y: auto;
cursor: pointer;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item::before {
content: "\00a0";
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_selected {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_selected::before {
content: "*";
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_item_disabled {
color: #888888;
cursor: default;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_content_view_editor {
width: 100%;
height: 100%;
position: relative;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf {
position: absolute;
top: 0px;
left: 0px;
right: 0px;
height: calc(25% - 20px);
padding: 10px;
overflow-x: hidden;
overflow-y: auto;
color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item_wide {
width: 100%;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item {
display: inline-block;
padding: 20px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=text] {
min-width: 15em;
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=text]:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input[type=checkbox] {
zoom: 2;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item select {
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item option:checked {
background-color: #CCCCCC;
color: #000000;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item option:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_item input::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name {
width: calc(100% - 10em);
font: 24px "{% global `root_class_gen` %}_font0";
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
border: 2px solid white;
padding: 2px 4px;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_profile_name:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_conf_val_data_format {
padding: 2px 4px;
border: 2px solid white;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor {
position: absolute;
bottom: 0px;
left: 0px;
right: 0px;
height: calc(75% - 22px);
width: calc(100% - 20px);
margin: 0px;
padding: 10px;
font: 24px "{% global `root_class_gen` %}_font0";
border: none;
border-top: 2px solid white;
outline: none;
resize: none;
background-color: #000000;
color: #CCCCCC;
overflow: auto;
tab-size: 4;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor:disabled {
color: #888888;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor::-moz-selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_launch_opt_editor::selection {
color: #000000;
background-color: #CCCCCC;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_footer {
flex: 0 1 auto;
}
.{% global `root_class_gen` %} ._eaglercraftX_boot_menu_footer_text {
text-align: left;
padding: 0px 0px 32px 64px;
color: #CCCCCC;
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "EAGLERX_V1",
"clear_cookies_before_launch": false
{
"client_launch_type": "EAGLERX_V1",
"clear_cookies_before_launch": false
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "EAGLERX_SIGNED_V1",
"clear_cookies_before_launch": false
{
"client_launch_type": "EAGLERX_SIGNED_V1",
"clear_cookies_before_launch": false
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "EAGLER_1_5_V2",
"clear_cookies_before_launch": false
{
"client_launch_type": "EAGLER_1_5_V2",
"clear_cookies_before_launch": false
}

View File

@ -1,5 +1,5 @@
{
"client_launch_type": "EAGLER_1_5_V1",
"join_server": "",
"clear_cookies_before_launch": false
{
"client_launch_type": "EAGLER_1_5_V1",
"join_server": "",
"clear_cookies_before_launch": false
}

View File

@ -1,5 +1,5 @@
{
"client_launch_type": "EAGLER_BETA_V1",
"join_server": "",
"clear_cookies_before_launch": false
{
"client_launch_type": "EAGLER_BETA_V1",
"join_server": "",
"clear_cookies_before_launch": false
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "PEYTON_V2",
"clear_cookies_before_launch": false
{
"client_launch_type": "PEYTON_V2",
"clear_cookies_before_launch": false
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "PEYTON_V2",
"clear_cookies_before_launch": false
{
"client_launch_type": "PEYTON_V2",
"clear_cookies_before_launch": false
}

View File

@ -1,4 +1,4 @@
{
"client_launch_type": "PEYTON_V1",
"clear_cookies_before_launch": false
{
"client_launch_type": "PEYTON_V1",
"clear_cookies_before_launch": false
}

View File

@ -1,8 +1,8 @@
{
"client_launch_type": "STANDARD_OFFLINE_V1",
"client_launch_opts_var": "eaglercraftXOpts",
"client_launch_opts_assetsURI_var": "assetsURI",
"client_launch_opts_container_var": "container",
"client_launch_main_func": "main",
"clear_cookies_before_launch": false
{
"client_launch_type": "STANDARD_OFFLINE_V1",
"client_launch_opts_var": "eaglercraftXOpts",
"client_launch_opts_assetsURI_var": "assetsURI",
"client_launch_opts_container_var": "container",
"client_launch_main_func": "main",
"clear_cookies_before_launch": false
}

View File

@ -1,192 +1,192 @@
{
"defaults": {
"EAGLERX_SIGNED_V1": {
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8.txt"
},
"EAGLERX_V1": {
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8.txt"
},
"EAGLER_BETA_V1": {
"conf": "conf_template_eaglercraft_b1_3.json",
"opts": null
},
"EAGLER_1_5_V1": {
"conf": "conf_template_eaglercraft_1_5_legacy.json",
"opts": "opts_template_eaglercraft_1_5_legacy.txt"
},
"EAGLER_1_5_V2": {
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5.txt"
},
"PEYTON_V1": {
"conf": "conf_template_peytonplayz585_indev.json",
"opts": null
},
"PEYTON_V2": {
"conf": "conf_template_peytonplayz585_a1_2_6.json",
"opts": "opts_template_peytonplayz585_a1_2_6.txt"
},
"STANDARD_OFFLINE_V1": {
"conf": "conf_template_standard_offline.json",
"opts": null
}
},
"templates": [
{
"name": "EaglercraftX 1.8",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 Demo",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8_demo.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 HTML5 Cursors",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8_html5Cursors.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 Signed",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "EaglercraftX 1.8 Signed Demo",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8_demo.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "EaglercraftX 1.8 Signed HTML5 Cursors",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8_html5Cursors.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "Eaglercraft 1.5.2 (post-22w34a)",
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5.txt",
"allow": [
"EAGLER_STANDARD_1_5_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_NEW_OFFLINE"
]
},
{
"name": "Eaglercraft 1.5.2 Live Music (post-22w34a)",
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5_livestream.txt",
"allow": [
"EAGLER_STANDARD_1_5_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_NEW_OFFLINE"
]
},
{
"name": "Eaglercraft 1.5.2 (pre-22w34a)",
"conf": "conf_template_eaglercraft_1_5_legacy.json",
"opts": "opts_template_eaglercraft_1_5_legacy.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_OLD_OFFLINE"
]
},
{
"name": "Eaglercraft Beta 1.3",
"conf": "conf_template_eaglercraft_b1_3.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_BETA_B1_3_OFFLINE"
]
},
{
"name": "PeytonPlayz585 Beta 1.7.3",
"conf": "conf_template_peytonplayz585_b1_7_3.json",
"opts": "opts_template_peytonplayz585_b1_7_3.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_ALPHA_BETA"
]
},
{
"name": "PeytonPlayz585 Alpha 1.2.6",
"conf": "conf_template_peytonplayz585_a1_2_6.json",
"opts": "opts_template_peytonplayz585_a1_2_6.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_ALPHA_BETA"
]
},
{
"name": "PeytonPlayz585 Indev",
"conf": "conf_template_peytonplayz585_indev.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_INDEV"
]
},
{
"name": "Standard Offline Download",
"conf": "conf_template_standard_offline.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EXPORTED_STANDARD_OFFLINE"
]
}
]
{
"defaults": {
"EAGLERX_SIGNED_V1": {
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8.txt"
},
"EAGLERX_V1": {
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8.txt"
},
"EAGLER_BETA_V1": {
"conf": "conf_template_eaglercraft_b1_3.json",
"opts": null
},
"EAGLER_1_5_V1": {
"conf": "conf_template_eaglercraft_1_5_legacy.json",
"opts": "opts_template_eaglercraft_1_5_legacy.txt"
},
"EAGLER_1_5_V2": {
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5.txt"
},
"PEYTON_V1": {
"conf": "conf_template_peytonplayz585_indev.json",
"opts": null
},
"PEYTON_V2": {
"conf": "conf_template_peytonplayz585_a1_2_6.json",
"opts": "opts_template_peytonplayz585_a1_2_6.txt"
},
"STANDARD_OFFLINE_V1": {
"conf": "conf_template_standard_offline.json",
"opts": null
}
},
"templates": [
{
"name": "EaglercraftX 1.8",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 Demo",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8_demo.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 HTML5 Cursors",
"conf": "conf_template_eaglercraftX_1_8.json",
"opts": "opts_template_eaglercraftX_1_8_html5Cursors.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_OFFLINE"
]
},
{
"name": "EaglercraftX 1.8 Signed",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "EaglercraftX 1.8 Signed Demo",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8_demo.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "EaglercraftX 1.8 Signed HTML5 Cursors",
"conf": "conf_template_eaglercraftX_1_8_signed.json",
"opts": "opts_template_eaglercraftX_1_8_html5Cursors.txt",
"allow": [
"EAGLER_SIGNED_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFTX_1_8_SIGNED"
]
},
{
"name": "Eaglercraft 1.5.2 (post-22w34a)",
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5.txt",
"allow": [
"EAGLER_STANDARD_1_5_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_NEW_OFFLINE"
]
},
{
"name": "Eaglercraft 1.5.2 Live Music (post-22w34a)",
"conf": "conf_template_eaglercraft_1_5.json",
"opts": "opts_template_eaglercraft_1_5_livestream.txt",
"allow": [
"EAGLER_STANDARD_1_5_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_NEW_OFFLINE"
]
},
{
"name": "Eaglercraft 1.5.2 (pre-22w34a)",
"conf": "conf_template_eaglercraft_1_5_legacy.json",
"opts": "opts_template_eaglercraft_1_5_legacy.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_1_5_OLD_OFFLINE"
]
},
{
"name": "Eaglercraft Beta 1.3",
"conf": "conf_template_eaglercraft_b1_3.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EAGLERCRAFT_BETA_B1_3_OFFLINE"
]
},
{
"name": "PeytonPlayz585 Beta 1.7.3",
"conf": "conf_template_peytonplayz585_b1_7_3.json",
"opts": "opts_template_peytonplayz585_b1_7_3.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_ALPHA_BETA"
]
},
{
"name": "PeytonPlayz585 Alpha 1.2.6",
"conf": "conf_template_peytonplayz585_a1_2_6.json",
"opts": "opts_template_peytonplayz585_a1_2_6.txt",
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_ALPHA_BETA"
]
},
{
"name": "PeytonPlayz585 Indev",
"conf": "conf_template_peytonplayz585_indev.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"PEYTONPLAYZ585_INDEV"
]
},
{
"name": "Standard Offline Download",
"conf": "conf_template_standard_offline.json",
"opts": null,
"allow": [
"EAGLER_STANDARD_OFFLINE"
],
"parseTypes": [
"EXPORTED_STANDARD_OFFLINE"
]
}
]
}

View File

@ -1,86 +1,86 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;background-color:black;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="description" content="${client_name}" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>${client_name}</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="${client_name}" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFTX_1_8_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
var relayIdMax = ${relayId_max};
var relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window.eaglercraftXOpts = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window.eaglercraftXOpts.container = "game_frame";
window.eaglercraftXOpts.assetsURI = ${assets_epk};
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
var launchSkipCountdown = false;
var launchTick = function() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100 || launchSkipCountdown) {
clearInterval(launchInterval);
setTimeout(function() { document.body.removeChild(document.getElementById("launch_countdown_screen")); document.body.style.backgroundColor = "black"; main(); }, 50);
}
};
window.addEventListener("load", function() {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
document.getElementById("skipCountdown").addEventListener("click", function() {
launchSkipCountdown = true;
});
document.getElementById("bootMenu").addEventListener("click", function() {
launchSkipCountdown = true;
window.eaglercraftXOpts.showBootMenuOnLaunch = true;
});
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;background-color:white;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>${client_name}</h1>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div>
<p style="margin-top:30px;"><button id="skipCountdown" autofocus>Skip Countdown</button>&emsp;<button id="bootMenu">Enter Boot Menu</button></p></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;background-color:black;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="description" content="${client_name}" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>${client_name}</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="${client_name}" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFTX_1_8_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
var relayIdMax = ${relayId_max};
var relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window.eaglercraftXOpts = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window.eaglercraftXOpts.container = "game_frame";
window.eaglercraftXOpts.assetsURI = ${assets_epk};
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
var launchSkipCountdown = false;
var launchTick = function() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100 || launchSkipCountdown) {
clearInterval(launchInterval);
setTimeout(function() { document.body.removeChild(document.getElementById("launch_countdown_screen")); document.body.style.backgroundColor = "black"; main(); }, 50);
}
};
window.addEventListener("load", function() {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
document.getElementById("skipCountdown").addEventListener("click", function() {
launchSkipCountdown = true;
});
document.getElementById("bootMenu").addEventListener("click", function() {
launchSkipCountdown = true;
window.eaglercraftXOpts.showBootMenuOnLaunch = true;
});
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;background-color:white;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>${client_name}</h1>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div>
<p style="margin-top:30px;"><button id="skipCountdown" autofocus>Skip Countdown</button>&emsp;<button id="bootMenu">Enter Boot Menu</button></p></div>
</div>
</div>
</body>
</html>

View File

@ -1,85 +1,85 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;background-color:black;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="description" content="EaglercraftX 1.8" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>EaglercraftX 1.8</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="EaglercraftX 1.8" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFTX_1_8_FAT_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
var relayIdMax = ${relayId_max};
var relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window.eaglercraftXOpts = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window.eaglercraftXOpts.container = "game_frame";
window.eaglercraftXOpts.assetsURI = ${assets_epk};
window.eaglercraftXOpts.showBootMenuOnLaunch = true;
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
var launchSkipCountdown = false;
var launchTick = function() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100 || launchSkipCountdown) {
clearInterval(launchInterval);
setTimeout(function() { document.body.removeChild(document.getElementById("launch_countdown_screen")); document.body.style.backgroundColor = "black"; main(); }, 50);
}
};
window.addEventListener("load", function() {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
document.getElementById("skipCountdown").addEventListener("click", function() {
launchSkipCountdown = true;
});
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
${fat_offline_data}
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;background-color:white;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>EaglercraftX 1.8 "Fat Offline"</h1>
<h3>Contains: ${num_clients} Client(s)</h3>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div>
<p style="margin-top:30px;"><button id="skipCountdown" autofocus>Skip Countdown</button></p></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;background-color:black;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="description" content="EaglercraftX 1.8" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>EaglercraftX 1.8</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="EaglercraftX 1.8" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFTX_1_8_FAT_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
var relayIdMax = ${relayId_max};
var relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window.eaglercraftXOpts = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window.eaglercraftXOpts.container = "game_frame";
window.eaglercraftXOpts.assetsURI = ${assets_epk};
window.eaglercraftXOpts.showBootMenuOnLaunch = true;
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
var launchSkipCountdown = false;
var launchTick = function() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100 || launchSkipCountdown) {
clearInterval(launchInterval);
setTimeout(function() { document.body.removeChild(document.getElementById("launch_countdown_screen")); document.body.style.backgroundColor = "black"; main(); }, 50);
}
};
window.addEventListener("load", function() {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
document.getElementById("skipCountdown").addEventListener("click", function() {
launchSkipCountdown = true;
});
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
${fat_offline_data}
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;background-color:white;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>EaglercraftX 1.8 "Fat Offline"</h1>
<h3>Contains: ${num_clients} Client(s)</h3>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div>
<p style="margin-top:30px;"><button id="skipCountdown" autofocus>Skip Countdown</button></p></div>
</div>
</div>
</body>
</html>

View File

@ -1,78 +1,78 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>My Drive - Google Drive</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_1_5_NEW_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
const relayIdMax = ${relayId_max};
const relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
window.eaglercraftOpts = ${launch_opts};
window.eaglercraftOpts.container = "game_frame";
window.eaglercraftOpts.assetsURI = getAssetsURI();
window.eaglercraftOpts.serverWorkerURI = createWorkerURI("sp_worker");
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
function createWorkerURI(el) {
var eee = document.getElementById(el);
var str = eee.innerHTML;
eee.remove();
str = "\"use strict\";var eaglercraftServerOpts;onmessage = function(o) { eaglercraftServerOpts = o.data; main(); };" + str;
return URL.createObjectURL(new Blob([str], {type:"text/javascript"}));
}
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGAUlEQVRYw7VXa0xTZxj+oKjJNjWZ10EtZqIQjBdsT2utlZYiMsfiZltUtpiYOZ0zceOmcZfsGLmoQ25hS1jmNJpBL1xEuWwZGduPjW0xcVniLn/YfmlrK6wDRulpz7v3O+1BCgUs4pc8+U5Ov6/P877v837nHEKiGzHEZpYQVhcXEfQ3uuaJjOCfP9pSG5E8GXIzmS+r0Rtk1bqcxCrti+NB76XVaA3EzM6fUxHmELmm7bXkjVde6pPV6WD1x/owyBDrEaTOAD9fTeqDLpJM98CciIBgTRVW0211Rx4k1WWOSiu0flnlDgGrEBsQpELnZz9hRuErAqNNMb8IW+Ex/SCvPzJPILebjm69eQAYm8m7+doeWHVRC0guIBGxDkEupsPfDSsBmokXumLB10TeFETUk3mPFbmq89VFCovJxdhNIG80BhirCVLqd4G0Yjtg9LC5UgvkIx1c/XQTJQevXRLgWwj47MSFJVg860yMRW81VW1tPwCKRqNPYTECxZaGV2B1VTqswUw8jZFrq7ZDv/UZ8Ddh+u0xCOKDL1FEM6maVRZE46ls5lSFNUiK4IW50Qg0C6mXdsPmCg2QCj10f54iRD9il1Bymn6ezhwVZCOpURtSFIDkHaob+yk5J0YvQoMg1YbA0RpVwGsnAvEEcNAhiOiISoCuB080HEqLKUfVti8iOcU2qylArr0MfzTIaPQoQjJJBGZCEOG3kxxBRA+Jm/moDQ2M/jdlSy4l808kZ1DUdswMseW2IHkLdCI5kkXIgh/aaFuS3x96expDisaTW4wFE403DtQLvBa7gjS/nogCEgMt4bWfAMGQWIqC6Q3JsrF0SrOZl2HbebDnHxpvPFAUFYciq8WtSFxNSShZBAG8v1kQ50EfLBNEsCQ2QvTyYNtZjPVC9JaI0QfoeYDlcctt5sVjaf2aLEYCd6j/AxGz0IVeaCb1dP2tiVkQXS+37NvC2M1ItJePZDwqiopjbMZjwsYeNk40Fgo4RkmmyIKQCWgl1LBbJnUFC8H0Y2TfTON8v7IVTYnPhImGFY2FIm7DjaD5JgmgHdEuZKgndDrGhrUdYzXmBnt+LzdF9ChgH2AJDMI+VjfWUlhT4ZprJQa4OYUA8WzoFMTkhrVlUm3tAoUlr49pysPzfn9A0YhCwoGpP4gi8q7T9S/Udi4w20CiY3viKAhed+I9+pvXvu46dD0HPhuWwhYLExCAVpztsX1Qm7RgrASMfdMhdZcWa7vNh4BwqHllkwYUNqUnpZssmfEZ9hNZgrX2+NsWga+V8AgIQwsashsNeZ0cGtuUVP49m1x9B9aW9/qSynshqfyHEHrpPf758z+C4vyduzvLfA0ZZcOthnJvU0bZf83jocd7e8oGW8k5+OJbtuHuaAGBB/lKfiA/FQby10NwToV/8tf74PRG8BSlsmMClr41ol9ZNAorTvT7V7zdDyJWIpaf6AfZOwO8vsQPu6oAsi5OjWyEAdfknBmCv3Yc5N1pa8HBaMCpUD0Eo/IPKdXgStDoxR4U2iGh2HFD+t4wxBfd4xKK7tEZpIhlhXdBxfZDZvkQry8d4jJKh6fF7pJ/uacucPxnhb3g2UHAma2D+1kKBAOuLIbz7t4Krl3MTeG9kdD2DwmIP+lKji908vGFDkDwCTgvL7gH6065wFA6BBlRIAuxoWwEfs1lYYCKyNSCy8Dw9w0MULiz5CnBd13xTfvILeFkii92VkjfH0UBTh8VsKLAAZozHjCUDUclILtkENaUj8KZ03/Cg3QJ3M/UUGIfl62mQiqE01AuH3caAggHydKTroXxRU6ntNgNSwscgQ3vuiETyfVRZoACSwGScxx8d+gSeDQk4M7SU3KnS6NZGPmpGMqCtNh1OOEDPyQUOUbSzw5yBqG2Q1FjZ8kgx5SNcG986OAcmeoRyE4D107t4cnRhzVxMBPPFjra1RfQ1ZUhh1fODntwL6kB6D51C4bUpH3G9wFRAF7E6EqHj2Ptr2A0l9HdswKa97IW/2P/Wc9xkRhm/HYcEzH3Ax79wxUzwELcXIFFwBP7an7M8T8H1bLLDGWzFAAAAABJRU5ErkJggg==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/eaglerworker" id="sp_worker">
${classes_server_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>My Drive - Google Drive</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_1_5_NEW_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
const relayIdMax = ${relayId_max};
const relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
window.eaglercraftOpts = ${launch_opts};
window.eaglercraftOpts.container = "game_frame";
window.eaglercraftOpts.assetsURI = getAssetsURI();
window.eaglercraftOpts.serverWorkerURI = createWorkerURI("sp_worker");
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
function createWorkerURI(el) {
var eee = document.getElementById(el);
var str = eee.innerHTML;
eee.remove();
str = "\"use strict\";var eaglercraftServerOpts;onmessage = function(o) { eaglercraftServerOpts = o.data; main(); };" + str;
return URL.createObjectURL(new Blob([str], {type:"text/javascript"}));
}
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGAUlEQVRYw7VXa0xTZxj+oKjJNjWZ10EtZqIQjBdsT2utlZYiMsfiZltUtpiYOZ0zceOmcZfsGLmoQ25hS1jmNJpBL1xEuWwZGduPjW0xcVniLn/YfmlrK6wDRulpz7v3O+1BCgUs4pc8+U5Ov6/P877v837nHEKiGzHEZpYQVhcXEfQ3uuaJjOCfP9pSG5E8GXIzmS+r0Rtk1bqcxCrti+NB76XVaA3EzM6fUxHmELmm7bXkjVde6pPV6WD1x/owyBDrEaTOAD9fTeqDLpJM98CciIBgTRVW0211Rx4k1WWOSiu0flnlDgGrEBsQpELnZz9hRuErAqNNMb8IW+Ex/SCvPzJPILebjm69eQAYm8m7+doeWHVRC0guIBGxDkEupsPfDSsBmokXumLB10TeFETUk3mPFbmq89VFCovJxdhNIG80BhirCVLqd4G0Yjtg9LC5UgvkIx1c/XQTJQevXRLgWwj47MSFJVg860yMRW81VW1tPwCKRqNPYTECxZaGV2B1VTqswUw8jZFrq7ZDv/UZ8Ddh+u0xCOKDL1FEM6maVRZE46ls5lSFNUiK4IW50Qg0C6mXdsPmCg2QCj10f54iRD9il1Bymn6ezhwVZCOpURtSFIDkHaob+yk5J0YvQoMg1YbA0RpVwGsnAvEEcNAhiOiISoCuB080HEqLKUfVti8iOcU2qylArr0MfzTIaPQoQjJJBGZCEOG3kxxBRA+Jm/moDQ2M/jdlSy4l808kZ1DUdswMseW2IHkLdCI5kkXIgh/aaFuS3x96expDisaTW4wFE403DtQLvBa7gjS/nogCEgMt4bWfAMGQWIqC6Q3JsrF0SrOZl2HbebDnHxpvPFAUFYciq8WtSFxNSShZBAG8v1kQ50EfLBNEsCQ2QvTyYNtZjPVC9JaI0QfoeYDlcctt5sVjaf2aLEYCd6j/AxGz0IVeaCb1dP2tiVkQXS+37NvC2M1ItJePZDwqiopjbMZjwsYeNk40Fgo4RkmmyIKQCWgl1LBbJnUFC8H0Y2TfTON8v7IVTYnPhImGFY2FIm7DjaD5JgmgHdEuZKgndDrGhrUdYzXmBnt+LzdF9ChgH2AJDMI+VjfWUlhT4ZprJQa4OYUA8WzoFMTkhrVlUm3tAoUlr49pysPzfn9A0YhCwoGpP4gi8q7T9S/Udi4w20CiY3viKAhed+I9+pvXvu46dD0HPhuWwhYLExCAVpztsX1Qm7RgrASMfdMhdZcWa7vNh4BwqHllkwYUNqUnpZssmfEZ9hNZgrX2+NsWga+V8AgIQwsashsNeZ0cGtuUVP49m1x9B9aW9/qSynshqfyHEHrpPf758z+C4vyduzvLfA0ZZcOthnJvU0bZf83jocd7e8oGW8k5+OJbtuHuaAGBB/lKfiA/FQby10NwToV/8tf74PRG8BSlsmMClr41ol9ZNAorTvT7V7zdDyJWIpaf6AfZOwO8vsQPu6oAsi5OjWyEAdfknBmCv3Yc5N1pa8HBaMCpUD0Eo/IPKdXgStDoxR4U2iGh2HFD+t4wxBfd4xKK7tEZpIhlhXdBxfZDZvkQry8d4jJKh6fF7pJ/uacucPxnhb3g2UHAma2D+1kKBAOuLIbz7t4Krl3MTeG9kdD2DwmIP+lKji908vGFDkDwCTgvL7gH6065wFA6BBlRIAuxoWwEfs1lYYCKyNSCy8Dw9w0MULiz5CnBd13xTfvILeFkii92VkjfH0UBTh8VsKLAAZozHjCUDUclILtkENaUj8KZ03/Cg3QJ3M/UUGIfl62mQiqE01AuH3caAggHydKTroXxRU6ntNgNSwscgQ3vuiETyfVRZoACSwGScxx8d+gSeDQk4M7SU3KnS6NZGPmpGMqCtNh1OOEDPyQUOUbSzw5yBqG2Q1FjZ8kgx5SNcG986OAcmeoRyE4D107t4cnRhzVxMBPPFjra1RfQ1ZUhh1fODntwL6kB6D51C4bUpH3G9wFRAF7E6EqHj2Ptr2A0l9HdswKa97IW/2P/Wc9xkRhm/HYcEzH3Ax79wxUzwELcXIFFwBP7an7M8T8H1bLLDGWzFAAAAABJRU5ErkJggg==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/eaglerworker" id="sp_worker">
${classes_server_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
</html>

View File

@ -1,59 +1,59 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_1_5_OLD_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
window.minecraftOpts = [ "game_frame", getAssetsURI(), "${launch_opts}" ];
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<link type="image/x-icon" rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAICAQAAEABADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3d3cHiIiIiIiIiIiIiIiIiIiHB4f/////////////////hweH/////////////////4cHh/////cAAHiI//////+HB4f///8REREAiIj/////hweH///3GNmREHAAAIiI/4cHh///8Y2ZmREHeqoIiI+HB4f///GNmZmRB3qqIIiIhweH///xjZmZkQd6qiIIiIcHh///8Y2ZmZEHqqoiD/+HB4f///cY2ZmRd6qqIg//hweH////EY2ZEXqqqiIP/4cHh/////cREXL6qqoiD/+HB4f////////y////Ig//hweH/////////yIiIoIP/4cHh//////////yIiIoD/+HB4f//////////yIiIn//hweH/////////////////4cHh/////////////////+HB4d3d3d3d3d3d3d3d3d3hweIiIiIiIiIiIiIiIiIiIcHhMwiRERERERERAAAAAAHB4TsokRERERERESICICIBweEETNEREREREREiAiAiAcHhJGzRERERERERERERERHB4iIiIiIiIiIiIiIiIiIhwd3d3d3d3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////w==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_1_5_OLD_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
window.minecraftOpts = [ "game_frame", getAssetsURI(), "${launch_opts}" ];
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<link type="image/x-icon" rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAICAQAAEABADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3d3cHiIiIiIiIiIiIiIiIiIiHB4f/////////////////hweH/////////////////4cHh/////cAAHiI//////+HB4f///8REREAiIj/////hweH///3GNmREHAAAIiI/4cHh///8Y2ZmREHeqoIiI+HB4f///GNmZmRB3qqIIiIhweH///xjZmZkQd6qiIIiIcHh///8Y2ZmZEHqqoiD/+HB4f///cY2ZmRd6qqIg//hweH////EY2ZEXqqqiIP/4cHh/////cREXL6qqoiD/+HB4f////////y////Ig//hweH/////////yIiIoIP/4cHh//////////yIiIoD/+HB4f//////////yIiIn//hweH/////////////////4cHh/////////////////+HB4d3d3d3d3d3d3d3d3d3hweIiIiIiIiIiIiIiIiIiIcHhMwiRERERERERAAAAAAHB4TsokRERERERESICICIBweEETNEREREREREiAiAiAcHhJGzRERERERERERERERHB4iIiIiIiIiIiIiIiIiIhwd3d3d3d3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////w==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
</html>

View File

@ -1,59 +1,59 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_BETA_B1_3_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
window.minecraftOpts = [ "game_frame", getAssetsURI() ];
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<link type="image/x-icon" rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAICAQAAEABADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3d3cHiIiIiIiIiIiIiIiIiIiHB4f/////////////////hweH/////////////////4cHh/////cAAHiI//////+HB4f///8REREAiIj/////hweH///3GNmREHAAAIiI/4cHh///8Y2ZmREHeqoIiI+HB4f///GNmZmRB3qqIIiIhweH///xjZmZkQd6qiIIiIcHh///8Y2ZmZEHqqoiD/+HB4f///cY2ZmRd6qqIg//hweH////EY2ZEXqqqiIP/4cHh/////cREXL6qqoiD/+HB4f////////y////Ig//hweH/////////yIiIoIP/4cHh//////////yIiIoD/+HB4f//////////yIiIn//hweH/////////////////4cHh/////////////////+HB4d3d3d3d3d3d3d3d3d3hweIiIiIiIiIiIiIiIiIiIcHhMwiRERERERERAAAAAAHB4TsokRERERERESICICIBweEETNEREREREREiAiAiAcHhJGzRERERERERERERERHB4iIiIiIiIiIiIiIiIiIhwd3d3d3d3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////w==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"EAGLERCRAFT_BETA_B1_3_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
countdown();
setTimeout(function(){
document.getElementById("locally").remove();
window.minecraftOpts = [ "game_frame", getAssetsURI() ];
main();
}, 6000);
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<link type="image/x-icon" rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAICAQAAEABADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3d3cHiIiIiIiIiIiIiIiIiIiHB4f/////////////////hweH/////////////////4cHh/////cAAHiI//////+HB4f///8REREAiIj/////hweH///3GNmREHAAAIiI/4cHh///8Y2ZmREHeqoIiI+HB4f///GNmZmRB3qqIIiIhweH///xjZmZkQd6qiIIiIcHh///8Y2ZmZEHqqoiD/+HB4f///cY2ZmRd6qqIg//hweH////EY2ZEXqqqiIP/4cHh/////cREXL6qqoiD/+HB4f////////y////Ig//hweH/////////yIiIoIP/4cHh//////////yIiIoD/+HB4f//////////yIiIn//hweH/////////////////4cHh/////////////////+HB4d3d3d3d3d3d3d3d3d3hweIiIiIiIiIiIiIiIiIiIcHhMwiRERERERERAAAAAAHB4TsokRERERERESICICIBweEETNEREREREREiAiAiAcHhJGzRERERERERERERERHB4iIiIiIiIiIiIiIiIiIhwd3d3d3d3d3d3d3d3d3d3cAAAAAAAAAAAAAAAAAAAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////w==" />
<script type="text/javascript">
"use strict";
${classes_js}
</script>
<script type="text/javascript">
function countdown() {
const c = document.getElementById("countdown");
setTimeout(function(){ c.innerText = "(Game will launch in 4)"; }, 1000);
setTimeout(function(){ c.innerText = "(Game will launch in 3)"; }, 2000);
setTimeout(function(){ c.innerText = "(Game will launch in 2)"; }, 3000);
setTimeout(function(){ c.innerText = "(Game will launch in 1)"; }, 4000);
setTimeout(function(){ c.innerText = "(Game will launch in 0)"; }, 5000);
}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;font-family:sans-serif;overflow:hidden;" id="game_frame">
<div id="locally" style="text-align:center;">
<div style="height:5vh;"></div>
<h2>${client_name}</h2>
<p id="countdown" style="text-align:center;">(Game will launch in 5)</p>
</div>
</body>
</html>

View File

@ -1,40 +1,40 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"PEYTONPLAYZ585_ALPHA_BETA","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
window.config = ${launch_opts};
window.config.gameContainer = "game_frame";
window.config.assetsLocation = getAssetsURI();
main();
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
"use strict";
${classes_js}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
</body>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"PEYTONPLAYZ585_ALPHA_BETA","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
window.config = ${launch_opts};
window.config.gameContainer = "game_frame";
window.config.assetsLocation = getAssetsURI();
main();
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
"use strict";
${classes_js}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
</body>
</html>

View File

@ -1,38 +1,38 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"PEYTONPLAYZ585_INDEV","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
window.classicConfig = [ "game_frame", getAssetsURI() ];
main();
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
"use strict";
${classes_js}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
</body>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>${client_name}</title>
<style type="eaglercraftOfflineParseHint">{"type":"PEYTONPLAYZ585_INDEV","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
window.addEventListener("load", function() {
window.classicConfig = [ "game_frame", getAssetsURI() ];
main();
});
</script>
<script type="text/javascript">
function getAssetsURI() {
return "data:application/octet-stream;base64,${assets_epk}";
}
</script>
<script type="text/javascript">
"use strict";
${classes_js}
</script>
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
</body>
</html>

View File

@ -1,77 +1,77 @@
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="${client_name}" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>${client_name}</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="${client_name}" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EXPORTED_STANDARD_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
const relayIdMax = ${relayId_max};
const relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window["${launch_opts_var_name}"] = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window["${launch_opts_var_name}"]["${launch_opts_var_container_name}"] = "game_frame";
window["${launch_opts_var_name}"]["${launch_opts_var_assetsURI_name}"] = /*{:BEGIN_ASSETS_EPK:}*/${assets_epk}/*{:END_ASSETS_EPK:}*/;
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
function launchTick() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100) {
clearInterval(launchInterval);
setTimeout(() => { document.getElementById("launch_countdown_screen").remove(); window["${main_function_name}"](); }, 50);
}
}
window.addEventListener("load", () => {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>${client_name}</h1>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<!--
This file is from ${date}, it was generated using EaglercraftX 1.8 boot manager
-->
<html style="width:100%;height:100%;">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="${client_name}" />
<meta name="keywords" content="eaglercraft, eaglercraftx, minecraft, 1.8, 1.8.8" />
<title>${client_name}</title>
<meta property="og:locale" content="en-US" />
<meta property="og:type" content="website" />
<meta property="og:title" content="${client_name}" />
<meta property="og:description" content="this file is not a website, whoever uploaded it to this URL is a dumbass" />
<style type="eaglercraftOfflineParseHint">{"type":"EXPORTED_STANDARD_OFFLINE","launchConf":${launch_conf_json}}</style>
<script type="text/javascript">
"use strict";
const relayIdMax = ${relayId_max};
const relayId = relayIdMax > 1 ? Math.floor(Math.random() * relayIdMax) : 0;
// %%%%%%%%% launch options %%%%%%%%%%%%
window["${launch_opts_var_name}"] = ${launch_opts};
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
</script>
<script type="text/javascript">
"use strict";
if(typeof window !== "undefined") window.eaglercraftXClientScriptElement = document.currentScript;
${classes_js}
</script>
<script type="text/javascript">
"use strict";
(function(){
window["${launch_opts_var_name}"]["${launch_opts_var_container_name}"] = "game_frame";
window["${launch_opts_var_name}"]["${launch_opts_var_assetsURI_name}"] = /*{:BEGIN_ASSETS_EPK:}*/${assets_epk}/*{:END_ASSETS_EPK:}*/;
var launchInterval = -1;
var launchCounter = 1;
var launchCountdownNumberElement = null;
var launchCountdownProgressElement = null;
function launchTick() {
launchCountdownNumberElement.innerText = "" + Math.floor(6.0 - launchCounter * 0.06);
launchCountdownProgressElement.style.width = "" + launchCounter + "%";
if(++launchCounter > 100) {
clearInterval(launchInterval);
setTimeout(() => { document.getElementById("launch_countdown_screen").remove(); window["${main_function_name}"](); }, 50);
}
}
window.addEventListener("load", () => {
launchCountdownNumberElement = document.getElementById("launchCountdownNumber");
launchCountdownProgressElement = document.getElementById("launchCountdownProgress");
launchInterval = setInterval(launchTick, 50);
});
})();
</script>
<link type="image/png" rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAR/SURBVEhLtZXZK3ZRFMYPcqXc+gv413DHxVuGIpIhkciQWaRccCNjSCkligwXSOZ5nmfv9zvn2e8+58V753sudmuvvdZ61l5r7XOc8H+GS/D19aUNkPz5+aktQH5/f//4+LBKZKuRkpUtQjCUYG5gD2T38vLy/PwsDfL9/f3Dw8PT05M0b29vnKLhCKCBT4L4gvBLBIei4//4+Hh1dUVEQutUuLu7E83FxQUGnKLBWKfQaA3S+AREVxaEOD8/Pzk50XpzcyMDcH19zdZG3N3d3dzc3Nvb01aX5pQUpQGGQJxcQpfNysoKhUIdHR1o1tbWbInYAgxIPDMzMy8vLzc3FxqOdMoRqwJK8G8ALUYIhHMiSEhIwI6CyIb0qQzC4eGhsXCc1tZWnZIEKzdQJQSXgKxfX18RCM3Z5eWlcfVAxKOjo+Pj49PTU88lTOk2NjbMsePc3t6SAfcgFdszOyMuAdeBg0CQi2lhYUHOeOLDCisN8FzcPFZXV3t7ezHY3t5GQ+6it+2xMASsKhEEWKsmRLRBBUpPvpJ/TpFKFBwKYAiITmicsbYhdHfJAltqhUCVsCQhwslmeXmZxiBQT9c0Ar9E2O3v72sYSE0N1yQArkKy0kBMXLqlZqIZHR3t6empqqqSDcBdhXEJSJ/bUc3q6uq+vj629GB9fR1WsLW1NTs7u7S0RN2locMjIyOEm5ubQ7+4uJienk4/+vv77Y1hwhLBEKhwWHitdVFfX9/Y2Gg2HuLi4owUAysrK8yCG97rh0+ApP5Q2ZycHFlPTExUVFRIBvn5+WhKSkp2dnaMKhptbW2426GgQ/rwuAQCZ1hwFayLiork9hMFBQV1dXVmE0BLS4vqw3QFB8kn4IAxoGPkYpxi4FeDmpqas7Mz4pClAgqGwD48rjY2NmacYqC0tJQ1KSlJWyE5OZkpUKkBAxZVIntAoZh04+Q48fHxPNGBgYHExMT29naj9cBodnZ2mo3jlJWVMeW2OGQck4B1amqqoaGhqamJjx2lGxwcpL0mUgR8fJhsWqJtSkoKU2SbHHUDpkhPBujd8xuQG6PJRM/Pz09PT7O1NNnZ2Tw3fgZkXVhYKCUlUhBATP+hCVyKZGky17RV0g04laayslJ6hlVeFHB4eFhKaogGd0LxtmTgE+hbhKDnPjMzgw8E3qGL2tpaBWpubjYqj2BoaEj6rq4uNATRZ0ZwCbiL6gXEzINk5vCBQJ9rMD4+rkA8QNK036uDg4Py8vLu7m680KjIBNR3zBDoWQM1g98snyB+VSoRW8C/UwR81/SvhgNj9JOTkwwVERUdRBEI0BAdLRVERkhLS8vIyEDQlrsTPTU1lVFhKxARvZgUlFLbegCf4BvIsbi4mIg4E5EogIHhiKCMtU0WUFiVy06j5fAJIDdSBDQw+PegDfBRcbOPwH4F9LuFWIIQdQNKwWqzIE0aoFUaBsw+SQuFw0uNtC9A+F4i3QNrbg3IDn+SAsHh+wYiEpeyBEMLv/cAO6KzAijxxB+Y4wisBhssJUhjEbPJf4Nw+B+JXqLW3bw+wQAAAABJRU5ErkJggg==" />
</head>
<body style="margin:0px;width:100%;height:100%;overflow:hidden;" id="game_frame">
<div style="margin:0px;width:100%;height:100%;font-family:sans-serif;display:flex;align-items:center;user-select:none;" id="launch_countdown_screen">
<div style="margin:auto;text-align:center;">
<h1>${client_name}</h1>
<h2>Game will launch in <span id="launchCountdownNumber">5</span>...</h2>
<div style="border:2px solid black;width:100%;height:15px;padding:1px;margin-bottom:20vh;"><div id="launchCountdownProgress" style="background-color:#555555;width:0%;height:100%;"></div></div>
</div>
</div>
</body>
</html>

View File

@ -1,66 +1,66 @@
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": false,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": false,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": false,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": false,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
}

View File

@ -1,66 +1,66 @@
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": false,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": true,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": false,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": true,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
}

View File

@ -1,66 +1,66 @@
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": true,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": false,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
{
"joinServer": null,
"servers": [
{
"addr": "ws://localhost:8081/",
"hideAddr": false,
"name": "Local test server"
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"primary": "$random_relay_primary_0",
"comment": "lax1dude relay #1"
},
{
"addr": "wss://relay.lax1dude.net/",
"primary": "$random_relay_primary_1",
"comment": "lax1dude relay #2"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"primary": "$random_relay_primary_2",
"comment": "ayunami relay #1"
}
],
"openDebugConsoleOnLaunch": false,
"showBootMenuOnLaunch": false,
"bootMenuBlocksUnsignedClients": false,
"allowBootMenu": true,
"forceWebViewSupport": false,
"enableServerCookies": true,
"enableDownloadOfflineButton": true,
"resourcePacksDB": "resourcePacks",
"enableWebViewCSP": true,
"checkRelaysForUpdates": true,
"allowServerRedirects": true,
"allowUpdateSvc": true,
"html5CursorSupport": true,
"allowFNAWSkins": true,
"allowVoiceClient": true,
"worldsDB": "worlds",
"demoMode": false,
"localStorageNamespace": "_eaglercraftX",
"enableSignatureBadge": false,
"lang": "en_US",
"enableMinceraft": true,
"autoFixLegacyStyleAttr": true,
"allowUpdateDL": true,
"logInvalidCerts": false,
"checkShaderGLErrors": false,
"crashOnUncaughtExceptions": false,
"forceWebGL1": false,
"forceWebGL2": false,
"allowExperimentalWebGL1": true,
"useWebGLExt": true,
"useDelayOnSwap": false,
"useJOrbisAudioDecoder": false,
"useXHRFetch": false,
"useVisualViewport": true,
"deobfStackTraces": true,
"disableBlobURLs": false,
"eaglerNoDelay": false,
"ramdiskMode": false,
"singleThreadMode": false
}

View File

@ -1,52 +1,52 @@
{
"joinServer": null,
"servers": [
{
"serverName": "Local Test Server",
"serverAddress": "localhost:25565",
"hideAddress": false
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"name": "lax1dude relay #1",
"primary": "$random_relay_primary_0"
},
{
"addr": "wss://relay.lax1dude.net/",
"name": "lax1dude relay #2",
"primary": "$random_relay_primary_1"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"name": "ayunami relay #1",
"primary": "$random_relay_primary_2"
}
],
"mainMenu": {
"splashes": [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
],
"eaglerLogo": false,
"itemLink": null,
"itemLine0": null,
"itemLine1": null,
"itemLine2": null
},
"worldsFolder": "MAIN",
"profanity": false,
"hideDownServers": false,
"serverListTitle": null,
"serverListLink": null
{
"joinServer": null,
"servers": [
{
"serverName": "Local Test Server",
"serverAddress": "localhost:25565",
"hideAddress": false
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"name": "lax1dude relay #1",
"primary": "$random_relay_primary_0"
},
{
"addr": "wss://relay.lax1dude.net/",
"name": "lax1dude relay #2",
"primary": "$random_relay_primary_1"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"name": "ayunami relay #1",
"primary": "$random_relay_primary_2"
}
],
"mainMenu": {
"splashes": [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
],
"eaglerLogo": false,
"itemLink": null,
"itemLine0": null,
"itemLine1": null,
"itemLine2": null
},
"worldsFolder": "MAIN",
"profanity": false,
"hideDownServers": false,
"serverListTitle": null,
"serverListLink": null
}

View File

@ -1,32 +1,32 @@
[NBT]{
servers: [
{
name: "Local Test Server",
ip: "localhost:25565",
hideAddress: false
}
],
mainMenu: {
itemLink: "",
itemLine0: "",
itemLine1: "",
itemLine2: "",
splashes: [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
]
},
profanity: false,
hide_down: false,
serverListTitle: "",
serverListLink: ""
[NBT]{
servers: [
{
name: "Local Test Server",
ip: "localhost:25565",
hideAddress: false
}
],
mainMenu: {
itemLink: "",
itemLine0: "",
itemLine1: "",
itemLine2: "",
splashes: [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
]
},
profanity: false,
hide_down: false,
serverListTitle: "",
serverListLink: ""
}[/NBT]

View File

@ -1,63 +1,63 @@
{
"joinServer": null,
"servers": [
{
"serverName": "Local Test Server",
"serverAddress": "localhost:25565",
"hideAddress": false
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"name": "lax1dude relay #1",
"primary": "$random_relay_primary_0"
},
{
"addr": "wss://relay.lax1dude.net/",
"name": "lax1dude relay #2",
"primary": "$random_relay_primary_1"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"name": "ayunami relay #1",
"primary": "$random_relay_primary_2"
}
],
"mainMenu": {
"splashes": [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
],
"eaglerLogo": false,
"itemLink": null,
"itemLine0": null,
"itemLine1": null,
"itemLine2": null
},
"worldsFolder": "MAIN",
"assetOverrides": {
"title/no-pano-blur.flag": "false",
"records/wait.mp3": "wait.mp3",
"records/mellohi.mp3": "https://stream.nightride.fm/chillsynth.m4a",
"records/far.mp3": "https://stream.nightride.fm/nightride.m4a",
"records/cat.mp3": "http://usa9.fastcast4u.com/proxy/jamz?mp=/1",
"records/ward.mp3": "http://fr4.1mix.co.uk:8000/192h",
"records/strad.mp3": "http://listen.011fm.com:8028/stream15",
"records/blocks.mp3": "https://www.ophanim.net:8444/s/9780",
"records/13.mp3": "https://s2.radio.co/s2b2b68744/listen"
},
"profanity": false,
"hideDownServers": false,
"serverListTitle": null,
"serverListLink": null
{
"joinServer": null,
"servers": [
{
"serverName": "Local Test Server",
"serverAddress": "localhost:25565",
"hideAddress": false
}
],
"relays": [
{
"addr": "wss://relay.deev.is/",
"name": "lax1dude relay #1",
"primary": "$random_relay_primary_0"
},
{
"addr": "wss://relay.lax1dude.net/",
"name": "lax1dude relay #2",
"primary": "$random_relay_primary_1"
},
{
"addr": "wss://relay.shhnowisnottheti.me/",
"name": "ayunami relay #1",
"primary": "$random_relay_primary_2"
}
],
"mainMenu": {
"splashes": [
"Darviglet!",
"eaglerenophile!",
"You Eagler!",
"Yeeeeeee!",
"yeee",
"EEEEEEEEE!",
"You Darvig!",
"You Vigg!",
":>",
"|>",
"You Yumpster!"
],
"eaglerLogo": false,
"itemLink": null,
"itemLine0": null,
"itemLine1": null,
"itemLine2": null
},
"worldsFolder": "MAIN",
"assetOverrides": {
"title/no-pano-blur.flag": "false",
"records/wait.mp3": "wait.mp3",
"records/mellohi.mp3": "https://stream.nightride.fm/chillsynth.m4a",
"records/far.mp3": "https://stream.nightride.fm/nightride.m4a",
"records/cat.mp3": "http://usa9.fastcast4u.com/proxy/jamz?mp=/1",
"records/ward.mp3": "http://fr4.1mix.co.uk:8000/192h",
"records/strad.mp3": "http://listen.011fm.com:8028/stream15",
"records/blocks.mp3": "https://www.ophanim.net:8444/s/9780",
"records/13.mp3": "https://s2.radio.co/s2b2b68744/listen"
},
"profanity": false,
"hideDownServers": false,
"serverListTitle": null,
"serverListLink": null
}

View File

@ -1,6 +1,6 @@
{
"dataBaseName": "_net_PeytonPlayz585_eaglercraft_Alpha_IndexedDBFilesystem_1_2_6",
"playerUsername": null,
"serverIP": null,
"joinServerOnLaunch": null
{
"dataBaseName": "_net_PeytonPlayz585_eaglercraft_Alpha_IndexedDBFilesystem_1_2_6",
"playerUsername": null,
"serverIP": null,
"joinServerOnLaunch": null
}

View File

@ -1,6 +1,6 @@
{
"dataBaseName": "_net_PeytonPlayz585_eaglercraft_beta_IndexedDBFilesystem_1_7_3",
"playerUsername": null,
"serverIP": null,
"joinServerOnLaunch": null
{
"dataBaseName": "_net_PeytonPlayz585_eaglercraft_beta_IndexedDBFilesystem_1_7_3",
"playerUsername": null,
"serverIP": null,
"joinServerOnLaunch": null
}

View File

@ -1,32 +1,32 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN(vec2, v_texCoord2f)
EAGLER_IN(vec4, v_color4f)
EAGLER_FRAG_OUT()
uniform sampler2D u_inputTexture;
uniform vec4 u_colorBias4f;
void main() {
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f + u_colorBias4f;
if(EAGLER_FRAG_COLOR.a < 0.004) {
discard;
}
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN(vec2, v_texCoord2f)
EAGLER_IN(vec4, v_color4f)
EAGLER_FRAG_OUT()
uniform sampler2D u_inputTexture;
uniform vec4 u_colorBias4f;
void main() {
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f + u_colorBias4f;
if(EAGLER_FRAG_COLOR.a < 0.004) {
discard;
}
}

View File

@ -1,50 +1,50 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_VSH_LAYOUT_BEGIN()
EAGLER_IN(0, vec3, a_position3f)
EAGLER_IN(1, vec2, c_position2i)
EAGLER_IN(2, vec2, c_coords2i)
EAGLER_IN(3, vec4, c_color4f)
EAGLER_VSH_LAYOUT_END()
EAGLER_OUT(vec2, v_texCoord2f)
EAGLER_OUT(vec4, v_color4f)
uniform mat4 u_matrixTransform;
uniform vec2 u_charSize2f;
uniform vec2 u_charCoordSize2f;
uniform vec4 u_color4f;
void main() {
v_color4f = c_color4f.bgra;
float shadowBit = a_position3f.z;
float boldBit = shadowBit >= 0.5 ? 1.0 : 0.0;
shadowBit -= boldBit * 0.5;
v_color4f.rgb *= (1.0 - shadowBit * 3.0);
v_texCoord2f = (c_coords2i + a_position3f.xy) * u_charCoordSize2f;
vec2 pos2d = c_position2i + vec2(shadowBit * 4.0);
pos2d += a_position3f.xy * u_charSize2f;
pos2d.x += boldBit;
float italicBit = v_color4f.a >= 0.5 ? 2.0 : 0.0;
v_color4f.a -= italicBit * 0.25;
pos2d.x -= (a_position3f.y - 0.5) * italicBit;
v_color4f.a *= 2.0;
v_color4f *= u_color4f;
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos2d, 0.0, 1.0);
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_VSH_LAYOUT_BEGIN()
EAGLER_IN(0, vec3, a_position3f)
EAGLER_IN(1, vec2, c_position2i)
EAGLER_IN(2, vec2, c_coords2i)
EAGLER_IN(3, vec4, c_color4f)
EAGLER_VSH_LAYOUT_END()
EAGLER_OUT(vec2, v_texCoord2f)
EAGLER_OUT(vec4, v_color4f)
uniform mat4 u_matrixTransform;
uniform vec2 u_charSize2f;
uniform vec2 u_charCoordSize2f;
uniform vec4 u_color4f;
void main() {
v_color4f = c_color4f.bgra;
float shadowBit = a_position3f.z;
float boldBit = shadowBit >= 0.5 ? 1.0 : 0.0;
shadowBit -= boldBit * 0.5;
v_color4f.rgb *= (1.0 - shadowBit * 3.0);
v_texCoord2f = (c_coords2i + a_position3f.xy) * u_charCoordSize2f;
vec2 pos2d = c_position2i + vec2(shadowBit * 4.0);
pos2d += a_position3f.xy * u_charSize2f;
pos2d.x += boldBit;
float italicBit = v_color4f.a >= 0.5 ? 2.0 : 0.0;
v_color4f.a -= italicBit * 0.25;
pos2d.x -= (a_position3f.y - 0.5) * italicBit;
v_color4f.a *= 2.0;
v_color4f *= u_color4f;
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos2d, 0.0, 1.0);
}

View File

@ -1,31 +1,31 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN(vec2, v_texCoord2f)
EAGLER_IN(vec4, v_color4f)
EAGLER_FRAG_OUT()
uniform sampler2D u_inputTexture;
void main() {
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f;
if(EAGLER_FRAG_COLOR.a < 0.004) {
discard;
}
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN(vec2, v_texCoord2f)
EAGLER_IN(vec4, v_color4f)
EAGLER_FRAG_OUT()
uniform sampler2D u_inputTexture;
void main() {
EAGLER_FRAG_COLOR = EAGLER_TEXTURE_2D(u_inputTexture, v_texCoord2f) * v_color4f;
if(EAGLER_FRAG_COLOR.a < 0.004) {
discard;
}
}

View File

@ -1,55 +1,55 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_VSH_LAYOUT_BEGIN()
EAGLER_IN(0, vec2, a_position2f)
EAGLER_IN(1, vec3, p_position3f)
EAGLER_IN(2, vec2, p_texCoords2i)
EAGLER_IN(3, vec2, p_lightMap2f)
EAGLER_IN(4, vec2, p_particleSize_texCoordsSize_2i)
EAGLER_IN(5, vec4, p_color4f)
EAGLER_VSH_LAYOUT_END()
EAGLER_OUT(vec2, v_texCoord2f)
EAGLER_OUT(vec4, v_color4f)
uniform mat4 u_matrixTransform;
uniform vec3 u_texCoordSize2f_particleSize1f;
uniform vec3 u_transformParam_1_2_5_f;
uniform vec2 u_transformParam_3_4_f;
uniform vec4 u_color4f;
uniform sampler2D u_lightmapTexture;
void main() {
v_color4f = u_color4f * p_color4f.bgra * EAGLER_TEXTURE_2D(u_lightmapTexture, p_lightMap2f);
vec2 tex2f = a_position2f * 0.5 + 0.5;
tex2f.y = 1.0 - tex2f.y;
tex2f = p_texCoords2i + tex2f * p_particleSize_texCoordsSize_2i.y;
v_texCoord2f = tex2f * u_texCoordSize2f_particleSize1f.xy;
float particleSize = u_texCoordSize2f_particleSize1f.z * p_particleSize_texCoordsSize_2i.x;
vec3 pos3f = p_position3f;
vec2 spos2f = a_position2f * particleSize;
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
pos3f.zx += u_transformParam_3_4_f * spos2f;
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos3f, 1.0);
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_VSH_LAYOUT_BEGIN()
EAGLER_IN(0, vec2, a_position2f)
EAGLER_IN(1, vec3, p_position3f)
EAGLER_IN(2, vec2, p_texCoords2i)
EAGLER_IN(3, vec2, p_lightMap2f)
EAGLER_IN(4, vec2, p_particleSize_texCoordsSize_2i)
EAGLER_IN(5, vec4, p_color4f)
EAGLER_VSH_LAYOUT_END()
EAGLER_OUT(vec2, v_texCoord2f)
EAGLER_OUT(vec4, v_color4f)
uniform mat4 u_matrixTransform;
uniform vec3 u_texCoordSize2f_particleSize1f;
uniform vec3 u_transformParam_1_2_5_f;
uniform vec2 u_transformParam_3_4_f;
uniform vec4 u_color4f;
uniform sampler2D u_lightmapTexture;
void main() {
v_color4f = u_color4f * p_color4f.bgra * EAGLER_TEXTURE_2D(u_lightmapTexture, p_lightMap2f);
vec2 tex2f = a_position2f * 0.5 + 0.5;
tex2f.y = 1.0 - tex2f.y;
tex2f = p_texCoords2i + tex2f * p_particleSize_texCoordsSize_2i.y;
v_texCoord2f = tex2f * u_texCoordSize2f_particleSize1f.xy;
float particleSize = u_texCoordSize2f_particleSize1f.z * p_particleSize_texCoordsSize_2i.x;
vec3 pos3f = p_position3f;
vec2 spos2f = a_position2f * particleSize;
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
pos3f.zx += u_transformParam_3_4_f * spos2f;
EAGLER_VERT_POSITION = u_matrixTransform * vec4(pos3f, 1.0);
}

View File

@ -1,199 +1,199 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
EAGLER_IN(vec4, v_position4f)
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
EAGLER_IN(vec2, v_texture2f)
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
EAGLER_IN(vec4, v_color4f)
#endif
#ifdef COMPILE_NORMAL_ATTRIB
EAGLER_IN(vec3, v_normal3f)
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
EAGLER_IN(vec2, v_lightmap2f)
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#if !defined(COMPILE_TEXTURE_ATTRIB) && !defined(COMPILE_ENABLE_TEX_GEN)
uniform vec2 u_textureCoords01;
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
uniform sampler2D u_samplerLightmap;
#ifndef COMPILE_LIGHTMAP_ATTRIB
uniform vec2 u_textureCoords02;
#endif
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
uniform int u_lightsEnabled1i;
uniform vec4 u_lightsDirections4fv[4];
uniform vec3 u_lightsAmbient3f;
#ifndef COMPILE_NORMAL_ATTRIB
uniform vec3 u_uniformNormal3f;
#endif
#endif
#ifdef COMPILE_ENABLE_FOG
uniform vec4 u_fogParameters4f;
uniform vec4 u_fogColor4f;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
EAGLER_IN(vec3, v_objectPosition3f)
uniform ivec4 u_texGenPlane4i;
uniform vec4 u_texGenS4f;
uniform vec4 u_texGenT4f;
uniform vec4 u_texGenR4f;
uniform vec4 u_texGenQ4f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
EAGLER_FRAG_OUT()
void main() {
#ifdef COMPILE_COLOR_ATTRIB
vec4 color = v_color4f * u_color4f;
#else
vec4 color = u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
vec4 texGenVector;
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
#ifdef EAGLER_HAS_GLES_300
texGenVector.xyz = mat4x3(
u_textureMat4f01[0].xyw,
u_textureMat4f01[1].xyw,
u_textureMat4f01[2].xyw,
u_textureMat4f01[3].xyw
) * texGenVector;
texGenVector.xy /= texGenVector.z;
#else
texGenVector = u_textureMat4f01 * texGenVector;
texGenVector.xy /= texGenVector.w;
#endif
color *= EAGLER_TEXTURE_2D(u_samplerTexture, texGenVector.xy);
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#else
#ifdef COMPILE_ENABLE_TEXTURE2D
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
// d3d11 doesn't support GL_NEAREST upscaling with anisotropic
// filtering enabled, so it needs this stupid fix to 'work'
vec2 uv = floor(v_texture2f * u_textureAnisotropicFix) + 0.5;
color *= EAGLER_TEXTURE_2D(u_samplerTexture, uv / u_textureAnisotropicFix);
#else
color *= EAGLER_TEXTURE_2D(u_samplerTexture, v_texture2f);
#endif
#else
color *= EAGLER_TEXTURE_2D(u_samplerTexture, u_textureCoords01);
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, v_lightmap2f);
#else
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, u_textureCoords02);
#endif
#endif
#ifdef COMPILE_BLEND_ADD
color = color * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
#ifdef COMPILE_NORMAL_ATTRIB
vec3 normal = normalize(v_normal3f);
#else
vec3 normal = u_uniformNormal3f;
#endif
float diffuse = 0.0;
vec4 light;
#ifdef EAGLER_HAS_GLES_300
for(int i = 0; i < u_lightsEnabled1i; ++i) {
#else
for(int i = 0; i < 4; ++i) {
#endif
light = u_lightsDirections4fv[i];
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
#ifndef EAGLER_HAS_GLES_300
if(i + 1 >= u_lightsEnabled1i) {
break;
}
#endif
}
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0);
#endif
#ifdef COMPILE_ENABLE_FOG
vec3 fogPos = v_position4f.xyz / v_position4f.w;
float dist = length(fogPos);
float fogDensity = u_fogParameters4f.y;
float fogStart = u_fogParameters4f.z;
float fogEnd = u_fogParameters4f.w;
float f = u_fogParameters4f.x > 0.0 ? 1.0 - exp(-fogDensity * dist) :
(dist - fogStart) / (fogEnd - fogStart);
color.rgb = mix(color.rgb, u_fogColor4f.rgb, clamp(f, 0.0, 1.0) * u_fogColor4f.a);
#endif
EAGLER_FRAG_COLOR = color;
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
EAGLER_IN(vec4, v_position4f)
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
EAGLER_IN(vec2, v_texture2f)
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
EAGLER_IN(vec4, v_color4f)
#endif
#ifdef COMPILE_NORMAL_ATTRIB
EAGLER_IN(vec3, v_normal3f)
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
EAGLER_IN(vec2, v_lightmap2f)
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#if !defined(COMPILE_TEXTURE_ATTRIB) && !defined(COMPILE_ENABLE_TEX_GEN)
uniform vec2 u_textureCoords01;
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
uniform sampler2D u_samplerLightmap;
#ifndef COMPILE_LIGHTMAP_ATTRIB
uniform vec2 u_textureCoords02;
#endif
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
uniform int u_lightsEnabled1i;
uniform vec4 u_lightsDirections4fv[4];
uniform vec3 u_lightsAmbient3f;
#ifndef COMPILE_NORMAL_ATTRIB
uniform vec3 u_uniformNormal3f;
#endif
#endif
#ifdef COMPILE_ENABLE_FOG
uniform vec4 u_fogParameters4f;
uniform vec4 u_fogColor4f;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
EAGLER_IN(vec3, v_objectPosition3f)
uniform ivec4 u_texGenPlane4i;
uniform vec4 u_texGenS4f;
uniform vec4 u_texGenT4f;
uniform vec4 u_texGenR4f;
uniform vec4 u_texGenQ4f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
EAGLER_FRAG_OUT()
void main() {
#ifdef COMPILE_COLOR_ATTRIB
vec4 color = v_color4f * u_color4f;
#else
vec4 color = u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
vec4 texGenVector;
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
#ifdef EAGLER_HAS_GLES_300
texGenVector.xyz = mat4x3(
u_textureMat4f01[0].xyw,
u_textureMat4f01[1].xyw,
u_textureMat4f01[2].xyw,
u_textureMat4f01[3].xyw
) * texGenVector;
texGenVector.xy /= texGenVector.z;
#else
texGenVector = u_textureMat4f01 * texGenVector;
texGenVector.xy /= texGenVector.w;
#endif
color *= EAGLER_TEXTURE_2D(u_samplerTexture, texGenVector.xy);
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#else
#ifdef COMPILE_ENABLE_TEXTURE2D
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
// d3d11 doesn't support GL_NEAREST upscaling with anisotropic
// filtering enabled, so it needs this stupid fix to 'work'
vec2 uv = floor(v_texture2f * u_textureAnisotropicFix) + 0.5;
color *= EAGLER_TEXTURE_2D(u_samplerTexture, uv / u_textureAnisotropicFix);
#else
color *= EAGLER_TEXTURE_2D(u_samplerTexture, v_texture2f);
#endif
#else
color *= EAGLER_TEXTURE_2D(u_samplerTexture, u_textureCoords01);
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, v_lightmap2f);
#else
color *= EAGLER_TEXTURE_2D(u_samplerLightmap, u_textureCoords02);
#endif
#endif
#ifdef COMPILE_BLEND_ADD
color = color * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#endif
#ifdef COMPILE_ENABLE_MC_LIGHTING
#ifdef COMPILE_NORMAL_ATTRIB
vec3 normal = normalize(v_normal3f);
#else
vec3 normal = u_uniformNormal3f;
#endif
float diffuse = 0.0;
vec4 light;
#ifdef EAGLER_HAS_GLES_300
for(int i = 0; i < u_lightsEnabled1i; ++i) {
#else
for(int i = 0; i < 4; ++i) {
#endif
light = u_lightsDirections4fv[i];
diffuse += max(dot(light.xyz, normal), 0.0) * light.w;
#ifndef EAGLER_HAS_GLES_300
if(i + 1 >= u_lightsEnabled1i) {
break;
}
#endif
}
color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0);
#endif
#ifdef COMPILE_ENABLE_FOG
vec3 fogPos = v_position4f.xyz / v_position4f.w;
float dist = length(fogPos);
float fogDensity = u_fogParameters4f.y;
float fogStart = u_fogParameters4f.z;
float fogEnd = u_fogParameters4f.w;
float f = u_fogParameters4f.x > 0.0 ? 1.0 - exp(-fogDensity * dist) :
(dist - fogStart) / (fogEnd - fogStart);
color.rgb = mix(color.rgb, u_fogColor4f.rgb, clamp(f, 0.0, 1.0) * u_fogColor4f.a);
#endif
EAGLER_FRAG_COLOR = color;
}

View File

@ -1,99 +1,99 @@
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN_AUTO(vec3, a_position3f)
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
#define _COMPILE_VARYING_POSITION
#endif
#ifdef _COMPILE_VARYING_POSITION
EAGLER_OUT(vec4, v_position4f)
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
EAGLER_OUT(vec3, v_objectPosition3f)
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
EAGLER_IN_AUTO(vec2, a_texture2f)
EAGLER_OUT(vec2, v_texture2f)
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
EAGLER_IN_AUTO(vec4, a_color4f)
EAGLER_OUT(vec4, v_color4f)
#endif
#ifdef COMPILE_NORMAL_ATTRIB
EAGLER_IN_AUTO(vec4, a_normal4f)
EAGLER_OUT(vec3, v_normal3f)
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
EAGLER_IN_AUTO(vec2, a_lightmap2f)
EAGLER_OUT(vec2, v_lightmap2f)
uniform mat4 u_textureMat4f02;
#endif
#ifdef _COMPILE_VARYING_POSITION
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#else
uniform mat4 u_modelviewProjMat4f;
#ifdef COMPILE_NORMAL_ATTRIB
uniform mat4 u_modelviewMat4f;
#endif
#endif
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_ENABLE_TEX_GEN
v_objectPosition3f = a_position3f;
#endif
#ifdef _COMPILE_VARYING_POSITION
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
#ifdef _COMPILE_VARYING_POSITION
EAGLER_VERT_POSITION = u_projectionMat4f * v_position4f;
#else
EAGLER_VERT_POSITION = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
#endif
}
#line 2
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
EAGLER_IN_AUTO(vec3, a_position3f)
#if defined(COMPILE_ENABLE_TEX_GEN) || defined(COMPILE_ENABLE_FOG)
#define _COMPILE_VARYING_POSITION
#endif
#ifdef _COMPILE_VARYING_POSITION
EAGLER_OUT(vec4, v_position4f)
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
EAGLER_OUT(vec3, v_objectPosition3f)
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
EAGLER_IN_AUTO(vec2, a_texture2f)
EAGLER_OUT(vec2, v_texture2f)
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
EAGLER_IN_AUTO(vec4, a_color4f)
EAGLER_OUT(vec4, v_color4f)
#endif
#ifdef COMPILE_NORMAL_ATTRIB
EAGLER_IN_AUTO(vec4, a_normal4f)
EAGLER_OUT(vec3, v_normal3f)
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
EAGLER_IN_AUTO(vec2, a_lightmap2f)
EAGLER_OUT(vec2, v_lightmap2f)
uniform mat4 u_textureMat4f02;
#endif
#ifdef _COMPILE_VARYING_POSITION
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#else
uniform mat4 u_modelviewProjMat4f;
#ifdef COMPILE_NORMAL_ATTRIB
uniform mat4 u_modelviewMat4f;
#endif
#endif
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_ENABLE_TEX_GEN
v_objectPosition3f = a_position3f;
#endif
#ifdef _COMPILE_VARYING_POSITION
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
#ifdef _COMPILE_VARYING_POSITION
EAGLER_VERT_POSITION = u_projectionMat4f * v_position4f;
#else
EAGLER_VERT_POSITION = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
#endif
}

View File

@ -1,72 +1,72 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec3 p_position3f;
layout(location = 2) in vec2 p_texCoords2i;
layout(location = 3) in vec2 p_lightMap2f;
layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i;
layout(location = 5) in vec4 p_color4f;
out vec2 v_texCoord2f;
out vec4 v_color4f;
out vec2 v_lightmap2f;
#ifdef COMPILE_FORWARD_VSH
out vec4 v_position4f;
uniform mat4 u_modelViewMatrix4f;
uniform mat4 u_projectionMatrix4f;
#endif
#ifdef COMPILE_GBUFFER_VSH
uniform mat4 u_matrixTransform;
#endif
uniform vec3 u_texCoordSize2f_particleSize1f;
uniform vec3 u_transformParam_1_2_5_f;
uniform vec2 u_transformParam_3_4_f;
void main() {
v_color4f = p_color4f.bgra;
v_lightmap2f = p_lightMap2f;
vec2 tex2f = a_position2f * 0.5 + 0.5;
tex2f.y = 1.0 - tex2f.y;
tex2f = p_texCoords2i + tex2f * p_particleSize_texCoordsSize_2i.y;
v_texCoord2f = tex2f * u_texCoordSize2f_particleSize1f.xy;
float particleSize = u_texCoordSize2f_particleSize1f.z * p_particleSize_texCoordsSize_2i.x;
vec3 pos3f = p_position3f;
vec2 spos2f = a_position2f * particleSize;
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
pos3f.zx += u_transformParam_3_4_f * spos2f;
#ifdef COMPILE_GBUFFER_VSH
gl_Position = u_matrixTransform * vec4(pos3f, 1.0);
#endif
#ifdef COMPILE_FORWARD_VSH
v_position4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
gl_Position = u_projectionMatrix4f * v_position4f;
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec3 p_position3f;
layout(location = 2) in vec2 p_texCoords2i;
layout(location = 3) in vec2 p_lightMap2f;
layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i;
layout(location = 5) in vec4 p_color4f;
out vec2 v_texCoord2f;
out vec4 v_color4f;
out vec2 v_lightmap2f;
#ifdef COMPILE_FORWARD_VSH
out vec4 v_position4f;
uniform mat4 u_modelViewMatrix4f;
uniform mat4 u_projectionMatrix4f;
#endif
#ifdef COMPILE_GBUFFER_VSH
uniform mat4 u_matrixTransform;
#endif
uniform vec3 u_texCoordSize2f_particleSize1f;
uniform vec3 u_transformParam_1_2_5_f;
uniform vec2 u_transformParam_3_4_f;
void main() {
v_color4f = p_color4f.bgra;
v_lightmap2f = p_lightMap2f;
vec2 tex2f = a_position2f * 0.5 + 0.5;
tex2f.y = 1.0 - tex2f.y;
tex2f = p_texCoords2i + tex2f * p_particleSize_texCoordsSize_2i.y;
v_texCoord2f = tex2f * u_texCoordSize2f_particleSize1f.xy;
float particleSize = u_texCoordSize2f_particleSize1f.z * p_particleSize_texCoordsSize_2i.x;
vec3 pos3f = p_position3f;
vec2 spos2f = a_position2f * particleSize;
pos3f += u_transformParam_1_2_5_f * spos2f.xyy;
pos3f.zx += u_transformParam_3_4_f * spos2f;
#ifdef COMPILE_GBUFFER_VSH
gl_Position = u_matrixTransform * vec4(pos3f, 1.0);
#endif
#ifdef COMPILE_FORWARD_VSH
v_position4f = u_modelViewMatrix4f * vec4(pos3f, 1.0);
gl_Position = u_projectionMatrix4f * v_position4f;
#endif
}

View File

@ -1,235 +1,235 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
precision highp sampler2DShadow;
in vec4 v_position4f;
in vec2 v_texCoord2f;
in vec4 v_color4f;
in vec2 v_lightmap2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_diffuseTexture;
uniform vec2 u_textureYScale2f;
uniform mat4 u_inverseViewMatrix4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
uniform sampler2D u_samplerNormalMaterial;
uniform sampler2D u_metalsLUT;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
uniform sampler2D u_irradianceMap;
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
lightmapCoords2f = v_lightmap2f;
normalVector3f = normalize(u_inverseViewMatrix4f[2].xyz);
// ========= CALCULATE DIFFUSE COLOR ========== //
diffuseColor4f = texture(u_diffuseTexture, v_texCoord2f) * v_color4f;
// ============= ALPHA TEST ============== //
if(diffuseColor4f.a < 0.004) discard;
// ========== RESOLVE MATERIALS =========== //
materialData3f = texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb;
vec3 metalN, metalK;
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
vec3 normalWrap3f = normalVector3f * (dot(-worldDirection4f.xyz, normalVector3f) < 0.0 ? -1.0 : 1.0);
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalWrap3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== IRRADIANCE MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(u_sunDirection4f.w, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = dlightDir3f * (dot(dlightDir3f, normalVector3f) < 0.0 ? 1.0 : -1.0);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
skyLight *= u_blockSkySunDynamicLightFac4f.y;
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
diffuseColor4f.rgb += lightColor3f;
output4f = vec4(diffuseColor4f.rgb * diffuseColor4f.a, diffuseColor4f.a);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
precision highp sampler2DShadow;
in vec4 v_position4f;
in vec2 v_texCoord2f;
in vec4 v_color4f;
in vec2 v_lightmap2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_diffuseTexture;
uniform vec2 u_textureYScale2f;
uniform mat4 u_inverseViewMatrix4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
uniform sampler2D u_samplerNormalMaterial;
uniform sampler2D u_metalsLUT;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
uniform sampler2D u_irradianceMap;
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
lightmapCoords2f = v_lightmap2f;
normalVector3f = normalize(u_inverseViewMatrix4f[2].xyz);
// ========= CALCULATE DIFFUSE COLOR ========== //
diffuseColor4f = texture(u_diffuseTexture, v_texCoord2f) * v_color4f;
// ============= ALPHA TEST ============== //
if(diffuseColor4f.a < 0.004) discard;
// ========== RESOLVE MATERIALS =========== //
materialData3f = texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb;
vec3 metalN, metalK;
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
vec3 normalWrap3f = normalVector3f * (dot(-worldDirection4f.xyz, normalVector3f) < 0.0 ? -1.0 : 1.0);
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalWrap3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== IRRADIANCE MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(u_sunDirection4f.w, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = dlightDir3f * (dot(dlightDir3f, normalVector3f) < 0.0 ? 1.0 : -1.0);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
skyLight *= u_blockSkySunDynamicLightFac4f.y;
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
diffuseColor4f.rgb += lightColor3f;
output4f = vec4(diffuseColor4f.rgb * diffuseColor4f.a, diffuseColor4f.a);
}

View File

@ -1,44 +1,44 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
in vec2 v_texCoord2f;
in vec4 v_color4f;
in vec2 v_lightmap2f;
layout(location = 0) out vec4 gbufferColor4f;
layout(location = 1) out vec4 gbufferNormal4f;
layout(location = 2) out vec4 gbufferMaterial4f;
uniform sampler2D u_diffuseTexture;
uniform sampler2D u_samplerNormalMaterial;
uniform vec2 u_textureYScale2f;
void main() {
vec4 diffuseRGBA = texture(u_diffuseTexture, v_texCoord2f) * v_color4f;
if(diffuseRGBA.a < 0.004) {
discard;
}
gbufferColor4f = vec4(diffuseRGBA.rgb, v_lightmap2f.r);
gbufferNormal4f = vec4(0.5, 0.5, 1.0, v_lightmap2f.g);
gbufferMaterial4f = vec4(texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
in vec2 v_texCoord2f;
in vec4 v_color4f;
in vec2 v_lightmap2f;
layout(location = 0) out vec4 gbufferColor4f;
layout(location = 1) out vec4 gbufferNormal4f;
layout(location = 2) out vec4 gbufferMaterial4f;
uniform sampler2D u_diffuseTexture;
uniform sampler2D u_samplerNormalMaterial;
uniform vec2 u_textureYScale2f;
void main() {
vec4 diffuseRGBA = texture(u_diffuseTexture, v_texCoord2f) * v_color4f;
if(diffuseRGBA.a < 0.004) {
discard;
}
gbufferColor4f = vec4(diffuseRGBA.rgb, v_lightmap2f.r);
gbufferNormal4f = vec4(0.5, 0.5, 1.0, v_lightmap2f.g);
gbufferMaterial4f = vec4(texture(u_samplerNormalMaterial, vec2(v_texCoord2f.x, v_texCoord2f.y * u_textureYScale2f.x + u_textureYScale2f.y)).rgb, 1.0);
}

View File

@ -1,57 +1,57 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float output1f;
uniform sampler2D u_noiseTexture;
uniform float u_textureSlice1f;
uniform vec2 u_textureSize2f;
uniform mat4x3 u_sampleOffsetMatrix4f;
uniform vec3 u_cloudMovement3f;
#define GET_CLOUDS(pos3f, accum, factor, tmp3f)\
tmp3f.z = floor(pos3f.z);\
tmp3f.xy = pos3f.xy * 0.015625 + (tmp3f.z * 0.265625);\
pos3f.x = textureLod(u_noiseTexture, tmp3f.xy, 0.0).x;\
pos3f.y = textureLod(u_noiseTexture, tmp3f.xy + 0.265625, 0.0).x;\
accum += mix(pos3f.x, pos3f.y, pos3f.z - tmp3f.z) * factor;
void main() {
vec3 p = vec3(v_position2f.x, u_textureSlice1f, v_position2f.y) * vec3(u_textureSize2f.x, 1.0, u_textureSize2f.y);
p = u_sampleOffsetMatrix4f * vec4(p, 1.0);
vec3 sampleCoord3f = p + u_cloudMovement3f;
float noise = 0.0;
vec3 in3f = sampleCoord3f;
GET_CLOUDS(in3f, noise, 0.5, p)
in3f = sampleCoord3f * 2.0 + u_cloudMovement3f;
GET_CLOUDS(in3f, noise, 0.25, p)
in3f = sampleCoord3f * 7.0 - u_cloudMovement3f;
GET_CLOUDS(in3f, noise, 0.125, p)
in3f = (sampleCoord3f + u_cloudMovement3f) * 16.0;
GET_CLOUDS(in3f, noise, 0.0625, p)
output1f = noise;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float output1f;
uniform sampler2D u_noiseTexture;
uniform float u_textureSlice1f;
uniform vec2 u_textureSize2f;
uniform mat4x3 u_sampleOffsetMatrix4f;
uniform vec3 u_cloudMovement3f;
#define GET_CLOUDS(pos3f, accum, factor, tmp3f)\
tmp3f.z = floor(pos3f.z);\
tmp3f.xy = pos3f.xy * 0.015625 + (tmp3f.z * 0.265625);\
pos3f.x = textureLod(u_noiseTexture, tmp3f.xy, 0.0).x;\
pos3f.y = textureLod(u_noiseTexture, tmp3f.xy + 0.265625, 0.0).x;\
accum += mix(pos3f.x, pos3f.y, pos3f.z - tmp3f.z) * factor;
void main() {
vec3 p = vec3(v_position2f.x, u_textureSlice1f, v_position2f.y) * vec3(u_textureSize2f.x, 1.0, u_textureSize2f.y);
p = u_sampleOffsetMatrix4f * vec4(p, 1.0);
vec3 sampleCoord3f = p + u_cloudMovement3f;
float noise = 0.0;
vec3 in3f = sampleCoord3f;
GET_CLOUDS(in3f, noise, 0.5, p)
in3f = sampleCoord3f * 2.0 + u_cloudMovement3f;
GET_CLOUDS(in3f, noise, 0.25, p)
in3f = sampleCoord3f * 7.0 - u_cloudMovement3f;
GET_CLOUDS(in3f, noise, 0.125, p)
in3f = (sampleCoord3f + u_cloudMovement3f) * 16.0;
GET_CLOUDS(in3f, noise, 0.0625, p)
output1f = noise;
}

View File

@ -1,94 +1,94 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
precision highp sampler3D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform float u_rainStrength1f;
uniform vec4 u_densityModifier4f;
uniform float u_sampleStep1f;
uniform float u_cloudTimer1f;
uniform vec3 u_cloudOffset3f;
uniform vec3 u_sunDirection3f;
uniform vec3 u_sunColor3f;
uniform sampler3D u_noiseTexture3D;
uniform sampler2D u_skyIrradianceMap;
#define GET_CLOUDS(pos3f, out1f)\
if(pos3f == clamp(pos3f, vec3(0.0), vec3(1.0))) {\
out1f = length(pos3f - clamp(pos3f, vec3(0.05), vec3(0.95)));\
out1f = smoothstep(0.0, 1.0, max(1.0 - out1f * 15.0, 0.0));\
out1f *= textureLod(u_noiseTexture3D, pos3f.xzy, 0.0).r;\
out1f += u_densityModifier4f.w;\
out1f = max(out1f * out1f * u_densityModifier4f.x + out1f * u_densityModifier4f.y + u_densityModifier4f.z, 0.0);\
}else out1f = 0.0;
void main() {
vec2 latLong = v_position2f * 2.0 - 1.0;
float latLongLen = dot(latLong, latLong);
if(latLongLen > 1.025) {
output4f = vec4(0.0);
return;
}
float mag2 = 2.0 / (latLongLen + 1.0);
vec3 dir;
dir.y = mag2 - 1.0;
dir.xz = latLong * mag2;
vec3 samplePos = vec3(0.0, -4.5 + u_cloudOffset3f.y * 0.05, 0.0) + dir * u_sampleStep1f * 0.2;
samplePos = samplePos * vec3(0.05, 0.1, 0.05) + vec3(0.5, 0.0, 0.5);
float sample0, sample1;
GET_CLOUDS(samplePos, sample0)
if(sample0 < 0.002) {
output4f = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
output4f.a = exp2(-sample0 * 5.0);
vec3 sunDirection = u_sunDirection3f * vec3(1.0, 2.0, 1.0) * 0.025;
float sunVisibility = sample0;
GET_CLOUDS((samplePos + sunDirection), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 2.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 3.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 4.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 5.0), sample1)
sunVisibility += sample1;
sunVisibility = exp2(-sunVisibility * 50.0);
sunVisibility *= 1.0 - exp2(-sample0 * 1.2);
vec3 sky = textureLod(u_skyIrradianceMap, v_position2f * vec2(1.0, 0.5) + vec2(0.0, 0.5), 0.0).rgb * 0.05;
float intergal = exp2(-7.33 * sample0) * -9.0 + 9.0;
output4f.rgb = (u_sunColor3f * sunVisibility + sky) * intergal;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
precision highp sampler3D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform float u_rainStrength1f;
uniform vec4 u_densityModifier4f;
uniform float u_sampleStep1f;
uniform float u_cloudTimer1f;
uniform vec3 u_cloudOffset3f;
uniform vec3 u_sunDirection3f;
uniform vec3 u_sunColor3f;
uniform sampler3D u_noiseTexture3D;
uniform sampler2D u_skyIrradianceMap;
#define GET_CLOUDS(pos3f, out1f)\
if(pos3f == clamp(pos3f, vec3(0.0), vec3(1.0))) {\
out1f = length(pos3f - clamp(pos3f, vec3(0.05), vec3(0.95)));\
out1f = smoothstep(0.0, 1.0, max(1.0 - out1f * 15.0, 0.0));\
out1f *= textureLod(u_noiseTexture3D, pos3f.xzy, 0.0).r;\
out1f += u_densityModifier4f.w;\
out1f = max(out1f * out1f * u_densityModifier4f.x + out1f * u_densityModifier4f.y + u_densityModifier4f.z, 0.0);\
}else out1f = 0.0;
void main() {
vec2 latLong = v_position2f * 2.0 - 1.0;
float latLongLen = dot(latLong, latLong);
if(latLongLen > 1.025) {
output4f = vec4(0.0);
return;
}
float mag2 = 2.0 / (latLongLen + 1.0);
vec3 dir;
dir.y = mag2 - 1.0;
dir.xz = latLong * mag2;
vec3 samplePos = vec3(0.0, -4.5 + u_cloudOffset3f.y * 0.05, 0.0) + dir * u_sampleStep1f * 0.2;
samplePos = samplePos * vec3(0.05, 0.1, 0.05) + vec3(0.5, 0.0, 0.5);
float sample0, sample1;
GET_CLOUDS(samplePos, sample0)
if(sample0 < 0.002) {
output4f = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
output4f.a = exp2(-sample0 * 5.0);
vec3 sunDirection = u_sunDirection3f * vec3(1.0, 2.0, 1.0) * 0.025;
float sunVisibility = sample0;
GET_CLOUDS((samplePos + sunDirection), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 2.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 3.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 4.0), sample1)
sunVisibility += sample1;
GET_CLOUDS((samplePos + sunDirection * 5.0), sample1)
sunVisibility += sample1;
sunVisibility = exp2(-sunVisibility * 50.0);
sunVisibility *= 1.0 - exp2(-sample0 * 1.2);
vec3 sky = textureLod(u_skyIrradianceMap, v_position2f * vec2(1.0, 0.5) + vec2(0.0, 0.5), 0.0).rgb * 0.05;
float intergal = exp2(-7.33 * sample0) * -9.0 + 9.0;
output4f.rgb = (u_sunColor3f * sunVisibility + sky) * intergal;
}

View File

@ -1,35 +1,35 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler3D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler3D u_inputTexture;
uniform float u_textureLevel1f;
uniform float u_textureLod1f;
uniform vec2 u_sampleWeights2f;
void main() {
float objsample = textureLod(u_inputTexture, vec3(v_position2f, u_textureLevel1f), u_textureLod1f).r;
output4f = vec4(objsample * u_sampleWeights2f.x, 0.0, 0.0, objsample * u_sampleWeights2f.y + 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler3D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler3D u_inputTexture;
uniform float u_textureLevel1f;
uniform float u_textureLod1f;
uniform vec2 u_sampleWeights2f;
void main() {
float objsample = textureLod(u_inputTexture, vec3(v_position2f, u_textureLevel1f), u_textureLod1f).r;
output4f = vec4(objsample * u_sampleWeights2f.x, 0.0, 0.0, objsample * u_sampleWeights2f.y + 1.0);
}

View File

@ -1,32 +1,32 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
uniform mat3x2 u_transformMatrix3x2f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
gl_Position = vec4(u_transformMatrix3x2f * vec3(a_position2f, 1.0), 0.0, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision mediump sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
uniform mat3x2 u_transformMatrix3x2f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
gl_Position = vec4(u_transformMatrix3x2f * vec3(a_position2f, 1.0), 0.0, 1.0);
}

View File

@ -1,50 +1,50 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out float occlusionOut1f;
uniform mat4x3 u_sampleMatrix4x3f;
uniform sampler2D u_cloudsTexture;
#define SAMPLE_DENSITY(v, a_, f)\
f = u_sampleMatrix4x3f * v;\
f.xy = (f.xz / (f.y + 1.0)) * 0.975 * 0.5 + 0.5;\
if(f.xy == clamp(f.xy, vec2(0.001), vec2(0.999)))\
a_ += textureLod(u_cloudsTexture, f.xy, 0.0).a * 0.125;\
else\
a_ += 0.125;
void main() {
vec3 f;
float accum = 0.0;
SAMPLE_DENSITY(vec4(0.000, 0.000, 1.000, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.844, 0.521, 0.126, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.187, 0.979, 0.087, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.402, -0.904, 0.145, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.944, -0.316, 0.098, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.759, 0.427, 0.491, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.955, -0.285, 0.076, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.322, -0.664, 0.675, 1.0), accum, f)
occlusionOut1f = clamp(sqrt(accum) * 3.0 - 1.0, 0.0, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out float occlusionOut1f;
uniform mat4x3 u_sampleMatrix4x3f;
uniform sampler2D u_cloudsTexture;
#define SAMPLE_DENSITY(v, a_, f)\
f = u_sampleMatrix4x3f * v;\
f.xy = (f.xz / (f.y + 1.0)) * 0.975 * 0.5 + 0.5;\
if(f.xy == clamp(f.xy, vec2(0.001), vec2(0.999)))\
a_ += textureLod(u_cloudsTexture, f.xy, 0.0).a * 0.125;\
else\
a_ += 0.125;
void main() {
vec3 f;
float accum = 0.0;
SAMPLE_DENSITY(vec4(0.000, 0.000, 1.000, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.844, 0.521, 0.126, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.187, 0.979, 0.087, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.402, -0.904, 0.145, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.944, -0.316, 0.098, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.759, 0.427, 0.491, 1.0), accum, f)
SAMPLE_DENSITY(vec4(0.955, -0.285, 0.076, 1.0), accum, f)
SAMPLE_DENSITY(vec4(-0.322, -0.664, 0.675, 1.0), accum, f)
occlusionOut1f = clamp(sqrt(accum) * 3.0 - 1.0, 0.0, 1.0);
}

View File

@ -1,174 +1,174 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform vec2 u_halfResolutionPixelAlignment2f;
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
uniform sampler2D u_ssaoTexture;
#endif
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
uniform sampler2D u_ssrReflectionTexture;
#endif
#ifdef COMPILE_ENV_MAP_REFLECTIONS
uniform sampler2D u_environmentMap;
#endif
uniform sampler2D u_irradianceMap;
uniform sampler2D u_brdfLUT;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseProjMatrix4f;
uniform mat4 u_inverseViewMatrix4f;
uniform vec3 u_sunDirection3f;
uniform float u_skyLightFactor1f;
#if defined(COMPILE_SCREEN_SPACE_REFLECTIONS) || defined(COMPILE_ENV_MAP_REFLECTIONS)
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#endif
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
void main() {
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec4 materialData4f;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
discard;
}
vec4 sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb * sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
normalVector3f.xyz = mat3(u_inverseViewMatrix4f) * normalVector3f.xyz;
normalVector3f.xyz = normalize(normalVector3f.xyz);
lightmapCoords2f.y = sampleVar4f.a;
materialData4f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0);
float shadow = 0.075;
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
vec4 ao = textureLod(u_ssaoTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
ao.g = ao.b > 0.0 ? ao.g : 1.0;
shadow = mix(shadow, shadow * ao.g, 0.9);
#endif
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(-u_sunDirection3f.y, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_skyLightFactor1f;
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0;
float emissive = materialData4f.b == 1.0 ? 0.0 : materialData4f.b;
vec3 specular = vec3(0.0);
#ifdef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
while((materialData4f.a >= 0.5 ? f : -1.0) == 0.0) {
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
worldPosition4f.xyz /= worldPosition4f.w;
float posDst = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(posDst > 25.0) {
break;
}
worldPosition4f = u_inverseViewMatrix4f * vec4(worldPosition4f.xyz, 0.0);
vec3 viewDir3f = normalize(worldPosition4f.xyz); // need confirmation this should be negative
vec3 reflectDir = reflect(viewDir3f, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, envMapSample4f.rgb, viewDir3f, normalVector3f, materialData4f.rgb);
specular *= 1.0 - sqrt(posDst) * 0.2;
}
break;
}
#endif
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
#ifndef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
if(f == 0.0) {
#else
if((materialData4f.a < 0.5 ? f : -1.0) == 0.0) {
#endif
vec4 ssrSample = textureLod(u_ssrReflectionTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
if(ssrSample.g > 0.0) {
ssrSample.g -= 0.005;
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
worldPosition4f = u_inverseViewMatrix4f * vec4(worldPosition4f.xyz / worldPosition4f.w, 0.0);
vec3 viewDir3f = normalize(worldPosition4f.xyz); // need confirmation this should be negative
specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, ssrSample.rgb, viewDir3f, normalVector3f.xyz, materialData4f.rgb);
}
}
#endif
output4f = vec4((diffuseColor3f.rgb * max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) + specular * 8.0) * shadow, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform vec2 u_halfResolutionPixelAlignment2f;
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
uniform sampler2D u_ssaoTexture;
#endif
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
uniform sampler2D u_ssrReflectionTexture;
#endif
#ifdef COMPILE_ENV_MAP_REFLECTIONS
uniform sampler2D u_environmentMap;
#endif
uniform sampler2D u_irradianceMap;
uniform sampler2D u_brdfLUT;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseProjMatrix4f;
uniform mat4 u_inverseViewMatrix4f;
uniform vec3 u_sunDirection3f;
uniform float u_skyLightFactor1f;
#if defined(COMPILE_SCREEN_SPACE_REFLECTIONS) || defined(COMPILE_ENV_MAP_REFLECTIONS)
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#endif
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
void main() {
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec4 materialData4f;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
discard;
}
vec4 sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb * sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
normalVector3f.xyz = mat3(u_inverseViewMatrix4f) * normalVector3f.xyz;
normalVector3f.xyz = normalize(normalVector3f.xyz);
lightmapCoords2f.y = sampleVar4f.a;
materialData4f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0);
float shadow = 0.075;
#ifdef COMPILE_GLOBAL_AMBIENT_OCCLUSION
vec4 ao = textureLod(u_ssaoTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
ao.g = ao.b > 0.0 ? ao.g : 1.0;
shadow = mix(shadow, shadow * ao.g, 0.9);
#endif
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(-u_sunDirection3f.y, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_skyLightFactor1f;
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0;
float emissive = materialData4f.b == 1.0 ? 0.0 : materialData4f.b;
vec3 specular = vec3(0.0);
#ifdef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
while((materialData4f.a >= 0.5 ? f : -1.0) == 0.0) {
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
worldPosition4f.xyz /= worldPosition4f.w;
float posDst = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(posDst > 25.0) {
break;
}
worldPosition4f = u_inverseViewMatrix4f * vec4(worldPosition4f.xyz, 0.0);
vec3 viewDir3f = normalize(worldPosition4f.xyz); // need confirmation this should be negative
vec3 reflectDir = reflect(viewDir3f, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, envMapSample4f.rgb, viewDir3f, normalVector3f, materialData4f.rgb);
specular *= 1.0 - sqrt(posDst) * 0.2;
}
break;
}
#endif
#ifdef COMPILE_SCREEN_SPACE_REFLECTIONS
#ifndef COMPILE_ENV_MAP_REFLECTIONS
float f = materialData4f.g < 0.06 ? 1.0 : 0.0;
f += materialData4f.r < 0.5 ? 1.0 : 0.0;
if(f == 0.0) {
#else
if((materialData4f.a < 0.5 ? f : -1.0) == 0.0) {
#endif
vec4 ssrSample = textureLod(u_ssrReflectionTexture, min(v_position2f * u_halfResolutionPixelAlignment2f, 1.0), 0.0);
if(ssrSample.g > 0.0) {
ssrSample.g -= 0.005;
vec4 worldPosition4f = vec4(v_position2f, depth, 1.0) * 2.0 - 1.0;
worldPosition4f = u_inverseProjMatrix4f * worldPosition4f;
worldPosition4f = u_inverseViewMatrix4f * vec4(worldPosition4f.xyz / worldPosition4f.w, 0.0);
vec3 viewDir3f = normalize(worldPosition4f.xyz); // need confirmation this should be negative
specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, ssrSample.rgb, viewDir3f, normalVector3f.xyz, materialData4f.rgb);
}
}
#endif
output4f = vec4((diffuseColor3f.rgb * max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) + specular * 8.0) * shadow, 1.0);
}

View File

@ -1,116 +1,116 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_STATE_WAVING_BLOCKS
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform vec3 u_wavingBlockOffset3f;
uniform vec4 u_wavingBlockParam4f;
#ifndef COMPILE_NORMAL_ATTRIB
uniform float u_blockConstant1f;
#endif
#define DO_COMPILE_STATE_WAVING_BLOCKS
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#endif
#EAGLER INCLUDE (2) "eagler:glsl/deferred/lib/waving_blocks.glsl"
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
out vec3 v_viewdir3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
float blockId = v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
vec4 pos = vec4(a_position3f, 1.0);
#ifdef DO_COMPILE_STATE_WAVING_BLOCKS
#ifndef COMPILE_NORMAL_ATTRIB
float blockId = u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
if(v_lightmap2f.y > 0.33) {
COMPUTE_WAVING_BLOCKS(pos, min(v_lightmap2f.y * 3.0 - 1.0, 1.0), 24.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
}else {
pos = u_modelviewMat4f * pos;
}
#else
COMPUTE_WAVING_BLOCKS(pos, 1.0, 32.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
#endif
#else
pos = u_modelviewMat4f * pos;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
v_viewdir3f = pos.xyz / pos.w;
#endif
gl_Position = u_projectionMat4f * pos;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_STATE_WAVING_BLOCKS
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform vec3 u_wavingBlockOffset3f;
uniform vec4 u_wavingBlockParam4f;
#ifndef COMPILE_NORMAL_ATTRIB
uniform float u_blockConstant1f;
#endif
#define DO_COMPILE_STATE_WAVING_BLOCKS
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#endif
#EAGLER INCLUDE (2) "eagler:glsl/deferred/lib/waving_blocks.glsl"
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
out vec3 v_viewdir3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
float blockId = v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
vec4 pos = vec4(a_position3f, 1.0);
#ifdef DO_COMPILE_STATE_WAVING_BLOCKS
#ifndef COMPILE_NORMAL_ATTRIB
float blockId = u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
if(v_lightmap2f.y > 0.33) {
COMPUTE_WAVING_BLOCKS(pos, min(v_lightmap2f.y * 3.0 - 1.0, 1.0), 24.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
}else {
pos = u_modelviewMat4f * pos;
}
#else
COMPUTE_WAVING_BLOCKS(pos, 1.0, 32.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
#endif
#else
pos = u_modelviewMat4f * pos;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
v_viewdir3f = pos.xyz / pos.w;
#endif
gl_Position = u_projectionMat4f * pos;
}

View File

@ -1,168 +1,168 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
uniform float u_useEnvMap1f;
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifndef COMPILE_LIGHTMAP_ATTRIB
uniform vec2 u_textureCoords02;
#endif
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
uniform sampler2D u_samplerNormalMaterial;
in vec3 v_viewdir3f;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#else
uniform vec3 u_materialConstants3f;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
vec2 duv1 = dFdx(uv);
vec2 duv2 = dFdy(uv);
vec3 dp2perp = cross(dp2, N);
vec3 dp1perp = cross(N, dp1);
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
float invmax = inversesqrt(max(dot(T,T), dot(B,B)));
return mat3(T * invmax, B * invmax, N);
}
#endif
layout(location = 0) out vec4 gbufferColor4f;
layout(location = 1) out vec4 gbufferNormal4f;
layout(location = 2) out vec4 gbufferMaterial4f;
void main() {
#ifdef COMPILE_COLOR_ATTRIB
vec4 color = v_color4f * u_color4f;
#else
vec4 color = u_color4f;
#endif
vec3 normal;
#ifdef COMPILE_NORMAL_ATTRIB
normal = normalize(v_normal3f);
#else
normal = u_uniformNormal3f;
#endif
#if defined(COMPILE_ENABLE_TEXTURE2D) || defined(COMPILE_NORMAL_MATERIAL_TEXTURE)
vec2 uv;
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uv = floor(uv * u_textureAnisotropicFix) + 0.5;
uv /= u_textureAnisotropicFix;
#else
uv = v_texture2f;
#endif
#else
uv = u_textureCoords01;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
color *= texture(u_samplerTexture, uv);
#endif
#endif
vec2 lightmap = vec2(0.0, 1.0);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmap = v_lightmap2f;
#else
lightmap = u_textureCoords02;
#endif
#endif
#ifdef COMPILE_BLEND_ADD
color = color * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
vec2 uv2 = vec2(1.0, 0.5) * uv;
vec2 normal2 = texture(u_samplerNormalMaterial, uv2).xy;
mat3 cf;
if(normal2.x + normal2.y > 0.0) {
normal2 *= 2.0;
normal2 -= 1.0;
cf = cotangent_frame(normal, normalize(v_viewdir3f), uv);
normal = cf * vec3(normal2, sqrt(1.0 - dot(normal2, normal2)));
}
uv2.y += 0.5;
vec3 material = texture(u_samplerNormalMaterial, uv2).rgb;
#else
vec3 material = u_materialConstants3f;
#endif
gbufferColor4f.rgb = color.rgb;
gbufferColor4f.a = lightmap.r;
gbufferNormal4f.rgb = normal * 0.5 + 0.5;
gbufferNormal4f.a = lightmap.g;
gbufferMaterial4f = vec4(material.rgb, u_useEnvMap1f);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
uniform float u_useEnvMap1f;
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifndef COMPILE_LIGHTMAP_ATTRIB
uniform vec2 u_textureCoords02;
#endif
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
uniform sampler2D u_samplerNormalMaterial;
in vec3 v_viewdir3f;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#else
uniform vec3 u_materialConstants3f;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
vec2 duv1 = dFdx(uv);
vec2 duv2 = dFdy(uv);
vec3 dp2perp = cross(dp2, N);
vec3 dp1perp = cross(N, dp1);
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
float invmax = inversesqrt(max(dot(T,T), dot(B,B)));
return mat3(T * invmax, B * invmax, N);
}
#endif
layout(location = 0) out vec4 gbufferColor4f;
layout(location = 1) out vec4 gbufferNormal4f;
layout(location = 2) out vec4 gbufferMaterial4f;
void main() {
#ifdef COMPILE_COLOR_ATTRIB
vec4 color = v_color4f * u_color4f;
#else
vec4 color = u_color4f;
#endif
vec3 normal;
#ifdef COMPILE_NORMAL_ATTRIB
normal = normalize(v_normal3f);
#else
normal = u_uniformNormal3f;
#endif
#if defined(COMPILE_ENABLE_TEXTURE2D) || defined(COMPILE_NORMAL_MATERIAL_TEXTURE)
vec2 uv;
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uv = floor(uv * u_textureAnisotropicFix) + 0.5;
uv /= u_textureAnisotropicFix;
#else
uv = v_texture2f;
#endif
#else
uv = u_textureCoords01;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
color *= texture(u_samplerTexture, uv);
#endif
#endif
vec2 lightmap = vec2(0.0, 1.0);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmap = v_lightmap2f;
#else
lightmap = u_textureCoords02;
#endif
#endif
#ifdef COMPILE_BLEND_ADD
color = color * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
vec2 uv2 = vec2(1.0, 0.5) * uv;
vec2 normal2 = texture(u_samplerNormalMaterial, uv2).xy;
mat3 cf;
if(normal2.x + normal2.y > 0.0) {
normal2 *= 2.0;
normal2 -= 1.0;
cf = cotangent_frame(normal, normalize(v_viewdir3f), uv);
normal = cf * vec3(normal2, sqrt(1.0 - dot(normal2, normal2)));
}
uv2.y += 0.5;
vec3 material = texture(u_samplerNormalMaterial, uv2).rgb;
#else
vec3 material = u_materialConstants3f;
#endif
gbufferColor4f.rgb = color.rgb;
gbufferColor4f.a = lightmap.r;
gbufferNormal4f.rgb = normal * 0.5 + 0.5;
gbufferNormal4f.a = lightmap.g;
gbufferMaterial4f = vec4(material.rgb, u_useEnvMap1f);
}

View File

@ -1,104 +1,104 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_position2f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_fogDepthTexture;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
#ifdef COMPILE_FOG_ATMOSPHERE
uniform sampler2D u_environmentMap;
uniform vec3 u_sunColorAdd3f;
#endif
uniform mat4 u_inverseViewProjMatrix4f;
#ifdef COMPILE_FOG_LINEAR
uniform vec2 u_linearFogParam2f;
#else
uniform float u_expFogDensity1f;
#endif
uniform vec4 u_fogColorLight4f;
uniform vec4 u_fogColorDark4f;
void main() {
vec4 fragPos4f = vec4(v_position2f, textureLod(u_fogDepthTexture, v_position2f, 0.0).r, 1.0);
#ifdef COMPILE_FOG_ATMOSPHERE
if(fragPos4f.z <= 0.0000001) {
discard;
}
#endif
float solidDepth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(solidDepth != fragPos4f.z) {
discard;
}
fragPos4f.xyz *= 2.0;
fragPos4f.xyz -= 1.0;
fragPos4f = u_inverseViewProjMatrix4f * fragPos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
float l = length(fragPos4f.xyz);
#ifdef COMPILE_FOG_LINEAR
float f = (l - u_linearFogParam2f.x) / (u_linearFogParam2f.y - u_linearFogParam2f.x);
#else
float f = 1.0 - exp(-u_expFogDensity1f * l);
#endif
float f2 = textureLod(u_gbufferNormalTexture, v_position2f, 0.0).a;
vec4 fogColor4f = mix(u_fogColorDark4f, u_fogColorLight4f, f2 * f2);
f = clamp(f, 0.0, 1.0) * fogColor4f.a;
#ifdef COMPILE_FOG_ATMOSPHERE
fragPos4f.xyz /= -l;
fragPos4f.xz /= abs(fragPos4f.y) + 1.0;
fragPos4f.xz *= 0.75;
vec3 envMapSample3f;
fragPos4f.xz *= vec2(-0.5, -0.25);
fragPos4f.xz += vec2(0.5, 0.25);
envMapSample3f = textureLod(u_environmentMap, fragPos4f.xz, 0.0).rgb + u_sunColorAdd3f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r;
envMapSample3f *= pow(f2, 2.25);
f = (f * 0.85 + 0.2) * f2 + f * (1.0 - f2);
#endif
output4f = vec4(envMapSample3f * fogColor4f.rgb, f);
#else
output4f = vec4(fogColor4f.rgb, f);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_position2f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_fogDepthTexture;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
#ifdef COMPILE_FOG_ATMOSPHERE
uniform sampler2D u_environmentMap;
uniform vec3 u_sunColorAdd3f;
#endif
uniform mat4 u_inverseViewProjMatrix4f;
#ifdef COMPILE_FOG_LINEAR
uniform vec2 u_linearFogParam2f;
#else
uniform float u_expFogDensity1f;
#endif
uniform vec4 u_fogColorLight4f;
uniform vec4 u_fogColorDark4f;
void main() {
vec4 fragPos4f = vec4(v_position2f, textureLod(u_fogDepthTexture, v_position2f, 0.0).r, 1.0);
#ifdef COMPILE_FOG_ATMOSPHERE
if(fragPos4f.z <= 0.0000001) {
discard;
}
#endif
float solidDepth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(solidDepth != fragPos4f.z) {
discard;
}
fragPos4f.xyz *= 2.0;
fragPos4f.xyz -= 1.0;
fragPos4f = u_inverseViewProjMatrix4f * fragPos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
float l = length(fragPos4f.xyz);
#ifdef COMPILE_FOG_LINEAR
float f = (l - u_linearFogParam2f.x) / (u_linearFogParam2f.y - u_linearFogParam2f.x);
#else
float f = 1.0 - exp(-u_expFogDensity1f * l);
#endif
float f2 = textureLod(u_gbufferNormalTexture, v_position2f, 0.0).a;
vec4 fogColor4f = mix(u_fogColorDark4f, u_fogColorLight4f, f2 * f2);
f = clamp(f, 0.0, 1.0) * fogColor4f.a;
#ifdef COMPILE_FOG_ATMOSPHERE
fragPos4f.xyz /= -l;
fragPos4f.xz /= abs(fragPos4f.y) + 1.0;
fragPos4f.xz *= 0.75;
vec3 envMapSample3f;
fragPos4f.xz *= vec2(-0.5, -0.25);
fragPos4f.xz += vec2(0.5, 0.25);
envMapSample3f = textureLod(u_environmentMap, fragPos4f.xz, 0.0).rgb + u_sunColorAdd3f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
f2 = textureLod(u_lightShaftsTexture, v_position2f, 0.0).r;
envMapSample3f *= pow(f2, 2.25);
f = (f * 0.85 + 0.2) * f2 + f * (1.0 - f2);
#endif
output4f = vec4(envMapSample3f * fogColor4f.rgb, f);
#else
output4f = vec4(fogColor4f.rgb, f);
#endif
}

View File

@ -1,30 +1,30 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
gl_Position = vec4(a_position2f, 0.0, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
gl_Position = vec4(a_position2f, 0.0, 1.0);
}

View File

@ -1,61 +1,61 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#if !defined(COMPILE_ENABLE_ALPHA_TEST) && !defined(COMPILE_COLORED_SHADOWS)
#undef COMPILE_ENABLE_TEXTURE2D
#endif
#ifdef COMPILE_COLORED_SHADOWS
layout(location = 0) out vec4 output4f;
uniform vec4 u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#else
uniform vec2 u_textureCoords01;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#endif
void main() {
#ifdef COMPILE_COLORED_SHADOWS
vec4 color = u_color4f;
#else
vec4 color = vec4(1.0);
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
#ifdef COMPILE_TEXTURE_ATTRIB
color *= texture(u_samplerTexture, v_texture2f);
#else
color *= texture(u_samplerTexture, u_textureCoords01);
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#endif
#ifdef COMPILE_COLORED_SHADOWS
output4f = vec4(mix(vec3(1.0), color.rgb, color.a), color.a);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#if !defined(COMPILE_ENABLE_ALPHA_TEST) && !defined(COMPILE_COLORED_SHADOWS)
#undef COMPILE_ENABLE_TEXTURE2D
#endif
#ifdef COMPILE_COLORED_SHADOWS
layout(location = 0) out vec4 output4f;
uniform vec4 u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#else
uniform vec2 u_textureCoords01;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#endif
void main() {
#ifdef COMPILE_COLORED_SHADOWS
vec4 color = u_color4f;
#else
vec4 color = vec4(1.0);
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
#ifdef COMPILE_TEXTURE_ATTRIB
color *= texture(u_samplerTexture, v_texture2f);
#else
color *= texture(u_samplerTexture, u_textureCoords01);
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(color.a < u_alphaTestRef1f) discard;
#endif
#endif
#ifdef COMPILE_COLORED_SHADOWS
output4f = vec4(mix(vec3(1.0), color.rgb, color.a), color.a);
#endif
}

View File

@ -1,103 +1,103 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#if defined(COMPILE_ENABLE_ALPHA_TEST) && defined(COMPILE_ENABLE_TEXTURE2D)
#define DO_SHADOW_ALPHA_TEST
#endif
#ifdef DO_SHADOW_ALPHA_TEST
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#endif
uniform mat4 u_modelviewProjMat4f;
#ifdef COMPILE_STATE_WAVING_BLOCKS
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
#else
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
uniform mat4 u_textureMat4f02;
#else
uniform vec2 u_textureCoords02;
#endif
#endif
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform vec3 u_wavingBlockOffset3f;
uniform vec4 u_wavingBlockParam4f;
#define DO_COMPILE_STATE_WAVING_BLOCKS
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#endif
#EAGLER INCLUDE (2) "eagler:glsl/deferred/lib/waving_blocks.glsl"
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef DO_SHADOW_ALPHA_TEST
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#endif
#ifdef DO_COMPILE_STATE_WAVING_BLOCKS
vec4 pos = vec4(a_position3f, 1.0);
#ifdef COMPILE_NORMAL_ATTRIB
float blockId = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#else
float blockId = u_blockConstant1f;
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
mat4x2 texMat4x2 = mat4x2(
u_textureMat4f02[0].yw,
u_textureMat4f02[1].yw,
u_textureMat4f02[2].yw,
u_textureMat4f02[3].yw
);
vec2 v_lightmapTmp2f = texMat4x2 * vec4(a_lightmap2f, 0.0, 1.0);
v_lightmapTmp2f.x = v_lightmapTmp2f.x / v_lightmapTmp2f.y;
#else
vec2 v_lightmapTmp2f = vec2(u_textureCoords02.y, 0.0);
#endif
if(v_lightmapTmp2f.x > 0.33) {
COMPUTE_WAVING_BLOCKS(pos, min(v_lightmapTmp2f.x * 3.0 - 1.0, 1.0), 24.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewProjMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
}else {
pos = u_modelviewProjMat4f * pos;
}
#else
COMPUTE_WAVING_BLOCKS(pos, 1.0, 32.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewProjMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
#endif
gl_Position = pos;
#else
gl_Position = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#if defined(COMPILE_ENABLE_ALPHA_TEST) && defined(COMPILE_ENABLE_TEXTURE2D)
#define DO_SHADOW_ALPHA_TEST
#endif
#ifdef DO_SHADOW_ALPHA_TEST
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#endif
uniform mat4 u_modelviewProjMat4f;
#ifdef COMPILE_STATE_WAVING_BLOCKS
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
#else
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
uniform mat4 u_textureMat4f02;
#else
uniform vec2 u_textureCoords02;
#endif
#endif
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform vec3 u_wavingBlockOffset3f;
uniform vec4 u_wavingBlockParam4f;
#define DO_COMPILE_STATE_WAVING_BLOCKS
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
#define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#endif
#EAGLER INCLUDE (2) "eagler:glsl/deferred/lib/waving_blocks.glsl"
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef DO_SHADOW_ALPHA_TEST
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#endif
#ifdef DO_COMPILE_STATE_WAVING_BLOCKS
vec4 pos = vec4(a_position3f, 1.0);
#ifdef COMPILE_NORMAL_ATTRIB
float blockId = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#else
float blockId = u_blockConstant1f;
#endif
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
mat4x2 texMat4x2 = mat4x2(
u_textureMat4f02[0].yw,
u_textureMat4f02[1].yw,
u_textureMat4f02[2].yw,
u_textureMat4f02[3].yw
);
vec2 v_lightmapTmp2f = texMat4x2 * vec4(a_lightmap2f, 0.0, 1.0);
v_lightmapTmp2f.x = v_lightmapTmp2f.x / v_lightmapTmp2f.y;
#else
vec2 v_lightmapTmp2f = vec2(u_textureCoords02.y, 0.0);
#endif
if(v_lightmapTmp2f.x > 0.33) {
COMPUTE_WAVING_BLOCKS(pos, min(v_lightmapTmp2f.x * 3.0 - 1.0, 1.0), 24.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewProjMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
}else {
pos = u_modelviewProjMat4f * pos;
}
#else
COMPUTE_WAVING_BLOCKS(pos, 1.0, 32.0, blockId, u_modelMatrix4f, u_viewMatrix4f, u_modelviewProjMat4f, u_wavingBlockOffset3f, u_wavingBlockParam4f)
#endif
gl_Position = pos;
#else
gl_Position = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
#endif
}

View File

@ -1,10 +1,10 @@
item,damage,red,green,blue,intensity
minecraft:beacon,0,0.4493,0.6007,1.0000,500.0
minecraft:glowstone,0,1.0000,0.6636,0.3583,10.0
minecraft:lit_pumpkin,0,1.0000,0.5447,0.2005,10.0
minecraft:torch,0,1.0000,0.5983,0.2655,10.0
minecraft:redstone_torch,0,1.0000,0.1578,0.0000,4.0
minecraft:sea_lantern,0,0.5530,0.6468,1.0000,10.0,
minecraft:lava_bucket,0,1.0000,0.4461,0.1054,6.0,
minecraft:nether_star,0,0.5711,0.6611,1.0000,6.0
item,damage,red,green,blue,intensity
minecraft:beacon,0,0.4493,0.6007,1.0000,500.0
minecraft:glowstone,0,1.0000,0.6636,0.3583,10.0
minecraft:lit_pumpkin,0,1.0000,0.5447,0.2005,10.0
minecraft:torch,0,1.0000,0.5983,0.2655,10.0
minecraft:redstone_torch,0,1.0000,0.1578,0.0000,4.0
minecraft:sea_lantern,0,0.5530,0.6468,1.0000,10.0,
minecraft:lava_bucket,0,1.0000,0.4461,0.1054,6.0,
minecraft:nether_star,0,0.5711,0.6611,1.0000,6.0
minecraft:ender_eye,0,0.1990,0.7750,0.4130,4.0
1 item,damage,red,green,blue,intensity
2 minecraft:beacon,0,0.4493,0.6007,1.0000,500.0
3 minecraft:glowstone,0,1.0000,0.6636,0.3583,10.0
4 minecraft:lit_pumpkin,0,1.0000,0.5447,0.2005,10.0
5 minecraft:torch,0,1.0000,0.5983,0.2655,10.0
6 minecraft:redstone_torch,0,1.0000,0.1578,0.0000,4.0
7 minecraft:sea_lantern,0,0.5530,0.6468,1.0000,10.0,
8 minecraft:lava_bucket,0,1.0000,0.4461,0.1054,6.0,
9 minecraft:nether_star,0,0.5711,0.6611,1.0000,6.0
10 minecraft:ender_eye,0,0.1990,0.7750,0.4130,4.0

View File

@ -1,471 +1,471 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
in vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#else
#undef COMPILE_NORMAL_MATERIAL_TEXTURE
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
in vec3 v_objectPosition3f;
uniform ivec4 u_texGenPlane4i;
uniform vec4 u_texGenS4f;
uniform vec4 u_texGenT4f;
uniform vec4 u_texGenR4f;
uniform vec4 u_texGenQ4f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
uniform mat4 u_inverseViewMatrix4f;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
uniform sampler2D u_samplerNormalMaterial;
#else
uniform vec3 u_materialConstants3f;
#endif
uniform sampler2D u_metalsLUT;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
#ifdef COMPILE_PARABOLOID
#undef COMPILE_SUN_SHADOW_SMOOTH
#undef COMPILE_SUN_SHADOW_LOD1
#undef COMPILE_SUN_SHADOW_LOD2
#endif
#ifdef COMPILE_PARABOLOID_ENV_MAP
uniform sampler2D u_environmentMap;
uniform sampler2D u_brdfLUT;
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
#endif
uniform sampler2D u_irradianceMap;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#else
lightmapCoords2f = vec2(0.0, 1.0);
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = v_block1f;
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ========= CALCULATE DIFFUSE COLOR ========== //
#ifdef COMPILE_COLOR_ATTRIB
diffuseColor4f = v_color4f * u_color4f;
#else
diffuseColor4f = u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
vec2 texCoords2f;
#ifdef COMPILE_ENABLE_TEX_GEN
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
vec4 texGenVector;
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
texGenVector.xyz = mat4x3(
u_textureMat4f01[0].xyw,
u_textureMat4f01[1].xyw,
u_textureMat4f01[2].xyw,
u_textureMat4f01[3].xyw
) * texGenVector;
texCoords2f = texGenVector.xy / texGenVector.z;
#else
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
texCoords2f = floor(v_texture2f * u_textureAnisotropicFix) + 0.5;
texCoords2f /= u_textureAnisotropicFix;
#else
texCoords2f = v_texture2f;
#endif
#else
texCoords2f = u_textureCoords01;
#endif
#endif
diffuseColor4f *= texture(u_samplerTexture, texCoords2f);
#endif
#ifdef COMPILE_BLEND_ADD
diffuseColor4f = diffuseColor4f * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
// ============= ALPHA TEST ============== //
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(diffuseColor4f.a < u_alphaTestRef1f) discard;
#endif
// ========== RESOLVE MATERIALS =========== //
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
vec2 uv2 = vec2(1.0, 0.5) * texCoords2f;
uv2.y += 0.5;
materialData3f = texture(u_samplerNormalMaterial, uv2).rgb;
#else
materialData3f = u_materialConstants3f;
#endif
vec3 metalN, metalK;
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
float f;
#ifdef COMPILE_PARABOLOID_ENV_MAP
// =========== ENVIRONMENT MAP =========== //
f = materialData3f.g < 0.06 ? 1.0 : 0.0;
f += materialData3f.r < 0.5 ? 1.0 : 0.0;
while(f == 0.0) {
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(dst2 > 16.0) {
break;
}
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.25);
}
break;
}
#endif
// =========== IRRADIANCE MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(u_sunDirection4f.w, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
vec4 fogBlend4f = vec4(0.0);
#ifndef COMPILE_ENABLE_TEX_GEN
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
float l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogBlend4f.a *= clamp(f, 0.0, 1.0);
if(atmos == 0.0) {
break;
}
vec3 atmosSamplePos = v_position4f.xyz / -l;
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
atmosSamplePos.xz += vec2(0.5, 0.25);
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.9 + 0.1;
#endif
break;
}
#endif
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
skyLight *= u_blockSkySunDynamicLightFac4f.y;
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
diffuseColor4f.rgb += lightColor3f;
diffuseColor4f.rgb = mix(diffuseColor4f.rgb, fogBlend4f.rgb, fogBlend4f.a);
output4f = vec4(diffuseColor4f.rgb * diffuseColor4f.a, diffuseColor4f.a);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
in vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_BLEND_ADD
uniform vec4 u_colorBlendSrc4f;
uniform vec4 u_colorBlendAdd4f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
uniform sampler2D u_samplerTexture;
#ifndef COMPILE_TEXTURE_ATTRIB
uniform vec2 u_textureCoords01;
#endif
#else
#undef COMPILE_NORMAL_MATERIAL_TEXTURE
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
in vec3 v_objectPosition3f;
uniform ivec4 u_texGenPlane4i;
uniform vec4 u_texGenS4f;
uniform vec4 u_texGenT4f;
uniform vec4 u_texGenR4f;
uniform vec4 u_texGenQ4f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_ALPHA_TEST
uniform float u_alphaTestRef1f;
#endif
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
uniform vec2 u_textureAnisotropicFix;
#endif
uniform mat4 u_inverseViewMatrix4f;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
uniform sampler2D u_samplerNormalMaterial;
#else
uniform vec3 u_materialConstants3f;
#endif
uniform sampler2D u_metalsLUT;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#define LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
#ifdef COMPILE_PARABOLOID
#undef COMPILE_SUN_SHADOW_SMOOTH
#undef COMPILE_SUN_SHADOW_LOD1
#undef COMPILE_SUN_SHADOW_LOD2
#endif
#ifdef COMPILE_PARABOLOID_ENV_MAP
uniform sampler2D u_environmentMap;
uniform sampler2D u_brdfLUT;
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#define LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
#endif
uniform sampler2D u_irradianceMap;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
#EAGLER INCLUDE (4) "eagler:glsl/deferred/lib/pbr_env_map.glsl"
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#else
lightmapCoords2f = vec2(0.0, 1.0);
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = v_block1f;
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ========= CALCULATE DIFFUSE COLOR ========== //
#ifdef COMPILE_COLOR_ATTRIB
diffuseColor4f = v_color4f * u_color4f;
#else
diffuseColor4f = u_color4f;
#endif
#ifdef COMPILE_ENABLE_TEXTURE2D
vec2 texCoords2f;
#ifdef COMPILE_ENABLE_TEX_GEN
vec4 tmpVec4 = vec4(v_objectPosition3f, 1.0);
vec4 texGenVector;
texGenVector.x = dot(u_texGenPlane4i.x == 1 ? v_position4f : tmpVec4, u_texGenS4f);
texGenVector.y = dot(u_texGenPlane4i.y == 1 ? v_position4f : tmpVec4, u_texGenT4f);
texGenVector.z = dot(u_texGenPlane4i.z == 1 ? v_position4f : tmpVec4, u_texGenR4f);
texGenVector.w = dot(u_texGenPlane4i.w == 1 ? v_position4f : tmpVec4, u_texGenQ4f);
texGenVector.xyz = mat4x3(
u_textureMat4f01[0].xyw,
u_textureMat4f01[1].xyw,
u_textureMat4f01[2].xyw,
u_textureMat4f01[3].xyw
) * texGenVector;
texCoords2f = texGenVector.xy / texGenVector.z;
#else
#ifdef COMPILE_TEXTURE_ATTRIB
#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX
texCoords2f = floor(v_texture2f * u_textureAnisotropicFix) + 0.5;
texCoords2f /= u_textureAnisotropicFix;
#else
texCoords2f = v_texture2f;
#endif
#else
texCoords2f = u_textureCoords01;
#endif
#endif
diffuseColor4f *= texture(u_samplerTexture, texCoords2f);
#endif
#ifdef COMPILE_BLEND_ADD
diffuseColor4f = diffuseColor4f * u_colorBlendSrc4f + u_colorBlendAdd4f;
#endif
// ============= ALPHA TEST ============== //
#ifdef COMPILE_ENABLE_ALPHA_TEST
if(diffuseColor4f.a < u_alphaTestRef1f) discard;
#endif
// ========== RESOLVE MATERIALS =========== //
#ifdef COMPILE_NORMAL_MATERIAL_TEXTURE
vec2 uv2 = vec2(1.0, 0.5) * texCoords2f;
uv2.y += 0.5;
materialData3f = texture(u_samplerNormalMaterial, uv2).rgb;
#else
materialData3f = u_materialConstants3f;
#endif
vec3 metalN, metalK;
PREFETCH_METALS(diffuseColor4f.rgb, materialData3f.g, metalN, metalK)
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.z;
}
float f;
#ifdef COMPILE_PARABOLOID_ENV_MAP
// =========== ENVIRONMENT MAP =========== //
f = materialData3f.g < 0.06 ? 1.0 : 0.0;
f += materialData3f.r < 0.5 ? 1.0 : 0.0;
while(f == 0.0) {
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(dst2 > 16.0) {
break;
}
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.25);
}
break;
}
#endif
// =========== IRRADIANCE MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
vec3 irradianceMapSamplePos2f = normalVector3f;
irradianceMapSamplePos2f.xz /= abs(irradianceMapSamplePos2f.y) + 1.0;
float dst = 1.0 - dot(irradianceMapSamplePos2f.xz, irradianceMapSamplePos2f.xz);
dst *= dst;
irradianceMapSamplePos2f.xz *= 0.975;
vec3 skyLight = vec3(sqrt(0.01 + max(u_sunDirection4f.w, 0.0)));
if(dst < 0.005) {
vec4 sample1 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
skyLight += mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, irradianceMapSamplePos2f.y * -12.5 + 0.5)).rgb;
}else {
irradianceMapSamplePos2f.xz *= vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : -0.25);
irradianceMapSamplePos2f.xz += vec2(0.5, irradianceMapSamplePos2f.y > 0.0 ? 0.25 : 0.75);
skyLight += textureLod(u_irradianceMap, irradianceMapSamplePos2f.xz, 0.0).rgb;
}
skyLight *= lightmapCoords2f.g * u_sunColor3f_sky1f.w;
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = worldPosition4f.xyz - u_dynamicLightArray[i].u_lightPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
dlightDir3f = materialData3f.b == 1.0 ? normalVector3f : -dlightDir3f;
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f, materialData3f, metalN, metalK) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
vec4 fogBlend4f = vec4(0.0);
#ifndef COMPILE_ENABLE_TEX_GEN
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
float l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogBlend4f.a *= clamp(f, 0.0, 1.0);
if(atmos == 0.0) {
break;
}
vec3 atmosSamplePos = v_position4f.xyz / -l;
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
atmosSamplePos.xz += vec2(0.5, 0.25);
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.9 + 0.1;
#endif
break;
}
#endif
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
skyLight *= u_blockSkySunDynamicLightFac4f.y;
float emissive = materialData3f.b == 1.0 ? 0.0 : materialData3f.b;
diffuseColor4f.rgb *= max(skyLight + blockLight, vec3(emissive * emissive * 20.0 + 0.075)) * 0.075;
diffuseColor4f.rgb += lightColor3f;
diffuseColor4f.rgb = mix(diffuseColor4f.rgb, fogBlend4f.rgb, fogBlend4f.a);
output4f = vec4(diffuseColor4f.rgb * diffuseColor4f.a, diffuseColor4f.a);
}

View File

@ -1,103 +1,103 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
out vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
out vec3 v_objectPosition3f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
#ifdef COMPILE_PARABOLOID
uniform float u_farPlane1f;
#else
uniform mat4 u_projectionMat4f;
#endif
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_ENABLE_TEX_GEN
v_objectPosition3f = a_position3f;
#endif
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
#ifdef COMPILE_PARABOLOID
vec3 pos = v_position4f.xyz / v_position4f.w;
float dist = pos.z;
pos.xyz = normalize(pos.xyz);
pos.xy /= 1.0 - pos.z;
pos.z = dist / u_farPlane1f + 1.00005;
gl_Position = vec4(pos.xyz, 1.0);
#else
gl_Position = u_projectionMat4f * v_position4f;
#endif
#ifdef COMPILE_FOG_LIGHT_SHAFTS
v_positionClip2f = gl_Position.xy / gl_Position.w;
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
out vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_ENABLE_TEX_GEN
out vec3 v_objectPosition3f;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
#ifdef COMPILE_PARABOLOID
uniform float u_farPlane1f;
#else
uniform mat4 u_projectionMat4f;
#endif
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_ENABLE_TEX_GEN
v_objectPosition3f = a_position3f;
#endif
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
#ifdef COMPILE_PARABOLOID
vec3 pos = v_position4f.xyz / v_position4f.w;
float dist = pos.z;
pos.xyz = normalize(pos.xyz);
pos.xy /= 1.0 - pos.z;
pos.z = dist / u_farPlane1f + 1.00005;
gl_Position = vec4(pos.xyz, 1.0);
#else
gl_Position = u_projectionMat4f * v_position4f;
#endif
#ifdef COMPILE_FOG_LIGHT_SHAFTS
v_positionClip2f = gl_Position.xy / gl_Position.w;
#endif
}

View File

@ -1,308 +1,308 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
uniform vec4 u_color4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
uniform mat4 u_inverseViewMatrix4f;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
uniform sampler2D u_environmentMap;
uniform sampler2D u_brdfLUT;
#define GLASS_ROUGHNESS 0.15
#define GLASS_F0 0.4
vec3 eaglercraftLighting_Glass(in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec) {
float roughness = 1.0 - GLASS_ROUGHNESS * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = (GLASS_ROUGHNESS * GLASS_ROUGHNESS * GLASS_ROUGHNESS * GLASS_ROUGHNESS);
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = GLASS_ROUGHNESS + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 F = vec3(GLASS_F0 + (1.0 - GLASS_F0) * fresnel);
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (NDF * F / denom) * radiance * NdotHVL.z;
}
vec3 eaglercraftIBL_Specular_Glass(in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec) {
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F = vec3(GLASS_F0 + (max(1.0 - GLASS_ROUGHNESS, GLASS_F0) - GLASS_F0) * fresnel);
vec2 brdf2f = vec2(max(NdotV, 0.0), GLASS_ROUGHNESS);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#else
lightmapCoords2f = vec2(0.0, 1.0);
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = v_block1f;
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ============ SUN LIGHTING ============== //
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting_Glass(lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== ENVIRONMENT MAP =========== //
for(;;) {
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(dst2 > 16.0) {
break;
}
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
lightColor3f += eaglercraftIBL_Specular_Glass(envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f) * (1.0 - sqrt(dst2) * 0.25);
}
break;
}
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = u_dynamicLightArray[i].u_lightPosition4f.xyz - worldPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting_Glass(dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
float fogFade = 0.0;
if(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogFade = mix(u_fogColorDark4f.a, u_fogColorLight4f.a, lightmapCoords2f.g);
float f;
float l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogFade *= clamp(f, 0.0, 1.0);
}
// ============ OUTPUT COLOR ============== //
output4f = vec4(lightColor3f * (1.0 - fogFade), 0.1);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
uniform vec4 u_color4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
uniform mat4 u_inverseViewMatrix4f;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
uniform sampler2D u_environmentMap;
uniform sampler2D u_brdfLUT;
#define GLASS_ROUGHNESS 0.15
#define GLASS_F0 0.4
vec3 eaglercraftLighting_Glass(in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec) {
float roughness = 1.0 - GLASS_ROUGHNESS * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = (GLASS_ROUGHNESS * GLASS_ROUGHNESS * GLASS_ROUGHNESS * GLASS_ROUGHNESS);
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = GLASS_ROUGHNESS + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 F = vec3(GLASS_F0 + (1.0 - GLASS_F0) * fresnel);
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (NDF * F / denom) * radiance * NdotHVL.z;
}
vec3 eaglercraftIBL_Specular_Glass(in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec) {
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F = vec3(GLASS_F0 + (max(1.0 - GLASS_ROUGHNESS, GLASS_F0) - GLASS_F0) * fresnel);
vec2 brdf2f = vec2(max(NdotV, 0.0), GLASS_ROUGHNESS);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#else
lightmapCoords2f = vec2(0.0, 1.0);
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = v_block1f;
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ============ SUN LIGHTING ============== //
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting_Glass(lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== ENVIRONMENT MAP =========== //
for(;;) {
float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
if(dst2 > 16.0) {
break;
}
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz = reflectDir.xz * 0.975;
vec4 envMapSample4f;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz = reflectDir.xz * vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
if(envMapSample4f.a > 0.0) {
lightColor3f += eaglercraftIBL_Specular_Glass(envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f) * (1.0 - sqrt(dst2) * 0.25);
}
break;
}
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = u_dynamicLightArray[i].u_lightPosition4f.xyz - worldPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting_Glass(dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
float fogFade = 0.0;
if(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogFade = mix(u_fogColorDark4f.a, u_fogColorLight4f.a, lightmapCoords2f.g);
float f;
float l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogFade *= clamp(f, 0.0, 1.0);
}
// ============ OUTPUT COLOR ============== //
output4f = vec4(lightColor3f * (1.0 - fogFade), 0.1);
}

View File

@ -1,54 +1,54 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_projectionMat4f * v_position4f;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_projectionMat4f * v_position4f;
}

View File

@ -1,111 +1,111 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_texture0;
uniform sampler2D u_texture1;
#ifdef DEBUG_VIEW_18
precision highp sampler3D;
uniform sampler3D u_texture3D0;
uniform float u_fuckU1f;
#endif
uniform mat4 u_inverseViewMatrix;
uniform vec2 u_depthSliceStartEnd2f;
void main() {
#ifdef DEBUG_VIEW_0
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rgb, 1.0);
#endif
#ifdef DEBUG_VIEW_1
vec3 color3f = textureLod(u_texture0, v_position2f, 0.0).rgb;
if(color3f.x == 0.0 && color3f.y == 0.0 && color3f.z == 0.0) {
output4f = vec4(0.0, 0.0, 0.0, 1.0);
}else {
output4f = vec4(normalize(mat3(u_inverseViewMatrix) * (color3f * 2.0 - 1.0)), 1.0);
}
#endif
#ifdef DEBUG_VIEW_2
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).a, textureLod(u_texture1, v_position2f, 0.0).a, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_3
vec4 color4f = textureLod(u_texture0, v_position2f, 0.0);
output4f = vec4(color4f.b > 0.99 ? 1.0 : 0.0, color4f.a, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_4
output4f = vec4(vec3(clamp((textureLod(u_texture0, v_position2f, 0.0).r - u_depthSliceStartEnd2f.x) * u_depthSliceStartEnd2f.y, 0.0, 1.0)), 1.0);
#endif
#ifdef DEBUG_VIEW_5
output4f = vec4(vec3(textureLod(u_texture0, (v_position2f + vec2(0.0, u_depthSliceStartEnd2f.y)) * vec2(1.0, u_depthSliceStartEnd2f.x), 0.0).r), 1.0);
#endif
#ifdef DEBUG_VIEW_6
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).r), 1.0);
#endif
#ifdef DEBUG_VIEW_7
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).a > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_8
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rgb * 10.0, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_9
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).g), 1.0);
#endif
#ifdef DEBUG_VIEW_10
vec2 coord = (v_position2f + vec2(0.0, u_depthSliceStartEnd2f.y)) * vec2(1.0, u_depthSliceStartEnd2f.x);
vec4 color2 = textureLod(u_texture1, coord, 0.0);
output4f = vec4(mix(color2.rgb, vec3(textureLod(u_texture0, coord, 0.0).r), color2.a), 1.0);
#endif
#ifdef DEBUG_VIEW_11
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).a * 0.017), 1.0);
#endif
#ifdef DEBUG_VIEW_12
output4f = vec4(abs(textureLod(u_texture0, v_position2f, 0.0).rgb) * 0.1, 1.0);
#endif
#ifdef DEBUG_VIEW_13
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).g > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_14
output4f = vec4(textureLod(u_texture0, v_position2f.yx, 0.0).rgb * 2.5, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_15
output4f = vec4(vec3(textureLod(u_texture0, v_position2f.yx, 0.0).a > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_16
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rg, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_17
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).r) * 10.0, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_18
output4f = vec4(vec3(textureLod(u_texture3D0, vec3(v_position2f, u_fuckU1f), 0.0).r), 1.0);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_texture0;
uniform sampler2D u_texture1;
#ifdef DEBUG_VIEW_18
precision highp sampler3D;
uniform sampler3D u_texture3D0;
uniform float u_fuckU1f;
#endif
uniform mat4 u_inverseViewMatrix;
uniform vec2 u_depthSliceStartEnd2f;
void main() {
#ifdef DEBUG_VIEW_0
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rgb, 1.0);
#endif
#ifdef DEBUG_VIEW_1
vec3 color3f = textureLod(u_texture0, v_position2f, 0.0).rgb;
if(color3f.x == 0.0 && color3f.y == 0.0 && color3f.z == 0.0) {
output4f = vec4(0.0, 0.0, 0.0, 1.0);
}else {
output4f = vec4(normalize(mat3(u_inverseViewMatrix) * (color3f * 2.0 - 1.0)), 1.0);
}
#endif
#ifdef DEBUG_VIEW_2
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).a, textureLod(u_texture1, v_position2f, 0.0).a, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_3
vec4 color4f = textureLod(u_texture0, v_position2f, 0.0);
output4f = vec4(color4f.b > 0.99 ? 1.0 : 0.0, color4f.a, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_4
output4f = vec4(vec3(clamp((textureLod(u_texture0, v_position2f, 0.0).r - u_depthSliceStartEnd2f.x) * u_depthSliceStartEnd2f.y, 0.0, 1.0)), 1.0);
#endif
#ifdef DEBUG_VIEW_5
output4f = vec4(vec3(textureLod(u_texture0, (v_position2f + vec2(0.0, u_depthSliceStartEnd2f.y)) * vec2(1.0, u_depthSliceStartEnd2f.x), 0.0).r), 1.0);
#endif
#ifdef DEBUG_VIEW_6
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).r), 1.0);
#endif
#ifdef DEBUG_VIEW_7
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).a > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_8
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rgb * 10.0, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_9
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).g), 1.0);
#endif
#ifdef DEBUG_VIEW_10
vec2 coord = (v_position2f + vec2(0.0, u_depthSliceStartEnd2f.y)) * vec2(1.0, u_depthSliceStartEnd2f.x);
vec4 color2 = textureLod(u_texture1, coord, 0.0);
output4f = vec4(mix(color2.rgb, vec3(textureLod(u_texture0, coord, 0.0).r), color2.a), 1.0);
#endif
#ifdef DEBUG_VIEW_11
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).a * 0.017), 1.0);
#endif
#ifdef DEBUG_VIEW_12
output4f = vec4(abs(textureLod(u_texture0, v_position2f, 0.0).rgb) * 0.1, 1.0);
#endif
#ifdef DEBUG_VIEW_13
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).g > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_14
output4f = vec4(textureLod(u_texture0, v_position2f.yx, 0.0).rgb * 2.5, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_15
output4f = vec4(vec3(textureLod(u_texture0, v_position2f.yx, 0.0).a > 0.0 ? 1.0 : 0.0), 1.0);
#endif
#ifdef DEBUG_VIEW_16
output4f = vec4(textureLod(u_texture0, v_position2f, 0.0).rg, 0.0, 1.0);
#endif
#ifdef DEBUG_VIEW_17
output4f = vec4(vec3(textureLod(u_texture0, v_position2f, 0.0).r) * 10.0, 1.0);
output4f.xyz /= (output4f.xyz + 1.0);
output4f.xyz = sqrt(output4f.xyz);
#endif
#ifdef DEBUG_VIEW_18
output4f = vec4(vec3(textureLod(u_texture3D0, vec3(v_position2f, u_fuckU1f), 0.0).r), 1.0);
#endif
}

View File

@ -1,29 +1,29 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision highp sampler2D;
in vec2 v_position2f;
uniform sampler2D u_depthTexture;
void main() {
gl_FragDepth = textureLod(u_depthTexture, v_position2f, 0.0).r <= 0.0000001 ? 0.0 : 1.0;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision highp sampler2D;
in vec2 v_position2f;
uniform sampler2D u_depthTexture;
void main() {
gl_FragDepth = textureLod(u_depthTexture, v_position2f, 0.0).r <= 0.0000001 ? 0.0 : 1.0;
}

View File

@ -1,70 +1,70 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out float occlusionOut1f;
uniform mat3 u_sampleMatrix3f;
uniform sampler2D u_depthBufferTexture;
uniform sampler2D u_cloudsSunOcclusion;
#define SAMPLE_DEPTH(v, a, f)\
f = u_sampleMatrix3f * v;\
f.xy /= f.z;\
if(f.xy == clamp(f.xy, vec2(0.001), vec2(0.999)))\
a += textureLod(u_depthBufferTexture, f.xy, 0.0).r > 0.000001 ? 0.0 : 0.0417;
void main() {
vec3 f;
float accum = 0.0;
float cloud = textureLod(u_cloudsSunOcclusion, vec2(0.5, 0.5), 0.0).r;
if(cloud < 0.01) {
occlusionOut1f = 0.0;
return;
}
SAMPLE_DEPTH(vec3(0.0, 0.0, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.235, -0.962, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.029, 0.996, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.834, -0.509, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.981, -0.086, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.821, 0.478, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.614, 0.563, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.251, -0.578, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.571, -0.491, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.142, 0.494, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.533, -0.036, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.970, -0.035, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.388, 0.918, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.521, 0.067, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.140, -0.471, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.487, 0.692, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.157, 0.331, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.559, -0.760, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.156, -0.956, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.181, -0.267, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.773, 0.272, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.329, 0.228, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.341, -0.187, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.121, 0.689, 1.0), accum, f)
occlusionOut1f = min(accum * cloud, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out float occlusionOut1f;
uniform mat3 u_sampleMatrix3f;
uniform sampler2D u_depthBufferTexture;
uniform sampler2D u_cloudsSunOcclusion;
#define SAMPLE_DEPTH(v, a, f)\
f = u_sampleMatrix3f * v;\
f.xy /= f.z;\
if(f.xy == clamp(f.xy, vec2(0.001), vec2(0.999)))\
a += textureLod(u_depthBufferTexture, f.xy, 0.0).r > 0.000001 ? 0.0 : 0.0417;
void main() {
vec3 f;
float accum = 0.0;
float cloud = textureLod(u_cloudsSunOcclusion, vec2(0.5, 0.5), 0.0).r;
if(cloud < 0.01) {
occlusionOut1f = 0.0;
return;
}
SAMPLE_DEPTH(vec3(0.0, 0.0, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.235, -0.962, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.029, 0.996, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.834, -0.509, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.981, -0.086, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.821, 0.478, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.614, 0.563, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.251, -0.578, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.571, -0.491, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.142, 0.494, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.533, -0.036, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.970, -0.035, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.388, 0.918, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.521, 0.067, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.140, -0.471, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.487, 0.692, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.157, 0.331, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.559, -0.760, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.156, -0.956, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.181, -0.267, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.773, 0.272, 1.0), accum, f)
SAMPLE_DEPTH(vec3(0.329, 0.228, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.341, -0.187, 1.0), accum, f)
SAMPLE_DEPTH(vec3(-0.121, 0.689, 1.0), accum, f)
occlusionOut1f = min(accum * cloud, 1.0);
}

View File

@ -1,122 +1,122 @@
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
vec3 eaglercraftIBL_NoBlur(in vec3 albedo, in vec3 irradiance, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
if(materials.g < 0.25) {
return albedo * irradiance * 0.1;
}else {
float roughness = 1.0 - materials.r * 0.85;
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 kD = vec3(0.05);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
kD = vec3(0.05);
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return kD * albedo * irradiance + envMapSample * (F * brdf2f.r + brdf2f.g);
}
}
#endif
#endif
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials, vec3 metalN, vec3 metalK) {
#else
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
#endif
float NdotV = dot(normalVec, -viewDir);
float roughness = 1.0 - materials.r * 0.85;
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
#endif
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_FUNCTION
vec3 eaglercraftIBL_NoBlur(in vec3 albedo, in vec3 irradiance, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
if(materials.g < 0.25) {
return albedo * irradiance * 0.1;
}else {
float roughness = 1.0 - materials.r * 0.85;
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 kD = vec3(0.05);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
kD = vec3(0.05);
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return kD * albedo * irradiance + envMapSample * (F * brdf2f.r + brdf2f.g);
}
}
#endif
#endif
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_SPECULAR
#ifndef _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#define _HAS_PBR_IMAGE_BASED_LIGHTING_SPECULAR_FUNCTION
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials, vec3 metalN, vec3 metalK) {
#else
vec3 eaglercraftIBL_Specular(in vec3 albedo, in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec, in vec3 materials) {
#endif
float NdotV = dot(normalVec, -viewDir);
float roughness = 1.0 - materials.r * 0.85;
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (max(1.0 - roughness, materials.g) - materials.g) * fresnel);
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_IMAGE_BASED_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = (1.0 - albedo) + albedo * fresnel;
}
vec2 brdf2f = vec2(max(NdotV, 0.0), roughness);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
#endif
#endif

View File

@ -1,88 +1,88 @@
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#ifndef _HAS_PBR_LIGHTING_FUNCTION
#define _HAS_PBR_LIGHTING_FUNCTION
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#define PREFETCH_METALS(albedo, materialG1f, metalN3f, metalK3f)\
if(materialG1f >= 0.9 && materialG1f < 0.964) {\
metalK3f.xy = vec2(0.25, (materialG1f - 0.9) * 15.625);\
metalN3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
metalK3f.x += 0.5;\
metalK3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
}
#endif
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials, in vec3 metalN, in vec3 metalK) {
#else
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials) {
#endif
float roughness = 1.0 - materials.r * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = roughness * roughness;
NDF *= NDF;
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = roughness + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 kD = vec3(0.03);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (1.0 - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb * length(albedo);
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = albedo + (1.0 - albedo) * fresnel;
}
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (kD + (NDF * F / denom)) * radiance * NdotHVL.z;
}
#endif
#endif
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#ifndef _HAS_PBR_LIGHTING_FUNCTION
#define _HAS_PBR_LIGHTING_FUNCTION
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
#define PREFETCH_METALS(albedo, materialG1f, metalN3f, metalK3f)\
if(materialG1f >= 0.9 && materialG1f < 0.964) {\
metalK3f.xy = vec2(0.25, (materialG1f - 0.9) * 15.625);\
metalN3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
metalK3f.x += 0.5;\
metalK3f = textureLod(u_metalsLUT, metalK3f.xy, 0.0).rgb;\
}
#endif
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials, in vec3 metalN, in vec3 metalK) {
#else
vec3 eaglercraftLighting(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec, in vec3 materials) {
#endif
float roughness = 1.0 - materials.r * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = roughness * roughness;
NDF *= NDF;
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = roughness + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 kD = vec3(0.03);
vec3 F;
if(materials.g < 0.9) {
F = vec3(materials.g + (1.0 - materials.g) * fresnel);
kD = (1.0 - F) * albedo / 3.141592;
}else if(materials.g < 0.964) {
#ifdef LIB_INCLUDE_PBR_LIGHTING_PREFETCH
vec3 mN = metalN;
vec3 mK = metalK;
#else
vec2 lutUV = vec2(0.25, (materials.g - 0.9) * 15.625);
vec3 mN = textureLod(u_metalsLUT, lutUV, 0.0).rgb;
lutUV.x += 0.5;
vec3 mK = textureLod(u_metalsLUT, lutUV, 0.0).rgb * length(albedo);
#endif
fresnel = 1.0 - fresnel;
mK *= mK;
mK += mN * mN;
vec3 nv = mN * fresnel * 2.0;
fresnel *= fresnel;
vec3 num = mK - nv + fresnel;
vec3 den = mK + nv + fresnel;
vec3 r = num / den;
mK *= fresnel;
mK += 1.0;
num = mK - nv;
den = mK + nv;
r += num / den;
r = clamp(r * 0.5, vec3(0.0), vec3(1.0));
F = r * r;
}else {
F = albedo + (1.0 - albedo) * fresnel;
}
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (kD + (NDF * F / denom)) * radiance * NdotHVL.z;
}
#endif
#endif

View File

@ -1,220 +1,220 @@
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#ifndef _HAS_INCLUDED_WAVING_BLOCKS
#define _HAS_INCLUDED_WAVING_BLOCKS
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK 1
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK_F 1.0
#define _WAVING_BLOCK_TYPE_TALL_GRASS 2
#define _WAVING_BLOCK_TYPE_TALL_GRASS_F 2.0
#define _WAVING_BLOCK_TYPE_CROPS 3
#define _WAVING_BLOCK_TYPE_CROPS_F 3.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM 4
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM_F 4.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP 5
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP_F 5.0
#define _WAVING_BLOCK_TYPE_PLANT 6
#define _WAVING_BLOCK_TYPE_PLANT_F 6.0
#define _WAVING_BLOCK_TYPE_SUGARCANE 7
#define _WAVING_BLOCK_TYPE_SUGARCANE_F 7.0
#define _WAVING_BLOCK_TYPE_VINES 8
#define _WAVING_BLOCK_TYPE_VINES_F 8.0
#define _WAVING_BLOCK_TYPE_WATER_STILL 9
#define _WAVING_BLOCK_TYPE_WATER_STILL_F 9.0
#define _WAVING_BLOCK_TYPE_WATER_FLOW 10
#define _WAVING_BLOCK_TYPE_WATER_FLOW_F 10.0
#define _WAVING_BLOCK_TYPE_LILYPAD 11
#define _WAVING_BLOCK_TYPE_LILYPAD_F 11.0
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR 12
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR_F 12.0
#define _WAVING_BLOCK_TYPE_FIRE_WALL 13
#define _WAVING_BLOCK_TYPE_FIRE_WALL_F 13.0
// ignore wall fire for now, they clip
#define _WAVING_BLOCK_MIN _WAVING_BLOCK_TYPE_LEAF_BLOCK_F
#define _WAVING_BLOCK_MAX _WAVING_BLOCK_TYPE_FIRE_FLOOR_F
#ifndef FAKE_SIN
#error the FAKE_SIN function must be defined to use waving blocks
#endif
#define _WAVING_BLOCK_COORD_DERIVE_HACK 0.001
#define _WAVING_BLOCK_COORD_DERIVE_HACK_05 0.0005
#define _WAVING_BLOCK_COORD_DERIVE_HACK_INV 1000.0
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 amp1, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
return ret * amp1;
}
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 vf_a, in vec3 vf_b, in vec3 amp1, in vec3 amp2, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
vec3 move = ret * amp1;
vec3 pos2 = move + pos;
fac = dot(vec4(pos2, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vf0 = timer * vf_a;
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vf_b;
d0.y += pos2.z;
d0.xz += pos2.y;
d0.xz += pos2.zx;
d0.xz -= pos2.xz;
FAKE_SIN(d0, ret)
ret *= fac2;
move += ret * amp2;
return move;
}
vec3 _computeWavingBlockById(in vec3 realPos, in vec3 referencePos, in vec4 wavingBlockParam, in float type) {
int typeInt = int(type);
highp float refY, fractY1, fractY2;
refY = referencePos.y;
switch(typeInt) {
case _WAVING_BLOCK_TYPE_CROPS:
refY += 0.0625625;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
// check if it is the bottom half of the block,
// if vertex is at Y = 0.0 then don't offset
fractY1 = fract(refY + _WAVING_BLOCK_COORD_DERIVE_HACK_05);
fractY2 = fract(refY - _WAVING_BLOCK_COORD_DERIVE_HACK_05);
if(fractY2 > fractY1) {
return vec3(0.0);
}
default:
break;
}
vec3 ret = vec3(0.0);
switch(typeInt) {
case _WAVING_BLOCK_TYPE_LEAF_BLOCK:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(1.0, 0.2, 1.0),
vec3(0.5, 0.1, 0.5),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_CROPS:
ret = _computeWavingBlockNoise(
referencePos,
vec3(1.0, 0.2, 1.0),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0041, 0.007, 0.0044),
vec3(0.0038, 0.024, 0.0),
vec3(0.8, 0.0, 0.8),
vec3(0.4, 0.0, 0.4),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_SUGARCANE:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.3, 0.0, 0.3),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_VINES:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(0.5, 0.3, 0.5),
vec3(0.25, 0.2, 0.25),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_WATER_STILL:
break;
case _WAVING_BLOCK_TYPE_WATER_FLOW:
break;
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0105, 0.0096, 0.0087),
vec3(0.0063, 0.0097, 0.0156),
vec3(1.2, 0.4, 1.2),
vec3(0.8, 0.8, 0.8),
wavingBlockParam.y);
break;
default:
break;
}
return ret;
}
#define COMPUTE_WAVING_BLOCKS(pos4f, amount, range, block1f, modelMatrix, viewMatrix, modelViewMatrix, wavingBlockOffset, wavingBlockParam)\
if(block1f >= _WAVING_BLOCK_MIN && block1f <= _WAVING_BLOCK_MAX) {\
pos4f = modelMatrix * pos4f;\
pos4f.xyz /= pos4f.w;\
pos4f.w = 1.0;\
if(dot(pos4f.xyz, pos4f.xyz) < range * range) {\
pos4f.xyz += _computeWavingBlockById(pos4f.xyz, pos4f.xyz + wavingBlockOffset, wavingBlockParam, block1f) * amount * 0.5;\
}\
pos4f = viewMatrix * pos4f;\
}else {\
pos4f = modelViewMatrix * pos4f;\
}
#endif
#endif
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifdef LIB_INCLUDE_WAVING_BLOCKS_FUNCTION
#ifndef _HAS_INCLUDED_WAVING_BLOCKS
#define _HAS_INCLUDED_WAVING_BLOCKS
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK 1
#define _WAVING_BLOCK_TYPE_LEAF_BLOCK_F 1.0
#define _WAVING_BLOCK_TYPE_TALL_GRASS 2
#define _WAVING_BLOCK_TYPE_TALL_GRASS_F 2.0
#define _WAVING_BLOCK_TYPE_CROPS 3
#define _WAVING_BLOCK_TYPE_CROPS_F 3.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM 4
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM_F 4.0
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP 5
#define _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP_F 5.0
#define _WAVING_BLOCK_TYPE_PLANT 6
#define _WAVING_BLOCK_TYPE_PLANT_F 6.0
#define _WAVING_BLOCK_TYPE_SUGARCANE 7
#define _WAVING_BLOCK_TYPE_SUGARCANE_F 7.0
#define _WAVING_BLOCK_TYPE_VINES 8
#define _WAVING_BLOCK_TYPE_VINES_F 8.0
#define _WAVING_BLOCK_TYPE_WATER_STILL 9
#define _WAVING_BLOCK_TYPE_WATER_STILL_F 9.0
#define _WAVING_BLOCK_TYPE_WATER_FLOW 10
#define _WAVING_BLOCK_TYPE_WATER_FLOW_F 10.0
#define _WAVING_BLOCK_TYPE_LILYPAD 11
#define _WAVING_BLOCK_TYPE_LILYPAD_F 11.0
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR 12
#define _WAVING_BLOCK_TYPE_FIRE_FLOOR_F 12.0
#define _WAVING_BLOCK_TYPE_FIRE_WALL 13
#define _WAVING_BLOCK_TYPE_FIRE_WALL_F 13.0
// ignore wall fire for now, they clip
#define _WAVING_BLOCK_MIN _WAVING_BLOCK_TYPE_LEAF_BLOCK_F
#define _WAVING_BLOCK_MAX _WAVING_BLOCK_TYPE_FIRE_FLOOR_F
#ifndef FAKE_SIN
#error the FAKE_SIN function must be defined to use waving blocks
#endif
#define _WAVING_BLOCK_COORD_DERIVE_HACK 0.001
#define _WAVING_BLOCK_COORD_DERIVE_HACK_05 0.0005
#define _WAVING_BLOCK_COORD_DERIVE_HACK_INV 1000.0
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 amp1, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
return ret * amp1;
}
vec3 _computeWavingBlockNoise(in vec3 pos, in vec3 vf_a, in vec3 vf_b, in vec3 amp1, in vec3 amp2, in float timer) {
float fac, fac2;
fac = dot(vec4(pos, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vec3 vf0, d0;
vf0 = timer * vec3(0.0127, 0.0089, 0.0114);
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vec3(0.0063, 0.0224, 0.0015);
d0.y += pos.z;
d0.xz += pos.y;
d0.xz += pos.zx;
d0.xz -= pos.xz;
vec3 ret;
FAKE_SIN(d0, ret)
ret *= fac2;
vec3 move = ret * amp1;
vec3 pos2 = move + pos;
fac = dot(vec4(pos2, timer), vec4(0.5, 0.5, 0.5, 0.0027));
FAKE_SIN(fac, fac2)
fac2 *= 0.04;
fac2 += 0.04;
vf0 = timer * vf_a;
FAKE_SIN(vf0, d0);
d0.xyz += d0.yzx;
d0.xyz += timer * vf_b;
d0.y += pos2.z;
d0.xz += pos2.y;
d0.xz += pos2.zx;
d0.xz -= pos2.xz;
FAKE_SIN(d0, ret)
ret *= fac2;
move += ret * amp2;
return move;
}
vec3 _computeWavingBlockById(in vec3 realPos, in vec3 referencePos, in vec4 wavingBlockParam, in float type) {
int typeInt = int(type);
highp float refY, fractY1, fractY2;
refY = referencePos.y;
switch(typeInt) {
case _WAVING_BLOCK_TYPE_CROPS:
refY += 0.0625625;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
// check if it is the bottom half of the block,
// if vertex is at Y = 0.0 then don't offset
fractY1 = fract(refY + _WAVING_BLOCK_COORD_DERIVE_HACK_05);
fractY2 = fract(refY - _WAVING_BLOCK_COORD_DERIVE_HACK_05);
if(fractY2 > fractY1) {
return vec3(0.0);
}
default:
break;
}
vec3 ret = vec3(0.0);
switch(typeInt) {
case _WAVING_BLOCK_TYPE_LEAF_BLOCK:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(1.0, 0.2, 1.0),
vec3(0.5, 0.1, 0.5),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_TALL_GRASS:
case _WAVING_BLOCK_TYPE_CROPS:
ret = _computeWavingBlockNoise(
referencePos,
vec3(1.0, 0.2, 1.0),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_PLANT:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_BOTTOM:
case _WAVING_BLOCK_TYPE_DOUBLE_PLANT_TOP:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0041, 0.007, 0.0044),
vec3(0.0038, 0.024, 0.0),
vec3(0.8, 0.0, 0.8),
vec3(0.4, 0.0, 0.4),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_SUGARCANE:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.3, 0.0, 0.3),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_VINES:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0040, 0.0064, 0.0043),
vec3(0.0035, 0.0037, 0.0041),
vec3(0.5, 0.3, 0.5),
vec3(0.25, 0.2, 0.25),
wavingBlockParam.y);
break;
case _WAVING_BLOCK_TYPE_WATER_STILL:
break;
case _WAVING_BLOCK_TYPE_WATER_FLOW:
break;
case _WAVING_BLOCK_TYPE_FIRE_FLOOR:
ret = _computeWavingBlockNoise(
referencePos,
vec3(0.0105, 0.0096, 0.0087),
vec3(0.0063, 0.0097, 0.0156),
vec3(1.2, 0.4, 1.2),
vec3(0.8, 0.8, 0.8),
wavingBlockParam.y);
break;
default:
break;
}
return ret;
}
#define COMPUTE_WAVING_BLOCKS(pos4f, amount, range, block1f, modelMatrix, viewMatrix, modelViewMatrix, wavingBlockOffset, wavingBlockParam)\
if(block1f >= _WAVING_BLOCK_MIN && block1f <= _WAVING_BLOCK_MAX) {\
pos4f = modelMatrix * pos4f;\
pos4f.xyz /= pos4f.w;\
pos4f.w = 1.0;\
if(dot(pos4f.xyz, pos4f.xyz) < range * range) {\
pos4f.xyz += _computeWavingBlockById(pos4f.xyz, pos4f.xyz + wavingBlockOffset, wavingBlockParam, block1f) * amount * 0.5;\
}\
pos4f = viewMatrix * pos4f;\
}else {\
pos4f = modelViewMatrix * pos4f;\
}
#endif
#endif

View File

@ -1,160 +1,160 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
precision highp sampler2DShadow;
in vec2 v_position2f;
layout(location = 0) out float output1f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2DShadow u_sunShadowDepthTexture;
uniform sampler2D u_ditherTexture;
uniform mat4 u_inverseViewProjMatrix4f;
uniform vec2 u_ditherScale2f;
uniform vec3 u_eyePosition3f;
uniform float u_sampleStep1f;
#define SAMPLES_PER_STEP 8.0
#define SAMPLES_PER_STEP_1 0.125
#ifdef COMPILE_SUN_SHADOW_LOD0
uniform mat4 u_sunShadowMatrixLOD04f;
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
uniform mat4 u_sunShadowMatrixLOD24f;
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
float shadow(in vec3 coords) {
vec4 shadowSpacePosition = u_sunShadowMatrixLOD04f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowSpacePosition = u_sunShadowMatrixLOD14f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 1.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowSpacePosition = u_sunShadowMatrixLOD24f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 2.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#endif
return -1.0;
}
#define STEP2DST(stepNum) (stepNum * stepNum * 0.06 + stepNum * 0.05)
void main() {
output1f = 0.0;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
return;
}
vec4 fragPos4f = vec4(v_position2f, depth, 1.0);
fragPos4f.xyz *= 2.0;
fragPos4f.xyz -= 1.0;
fragPos4f = u_inverseViewProjMatrix4f * fragPos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
fragPos4f.xyz -= u_eyePosition3f;
float viewDist = length(fragPos4f.xyz);
fragPos4f.xyz /= viewDist;
float sampleNum = textureLod(u_ditherTexture, u_ditherScale2f * v_position2f, 0.0).r;
sampleNum += u_sampleStep1f * SAMPLES_PER_STEP + 1.0;
float cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
precision highp sampler2DShadow;
in vec2 v_position2f;
layout(location = 0) out float output1f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2DShadow u_sunShadowDepthTexture;
uniform sampler2D u_ditherTexture;
uniform mat4 u_inverseViewProjMatrix4f;
uniform vec2 u_ditherScale2f;
uniform vec3 u_eyePosition3f;
uniform float u_sampleStep1f;
#define SAMPLES_PER_STEP 8.0
#define SAMPLES_PER_STEP_1 0.125
#ifdef COMPILE_SUN_SHADOW_LOD0
uniform mat4 u_sunShadowMatrixLOD04f;
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
uniform mat4 u_sunShadowMatrixLOD04f;
uniform mat4 u_sunShadowMatrixLOD14f;
uniform mat4 u_sunShadowMatrixLOD24f;
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
float shadow(in vec3 coords) {
vec4 shadowSpacePosition = u_sunShadowMatrixLOD04f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowSpacePosition = u_sunShadowMatrixLOD14f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 1.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowSpacePosition = u_sunShadowMatrixLOD24f * vec4(coords, 1.0);
if(shadowSpacePosition.xyz == clamp(shadowSpacePosition.xyz, vec3(0.005), vec3(0.995))) {
shadowSpacePosition.y += 2.0;
shadowSpacePosition.y *= SUN_SHADOW_MAP_FRAC;
return textureLod(u_sunShadowDepthTexture, shadowSpacePosition.xyz, 0.0);
}
#endif
return -1.0;
}
#define STEP2DST(stepNum) (stepNum * stepNum * 0.06 + stepNum * 0.05)
void main() {
output1f = 0.0;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
return;
}
vec4 fragPos4f = vec4(v_position2f, depth, 1.0);
fragPos4f.xyz *= 2.0;
fragPos4f.xyz -= 1.0;
fragPos4f = u_inverseViewProjMatrix4f * fragPos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
fragPos4f.xyz -= u_eyePosition3f;
float viewDist = length(fragPos4f.xyz);
fragPos4f.xyz /= viewDist;
float sampleNum = textureLod(u_ditherTexture, u_ditherScale2f * v_position2f, 0.0).r;
sampleNum += u_sampleStep1f * SAMPLES_PER_STEP + 1.0;
float cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
sampleNum += 1.0;
cloudSample = STEP2DST(sampleNum);
if(cloudSample > viewDist) return;
cloudSample = shadow(u_eyePosition3f + fragPos4f.xyz * cloudSample);
if(cloudSample < 0.0) return;
output1f += cloudSample * SAMPLES_PER_STEP_1;
}

View File

@ -1,29 +1,29 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec3 a_position3f;
uniform mat4 u_modelViewProjMatrix4f;
void main() {
gl_Position = u_modelViewProjMatrix4f * vec4(a_position3f, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec3 a_position3f;
uniform mat4 u_modelViewProjMatrix4f;
void main() {
gl_Position = u_modelViewProjMatrix4f * vec4(a_position3f, 1.0);
}

View File

@ -1,88 +1,88 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_inverseViewMatrix4f;
uniform vec2 u_viewportSize2f;
uniform vec3 u_lightPosition3f;
uniform vec3 u_lightColor3f;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
void main() {
vec2 v_position2f = gl_FragCoord.xy * u_viewportSize2f;
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
discard;
}
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
worldSpacePosition.xyz *= 2.0;
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
vec4 worldSpacePosition2 = worldSpacePosition;
worldSpacePosition = u_inverseViewMatrix4f * worldSpacePosition;
vec3 lightDist = (worldSpacePosition.xyz / worldSpacePosition.w) - u_lightPosition3f;
vec3 color3f = u_lightColor3f / dot(lightDist, lightDist);
if(color3f.r + color3f.g + color3f.b < 0.025) {
discard;
}
vec4 sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
lightmapCoords2f.y = sampleVar4f.a;
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
vec3 lightDir3f = normalize(lightDist);
lightDir3f = materialData3f.b == 1.0 ? worldSpaceNormal : -lightDir3f;
if(dot(lightDir3f, worldSpaceNormal) <= 0.0) {
discard;
}
diffuseColor3f *= diffuseColor3f;
worldSpacePosition2 = u_inverseViewMatrix4f * vec4(worldSpacePosition2.xyz / worldSpacePosition2.w, 0.0);
worldSpacePosition2.xyz = normalize(worldSpacePosition2.xyz);
output4f = vec4(eaglercraftLighting(diffuseColor3f, color3f, -worldSpacePosition2.xyz, lightDir3f, worldSpaceNormal, materialData3f), 0.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_inverseViewMatrix4f;
uniform vec2 u_viewportSize2f;
uniform vec3 u_lightPosition3f;
uniform vec3 u_lightColor3f;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
void main() {
vec2 v_position2f = gl_FragCoord.xy * u_viewportSize2f;
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
if(depth < 0.00001) {
discard;
}
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
worldSpacePosition.xyz *= 2.0;
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
vec4 worldSpacePosition2 = worldSpacePosition;
worldSpacePosition = u_inverseViewMatrix4f * worldSpacePosition;
vec3 lightDist = (worldSpacePosition.xyz / worldSpacePosition.w) - u_lightPosition3f;
vec3 color3f = u_lightColor3f / dot(lightDist, lightDist);
if(color3f.r + color3f.g + color3f.b < 0.025) {
discard;
}
vec4 sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
lightmapCoords2f.y = sampleVar4f.a;
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
vec3 lightDir3f = normalize(lightDist);
lightDir3f = materialData3f.b == 1.0 ? worldSpaceNormal : -lightDir3f;
if(dot(lightDir3f, worldSpaceNormal) <= 0.0) {
discard;
}
diffuseColor3f *= diffuseColor3f;
worldSpacePosition2 = u_inverseViewMatrix4f * vec4(worldSpacePosition2.xyz / worldSpacePosition2.w, 0.0);
worldSpacePosition2.xyz = normalize(worldSpacePosition2.xyz);
output4f = vec4(eaglercraftLighting(diffuseColor3f, color3f, -worldSpacePosition2.xyz, lightDir3f, worldSpaceNormal, materialData3f), 0.0);
}

View File

@ -1,102 +1,102 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseViewMatrix4f;
uniform mat4 u_inverseProjectionMatrix4f;
#ifdef COMPILE_SUN_SHADOW
uniform sampler2D u_sunShadowTexture;
#endif
uniform vec3 u_sunDirection3f;
uniform vec3 u_sunColor3f;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
void main() {
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
#ifdef COMPILE_SUN_SHADOW
#ifdef COMPILE_COLORED_SHADOW
vec4 shadow = textureLod(u_sunShadowTexture, v_position2f, 0.0);
if(shadow.a < 0.05) {
discard;
}
#else
vec3 shadow = vec3(textureLod(u_sunShadowTexture, v_position2f, 0.0).r);
if(shadow.r < 0.05) {
discard;
}
#endif
#endif
vec4 sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
#ifndef COMPILE_SUN_SHADOW
vec3 shadow = vec3(sampleVar4f.a, 0.0, 0.0);
if(shadow.r < 0.5) {
discard;
}
shadow = vec3(max(shadow.r * 2.0 - 1.0, 0.0));
#endif
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
lightmapCoords2f.y = sampleVar4f.a;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
#ifndef COMPILE_SUN_SHADOW
if(depth < 0.00001) {
discard;
}
#endif
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
worldSpacePosition.xyz *= 2.0;
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
worldSpacePosition = u_inverseViewMatrix4f * vec4(worldSpacePosition.xyz / worldSpacePosition.w, 0.0);
diffuseColor3f *= diffuseColor3f;
output4f = vec4(eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f), 0.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_gbufferColorTexture;
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_metalsLUT;
uniform mat4 u_inverseViewMatrix4f;
uniform mat4 u_inverseProjectionMatrix4f;
#ifdef COMPILE_SUN_SHADOW
uniform sampler2D u_sunShadowTexture;
#endif
uniform vec3 u_sunDirection3f;
uniform vec3 u_sunColor3f;
#define LIB_INCLUDE_PBR_LIGHTING_FUNCTION
#EAGLER INCLUDE (3) "eagler:glsl/deferred/lib/pbr_lighting.glsl"
void main() {
vec3 diffuseColor3f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
vec3 materialData3f;
#ifdef COMPILE_SUN_SHADOW
#ifdef COMPILE_COLORED_SHADOW
vec4 shadow = textureLod(u_sunShadowTexture, v_position2f, 0.0);
if(shadow.a < 0.05) {
discard;
}
#else
vec3 shadow = vec3(textureLod(u_sunShadowTexture, v_position2f, 0.0).r);
if(shadow.r < 0.05) {
discard;
}
#endif
#endif
vec4 sampleVar4f = textureLod(u_gbufferNormalTexture, v_position2f, 0.0);
#ifndef COMPILE_SUN_SHADOW
vec3 shadow = vec3(sampleVar4f.a, 0.0, 0.0);
if(shadow.r < 0.5) {
discard;
}
shadow = vec3(max(shadow.r * 2.0 - 1.0, 0.0));
#endif
normalVector3f.xyz = sampleVar4f.rgb * 2.0 - 1.0;
lightmapCoords2f.y = sampleVar4f.a;
float depth = textureLod(u_gbufferDepthTexture, v_position2f, 0.0).r;
#ifndef COMPILE_SUN_SHADOW
if(depth < 0.00001) {
discard;
}
#endif
sampleVar4f = textureLod(u_gbufferColorTexture, v_position2f, 0.0);
diffuseColor3f.rgb = sampleVar4f.rgb;
lightmapCoords2f.x = sampleVar4f.a;
materialData3f = textureLod(u_gbufferMaterialTexture, v_position2f, 0.0).rgb;
vec3 worldSpaceNormal = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
vec4 worldSpacePosition = vec4(v_position2f, depth, 1.0);
worldSpacePosition.xyz *= 2.0;
worldSpacePosition.xyz -= 1.0;
worldSpacePosition = u_inverseProjectionMatrix4f * worldSpacePosition;
worldSpacePosition = u_inverseViewMatrix4f * vec4(worldSpacePosition.xyz / worldSpacePosition.w, 0.0);
diffuseColor3f *= diffuseColor3f;
output4f = vec4(eaglercraftLighting(diffuseColor3f, u_sunColor3f * shadow.rgb, normalize(-worldSpacePosition.xyz), u_sunDirection3f, worldSpaceNormal, materialData3f), 0.0);
}

View File

@ -1,9 +1,9 @@
Metal,ID,Nr,Ng,Nb,Kr,Kg,Kb
Iron,230,2.9114,2.9497,2.5845,3.0893,2.9318,2.7670
Gold,231,0.18299,0.42108,1.3734,3.4242,2.3459,1.7704
Aluminum,232,1.3456,0.96521,0.61722,7.4746,6.3995,5.3031
Chrome,233,3.1071,3.1812,2.3230,3.3314,3.3291,3.1350
Copper,234,0.27105,0.67693,1.3164,3.6092,2.6248,2.2921
Lead,235,1.9100,1.8300,1.4400,3.5100,3.4000,3.1800
Platinum,236,2.3757,2.0847,1.8453,4.2655,3.7153,3.1365
Metal,ID,Nr,Ng,Nb,Kr,Kg,Kb
Iron,230,2.9114,2.9497,2.5845,3.0893,2.9318,2.7670
Gold,231,0.18299,0.42108,1.3734,3.4242,2.3459,1.7704
Aluminum,232,1.3456,0.96521,0.61722,7.4746,6.3995,5.3031
Chrome,233,3.1071,3.1812,2.3230,3.3314,3.3291,3.1350
Copper,234,0.27105,0.67693,1.3164,3.6092,2.6248,2.2921
Lead,235,1.9100,1.8300,1.4400,3.5100,3.4000,3.1800
Platinum,236,2.3757,2.0847,1.8453,4.2655,3.7153,3.1365
Silver,237,0.15943,0.14512,0.13547,3.9291,3.1900,2.3808
1 Metal ID Nr Ng Nb Kr Kg Kb
2 Iron 230 2.9114 2.9497 2.5845 3.0893 2.9318 2.7670
3 Gold 231 0.18299 0.42108 1.3734 3.4242 2.3459 1.7704
4 Aluminum 232 1.3456 0.96521 0.61722 7.4746 6.3995 5.3031
5 Chrome 233 3.1071 3.1812 2.3230 3.3314 3.3291 3.1350
6 Copper 234 0.27105 0.67693 1.3164 3.6092 2.6248 2.2921
7 Lead 235 1.9100 1.8300 1.4400 3.5100 3.4000 3.1800
8 Platinum 236 2.3757 2.0847 1.8453 4.2655 3.7153 3.1365
9 Silver 237 0.15943 0.14512 0.13547 3.9291 3.1900 2.3808

View File

@ -1,52 +1,52 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
in vec3 v_position3f;
layout(location = 0) out vec4 output4f;
uniform vec3 u_moonColor3f;
uniform vec3 u_lightDir3f;
uniform sampler2D u_moonTextures;
uniform sampler2D u_cloudsTexture;
void main() {
gl_FragDepth = 0.0;
vec4 color4f = texture(u_moonTextures, v_position2f);
if(color4f.a < 0.99) {
discard;
}
vec3 moonNormal3f;
moonNormal3f.xy = color4f.rg * 2.0 - 1.0;
moonNormal3f.z = sqrt(1.0 - dot(moonNormal3f.xy, moonNormal3f.xy));
float NdotV = dot(moonNormal3f, u_lightDir3f);
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * mix(max(NdotV, 0.0), max(NdotV + 0.45, 0.0) * 0.5f, max(u_lightDir3f.z * u_lightDir3f.z * -u_lightDir3f.z, 0.0))), 0.0);
vec3 viewDir = normalize(v_position3f);
if(viewDir.y < 0.01) {
return;
}
vec2 cloudSampleCoord2f = (viewDir.xz / (viewDir.y + 1.0)) * 0.975 * 0.5 + 0.5;
vec4 cloudSample = textureLod(u_cloudsTexture, cloudSampleCoord2f, 0.0);
output4f.rgb = mix(output4f.rgb, output4f.rgb * max(cloudSample.a * 1.25 - 0.25, 0.0), smoothstep(0.0, 1.0, min(viewDir.y * 8.0, 1.0)));
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
in vec3 v_position3f;
layout(location = 0) out vec4 output4f;
uniform vec3 u_moonColor3f;
uniform vec3 u_lightDir3f;
uniform sampler2D u_moonTextures;
uniform sampler2D u_cloudsTexture;
void main() {
gl_FragDepth = 0.0;
vec4 color4f = texture(u_moonTextures, v_position2f);
if(color4f.a < 0.99) {
discard;
}
vec3 moonNormal3f;
moonNormal3f.xy = color4f.rg * 2.0 - 1.0;
moonNormal3f.z = sqrt(1.0 - dot(moonNormal3f.xy, moonNormal3f.xy));
float NdotV = dot(moonNormal3f, u_lightDir3f);
output4f = vec4(u_moonColor3f * (color4f.b * color4f.b * mix(max(NdotV, 0.0), max(NdotV + 0.45, 0.0) * 0.5f, max(u_lightDir3f.z * u_lightDir3f.z * -u_lightDir3f.z, 0.0))), 0.0);
vec3 viewDir = normalize(v_position3f);
if(viewDir.y < 0.01) {
return;
}
vec2 cloudSampleCoord2f = (viewDir.xz / (viewDir.y + 1.0)) * 0.975 * 0.5 + 0.5;
vec4 cloudSample = textureLod(u_cloudsTexture, cloudSampleCoord2f, 0.0);
output4f.rgb = mix(output4f.rgb, output4f.rgb * max(cloudSample.a * 1.25 - 0.25, 0.0), smoothstep(0.0, 1.0, min(viewDir.y * 8.0, 1.0)));
}

View File

@ -1,37 +1,37 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
out vec3 v_position3f;
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform mat4 u_projMatrix4f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
v_position3f = (u_modelMatrix4f * vec4(a_position2f, -13.0, 1.0)).xyz;
gl_Position = u_viewMatrix4f * vec4(v_position3f, 0.0);
gl_Position = u_projMatrix4f * vec4(gl_Position.xyz, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
out vec2 v_position2f;
out vec3 v_position3f;
uniform mat4 u_modelMatrix4f;
uniform mat4 u_viewMatrix4f;
uniform mat4 u_projMatrix4f;
void main() {
v_position2f = a_position2f * 0.5 + 0.5;
v_position3f = (u_modelMatrix4f * vec4(a_position2f, -13.0, 1.0)).xyz;
gl_Position = u_viewMatrix4f * vec4(v_position3f, 0.0);
gl_Position = u_projMatrix4f * vec4(gl_Position.xyz, 1.0);
}

View File

@ -1,50 +1,50 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_inputTexture;
uniform vec2 u_sampleOffset2f;
uniform vec4 u_outputSize4f;
void main() {
vec2 alignedUV = (floor(v_position2f * u_outputSize4f.xy) + 0.5) * u_outputSize4f.zw;
vec4 accum = textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 7.0, 0.0) * 0.0005;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 6.0, 0.0) * 0.0024;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 5.0, 0.0) * 0.0092;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 4.0, 0.0) * 0.0278;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 3.0, 0.0) * 0.0656;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 2.0, 0.0) * 0.1210;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f, 0.0) * 0.1747;
accum += textureLod(u_inputTexture, alignedUV, 0.0) * 0.1974;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f, 0.0) * 0.1747;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 2.0, 0.0) * 0.1210;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 3.0, 0.0) * 0.0656;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 4.0, 0.0) * 0.0278;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 5.0, 0.0) * 0.0092;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 6.0, 0.0) * 0.0024;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 7.0, 0.0) * 0.0005;
output4f = accum;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_inputTexture;
uniform vec2 u_sampleOffset2f;
uniform vec4 u_outputSize4f;
void main() {
vec2 alignedUV = (floor(v_position2f * u_outputSize4f.xy) + 0.5) * u_outputSize4f.zw;
vec4 accum = textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 7.0, 0.0) * 0.0005;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 6.0, 0.0) * 0.0024;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 5.0, 0.0) * 0.0092;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 4.0, 0.0) * 0.0278;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 3.0, 0.0) * 0.0656;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f * 2.0, 0.0) * 0.1210;
accum += textureLod(u_inputTexture, alignedUV - u_sampleOffset2f, 0.0) * 0.1747;
accum += textureLod(u_inputTexture, alignedUV, 0.0) * 0.1974;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f, 0.0) * 0.1747;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 2.0, 0.0) * 0.1210;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 3.0, 0.0) * 0.0656;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 4.0, 0.0) * 0.0278;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 5.0, 0.0) * 0.0092;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 6.0, 0.0) * 0.0024;
accum += textureLod(u_inputTexture, alignedUV + u_sampleOffset2f * 7.0, 0.0) * 0.0005;
output4f = accum;
}

View File

@ -1,50 +1,50 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_lightingHDRFramebufferTexture;
uniform sampler2D u_framebufferLumaAvgInput;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform vec4 u_outputSize4f;
void main() {
float exposure = textureLod(u_framebufferLumaAvgInput, vec2(0.5), 0.0).r;
float emission = 0.0;
vec2 alignedUV = (floor(v_position2f * u_outputSize4f.xy) + 0.5) * u_outputSize4f.zw;
vec4 inputColor = textureLod(u_lightingHDRFramebufferTexture, alignedUV, 0.0);
if(inputColor.a > 0.0) {
emission = textureLod(u_gbufferMaterialTexture, alignedUV, 0.0).b;
}else {
emission = textureLod(u_gbufferDepthTexture, alignedUV, 0.0).r <= 0.0000001 ? 10.0 : 0.0;
}
float f = dot(inputColor.rgb, vec3(0.2126, 0.7152, 0.0722)) * (5.0 + emission * 15.0);
if(f > 2.0 + exposure) {
output4f = vec4(min(inputColor.rgb, vec3(5.0)) * (0.75 + exposure * 1.5) * min(f - 2.0 - exposure, 1.0), 1.0);
}else {
output4f = vec4(0.0);
}
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_lightingHDRFramebufferTexture;
uniform sampler2D u_framebufferLumaAvgInput;
uniform sampler2D u_gbufferMaterialTexture;
uniform sampler2D u_gbufferDepthTexture;
uniform vec4 u_outputSize4f;
void main() {
float exposure = textureLod(u_framebufferLumaAvgInput, vec2(0.5), 0.0).r;
float emission = 0.0;
vec2 alignedUV = (floor(v_position2f * u_outputSize4f.xy) + 0.5) * u_outputSize4f.zw;
vec4 inputColor = textureLod(u_lightingHDRFramebufferTexture, alignedUV, 0.0);
if(inputColor.a > 0.0) {
emission = textureLod(u_gbufferMaterialTexture, alignedUV, 0.0).b;
}else {
emission = textureLod(u_gbufferDepthTexture, alignedUV, 0.0).r <= 0.0000001 ? 10.0 : 0.0;
}
float f = dot(inputColor.rgb, vec3(0.2126, 0.7152, 0.0722)) * (5.0 + emission * 15.0);
if(f > 2.0 + exposure) {
output4f = vec4(min(inputColor.rgb, vec3(5.0)) * (0.75 + exposure * 1.5) * min(f - 2.0 - exposure, 1.0), 1.0);
}else {
output4f = vec4(0.0);
}
}

View File

@ -1,46 +1,46 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float exposureOut1f;
uniform sampler2D u_inputTexture;
uniform vec4 u_sampleOffset4f;
#ifdef CALCULATE_LUMINANCE
#define TAKE_SAMPLE(samplerIn, posIn) dot(textureLod(samplerIn, posIn, 0.0).rgb, vec3(0.299, 0.587, 0.114))
#else
#define TAKE_SAMPLE(samplerIn, posIn) textureLod(samplerIn, posIn, 0.0).r
#endif
void main() {
vec2 pixelPos = floor(v_position2f / u_sampleOffset4f.xy);
float a = min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.25, 0.25)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.75, 0.25)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.75, 0.75)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.25, 0.75)) * u_sampleOffset4f.zw), 250.0);
exposureOut1f = a * 0.25;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float exposureOut1f;
uniform sampler2D u_inputTexture;
uniform vec4 u_sampleOffset4f;
#ifdef CALCULATE_LUMINANCE
#define TAKE_SAMPLE(samplerIn, posIn) dot(textureLod(samplerIn, posIn, 0.0).rgb, vec3(0.299, 0.587, 0.114))
#else
#define TAKE_SAMPLE(samplerIn, posIn) textureLod(samplerIn, posIn, 0.0).r
#endif
void main() {
vec2 pixelPos = floor(v_position2f / u_sampleOffset4f.xy);
float a = min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.25, 0.25)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.75, 0.25)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.75, 0.75)) * u_sampleOffset4f.zw), 250.0);
a += min(TAKE_SAMPLE(u_inputTexture, (pixelPos + vec2(0.25, 0.75)) * u_sampleOffset4f.zw), 250.0);
exposureOut1f = a * 0.25;
}

View File

@ -1,42 +1,42 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float exposureOut1f;
uniform sampler2D u_inputTexture;
uniform vec2 u_inputSize2f;
void main() {
float a = 0.0;
float b = 0.0;
for(vec2 v = vec2(0.0, u_inputSize2f * 0.5); v.y < 1.0; v.y += u_inputSize2f.y) {
for(v.x = u_inputSize2f.x * 0.5; v.x < 1.0; v.x += u_inputSize2f.x) {
a += textureLod(u_inputTexture, v, 0.0).r * (1.0 - length(v - 0.5));
b += 1.0;
}
}
exposureOut1f = a / b;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float exposureOut1f;
uniform sampler2D u_inputTexture;
uniform vec2 u_inputSize2f;
void main() {
float a = 0.0;
float b = 0.0;
for(vec2 v = vec2(0.0, u_inputSize2f * 0.5); v.y < 1.0; v.y += u_inputSize2f.y) {
for(v.x = u_inputSize2f.x * 0.5; v.x < 1.0; v.x += u_inputSize2f.x) {
a += textureLod(u_inputTexture, v, 0.0).r * (1.0 - length(v - 0.5));
b += 1.0;
}
}
exposureOut1f = a / b;
}

View File

@ -1,275 +1,275 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/*
* This file was modified by lax1dude to remove dead code
*
* Original: https://gist.github.com/kosua20/0c506b81b3812ac900048059d2383126
*
*/
/*
* ============================================================================
*
*
* NVIDIA FXAA 3.11 by TIMOTHY LOTTES
*
*
* ------------------------------------------------------------------------------
* COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
* ------------------------------------------------------------------------------
* TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
* *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
* OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
* OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
* CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
* LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
* OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
* THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGES.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_screenTexture;
uniform vec2 u_screenSize2f;
#ifndef FXAA_GREEN_AS_LUMA
// For those using non-linear color,
// and either not able to get luma in alpha, or not wanting to,
// this enables FXAA to run using green as a proxy for luma.
// So with this enabled, no need to pack luma in alpha.
//
// This will turn off AA on anything which lacks some amount of green.
// Pure red and blue or combination of only R and B, will get no AA.
//
// Might want to lower the settings for both,
// fxaaConsoleEdgeThresholdMin
// fxaaQualityEdgeThresholdMin
// In order to insure AA does not get turned off on colors
// which contain a minor amount of green.
//
// 1 = On.
// 0 = Off.
//
#define FXAA_GREEN_AS_LUMA 0
#endif
#ifndef FXAA_DISCARD
// 1 = Use discard on pixels which don't need AA.
// 0 = Return unchanged color on pixels which don't need AA.
#define FXAA_DISCARD 0
#endif
/*============================================================================
API PORTING
============================================================================*/
#define FxaaBool bool
#define FxaaDiscard discard
#define FxaaFloat float
#define FxaaFloat2 vec2
#define FxaaFloat3 vec3
#define FxaaFloat4 vec4
#define FxaaHalf float
#define FxaaHalf2 vec2
#define FxaaHalf3 vec3
#define FxaaHalf4 vec4
#define FxaaInt2 ivec2
#define FxaaSat(x) clamp(x, 0.0, 1.0)
#define FxaaTex sampler2D
/*--------------------------------------------------------------------------*/
#define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaLuma(rgba) rgba.a
/*============================================================================
FXAA3 CONSOLE - PC VERSION
============================================================================*/
/*--------------------------------------------------------------------------*/
FxaaFloat4 FxaaPixelShader(
// See FXAA Quality FxaaPixelShader() source for docs on Inputs!
//
// Use noperspective interpolation here (turn off perspective interpolation).
// {xy} = center of pixel
FxaaFloat2 pos,
//
// Used only for FXAA Console, and not used on the 360 version.
// Use noperspective interpolation here (turn off perspective interpolation).
// {xy__} = upper left of pixel
// {__zw} = lower right of pixel
FxaaFloat4 fxaaConsolePosPos,
//
// Input color texture.
// {rgb_} = color in linear or perceptual color space
// if (FXAA_GREEN_AS_LUMA == 0)
// {___a} = luma in perceptual color space (not linear)
FxaaTex tex,
//
// Only used on FXAA Console.
// This must be from a constant/uniform.
// This effects sub-pixel AA quality and inversely sharpness.
// Where N ranges between,
// N = 0.50 (default)
// N = 0.33 (sharper)
// {x___} = -N/screenWidthInPixels
// {_y__} = -N/screenHeightInPixels
// {__z_} = N/screenWidthInPixels
// {___w} = N/screenHeightInPixels
FxaaFloat4 fxaaConsoleRcpFrameOpt,
//
// Only used on FXAA Console.
// Not used on 360, but used on PS3 and PC.
// This must be from a constant/uniform.
// {x___} = -2.0/screenWidthInPixels
// {_y__} = -2.0/screenHeightInPixels
// {__z_} = 2.0/screenWidthInPixels
// {___w} = 2.0/screenHeightInPixels
FxaaFloat4 fxaaConsoleRcpFrameOpt2,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.
// It is here now to allow easier tuning.
// This does not effect PS3, as this needs to be compiled in.
// Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.
// Due to the PS3 being ALU bound,
// there are only three safe values here: 2 and 4 and 8.
// These options use the shaders ability to a free *|/ by 2|4|8.
// For all other platforms can be a non-power of two.
// 8.0 is sharper (default!!!)
// 4.0 is softer
// 2.0 is really soft (good only for vector graphics inputs)
FxaaFloat fxaaConsoleEdgeSharpness,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.
// It is here now to allow easier tuning.
// This does not effect PS3, as this needs to be compiled in.
// Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.
// Due to the PS3 being ALU bound,
// there are only two safe values here: 1/4 and 1/8.
// These options use the shaders ability to a free *|/ by 2|4|8.
// The console setting has a different mapping than the quality setting.
// Other platforms can use other values.
// 0.125 leaves less aliasing, but is softer (default!!!)
// 0.25 leaves more aliasing, and is sharper
FxaaFloat fxaaConsoleEdgeThreshold,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.
// It is here now to allow easier tuning.
// Trims the algorithm from processing darks.
// The console setting has a different mapping than the quality setting.
// This does not apply to PS3,
// PS3 was simplified to avoid more shader instructions.
// 0.06 - faster but more aliasing in darks
// 0.05 - default
// 0.04 - slower and less aliasing in darks
// Special notes when using FXAA_GREEN_AS_LUMA,
// Likely want to set this to zero.
// As colors that are mostly not-green
// will appear very dark in the green channel!
// Tune by looking at mostly non-green content,
// then start at zero and increase until aliasing is a problem.
FxaaFloat fxaaConsoleEdgeThresholdMin
) {
/*--------------------------------------------------------------------------*/
FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));
FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));
FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));
FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));
/*--------------------------------------------------------------------------*/
FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);
FxaaFloat lumaM = FxaaLuma(rgbyM);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);
lumaNe += 1.0/384.0;
FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);
FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMinM = min(lumaMin, lumaM);
FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
FxaaFloat lumaMaxM = max(lumaMax, lumaM);
FxaaFloat dirSwMinusNe = lumaSw - lumaNe;
FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;
FxaaFloat dirSeMinusNw = lumaSe - lumaNw;
if(lumaMaxSubMinM < lumaMaxScaledClamped)
{
#if (FXAA_DISCARD == 1)
FxaaDiscard;
#else
return rgbyM;
#endif
}
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir;
dir.x = dirSwMinusNe + dirSeMinusNw;
dir.y = dirSwMinusNe - dirSeMinusNw;
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir1 = normalize(dir.xy);
FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);
FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);
/*--------------------------------------------------------------------------*/
FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir2x = dir2 * fxaaConsoleRcpFrameOpt2.zw;
FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2x);
FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2x);
/*--------------------------------------------------------------------------*/
FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;
FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
/*--------------------------------------------------------------------------*/
float lumaB = FxaaLuma(rgbyB);
if((lumaB < lumaMin) || (lumaB > lumaMax)) rgbyB.xyz = rgbyA.xyz * 0.5;
return rgbyB;
}
/*==========================================================================*/
#define edgeSharpness 3.0
#define edgeThreshold 0.15
#define edgeThresholdMin 0.05
void main(){
vec2 screenSize05 = 0.5 * u_screenSize2f;
vec4 posPos;
posPos.xy = v_position2f;
posPos.zw = v_position2f + u_screenSize2f;
vec4 rcpFrameOpt;
rcpFrameOpt.xy = -screenSize05;
rcpFrameOpt.zw = screenSize05;
output4f = vec4(FxaaPixelShader(v_position2f + screenSize05, posPos, u_screenTexture, rcpFrameOpt, rcpFrameOpt * 4.0, edgeSharpness, edgeThreshold, edgeThresholdMin).rgb, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/*
* This file was modified by lax1dude to remove dead code
*
* Original: https://gist.github.com/kosua20/0c506b81b3812ac900048059d2383126
*
*/
/*
* ============================================================================
*
*
* NVIDIA FXAA 3.11 by TIMOTHY LOTTES
*
*
* ------------------------------------------------------------------------------
* COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
* ------------------------------------------------------------------------------
* TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
* *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
* OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
* OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
* CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
* LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
* OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
* THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGES.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_screenTexture;
uniform vec2 u_screenSize2f;
#ifndef FXAA_GREEN_AS_LUMA
// For those using non-linear color,
// and either not able to get luma in alpha, or not wanting to,
// this enables FXAA to run using green as a proxy for luma.
// So with this enabled, no need to pack luma in alpha.
//
// This will turn off AA on anything which lacks some amount of green.
// Pure red and blue or combination of only R and B, will get no AA.
//
// Might want to lower the settings for both,
// fxaaConsoleEdgeThresholdMin
// fxaaQualityEdgeThresholdMin
// In order to insure AA does not get turned off on colors
// which contain a minor amount of green.
//
// 1 = On.
// 0 = Off.
//
#define FXAA_GREEN_AS_LUMA 0
#endif
#ifndef FXAA_DISCARD
// 1 = Use discard on pixels which don't need AA.
// 0 = Return unchanged color on pixels which don't need AA.
#define FXAA_DISCARD 0
#endif
/*============================================================================
API PORTING
============================================================================*/
#define FxaaBool bool
#define FxaaDiscard discard
#define FxaaFloat float
#define FxaaFloat2 vec2
#define FxaaFloat3 vec3
#define FxaaFloat4 vec4
#define FxaaHalf float
#define FxaaHalf2 vec2
#define FxaaHalf3 vec3
#define FxaaHalf4 vec4
#define FxaaInt2 ivec2
#define FxaaSat(x) clamp(x, 0.0, 1.0)
#define FxaaTex sampler2D
/*--------------------------------------------------------------------------*/
#define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaLuma(rgba) rgba.a
/*============================================================================
FXAA3 CONSOLE - PC VERSION
============================================================================*/
/*--------------------------------------------------------------------------*/
FxaaFloat4 FxaaPixelShader(
// See FXAA Quality FxaaPixelShader() source for docs on Inputs!
//
// Use noperspective interpolation here (turn off perspective interpolation).
// {xy} = center of pixel
FxaaFloat2 pos,
//
// Used only for FXAA Console, and not used on the 360 version.
// Use noperspective interpolation here (turn off perspective interpolation).
// {xy__} = upper left of pixel
// {__zw} = lower right of pixel
FxaaFloat4 fxaaConsolePosPos,
//
// Input color texture.
// {rgb_} = color in linear or perceptual color space
// if (FXAA_GREEN_AS_LUMA == 0)
// {___a} = luma in perceptual color space (not linear)
FxaaTex tex,
//
// Only used on FXAA Console.
// This must be from a constant/uniform.
// This effects sub-pixel AA quality and inversely sharpness.
// Where N ranges between,
// N = 0.50 (default)
// N = 0.33 (sharper)
// {x___} = -N/screenWidthInPixels
// {_y__} = -N/screenHeightInPixels
// {__z_} = N/screenWidthInPixels
// {___w} = N/screenHeightInPixels
FxaaFloat4 fxaaConsoleRcpFrameOpt,
//
// Only used on FXAA Console.
// Not used on 360, but used on PS3 and PC.
// This must be from a constant/uniform.
// {x___} = -2.0/screenWidthInPixels
// {_y__} = -2.0/screenHeightInPixels
// {__z_} = 2.0/screenWidthInPixels
// {___w} = 2.0/screenHeightInPixels
FxaaFloat4 fxaaConsoleRcpFrameOpt2,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.
// It is here now to allow easier tuning.
// This does not effect PS3, as this needs to be compiled in.
// Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.
// Due to the PS3 being ALU bound,
// there are only three safe values here: 2 and 4 and 8.
// These options use the shaders ability to a free *|/ by 2|4|8.
// For all other platforms can be a non-power of two.
// 8.0 is sharper (default!!!)
// 4.0 is softer
// 2.0 is really soft (good only for vector graphics inputs)
FxaaFloat fxaaConsoleEdgeSharpness,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.
// It is here now to allow easier tuning.
// This does not effect PS3, as this needs to be compiled in.
// Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.
// Due to the PS3 being ALU bound,
// there are only two safe values here: 1/4 and 1/8.
// These options use the shaders ability to a free *|/ by 2|4|8.
// The console setting has a different mapping than the quality setting.
// Other platforms can use other values.
// 0.125 leaves less aliasing, but is softer (default!!!)
// 0.25 leaves more aliasing, and is sharper
FxaaFloat fxaaConsoleEdgeThreshold,
//
// Only used on FXAA Console.
// This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.
// It is here now to allow easier tuning.
// Trims the algorithm from processing darks.
// The console setting has a different mapping than the quality setting.
// This does not apply to PS3,
// PS3 was simplified to avoid more shader instructions.
// 0.06 - faster but more aliasing in darks
// 0.05 - default
// 0.04 - slower and less aliasing in darks
// Special notes when using FXAA_GREEN_AS_LUMA,
// Likely want to set this to zero.
// As colors that are mostly not-green
// will appear very dark in the green channel!
// Tune by looking at mostly non-green content,
// then start at zero and increase until aliasing is a problem.
FxaaFloat fxaaConsoleEdgeThresholdMin
) {
/*--------------------------------------------------------------------------*/
FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));
FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));
FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));
FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));
/*--------------------------------------------------------------------------*/
FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);
FxaaFloat lumaM = FxaaLuma(rgbyM);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);
lumaNe += 1.0/384.0;
FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);
FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);
FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;
/*--------------------------------------------------------------------------*/
FxaaFloat lumaMinM = min(lumaMin, lumaM);
FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);
FxaaFloat lumaMaxM = max(lumaMax, lumaM);
FxaaFloat dirSwMinusNe = lumaSw - lumaNe;
FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;
FxaaFloat dirSeMinusNw = lumaSe - lumaNw;
if(lumaMaxSubMinM < lumaMaxScaledClamped)
{
#if (FXAA_DISCARD == 1)
FxaaDiscard;
#else
return rgbyM;
#endif
}
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir;
dir.x = dirSwMinusNe + dirSeMinusNw;
dir.y = dirSwMinusNe - dirSeMinusNw;
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir1 = normalize(dir.xy);
FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);
FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);
/*--------------------------------------------------------------------------*/
FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;
FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);
/*--------------------------------------------------------------------------*/
FxaaFloat2 dir2x = dir2 * fxaaConsoleRcpFrameOpt2.zw;
FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2x);
FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2x);
/*--------------------------------------------------------------------------*/
FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;
FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);
/*--------------------------------------------------------------------------*/
float lumaB = FxaaLuma(rgbyB);
if((lumaB < lumaMin) || (lumaB > lumaMax)) rgbyB.xyz = rgbyA.xyz * 0.5;
return rgbyB;
}
/*==========================================================================*/
#define edgeSharpness 3.0
#define edgeThreshold 0.15
#define edgeThresholdMin 0.05
void main(){
vec2 screenSize05 = 0.5 * u_screenSize2f;
vec4 posPos;
posPos.xy = v_position2f;
posPos.zw = v_position2f + u_screenSize2f;
vec4 rcpFrameOpt;
rcpFrameOpt.xy = -screenSize05;
rcpFrameOpt.zw = screenSize05;
output4f = vec4(FxaaPixelShader(v_position2f + screenSize05, posPos, u_screenTexture, rcpFrameOpt, rcpFrameOpt * 4.0, edgeSharpness, edgeThreshold, edgeThresholdMin).rgb, 1.0);
}

View File

@ -1,40 +1,40 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_inputTexture;
vec2 distortUV(in vec2 uv, in float k){
vec2 t = uv - 0.5;
return dot(t, t) * k * t + t + 0.5;
}
#define DISTORT_AMOUNT -0.05
void main() {
output4f = vec4(textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT + 0.01), 0.0).r,
textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT), 0.0).ga,
textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT - 0.01), 0.0).b).rgab;
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_inputTexture;
vec2 distortUV(in vec2 uv, in float k){
vec2 t = uv - 0.5;
return dot(t, t) * k * t + t + 0.5;
}
#define DISTORT_AMOUNT -0.05
void main() {
output4f = vec4(textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT + 0.01), 0.0).r,
textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT), 0.0).ga,
textureLod(u_inputTexture, distortUV(v_position2f, DISTORT_AMOUNT - 0.01), 0.0).b).rgab;
}

View File

@ -1,36 +1,36 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_texcoord2f;
in vec3 v_color3f;
in float v_occlusion1f;
uniform sampler2D u_flareTexture;
uniform vec3 u_flareColor3f;
void main() {
vec3 color3f = vec3(texture(u_flareTexture, v_texcoord2f).r);
output4f = vec4(color3f * color3f * v_color3f * v_occlusion1f * u_flareColor3f, 0.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_texcoord2f;
in vec3 v_color3f;
in float v_occlusion1f;
uniform sampler2D u_flareTexture;
uniform vec3 u_flareColor3f;
void main() {
vec3 color3f = vec3(texture(u_flareTexture, v_texcoord2f).r);
output4f = vec4(color3f * color3f * v_color3f * v_occlusion1f * u_flareColor3f, 0.0);
}

View File

@ -1,67 +1,67 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec2 e_elementOffsetScale;
layout(location = 2) in vec4 e_elementTexture4f;
layout(location = 3) in vec3 e_elementColor3f;
out vec2 v_texcoord2f;
out vec3 v_color3f;
out float v_occlusion1f;
uniform sampler2D u_exposureValue;
uniform sampler2D u_sunOcclusionValue;
uniform vec2 u_sunPosition2f;
uniform float u_aspectRatio1f;
uniform float u_baseScale1f;
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
void main() {
v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0);
if(v_occlusion1f == 0.0) {
gl_Position = vec4(-10.0, -10.0, -10.0, 1.0);
return;
}
v_texcoord2f = e_elementTexture4f.xy + (a_position2f * 0.5 + 0.5) * e_elementTexture4f.zw;
float r = textureLod(u_exposureValue, vec2(0.5, 0.5), 0.0).r * 7.5;
mat2 rotationMatrix;
FAKE_SIN(vec2(r + 1.570795, r), rotationMatrix[0])
rotationMatrix[1].x = -rotationMatrix[0].y;
rotationMatrix[1].y = rotationMatrix[0].x;
vec2 transformedVertex = rotationMatrix * (a_position2f * u_baseScale1f * e_elementOffsetScale.y / (4.0 + r * 0.75));
transformedVertex.x *= u_aspectRatio1f;
transformedVertex += u_sunPosition2f * (1.0 - e_elementOffsetScale.x);
v_color3f = e_elementColor3f * (0.05 + dot(u_sunPosition2f, u_sunPosition2f));
gl_Position = vec4(transformedVertex, 0.0, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec2 e_elementOffsetScale;
layout(location = 2) in vec4 e_elementTexture4f;
layout(location = 3) in vec3 e_elementColor3f;
out vec2 v_texcoord2f;
out vec3 v_color3f;
out float v_occlusion1f;
uniform sampler2D u_exposureValue;
uniform sampler2D u_sunOcclusionValue;
uniform vec2 u_sunPosition2f;
uniform float u_aspectRatio1f;
uniform float u_baseScale1f;
#define FAKE_SIN(valueIn, valueOut)\
valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\
valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0;
void main() {
v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0);
if(v_occlusion1f == 0.0) {
gl_Position = vec4(-10.0, -10.0, -10.0, 1.0);
return;
}
v_texcoord2f = e_elementTexture4f.xy + (a_position2f * 0.5 + 0.5) * e_elementTexture4f.zw;
float r = textureLod(u_exposureValue, vec2(0.5, 0.5), 0.0).r * 7.5;
mat2 rotationMatrix;
FAKE_SIN(vec2(r + 1.570795, r), rotationMatrix[0])
rotationMatrix[1].x = -rotationMatrix[0].y;
rotationMatrix[1].y = rotationMatrix[0].x;
vec2 transformedVertex = rotationMatrix * (a_position2f * u_baseScale1f * e_elementOffsetScale.y / (4.0 + r * 0.75));
transformedVertex.x *= u_aspectRatio1f;
transformedVertex += u_sunPosition2f * (1.0 - e_elementOffsetScale.x);
v_color3f = e_elementColor3f * (0.05 + dot(u_sunPosition2f, u_sunPosition2f));
gl_Position = vec4(transformedVertex, 0.0, 1.0);
}

View File

@ -1,36 +1,36 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_texcoord2f;
in float v_occlusion1f;
uniform sampler2D u_flareTexture;
uniform vec3 u_flareColor3f;
void main() {
vec3 color = vec3(texture(u_flareTexture, v_texcoord2f).r);
color = length(u_flareColor3f * color) * vec3(0.0, 0.05, 0.3) + u_flareColor3f * color * color * color;
output4f = vec4(color * v_occlusion1f, 0.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision mediump float;
precision mediump sampler2D;
layout(location = 0) out vec4 output4f;
in vec2 v_texcoord2f;
in float v_occlusion1f;
uniform sampler2D u_flareTexture;
uniform vec3 u_flareColor3f;
void main() {
vec3 color = vec3(texture(u_flareTexture, v_texcoord2f).r);
color = length(u_flareColor3f * color) * vec3(0.0, 0.05, 0.3) + u_flareColor3f * color * color * color;
output4f = vec4(color * v_occlusion1f, 0.0);
}

View File

@ -1,42 +1,42 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec2 a_texcoord2f;
out vec2 v_texcoord2f;
out float v_occlusion1f;
uniform sampler2D u_sunOcclusionValue;
uniform mat3 u_sunFlareMatrix3f;
void main() {
v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0);
if(v_occlusion1f == 0.0) {
gl_Position = vec4(-10.0, -10.0, -10.0, 1.0);
return;
}
v_texcoord2f = a_texcoord2f;
vec3 pos3f = u_sunFlareMatrix3f * vec3(a_position2f, 1.0);
gl_Position = vec4(pos3f.x, pos3f.y, 0.0, pos3f.z);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
layout(location = 0) in vec2 a_position2f;
layout(location = 1) in vec2 a_texcoord2f;
out vec2 v_texcoord2f;
out float v_occlusion1f;
uniform sampler2D u_sunOcclusionValue;
uniform mat3 u_sunFlareMatrix3f;
void main() {
v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0);
if(v_occlusion1f == 0.0) {
gl_Position = vec4(-10.0, -10.0, -10.0, 1.0);
return;
}
v_texcoord2f = a_texcoord2f;
vec3 pos3f = u_sunFlareMatrix3f * vec3(a_position2f, 1.0);
gl_Position = vec4(pos3f.x, pos3f.y, 0.0, pos3f.z);
}

View File

@ -1,57 +1,57 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_lightingHDRFramebufferTexture;
uniform sampler2D u_framebufferLumaAvgInput;
uniform sampler2D u_ditherTexture;
uniform vec3 u_exposure3f;
uniform vec2 u_ditherScale2f;
void main() {
float lumaHDR = textureLod(u_framebufferLumaAvgInput, vec2(0.5), 0.0).r;
vec3 input3f = textureLod(u_lightingHDRFramebufferTexture, v_position2f, 0.0).rgb;
input3f /= (0.07 + clamp(lumaHDR * 6.0, 0.2, 4.0));
input3f *= u_exposure3f;
// ACES, modified to approximate gamma correction
const float a = 1.22;
const float b = 1.78;
const float c = 1.22;
const float d = 1.79;
const float e = 0.29;
input3f = clamp((input3f * (a * input3f + b)) / (input3f * (c * input3f + d) + e), 0.0, 1.0);
// desaturate a bit, makes it look like less of a cartoon
float sat = 0.8;
float luma = dot(input3f, vec3(0.299, 0.587, 0.114));
input3f = (input3f - luma) * sat + luma;
input3f += textureLod(u_ditherTexture, v_position2f * u_ditherScale2f, 0.0).r / 255.0;
output4f = vec4(clamp(input3f, 0.0, 1.0), luma);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 output4f;
uniform sampler2D u_lightingHDRFramebufferTexture;
uniform sampler2D u_framebufferLumaAvgInput;
uniform sampler2D u_ditherTexture;
uniform vec3 u_exposure3f;
uniform vec2 u_ditherScale2f;
void main() {
float lumaHDR = textureLod(u_framebufferLumaAvgInput, vec2(0.5), 0.0).r;
vec3 input3f = textureLod(u_lightingHDRFramebufferTexture, v_position2f, 0.0).rgb;
input3f /= (0.07 + clamp(lumaHDR * 6.0, 0.2, 4.0));
input3f *= u_exposure3f;
// ACES, modified to approximate gamma correction
const float a = 1.22;
const float b = 1.78;
const float c = 1.22;
const float d = 1.79;
const float e = 0.29;
input3f = clamp((input3f * (a * input3f + b)) / (input3f * (c * input3f + d) + e), 0.0, 1.0);
// desaturate a bit, makes it look like less of a cartoon
float sat = 0.8;
float luma = dot(input3f, vec3(0.299, 0.587, 0.114));
input3f = (input3f - luma) * sat + luma;
input3f += textureLod(u_ditherTexture, v_position2f * u_ditherScale2f, 0.0).r / 255.0;
output4f = vec4(clamp(input3f, 0.0, 1.0), luma);
}

View File

@ -1,201 +1,201 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 realisticWaterReflectionOutput4f;
layout(location = 1) out vec4 realisticWaterHitVectorOutput4f;
layout(location = 2) out vec4 realisticWaterRefraction4f;
uniform sampler2D u_gbufferColorTexture4f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_realisticWaterMaskNormal;
uniform sampler2D u_realisticWaterDepthTexture;
uniform sampler2D u_lastFrameReflectionInput4f;
uniform sampler2D u_lastFrameHitVectorInput4f;
uniform sampler2D u_lastFrameColorTexture;
uniform sampler2D u_lastFrameDepthTexture;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_inverseViewProjMatrix4f;
uniform mat4 u_reprojectionMatrix4f;
uniform mat4 u_lastInverseProjMatrix4f;
uniform mat4 u_reprojectionInverseViewMatrix4f;
uniform mat4 u_projectionMatrix4f;
uniform mat4 u_viewToPreviousProjMatrix4f;
// x = near plane
// y = far plane
// z = near plane * 2
// w = far plane - near plane
uniform vec4 u_nearFarPlane4f;
uniform vec4 u_pixelAlignment4f;
uniform vec4 u_refractFogColor4f;
#define reprojDepthLimit 0.25
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
#define CREATE_DEPTH_MATRIX(matrix4fInput) mat4x2(matrix4fInput[0].zw,matrix4fInput[1].zw,matrix4fInput[2].zw,matrix4fInput[3].zw)
void main() {
vec2 v_position2f2 = (floor(v_position2f * u_pixelAlignment4f.xy) + 0.25) * (2.0 / u_pixelAlignment4f.zw);
realisticWaterReflectionOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
realisticWaterRefraction4f = vec4(0.0, 0.0, 0.0, 0.0);
vec4 waterSurfaceNormal4f = textureLod(u_realisticWaterMaskNormal, v_position2f2, 0.0);
if(waterSurfaceNormal4f.a <= 0.0) {
return;
}
float gbufferDepth = textureLod(u_gbufferDepthTexture, v_position2f2, 0.0).r;
if(gbufferDepth < 0.000001) {
return;
}
vec4 gbufferDepthClipSpace4f = vec4(v_position2f2, gbufferDepth, 1.0);
gbufferDepthClipSpace4f.xyz *= 2.0;
gbufferDepthClipSpace4f.xyz -= 1.0;
vec2 gbufferDepthView = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * gbufferDepthClipSpace4f;
gbufferDepthView.x /= gbufferDepthView.y;
float waterSurfaceDepth = textureLod(u_realisticWaterDepthTexture, v_position2f2, 0.0).r;
vec4 waterSurfaceDepthClipSpace4f = vec4(gbufferDepthClipSpace4f.xy, waterSurfaceDepth * 2.0 - 1.0, 1.0);
vec2 waterDepthView = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * waterSurfaceDepthClipSpace4f;
waterDepthView.x /= waterDepthView.y;
float fog = clamp(1.25 - 1.0 / exp((waterDepthView.x - gbufferDepthView.x) * 0.05), 0.0, 1.0);
vec3 refractColor3f = textureLod(u_gbufferColorTexture4f, v_position2f2, 0.0).rgb;
refractColor3f *= mix(vec3(1.0), vec3(0.02, 0.025, 0.12), min(fog + 0.1, 1.0));
vec3 fogColor3f = u_refractFogColor4f.rgb * (waterSurfaceNormal4f.a * u_refractFogColor4f.a * 0.95 + 0.05);
realisticWaterRefraction4f = vec4(mix(refractColor3f, fogColor3f, fog), 1.0);
vec4 fragPos4f = u_inverseViewProjMatrix4f * waterSurfaceDepthClipSpace4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
vec4 reprojPos4f = u_reprojectionMatrix4f * fragPos4f;
vec4 reprojClipPos4f = vec4(reprojPos4f.xyz / reprojPos4f.w, 1.0);
reprojPos4f = reprojClipPos4f;
reprojPos4f.xyz *= 0.5;
reprojPos4f.xyz += 0.5;
reprojPos4f.xy = (floor(reprojPos4f.xy * u_pixelAlignment4f.zw) + 0.5) * (0.5 / u_pixelAlignment4f.xy);
if(reprojPos4f.xy != clamp(reprojPos4f.xy, vec2(0.001), vec2(0.999)) || abs(GET_LINEAR_DEPTH_FROM_VALUE(textureLod(u_lastFrameDepthTexture, reprojPos4f.xy, 0.0).r) - GET_LINEAR_DEPTH_FROM_VALUE(reprojPos4f.z)) > reprojDepthLimit) {
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 50.0);
return;
}
vec4 lastFrameHitVector4f = textureLod(u_lastFrameHitVectorInput4f, reprojPos4f.xy, 0.0);
if(lastFrameHitVector4f.g <= 0.0) {
realisticWaterReflectionOutput4f = textureLod(u_lastFrameReflectionInput4f, reprojPos4f.xy, 0.0);
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, lastFrameHitVector4f.a);
return;
}
realisticWaterReflectionOutput4f = vec4(0.0, 0.0, 0.0, 1.0);
lastFrameHitVector4f.g -= 0.004;
vec4 lastFrameFragPosView4f = u_lastInverseProjMatrix4f * vec4(reprojClipPos4f.xyz, 1.0);
lastFrameFragPosView4f.xyz /= lastFrameFragPosView4f.w;
lastFrameFragPosView4f.w = 1.0;
vec4 lastFrameHitPos4f = vec4(lastFrameFragPosView4f.xyz + lastFrameHitVector4f.xyz, 1.0);
vec4 thisFrameHitPos4f = u_reprojectionInverseViewMatrix4f * lastFrameHitPos4f;
thisFrameHitPos4f.xyz /= thisFrameHitPos4f.w;
thisFrameHitPos4f.w = 1.0;
vec4 thisFrameHitPosProj4f = u_projectionMatrix4f * thisFrameHitPos4f;
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
vec3 thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
float fragDepthSample = textureLod(u_gbufferDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPos4f.z - 0.125 < 0.0) {
return;
}
waterSurfaceNormal4f.xyz *= 2.0;
waterSurfaceNormal4f.xyz -= 1.0;
vec3 lastFrameHitPosNormal3f = textureLod(u_realisticWaterMaskNormal, thisFrameHitPosProjTex3f.xy, 0.0).rgb;
lastFrameHitPosNormal3f *= 2.0;
lastFrameHitPosNormal3f -= 1.0;
vec4 fragPosView4f = u_inverseProjectionMatrix4f * waterSurfaceDepthClipSpace4f;
fragPosView4f.xyz /= fragPosView4f.w;
fragPosView4f.w = 1.0;
vec3 rayOrigin = fragPosView4f.xyz;
vec3 planePos = thisFrameHitPos4f.xyz;
vec3 planeNormal = lastFrameHitPosNormal3f;
vec3 newRayDirection = reflect(normalize(rayOrigin), waterSurfaceNormal4f.xyz);
float dist = dot(planeNormal, newRayDirection);
if(dist > 0.9) {
return;
}
dist = dot(planeNormal, planePos - rayOrigin) / dist;
if(dist < 0.0) {
return;
}
realisticWaterHitVectorOutput4f = vec4(newRayDirection * dist, 1.0);
realisticWaterHitVectorOutput4f.y += 0.004;
thisFrameHitPosProj4f = u_viewToPreviousProjMatrix4f * vec4(rayOrigin + newRayDirection * dist, 1.0);
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
fragDepthSample = textureLod(u_lastFrameDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * thisFrameHitPosProj4f;
thisFrameHitPosProjPos.x /= thisFrameHitPosProjPos.y;
thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPosProjPos.x - 0.125 < 0.0) {
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
return;
}
realisticWaterReflectionOutput4f = vec4(textureLod(u_lastFrameColorTexture, thisFrameHitPosProjTex3f.xy, 0.0).rgb, 0.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec4 realisticWaterReflectionOutput4f;
layout(location = 1) out vec4 realisticWaterHitVectorOutput4f;
layout(location = 2) out vec4 realisticWaterRefraction4f;
uniform sampler2D u_gbufferColorTexture4f;
uniform sampler2D u_gbufferDepthTexture;
uniform sampler2D u_realisticWaterMaskNormal;
uniform sampler2D u_realisticWaterDepthTexture;
uniform sampler2D u_lastFrameReflectionInput4f;
uniform sampler2D u_lastFrameHitVectorInput4f;
uniform sampler2D u_lastFrameColorTexture;
uniform sampler2D u_lastFrameDepthTexture;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_inverseViewProjMatrix4f;
uniform mat4 u_reprojectionMatrix4f;
uniform mat4 u_lastInverseProjMatrix4f;
uniform mat4 u_reprojectionInverseViewMatrix4f;
uniform mat4 u_projectionMatrix4f;
uniform mat4 u_viewToPreviousProjMatrix4f;
// x = near plane
// y = far plane
// z = near plane * 2
// w = far plane - near plane
uniform vec4 u_nearFarPlane4f;
uniform vec4 u_pixelAlignment4f;
uniform vec4 u_refractFogColor4f;
#define reprojDepthLimit 0.25
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
#define CREATE_DEPTH_MATRIX(matrix4fInput) mat4x2(matrix4fInput[0].zw,matrix4fInput[1].zw,matrix4fInput[2].zw,matrix4fInput[3].zw)
void main() {
vec2 v_position2f2 = (floor(v_position2f * u_pixelAlignment4f.xy) + 0.25) * (2.0 / u_pixelAlignment4f.zw);
realisticWaterReflectionOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
realisticWaterRefraction4f = vec4(0.0, 0.0, 0.0, 0.0);
vec4 waterSurfaceNormal4f = textureLod(u_realisticWaterMaskNormal, v_position2f2, 0.0);
if(waterSurfaceNormal4f.a <= 0.0) {
return;
}
float gbufferDepth = textureLod(u_gbufferDepthTexture, v_position2f2, 0.0).r;
if(gbufferDepth < 0.000001) {
return;
}
vec4 gbufferDepthClipSpace4f = vec4(v_position2f2, gbufferDepth, 1.0);
gbufferDepthClipSpace4f.xyz *= 2.0;
gbufferDepthClipSpace4f.xyz -= 1.0;
vec2 gbufferDepthView = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * gbufferDepthClipSpace4f;
gbufferDepthView.x /= gbufferDepthView.y;
float waterSurfaceDepth = textureLod(u_realisticWaterDepthTexture, v_position2f2, 0.0).r;
vec4 waterSurfaceDepthClipSpace4f = vec4(gbufferDepthClipSpace4f.xy, waterSurfaceDepth * 2.0 - 1.0, 1.0);
vec2 waterDepthView = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * waterSurfaceDepthClipSpace4f;
waterDepthView.x /= waterDepthView.y;
float fog = clamp(1.25 - 1.0 / exp((waterDepthView.x - gbufferDepthView.x) * 0.05), 0.0, 1.0);
vec3 refractColor3f = textureLod(u_gbufferColorTexture4f, v_position2f2, 0.0).rgb;
refractColor3f *= mix(vec3(1.0), vec3(0.02, 0.025, 0.12), min(fog + 0.1, 1.0));
vec3 fogColor3f = u_refractFogColor4f.rgb * (waterSurfaceNormal4f.a * u_refractFogColor4f.a * 0.95 + 0.05);
realisticWaterRefraction4f = vec4(mix(refractColor3f, fogColor3f, fog), 1.0);
vec4 fragPos4f = u_inverseViewProjMatrix4f * waterSurfaceDepthClipSpace4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
vec4 reprojPos4f = u_reprojectionMatrix4f * fragPos4f;
vec4 reprojClipPos4f = vec4(reprojPos4f.xyz / reprojPos4f.w, 1.0);
reprojPos4f = reprojClipPos4f;
reprojPos4f.xyz *= 0.5;
reprojPos4f.xyz += 0.5;
reprojPos4f.xy = (floor(reprojPos4f.xy * u_pixelAlignment4f.zw) + 0.5) * (0.5 / u_pixelAlignment4f.xy);
if(reprojPos4f.xy != clamp(reprojPos4f.xy, vec2(0.001), vec2(0.999)) || abs(GET_LINEAR_DEPTH_FROM_VALUE(textureLod(u_lastFrameDepthTexture, reprojPos4f.xy, 0.0).r) - GET_LINEAR_DEPTH_FROM_VALUE(reprojPos4f.z)) > reprojDepthLimit) {
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 50.0);
return;
}
vec4 lastFrameHitVector4f = textureLod(u_lastFrameHitVectorInput4f, reprojPos4f.xy, 0.0);
if(lastFrameHitVector4f.g <= 0.0) {
realisticWaterReflectionOutput4f = textureLod(u_lastFrameReflectionInput4f, reprojPos4f.xy, 0.0);
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, lastFrameHitVector4f.a);
return;
}
realisticWaterReflectionOutput4f = vec4(0.0, 0.0, 0.0, 1.0);
lastFrameHitVector4f.g -= 0.004;
vec4 lastFrameFragPosView4f = u_lastInverseProjMatrix4f * vec4(reprojClipPos4f.xyz, 1.0);
lastFrameFragPosView4f.xyz /= lastFrameFragPosView4f.w;
lastFrameFragPosView4f.w = 1.0;
vec4 lastFrameHitPos4f = vec4(lastFrameFragPosView4f.xyz + lastFrameHitVector4f.xyz, 1.0);
vec4 thisFrameHitPos4f = u_reprojectionInverseViewMatrix4f * lastFrameHitPos4f;
thisFrameHitPos4f.xyz /= thisFrameHitPos4f.w;
thisFrameHitPos4f.w = 1.0;
vec4 thisFrameHitPosProj4f = u_projectionMatrix4f * thisFrameHitPos4f;
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
vec3 thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
float fragDepthSample = textureLod(u_gbufferDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPos4f.z - 0.125 < 0.0) {
return;
}
waterSurfaceNormal4f.xyz *= 2.0;
waterSurfaceNormal4f.xyz -= 1.0;
vec3 lastFrameHitPosNormal3f = textureLod(u_realisticWaterMaskNormal, thisFrameHitPosProjTex3f.xy, 0.0).rgb;
lastFrameHitPosNormal3f *= 2.0;
lastFrameHitPosNormal3f -= 1.0;
vec4 fragPosView4f = u_inverseProjectionMatrix4f * waterSurfaceDepthClipSpace4f;
fragPosView4f.xyz /= fragPosView4f.w;
fragPosView4f.w = 1.0;
vec3 rayOrigin = fragPosView4f.xyz;
vec3 planePos = thisFrameHitPos4f.xyz;
vec3 planeNormal = lastFrameHitPosNormal3f;
vec3 newRayDirection = reflect(normalize(rayOrigin), waterSurfaceNormal4f.xyz);
float dist = dot(planeNormal, newRayDirection);
if(dist > 0.9) {
return;
}
dist = dot(planeNormal, planePos - rayOrigin) / dist;
if(dist < 0.0) {
return;
}
realisticWaterHitVectorOutput4f = vec4(newRayDirection * dist, 1.0);
realisticWaterHitVectorOutput4f.y += 0.004;
thisFrameHitPosProj4f = u_viewToPreviousProjMatrix4f * vec4(rayOrigin + newRayDirection * dist, 1.0);
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
fragDepthSample = textureLod(u_lastFrameDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * thisFrameHitPosProj4f;
thisFrameHitPosProjPos.x /= thisFrameHitPosProjPos.y;
thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPosProjPos.x - 0.125 < 0.0) {
realisticWaterHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
return;
}
realisticWaterReflectionOutput4f = vec4(textureLod(u_lastFrameColorTexture, thisFrameHitPosProjTex3f.xy, 0.0).rgb, 0.0);
}

View File

@ -1,37 +1,37 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
void main() {
#ifdef COMPILE_NORMAL_ATTRIB
output4f = vec4(v_normal3f * 0.5 + 0.5, 1.0);
#else
output4f = vec4(0.0, 1.0, 0.0, 1.0);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
void main() {
#ifdef COMPILE_NORMAL_ATTRIB
output4f = vec4(v_normal3f * 0.5 + 0.5, 1.0);
#else
output4f = vec4(0.0, 1.0, 0.0, 1.0);
#endif
}

View File

@ -1,46 +1,46 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_modelviewProjMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_modelviewProjMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_modelviewProjMat4f * vec4(a_position3f, 1.0);
}

View File

@ -1,41 +1,41 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float realisticWaterDisplacementOutput1f;
uniform sampler2D u_noiseTexture;
uniform vec4 u_waveTimer4f;
void main() {
vec2 sampleA = v_position2f + vec2(-0.093, -0.056) * (u_waveTimer4f.x + 0.12);
sampleA = textureLod(u_noiseTexture, fract(sampleA) * 0.46875 + vec2(0.015625, 0.015625), 0.0).rg;
vec2 sampleB = v_position2f + vec2(0.075, 0.153) * (u_waveTimer4f.x + 1.33);
sampleB = textureLod(u_noiseTexture, fract(sampleB) * 0.46875 + vec2(0.515625, 0.015625), 0.0).rg;
vec2 sampleC = v_position2f + vec2(0.075, -0.113) * u_waveTimer4f.x + vec2(sampleA.g, sampleB.g) * 0.15;
sampleC = textureLod(u_noiseTexture, fract(sampleC) * 0.46875 + vec2(0.515625, 0.515625), 0.0).rg;
vec2 sampleD = v_position2f + vec2(-0.135, 0.092) * u_waveTimer4f.x + sampleC * 0.1;
sampleD = textureLod(u_noiseTexture, fract(sampleD) * 0.46875 + vec2(0.015625, 0.515625), 0.0).rg;
realisticWaterDisplacementOutput1f = dot(vec4(sampleA.r, sampleB.r, sampleC.r, sampleD.r), vec4(0.63, 0.40, 0.035, 0.035)) + dot(vec2(sampleC.g, sampleD.g), vec2(-0.075 * sampleA.g, 0.053 * sampleA.r));
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out float realisticWaterDisplacementOutput1f;
uniform sampler2D u_noiseTexture;
uniform vec4 u_waveTimer4f;
void main() {
vec2 sampleA = v_position2f + vec2(-0.093, -0.056) * (u_waveTimer4f.x + 0.12);
sampleA = textureLod(u_noiseTexture, fract(sampleA) * 0.46875 + vec2(0.015625, 0.015625), 0.0).rg;
vec2 sampleB = v_position2f + vec2(0.075, 0.153) * (u_waveTimer4f.x + 1.33);
sampleB = textureLod(u_noiseTexture, fract(sampleB) * 0.46875 + vec2(0.515625, 0.015625), 0.0).rg;
vec2 sampleC = v_position2f + vec2(0.075, -0.113) * u_waveTimer4f.x + vec2(sampleA.g, sampleB.g) * 0.15;
sampleC = textureLod(u_noiseTexture, fract(sampleC) * 0.46875 + vec2(0.515625, 0.515625), 0.0).rg;
vec2 sampleD = v_position2f + vec2(-0.135, 0.092) * u_waveTimer4f.x + sampleC * 0.1;
sampleD = textureLod(u_noiseTexture, fract(sampleD) * 0.46875 + vec2(0.015625, 0.515625), 0.0).rg;
realisticWaterDisplacementOutput1f = dot(vec4(sampleA.r, sampleB.r, sampleC.r, sampleD.r), vec4(0.63, 0.40, 0.035, 0.035)) + dot(vec2(sampleC.g, sampleD.g), vec2(-0.075 * sampleA.g, 0.053 * sampleA.r));
}

View File

@ -1,35 +1,35 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec2 realisticWaterNormalOutput2f;
uniform sampler2D u_displacementTexture;
uniform vec2 u_sampleOffset2f;
void main() {
float A = textureLod(u_displacementTexture, v_position2f, 0.0).r;
float B = textureLod(u_displacementTexture, v_position2f + vec2(u_sampleOffset2f.x, 0.0), 0.0).r;
float C = textureLod(u_displacementTexture, v_position2f - vec2(0.0, u_sampleOffset2f.y), 0.0).r;
realisticWaterNormalOutput2f = clamp((vec2(A * A) - vec2(B, C) * vec2(B, C)) * 10.0 + 0.5, vec2(0.0), vec2(1.0));
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
layout(location = 0) out vec2 realisticWaterNormalOutput2f;
uniform sampler2D u_displacementTexture;
uniform vec2 u_sampleOffset2f;
void main() {
float A = textureLod(u_displacementTexture, v_position2f, 0.0).r;
float B = textureLod(u_displacementTexture, v_position2f + vec2(u_sampleOffset2f.x, 0.0), 0.0).r;
float C = textureLod(u_displacementTexture, v_position2f - vec2(0.0, u_sampleOffset2f.y), 0.0).r;
realisticWaterNormalOutput2f = clamp((vec2(A * A) - vec2(B, C) * vec2(B, C)) * 10.0 + 0.5, vec2(0.0), vec2(1.0));
}

View File

@ -1,435 +1,435 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
in vec2 v_positionClip2f;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#else
uniform vec2 u_textureCoords01;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
uniform mat4 u_inverseViewMatrix4f;
uniform mat4 u_modelViewProjMat4f_;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
uniform sampler2D u_environmentMap;
uniform sampler2D u_irradianceMap;
uniform sampler2D u_reflectionMap;
uniform sampler2D u_refractionMap;
uniform sampler2D u_brdfLUT;
uniform sampler2D u_normalMap;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
uniform vec4 u_waterWindOffset4f;
uniform vec3 u_wavingBlockOffset3f;
#define WATER_ROUGHNESS 0.05
#define WATER_F0 0.5
vec3 eaglercraftLighting_Water(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec) {
float roughness = 1.0 - WATER_ROUGHNESS * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = (WATER_ROUGHNESS * WATER_ROUGHNESS * WATER_ROUGHNESS * WATER_ROUGHNESS);
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = WATER_ROUGHNESS + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 F = vec3(WATER_F0 + (1.0 - WATER_F0) * fresnel);
vec3 kD = (1.0 - F) * albedo / 3.141592;
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (kD + (NDF * F / denom)) * radiance * NdotHVL.z;
}
vec3 eaglercraftIBL_Specular_Water(in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec) {
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F = vec3(WATER_F0 + (max(1.0 - WATER_ROUGHNESS, WATER_F0) - WATER_F0) * fresnel);
vec2 brdf2f = vec2(max(NdotV, 0.0), WATER_ROUGHNESS);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
vec2 duv1 = dFdx(uv);
vec2 duv2 = dFdy(uv);
vec3 dp2perp = cross(dp2, N);
vec3 dp1perp = cross(N, dp1);
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
float invmax = inversesqrt(max(dot(T,T), dot(B,B)));
return mat3(T * invmax, B * invmax, N);
}
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = round(v_block1f);
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ========= CALCULATE DIFFUSE COLOR ========== //
#ifdef COMPILE_COLOR_ATTRIB
diffuseColor4f = v_color4f * u_color4f;
#else
diffuseColor4f = u_color4f;
#endif
diffuseColor4f *= vec4(0.0478, 0.0585, 0.17, 1.0);
// ======== SAMPLE REFLECT/REFRACT ======== //
#ifdef COMPILE_TEXTURE_ATTRIB
vec2 texCoords2f = v_texture2f;
#else
vec2 texCoords2f = u_textureCoords01;
#endif
vec4 worldPosition4fOff = worldPosition4f;
worldPosition4fOff.xyz += u_wavingBlockOffset3f;
vec2 rotatedUV2f = worldPosition4fOff.xz + (block1f == 10.0 ? u_waterWindOffset4f.z * texCoords2f : u_waterWindOffset4f.xy);
rotatedUV2f *= (block1f == 10.0 ? 0.75 : 0.25);
mat3 cf = cotangent_frame(normalVector3f, worldDirection4f.xyz, rotatedUV2f);
vec3 surfaceNormalsMap3f = vec3(textureLod(u_normalMap, rotatedUV2f, 0.0).rg, 0.0);
surfaceNormalsMap3f.xy *= 2.0;
surfaceNormalsMap3f.xy -= 1.0;
vec3 surfaceNormalsMapFlat3f = cf * surfaceNormalsMap3f;
surfaceNormalsMapFlat3f *= 0.1;
surfaceNormalsMap3f.z = 8.0;
surfaceNormalsMap3f = normalize(surfaceNormalsMap3f);
normalVector3f = surfaceNormalsMap3f = cf * surfaceNormalsMap3f;
vec4 worldPosition4fOff2 = worldPosition4f;
worldPosition4fOff2.xyz -= surfaceNormalsMapFlat3f * 4.0;
vec3 reflectCoordsR = mat4x3(
u_modelViewProjMat4f_[0].xyw,
u_modelViewProjMat4f_[1].xyw,
u_modelViewProjMat4f_[2].xyw,
u_modelViewProjMat4f_[3].xyw) * worldPosition4fOff2;
reflectCoordsR.xy /= reflectCoordsR.z;
reflectCoordsR.xy *= 0.5;
reflectCoordsR.xy += 0.5;
worldPosition4fOff2 = worldPosition4f;
worldPosition4fOff2.xyz += surfaceNormalsMapFlat3f;
vec3 reflectCoordsL = mat4x3(
u_modelViewProjMat4f_[0].xyw,
u_modelViewProjMat4f_[1].xyw,
u_modelViewProjMat4f_[2].xyw,
u_modelViewProjMat4f_[3].xyw) * worldPosition4fOff2;
reflectCoordsL.xy /= reflectCoordsL.z;
reflectCoordsL.xy *= 0.5;
reflectCoordsL.xy += 0.5;
vec4 envMapSample4f = textureLod(u_reflectionMap, reflectCoordsR.xy, 0.0);
vec4 refractionSample = textureLod(u_refractionMap, reflectCoordsL.xy, 0.0);
#ifdef COMPILE_COLOR_ATTRIB
refractionSample *= v_color4f * v_color4f * u_color4f * u_color4f;
#else
refractionSample *= u_color4f * u_color4f;
#endif
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting_Water(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== REFLECTION MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
float e = 0.0;
e += envMapSample4f.g <= 0.0 ? 0.0 : 1.0;
e += lightmapCoords2f.y > 0.5 ? 0.0 : 1.0;
//e += abs(normalVector3f.y) > 0.1 ? 0.0 : 1.0;
if(e == 0.0) {
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz *= 0.975;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz *= vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.rgb *= (lightmapCoords2f.y * 2.0 - 1.0);
}
if(envMapSample4f.g > 0.0) {
lightColor3f += eaglercraftIBL_Specular_Water(envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f) * 0.5;
}
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = u_dynamicLightArray[i].u_lightPosition4f.xyz - worldPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting_Water(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
vec4 fogBlend4f = vec4(0.0);
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
float f, l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogBlend4f.a *= clamp(f, 0.0, 1.0);
if(atmos == 0.0) {
break;
}
vec3 atmosSamplePos = v_position4f.xyz / -l;
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
atmosSamplePos.xz += vec2(0.5, 0.25);
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb + u_fogColorAddSun4f.rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.9 + 0.1;
#endif
break;
}
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
vec3 skyLight = (lightmapCoords2f.g + 0.05) * vec3(0.9102, 0.9, 1.0) * u_blockSkySunDynamicLightFac4f.y;
diffuseColor4f.rgb *= (skyLight + blockLight) * 0.075;
diffuseColor4f.rgb += lightColor3f;
diffuseColor4f.rgb = mix(diffuseColor4f.rgb + refractionSample.rgb, fogBlend4f.rgb, fogBlend4f.a);
output4f = vec4(diffuseColor4f.rgb, 1.0);
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision highp sampler2DShadow;
in vec4 v_position4f;
in vec2 v_positionClip2f;
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 v_texture2f;
#else
uniform vec2 u_textureCoords01;
#endif
uniform vec4 u_color4f;
#ifdef COMPILE_COLOR_ATTRIB
in vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec3 v_normal3f;
in float v_block1f;
#else
uniform vec3 u_uniformNormal3f;
uniform float u_blockConstant1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 v_lightmap2f;
#else
uniform vec2 u_textureCoords02;
#endif
uniform mat4 u_inverseViewMatrix4f;
uniform mat4 u_modelViewProjMat4f_;
layout(location = 0) out vec4 output4f;
#ifdef COMPILE_DYNAMIC_LIGHTS
struct DynamicLight {
mediump vec4 u_lightPosition4f;
mediump vec4 u_lightColor4f;
};
layout(std140) uniform u_chunkLightingData {
mediump int u_dynamicLightCount1i;
mediump int _paddingA_;
mediump int _paddingB_;
mediump int _paddingC_;
DynamicLight u_dynamicLightArray[12];
};
#endif
layout(std140) uniform u_worldLightingData {
mediump vec4 u_sunDirection4f;
mediump vec4 u_sunColor3f_sky1f;
mediump vec4 u_fogParameters4f;
mediump vec4 u_fogColorLight4f;
mediump vec4 u_fogColorDark4f;
mediump vec4 u_fogColorAddSun4f;
mediump vec4 u_blockSkySunDynamicLightFac4f;
#ifdef COMPILE_SUN_SHADOW_LOD0
mediump mat4 u_sunShadowMatrixLOD04f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 1.0
#endif
#ifdef COMPILE_SUN_SHADOW_LOD1
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.5
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
mediump mat4 u_sunShadowMatrixLOD04f;
mediump mat4 u_sunShadowMatrixLOD14f;
mediump mat4 u_sunShadowMatrixLOD24f;
#define DO_COMPILE_SUN_SHADOWS
#define SUN_SHADOW_MAP_FRAC 0.3333333
#endif
};
#ifdef DO_COMPILE_SUN_SHADOWS
uniform sampler2DShadow u_sunShadowDepthTexture;
#ifdef COMPILE_SUN_SHADOW_SMOOTH
const vec2 POISSON_DISK[7] = vec2[](
vec2(-0.077, 0.995), vec2(0.998, 0.015),
vec2(-0.116, -0.987), vec2(-0.916, 0.359),
vec2(-0.697, -0.511), vec2(0.740, -0.612),
vec2(0.675, 0.682));
#define SMOOTH_SHADOW_SAMPLES 1.0 / 8.0
#define SMOOTH_SHADOW_RADIUS 0.00075
#define SMOOTH_SHADOW_POISSON_SAMPLE(idx, tex, lod, vec3Pos, accum, tmpVec2)\
tmpVec2 = vec3Pos.xy + POISSON_DISK[idx] * SMOOTH_SHADOW_RADIUS;\
tmpVec2 = clamp(tmpVec2, vec2(0.001), vec2(0.999));\
tmpVec2.y += lod;\
tmpVec2.y *= SUN_SHADOW_MAP_FRAC;\
accum += textureLod(tex, vec3(tmpVec2, vec3Pos.z), 0.0) * SMOOTH_SHADOW_SAMPLES;
#endif
#endif
uniform sampler2D u_environmentMap;
uniform sampler2D u_irradianceMap;
uniform sampler2D u_reflectionMap;
uniform sampler2D u_refractionMap;
uniform sampler2D u_brdfLUT;
uniform sampler2D u_normalMap;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
uniform sampler2D u_lightShaftsTexture;
#endif
uniform vec4 u_waterWindOffset4f;
uniform vec3 u_wavingBlockOffset3f;
#define WATER_ROUGHNESS 0.05
#define WATER_F0 0.5
vec3 eaglercraftLighting_Water(in vec3 albedo, in vec3 radiance, in vec3 viewDir, in vec3 lightDir, in vec3 normalVec) {
float roughness = 1.0 - WATER_ROUGHNESS * 0.85;
vec3 H = normalize(viewDir + lightDir);
vec3 NdotHVL = max(normalVec * mat3(H, viewDir, lightDir), vec3(0.0));
float NDF = (WATER_ROUGHNESS * WATER_ROUGHNESS * WATER_ROUGHNESS * WATER_ROUGHNESS);
float denom = NdotHVL.x * NdotHVL.x * (NDF - 1.0) + 1.0;
NDF /= denom * denom * 3.141592;
float gs = WATER_ROUGHNESS + 1.0;
gs *= gs * 0.125;
vec2 Ndot = NdotHVL.yz;
Ndot /= Ndot * (1.0 - gs) + gs;
NDF *= Ndot.x * Ndot.y;
float fresnel = pow(max(1.0 - NdotHVL.x, 0.0), 5.0);
vec3 F = vec3(WATER_F0 + (1.0 - WATER_F0) * fresnel);
vec3 kD = (1.0 - F) * albedo / 3.141592;
denom = 4.0 * NdotHVL.y * NdotHVL.z + 0.0001;
return (kD + (NDF * F / denom)) * radiance * NdotHVL.z;
}
vec3 eaglercraftIBL_Specular_Water(in vec3 envMapSample, in vec3 viewDir, in vec3 normalVec) {
float NdotV = dot(normalVec, -viewDir);
float fresnel = pow(max(1.0 - NdotV, 0.0), 5.0);
vec3 F = vec3(WATER_F0 + (max(1.0 - WATER_ROUGHNESS, WATER_F0) - WATER_F0) * fresnel);
vec2 brdf2f = vec2(max(NdotV, 0.0), WATER_ROUGHNESS);
brdf2f = 1.0 - brdf2f;
brdf2f *= brdf2f;
brdf2f = 1.0 - brdf2f;
brdf2f = textureLod(u_brdfLUT, brdf2f, 0.0).rg;
return envMapSample * (F * brdf2f.r + brdf2f.g);
}
mat3 cotangent_frame(in vec3 N, in vec3 p, in vec2 uv) {
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
vec2 duv1 = dFdx(uv);
vec2 duv2 = dFdy(uv);
vec3 dp2perp = cross(dp2, N);
vec3 dp1perp = cross(N, dp1);
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;
float invmax = inversesqrt(max(dot(T,T), dot(B,B)));
return mat3(T * invmax, B * invmax, N);
}
void main() {
vec4 worldPosition4f;
vec4 worldDirection4f;
vec4 diffuseColor4f;
vec3 normalVector3f;
vec2 lightmapCoords2f;
float block1f;
// =========== RESOLVE CONSTANTS ============ //
worldPosition4f = u_inverseViewMatrix4f * v_position4f;
worldPosition4f.xyz /= worldPosition4f.w;
worldPosition4f.w = 1.0;
worldDirection4f = u_inverseViewMatrix4f * vec4(v_position4f.xyz / v_position4f.w, 0.0);
worldDirection4f.xyz = normalize(worldDirection4f.xyz);
#ifdef COMPILE_ENABLE_LIGHTMAP
#ifdef COMPILE_LIGHTMAP_ATTRIB
lightmapCoords2f = v_lightmap2f;
#else
lightmapCoords2f = u_textureCoords02;
#endif
#endif
#ifdef COMPILE_NORMAL_ATTRIB
normalVector3f = normalize(v_normal3f);
block1f = round(v_block1f);
#else
normalVector3f = u_uniformNormal3f;
block1f = u_blockConstant1f;
#endif
normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normalVector3f);
// ========= CALCULATE DIFFUSE COLOR ========== //
#ifdef COMPILE_COLOR_ATTRIB
diffuseColor4f = v_color4f * u_color4f;
#else
diffuseColor4f = u_color4f;
#endif
diffuseColor4f *= vec4(0.0478, 0.0585, 0.17, 1.0);
// ======== SAMPLE REFLECT/REFRACT ======== //
#ifdef COMPILE_TEXTURE_ATTRIB
vec2 texCoords2f = v_texture2f;
#else
vec2 texCoords2f = u_textureCoords01;
#endif
vec4 worldPosition4fOff = worldPosition4f;
worldPosition4fOff.xyz += u_wavingBlockOffset3f;
vec2 rotatedUV2f = worldPosition4fOff.xz + (block1f == 10.0 ? u_waterWindOffset4f.z * texCoords2f : u_waterWindOffset4f.xy);
rotatedUV2f *= (block1f == 10.0 ? 0.75 : 0.25);
mat3 cf = cotangent_frame(normalVector3f, worldDirection4f.xyz, rotatedUV2f);
vec3 surfaceNormalsMap3f = vec3(textureLod(u_normalMap, rotatedUV2f, 0.0).rg, 0.0);
surfaceNormalsMap3f.xy *= 2.0;
surfaceNormalsMap3f.xy -= 1.0;
vec3 surfaceNormalsMapFlat3f = cf * surfaceNormalsMap3f;
surfaceNormalsMapFlat3f *= 0.1;
surfaceNormalsMap3f.z = 8.0;
surfaceNormalsMap3f = normalize(surfaceNormalsMap3f);
normalVector3f = surfaceNormalsMap3f = cf * surfaceNormalsMap3f;
vec4 worldPosition4fOff2 = worldPosition4f;
worldPosition4fOff2.xyz -= surfaceNormalsMapFlat3f * 4.0;
vec3 reflectCoordsR = mat4x3(
u_modelViewProjMat4f_[0].xyw,
u_modelViewProjMat4f_[1].xyw,
u_modelViewProjMat4f_[2].xyw,
u_modelViewProjMat4f_[3].xyw) * worldPosition4fOff2;
reflectCoordsR.xy /= reflectCoordsR.z;
reflectCoordsR.xy *= 0.5;
reflectCoordsR.xy += 0.5;
worldPosition4fOff2 = worldPosition4f;
worldPosition4fOff2.xyz += surfaceNormalsMapFlat3f;
vec3 reflectCoordsL = mat4x3(
u_modelViewProjMat4f_[0].xyw,
u_modelViewProjMat4f_[1].xyw,
u_modelViewProjMat4f_[2].xyw,
u_modelViewProjMat4f_[3].xyw) * worldPosition4fOff2;
reflectCoordsL.xy /= reflectCoordsL.z;
reflectCoordsL.xy *= 0.5;
reflectCoordsL.xy += 0.5;
vec4 envMapSample4f = textureLod(u_reflectionMap, reflectCoordsR.xy, 0.0);
vec4 refractionSample = textureLod(u_refractionMap, reflectCoordsL.xy, 0.0);
#ifdef COMPILE_COLOR_ATTRIB
refractionSample *= v_color4f * v_color4f * u_color4f * u_color4f;
#else
refractionSample *= u_color4f * u_color4f;
#endif
// ============ SUN LIGHTING ============== //
diffuseColor4f.rgb *= diffuseColor4f.rgb;
vec3 lightColor3f = vec3(0.0);
if(dot(u_sunDirection4f.xyz, normalVector3f) > 0.0 && lightmapCoords2f.g > 0.5 &&
(u_sunColor3f_sky1f.r + u_sunColor3f_sky1f.g + u_sunColor3f_sky1f.b) > 0.001) {
#ifdef DO_COMPILE_SUN_SHADOWS
// ========== SUN SHADOW: LOD0 ============ //
float skyLight = max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
float shadowSample = 1.0;
vec4 shadowWorldPos4f = worldPosition4f;
shadowWorldPos4f.xyz += normalVector3f * 0.05;
vec4 shadowTexPos4f;
vec2 tmpVec2;
for(;;) {
shadowTexPos4f = u_sunShadowMatrixLOD04f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy * vec2(1.0, SUN_SHADOW_MAP_FRAC), shadowTexPos4f.z), 0.0);
#ifdef COMPILE_SUN_SHADOW_SMOOTH
shadowSample *= SMOOTH_SHADOW_SAMPLES;
SMOOTH_SHADOW_POISSON_SAMPLE(0, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(1, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(2, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(3, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(4, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(5, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
SMOOTH_SHADOW_POISSON_SAMPLE(6, u_sunShadowDepthTexture, 0.0, shadowTexPos4f.xyz, shadowSample, tmpVec2)
shadowSample = max(shadowSample * 2.0 - 1.0, 0.0);
#endif
break;
}
#if defined(COMPILE_SUN_SHADOW_LOD1) || defined(COMPILE_SUN_SHADOW_LOD2)
shadowTexPos4f = u_sunShadowMatrixLOD14f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 1.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
break;
}
#endif
#ifdef COMPILE_SUN_SHADOW_LOD2
shadowTexPos4f = u_sunShadowMatrixLOD24f * shadowWorldPos4f;
if(shadowTexPos4f.xyz == clamp(shadowTexPos4f.xyz, vec3(0.005), vec3(0.995))) {
shadowTexPos4f.y += 2.0;
shadowTexPos4f.y *= SUN_SHADOW_MAP_FRAC;
shadowSample = textureLod(u_sunShadowDepthTexture, vec3(shadowTexPos4f.xy, shadowTexPos4f.z + 0.00015), 0.0);
}
#endif
break;
}
#endif
lightColor3f = u_sunColor3f_sky1f.rgb * max(lightmapCoords2f.g * 2.0 - 1.0, 0.0);
#ifdef DO_COMPILE_SUN_SHADOWS
lightColor3f *= shadowSample * skyLight;
#endif
lightColor3f = eaglercraftLighting_Water(diffuseColor4f.rgb, lightColor3f, -worldDirection4f.xyz, u_sunDirection4f.xyz, normalVector3f) * u_blockSkySunDynamicLightFac4f.z;
}
// =========== REFLECTION MAP =========== //
lightmapCoords2f *= lightmapCoords2f;
float e = 0.0;
e += envMapSample4f.g <= 0.0 ? 0.0 : 1.0;
e += lightmapCoords2f.y > 0.5 ? 0.0 : 1.0;
//e += abs(normalVector3f.y) > 0.1 ? 0.0 : 1.0;
if(e == 0.0) {
vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
reflectDir.xz /= abs(reflectDir.y) + 1.0;
float dst = 1.0 - dot(reflectDir.xz, reflectDir.xz);
dst *= dst;
reflectDir.xz *= 0.975;
if(dst < 0.005) {
vec4 sample1 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, 0.25) + vec2(0.5, 0.25), 0.0);
vec4 sample2 = textureLod(u_environmentMap, reflectDir.xz * vec2(0.5, -0.25) + vec2(0.5, 0.75), 0.0);
envMapSample4f = vec4(mix(sample1.rgb, sample2.rgb, smoothstep(0.0, 1.0, reflectDir.y * -12.5 + 0.5)).rgb, min(sample1.a, sample2.a));
}else {
reflectDir.xz *= vec2(0.5, reflectDir.y > 0.0 ? 0.25 : -0.25);
reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
}
envMapSample4f.rgb *= (lightmapCoords2f.y * 2.0 - 1.0);
}
if(envMapSample4f.g > 0.0) {
lightColor3f += eaglercraftIBL_Specular_Water(envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f) * 0.5;
}
#ifdef COMPILE_DYNAMIC_LIGHTS
// =========== DYNAMIC LIGHTING =========== //
vec3 dlightDist3f, dlightDir3f, dlightColor3f;
int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; // hate this
for(int i = 0; i < safeLightCount; ++i) {
dlightDist3f = u_dynamicLightArray[i].u_lightPosition4f.xyz - worldPosition4f.xyz;
dlightDir3f = normalize(dlightDist3f);
if(dot(dlightDir3f, normalVector3f) <= 0.0) {
continue;
}
dlightColor3f = u_dynamicLightArray[i].u_lightColor4f.rgb / dot(dlightDist3f, dlightDist3f);
if(dlightColor3f.r + dlightColor3f.g + dlightColor3f.b < 0.025) {
continue;
}
lightColor3f += eaglercraftLighting_Water(diffuseColor4f.rgb, dlightColor3f, -worldDirection4f.xyz, dlightDir3f, normalVector3f) * u_blockSkySunDynamicLightFac4f.w;
}
#endif
// ============ CACLULATE FOG ============= //
vec4 fogBlend4f = vec4(0.0);
while(u_fogParameters4f.x > 0.0) {
float atmos = u_fogParameters4f.x >= 4.0 ? 4.0 : 0.0;
float type = u_fogParameters4f.x - atmos;
fogBlend4f = mix(u_fogColorLight4f, u_fogColorDark4f, lightmapCoords2f.g);
float f, l = length(v_position4f.xyz);
if(type == 1.0) {
f = (l - u_fogParameters4f.z) / (u_fogParameters4f.w - u_fogParameters4f.z);
}else {
f = 1.0 - exp(-u_fogParameters4f.y * l);
}
fogBlend4f.a *= clamp(f, 0.0, 1.0);
if(atmos == 0.0) {
break;
}
vec3 atmosSamplePos = v_position4f.xyz / -l;
atmosSamplePos.xz /= abs(atmosSamplePos.y) + 1.0;
atmosSamplePos.xz *= vec2(-0.5, -0.25) * 0.75;
atmosSamplePos.xz += vec2(0.5, 0.25);
fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb + u_fogColorAddSun4f.rgb;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
fogBlend4f.a = fogBlend4f.a * 0.9 + 0.1;
#endif
break;
}
// ============ OUTPUT COLOR ============== //
vec3 blockLight = lightmapCoords2f.r * vec3(1.0, 0.5809, 0.2433) * 2.0 * u_blockSkySunDynamicLightFac4f.x;
vec3 skyLight = (lightmapCoords2f.g + 0.05) * vec3(0.9102, 0.9, 1.0) * u_blockSkySunDynamicLightFac4f.y;
diffuseColor4f.rgb *= (skyLight + blockLight) * 0.075;
diffuseColor4f.rgb += lightColor3f;
diffuseColor4f.rgb = mix(diffuseColor4f.rgb + refractionSample.rgb, fogBlend4f.rgb, fogBlend4f.a);
output4f = vec4(diffuseColor4f.rgb, 1.0);
}

View File

@ -1,82 +1,82 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
out vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_projectionMat4f * v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
v_positionClip2f = gl_Position.xy / gl_Position.w;
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
in vec3 a_position3f;
out vec4 v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
out vec2 v_positionClip2f;
#endif
#ifdef COMPILE_TEXTURE_ATTRIB
in vec2 a_texture2f;
out vec2 v_texture2f;
uniform mat4 u_textureMat4f01;
#endif
#ifdef COMPILE_COLOR_ATTRIB
in vec4 a_color4f;
out vec4 v_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
in vec4 a_normal4f;
out vec3 v_normal3f;
out float v_block1f;
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
in vec2 a_lightmap2f;
out vec2 v_lightmap2f;
uniform mat4 u_textureMat4f02;
#endif
uniform mat4 u_modelviewMat4f;
uniform mat4 u_projectionMat4f;
#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw)
void main() {
v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0);
#ifdef COMPILE_TEXTURE_ATTRIB
vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0);
v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z;
#endif
#ifdef COMPILE_COLOR_ATTRIB
v_color4f = a_color4f;
#endif
#ifdef COMPILE_NORMAL_ATTRIB
v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz);
v_block1f = floor((a_normal4f.w + 1.0) * 127.0 + 0.5);
#endif
#ifdef COMPILE_LIGHTMAP_ATTRIB
vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0);
v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z;
#endif
gl_Position = u_projectionMat4f * v_position4f;
#ifdef COMPILE_FOG_LIGHT_SHAFTS
v_positionClip2f = gl_Position.xy / gl_Position.w;
#endif
}

View File

@ -1,238 +1,238 @@
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
#ifdef COMPILE_REPROJECT_SSAO
layout(location = 0) out vec4 reprojectionSSAOOutput4f;
#ifdef COMPILE_REPROJECT_SSR
layout(location = 1) out vec4 reprojectionReflectionOutput4f;
layout(location = 2) out vec4 reprojectionHitVectorOutput4f;
#endif
#else
layout(location = 0) out vec4 reprojectionReflectionOutput4f;
layout(location = 1) out vec4 reprojectionHitVectorOutput4f;
#endif
uniform sampler2D u_gbufferDepthTexture;
#ifdef COMPILE_REPROJECT_SSAO
uniform sampler2D u_ssaoSampleTexture;
// R: ssao history length
// G: ssao value
// B: pixel opacity
// A: padding
uniform sampler2D u_reprojectionSSAOInput4f;
#endif
#ifdef COMPILE_REPROJECT_SSR
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
// R: reflection R
// G: reflection G
// B: reflection B
// A: current step
uniform sampler2D u_reprojectionReflectionInput4f;
// R: relative X of reflected pixel from origin
// G: relative Y of reflected pixel from origin
// B: relative Z of reflected pixel from origin
// A: is reflected flag
uniform sampler2D u_reprojectionHitVectorInput4f;
uniform sampler2D u_lastFrameColorInput4f;
uniform mat4 u_projectionMatrix4f;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_lastInverseProjMatrix4f;
// matrix to transform view pos in old frame to view pos in current frame
uniform mat4 u_reprojectionInverseViewMatrix4f;
uniform mat4 u_viewToPreviousProjMatrix4f;
#endif
uniform sampler2D u_reprojectionDepthTexture;
uniform mat4 u_inverseViewProjMatrix4f;
uniform mat4 u_reprojectionMatrix4f;
// x = near plane
// y = far plane
// z = near plane * 2
// w = far plane - near plane
uniform vec4 u_nearFarPlane4f;
uniform vec4 u_pixelAlignment4f;
#define reprojDepthLimit 0.25
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
#define CREATE_DEPTH_MATRIX(matrix4fInput) mat4x2(matrix4fInput[0].zw,matrix4fInput[1].zw,matrix4fInput[2].zw,matrix4fInput[3].zw)
void main() {
vec2 v_position2f2 = (floor(v_position2f * u_pixelAlignment4f.xy) + 0.25) * (2.0 / u_pixelAlignment4f.zw);
#ifdef COMPILE_REPROJECT_SSAO
reprojectionSSAOOutput4f = vec4(0.0, 1.0, 0.0, 0.0);
#endif
#ifdef COMPILE_REPROJECT_SSR
reprojectionReflectionOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
#endif
float fragDepth = textureLod(u_gbufferDepthTexture, v_position2f2, 0.0).r;
if(fragDepth < 0.000001) {
return;
}
vec4 fragClipSpacePos4f = vec4(v_position2f2, fragDepth, 1.0) * 2.0 - 1.0;
vec4 fragPos4f = u_inverseViewProjMatrix4f * fragClipSpacePos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
vec4 reprojPos4f = u_reprojectionMatrix4f * fragPos4f;
vec4 reprojClipPos4f = vec4(reprojPos4f.xyz / reprojPos4f.w, 1.0);
reprojPos4f = reprojClipPos4f;
reprojPos4f.xyz *= 0.5;
reprojPos4f.xyz += 0.5;
reprojPos4f.xy = (floor(reprojPos4f.xy * u_pixelAlignment4f.zw) + 0.5) * (0.5 / u_pixelAlignment4f.xy);
if(reprojPos4f.xy != clamp(reprojPos4f.xy, vec2(0.001), vec2(0.999)) || abs(GET_LINEAR_DEPTH_FROM_VALUE(textureLod(u_reprojectionDepthTexture, reprojPos4f.xy, 0.0).r) - GET_LINEAR_DEPTH_FROM_VALUE(reprojPos4f.z)) > reprojDepthLimit) {
#ifdef COMPILE_REPROJECT_SSAO
reprojectionSSAOOutput4f = vec4(0.01, textureLod(u_ssaoSampleTexture, v_position2f, 0.0).r, 1.0, 0.0);
#endif
#ifdef COMPILE_REPROJECT_SSR
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 50.0);
#endif
return;
}
#ifdef COMPILE_REPROJECT_SSAO
vec4 reprojectionSSAOInput4f = textureLod(u_reprojectionSSAOInput4f, reprojPos4f.xy, 0.0);
reprojectionSSAOInput4f.g = mix(textureLod(u_ssaoSampleTexture, v_position2f, 0.0).r, reprojectionSSAOInput4f.g, min(reprojectionSSAOInput4f.r * 10.0, 0.85));
reprojectionSSAOInput4f.r = min(reprojectionSSAOInput4f.r + 0.01, 1.0);
reprojectionSSAOInput4f.b = 1.0;
reprojectionSSAOOutput4f = reprojectionSSAOInput4f;
#endif
#ifdef COMPILE_REPROJECT_SSR
vec4 materials = textureLod(u_gbufferMaterialTexture, v_position2f2, 0.0);
float f = materials.g < 0.06 ? 1.0 : 0.0;
f += materials.r < 0.5 ? 1.0 : 0.0;
f += materials.a > 0.5 ? 1.0 : 0.0;
if(f > 0.0) {
return;
}
vec4 lastFrameHitVector4f = textureLod(u_reprojectionHitVectorInput4f, reprojPos4f.xy, 0.0);
if(lastFrameHitVector4f.g <= 0.0) {
reprojectionReflectionOutput4f = textureLod(u_reprojectionReflectionInput4f, reprojPos4f.xy, 0.0);
reprojectionReflectionOutput4f.a = max(reprojectionReflectionOutput4f.a - 1.0, 1.0);
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, lastFrameHitVector4f.a);
return;
}
reprojectionReflectionOutput4f = vec4(0.0, 0.0, 0.0, 1.0);
lastFrameHitVector4f.g -= 0.0004;
vec4 lastFrameFragPosView4f = u_lastInverseProjMatrix4f * vec4(reprojClipPos4f.xyz, 1.0);
lastFrameFragPosView4f.xyz /= lastFrameFragPosView4f.w;
lastFrameFragPosView4f.w = 1.0;
vec4 lastFrameHitPos4f = vec4(lastFrameFragPosView4f.xyz + lastFrameHitVector4f.xyz, 1.0);
vec4 thisFrameHitPos4f = u_reprojectionInverseViewMatrix4f * lastFrameHitPos4f;
thisFrameHitPos4f.xyz /= thisFrameHitPos4f.w;
thisFrameHitPos4f.w = 1.0;
vec4 thisFrameHitPosProj4f = u_projectionMatrix4f * thisFrameHitPos4f;
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
vec3 thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
float fragDepthSample = textureLod(u_gbufferDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPos4f.z - 0.125 < 0.0) {
return;
}
vec3 lastFrameHitPosNormal3f = textureLod(u_gbufferNormalTexture, thisFrameHitPosProjTex3f.xy, 0.0).rgb;
lastFrameHitPosNormal3f *= 2.0;
lastFrameHitPosNormal3f -= 1.0;
vec3 currentNormal3f = textureLod(u_gbufferNormalTexture, v_position2f2, 0.0).xyz;
currentNormal3f *= 2.0;
currentNormal3f -= 1.0;
vec4 fragPosView4f = u_inverseProjectionMatrix4f * fragClipSpacePos4f;
fragPosView4f.xyz /= fragPosView4f.w;
fragPosView4f.w = 1.0;
vec3 rayOrigin = fragPosView4f.xyz;
vec3 planePos = thisFrameHitPos4f.xyz;
vec3 planeNormal = lastFrameHitPosNormal3f;
vec3 newRayDirection = reflect(normalize(rayOrigin), currentNormal3f.xyz);
float dist = dot(planeNormal, newRayDirection);
if(dist > 0.9) {
return;
}
dist = dot(planeNormal, planePos - rayOrigin) / dist;
if(dist < 0.0) {
return;
}
reprojectionHitVectorOutput4f = vec4(newRayDirection * dist, 1.0);
reprojectionHitVectorOutput4f.y += 0.0004;
thisFrameHitPosProj4f = u_viewToPreviousProjMatrix4f * vec4(rayOrigin + newRayDirection * dist, 1.0);
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
fragDepthSample = textureLod(u_reprojectionDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * thisFrameHitPosProj4f;
thisFrameHitPosProjPos.x /= thisFrameHitPosProjPos.y;
thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPosProjPos.x - 0.125 < 0.0) {
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
return;
}
reprojectionReflectionOutput4f = vec4(textureLod(u_lastFrameColorInput4f, thisFrameHitPosProjTex3f.xy, 0.0).rgb, 0.0);
#endif
}
#line 2
/*
* Copyright (c) 2023 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
precision lowp int;
precision highp float;
precision highp sampler2D;
in vec2 v_position2f;
#ifdef COMPILE_REPROJECT_SSAO
layout(location = 0) out vec4 reprojectionSSAOOutput4f;
#ifdef COMPILE_REPROJECT_SSR
layout(location = 1) out vec4 reprojectionReflectionOutput4f;
layout(location = 2) out vec4 reprojectionHitVectorOutput4f;
#endif
#else
layout(location = 0) out vec4 reprojectionReflectionOutput4f;
layout(location = 1) out vec4 reprojectionHitVectorOutput4f;
#endif
uniform sampler2D u_gbufferDepthTexture;
#ifdef COMPILE_REPROJECT_SSAO
uniform sampler2D u_ssaoSampleTexture;
// R: ssao history length
// G: ssao value
// B: pixel opacity
// A: padding
uniform sampler2D u_reprojectionSSAOInput4f;
#endif
#ifdef COMPILE_REPROJECT_SSR
uniform sampler2D u_gbufferNormalTexture;
uniform sampler2D u_gbufferMaterialTexture;
// R: reflection R
// G: reflection G
// B: reflection B
// A: current step
uniform sampler2D u_reprojectionReflectionInput4f;
// R: relative X of reflected pixel from origin
// G: relative Y of reflected pixel from origin
// B: relative Z of reflected pixel from origin
// A: is reflected flag
uniform sampler2D u_reprojectionHitVectorInput4f;
uniform sampler2D u_lastFrameColorInput4f;
uniform mat4 u_projectionMatrix4f;
uniform mat4 u_inverseProjectionMatrix4f;
uniform mat4 u_lastInverseProjMatrix4f;
// matrix to transform view pos in old frame to view pos in current frame
uniform mat4 u_reprojectionInverseViewMatrix4f;
uniform mat4 u_viewToPreviousProjMatrix4f;
#endif
uniform sampler2D u_reprojectionDepthTexture;
uniform mat4 u_inverseViewProjMatrix4f;
uniform mat4 u_reprojectionMatrix4f;
// x = near plane
// y = far plane
// z = near plane * 2
// w = far plane - near plane
uniform vec4 u_nearFarPlane4f;
uniform vec4 u_pixelAlignment4f;
#define reprojDepthLimit 0.25
#define GET_LINEAR_DEPTH_FROM_VALUE(depthSample) (u_nearFarPlane4f.z / (u_nearFarPlane4f.y + u_nearFarPlane4f.x + (depthSample * 2.0 - 1.0) * u_nearFarPlane4f.w))
#define CREATE_DEPTH_MATRIX(matrix4fInput) mat4x2(matrix4fInput[0].zw,matrix4fInput[1].zw,matrix4fInput[2].zw,matrix4fInput[3].zw)
void main() {
vec2 v_position2f2 = (floor(v_position2f * u_pixelAlignment4f.xy) + 0.25) * (2.0 / u_pixelAlignment4f.zw);
#ifdef COMPILE_REPROJECT_SSAO
reprojectionSSAOOutput4f = vec4(0.0, 1.0, 0.0, 0.0);
#endif
#ifdef COMPILE_REPROJECT_SSR
reprojectionReflectionOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
#endif
float fragDepth = textureLod(u_gbufferDepthTexture, v_position2f2, 0.0).r;
if(fragDepth < 0.000001) {
return;
}
vec4 fragClipSpacePos4f = vec4(v_position2f2, fragDepth, 1.0) * 2.0 - 1.0;
vec4 fragPos4f = u_inverseViewProjMatrix4f * fragClipSpacePos4f;
fragPos4f.xyz /= fragPos4f.w;
fragPos4f.w = 1.0;
vec4 reprojPos4f = u_reprojectionMatrix4f * fragPos4f;
vec4 reprojClipPos4f = vec4(reprojPos4f.xyz / reprojPos4f.w, 1.0);
reprojPos4f = reprojClipPos4f;
reprojPos4f.xyz *= 0.5;
reprojPos4f.xyz += 0.5;
reprojPos4f.xy = (floor(reprojPos4f.xy * u_pixelAlignment4f.zw) + 0.5) * (0.5 / u_pixelAlignment4f.xy);
if(reprojPos4f.xy != clamp(reprojPos4f.xy, vec2(0.001), vec2(0.999)) || abs(GET_LINEAR_DEPTH_FROM_VALUE(textureLod(u_reprojectionDepthTexture, reprojPos4f.xy, 0.0).r) - GET_LINEAR_DEPTH_FROM_VALUE(reprojPos4f.z)) > reprojDepthLimit) {
#ifdef COMPILE_REPROJECT_SSAO
reprojectionSSAOOutput4f = vec4(0.01, textureLod(u_ssaoSampleTexture, v_position2f, 0.0).r, 1.0, 0.0);
#endif
#ifdef COMPILE_REPROJECT_SSR
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 50.0);
#endif
return;
}
#ifdef COMPILE_REPROJECT_SSAO
vec4 reprojectionSSAOInput4f = textureLod(u_reprojectionSSAOInput4f, reprojPos4f.xy, 0.0);
reprojectionSSAOInput4f.g = mix(textureLod(u_ssaoSampleTexture, v_position2f, 0.0).r, reprojectionSSAOInput4f.g, min(reprojectionSSAOInput4f.r * 10.0, 0.85));
reprojectionSSAOInput4f.r = min(reprojectionSSAOInput4f.r + 0.01, 1.0);
reprojectionSSAOInput4f.b = 1.0;
reprojectionSSAOOutput4f = reprojectionSSAOInput4f;
#endif
#ifdef COMPILE_REPROJECT_SSR
vec4 materials = textureLod(u_gbufferMaterialTexture, v_position2f2, 0.0);
float f = materials.g < 0.06 ? 1.0 : 0.0;
f += materials.r < 0.5 ? 1.0 : 0.0;
f += materials.a > 0.5 ? 1.0 : 0.0;
if(f > 0.0) {
return;
}
vec4 lastFrameHitVector4f = textureLod(u_reprojectionHitVectorInput4f, reprojPos4f.xy, 0.0);
if(lastFrameHitVector4f.g <= 0.0) {
reprojectionReflectionOutput4f = textureLod(u_reprojectionReflectionInput4f, reprojPos4f.xy, 0.0);
reprojectionReflectionOutput4f.a = max(reprojectionReflectionOutput4f.a - 1.0, 1.0);
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, lastFrameHitVector4f.a);
return;
}
reprojectionReflectionOutput4f = vec4(0.0, 0.0, 0.0, 1.0);
lastFrameHitVector4f.g -= 0.0004;
vec4 lastFrameFragPosView4f = u_lastInverseProjMatrix4f * vec4(reprojClipPos4f.xyz, 1.0);
lastFrameFragPosView4f.xyz /= lastFrameFragPosView4f.w;
lastFrameFragPosView4f.w = 1.0;
vec4 lastFrameHitPos4f = vec4(lastFrameFragPosView4f.xyz + lastFrameHitVector4f.xyz, 1.0);
vec4 thisFrameHitPos4f = u_reprojectionInverseViewMatrix4f * lastFrameHitPos4f;
thisFrameHitPos4f.xyz /= thisFrameHitPos4f.w;
thisFrameHitPos4f.w = 1.0;
vec4 thisFrameHitPosProj4f = u_projectionMatrix4f * thisFrameHitPos4f;
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
vec3 thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
float fragDepthSample = textureLod(u_gbufferDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_inverseProjectionMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPos4f.z - 0.125 < 0.0) {
return;
}
vec3 lastFrameHitPosNormal3f = textureLod(u_gbufferNormalTexture, thisFrameHitPosProjTex3f.xy, 0.0).rgb;
lastFrameHitPosNormal3f *= 2.0;
lastFrameHitPosNormal3f -= 1.0;
vec3 currentNormal3f = textureLod(u_gbufferNormalTexture, v_position2f2, 0.0).xyz;
currentNormal3f *= 2.0;
currentNormal3f -= 1.0;
vec4 fragPosView4f = u_inverseProjectionMatrix4f * fragClipSpacePos4f;
fragPosView4f.xyz /= fragPosView4f.w;
fragPosView4f.w = 1.0;
vec3 rayOrigin = fragPosView4f.xyz;
vec3 planePos = thisFrameHitPos4f.xyz;
vec3 planeNormal = lastFrameHitPosNormal3f;
vec3 newRayDirection = reflect(normalize(rayOrigin), currentNormal3f.xyz);
float dist = dot(planeNormal, newRayDirection);
if(dist > 0.9) {
return;
}
dist = dot(planeNormal, planePos - rayOrigin) / dist;
if(dist < 0.0) {
return;
}
reprojectionHitVectorOutput4f = vec4(newRayDirection * dist, 1.0);
reprojectionHitVectorOutput4f.y += 0.0004;
thisFrameHitPosProj4f = u_viewToPreviousProjMatrix4f * vec4(rayOrigin + newRayDirection * dist, 1.0);
thisFrameHitPosProj4f.xyz /= thisFrameHitPosProj4f.w;
thisFrameHitPosProj4f.w = 1.0;
thisFrameHitPosProjTex3f = thisFrameHitPosProj4f.xyz * 0.5 + 0.5;
if(thisFrameHitPosProjTex3f.xy != clamp(thisFrameHitPosProjTex3f.xy, vec2(0.001), vec2(0.999))) {
return;
}
fragDepthSample = textureLod(u_reprojectionDepthTexture, thisFrameHitPosProjTex3f.xy, 0.0).r * 2.0 - 1.0;
vec2 thisFrameHitPosProjPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * thisFrameHitPosProj4f;
thisFrameHitPosProjPos.x /= thisFrameHitPosProjPos.y;
thisFrameHitPosProjDepthPos = CREATE_DEPTH_MATRIX(u_lastInverseProjMatrix4f) * vec4(thisFrameHitPosProj4f.xy, fragDepthSample, 1.0);
thisFrameHitPosProjDepthPos.x /= thisFrameHitPosProjDepthPos.y;
if(thisFrameHitPosProjDepthPos.x - thisFrameHitPosProjPos.x - 0.125 < 0.0) {
reprojectionHitVectorOutput4f = vec4(0.0, 0.0, 0.0, 0.0);
return;
}
reprojectionReflectionOutput4f = vec4(textureLod(u_lastFrameColorInput4f, thisFrameHitPosProjTex3f.xy, 0.0).rgb, 0.0);
#endif
}

Some files were not shown because too many files have changed in this diff Show More