mirror of
https://git.webmc.xyz/Starlike-Client/Starlike-Client
synced 2025-06-04 01:42:01 -09:00
Starlike v0.1.1
This commit is contained in:
parent
d8637f6863
commit
fdb046cdce
71
.github/workflows/build.yml
vendored
Normal file
71
.github/workflows/build.yml
vendored
Normal 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
3
.gitignore
vendored
@ -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
0
CompileEPK.sh
Normal file → Executable file
0
CompileJS.sh
Normal file → Executable file
0
CompileJS.sh
Normal file → Executable 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
2
MakeOfflineDownload.sh
Normal file → Executable 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
0
MakeSignedClient.sh
Normal file → Executable 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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
26
desktopRuntime/eclipseProject/.classpath
Normal file
26
desktopRuntime/eclipseProject/.classpath
Normal 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>
|
44
desktopRuntime/eclipseProject/.project
Normal file
44
desktopRuntime/eclipseProject/.project
Normal 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
@ -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"> < Cancel > </span>   <span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_done _eaglercraftX_boot_menu_popup_input_opt_selected"> < Done > </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 ↑ and ↓ 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 ↑ and ↓ 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 ↑ and ↓ 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 ↑ and ↓ keys to select which entry is highlighted.<br>Press CTRL+↑ and CTRL+↓ 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"> < Cancel > </span>   <span class="_eaglercraftX_boot_menu_popup_input_opt _eaglercraftX_boot_menu_popup_input_opt_done _eaglercraftX_boot_menu_popup_input_opt_selected"> < Done > </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 ↑ and ↓ 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 ↑ and ↓ 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 ↑ and ↓ 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 ↑ and ↓ keys to select which entry is highlighted.<br>Press CTRL+↑ and CTRL+↓ to adjust item order, or ESC to cancel.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -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;
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"client_launch_type": "EAGLERX_V1",
|
||||
"clear_cookies_before_launch": false
|
||||
{
|
||||
"client_launch_type": "EAGLERX_V1",
|
||||
"clear_cookies_before_launch": false
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"client_launch_type": "PEYTON_V2",
|
||||
"clear_cookies_before_launch": false
|
||||
{
|
||||
"client_launch_type": "PEYTON_V2",
|
||||
"clear_cookies_before_launch": false
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"client_launch_type": "PEYTON_V2",
|
||||
"clear_cookies_before_launch": false
|
||||
{
|
||||
"client_launch_type": "PEYTON_V2",
|
||||
"clear_cookies_before_launch": false
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"client_launch_type": "PEYTON_V1",
|
||||
"clear_cookies_before_launch": false
|
||||
{
|
||||
"client_launch_type": "PEYTON_V1",
|
||||
"clear_cookies_before_launch": false
|
||||
}
|
@ -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
|
||||
}
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -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> <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> <button id="bootMenu">Enter Boot Menu</button></p></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -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>
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
||||
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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]
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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,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)));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user