Compare commits

...
26 Commits
Author SHA1 Message Date
Bobby Dilley feaa6a912e Make messages more similar 2025-05-23 13:13:41 +01:00
Bobby Dilley b129220822 Add birthday checking! 2025-05-23 13:12:04 +01:00
dkeruza e7d8c5a80a Added libuuid.so.1 to the AppImage. 2025-04-16 10:26:08 -04:00
dkeruza 55fd8955c1 Merge pull request #95 from dkeruza-neo/master
Added libs to AppImage and fixed a bug in lindbergh.c
2025-04-15 19:53:01 -04:00
dkeruza-neo ea35dcdad2 fixed build-deps 2025-04-15 20:37:12 -03:00
dkeruza-neo fb557044d7 Added libs to AppImage and fixed a bug in lindbergh.c 2025-04-15 20:22:37 -03:00
dkeruza 0e8b3b4a59 Merge pull request #92 from dkeruza-neo/master
AppImage support.
2025-04-12 00:41:08 -04:00
dkeruza-neo f17dd93778 Merge remote-tracking branch 'upstream/master' 2025-04-12 00:30:36 -04:00
dkeruza-neo e359cbb0bd Added AppImage, fixed 2Spicy Resolution, again. 2025-04-12 00:28:50 -04:00
dkeruza 72f70ccda1 Merge pull request #90 from dkeruza-neo/master
2Spicy error in the scaling code.
2025-04-06 16:14:12 -04:00
dkeruza-neo 0a29307870 2Spicy error in the scaling code. 2025-04-06 16:12:48 -04:00
dkeruza-neo d202f31717 fixed changelog 2025-04-06 16:12:48 -04:00
dkeruza a68dcbbdcf Merge pull request #88 from dkeruza-neo/master
Resolution patches for 2Spicy and HOD-Ex
2025-04-06 13:28:44 -04:00
dkeruza 75642e285e Merge branch 'master' into master 2025-04-06 13:22:14 -04:00
dkeruza-neo d9d076f120 Added 2Spicy and HOD-Ex resolution patches. 2025-04-06 13:11:58 -04:00
dkeruza a5633bbf1d Fixed an indentation in the Flatpak script. 2025-04-06 12:38:17 -04:00
dkeruza d72ac379ea Fixed Flatpak script.
There was a bug in the script preventing it to launch.
2025-04-06 11:34:49 -04:00
dkeruza-neo c5c44ce395 Fixed flatpak build script. 2025-04-06 11:33:14 -04:00
dkeruza 988a9ee6e3 Merge pull request #86 from dkeruza-neo/master
libCg.so path, better folder redirection.
2025-04-06 04:31:52 -04:00
dkeruza-neo ea19a688cc Recompiled shaders redirectio, and lib path. 2025-04-06 04:30:09 -04:00
dkeruza c5fa5871d1 Merge pull request #85 from dkeruza-neo/master
changelog and guide.
2025-04-05 18:17:04 -04:00
dkeruza-neo 5be9aef4e0 changelog and guide 2025-04-05 18:16:04 -04:00
dkeruza f89f8e41ab Merge pull request #84 from dkeruza-neo/master
Stand alone lindbergh loader
2025-04-05 17:45:30 -04:00
dkeruza-neo ad085a1610 Stand alone lindbergh ELF. 2025-04-05 17:43:45 -04:00
dkeruza edba8bac7a Merge pull request #83 from dkeruza-neo/master
Preprocessos and HOD4-SP testome stretch.
2025-04-05 17:37:01 -04:00
dkeruza-neo 98c6b740fd Changed preprocessor for avoiding multiple inclusions to #pragma once and clean some includes.
Test mode in HOD4 SP now stretches.
2025-04-05 17:34:07 -04:00
52 changed files with 1847 additions and 1291 deletions
+33
View File
@@ -0,0 +1,33 @@
name: 🐧 Linux AppImage
on:
workflow_call:
workflow_dispatch:
jobs:
linux-appimage:
name: "Build"
runs-on: ubuntu-22.04
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Packages
run: scripts/appimage/install-packages.sh
- name: Build Deps
run: scripts/appimage/build-deps.sh
- name: Compile Build
shell: bash
run: |
make
scripts/appimage/make-appimage.sh
- name: Upload AppImage
uses: actions/upload-artifact@v4
with:
name: "linux-appimage"
path: "lindbergh-loader.AppImage"
+5 -1
View File
@@ -24,10 +24,13 @@ jobs:
linux-flatpak: linux-flatpak:
name: 📦 Linux Flatpak name: 📦 Linux Flatpak
uses: "./.github/workflows/flatpak-build.yml" uses: "./.github/workflows/flatpak-build.yml"
linux-appimage:
name: 📦 Linux AppImage
uses: "./.github/workflows/appimage-build.yml"
create-release: create-release:
name: 📤 Create Release name: 📤 Create Release
needs: [linux-build, linux-flatpak] needs: [linux-build, linux-flatpak, linux-appimage]
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
steps: steps:
@@ -55,3 +58,4 @@ jobs:
files: | files: |
./artifacts/linux-flatpak/lindbergh-loader.flatpak ./artifacts/linux-flatpak/lindbergh-loader.flatpak
./artifacts/linux-build/build.tar.gz ./artifacts/linux-build/build.tar.gz
./artifacts/linux-appimage/lindbergh-loader.AppImage
+5 -6
View File
@@ -12,9 +12,8 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)
# Source files for various targets # Source files for various targets
file(GLOB LIND_OBJS "src/lindbergh/*.c" "src/lindbergh/*.cpp") file(GLOB LIND_OBJS "src/lindbergh/*.c")
list(FILTER LIND_OBJS EXCLUDE REGEX "src/lindbergh/lindbergh.o") list(FILTER LIND_OBJS EXCLUDE REGEX "src/lindbergh/lindbergh.c")
list(FILTER LIND_OBJS EXCLUDE REGEX "src/lindbergh/evdevinput.o")
file(GLOB XDIFF_SRCS "src/libxdiff/xdiff/*.c") file(GLOB XDIFF_SRCS "src/libxdiff/xdiff/*.c")
@@ -27,12 +26,12 @@ set(LINDBERGH_CXX_FLAGS ${LINDBERGH_C_FLAGS} -std=c++11)
set(LIBXDIFF_C_FLAGS -DHAVE_CONFIG_H -fPIC -m32) set(LIBXDIFF_C_FLAGS -DHAVE_CONFIG_H -fPIC -m32)
set(LIBSEGAAPI_CXX_FLAGS -m32 -fPIC -shared) set(LIBSEGAAPI_CXX_FLAGS -m32 -fPIC -shared)
set(LIBSEGAAPI_LINKER_FLAGS -m32 -lFAudio) set(LIBSEGAAPI_LINKER_FLAGS -m32 -lFAudio)
set(SHARED_LINKER_FLAGS -m32 -Wl,-z,defs -rdynamic -static-libstdc++ -static-libgcc -lc -ldl -lGL -lglut -lX11 -lSDL2 -lm -lpthread -shared -lstdc++ -nostdlib -lasound) set(SHARED_LINKER_FLAGS -m32 -Wl,-z,defs -rdynamic -static-libstdc++ -static-libgcc -lc -ldl -lGL -lglut -lX11 -lXcursor -lSDL2 -lm -lpthread -shared -lstdc++ -nostdlib -lasound)
# Build executable for lindbergh # Build executable for lindbergh
add_executable(lindyloader src/lindbergh/lindbergh.c src/lindbergh/evdevinput.c src/lindbergh/evdevinput.h) add_executable(lindyloader src/lindbergh/lindbergh.c src/lindbergh/evdevinput.c src/lindbergh/evdevinput.h src/lindbergh/log.c src/lindbergh/log.h src/lindbergh/jvs.c src/lindbergh/jvs.h src/lindbergh/config.h src/lindbergh/config.c)
set_target_properties(lindyloader PROPERTIES OUTPUT_NAME "lindbergh") set_target_properties(lindyloader PROPERTIES OUTPUT_NAME "lindbergh")
set_target_properties(lindyloader PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} LINK_FLAGS "-m32") set_target_properties(lindyloader PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} LINK_FLAGS "-m32 -lm")
target_compile_options(lindyloader PRIVATE ${LINDBERGH_EXE}) target_compile_options(lindyloader PRIVATE ${LINDBERGH_EXE})
# Build static library libxdiff.a with its own flags # Build static library libxdiff.a with its own flags
+28
View File
@@ -2,6 +2,34 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [2.0.12]
### Added
- AppImage support.
### Fixed
- 2Spicy error in the scaling code, again.
## [2.0.11]
### Added
- Resolution patches for 2Spicy and HOD-Ex
- Code clean up.
### Fixed
- 2Spicy error in the scaling code.
## [2.0.10]
### Added
- Config option to specify a path for the library libCg.so required for some shader compilation.
- Improved folder patching for recompiled shaders (2Spicy, Rambo, Harly and HOD-EX).
- Cleaned a bit of lindbergh elf.
## [2.0.9]
- lindbergh elf mostly redone to make the loader work as a stand alone mode (read guide.md).
## [2.0.8]
### Added
- Changed preprocessor for avoiding multiple inclusions to #pragma once and clean some includes.
### Fixed
- Test mode in HOD4 SP now stretches.
## [2.0.7] ## [2.0.7]
### Added ### Added
- Option -g | --gamepath to lindbergh to point to games in a different folder. - Option -g | --gamepath to lindbergh to point to games in a different folder.
+44
View File
@@ -224,3 +224,47 @@ flatpak install com.github.tchx84.Flatseal
``` ```
Then, run Flatseal and grant Lindbergh Loader access to additional directories. Then, run Flatseal and grant Lindbergh Loader access to additional directories.
### Stand alone mode
Now, you have the option to run the games without copying any files to the game's folder.
Your system's 32 bit library folder, your current folder and the game's folder will be added to LD_LIBRARY_PATH env variable,
so you can han the loader libs in any of those locations.
Passing -c option you can specify the location of the .conf file like this:
```
./lindbergh -c /my/custom/folder/myconfig.conf
```
## -g or --gamepath
With this new option, you can specify the location of the game, where the game's ELF resides.
```
./lindbergh -g /my/custom/folder/hod4/elf
```
The loader will search for known elf files in that folder but you can also run it like this:
```
./lindbergh myCustom.elf -g /my/custom/folder/hod4/elf
```
The loader will load `myCustom.elf` inside the passed folder.
## Passing a folder containing an elf
With this option, you pass a full path, including an ELF name like this:
```
./lindbergh /my/custom/folder/hod4/elf/myCustom.elf
```
The loader will load the ELF in that folder.
You can combine all options.
You can have the needed libraries in the folder where `lindbergh` resides, in the system's 32 bit lib folder or in the game's folder.
The loader will try to find the files.
If by mistake, you pass both, a full path including an ELF and a path with -g option, the path passed with -g option will be omitted.
Remember that if the path containg spaces, which is not recommended, pass the path inside double quotes or `\` before the space.
+4
View File
@@ -72,6 +72,10 @@ EMULATE_CARDREADER AUTO
# Define the path to the eeprom.bin file # Define the path to the eeprom.bin file
# EEPROM_PATH eeprom.bin # EEPROM_PATH eeprom.bin
# If set, the library libCG.so needed for 2Spicy, Harley, Rambo and HOD-Ex shader recompilation
# will be loaded from the specifyied location. (include the name of file in the location)
# LIBCG_PATH /my/file/location/myLibCg.so
# Set the GPU vendor (0 = Autodetect / 1 = NVidia / 2 = AMD / 3 = ATI(AMD-PRO) / 4 = Intel / 5 = Unknown) # Set the GPU vendor (0 = Autodetect / 1 = NVidia / 2 = AMD / 3 = ATI(AMD-PRO) / 4 = Intel / 5 = Unknown)
# GPU_VENDOR 0 # GPU_VENDOR 0
+30
View File
@@ -0,0 +1,30 @@
#!/usr/bin/env bash
APPIMAGEDIRNAME=lindbergh-loader.AppDir
OUTPUT_FOLDER=$(realpath "./$APPIMAGEDIRNAME")
mkdir build-deps
cd build-deps
# Build openal
wget https://github.com/kcat/openal-soft/archive/refs/tags/openal-soft-1.17.2.tar.gz
tar -xzf openal-soft-1.17.2.tar.gz
cd openal-soft-openal-soft-1.17.2/build
CFLAGS="-m32 -mstackrealign" CXXFLAGS="-m32 -std=c++14 -mstackrealign" cmake ../ -DALSOFT_BACKEND_PULSEAUDIO=ON -DALSOFT_BACKEND_ALSA=ON -DALSOFT_BACKEND_JACK=OFF -DALSOFT_BACKEND_SNDIO=ON
make -j4
sudo cp libopenal.so.1.17.2 /usr/lib/i386-linux-gnu/libopenal.so.0
cd ../../
# Build libSSL and libCrypto
wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_0_9_7.tar.gz
tar -xzf OpenSSL_0_9_7.tar.gz
cd openssl-OpenSSL_0_9_7
cp ../../scripts/appimage/patches/openssl-0.9.7.patch .
./Configure shared 386 no-asm no-krb5 linux-pentium -m32
patch -p1 < openssl-0.9.7.patch
CFLAGS=-m32 make
sudo cp libcrypto.so.0.9.7 /usr/lib/i386-linux-gnu
sudo cp libssl.so.0.9.7 /usr/lib/i386-linux-gnu
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
echo "Install Packages Running..."
sudo dpkg --add-architecture i386
sudo apt update
sudo apt -y install --no-install-recommends \
build-essential gcc-multilib g++-multilib cmake fuse freeglut3-dev:i386 libsdl2-dev:i386 libfaudio-dev:i386 libvdpau1:i386 \
libstdc++5:i386 libxmu6:i386 libpcsclite1:i386 libncurses5:i386 unzip libsndio-dev:i386
sudo add-apt-repository ppa:kisak/kisak-mesa -y
sudo apt update -y && sudo apt upgrade -y
+104
View File
@@ -0,0 +1,104 @@
#!/usr/bin/env bash
APPIMAGENAME=lindbergh-loader
APPIMAGEDIRNAME=lindbergh-loader.AppDir
declare -a ADDED_LIBS=(
"libOpenGL.so.0"
"libGLdispatch.so.0"
"libGLX.so"
"libGLX_indirect.so.0"
"libGLX_mesa.so.0"
"libGL.so.1"
"libGLU.so.1"
"libglut.so.3"
"libglapi.so.0"
"libICE.so.6"
"libSM.so.6"
"libX11.so.6"
"libX11-xcb.so.1"
"libxcb.so.1"
"libxcb-dri2.so.0"
"libxcb-dri3.so.0"
"libxcb-glx.so.0"
"libXmu.so.6"
"libncurses.so.5"
"libpcsclite.so.1"
"libstdc++.so.5"
"libdrm.so.2"
"libexpat.so.1"
"libm.so.6"
"libopenal.so.0"
"libcrypto.so.0.9.7"
"libssl.so.0.9.7"
"libuuid.so.1"
)
set -e
if [ ! -f "linuxdeploy-x86_64" ]; then
wget -O "linuxdeploy-x86_64" https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
chmod +x "linuxdeploy-x86_64"
fi
if [ ! -f "appimagetool-x86_64" ]; then
wget -O "appimagetool-x86_64" https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage
chmod +x "appimagetool-x86_64"
fi
cd build
OUTPUT_FOLDER=$(realpath "./$APPIMAGEDIRNAME")
rm -fr "$OUTPUT_FOLDER"
ADDED_LIBS_ARGS=()
for lib in "${ADDED_LIBS[@]}"; do
ADDED_LIBS_ARGS+=("--library=/usr/lib/i386-linux-gnu/$lib")
done
echo "Copying files into AppDir..."
mkdir -p "$OUTPUT_FOLDER/usr/bin"
mkdir -p "$OUTPUT_FOLDER/usr/lib"
mkdir -p "$OUTPUT_FOLDER/usr/lib32"
# We create the AppRun file
cat > "$OUTPUT_FOLDER/AppRun" << 'EOF'
#!/bin/bash
APP_IMG_ROOT="$(dirname "$(readlink -f "$0")")"
export APP_IMG_ROOT=$APP_IMG_ROOT
export LD_LIBRARY_PATH="$APP_IMG_ROOT/usr/lib32:$LD_LIBRARY_PATH"
exec "$APP_IMG_ROOT/usr/bin/lindbergh" "$@"
EOF
chmod +x "$OUTPUT_FOLDER/AppRun"
cp libkswapapi.so $OUTPUT_FOLDER/usr/lib
cp libsegaapi.so $OUTPUT_FOLDER/usr/lib
cp lindbergh.so $OUTPUT_FOLDER/usr/lib
cp libposixtime.so $OUTPUT_FOLDER/usr/lib
mv lindbergh $OUTPUT_FOLDER/usr/bin
mkdir -p $OUTPUT_FOLDER/usr/lib/dri
cp /usr/lib/i386-linux-gnu/dri/* $OUTPUT_FOLDER/usr/lib/dri
cd ..
echo "Running linuxdeploy to create AppDir..."
./linuxdeploy-x86_64 --appimage-extract-and-run --appdir="$OUTPUT_FOLDER" ${ADDED_LIBS_ARGS[@]} \
--desktop-file="./scripts/lindbergh-loader.desktop" \
--icon-file="./scripts/lindbergh-loader.png"
mv $OUTPUT_FOLDER/usr/lib/libkswapapi.so $OUTPUT_FOLDER/usr/lib32
mv $OUTPUT_FOLDER/usr/lib/libsegaapi.so $OUTPUT_FOLDER/usr/lib32
mv $OUTPUT_FOLDER/usr/lib/lindbergh.so $OUTPUT_FOLDER/usr/lib32
mv $OUTPUT_FOLDER/usr/lib/libposixtime.so $OUTPUT_FOLDER/usr/lib32
mv $OUTPUT_FOLDER/usr/lib/dri $OUTPUT_FOLDER/usr/lib32
unzip libs/Cg-3.1.zip -d $OUTPUT_FOLDER/usr/lib32
cp libs/libCg.so $OUTPUT_FOLDER/usr/lib32/libCg2.so
ln -s -f libposixtime.so $OUTPUT_FOLDER/usr/lib32/libposixtime.so.1
ln -s -f libposixtime.so $OUTPUT_FOLDER/usr/lib32/libposixtime.so.2.4
ln -s -f libkswapapi.so $OUTPUT_FOLDER/usr/lib32/libGLcore.so.1
ln -s -f libkswapapi.so $OUTPUT_FOLDER/usr/lib32/libnvidia-tls.so.1
echo "Generating AppImage..."
rm -f "$APPIMAGENAME.AppImage"
./appimagetool-x86_64 -v "$OUTPUT_FOLDER" "$APPIMAGENAME.AppImage" --appimage-extract-and-run
@@ -0,0 +1,13 @@
diff -ruN openssl-OpenSSL_0_9_7.orig/Makefile.ssl openssl-OpenSSL_0_9_7/Makefile.ssl
--- openssl-OpenSSL_0_9_7.orig/Makefile.ssl 2025-04-14 05:05:11.162340308 +0000
+++ openssl-OpenSSL_0_9_7/Makefile.ssl 2025-04-14 05:06:22.261420144 +0000
@@ -198,7 +198,7 @@
SHARED_SSL=libssl$(SHLIB_EXT)
SHARED_LIBS=$(SHARED_CRYPTO) $(SHARED_SSL)
SHARED_LIBS_LINK_EXTS=.so.$(SHLIB_MAJOR) .so
-SHARED_LDFLAGS=
+SHARED_LDFLAGS=-m32
GENERAL= Makefile
BASENAME= openssl
+64 -83
View File
@@ -1,28 +1,27 @@
app-id: com.github.lindberghloader app-id: com.github.lindberghloader
runtime: org.freedesktop.Platform runtime: org.freedesktop.Platform
runtime-version: &runtime-version '24.08' runtime-version: &runtime-version '24.08'
x-gl-version: &gl-version '1.4'
x-gl-versions: &gl-versions 24.08;1.4
x-gl-merge-dirs: &gl-merge-dirs vulkan/icd.d;glvnd/egl_vendor.d;egl/egl_external_platform.d;OpenCL/vendors;lib/dri;lib/d3d;lib/gbm;vulkan/explicit_layer.d;vulkan/implicit_layer.d
sdk: org.freedesktop.Sdk sdk: org.freedesktop.Sdk
x-gl-versions: &gl-versions '24.08;1.4'
x-gl-merge-dirs: &gl-merge-dirs vulkan/icd.d;glvnd/egl_vendor.d;egl/egl_external_platform.d;OpenCL/vendors;lib/dri;lib/d3d;lib/gbm;vulkan/explicit_layer.d;vulkan/implicit_layer.d # Define GL merge dirs alias
x-i386-build-options: &i386-build-options
libdir: /app/lib32
env:
CC: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-gcc
CXX: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-g++
LD: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-ld
LDFLAGS: "-L/app/lib32"
command: lindbergh command: lindbergh
# SDK extensions needed for building 32-bit components
sdk-extensions: sdk-extensions:
- org.freedesktop.Sdk.Extension.toolchain-i386 - org.freedesktop.Sdk.Extension.toolchain-i386
- org.freedesktop.Sdk.Compat.i386 - org.freedesktop.Sdk.Compat.i386
x-arch-build-options:
i386: &i386-build-options
libdir: /app/lib32
env:
CC: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-gcc
CXX: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-g++
LD: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-ld
LDFLAGS: "-L/app/lib32"
finish-args: finish-args:
- --env=LD_LIBRARY_PATH=/app/lib32:$LD_LIBRARY_PATH - --env=LD_LIBRARY_PATH=/app/lib32:$LD_LIBRARY_PATH
- --env=LDFLAGS="-L/app/lib32"
- --env=PATH=/app/bin:/usr/bin - --env=PATH=/app/bin:/usr/bin
- --allow=multiarch - --allow=multiarch
- --share=ipc - --share=ipc
@@ -33,23 +32,17 @@ finish-args:
- --socket=pulseaudio - --socket=pulseaudio
- --filesystem=~/Games - --filesystem=~/Games
# Runtime extensions automatically downloaded and installed with the app (For some reason does not work)
add-extensions: add-extensions:
org.freedesktop.Platform.Compat.i386: org.freedesktop.Platform.Compat.i386:
directory: lib/i386-linux-gnu directory: lib/i386-linux-gnu
version: *runtime-version version: *runtime-version
no-autodownload: true
# 32-bit graphics driver extension
org.freedesktop.Platform.Compat.i386.Debug:
directory: lib/debug/lib/i386-linux-gnu
version: *runtime-version
no-autodownload: true
org.freedesktop.Platform.GL32: org.freedesktop.Platform.GL32:
directory: lib/i386-linux-gnu/GL directory: lib/i386-linux-gnu/GL
version: *gl-version versions: *gl-versions
versions: *gl-versions
subdirectories: true subdirectories: true
no-autodownload: true
autodelete: false autodelete: false
add-ld-path: lib add-ld-path: lib
merge-dirs: *gl-merge-dirs merge-dirs: *gl-merge-dirs
@@ -57,17 +50,8 @@ add-extensions:
enable-if: active-gl-driver enable-if: active-gl-driver
autoprune-unless: active-gl-driver autoprune-unless: active-gl-driver
org.freedesktop.Platform.GL32.Debug:
directory: lib/debug/lib/i386-linux-gnu/GL
version: *gl-version
versions: *gl-versions
subdirectories: true
no-autodownload: true
merge-dirs: *gl-merge-dirs
enable-if: active-gl-driver
autoprune-unless: active-gl-driver
modules: modules:
# Pre-built 32-bit library (if required)
- name: libstdcxx5 - name: libstdcxx5
buildsystem: simple buildsystem: simple
build-commands: build-commands:
@@ -77,6 +61,7 @@ modules:
- type: file - type: file
path: ./assets/libstdc++.so.5 path: ./assets/libstdc++.so.5
# Build 32-bit libGLU
- name: libGLU - name: libGLU
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
@@ -90,11 +75,13 @@ modules:
url: https://mesa.freedesktop.org/archive/glu/glu-9.0.2.tar.xz url: https://mesa.freedesktop.org/archive/glu/glu-9.0.2.tar.xz
sha256: 6e7280ff585c6a1d9dfcdf2fca489251634b3377bfc33c29e4002466a38d02d4 sha256: 6e7280ff585c6a1d9dfcdf2fca489251634b3377bfc33c29e4002466a38d02d4
# Build 32-bit freeglut
- name: freeglut - name: freeglut
buildsystem: cmake buildsystem: cmake
config-opts: config-opts:
- -DCMAKE_BUILD_TYPE=Release - -DCMAKE_BUILD_TYPE=Release
- -DCMAKE_INSTALL_PREFIX=/app - -DCMAKE_INSTALL_PREFIX=/app
- -DCMAKE_INSTALL_LIBDIR=/app/lib32
sources: sources:
- type: archive - type: archive
url: https://downloads.sourceforge.net/freeglut/freeglut-3.2.2.tar.gz url: https://downloads.sourceforge.net/freeglut/freeglut-3.2.2.tar.gz
@@ -103,6 +90,7 @@ modules:
arch: arch:
x86_64: *i386-build-options x86_64: *i386-build-options
# Build 32-bit libFAudio (dynamic)
- name: libFAudio-Dynamic - name: libFAudio-Dynamic
buildsystem: cmake-ninja buildsystem: cmake-ninja
config-opts: config-opts:
@@ -121,28 +109,25 @@ modules:
url: https://github.com/FNA-XNA/FAudio.git url: https://github.com/FNA-XNA/FAudio.git
tag: "24.12" tag: "24.12"
# Build 32-bit libXmu
- name: libxmu - name: libxmu
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
- --libdir=/app/lib32 - --prefix=/app
- --with-shared - --with-shared
sources: sources:
- type: archive - type: archive
url: https://xorg.freedesktop.org/releases/individual/lib/libXmu-1.2.1.tar.gz url: https://xorg.freedesktop.org/releases/individual/lib/libXmu-1.2.1.tar.gz
sha256: bf0902583dd1123856c11e0a5085bd3c6e9886fbbd44954464975fd7d52eb599 sha256: bf0902583dd1123856c11e0a5085bd3c6e9886fbbd44954464975fd7d52eb599
build-options: build-options:
# arch: arch:
# x86_64: *i386-build-options x86_64: *i386-build-options
env:
CC: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-gcc
CXX: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-g++
LD: /usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-ld
libdir: /app/lib32
# Build 32-bit libmd
- name: libmd - name: libmd
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
- --libdir=/app/lib32 - --prefix=/app
sources: sources:
- type: archive - type: archive
url: https://archive.hadrons.org/software/libmd/libmd-1.1.0.tar.xz url: https://archive.hadrons.org/software/libmd/libmd-1.1.0.tar.xz
@@ -151,10 +136,11 @@ modules:
arch: arch:
x86_64: *i386-build-options x86_64: *i386-build-options
# Build 32-bit libbsd
- name: libbsd - name: libbsd
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
- --libdir=/app/lib32 - --prefix=/app
sources: sources:
- type: archive - type: archive
url: https://libbsd.freedesktop.org/releases/libbsd-0.12.2.tar.xz url: https://libbsd.freedesktop.org/releases/libbsd-0.12.2.tar.xz
@@ -163,10 +149,11 @@ modules:
arch: arch:
x86_64: *i386-build-options x86_64: *i386-build-options
# Build 32-bit ncurses (very old version)
- name: ncurses - name: ncurses
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
- --libdir=/app/lib32 - --prefix=/app
- --with-shared - --with-shared
- --without-debug - --without-debug
sources: sources:
@@ -181,7 +168,8 @@ modules:
env: env:
CPPFLAGS: "-P" CPPFLAGS: "-P"
CXXFLAGS: "-std=c++14" CXXFLAGS: "-std=c++14"
# Install pre-built 32-bit Nvidia Cg Toolkit (old)
- name: nvidia-cg-toolkit - name: nvidia-cg-toolkit
buildsystem: simple buildsystem: simple
build-commands: build-commands:
@@ -192,10 +180,11 @@ modules:
url: http://developer.download.nvidia.com/cg/Cg_3.1/Cg-3.1_April2012_x86.tgz url: http://developer.download.nvidia.com/cg/Cg_3.1/Cg-3.1_April2012_x86.tgz
sha256: cef3591e436f528852db0e8c145d3842f920e0c89bcfb219c466797cb7b18879 sha256: cef3591e436f528852db0e8c145d3842f920e0c89bcfb219c466797cb7b18879
# Build 32-bit libsndio (dynamic)
- name: libsndio-dynamic - name: libsndio-dynamic
buildsystem: autotools buildsystem: autotools
config-opts: config-opts:
- --libdir=/app/lib32 - --prefix=/app
- --enable-dynamic - --enable-dynamic
- --enable-alsa - --enable-alsa
sources: sources:
@@ -206,23 +195,11 @@ modules:
arch: arch:
x86_64: *i386-build-options x86_64: *i386-build-options
- name: libsndio-static # Build 32-bit libopenal (old version)
buildsystem: autotools
config-opts:
- --libdir=/app/lib32
- --enable-static
- --enable-alsa
sources:
- type: archive
url: https://www.sndio.org/sndio-1.10.0.tar.gz
sha256: bebd3bfd01c50c9376cf3e7814b9379bed9e17d0393b5113b7eb7a3d0d038c54
build-options:
arch:
x86_64: *i386-build-options
- name: libopenal - name: libopenal
buildsystem: cmake buildsystem: cmake
config-opts: config-opts:
- -DCMAKE_INSTALL_PREFIX=/app
- -DCMAKE_INSTALL_LIBDIR=/app/lib32 - -DCMAKE_INSTALL_LIBDIR=/app/lib32
- -DALSOFT_BACKEND_PULSEAUDIO=ON - -DALSOFT_BACKEND_PULSEAUDIO=ON
- -DALSOFT_BACKEND_ALSA=ON - -DALSOFT_BACKEND_ALSA=ON
@@ -241,22 +218,24 @@ modules:
CFLAGS: "-m32 -mstackrealign" CFLAGS: "-m32 -mstackrealign"
CXXFLAGS: "-m32 -std=c++14 -mstackrealign" CXXFLAGS: "-m32 -std=c++14 -mstackrealign"
# Build 32-bit OpenSSL (extremely old and insecure version)
- name: openssl - name: openssl
buildsystem: simple buildsystem: simple
build-commands: build-commands:
- ./Configure --prefix=/app --openssldir=/app/etc/ssl shared 386 no-asm no-krb5 linux-pentium - ./Configure --prefix=/app --openssldir=/app/etc/ssl shared 386 no-asm no-krb5 linux-pentium
- make CC=/usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-gcc RANLIB=/usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-ranlib - make CC=/usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-gcc RANLIB=/usr/lib/sdk/toolchain-i386/bin/i686-unknown-linux-gnu-ranlib
- mv libcrypto.* /app/lib32 - install -d /app/lib32
- mv libssl.* /app/lib32 - mv libcrypto.so* /app/lib32/
- mv libssl.so* /app/lib32/
sources: sources:
- type: archive - type: archive
url: https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_0_9_7.tar.gz url: https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_0_9_7.tar.gz
sha256: 14e3a90f75994689e8c1bef098a97021f225a1a1623a7b8012079bd8b2eca1e8 sha256: 14e3a90f75994689e8c1bef098a97021f225a1a1623a7b8012079bd8b2eca1e8
# Build 32-bit libpcsclite
- name: libpcsclite - name: libpcsclite
buildsystem: meson buildsystem: meson
config-opts: config-opts:
- --libdir=/app/lib32
- -Dpolkit=false - -Dpolkit=false
- -Dlibsystemd=false - -Dlibsystemd=false
build-options: build-options:
@@ -265,20 +244,19 @@ modules:
env: env:
CFLAGS: "-m32" CFLAGS: "-m32"
CXXFLAGS: "-m32" CXXFLAGS: "-m32"
LDFLAGS: "-m32" LDFLAGS: "-m32 -L/app/lib32"
PKG_CONFIG_PATH: "/app/lib32/pkgconfig:/usr/lib/i386-linux-gnu/pkgconfig" PKG_CONFIG_PATH: "/app/lib32/pkgconfig:/usr/lib/i386-linux-gnu/pkgconfig:/usr/lib/sdk/toolchain-i386/lib/pkgconfig"
LD_LIBRARY_PATH: "/app/lib32:/usr/lib/i386-linux-gnu/pkgconfig:$LD_LIBRARY_PATH"
sources: sources:
- type: archive - type: archive
url: https://pcsclite.apdu.fr/files/pcsc-lite-2.3.1.tar.xz url: https://pcsclite.apdu.fr/files/pcsc-lite-2.3.1.tar.xz
sha256: a641d44d57affe1edd8365dd75307afc307e7eefb4e7ad839f6f146baa41ed56 sha256: a641d44d57affe1edd8365dd75307afc307e7eefb4e7ad839f6f146baa41ed56
# Build the main application (lindbergh-loader)
- name: lindbergh-loader - name: lindbergh-loader
buildsystem: simple buildsystem: simple
build-commands: build-commands:
- export LD_LIBRARY_PATH=/app/lib32:$LD_LIBRARY_PATH - export LD_LIBRARY_PATH=/app/lib32:$LD_LIBRARY_PATH
- make - make -j$(nproc)
- mkdir -p /app/bin
- mkdir -p /app/lib/i386-linux-gnu - mkdir -p /app/lib/i386-linux-gnu
- mkdir -p /app/lib/i386-linux-gnu/GL - mkdir -p /app/lib/i386-linux-gnu/GL
- install -Dm755 ./build/lindbergh /app/bin/ - install -Dm755 ./build/lindbergh /app/bin/
@@ -287,11 +265,11 @@ modules:
- install -Dm755 ./build/libkswapapi.so /app/lib32/ - install -Dm755 ./build/libkswapapi.so /app/lib32/
- install -Dm755 ./build/libposixtime.so /app/lib32/ - install -Dm755 ./build/libposixtime.so /app/lib32/
- install -Dm755 ./libs/libCg.so /app/lib32/libCg2.so - install -Dm755 ./libs/libCg.so /app/lib32/libCg2.so
- ln -s -f libposixtime.so /app/lib32/libposixtime.so.1 - ln -sf libposixtime.so /app/lib32/libposixtime.so.1
- ln -s -f libposixtime.so /app/lib32/libposixtime.so.2.4 - ln -sf libposixtime.so /app/lib32/libposixtime.so.2.4
- ln -s -f libopenal.so /app/lib32/libopenal.so.0 - ln -sf libopenal.so.1 /app/lib32/libopenal.so.0
- ln -s -f libkswapapi.so /app/lib32/libGLcore.so.1 - ln -sf libkswapapi.so /app/lib32/libGLcore.so.1
- ln -s -f libkswapapi.so /app/lib32/libnvidia-tls.so.1 - ln -sf libkswapapi.so /app/lib32/libnvidia-tls.so.1
- mv /app/lib/libopenal* /app/lib32/ - mv /app/lib/libopenal* /app/lib32/
build-options: build-options:
arch: arch:
@@ -300,6 +278,7 @@ modules:
- type: dir - type: dir
path: ../.. path: ../..
# Setup dynamic linker configuration
- name: bundle-setup - name: bundle-setup
buildsystem: simple buildsystem: simple
build-commands: build-commands:
@@ -308,16 +287,18 @@ modules:
- type: file - type: file
path: ./assets/ld.so.conf path: ./assets/ld.so.conf
# Cleanup unnecessary files to reduce final flatpak size
- name: cleanup - name: cleanup
buildsystem: simple buildsystem: simple
build-commands: build-commands:
- find /app/lib /app/lib32 -name '*.a' -type f -delete - find /app/lib32 -name '*.a' -type f -delete
- find /app/lib /app/lib32 -name '*.la' -type f -delete - find /app/lib32 -name '*.la' -type f -delete
- find /app/bin -mindepth 1 ! -name "lindbergh*" -exec rm -f {} \; - find /app/bin -mindepth 1 ! -name "lindbergh" -exec rm -f {} \;
- rm -d /app/lib/terminfo - rm -rf /app/lib/pkgconfig /app/lib32/pkgconfig /app/share/pkgconfig
- rm -rf /app/lib/pkgconfig /app/lib32/pkgconfig /app/share/pkgconfig /app/lib32/cmake /app/lib/debug /app/include /app/man /app/share - rm -rf /app/lib32/cmake /app/lib/debug /app/include /app/man /app/share /app/etc/bash_completion.d
- rm /app/lib32/libmenu.* - rm -f /app/lib32/libmenu.so*
- rm /app/lib32/libform.* - rm -f /app/lib32/libform.so*
- rm /app/lib32/libpanel.* - rm -f /app/lib32/libpanel.so*
- rm /app/lib32/libXmuu.* - rm -f /app/lib32/libXmuu.so*
- rm /app/lib32/libbsd.so - rm -f /app/lib32/libbsd.so*
- rm -rf /app/lib/terminfo
+7
View File
@@ -0,0 +1,7 @@
[Desktop Entry]
Name=Lindbergh Loader
Exec=lindbergh
Icon=lindbergh-loader
Type=Application
Categories=Utility;ConsoleOnly;
Terminal=true
Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

+204 -182
View File
@@ -2,7 +2,6 @@
#include <string.h> /* String function definitions */ #include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */ #include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */ #include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <stdlib.h> /* Standard library functions like malloc, free, exit, and atoi */ #include <stdlib.h> /* Standard library functions like malloc, free, exit, and atoi */
#include <sys/select.h> #include <sys/select.h>
@@ -30,10 +29,10 @@
typedef struct typedef struct
{ {
uint32_t srcAddress; uint32_t srcAddress;
uint32_t srcSize; uint32_t srcSize;
uint32_t destAddress; uint32_t destAddress;
uint32_t destSize; uint32_t destSize;
} BaseboardCommand; } BaseboardCommand;
BaseboardCommand jvsCommand = {0}; BaseboardCommand jvsCommand = {0};
@@ -41,16 +40,16 @@ BaseboardCommand serialCommand = {0};
typedef struct typedef struct
{ {
uint32_t *data; uint32_t *data;
uint32_t offset; uint32_t offset;
uint32_t size; uint32_t size;
} readData_t; } readData_t;
typedef struct typedef struct
{ {
uint32_t offset; uint32_t offset;
uint32_t *data; uint32_t *data;
uint32_t size; uint32_t size;
} writeData_t; } writeData_t;
FILE *sram = NULL; FILE *sram = NULL;
@@ -62,226 +61,249 @@ int selectReply = -1;
int jvsFileDescriptor = -1; int jvsFileDescriptor = -1;
int jvsPacketSize = -1; int jvsPacketSize = -1;
char serialString[1024] = {0};
int initBaseboard() int initBaseboard()
{ {
char *sramPath = getConfig()->sramPath; char *sramPath = getConfig()->sramPath;
sram = fopen(sramPath, "a"); sram = fopen(sramPath, "a");
// Create file if it doesn't exist // Create file if it doesn't exist
if (sram == NULL) if (sram == NULL)
{
printf("Error: Cannot open %s\n", sramPath);
return 1;
}
fclose(sram);
sram = fopen(sramPath, "rb+");
fseek(sram, 0, SEEK_SET);
if (getConfig()->emulateJVS == 0 && strcmp(getConfig()->jvsPath, "none") != 0)
{
jvsFileDescriptor = openJVSSerial(getConfig()->jvsPath);
if (jvsFileDescriptor < 0)
{ {
printf("Error: Failed to open %s for JVS\n", getConfig()->jvsPath); printf("Error: Cannot open %s\n", sramPath);
return -1; return 1;
}
fclose(sram);
sram = fopen(sramPath, "rb+");
fseek(sram, 0, SEEK_SET);
if (getConfig()->emulateJVS == 0 && strcmp(getConfig()->jvsPath, "none") != 0)
{
jvsFileDescriptor = openJVSSerial(getConfig()->jvsPath);
if (jvsFileDescriptor < 0)
{
printf("Error: Failed to open %s for JVS\n", getConfig()->jvsPath);
return -1;
}
initJVSSerial(jvsFileDescriptor);
startJVSFrameThread(&jvsFileDescriptor);
} }
initJVSSerial(jvsFileDescriptor); strcpy(serialString, SERIAL_STRING);
startJVSFrameThread(&jvsFileDescriptor);
}
return 0; time_t t = time(NULL); // Get current time
struct tm *tm_info = localtime(&t); // Convert to local time structure
int month = tm_info->tm_mon + 1; // tm_mon is 0-based (0 = Jan, 4 = May)
int day = tm_info->tm_mday; // tm_mday is the day of the month
if (month == 1 && day == 18) {
strcpy(serialString, "HAPPY BIRTHDAY!!");
}
if (month == 5 && day == 20) {
strcpy(serialString, "HAPPY BIRTHDAY!!");
}
if (month == 5 && day == 21) {
strcpy(serialString, "HAPPY BIRTHDAY!!");
}
return 0;
} }
ssize_t baseboardRead(int fd, void *buf, size_t count) ssize_t baseboardRead(int fd, void *buf, size_t count)
{ {
memcpy(buf, &sharedMemory[sharedMemoryIndex], count); memcpy(buf, &sharedMemory[sharedMemoryIndex], count);
return count; return count;
} }
ssize_t baseboardWrite(int fd, const void *buf, size_t count) ssize_t baseboardWrite(int fd, const void *buf, size_t count)
{ {
memcpy(&sharedMemory[sharedMemoryIndex], buf, count); memcpy(&sharedMemory[sharedMemoryIndex], buf, count);
return count; return count;
} }
int baseboardSelect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict timeout) int baseboardSelect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds,
struct timeval *restrict timeout)
{ {
return selectReply; return selectReply;
} }
int baseboardIoctl(int fd, unsigned int request, void *data) int baseboardIoctl(int fd, unsigned int request, void *data)
{ {
switch (request) switch (request)
{
case BASEBOARD_GET_VERSION:
{
uint8_t versionData[4] = {0x00, 0x19, 0x20, 0x07};
memcpy(data, versionData, 4);
return 0;
}
break;
case BASEBOARD_INIT:
{
// selectReply = -1; Considering adding this in
return 0;
}
break;
case BASEBOARD_READY: // Not sure if this is what it should be called
{
selectReply = 0;
return 0;
}
break;
case BASEBOARD_SEEK_SHM:
{
sharedMemoryIndex = (unsigned int)data;
return 0;
}
break;
case BASEBOARD_READ_SRAM:
{
readData_t *_data = data;
fseek(sram, _data->offset, SEEK_SET);
fread(_data->data, 1, _data->size, sram);
return 0;
}
break;
case BASEBOARD_WRITE_SRAM:
{
writeData_t *_data = data;
fseek(sram, _data->offset, SEEK_SET);
fwrite(_data->data, 1, _data->size, sram);
return 0;
}
break;
case BASEBOARD_REQUEST:
{
uint32_t *_data = data;
switch (_data[0])
{ {
case BASEBOARD_GET_SERIAL: // bcCmdSysInfoGetReq case BASEBOARD_GET_VERSION:
{ {
serialCommand.destAddress = _data[1]; uint8_t versionData[4] = {0x00, 0x19, 0x20, 0x07};
serialCommand.destSize = _data[2]; memcpy(data, versionData, 4);
return 0;
} }
break; break;
case BASEBOARD_WRITE_FLASH: // bcCmdSysFlashWrite case BASEBOARD_INIT:
{ {
log_warn("The game attempted to write to the baseboard flash\n"); // selectReply = -1; Considering adding this in
return 0;
} }
break; break;
case BASEBOARD_PROCESS_JVS: case BASEBOARD_READY: // Not sure if this is what it should be called
{ {
jvsCommand.srcAddress = _data[1]; selectReply = 0;
jvsCommand.srcSize = _data[2]; return 0;
jvsCommand.destAddress = _data[3]; }
jvsCommand.destSize = _data[4]; break;
memcpy(inputBuffer, &sharedMemory[jvsCommand.srcAddress], jvsCommand.srcSize);
if (getConfig()->emulateJVS) case BASEBOARD_SEEK_SHM:
{ {
processPacket(&jvsPacketSize); sharedMemoryIndex = (unsigned int)data;
} return 0;
else if (jvsFileDescriptor >= 0) }
{ break;
for (int i = 0; i < jvsCommand.srcSize; i++)
case BASEBOARD_READ_SRAM:
{
readData_t *_data = data;
fseek(sram, _data->offset, SEEK_SET);
fread(_data->data, 1, _data->size, sram);
return 0;
}
break;
case BASEBOARD_WRITE_SRAM:
{
writeData_t *_data = data;
fseek(sram, _data->offset, SEEK_SET);
fwrite(_data->data, 1, _data->size, sram);
return 0;
}
break;
case BASEBOARD_REQUEST:
{
uint32_t *_data = data;
switch (_data[0])
{ {
write(jvsFileDescriptor, &inputBuffer[i], 1);
if (inputBuffer[i] == 0xF0) case BASEBOARD_GET_SERIAL: // bcCmdSysInfoGetReq
{ {
setSenseLine(3); serialCommand.destAddress = _data[1];
} serialCommand.destSize = _data[2];
else if (inputBuffer[i] == 0xF1)
{
setSenseLine(1);
}
} }
} break;
case BASEBOARD_WRITE_FLASH: // bcCmdSysFlashWrite
{
log_warn("The game attempted to write to the baseboard flash\n");
}
break;
case BASEBOARD_PROCESS_JVS:
{
jvsCommand.srcAddress = _data[1];
jvsCommand.srcSize = _data[2];
jvsCommand.destAddress = _data[3];
jvsCommand.destSize = _data[4];
memcpy(inputBuffer, &sharedMemory[jvsCommand.srcAddress], jvsCommand.srcSize);
if (getConfig()->emulateJVS)
{
processPacket(&jvsPacketSize);
}
else if (jvsFileDescriptor >= 0)
{
for (int i = 0; i < jvsCommand.srcSize; i++)
{
write(jvsFileDescriptor, &inputBuffer[i], 1);
if (inputBuffer[i] == 0xF0)
{
setSenseLine(3);
}
else if (inputBuffer[i] == 0xF1)
{
setSenseLine(1);
}
}
}
}
break;
case BASEBOARD_GET_SENSE_LINE:
break;
default:
printf("Error: Unknown baseboard command %X\n", _data[0]);
}
// Acknowledge the command
_data[0] |= 0xF0000000;
return 0;
} }
break; break;
case BASEBOARD_GET_SENSE_LINE: case BASEBOARD_RECEIVE:
break;
default:
printf("Error: Unknown baseboard command %X\n", _data[0]);
}
// Acknowledge the command
_data[0] |= 0xF0000000;
return 0;
}
break;
case BASEBOARD_RECEIVE:
{
uint32_t *_data = data;
switch (_data[0] & 0xFFF)
{ {
uint32_t *_data = data;
case BASEBOARD_GET_SERIAL: switch (_data[0] & 0xFFF)
{ {
memcpy(&sharedMemory[serialCommand.destAddress + 96], SERIAL_STRING, strlen(SERIAL_STRING));
_data[1] = 1; // Set the status to success
}
break;
case BASEBOARD_GET_SENSE_LINE: case BASEBOARD_GET_SERIAL:
{ {
_data[2] = getSenseLine(); memcpy(&sharedMemory[serialCommand.destAddress + 96], serialString, strlen(serialString));
_data[1] = 1; // Set the status to success _data[1] = 1; // Set the status to success
} }
break; break;
case BASEBOARD_PROCESS_JVS: case BASEBOARD_GET_SENSE_LINE:
{ {
if (getConfig()->emulateJVS) _data[2] = getSenseLine();
{ _data[1] = 1; // Set the status to success
memcpy(&sharedMemory[jvsCommand.destAddress], outputBuffer, jvsPacketSize); }
_data[2] = jvsCommand.destAddress; break;
_data[3] = jvsPacketSize;
_data[1] = 1; // Set the status to success case BASEBOARD_PROCESS_JVS:
} {
else if (jvsFileDescriptor >= 0) if (getConfig()->emulateJVS)
{ {
JVSFrame frame = readJVSFrameFromThread(); memcpy(&sharedMemory[jvsCommand.destAddress], outputBuffer, jvsPacketSize);
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size); _data[2] = jvsCommand.destAddress;
_data[2] = jvsCommand.destAddress; _data[3] = jvsPacketSize;
_data[3] = frame.size; _data[1] = 1; // Set the status to success
_data[1] = frame.ready; }
} else if (jvsFileDescriptor >= 0)
{
JVSFrame frame = readJVSFrameFromThread();
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size);
_data[2] = jvsCommand.destAddress;
_data[3] = frame.size;
_data[1] = frame.ready;
}
}
break;
default:
printf("Error: Unknown baseboard receive command %X\n", _data[0] & 0xFFF);
}
// Acknowledge the command
_data[0] |= 0xF0000000;
return 0;
} }
break; break;
default: default:
printf("Error: Unknown baseboard receive command %X\n", _data[0] & 0xFFF); printf("Error: Unknown baseboard ioctl %X\n", request);
} }
// Acknowledge the command
_data[0] |= 0xF0000000;
return 0; return 0;
}
break;
default:
printf("Error: Unknown baseboard ioctl %X\n", request);
}
return 0;
} }
+1 -4
View File
@@ -1,6 +1,3 @@
#ifndef BORDER_H #pragma once
#define BORDER_H
void drawGameBorder(int width, int height, float whiteBorderPercentage, float blackBorderPercentage); void drawGameBorder(int width, int height, float whiteBorderPercentage, float blackBorderPercentage);
#endif // BORDER_H
+1 -4
View File
@@ -76,10 +76,7 @@ int initCardReader()
int carReaderGetFdIdx(int fd) int carReaderGetFdIdx(int fd)
{ {
if (fd == serialFD[0].fd) return (fd == serialFD[0].fd) ? 0 : 1;
return 0;
return 1;
} }
uint8_t cardReaderGenChecksum(int fdIdx) uint8_t cardReaderGenChecksum(int fdIdx)
+2 -4
View File
@@ -1,6 +1,6 @@
#ifndef CARD_READER_H #pragma once
#define CARD_READER_H
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
@@ -32,5 +32,3 @@ int initCardReader();
size_t cardReaderWrite(int fd, const void *buf, size_t count); size_t cardReaderWrite(int fd, const void *buf, size_t count);
size_t cardReaderRead(int fd, void *buf, size_t count); size_t cardReaderRead(int fd, void *buf, size_t count);
void cardReaderSetFd(int serial, int fd, char *fName); void cardReaderSetFd(int serial, int fd, char *fName);
#endif
+14
View File
@@ -174,6 +174,8 @@ static int detectGame(uint32_t elf_crc)
config.gameStatus = WORKING; config.gameStatus = WORKING;
config.jvsIOType = SEGA_TYPE_1; config.jvsIOType = SEGA_TYPE_1;
config.gameType = ABC; config.gameType = ABC;
config.width = 640;
config.height = 480;
return 0; return 0;
} }
break; break;
@@ -188,6 +190,8 @@ static int detectGame(uint32_t elf_crc)
config.gameStatus = WORKING; config.gameStatus = WORKING;
config.jvsIOType = SEGA_TYPE_1; config.jvsIOType = SEGA_TYPE_1;
config.gameType = ABC; config.gameType = ABC;
config.width = 640;
config.height = 480;
return 0; return 0;
} }
break; break;
@@ -249,6 +253,8 @@ static int detectGame(uint32_t elf_crc)
config.gameNativeResolutions = ""; config.gameNativeResolutions = "";
config.gameType = DRIVING; config.gameType = DRIVING;
config.gameStatus = WORKING; config.gameStatus = WORKING;
config.width = 1280;
config.height = 768;
return 0; return 0;
} }
break; break;
@@ -262,6 +268,8 @@ static int detectGame(uint32_t elf_crc)
config.gameNativeResolutions = "1280x768"; config.gameNativeResolutions = "1280x768";
config.gameType = DRIVING; config.gameType = DRIVING;
config.gameStatus = WORKING; config.gameStatus = WORKING;
config.width = 1280;
config.height = 768;
return 0; return 0;
} }
break; break;
@@ -275,6 +283,8 @@ static int detectGame(uint32_t elf_crc)
config.gameNativeResolutions = ""; config.gameNativeResolutions = "";
config.gameType = DRIVING; config.gameType = DRIVING;
config.gameStatus = WORKING; config.gameStatus = WORKING;
config.width = 1280;
config.height = 768;
return 0; return 0;
} }
break; break;
@@ -1113,6 +1123,9 @@ int readConfig(FILE *configFile, EmulatorConfig *config)
else if (strcmp(command, "SRAM_PATH") == 0) else if (strcmp(command, "SRAM_PATH") == 0)
strcpy(config->sramPath, getNextToken(NULL, " ", &saveptr)); strcpy(config->sramPath, getNextToken(NULL, " ", &saveptr));
else if (strcmp(command, "LIBCG_PATH") == 0)
strcpy(config->libCgPath, getNextToken(NULL, " ", &saveptr));
else if (strcmp(command, "EMULATE_RIDEBOARD") == 0) { else if (strcmp(command, "EMULATE_RIDEBOARD") == 0) {
int defaultValue = config->emulateRideboard; int defaultValue = config->emulateRideboard;
config->emulateRideboard = getNextIntOrAuto(saveptr, defaultValue); config->emulateRideboard = getNextIntOrAuto(saveptr, defaultValue);
@@ -1529,6 +1542,7 @@ int initConfig(const char* configFilePath)
config.lindberghColour = YELLOW; config.lindberghColour = YELLOW;
strcpy(config.eepromPath, "eeprom.bin"); strcpy(config.eepromPath, "eeprom.bin");
strcpy(config.sramPath, "sram.bin"); strcpy(config.sramPath, "sram.bin");
strcpy(config.libCgPath, "");
strcpy(config.jvsPath, "/dev/ttyUSB0"); strcpy(config.jvsPath, "/dev/ttyUSB0");
strcpy(config.serial1Path, "/dev/ttyS0"); strcpy(config.serial1Path, "/dev/ttyS0");
strcpy(config.serial2Path, "/dev/ttyS1"); strcpy(config.serial2Path, "/dev/ttyS1");
+2 -3
View File
@@ -1,5 +1,4 @@
#ifndef CONFIG_H #pragma once
#define CONFIG_H
#include <stdint.h> #include <stdint.h>
#include <sys/types.h> #include <sys/types.h>
@@ -233,6 +232,7 @@ typedef struct
int fullscreen; int fullscreen;
char eepromPath[MAX_PATH_LENGTH]; char eepromPath[MAX_PATH_LENGTH];
char sramPath[MAX_PATH_LENGTH]; char sramPath[MAX_PATH_LENGTH];
char libCgPath[MAX_PATH_LENGTH];
char jvsPath[MAX_PATH_LENGTH]; char jvsPath[MAX_PATH_LENGTH];
char serial1Path[MAX_PATH_LENGTH]; char serial1Path[MAX_PATH_LENGTH];
char serial2Path[MAX_PATH_LENGTH]; char serial2Path[MAX_PATH_LENGTH];
@@ -300,4 +300,3 @@ const char *getLindberghColourString(Colour lindberghColour);
const char *getGameRegionString(GameRegion region); const char *getGameRegionString(GameRegion region);
const char *getGpuTypeString(GpuType gpuType); const char *getGpuTypeString(GpuType gpuType);
#endif
-3
View File
@@ -1,5 +1,3 @@
#ifndef CUSTOM_CURSORS_H
#define CUSTOM_CURSORS_H
int loadNewCursor(const char *cursorFileName, void **cursor, int customWidth, int customHeight); int loadNewCursor(const char *cursorFileName, void **cursor, int customWidth, int customHeight);
void loadCursors(); void loadCursors();
@@ -7,4 +5,3 @@ void setCursor(void *cursor);
void hideCursor(); void hideCursor();
void showCursor(); void showCursor();
void showPhCursor(); void showPhCursor();
#endif
+1 -4
View File
@@ -1,5 +1,4 @@
#ifndef FPS_LIMITER_H #pragma once
#define FPS_LIMITER_H
typedef struct typedef struct
{ {
@@ -13,5 +12,3 @@ typedef struct
long Clock_now(); long Clock_now();
void FpsLimiter(fps_limit *stats); void FpsLimiter(fps_limit *stats);
double calculateFps(); double calculateFps();
#endif
-4
View File
@@ -1,4 +0,0 @@
#ifndef GLUTHOOKS_H
#define GLUTHOOKS_H
#endif
+286 -26
View File
@@ -95,6 +95,12 @@ static int callback(struct dl_phdr_info *info, size_t size, void *data);
uint16_t basePortAddress = 0xFFFF; uint16_t basePortAddress = 0xFFFF;
/**
* @brief Signal handler for SIGSEGV.
*
* This function handles segmentation faults (SIGSEGV) and attempts to recover
* from certain types of memory access errors, particularly those related to I/O ports.
*/
/** /**
* Signal handler for the SIGSEGV signal, which is triggered when a process tries to access an illegal memory location. * Signal handler for the SIGSEGV signal, which is triggered when a process tries to access an illegal memory location.
* @param signal * @param signal
@@ -177,6 +183,13 @@ static void handleSegfault(int signal, siginfo_t *info, void *ptr)
} }
} }
/**
* @brief Trims leading and trailing whitespace and quotes from a string.
*
* This function removes leading and trailing whitespace characters, as well as
* single and double quotes, from the input string.
* @param str The string to trim.
*/
char *trimOS_ID(char *str) char *trimOS_ID(char *str)
{ {
if (!str) if (!str)
@@ -198,6 +211,12 @@ char *trimOS_ID(char *str)
return str; return str;
} }
/**
* @brief Checks if the operating system is Debian-based.
*
* This function reads the /etc/os-release file to determine if the current
* operating system is Debian or Ubuntu, or a derivative of them.
*/
bool checkOS_ID() bool checkOS_ID()
{ {
FILE *fp = fopen("/etc/os-release", "r"); FILE *fp = fopen("/etc/os-release", "r");
@@ -249,6 +268,12 @@ bool checkOS_ID()
return found; return found;
} }
/**
* @brief Initialization function for the hook library.
*
* This function is called automatically when the library is loaded. It sets up
* signal handlers, initializes configuration, and performs other setup tasks.
*/
void __attribute__((constructor)) hook_init() void __attribute__((constructor)) hook_init()
{ {
// Get offsets of the Game's ELF and calculate CRC32. // Get offsets of the Game's ELF and calculate CRC32.
@@ -360,6 +385,13 @@ void __attribute__((constructor)) hook_init()
} }
} }
/**
* @brief Hook for the opendir function.
*
* This function intercepts calls to opendir and redirects them to different
* directories based on the game ID.
* @param dirname The name of the directory to open.
*/
DIR *opendir(const char *dirname) DIR *opendir(const char *dirname)
{ {
DIR *(*_opendir)(const char *dirname) = dlsym(RTLD_NEXT, "opendir"); DIR *(*_opendir)(const char *dirname) = dlsym(RTLD_NEXT, "opendir");
@@ -395,6 +427,13 @@ DIR *opendir(const char *dirname)
return _opendir(dirname); return _opendir(dirname);
} }
/**
* @brief Hook for the remove function.
*
* This function intercepts calls to remove and redirects them to different
* paths based on the game ID.
* @param path The path to remove.
*/
int remove(const char *path) int remove(const char *path)
{ {
int (*_remove)(const char *path) = dlsym(RTLD_NEXT, "remove"); int (*_remove)(const char *path) = dlsym(RTLD_NEXT, "remove");
@@ -416,6 +455,13 @@ int remove(const char *path)
return _remove(path); return _remove(path);
} }
/**
* @brief Hook for the mkdir function.
*
* This function intercepts calls to mkdir and redirects them to different
* paths based on the game ID.
* @param path The path to create.
*/
int mkdir(const char *path, mode_t mode) int mkdir(const char *path, mode_t mode)
{ {
int (*_mkdir)(const char *path, mode_t mode) = dlsym(RTLD_NEXT, "mkdir"); int (*_mkdir)(const char *path, mode_t mode) = dlsym(RTLD_NEXT, "mkdir");
@@ -437,6 +483,13 @@ int mkdir(const char *path, mode_t mode)
return _mkdir(path, mode); return _mkdir(path, mode);
} }
/**
* @brief Hook for the __xstat64 function.
*
* This function intercepts calls to __xstat64 and redirects them to different
* paths based on the game ID.
* @param path The path to stat.
*/
int __xstat64(int ver, const char *path, struct stat64 *stat_buf) int __xstat64(int ver, const char *path, struct stat64 *stat_buf)
{ {
int (*___xstat64)(int ver, const char *path, struct stat64 *stat_buf) = dlsym(RTLD_NEXT, "__xstat64"); int (*___xstat64)(int ver, const char *path, struct stat64 *stat_buf) = dlsym(RTLD_NEXT, "__xstat64");
@@ -448,6 +501,13 @@ int __xstat64(int ver, const char *path, struct stat64 *stat_buf)
return ___xstat64(ver, path, stat_buf); return ___xstat64(ver, path, stat_buf);
} }
/**
* @brief Hook for the open function.
*
* This function intercepts calls to open and redirects them to different
* files or devices based on the pathname.
* @param pathname The path to open.
*/
int open(const char *pathname, int flags, ...) int open(const char *pathname, int flags, ...)
{ {
va_list args; va_list args;
@@ -534,6 +594,13 @@ int open(const char *pathname, int flags, ...)
return _open(pathname, flags, mode); return _open(pathname, flags, mode);
} }
/**
* @brief Hook for the open64 function.
*
* This function intercepts calls to open64 and redirects them to different
* files or devices based on the pathname.
* @param pathname The path to open.
*/
int open64(const char *pathname, int flags, ...) int open64(const char *pathname, int flags, ...)
{ {
va_list args; va_list args;
@@ -544,6 +611,13 @@ int open64(const char *pathname, int flags, ...)
return open(pathname, flags, mode); return open(pathname, flags, mode);
} }
/**
* @brief Hook for the fopen function.
*
* This function intercepts calls to fopen and redirects them to different
* files based on the pathname.
* @param pathname The path to open.
*/
FILE *fopen(const char *restrict pathname, const char *restrict mode) FILE *fopen(const char *restrict pathname, const char *restrict mode)
{ {
FILE *(*_fopen)(const char *restrict pathname, const char *restrict mode) = dlsym(RTLD_NEXT, "fopen"); FILE *(*_fopen)(const char *restrict pathname, const char *restrict mode) = dlsym(RTLD_NEXT, "fopen");
@@ -757,6 +831,13 @@ FILE *fopen(const char *restrict pathname, const char *restrict mode)
return _fopen(pathname, mode); return _fopen(pathname, mode);
} }
/**
* @brief Hook for the fopen64 function.
*
* This function intercepts calls to fopen64 and redirects them to different
* files based on the pathname.
* @param pathname The path to open.
*/
FILE *fopen64(const char *pathname, const char *mode) FILE *fopen64(const char *pathname, const char *mode)
{ {
FILE *(*_fopen64)(const char *restrict pathname, const char *restrict mode) = dlsym(RTLD_NEXT, "fopen64"); FILE *(*_fopen64)(const char *restrict pathname, const char *restrict mode) = dlsym(RTLD_NEXT, "fopen64");
@@ -857,6 +938,13 @@ FILE *fopen64(const char *pathname, const char *mode)
return _fopen64(pathname, mode); return _fopen64(pathname, mode);
} }
/**
* @brief Hook for the fclose function.
*
* This function intercepts calls to fclose and performs cleanup operations
* for the file hooks.
* @param stream The file stream to close.
*/
int fclose(FILE *stream) int fclose(FILE *stream)
{ {
int (*_fclose)(FILE *stream) = dlsym(RTLD_NEXT, "fclose"); int (*_fclose)(FILE *stream) = dlsym(RTLD_NEXT, "fclose");
@@ -878,6 +966,14 @@ int fclose(FILE *stream)
} }
return _fclose(stream); return _fclose(stream);
} }
/**
* @brief Hook for the openat function.
*
* This function intercepts calls to openat and redirects them to different
* files or devices based on the pathname.
* @param pathname The path to open.
*/
int openat(int dirfd, const char *pathname, int flags, ...) int openat(int dirfd, const char *pathname, int flags, ...)
{ {
int (*_openat)(int dirfd, const char *pathname, int flags) = dlsym(RTLD_NEXT, "openat"); int (*_openat)(int dirfd, const char *pathname, int flags) = dlsym(RTLD_NEXT, "openat");
@@ -892,6 +988,13 @@ int openat(int dirfd, const char *pathname, int flags, ...)
return _openat(dirfd, pathname, flags); return _openat(dirfd, pathname, flags);
} }
/**
* @brief Hook for the close function.
*
* This function intercepts calls to close and performs cleanup operations
* for the file hooks.
* @param fd The file descriptor to close.
*/
int close(int fd) int close(int fd)
{ {
int (*_close)(int fd) = dlsym(RTLD_NEXT, "close"); int (*_close)(int fd) = dlsym(RTLD_NEXT, "close");
@@ -908,6 +1011,13 @@ int close(int fd)
return _close(fd); return _close(fd);
} }
/**
* @brief Hook for the fgets function.
*
* This function intercepts calls to fgets and redirects them to different
* files based on the stream.
* @param stream The file stream to read from.
*/
char *fgets(char *str, int n, FILE *stream) char *fgets(char *str, int n, FILE *stream)
{ {
char *(*_fgets)(char *str, int n, FILE *stream) = dlsym(RTLD_NEXT, "fgets"); char *(*_fgets)(char *str, int n, FILE *stream) = dlsym(RTLD_NEXT, "fgets");
@@ -945,6 +1055,13 @@ char *fgets(char *str, int n, FILE *stream)
return _fgets(str, n, stream); return _fgets(str, n, stream);
} }
/**
* @brief Hook for the read function.
*
* This function intercepts calls to read and redirects them to different
* files or devices based on the file descriptor.
* @param fd The file descriptor to read from.
*/
ssize_t read(int fd, void *buf, size_t count) ssize_t read(int fd, void *buf, size_t count)
{ {
int (*_read)(int fd, void *buf, size_t count) = dlsym(RTLD_NEXT, "read"); int (*_read)(int fd, void *buf, size_t count) = dlsym(RTLD_NEXT, "read");
@@ -964,17 +1081,11 @@ ssize_t read(int fd, void *buf, size_t count)
return driveboardRead(fd, buf, count); return driveboardRead(fd, buf, count);
} }
if (fd == hooks[SERIAL0] && getConfig()->emulateCardreader) if ((fd == hooks[SERIAL0] || fd == hooks[SERIAL1]) && getConfig()->emulateCardreader)
{ {
return cardReaderRead(fd, buf, count); return cardReaderRead(fd, buf, count);
} }
if (fd == hooks[SERIAL1] && getConfig()->emulateCardreader)
{
return cardReaderRead(fd, buf, count);
}
// If we don't hook the serial just reply with nothing
if (fd == hooks[SERIAL0] || fd == hooks[SERIAL1]) if (fd == hooks[SERIAL0] || fd == hooks[SERIAL1])
{ {
if (gId == PRIMEVAL_HUNT && getConfig()->emulateTouchscreen == 1) if (gId == PRIMEVAL_HUNT && getConfig()->emulateTouchscreen == 1)
@@ -994,6 +1105,13 @@ ssize_t read(int fd, void *buf, size_t count)
return _read(fd, buf, count); return _read(fd, buf, count);
} }
/**
* @brief Hook for the fread function.
*
* This function intercepts calls to fread and redirects them to different
* files based on the stream.
* @param stream The file stream to read from.
*/
size_t fread(void *buf, size_t size, size_t count, FILE *stream) size_t fread(void *buf, size_t size, size_t count, FILE *stream)
{ {
size_t (*_fread)(void *buf, size_t size, size_t count, FILE *stream) = dlsym(RTLD_NEXT, "fread"); size_t (*_fread)(void *buf, size_t size, size_t count, FILE *stream) = dlsym(RTLD_NEXT, "fread");
@@ -1014,11 +1132,6 @@ size_t fread(void *buf, size_t size, size_t count, FILE *stream)
return freadReplace(buf, size, count, fileRead[FILE_RW2]); return freadReplace(buf, size, count, fileRead[FILE_RW2]);
} }
// if (stream == fileHooks[FILE_HARLEY])
// {
// return harleyFreadReplace(buf, size, count, fileHooks[FILE_HARLEY]);
// }
if (stream == fileHooks[FILE_FONT_ABC]) if (stream == fileHooks[FILE_FONT_ABC])
{ {
memcpy(buf, fontABC + fontABCidx, size * count); memcpy(buf, fontABC + fontABCidx, size * count);
@@ -1046,6 +1159,13 @@ size_t fread(void *buf, size_t size, size_t count, FILE *stream)
return _fread(buf, size, count, stream); return _fread(buf, size, count, stream);
} }
/**
* @brief Hook for the ftell function.
*
* This function intercepts calls to ftell and redirects them to different
* files based on the stream.
* @param stream The file stream to get the position from.
*/
long int ftell(FILE *stream) long int ftell(FILE *stream)
{ {
long int (*_ftell)(FILE *stream) = dlsym(RTLD_NEXT, "ftell"); long int (*_ftell)(FILE *stream) = dlsym(RTLD_NEXT, "ftell");
@@ -1067,6 +1187,13 @@ long int ftell(FILE *stream)
return _ftell(stream); return _ftell(stream);
} }
/**
* @brief Hook for the fseek function.
*
* This function intercepts calls to fseek and redirects them to different
* files based on the stream.
* @param stream The file stream to seek in.
*/
int fseek(FILE *stream, long int offset, int whence) int fseek(FILE *stream, long int offset, int whence)
{ {
int (*_fseek)(FILE *stream, long int offset, int whence) = dlsym(RTLD_NEXT, "fseek"); int (*_fseek)(FILE *stream, long int offset, int whence) = dlsym(RTLD_NEXT, "fseek");
@@ -1090,6 +1217,13 @@ int fseek(FILE *stream, long int offset, int whence)
return _fseek(stream, offset, whence); return _fseek(stream, offset, whence);
} }
/**
* @brief Hook for the rewind function.
*
* This function intercepts calls to rewind and redirects them to different
* files based on the stream.
* @param stream The file stream to rewind.
*/
void rewind(FILE *stream) void rewind(FILE *stream)
{ {
void (*_rewind)(FILE *stream) = dlsym(RTLD_NEXT, "rewind"); void (*_rewind)(FILE *stream) = dlsym(RTLD_NEXT, "rewind");
@@ -1103,6 +1237,13 @@ void rewind(FILE *stream)
_rewind(stream); _rewind(stream);
} }
/**
* @brief Hook for the write function.
*
* This function intercepts calls to write and redirects them to different
* files or devices based on the file descriptor.
* @param fd The file descriptor to write to.
*/
ssize_t write(int fd, const void *buf, size_t count) ssize_t write(int fd, const void *buf, size_t count)
{ {
int (*_write)(int fd, const void *buf, size_t count) = dlsym(RTLD_NEXT, "write"); int (*_write)(int fd, const void *buf, size_t count) = dlsym(RTLD_NEXT, "write");
@@ -1128,12 +1269,7 @@ ssize_t write(int fd, const void *buf, size_t count)
return driveboardWrite(fd, buf, count); return driveboardWrite(fd, buf, count);
} }
if (fd == hooks[SERIAL0] && getConfig()->emulateCardreader) if ((fd == hooks[SERIAL0] || fd == hooks[SERIAL1]) && getConfig()->emulateCardreader)
{
return cardReaderWrite(fd, buf, count);
}
if (fd == hooks[SERIAL1] && getConfig()->emulateCardreader)
{ {
return cardReaderWrite(fd, buf, count); return cardReaderWrite(fd, buf, count);
} }
@@ -1141,6 +1277,13 @@ ssize_t write(int fd, const void *buf, size_t count)
return _write(fd, buf, count); return _write(fd, buf, count);
} }
/**
* @brief Hook for the ioctl function.
*
* This function intercepts calls to ioctl and redirects them to different
* devices based on the file descriptor.
* @param fd The file descriptor to perform the ioctl on.
*/
int ioctl(int fd, unsigned int request, void *data) int ioctl(int fd, unsigned int request, void *data)
{ {
int (*_ioctl)(int fd, int request, void *data) = dlsym(RTLD_NEXT, "ioctl"); int (*_ioctl)(int fd, int request, void *data) = dlsym(RTLD_NEXT, "ioctl");
@@ -1170,6 +1313,13 @@ int ioctl(int fd, unsigned int request, void *data)
return _ioctl(fd, request, data); return _ioctl(fd, request, data);
} }
/**
* @brief Hook for the tcgetattr function.
*
* This function intercepts calls to tcgetattr and redirects them to different
* devices based on the file descriptor.
* @param fd The file descriptor to get the attributes from.
*/
int tcgetattr(int fd, struct termios *termios_p) int tcgetattr(int fd, struct termios *termios_p)
{ {
int (*_tcgetattr)(int fd, struct termios *termios_p) = dlsym(RTLD_NEXT, "tcgetattr"); int (*_tcgetattr)(int fd, struct termios *termios_p) = dlsym(RTLD_NEXT, "tcgetattr");
@@ -1180,6 +1330,13 @@ int tcgetattr(int fd, struct termios *termios_p)
return _tcgetattr(fd, termios_p); return _tcgetattr(fd, termios_p);
} }
/**
* @brief Hook for the tcsetattr function.
*
* This function intercepts calls to tcsetattr and redirects them to different
* devices based on the file descriptor.
* @param fd The file descriptor to set the attributes on.
*/
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p) int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
{ {
int (*_tcsetattr)(int fd, int optional_actions, const struct termios *termios_p) = dlsym(RTLD_NEXT, "tcsetattr"); int (*_tcsetattr)(int fd, int optional_actions, const struct termios *termios_p) = dlsym(RTLD_NEXT, "tcsetattr");
@@ -1190,6 +1347,13 @@ int tcsetattr(int fd, int optional_actions, const struct termios *termios_p)
return _tcsetattr(fd, optional_actions, termios_p); return _tcsetattr(fd, optional_actions, termios_p);
} }
/**
* @brief Hook for the cfgetispeed function.
*
* This function intercepts calls to cfgetispeed and redirects them to different
* devices based on the file descriptor.
* @param termios_p The termios structure to get the input speed from.
*/
speed_t cfgetispeed(const struct termios *termios_p) speed_t cfgetispeed(const struct termios *termios_p)
{ {
speed_t (*_cfgetispeed)(const struct termios *termios_p) = dlsym(RTLD_NEXT, "cfgetispeed"); speed_t (*_cfgetispeed)(const struct termios *termios_p) = dlsym(RTLD_NEXT, "cfgetispeed");
@@ -1200,6 +1364,13 @@ speed_t cfgetispeed(const struct termios *termios_p)
return _cfgetispeed(termios_p); return _cfgetispeed(termios_p);
} }
/**
* @brief Hook for the cfgetospeed function.
*
* This function intercepts calls to cfgetospeed and redirects them to different
* devices based on the file descriptor.
* @param termios_p The termios structure to get the output speed from.
*/
speed_t cfgetospeed(const struct termios *termios_p) speed_t cfgetospeed(const struct termios *termios_p)
{ {
speed_t (*_cfgetospeed)(const struct termios *termios_p) = dlsym(RTLD_NEXT, "cfgetospeed"); speed_t (*_cfgetospeed)(const struct termios *termios_p) = dlsym(RTLD_NEXT, "cfgetospeed");
@@ -1210,6 +1381,13 @@ speed_t cfgetospeed(const struct termios *termios_p)
return _cfgetospeed(termios_p); return _cfgetospeed(termios_p);
} }
/**
* @brief Hook for the cfsetispeed function.
*
* This function intercepts calls to cfsetispeed and redirects them to different
* devices based on the file descriptor.
* @param termios_p The termios structure to set the input speed on.
*/
int cfsetispeed(struct termios *termios_p, speed_t speed) int cfsetispeed(struct termios *termios_p, speed_t speed)
{ {
int (*_cfsetispeed)(struct termios *termios_p, speed_t speed) = dlsym(RTLD_NEXT, "cfsetispeed"); int (*_cfsetispeed)(struct termios *termios_p, speed_t speed) = dlsym(RTLD_NEXT, "cfsetispeed");
@@ -1220,6 +1398,13 @@ int cfsetispeed(struct termios *termios_p, speed_t speed)
return _cfsetispeed(termios_p, speed); return _cfsetispeed(termios_p, speed);
} }
/**
* @brief Hook for the cfsetospeed function.
*
* This function intercepts calls to cfsetospeed and redirects them to different
* devices based on the file descriptor.
* @param termios_p The termios structure to set the output speed on.
*/
int cfsetospeed(struct termios *termios_p, speed_t speed) int cfsetospeed(struct termios *termios_p, speed_t speed)
{ {
int (*_cfsetospeed)(struct termios *termios_p, speed_t speed) = dlsym(RTLD_NEXT, "cfsetospeed"); int (*_cfsetospeed)(struct termios *termios_p, speed_t speed) = dlsym(RTLD_NEXT, "cfsetospeed");
@@ -1230,6 +1415,14 @@ int cfsetospeed(struct termios *termios_p, speed_t speed)
return _cfsetospeed(termios_p, speed); return _cfsetospeed(termios_p, speed);
} }
/**
* @brief Hook for the select function.
*
* This function intercepts calls to select and redirects them to different
* devices based on the file descriptor.
* @param nfds The highest file descriptor number plus one.
* @param readfds The file descriptors to check for readability.
*/
int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds,
struct timeval *restrict timeout) struct timeval *restrict timeout)
{ {
@@ -1254,6 +1447,13 @@ int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set
return _select(nfds, readfds, writefds, exceptfds, timeout); return _select(nfds, readfds, writefds, exceptfds, timeout);
} }
/**
* @brief Hook for the system function.
*
* This function intercepts calls to system and redirects them to different
* commands based on the command string.
* @param command The command to execute.
*/
int system(const char *command) int system(const char *command)
{ {
int (*_system)(const char *command) = dlsym(RTLD_NEXT, "system"); int (*_system)(const char *command) = dlsym(RTLD_NEXT, "system");
@@ -1291,6 +1491,36 @@ int system(const char *command)
return _system(command); return _system(command);
} }
/**
* @brief Hook for the strncpy function.
*
* This function intercepts calls to strncpy and redirects them to different
* strings based on the game ID.
* @param dest The destination string.
*/
char *strncpy(char *dest, const char *src, size_t n)
{
char *(*_strncpy)(char *dest, const char *src, size_t n) = dlsym(RTLD_NEXT, "strncpy");
switch (gId)
{
case HARLEY_DAVIDSON:
case RAMBO:
case THE_HOUSE_OF_THE_DEAD_EX:
case TOO_SPICY:
if (getConfig()->GPUVendor != NVIDIA_GPU && (strstr(src, "../fs/compiledshader") != NULL || strstr(src, "../fs/compiled") != NULL))
return _strncpy(dest, "../fs/compiledmesa", n);
}
return _strncpy(dest, src, n);
}
/**
* @brief Hook for the iopl function.
*
* This function intercepts calls to iopl and always returns 0.
* @param level The I/O privilege level to set.
* @return Always returns 0.
*/
int iopl(int level) int iopl(int level)
{ {
return 0; return 0;
@@ -1306,10 +1536,11 @@ void kswap_collect(void *p)
} }
/** /**
* Hook for function used by Primevil * @brief Hook for the powf function.
* @param base The number to raise to the exponent *
* @param exp The exponent to raise the number to * This function intercepts calls to powf and redirects them to pow.
* @return The result of raising the number to the exponent * @param base The base number.
* @param exponent The exponent.
*/ */
float powf(float base, float exponent) float powf(float base, float exponent)
{ {
@@ -1324,6 +1555,13 @@ int sem_wait(sem_t *sem)
} }
*/ */
/**
* @brief Gets the machine's IP address.
*
* This function retrieves the machine's IP address and stores it in the
* provided sockaddr_in structure.
* @param addr The sockaddr_in structure to store the IP address in.
*/
int get_machine_ip(struct sockaddr_in *addr) int get_machine_ip(struct sockaddr_in *addr)
{ {
struct ifaddrs *ifaddr, *ifa; struct ifaddrs *ifaddr, *ifa;
@@ -1396,7 +1634,11 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
} }
/** /**
* Callback function to get the offset and size of the execution program in memory of the ELF we hook to. * @brief Callback function for dl_iterate_phdr.
*
* This function is called for each program header in the loaded shared
* objects. It is used to calculate the CRC32 of the ELF file.
* @param info Information about the program header.
*/ */
static int callback(struct dl_phdr_info *info, size_t size, void *data) static int callback(struct dl_phdr_info *info, size_t size, void *data)
{ {
@@ -1408,7 +1650,11 @@ static int callback(struct dl_phdr_info *info, size_t size, void *data)
} }
/** /**
* Stop the game changing the DISPLAY environment variable * @brief Hook for the setenv function.
*
* This function intercepts calls to setenv and prevents the game from
* changing the DISPLAY environment variable.
* @param name The name of the environment variable.
*/ */
int setenv(const char *name, const char *value, int overwrite) int setenv(const char *name, const char *value, int overwrite)
{ {
@@ -1423,7 +1669,10 @@ int setenv(const char *name, const char *value, int overwrite)
} }
/** /**
* Fake the TEA_DIR environment variable to games that require it to run * @brief Hook for the getenv function.
*
* This function "Fakes" the TEA_DIR environment variable to games that require it to run
* @param name The name of the environment variable.
*/ */
char *getenv(const char *name) char *getenv(const char *name)
{ {
@@ -1470,7 +1719,11 @@ char *getenv(const char *name)
} }
/** /**
* Stop the game unsetting the DISPLAY environment variable * @brief Hook for the unsetenv function.
*
* This function intercepts calls to unsetenv and prevents the game from
* unsetting the DISPLAY environment variable.
* @param name The name of the environment variable.
*/ */
int unsetenv(const char *name) int unsetenv(const char *name)
{ {
@@ -1497,6 +1750,13 @@ char *__strdup(const char *string)
return ___strdup(string); return ___strdup(string);
} }
/**
* @brief Hook for the localtime_r function.
*
* This function intercepts calls to localtime_r and redirects them to different
* times based on the game ID.
* @param timep The time to convert.
*/
struct tm *localtime_r(const time_t *timep, struct tm *result) struct tm *localtime_r(const time_t *timep, struct tm *result)
{ {
struct tm *(*_localtime_r)(const time_t *, struct tm *) = struct tm *(*_localtime_r)(const time_t *, struct tm *) =
+1 -4
View File
@@ -1,5 +1,4 @@
#ifndef JVS_H_ #pragma once
#define JVS_H_
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -242,5 +241,3 @@ JVSIO* getJVSIO();
int setSwitch(JVSPlayer player, JVSInput switchNumber, int value); int setSwitch(JVSPlayer player, JVSInput switchNumber, int value);
int incrementCoin(JVSPlayer player, int amount); int incrementCoin(JVSPlayer player, int amount);
int setAnalogue(JVSInput channel, int value); int setAnalogue(JVSInput channel, int value);
#endif // JVS_H_
+325 -406
View File
@@ -1,13 +1,14 @@
#include <dirent.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdint.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include <libgen.h>
#include <sys/stat.h>
#include <limits.h>
#include "config.h"
#include "evdevinput.h" #include "evdevinput.h"
#include "version.h" #include "version.h"
#include "log.h" #include "log.h"
@@ -15,37 +16,17 @@
#define LD_LIBRARY_PATH "LD_LIBRARY_PATH" #define LD_LIBRARY_PATH "LD_LIBRARY_PATH"
#define LD_PRELOAD "LD_PRELOAD" #define LD_PRELOAD "LD_PRELOAD"
#define PRELOAD_FILE_NAME "lindbergh.so" #define PRELOAD_FILE_NAME "lindbergh.so"
#define PRELOAD_FILE_FLATPAK "/app/lib32/lindbergh.so"
#define TEAM "bobbydilley, retrofan, dkeruza-neo, doozer, francesco, rolel, caviar-x" #define TEAM "bobbydilley, retrofan, dkeruza-neo, doozer, francesco, rolel, caviar-x"
#define LINDBERGH_CONFIG_PATH "LINDBERGH_CONFIG_PATH" #define LINDBERGH_CONFIG_PATH "LINDBERGH_CONFIG_PATH"
#define MAX_PATH_LEN 1024 #define LINDBERGH_LOADER_CURRENT_DIR "LINDBERGH_LOADER_CURRENT_DIR"
uint32_t elf_crc = 0; uint32_t elf_crc = 0;
char *ldPreloadLibrary = "";
// List of all lindbergh executables known, not including the test executables // List of all lindbergh executables known, not including the test executables
char *games[] = {"main.exe", char *games[] = {"a.elf", "abc", "apacheM.elf", "chopperM.elf", "drive.elf", "dsr",
"ramboM.elf", "gsevo", "hod4M.elf", "hodexRI.elf", "hummer_Master.elf", "id4.elf", "id5.elf",
"vt3_Lindbergh", "Jennifer", "lgj_final", "lgjsp_app", "main.exe", "mj4", "ramboM.elf",
"hummer_Master.elf", "vf5", "vsg", "vt3", "vt3_Lindbergh", "END"};
"drive.elf",
"chopperM.elf",
"vsg",
"Jennifer",
"dsr",
"abc",
"hod4M.elf",
"lgj_final",
"vt3",
"id4.elf",
"id5.elf",
"lgjsp_app",
"gsevo",
"vf5",
"apacheM.elf",
"hodexRI.elf",
"a.elf",
"END"};
/** /**
* An array containin clean games elf's CRC32 * An array containin clean games elf's CRC32
@@ -102,6 +83,7 @@ uint32_t cleanElfCRC32[] = {
0xB0A96E34, // DVP-0043 | vf5 0xB0A96E34, // DVP-0043 | vf5
0xF99E5635, // DVP-0044 | drive.elf 0xF99E5635, // DVP-0044 | drive.elf
0x4143F6B4, // DVP-0048A | main.exe 0x4143F6B4, // DVP-0048A | main.exe
0x65489691, // DVP-0049 | mj4
0x653BC83B, // DVP-0057 | a.elf 0x653BC83B, // DVP-0057 | a.elf
0x04D88552, // DVP-0057B | a.elf 0x04D88552, // DVP-0057B | a.elf
0x089D6051, // DVP-0060 | dsr 0x089D6051, // DVP-0060 | dsr
@@ -112,6 +94,7 @@ uint32_t cleanElfCRC32[] = {
0x2E6732A3, // DVP-0070F | id5.elf 0x2E6732A3, // DVP-0070F | id5.elf
0xF99A3CDB, // DVP-0075 | id5.elf 0xF99A3CDB, // DVP-0075 | id5.elf
0x05647A8E, // DVP-0079 | hummer_Master.elf 0x05647A8E, // DVP-0079 | hummer_Master.elf
0x0AD7CF0F, // DVP-0081 | mj4
0x4442EA15, // DVP-0083 | hummer_Master.elf 0x4442EA15, // DVP-0083 | hummer_Master.elf
0x8DF6BBF9, // DVP-0084 | id5.elf 0x8DF6BBF9, // DVP-0084 | id5.elf
0x2AF8004E, // DVP-0084A | id5.elf 0x2AF8004E, // DVP-0084A | id5.elf
@@ -128,7 +111,7 @@ int cleanElfCRC32Count = sizeof(cleanElfCRC32) / sizeof(uint32_t);
uint32_t calcCrc32(uint32_t crc, uint8_t data) uint32_t calcCrc32(uint32_t crc, uint8_t data)
{ {
crc ^= data; // No shift needed; working in LSB-first order crc ^= data;
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
if (crc & 1) if (crc & 1)
@@ -143,6 +126,30 @@ uint32_t calcCrc32(uint32_t crc, uint8_t data)
return crc; return crc;
} }
int calculateCRC32inChunks(const char *filename, uint32_t *crc)
{
FILE *file = fopen(filename, "rb");
if (file == NULL)
{
log_error("Could not open file to calculate the CRC32.");
return EXIT_FAILURE;
}
*crc = 0xFFFFFFFF;
uint8_t buffer[4096];
size_t bytesRead;
while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0)
{
for (size_t i = 0; i < bytesRead; i++)
{
*crc = calcCrc32(*crc, buffer[i]);
}
}
fclose(file);
return 0;
}
int lookupCrcTable(uint32_t crc) int lookupCrcTable(uint32_t crc)
{ {
for (int x = 0; x < cleanElfCRC32Count; x++) for (int x = 0; x < cleanElfCRC32Count; x++)
@@ -153,12 +160,24 @@ int lookupCrcTable(uint32_t crc)
return 0; return 0;
} }
int fileExists(const char *path)
{
struct stat buffer;
return stat(path, &buffer) == 0;
}
int dirExists(const char *path)
{
struct stat buffer;
return stat(path, &buffer) == 0 && S_ISDIR(buffer.st_mode);
}
void isCleanElf(char *command) void isCleanElf(char *command)
{ {
char *last_space = strrchr(command, ' '); char *lastSpace = strrchr(command, ' ');
size_t length; size_t length;
if (last_space != NULL && strcmp(last_space, " -t") == 0) if (lastSpace != NULL && strcmp(lastSpace, " -t") == 0)
length = (size_t)(last_space - command); length = (size_t)(lastSpace - command);
else else
length = strlen(command); length = strlen(command);
@@ -166,38 +185,16 @@ void isCleanElf(char *command)
strncpy(elfName, command, length); strncpy(elfName, command, length);
elfName[length] = '\0'; elfName[length] = '\0';
// Remove double quotes from path if it was added. if (dirExists(elfName))
int j = 0;
for (int i = 0; elfName[i] != '\0'; i++)
{ {
if (elfName[i] != '"') log_error("There is a folder named \'%s\' in the current directory instead of a game's ELF.", elfName + 2);
{ exit(EXIT_FAILURE);
elfName[j] = elfName[i];
j++;
}
} }
elfName[j] = '\0';
FILE *file = fopen(elfName, "rb"); uint32_t crc;
if (!file) if (calculateCRC32inChunks(elfName, &crc) != 0)
{
log_error("Could not calculate the Elf CRC32.");
return; return;
}
uint32_t crc = 0xFFFFFFFF;
uint8_t buffer[4096];
size_t bytesRead;
while ((bytesRead = fread(buffer, 1, sizeof(buffer), file)) > 0)
{
for (size_t i = 0; i < bytesRead; i++)
{
crc = calcCrc32(crc, buffer[i]);
}
}
fclose(file);
crc = crc ^ 0xFFFFFFFF; crc = crc ^ 0xFFFFFFFF;
if (!lookupCrcTable(crc)) if (!lookupCrcTable(crc))
@@ -210,199 +207,146 @@ void isCleanElf(char *command)
} }
} }
/** void extractPathFromProg(const char *input, char *out_path, char *out_prog)
* Tests if the game uses a seperate elf for test mode
* and updates the command line to this elf.
*
* @param name The command path to run
*/
void testModePath(char *name)
{ {
char *pos; char tmp1[MAX_PATH_LENGTH], tmp2[MAX_PATH_LENGTH];
// Check if a different testmode elf is used strncpy(tmp1, input, MAX_PATH_LENGTH);
pos = strstr(name, "/hod4M.elf"); strncpy(tmp2, input, MAX_PATH_LENGTH);
if (pos != NULL) strncpy(out_prog, basename(tmp1), MAX_PATH_LENGTH);
{ strncpy(out_path, dirname(tmp2), MAX_PATH_LENGTH);
strcpy(pos, "/hod4testM.elf");
return;
}
pos = strstr(name, "/hodexRI.elf");
if (pos != NULL)
{
strcpy(pos, "/hodextestR.elf");
return;
}
pos = strstr(name, "/Jennifer\"/Jennifer");
if (pos != NULL)
{
strcpy(pos, "/Jennifer\"/../JenTest/JenTest");
return;
}
pos = strstr(name, "/Jennifer");
if (pos != NULL)
{
strcpy(pos, "/../JenTest/JenTest");
return;
}
pos = strstr(name, "/apacheM.elf");
if (pos != NULL)
{
strcpy(pos, "/apachetestM.elf");
return;
}
pos = strstr(name, "/vt3_Lindbergh\"/vt3_Lindbergh");
if (pos != NULL)
{
strcpy(pos, "/vt3_Lindbergh\"/vt3_testmode");
return;
}
pos = strstr(name, "/vt3_Lindbergh");
if (pos != NULL)
{
strcpy(pos, "/vt3_testmode");
return;
}
// Otherwise add the standard -t to the end
strcat(name, " -t");
} }
bool isValidDirectory(const char *path) void testModePath(char *program)
{ {
struct stat statbuf; if (strcmp(program, "hod4M.elf") == 0)
strcpy(program, "hod4testM.elf");
if (stat(path, &statbuf) != 0) else if (strcmp(program, "hodexRI.elf") == 0)
return false; strcpy(program, "hodextestR.elf");
else if (strcmp(program, "apacheM.elf") == 0)
return S_ISDIR(statbuf.st_mode); strcpy(program, "apachetestM.elf");
else if (strcmp(program, "vt3_Lindbergh") == 0)
strcpy(program, "vt3_testmode");
else if (strcmp(program, "Jennifer") == 0)
strcpy(program, "../JenTest/JenTest");
else
strcat(program, " -t");
} }
char *find32bLibFolder(void) char *findPreloadLibrary(const char *originalDir, const char *gameDir)
{ {
const char *candidates[] = {"lib32", "lib/i386-linux-gnu", "lib/i686-linux-gnu", "lib"}; static char result[MAX_PATH_LENGTH];
int num_candidates = sizeof(candidates) / sizeof(candidates[0]); char appImageLib[MAX_PATH_LENGTH];
snprintf(appImageLib, MAX_PATH_LENGTH, "%s/usr/lib32", getenv("APP_IMG_ROOT"));
const char *folderCandidates[] = {"/app/lib32", appImageLib, originalDir, "/usr/lib/i386-linux-gnu", "/usr/lib/i686-linux-gnu",
"/usr/lib32", "/usr/lib", NULL};
char current_path[PATH_MAX]; for (int i = 0; i < sizeof(folderCandidates) / sizeof(folderCandidates[0]); i++)
struct stat st;
char *result_path = NULL;
for (int i = 0; i < num_candidates; ++i)
{ {
int written = snprintf(current_path, sizeof(current_path), "/usr/%s", candidates[i]); snprintf(result, MAX_PATH_LENGTH, "%s/%s", folderCandidates[i], PRELOAD_FILE_NAME);
if (fileExists(result))
if (written < 0 || (size_t)written >= sizeof(current_path)) return result;
continue;
if (stat(current_path, &st) == 0 && S_ISDIR(st.st_mode))
{
size_t path_len = strlen(current_path);
result_path = (char *)malloc(path_len + 1);
if (result_path == NULL)
{
log_fatal("Failed to allocate memory for result path.");
return NULL;
}
strcpy(result_path, current_path);
return result_path;
}
} }
if (fileExists(PRELOAD_FILE_NAME))
return PRELOAD_FILE_NAME;
return NULL; return NULL;
} }
char *findLDPreloadLibrary() int pathsDiffer(const char *p1, const char *p2)
{ {
const char *library_name = PRELOAD_FILE_NAME; char real1[MAX_PATH_LENGTH], real2[MAX_PATH_LENGTH];
static char *empty_string = ""; if (!realpath(p1, real1) || !realpath(p2, real2))
char *found_path_ptr = NULL; return 1;
return strcmp(real1, real2) != 0;
char *search_dir = find32bLibFolder();
if (search_dir == NULL || search_dir[0] == '\0')
{
log_error("Error: search_dir is NULL or empty.\n");
return empty_string;
}
char full_library_path[PATH_MAX];
int len_written = snprintf(full_library_path, sizeof(full_library_path), "%s/%s", search_dir, library_name);
if (len_written < 0 || (size_t)len_written >= sizeof(full_library_path))
{
log_error("find_preload_library_in_specific_dir: Warning: Constructed path is too long or invalid: %s/%s\n", search_dir,
library_name);
return empty_string;
}
if (access(full_library_path, F_OK) == 0)
{
found_path_ptr = (char *)malloc(strlen(full_library_path) + 1);
if (found_path_ptr == NULL)
{
log_error("find_preload_library_in_specific_dir: Failed to allocate memory for result path");
return empty_string;
}
else
{
strcpy(found_path_ptr, full_library_path);
return found_path_ptr;
}
}
else
{
return empty_string;
}
} }
/** bool hasSpaces(const char *path)
* Makes sure the environment variables are set correctly
* to run the game.
*/
void setEnvironmentVariables(int isFlatpak, int zink, int nvidia)
{ {
// Ensure the library path is set correctly if (strchr(path, ' '))
char libraryPath[128] = {0}; return true;
const char *currentLibraryPath = getenv(LD_LIBRARY_PATH); return false;
if (currentLibraryPath != NULL) }
void setEnvironmentVariables(const char *ldLibPath, const char *originalDir, const char *gameDir, int zink, int nvidia,
const char *confFilePath)
{
setenv("LD_PRELOAD", ldLibPath, 1);
if (hasSpaces(ldLibPath))
{ {
strcat(libraryPath, currentLibraryPath); log_error("The path \'%s\' where lindbergh.so is located cannot contain spaces.", ldLibPath);
strcat(libraryPath, ":"); exit(EXIT_FAILURE);
} }
strcat(libraryPath, ".:lib:../lib"); char *currentLibraryPath = getenv("LD_LIBRARY_PATH");
char newLdLibPath[MAX_PATH_LENGTH * 3] = "";
setenv(LD_LIBRARY_PATH, libraryPath, 1); if (currentLibraryPath && strlen(currentLibraryPath) > 0)
snprintf(newLdLibPath, sizeof(newLdLibPath), "%s:", currentLibraryPath);
// Ensure the preload path is set correctly char *tmpLibPath = dirname(strdup(ldLibPath));
if (isFlatpak)
setenv(LD_PRELOAD, PRELOAD_FILE_FLATPAK, 1); if (strcmp(tmpLibPath, ".") != 0)
else if (strcmp(ldPreloadLibrary, "") != 0) {
setenv(LD_PRELOAD, ldPreloadLibrary, 1); strcat(newLdLibPath, ":");
else strcat(newLdLibPath, tmpLibPath);
setenv(LD_PRELOAD, PRELOAD_FILE_NAME, 1); }
if (originalDir != NULL && originalDir[0] != '\0' && pathsDiffer(originalDir, tmpLibPath) != 0)
{
strcat(newLdLibPath, ":");
strcat(newLdLibPath, originalDir);
}
if (gameDir && gameDir[0] != '\0' && pathsDiffer(originalDir, gameDir) && pathsDiffer(tmpLibPath, gameDir))
{
strcat(newLdLibPath, ":");
strcat(newLdLibPath, gameDir);
}
strcat(newLdLibPath, ":.:lib:../lib");
if (newLdLibPath[0] == ':')
memmove(newLdLibPath, newLdLibPath + 1, strlen(newLdLibPath));
setenv("LD_LIBRARY_PATH", newLdLibPath, 1);
if (strlen(confFilePath) > 0)
{
if (hasSpaces(confFilePath))
{
log_error("The path \'%s\' for the config file cannot contain spaces.", confFilePath);
exit(EXIT_FAILURE);
}
setenv(LINDBERGH_CONFIG_PATH, confFilePath, 1);
}
if (zink && nvidia)
{
log_error("Cannot pass both, zink and nvidia options at the same time.");
exit(EXIT_FAILURE);
}
if (zink) if (zink)
{
setenv("MESA_LOADER_DRIVER_OVERRIDE", "zink", 1); setenv("MESA_LOADER_DRIVER_OVERRIDE", "zink", 1);
}
if (nvidia) if (nvidia)
{ {
setenv("__GLX_VENDOR_LIBRARY_NAME", "nvidia", 1); setenv("__GLX_VENDOR_LIBRARY_NAME", "nvidia", 1);
setenv("__NV_PRIME_RENDER_OFFLOAD", "1", 1); setenv("__NV_PRIME_RENDER_OFFLOAD", "1", 1);
} }
char *appImgRoot = getenv("APP_IMG_ROOT");
if (appImgRoot != NULL)
{
char libglDriPath[MAX_PATH_LENGTH];
sprintf(libglDriPath, "%s/usr/lib32/dri", appImgRoot);
setenv("LIBGL_DRIVERS_PATH", libglDriPath, 1);
}
} }
/**
* Prints the usage for the loader
*/
void printUsage(char *argv[]) void printUsage(char *argv[])
{ {
printf("%s [GAME_PATH] [OPTIONS]\n", argv[0]); printf("%s [GAME_PATH] [OPTIONS]\n", argv[0]);
@@ -416,12 +360,15 @@ void printUsage(char *argv[])
printf(" --version Displays the version of the loader and team's names\n"); printf(" --version Displays the version of the loader and team's names\n");
printf(" --help Displays this usage text\n"); printf(" --help Displays this usage text\n");
printf(" --config | -c Specifies configuration path\n"); printf(" --config | -c Specifies configuration path\n");
printf(" --gamepath | -g Specifies game path\n"); printf(" --gamepath | -g Specifies game path without ELF name\n");
}
void printVersion()
{
printf("Lindbergh Loader v%d.%d\n", MAJOR_VERSION, MINOR_VERSION);
printf("Created by: %s\n", TEAM);
} }
/**
* Lists available evdev controllers and their inputs
*/
int listControllers() int listControllers()
{ {
Controllers controllers; Controllers controllers;
@@ -429,7 +376,7 @@ int listControllers()
ControllerStatus status = initControllers(&controllers); ControllerStatus status = initControllers(&controllers);
if (status != CONTROLLER_STATUS_SUCCESS) if (status != CONTROLLER_STATUS_SUCCESS)
{ {
printf("Failed to list controllers\n"); log_error("Failed to list controllers\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@@ -446,29 +393,16 @@ int listControllers()
printf(" - %s\n", controller.inputs[i].inputName); printf(" - %s\n", controller.inputs[i].inputName);
} }
} }
stopControllers(&controllers); stopControllers(&controllers);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
/**
* Small utility to automatically detect the game and run it without
* having to type a long string in.
*/
void printVersion() {
printf("Lindbergh Loader v%d.%d\n", MAJOR_VERSION, MINOR_VERSION);
printf("Created by: %s\n", TEAM);
}
/**
* Small utility to automatically detect the game and run it without
* having to type a long string in.
*/
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
// Check for --version before directory operations if (argc > 1 && strcmp(argv[1], "--version") == 0)
if (argc > 1 && strcmp(argv[1], "--version") == 0) { {
printVersion(); printVersion();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@@ -484,150 +418,47 @@ int main(int argc, char *argv[])
return listControllers(); return listControllers();
} }
// We save the current dir to return to it later char passedGamePath[MAX_PATH_LENGTH] = "";
char curDir[MAX_PATH_LEN]; char forcedGamePath[MAX_PATH_LENGTH] = "";
if (getcwd(curDir, sizeof(curDir)) == NULL) char forcedGameDir[MAX_PATH_LENGTH] = "";
{ char gameELF[MAX_PATH_LENGTH] = "";
log_error("Error: could not get the current directory."); char extConfigPath[MAX_PATH_LENGTH] = "";
return EXIT_FAILURE; char originalDir[MAX_PATH_LENGTH] = "";
} bool gdb = false;
bool testMode = false;
// Check if a game folder was passed as a parameter bool segaboot = false;
char gamePath[PATH_MAX] = {0}; bool zink = false;
for (int i = 1; i < argc; i++) bool nvidia = false;
{
if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "--gamepath") == 0)
{
if (i + 1 >= argc)
{
break;
}
strncpy(gamePath, argv[i + 1], PATH_MAX);
i += 1;
continue;
}
}
// Look for the games
struct dirent *ent;
DIR *dir;
if (gamePath[0] != '\0')
{
// Check if the passed folder is valid
if (!isValidDirectory(gamePath))
{
log_error("The game folder is invalid.");
return EXIT_FAILURE;
}
dir = opendir(gamePath);
}
else
{
dir = opendir(curDir);
}
if (dir == NULL)
{
log_error("Could not list files in current directory.");
return EXIT_FAILURE;
}
char *game = NULL;
int lindberghSharedObjectFound = 0;
int isFlatpak = 0;
while ((ent = readdir(dir)) != NULL)
{
if (ent->d_type != DT_REG)
continue;
if (strcmp(ent->d_name, PRELOAD_FILE_NAME) == 0)
{
lindberghSharedObjectFound = 1;
continue;
}
int index = 0;
while (game == NULL)
{
if (strcmp(games[index], "END") == 0)
break;
if (strcmp(ent->d_name, games[index]) == 0)
{
game = games[index];
break;
}
index++;
}
if (game != NULL && lindberghSharedObjectFound)
break;
}
closedir(dir);
ldPreloadLibrary = findLDPreloadLibrary();
if (!lindberghSharedObjectFound)
{
FILE *file = fopen(PRELOAD_FILE_FLATPAK, "r");
if (file)
{
fclose(file);
isFlatpak = 1;
}
else if (strcmp(ldPreloadLibrary, "") == 0)
{
log_error("The preload object lindbergh.so was not found in this directory.");
return EXIT_FAILURE;
}
}
// Build up the command to start the game
int testMode = 0;
int gdb = 0;
int zink = 0;
int nvidia = 0;
int forceGame = 0;
int segaboot = 0;
char extConfigPath[PATH_MAX] = {0};
char forceGamePath[128] = {0};
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
{ {
if (strcmp(argv[i], "-t") == 0 || strcmp(argv[i], "--test") == 0) if (strcmp(argv[i], "-t") == 0 || strcmp(argv[i], "--test") == 0)
{ {
testMode = 1; testMode = true;
continue; continue;
} }
if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--segaboot") == 0) if (strcmp(argv[i], "-s") == 0 || strcmp(argv[i], "--segaboot") == 0)
{ {
segaboot = 1; segaboot = true;
continue; continue;
} }
if (strcmp(argv[i], "--gdb") == 0) if (strcmp(argv[i], "--gdb") == 0)
{ {
gdb = 1; gdb = true;
continue; continue;
} }
if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--zink") == 0) if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--zink") == 0)
{ {
zink = 1; zink = true;
continue; continue;
} }
if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--nvidia") == 0) if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--nvidia") == 0)
{ {
nvidia = 1; nvidia = true;
continue; continue;
} }
@@ -637,53 +468,157 @@ int main(int argc, char *argv[])
{ {
break; break;
} }
strncpy(extConfigPath, argv[i + 1], PATH_MAX); strncpy(extConfigPath, argv[i + 1], MAX_PATH_LENGTH);
i += 1; i += 1;
continue; continue;
} }
if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "--gamepath") == 0) if ((strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "--gamepath") == 0) && i + 1 < argc)
{ {
if (i + 1 >= argc) strncpy(passedGamePath, argv[i + 1], MAX_PATH_LENGTH);
break; i++;
i += 1;
continue; continue;
} }
// Treat the argument as the game name strncpy(forcedGamePath, argv[i], MAX_PATH_LENGTH);
strcpy(forceGamePath, argv[i]);
forceGame = 1;
} }
// Ensure environment variables are set correctly if (!getcwd(originalDir, sizeof(originalDir)))
setEnvironmentVariables(isFlatpak, zink, nvidia);
char command[128] = {0};
if (gamePath[0] != '\0')
sprintf(command, "\"%s\"/", gamePath);
else
strcpy(command, "./");
if (forceGame)
{ {
strcat(command, forceGamePath); perror("getcwd");
return EXIT_FAILURE;
} }
else if (segaboot)
int useForceCommandPath = strlen(forcedGamePath) > 0;
bool commandOnlyElf = useForceCommandPath && strchr(forcedGamePath, '/') == NULL;
if (useForceCommandPath && !commandOnlyElf)
{ {
strcat(command, "segaboot -t"); if (!fileExists(forcedGamePath))
}
else
{
if (game == NULL)
{ {
log_error("No lindbergh game found in this directory."); log_error("File does not exist: %s\n", forcedGamePath);
return EXIT_FAILURE;
}
extractPathFromProg(forcedGamePath, forcedGameDir, gameELF);
if (hasSpaces(forcedGameDir))
{
log_warn("The path contains spaces, this most likely will cause issues.");
log_warn("Please, make sure you don't use spaces in the path.");
}
if (!dirExists(forcedGameDir))
{
log_error("Directory does not exist: %s\n", forcedGameDir);
return EXIT_FAILURE;
}
chdir(forcedGameDir);
}
else if (strlen(passedGamePath) > 0)
{
if (hasSpaces(passedGamePath))
{
log_warn("The path contains spaces, this most likely will cause issues.");
log_warn("Please, make sure you don't use spaces in the path.");
}
if (!dirExists(passedGamePath))
{
log_error("Directory does not exist: %s\n", passedGamePath);
return EXIT_FAILURE;
}
chdir(passedGamePath);
if (commandOnlyElf)
{
strncpy(gameELF, forcedGamePath, MAX_PATH_LENGTH);
if (!fileExists(gameELF))
{
log_error("Program '%s' not found in %s\n", gameELF, passedGamePath);
return EXIT_FAILURE;
}
}
else
{
for (int i = 0; games[i] && strcmp(games[i], "END") != 0; i++)
{
if (fileExists(games[i]))
{
strncpy(gameELF, games[i], MAX_PATH_LENGTH);
break;
}
}
if (strlen(gameELF) == 0)
{
log_error("No known game file found in %s\n", passedGamePath);
return EXIT_FAILURE;
}
}
}
else if (commandOnlyElf)
{
strncpy(gameELF, forcedGamePath, MAX_PATH_LENGTH);
if (!fileExists(gameELF))
{
log_error("'%s' not found in current directory\n", gameELF);
return EXIT_FAILURE;
}
}
else
{
for (int i = 0; games[i] && strcmp(games[i], "END") != 0; i++)
{
if (access(games[i], F_OK) == 0)
{
strncpy(gameELF, games[i], sizeof(gameELF) - 1);
gameELF[sizeof(gameELF) - 1] = '\0';
printf("Auto-detected ELF: %s\n", gameELF);
break;
}
}
if (gameELF[0] == '\0')
{
log_error("No game ELF found in current directory.\n");
printUsage(argv);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
strcat(command, game);
} }
if (testMode) if (testMode)
testModePath(command); {
testModePath(gameELF);
}
char *targetedGameDir = strlen(forcedGameDir) ? forcedGameDir : passedGamePath;
char *lib_path = findPreloadLibrary(originalDir, targetedGameDir);
if (!lib_path)
{
log_error("Error: %s not found in known locations.\n", PRELOAD_FILE_NAME);
return 1;
}
setEnvironmentVariables(lib_path, originalDir, targetedGameDir, zink, nvidia, extConfigPath);
if (segaboot)
{
strcpy(gameELF, "segaboot -t");
// testMode = true;
}
// Final command
char command[MAX_PATH_LENGTH];
if (strcmp(gameELF, "../JenTest/JenTest") == 0)
{
snprintf(command, MAX_PATH_LENGTH, "%s", gameELF);
}
else
{
snprintf(command, MAX_PATH_LENGTH, "./%s", gameELF);
}
isCleanElf(command); isCleanElf(command);
@@ -695,30 +630,14 @@ int main(int argc, char *argv[])
strcpy(command, temp); strcpy(command, temp);
} }
if (extConfigPath[0] != '\0')
{
setenv(LINDBERGH_CONFIG_PATH, extConfigPath, 1);
}
log_info("Starting $ %s", command); log_info("Starting $ %s", command);
if (gamePath[0] != '\0')
{
if (chdir(gamePath) != 0)
{
log_error("Could not change to game path.");
return EXIT_FAILURE;
}
}
int sysCmd = system(command); int sysCmd = system(command);
if (gamePath[0] != '\0') if (chdir(originalDir) != 0)
{ {
if (chdir(curDir) != 0) log_error("Could not return to the original directory.");
{ return EXIT_FAILURE;
log_error("Could not return to the original directory.");
return EXIT_FAILURE;
}
} }
return sysCmd; return sysCmd;
+1 -4
View File
@@ -1,5 +1,4 @@
#ifndef LINDBERGH_LOADER_LOG_H #pragma once
#define LINDBERGH_LOADER_LOG_H
#include <stdarg.h> #include <stdarg.h>
@@ -46,5 +45,3 @@ LogFormattedMessage logFormatMessage(const char *message, va_list args);
FILE* logGetStream(); FILE* logGetStream();
void logInitTimer(); void logInitTimer();
void logGetElapsedTime(long *seconds, long *milliseconds); void logGetElapsedTime(long *seconds, long *milliseconds);
#endif //LINDBERGH_LOADER_LOG_H
+10 -6
View File
@@ -212,8 +212,8 @@ void *readJVSFrameThread(void * arg)
* @param fd * @param fd
* @return 0|1 * @return 0|1
*/ */
int startJVSFrameThread(int * fd) { int startJVSFrameThread(int *fd)
int fdlocal = *((int *) fd); {
printf("SERIAL: starting thread.\n"); printf("SERIAL: starting thread.\n");
// Clean shared JVS frame buffer // Clean shared JVS frame buffer
@@ -236,17 +236,21 @@ int startJVSFrameThread(int * fd) {
* Return a JVSFrame structure with empty or full data, no in between * Return a JVSFrame structure with empty or full data, no in between
* @return * @return
*/ */
JVSFrame readJVSFrameFromThread() { JVSFrame readJVSFrameFromThread()
{
JVSFrame frame; JVSFrame frame;
// Lock while reading/writing to shared frame // Lock while reading/writing to shared frame
pthread_mutex_lock(&jvsBuffer_lock); pthread_mutex_lock(&jvsBuffer_lock);
// Check if we have a valid frame // Check if we have a valid frame
if (jvsFrameBuffer.ready == 1) { if (jvsFrameBuffer.ready == 1)
{
frame = jvsFrameBuffer; frame = jvsFrameBuffer;
// It has been red, we disable this frame // It has been read, we disable this frame
jvsFrameBuffer.ready = 0; jvsFrameBuffer.ready = 0;
} else { }
else
{
frame.ready = 0; frame.ready = 0;
frame.size = 0; frame.size = 0;
memset(frame.buffer, 0, JVSBUFFER_SIZE); memset(frame.buffer, 0, JVSBUFFER_SIZE);
+5 -11
View File
@@ -628,11 +628,9 @@ int initPatch()
if (GPUVendor != NVIDIA_GPU) if (GPUVendor != NVIDIA_GPU)
{ {
cacheModedShaderFiles();
loadLibCg(); loadLibCg();
cacheModedShaderFiles();
cacheNnstdshader(); cacheNnstdshader();
patchMemory(0x082d4437, "9090909090"); // Stop the folder rename
patchMemory(0x088a6127, "66732f636f6d70696c65646d657361"); // Change folder to compiledshdmesa
patchMemory(0x082646b3, "01"); // Compile using CGC patchMemory(0x082646b3, "01"); // Compile using CGC
replaceCallAtAddress(0x082d48ac, compileWithCGC); replaceCallAtAddress(0x082d48ac, compileWithCGC);
replaceCallAtAddress(0x082d4b3b, compileWithCGC); replaceCallAtAddress(0x082d4b3b, compileWithCGC);
@@ -2059,12 +2057,9 @@ int initPatch()
{ {
loadLibCg(); loadLibCg();
cacheNnstdshader(); cacheNnstdshader();
patchMemory(0x08200c17, "9090909090"); // Stop the folder rename
patchMemory(0x084173e7, "66732f636f6d70696c65646d657361"); // Change folder to compiledshdmesa
patchMemory(0x080b3d71, "01"); // Compile using CGC patchMemory(0x080b3d71, "01"); // Compile using CGC
replaceCallAtAddress(0x082015bf, compileWithCGC); replaceCallAtAddress(0x082015bf, compileWithCGC);
replaceCallAtAddress(0x082012c1, compileWithCGC); replaceCallAtAddress(0x082012c1, compileWithCGC);
// patchMemory(0x080b3d65, "00"); // Force recompile shaders
} }
} }
break; break;
@@ -2141,6 +2136,7 @@ int initPatch()
detourFunction(0x084d44fc, amDipswSetLed); detourFunction(0x084d44fc, amDipswSetLed);
detourFunction(0x084d4485, amDipswGetData); detourFunction(0x084d4485, amDipswGetData);
patchMemory(0x0804edb2, "9090909090"); //__intel_new_proc_init_P patchMemory(0x0804edb2, "9090909090"); //__intel_new_proc_init_P
detourFunction(0x08178e6c, stubRetOne); // _ZN7am_ctrl18SetNetworkAddrEth0Ejj.
detourFunction(0x0804e594, gl_XGetProcAddressARB); detourFunction(0x0804e594, gl_XGetProcAddressARB);
srtvElfShaderPatcher(); srtvElfShaderPatcher();
@@ -2487,9 +2483,8 @@ int initPatch()
// Mesa Patches // Mesa Patches
if (GPUVendor != NVIDIA_GPU) if (GPUVendor != NVIDIA_GPU)
{ {
patchMemory(0x08503bfa, "6d657361"); // Rename compile folder to compmesa
cacheModedShaderFiles();
loadLibCg(); loadLibCg();
cacheModedShaderFiles();
cacheNnstdshader(); cacheNnstdshader();
replaceCallAtAddress(0x08370aa7, compileWithCGC); replaceCallAtAddress(0x08370aa7, compileWithCGC);
replaceCallAtAddress(0x08370bb6, compileWithCGC); replaceCallAtAddress(0x08370bb6, compileWithCGC);
@@ -2550,10 +2545,9 @@ int initPatch()
if (GPUVendor != NVIDIA_GPU) if (GPUVendor != NVIDIA_GPU)
{ {
loadLibCg(); loadLibCg();
cacheNnstdshader();
patchMemory(0x081ef9d8, "01"); // Force the game to recompile the shaders using cgc
patchMemory(0x08413f04, "646d657361"); // Changes compiledshader folder to compiledshdmesa
cacheModedShaderFiles(); cacheModedShaderFiles();
cacheNnstdshader();
patchMemory(0x081ef9d8, "01"); // Force the game to recompile the shaders using cgc
replaceCallAtAddress(0x08259fe5, compileWithCGC); replaceCallAtAddress(0x08259fe5, compileWithCGC);
replaceCallAtAddress(0x0825a089, compileWithCGC); replaceCallAtAddress(0x0825a089, compileWithCGC);
} }
+249 -37
View File
@@ -185,14 +185,12 @@ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
case OUTRUN_2_SP_SDX_REVA_TEST: case OUTRUN_2_SP_SDX_REVA_TEST:
case OUTRUN_2_SP_SDX_REVA_TEST2: case OUTRUN_2_SP_SDX_REVA_TEST2:
{ {
if (gWidth != 800 && gHeight != 480)
{
if ((width >= 800) && (width != 1024))
{
width = gWidth; width = gWidth;
height = gHeight; height = gHeight;
}
}
} }
break; break;
@@ -214,13 +212,12 @@ void glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
} }
} }
break; break;
// case THE_HOUSE_OF_THE_DEAD_4_REVA:
// case THE_HOUSE_OF_THE_DEAD_4_REVB:
// case THE_HOUSE_OF_THE_DEAD_4_REVC:
case THE_HOUSE_OF_THE_DEAD_4_REVA_TEST: case THE_HOUSE_OF_THE_DEAD_4_REVA_TEST:
case THE_HOUSE_OF_THE_DEAD_4_REVB_TEST: case THE_HOUSE_OF_THE_DEAD_4_REVB_TEST:
case THE_HOUSE_OF_THE_DEAD_4_REVC_TEST: case THE_HOUSE_OF_THE_DEAD_4_REVC_TEST:
case THE_HOUSE_OF_THE_DEAD_EX_TEST: case THE_HOUSE_OF_THE_DEAD_EX_TEST:
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL_REVB_TEST:
case THE_HOUSE_OF_THE_DEAD_4_SPECIAL_TEST:
{ {
if (width == 640 && height == 480) if (width == 640 && height == 480)
{ {
@@ -295,26 +292,23 @@ void glTexImage2D(unsigned int target, int level, int internalformat, int width,
void (*_glTexImage2D)(unsigned int target, int level, int internalformat, int width, int height, int border, unsigned int format, void (*_glTexImage2D)(unsigned int target, int level, int internalformat, int width, int height, int border, unsigned int format,
unsigned int type, const void *pixels) = dlsym(RTLD_NEXT, "glTexImage2D"); unsigned int type, const void *pixels) = dlsym(RTLD_NEXT, "glTexImage2D");
if (gWidth != 800 && gHeight != 480)
{
switch (gId) switch (gId)
{ {
case OUTRUN_2_SP_SDX: case OUTRUN_2_SP_SDX:
case OUTRUN_2_SP_SDX_REVA: case OUTRUN_2_SP_SDX_REVA:
{ {
void *addr = __builtin_return_address(0); void *addr = __builtin_return_address(0);
if ((width >= 800) && (width != 1024) && (addr != (void *)0x80d78d5) && (addr != (void *)0x080d7941))
{
width = gWidth; width = gWidth;
height = gHeight; height = gHeight;
}
} }
break; break;
default: default:
break; break;
} }
} _glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
} }
void glTexParameteri(unsigned int target, unsigned int pname, int param) void glTexParameteri(unsigned int target, unsigned int pname, int param)
@@ -1268,6 +1262,182 @@ void glVertex3fHOD4(GLfloat x, GLfloat y, GLfloat z)
_glVertex3f(x, y, z); _glVertex3f(x, y, z);
} }
void tooSpicySC(uint32_t param_1, uint32_t param_2)
{
myEnableScaling = true;
SDL_WarpMouseInWindow(SDLwindow, 1280 / 2, 768 / 2);
((void (*)(uint32_t, uint32_t))0x082fa77c)(param_1, param_2);
}
void tooSpicyPR(uint32_t param_1, uint32_t param_2)
{
myEnableScaling = false;
((void (*)(uint32_t, uint32_t))0x081eb4d4)(param_1, param_2);
}
int tooSpicyVsprintf(char *str, const char *format, va_list arg)
{
int (*_vsprintf)(char *str, const char *format, va_list arg) = dlsym(RTLD_NEXT, "vsprintf");
int res = _vsprintf(str, format, arg);
if (strcmp(str, "Additional 475") == 0)
{
myEnableScaling = false;
}
return res;
}
void glVertex3f2SP(GLfloat x, GLfloat y, GLfloat z)
{
int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f");
void *returnAddress = __builtin_return_address(0);
float scaleX = gWidth / 1280.0f;
float scaleY = gHeight / 768.0f;
float TestX = ((((gWidth - 1280.0) / 2.0) * 1.1116317809) / 1280.0) * (1.5 / scaleX);
float TestY = ((((gHeight - 768.0) / 2.0) * 0.666979044) / 768.0) * (1.5 / scaleX);
float OffsetX = TestX; // test
float OffsetY = TestY;
float scaleZ = fabs(z) / 1.510000;
float AdjOffsetX = OffsetX * scaleZ;
float AdjOffsetY = OffsetY * scaleZ;
if (z == -1.000000f || z == -3.000000f)
{
// We skip 3d and videos
;
}
else if (z == -1.010000f)
{
// bd main
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.510000f)
{
// logo - coin/start - 2D
if (curTextureID == 497) // right
{
x -= OffsetX;
y -= OffsetY;
x *= scaleX;
y *= scaleY;
}
else if (curTextureID == 498)
{ // deadend
;
}
else
{
x += OffsetX;
y -= OffsetY;
x *= scaleX;
y *= scaleY;
}
}
else if (z == -1.460000f)
{
// 2D title
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.490000f)
{
// 2D title
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.500000f)
{
// 2D title
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.310000f)
{
// 2D
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.210000f)
{
// 2D
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.5109999180f)
{
// 2D
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z == -1.200000f)
{
// target - select
if (curTextureID == 454 || curTextureID == 461 || curTextureID == 456)
{
// 457 X - 454 461 456 O
if (myEnableScaling)
{
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
}
}
else if (z == -1.710000f)
{
// 2D
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
else if (z > -1.85f)
{
// 2d
x += AdjOffsetX;
y -= AdjOffsetY;
x *= scaleX;
y *= scaleY;
}
_glVertex3f(x, y, z);
}
void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z) void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z)
{ {
int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f"); int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f");
@@ -1287,11 +1457,6 @@ void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z)
y *= scaleY; y *= scaleY;
} }
void *addr = __builtin_return_address(0); void *addr = __builtin_return_address(0);
// printf("glVertex3f is hooked: x=%f, y=%f, z=%f\n", x, y, z);
// printf("z values: %.10f\n", z);
// if ( z == -3517.2272949219f){ //1360x768
// if ( z == -4271.795898f){ //900p
if (z == -5300.7529296875) if (z == -5300.7529296875)
{ // 1080p { // 1080p
printf("glVertex3f hooked: x=%f, y=%f, z=%f, addr: %p\n", x, y, z, addr); printf("glVertex3f hooked: x=%f, y=%f, z=%f, addr: %p\n", x, y, z, addr);
@@ -1302,6 +1467,38 @@ void glVertex3fHarley(GLfloat x, GLfloat y, GLfloat z)
_glVertex3f(x, y, z); _glVertex3f(x, y, z);
} }
void glVertex3fHodEx(GLfloat x, GLfloat y, GLfloat z)
{
int (*_glVertex3f)(GLfloat x, GLfloat y, GLfloat z) = dlsym(RTLD_NEXT, "glVertex3f");
float scaleX = 600.0 / gWidth;
float scaleY = 240.0 / gHeight;
if (z == -1.210000f && (y == 0.0035231018f || y == -0.0152667547f || y == -0.0209428426f || // coin/start
y == -0.0397327021f || y == -0.0454087853f || y == -0.0641986430f || y == -0.0790739134f ||
y == -0.0931663215f || y == -0.0692875385f || y == -0.0833799466f ||
y == 0.0456045270f || y == 0.0268146675f || y == 0.0211385805f || y == 0.0023487248f || y == -0.0033273622f ||
y == -0.0221172161f || y == -0.0787803382f || y == -0.0934598967f ||
y == 0.0524549857f || y == 0.0336651318f || y == 0.0279890448f || y == 0.0091991890f
))
{
x += scaleX;
y -= scaleY;
}
else if (y == 0.0042380672f || y == -0.0169522688f || y == 0.0360235684f || y == 0.0148332343f)
{ // Main bd
x += scaleX;
y -= scaleY;
}
_glVertex3f(x, y, z);
}
int initResolutionPatches() int initResolutionPatches()
{ {
gWidth = getConfig()->width; gWidth = getConfig()->width;
@@ -2284,19 +2481,15 @@ int initResolutionPatches()
break; break;
case OUTRUN_2_SP_SDX: case OUTRUN_2_SP_SDX:
{ {
if (gWidth <= 800 && gHeight <= 480)
break;
// If resolution is not the native of the game this patch kind of fix the Sun when the LensGlare effect is
// shown.
if ((gWidth > 800) && (gHeight > 480))
{
patchMemory(0x080e8e72, "9090909090"); // removes a call to a light function patchMemory(0x080e8e72, "9090909090"); // removes a call to a light function
patchMemory(0x080e8e83, "9090909090"); // removes a call to a light function patchMemory(0x080e8e83, "9090909090"); // removes a call to a light function
if (!getConfig()->outrunLensGlareEnabled) if (!getConfig()->outrunLensGlareEnabled)
{ {
detourFunction(0x080e8b34, stubReturn); // Completely disables the lens glare effect detourFunction(0x080e8b34, stubReturn); // Completely disables the lens glare effect
} }
}
setVariable(0x080b913a, 0x44200000); setVariable(0x080b913a, 0x44200000);
setVariable(0x081dae28, 0x44200000); setVariable(0x081dae28, 0x44200000);
setVariable(0x081dae30, 0x44200000); setVariable(0x081dae30, 0x44200000);
@@ -2310,19 +2503,14 @@ int initResolutionPatches()
break; break;
case OUTRUN_2_SP_SDX_REVA: case OUTRUN_2_SP_SDX_REVA:
{ {
if (gWidth <= 800 && gHeight <= 480)
break;
// If resolution is not the native of the game this patch kind of fix the Sun when the LensGlare effect is
// shown.
if ((gWidth > 800) && (gHeight > 480))
{
patchMemory(0x080e8e06, "9090909090"); // removes a call to a light function patchMemory(0x080e8e06, "9090909090"); // removes a call to a light function
patchMemory(0x080e8e17, "9090909090"); // removes a call to a light function patchMemory(0x080e8e17, "9090909090"); // removes a call to a light function
if (!getConfig()->outrunLensGlareEnabled) if (!getConfig()->outrunLensGlareEnabled)
{ {
detourFunction(0x080e8ac8, stubReturn); // Completely disables the lens glare effect detourFunction(0x080e8ac8, stubReturn); // Completely disables the lens glare effect
} }
}
setVariable(0x080b913a, 0x44200000); setVariable(0x080b913a, 0x44200000);
setVariable(0x081dada8, 0x44200000); setVariable(0x081dada8, 0x44200000);
setVariable(0x081dadb0, 0x44200000); setVariable(0x081dadb0, 0x44200000);
@@ -2348,8 +2536,7 @@ int initResolutionPatches()
case OUTRUN_2_SP_SDX_REVA_TEST: case OUTRUN_2_SP_SDX_REVA_TEST:
case OUTRUN_2_SP_SDX_REVA_TEST2: case OUTRUN_2_SP_SDX_REVA_TEST2:
{ {
if (gWidth <= 800 && gHeight <= 480)
break;
setVariable(0x0804a490, gWidth); setVariable(0x0804a490, gWidth);
setVariable(0x0804a4ad, gHeight); setVariable(0x0804a4ad, gHeight);
} }
@@ -2656,6 +2843,21 @@ int initResolutionPatches()
{ {
break; break;
} }
setVariable(0x08785b80, gWidth); // main
setVariable(0x08785b84, gHeight);
patchMemory(0x082a3222, "02");
setVariable(0x08785ad8, 1360); // sprite res 1280x768
setVariable(0x08785adc, 768);
setVariable(0x087859b8, 1360); // sprite res 640x480
setVariable(0x087859bc, 768);
patchMemory(0x081775d2, "b801000000"); // target
patchMemory(0x0804e5d2, "909090909090");
setVariable(0x087aa080, gWidth); // render res
patchMemory(0x0804e60c, "909090909090");
patchMemory(0x0828cc2f, "909090909090");
} }
break; break;
case TOO_SPICY: case TOO_SPICY:
@@ -2670,6 +2872,16 @@ int initResolutionPatches()
{ {
break; break;
} }
setVariable(0x08202b22, gWidth); // render res
patchMemory(0x08202b19, "74");
setVariable(0x08664410, gWidth); // 1280x768
setVariable(0x08664414, gHeight);
detourFunction(0x0804d0d0, glVertex3f2SP);
detourFunction(0x0804dda0, myGlBindTexture);
replaceCallAtAddress(0x080d96ff, tooSpicySC);
replaceCallAtAddress(0x080da026, tooSpicyPR);
detourFunction(0x0804ce10, tooSpicyVsprintf);
patchMemory(0x081f96b9, "02"); // 5
} }
break; break;
case TOO_SPICY_TEST: case TOO_SPICY_TEST:
+87 -27
View File
@@ -1,7 +1,6 @@
#ifndef __i386__ #ifndef __i386__
#define __i386__ #define __i386__
#include "shader_work/vf5.h"
#include <stdint.h> #include <stdint.h>
#endif #endif
#undef __x86_64__ #undef __x86_64__
@@ -23,6 +22,7 @@
#include "../libxdiff/xdiff/xdiff.h" #include "../libxdiff/xdiff/xdiff.h"
#include "config.h" #include "config.h"
#include "patch.h" #include "patch.h"
#include "log.h"
#include "shader_work/2spicy.h" #include "shader_work/2spicy.h"
#include "shader_work/abc.h" #include "shader_work/abc.h"
@@ -93,8 +93,8 @@ char *replaceSubstring(const char *buffer, int start, int end, const char *searc
maxOccurrences++; maxOccurrences++;
tmp += searchLen; tmp += searchLen;
} }
int maxNewLen = (bufferLen + (maxOccurrences * (replaceLen - searchLen))) + int maxNewLen =
15; // 15 instead of 1 because it crashes with SRTV for no reason?? (bufferLen + (maxOccurrences * (replaceLen - searchLen))) + 15; // 15 instead of 1 because it crashes with SRTV for no reason??
char *newBuffer = malloc(maxNewLen); char *newBuffer = malloc(maxNewLen);
memset(newBuffer, '\0', maxNewLen); memset(newBuffer, '\0', maxNewLen);
@@ -1542,41 +1542,101 @@ int parseCgcArgs(const char *input, const char ***compilerArgs, const char **out
return 0; return 0;
} }
void loadLibCg() char *findLibCg()
{ {
int isFlatpak = 0; const char *foundPath = NULL;
void *handle = dlopen("./libCg.so", RTLD_NOW); FILE *libCgF = NULL;
if (!handle)
char appImageLib[MAX_PATH_LENGTH];
snprintf(appImageLib, MAX_PATH_LENGTH, "%s/usr/lib32/libCg2.so", getenv("APP_IMG_ROOT"));
char *pathsToCheck[] = {NULL, "/app/lib32/libCg2.so", appImageLib, "./libCg.so", NULL};
if (strcmp(getConfig()->libCgPath, "") != 0)
{ {
handle = dlopen("/app/lib32/libCg2.so", RTLD_NOW); pathsToCheck[0] = getConfig()->libCgPath;
if (!handle) }
const char *currentDir = getenv("LINDBERGH_LOADER_CURRENT_DIR");
if (currentDir != NULL)
{
size_t pathLen = strlen(currentDir) + strlen("/libCg.so") + 1;
pathsToCheck[3] = malloc(pathLen);
if (pathsToCheck[4] != NULL)
{ {
fprintf(stderr, "Error: Unable to load library libCg.so %s\n", dlerror()); snprintf(pathsToCheck[4], pathLen, "%s/%s", currentDir, "libCg.so");
fprintf(stderr, "Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
exit(1);
}
else
{
isFlatpak = 1;
} }
} }
char libCgVersion[9]; for (int i = 0; i < 5; ++i)
FILE *libF; {
if (isFlatpak) if (pathsToCheck[i] == NULL)
libF = fopen("/app/lib32/libCg2.so", "r"); continue;
else
libF = fopen("./libCg.so", "r");
fseek(libF, 0x226d84, SEEK_SET); if (access(pathsToCheck[i], F_OK) == 0)
fread(libCgVersion, 9, 1, libF); {
fclose(libF); foundPath = pathsToCheck[i];
break;
}
}
if (foundPath != pathsToCheck[4] && pathsToCheck[4] != NULL)
{
free(pathsToCheck[4]);
}
if (foundPath == NULL)
{
log_error("Error: Unable to find library libCg.so\n");
log_error("Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
exit(EXIT_FAILURE);
}
char libCgVersion[9] = {0};
libCgF = fopen(foundPath, "rb");
if (libCgF == NULL)
{
log_error("Failed to open: %s\n", foundPath);
exit(EXIT_FAILURE);
}
fseek(libCgF, 0x226d84L, SEEK_SET);
if (fread(libCgVersion, 1, sizeof(libCgVersion) - 1, libCgF) != sizeof(libCgVersion) - 1)
{
log_error("Failed to read version from: %s\n", foundPath);
fclose(libCgF);
exit(EXIT_FAILURE);
}
fclose(libCgF);
if (strcmp(libCgVersion, "2.0.0.12") != 0) if (strcmp(libCgVersion, "2.0.0.12") != 0)
{ {
printf("ERROR: Wrong libCg.so, version 2.0.0.12 is needed.\n"); log_error("ERROR: Wrong libCg.so version '%s', version 2.0.0.12 is needed.\n", libCgVersion);
exit(1); exit(EXIT_FAILURE);
} }
char *resultPath = strdup(foundPath);
if (resultPath == NULL)
{
log_error("Error allocating memory for result path");
exit(EXIT_FAILURE);
}
return resultPath;
}
void loadLibCg()
{
void *handle;
char *libCgFilePath = findLibCg();
handle = dlopen(libCgFilePath, RTLD_NOW);
if (!handle)
{
log_error("Error: Unable to find library libCg.so\n");
log_error("Error: libCg.so version 2.0 is needed to compile the shaders in the game's folder.\n");
exit(EXIT_FAILURE);
}
free(libCgFilePath);
dlerror(); dlerror();
char *error; char *error;
+307 -357
View File
@@ -1,36 +1,31 @@
#ifndef TWOSPICY_H
#define TWOSPICY_H
#include "common.h" #include "common.h"
// File: average.frag // File: average.frag
const char toospicyFileName_0[] = "average.frag"; const char toospicyFileName_0[] = "average.frag";
const size_t toospicyPatchSize_0 = 271; const size_t toospicyPatchSize_0 = 271;
const unsigned char toospicyPatchBuffer_0[] = { const unsigned char toospicyPatchBuffer_0[] = {
0xe4, 0x97, 0xac, 0x3a, 0x18, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x01, 0x2b, 0xe4, 0x97, 0xac, 0x3a, 0x18, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x01, 0x2b, 0x76, 0x65,
0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x3b, 0x09, 0x63, 0x34, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x5f, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x3b, 0x09, 0x0d, 0x0a, 0x76, 0x61,
0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x02,
0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x02, 0x69, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x14, 0x66, 0x6c, 0x6f, 0x69, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x14, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x30,
0x61, 0x74, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x02, 0xac, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x02, 0xac, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f,
0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x3f, 0x01, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x2f, 0x02, 0x3f, 0x01, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x6c, 0x01, 0x00, 0x00, 0x2e, 0x00,
0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x6c, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x4f, 0x09, 0x09, 0x63, 0x00, 0x00, 0x01, 0x4f, 0x09, 0x09, 0x63, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72,
0x72, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x64, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x32,
0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x64, 0x78, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x38, 0x2e, 0x30, 0x38, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78,
0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x43, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x64, 0x79, 0x29, 0x02,
0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x64, 0x79, 0x29, 0x8d, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x2a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x69, 0x7a, 0x65, 0x50,
0x02, 0x8d, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x2a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x69, 0x6f, 0x77, 0x65, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72,
0x7a, 0x65, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x29, 0x02, 0xeb, 0x01, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00};
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x63, 0x29, 0x02, 0xeb, 0x01, 0x00,
0x00, 0x2d, 0x00, 0x00, 0x00};
// File: average.vert // File: average.vert
const char toospicyFileName_1[] = "average.vert"; const char toospicyFileName_1[] = "average.vert";
const size_t toospicyPatchSize_1 = 82; const size_t toospicyPatchSize_1 = 82;
const unsigned char toospicyPatchBuffer_1[] = { const unsigned char toospicyPatchBuffer_1[] = {
0x07, 0x35, 0xa3, 0xe1, 0xa8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x07, 0x35, 0xa3, 0xe1, 0xa8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x15, 0x61, 0x72,
0x01, 0x15, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x02, 0x1b,
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x02, 0x1b, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01,
0x2f, 0x2f, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x09, 0x74, 0x65, 0x78, 0x43, 0x09, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3d, 0x02, 0x6d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00};
0x6f, 0x6f, 0x72, 0x64, 0x3d, 0x02, 0x6d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00};
// File: DoF.frag // File: DoF.frag
const char toospicyFileName_2[] = "DoF.frag"; const char toospicyFileName_2[] = "DoF.frag";
@@ -46,146 +41,131 @@ const unsigned char toospicyPatchBuffer_2[] = {
const char toospicyFileName_3[] = "GaussH.frag"; const char toospicyFileName_3[] = "GaussH.frag";
const size_t toospicyPatchSize_3 = 241; const size_t toospicyPatchSize_3 = 241;
const unsigned char toospicyPatchBuffer_3[] = { const unsigned char toospicyPatchBuffer_3[] = {
0xae, 0x80, 0x41, 0x90, 0xa9, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x61, 0xae, 0x80, 0x41, 0x90, 0xa9, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x61, 0x66, 0x6c, 0x6f,
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f,
0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d, 0x0a, 0x75, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c,
0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x38, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66,
0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d,
0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x9c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x22, 0x76, 0x65, 0x63, 0x34, 0x20,
0x61, 0x74, 0x02, 0x9c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x22, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x63, 0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e,
0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0xd4, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0x71, 0x01,
0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0xd4, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x39, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f,
0x01, 0x2e, 0x02, 0x71, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x39, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67,
0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x63, 0x6f, 0x6c, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x7d};
0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f,
0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x7d};
// File: GaussH.vert // File: GaussH.vert
const char toospicyFileName_4[] = "GaussH.vert"; const char toospicyFileName_4[] = "GaussH.vert";
const size_t toospicyPatchSize_4 = 53; const size_t toospicyPatchSize_4 = 53;
const unsigned char toospicyPatchBuffer_4[] = { const unsigned char toospicyPatchBuffer_4[] = {0xc1, 0x77, 0x6f, 0x38, 0x53, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3a,
0xc1, 0x77, 0x6f, 0x38, 0x53, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x69, 0x29, 0x2b,
0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x69, 0x29, 0x2b, 0x30, 0x2e, 0x35, 0x29, 0x2a, 0x57, 0x49, 0x44, 0x30, 0x2e, 0x35, 0x29, 0x2a, 0x57, 0x49, 0x44, 0x54, 0x48, 0x2c, 0x30, 0x2e, 0x30,
0x54, 0x48, 0x2c, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d}; 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d};
// File: GaussH_Depth.frag // File: GaussH_Depth.frag
const char toospicyFileName_5[] = "GaussH_Depth.frag"; const char toospicyFileName_5[] = "GaussH_Depth.frag";
const size_t toospicyPatchSize_5 = 495; const size_t toospicyPatchSize_5 = 495;
const unsigned char toospicyPatchBuffer_5[] = { const unsigned char toospicyPatchBuffer_5[] = {
0x80, 0x58, 0x2b, 0x1c, 0x71, 0x04, 0x00, 0x00, 0x01, 0x52, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x80, 0x58, 0x2b, 0x1c, 0x71, 0x04, 0x00, 0x00, 0x01, 0x52, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66,
0x61, 0x6c, 0x66, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x09,
0x68, 0x61, 0x6c, 0x66, 0x32, 0x09, 0x76, 0x65, 0x63, 0x32, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x76, 0x65, 0x63, 0x32, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x09, 0x76, 0x65,
0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x09, 0x76, 0x65, 0x63, 0x33, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x63, 0x33, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x09, 0x76, 0x65, 0x63, 0x34,
0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x09, 0x76, 0x65, 0x63, 0x34, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0xba, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20,
0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0xba, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x47, 0x61, 0x6d, 0x65, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61,
0x44, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x52, 0x61, 0x79, 0x44, 0x65, 0x70, 0x74, 0x68,
0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x52, 0x61, 0x79, 0x44, 0x65, 0x70, 0x3b, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f,
0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x54, 0x72, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x38, 0x5d, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x57, 0x49, 0x44, 0x54, 0x48, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20,
0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61,
0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c,
0x48, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x61, 0x74, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x19, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e,
0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0x0e, 0x01, 0x00, 0x00,
0x6c, 0x6f, 0x61, 0x74, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x19, 0x20, 0x76, 0x65, 0x63, 0xa9, 0x00, 0x00, 0x00, 0x02, 0xb8, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xdf, 0x01, 0x00, 0x00,
0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x0b, 0x02, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0x32, 0x02, 0x00, 0x00,
0x30, 0x29, 0x02, 0x0e, 0x01, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x02, 0xb8, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x01, 0x06, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x02, 0x29, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01,
0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xdf, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x0b, 0x02, 0x00, 0x00, 0x03, 0x2e, 0x30, 0x29, 0x02, 0xf6, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x06, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x02,
0x27, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0x32, 0x02, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x01, 0x06, 0x0c, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x03, 0x2e, 0x30, 0x29, 0x02, 0x30, 0x03, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00,
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x02, 0x29, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x03, 0x2e, 0x30, 0x01, 0x01, 0x2e, 0x02, 0xeb, 0x03, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x18, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30,
0x29, 0x02, 0xf6, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x06, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x02, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0x47, 0x04, 0x00, 0x00, 0x25,
0x0c, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x03, 0x2e, 0x30, 0x29, 0x02, 0x30, 0x03, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x01, 0x06, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x00, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0xeb, 0x03, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x18, 0x76, 0x65,
0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30,
0x2e, 0x30, 0x29, 0x02, 0x47, 0x04, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x06, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d,
0x0a};
// File: GaussH_Depth.vert // File: GaussH_Depth.vert
const char toospicyFileName_6[] = "GaussH_Depth.vert"; const char toospicyFileName_6[] = "GaussH_Depth.vert";
const size_t toospicyPatchSize_6 = 53; const size_t toospicyPatchSize_6 = 53;
const unsigned char toospicyPatchBuffer_6[] = { const unsigned char toospicyPatchBuffer_6[] = {0xc1, 0x77, 0x6f, 0x38, 0x53, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3a,
0xc1, 0x77, 0x6f, 0x38, 0x53, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x69, 0x29, 0x2b,
0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x69, 0x29, 0x2b, 0x30, 0x2e, 0x35, 0x29, 0x2a, 0x57, 0x49, 0x44, 0x30, 0x2e, 0x35, 0x29, 0x2a, 0x57, 0x49, 0x44, 0x54, 0x48, 0x2c, 0x30, 0x2e, 0x30,
0x54, 0x48, 0x2c, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d}; 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d};
// File: GaussV.frag // File: GaussV.frag
const char toospicyFileName_7[] = "GaussV.frag"; const char toospicyFileName_7[] = "GaussV.frag";
const size_t toospicyPatchSize_7 = 281; const size_t toospicyPatchSize_7 = 281;
const unsigned char toospicyPatchBuffer_7[] = { const unsigned char toospicyPatchBuffer_7[] = {
0x47, 0x81, 0xa3, 0x96, 0xad, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x01, 0x6a, 0x47, 0x81, 0xa3, 0x96, 0xad, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x01, 0x6a, 0x66, 0x6c, 0x6f,
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x47, 0x61, 0x75, 0x73, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, 0x38, 0x61, 0x74, 0x20, 0x47, 0x61, 0x75, 0x73, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, 0x38, 0x5d, 0x3b, 0x0d, 0x0a, 0x75, 0x6e,
0x5d, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a,
0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d,
0x6f, 0x61, 0x74, 0x20, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x38, 0x3b,
0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x49, 0x44, 0x54, 0x48, 0x38, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x22, 0x00,
0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xa7, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x22, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30,
0x00, 0x01, 0x22, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0xd4, 0x00, 0x00, 0x00, 0x97,
0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x02, 0x00, 0x00, 0x00, 0x01, 0x64, 0x2e, 0x30, 0x2c, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x38, 0x29, 0x29, 0x2a, 0x47, 0x61, 0x75, 0x73,
0xd4, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x01, 0x64, 0x2e, 0x30, 0x2c, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, 0x37, 0x2d, 0x69, 0x5d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x38, 0x29, 0x29, 0x2a, 0x47, 0x61, 0x75, 0x73, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5b, 0x37, 0x2d, 0x69, 0x20, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67,
0x5d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x62, 0x3d, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67,
0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x63, 0x6f, 0x6c, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f,
0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
// File: GaussV.vert // File: GaussV.vert
const char toospicyFileName_8[] = "GaussV.vert"; const char toospicyFileName_8[] = "GaussV.vert";
const size_t toospicyPatchSize_8 = 40; const size_t toospicyPatchSize_8 = 40;
const unsigned char toospicyPatchBuffer_8[] = {0x73, 0x83, 0x54, 0x8f, 0x81, 0x01, 0x00, 0x00, 0x02, 0x00, const unsigned char toospicyPatchBuffer_8[] = {0x73, 0x83, 0x54, 0x8f, 0x81, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x65,
0x00, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x01, 0x0c, 0x2e, 0x01, 0x00, 0x00, 0x01, 0x0c, 0x2e, 0x30, 0x2c, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74,
0x30, 0x2c, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x69, 0x28, 0x69, 0x29, 0x02, 0x68, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00};
0x29, 0x02, 0x68, 0x01, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00};
// File: GetBrightArea.frag // File: GetBrightArea.frag
const char toospicyFileName_9[] = "GetBrightArea.frag"; const char toospicyFileName_9[] = "GetBrightArea.frag";
const size_t toospicyPatchSize_9 = 63; const size_t toospicyPatchSize_9 = 63;
const unsigned char toospicyPatchBuffer_9[] = { const unsigned char toospicyPatchBuffer_9[] = {
0x32, 0x1e, 0x86, 0xd8, 0x17, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x32, 0x1e, 0x86, 0xd8, 0x17, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f,
0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x46, 0x00, 0x00,
0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x1a, 0x02, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0x01, 0x02, 0x0d, 0x0a};
0x61, 0x74, 0x02, 0x1a, 0x02, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0x01, 0x02, 0x0d, 0x0a};
// File: GlareCompose.frag // File: GlareCompose.frag
const char toospicyFileName_10[] = "GlareCompose.frag"; const char toospicyFileName_10[] = "GlareCompose.frag";
const size_t toospicyPatchSize_10 = 482; const size_t toospicyPatchSize_10 = 482;
const unsigned char toospicyPatchBuffer_10[] = { const unsigned char toospicyPatchBuffer_10[] = {
0x3d, 0xef, 0xd1, 0x18, 0x06, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xef, 0xd1, 0x18, 0x06, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02,
0x2f, 0x2f, 0x02, 0x1a, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x6c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x1a, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x6c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x42, 0x61,
0x72, 0x32, 0x44, 0x20, 0x42, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x50, 0x69, 0x73, 0x65, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x50, 0x69, 0x63, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f,
0x63, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x50, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x61, 0x72,
0x6f, 0x77, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x35, 0x5d, 0x3b,
0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x35, 0x5d, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x29, 0x0d, 0x0a, 0x7b,
0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x02, 0x27, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x53, 0x01, 0x00, 0x00,
0x0a, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x02, 0x27, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x02, 0x53, 0x01, 0x58, 0x00, 0x00, 0x00, 0x03, 0x19, 0x01, 0x00, 0x00, 0x23, 0x69, 0x66, 0x20, 0x31, 0x20, 0x2f, 0x2f, 0x92, 0xc7, 0x89, 0xc1, 0x81,
0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x03, 0x19, 0x01, 0x00, 0x00, 0x23, 0x69, 0x66, 0x20, 0x31, 0x20, 0x2f, 0x2f, 0x40, 0x68, 0x61, 0x72, 0x61, 0x68, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x34, 0x09, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43,
0x92, 0xc7, 0x89, 0xc1, 0x81, 0x40, 0x68, 0x61, 0x72, 0x61, 0x68, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x34, 0x09, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x42, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x6e,
0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x50, 0x69, 0x63, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x30, 0x5d, 0x29,
0x65, 0x32, 0x44, 0x28, 0x42, 0x61, 0x73, 0x65, 0x54, 0x6f, 0x6e, 0x65, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x50, 0x69, 0x2a, 0x31, 0x2e, 0x37, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x34, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78,
0x63, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x30, 0x5d, 0x29, 0x2a, 0x31, 0x2e, 0x37, 0x35, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x63,
0x3b, 0x0d, 0x0a, 0x09, 0x76, 0x65, 0x63, 0x34, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x3b, 0x0d, 0x6f, 0x6c, 0x2e, 0x72, 0x2c, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x2e, 0x72, 0x29, 0x3b, 0x0d, 0x0a, 0x09,
0x0a, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x63, 0x6f, 0x6c, 0x2e, 0x67,
0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x2c, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x2e, 0x72, 0x29, 0x2c, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x2e, 0x67, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x6c, 0x65, 0x6e,
0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x62, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x63, 0x6f, 0x6c, 0x2e, 0x62, 0x2c, 0x42, 0x54, 0x47,
0x78, 0x28, 0x63, 0x6f, 0x6c, 0x2e, 0x67, 0x2c, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x2e, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x6c, 0x2e, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20,
0x67, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x62, 0x20, 0x3d, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x62, 0x6c,
0x6d, 0x61, 0x78, 0x28, 0x63, 0x6f, 0x6c, 0x2e, 0x62, 0x2c, 0x42, 0x54, 0x47, 0x6c, 0x61, 0x72, 0x65, 0x43, 0x6f, 0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x23,
0x6c, 0x2e, 0x62, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x69, 0x66, 0x20, 0x30, 0x02, 0xca, 0x01, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46,
0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x62, 0x6c, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x65, 0x6e, 0x64, 0x6d, 0x69, 0x78, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x3b,
0x0d, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x30, 0x02, 0xca, 0x01, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x20,
0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3d, 0x31, 0x2e,
0x30, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
// File: gradate.frag // File: gradate.frag
const char toospicyFileName_11[] = "gradate.frag"; const char toospicyFileName_11[] = "gradate.frag";
const size_t toospicyPatchSize_11 = 101; const size_t toospicyPatchSize_11 = 101;
const unsigned char toospicyPatchBuffer_11[] = { const unsigned char toospicyPatchBuffer_11[] = {
0xa4, 0x99, 0x62, 0x6c, 0x21, 0x02, 0x00, 0x00, 0x01, 0x52, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0xa4, 0x99, 0x62, 0x6c, 0x21, 0x02, 0x00, 0x00, 0x01, 0x52, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c,
0x20, 0x68, 0x61, 0x6c, 0x66, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x66, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66,
0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x32, 0x09, 0x76, 0x65, 0x63, 0x32, 0x0d, 0x0a, 0x23, 0x32, 0x09, 0x76, 0x65, 0x63, 0x32, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33,
0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x09, 0x76, 0x65, 0x63, 0x33, 0x09, 0x76, 0x65, 0x63, 0x33, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x09,
0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x09, 0x76, 0x76, 0x65, 0x63, 0x34, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00};
0x65, 0x63, 0x34, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00};
// File: intensitytest.frag // File: intensitytest.frag
const char toospicyFileName_12[] = "intensitytest.frag"; const char toospicyFileName_12[] = "intensitytest.frag";
@@ -199,286 +179,256 @@ const unsigned char toospicyPatchBuffer_12[] = {0x2c, 0xe4, 0xe3, 0x09, 0x56, 0x
const char toospicyFileName_13[] = "Laplacian.frag"; const char toospicyFileName_13[] = "Laplacian.frag";
const size_t toospicyPatchSize_13 = 152; const size_t toospicyPatchSize_13 = 152;
const unsigned char toospicyPatchBuffer_13[] = { const unsigned char toospicyPatchBuffer_13[] = {
0x27, 0xee, 0x97, 0x8c, 0x91, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x27, 0xee, 0x97, 0x8c, 0x91, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02,
0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01,
0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0x35, 0x02, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0x35, 0x02, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xba, 0x02, 0x00, 0x00, 0x41,
0x02, 0x2e, 0x30, 0x02, 0xba, 0x02, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x76, 0x65, 0x63, 0x33, 0x28, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x76, 0x65, 0x63, 0x33, 0x28, 0x6c, 0x61, 0x70, 0x29, 0x2c, 0x76, 0x65, 0x63, 0x33, 0x02, 0xff, 0x02,
0x6c, 0x61, 0x70, 0x29, 0x2c, 0x76, 0x65, 0x63, 0x33, 0x02, 0xff, 0x02, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30,
0x0e, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30, 0x02, 0x2f, 0x03, 0x00, 0x02, 0x2f, 0x03, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30, 0x2c,
0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30, 0x2c, 0x31, 0x2e, 0x30, 0x2c, 0x31, 0x31, 0x2e, 0x30, 0x02, 0x56, 0x03, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x06, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x2e, 0x30, 0x02, 0x56, 0x03, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x06, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
// File: Monochrome.frag // File: Monochrome.frag
const char toospicyFileName_14[] = "Monochrome.frag"; const char toospicyFileName_14[] = "Monochrome.frag";
const size_t toospicyPatchSize_14 = 330; const size_t toospicyPatchSize_14 = 330;
const unsigned char toospicyPatchBuffer_14[] = { const unsigned char toospicyPatchBuffer_14[] = {
0x60, 0xe0, 0xef, 0x32, 0x33, 0x03, 0x00, 0x00, 0x01, 0x66, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x09, 0x4d, 0x60, 0xe0, 0xef, 0x32, 0x33, 0x03, 0x00, 0x00, 0x01, 0x66, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x09, 0x4d, 0x4f, 0x44, 0x45,
0x4f, 0x44, 0x45, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x44, 0x45, 0x09, 0x30, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x44, 0x45, 0x09, 0x30, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64,
0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x4e, 0x4f, 0x43, 0x48, 0x52, 0x4f,
0x09, 0x4d, 0x4f, 0x4e, 0x4f, 0x43, 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x4d, 0x45, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x30, 0x29, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e,
0x3d, 0x3d, 0x30, 0x29, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x53, 0x45, 0x50, 0x49, 0x41, 0x65, 0x09, 0x53, 0x45, 0x50, 0x49, 0x41, 0x09, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x31, 0x29, 0x0d, 0x0a,
0x09, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x31, 0x29, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00,
0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x01, 0x3f, 0x68, 0x61, 0x6c, 0x66, 0x34,
0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x01, 0x3f, 0x68, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e,
0x66, 0x34, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x6e,
0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0d, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x76, 0x65, 0x63, 0x33, 0x28, 0x02, 0x91, 0x02, 0x00, 0x00, 0x29, 0x00, 0x00,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x76, 0x65, 0x00, 0x01, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x09, 0x53, 0x45, 0x50, 0x49, 0x41, 0x0d, 0x0a, 0x09, 0x6d, 0x6f, 0x6e,
0x63, 0x33, 0x28, 0x02, 0x91, 0x02, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x01, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x2a, 0x3d, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x30, 0x2e,
0x69, 0x66, 0x09, 0x53, 0x45, 0x50, 0x49, 0x41, 0x0d, 0x0a, 0x09, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x36, 0x2c, 0x30, 0x2e, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x09, 0x2f, 0x2a, 0x09, 0x53, 0x45, 0x50,
0x72, 0x67, 0x62, 0x2a, 0x3d, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x36, 0x2c, 0x49, 0x41, 0x09, 0x2a, 0x2f, 0x0d, 0x0a, 0x09, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x3b,
0x30, 0x2e, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x09, 0x2f, 0x2a, 0x09, 0x53, 0x45, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x02, 0xed, 0x02, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x01, 0x03, 0x7d, 0x0d, 0x0a};
0x50, 0x49, 0x41, 0x09, 0x2a, 0x2f, 0x0d, 0x0a, 0x09, 0x6d, 0x6f, 0x6e, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x3d,
0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x02, 0xed, 0x02, 0x00, 0x00, 0x29, 0x00,
0x00, 0x00, 0x01, 0x03, 0x7d, 0x0d, 0x0a};
// File: Monochrome.vert // File: Monochrome.vert
const char toospicyFileName_15[] = "Monochrome.vert"; const char toospicyFileName_15[] = "Monochrome.vert";
const size_t toospicyPatchSize_15 = 121; const size_t toospicyPatchSize_15 = 121;
const unsigned char toospicyPatchBuffer_15[] = { const unsigned char toospicyPatchBuffer_15[] = {
0x78, 0x26, 0x8a, 0x51, 0x79, 0x00, 0x00, 0x00, 0x01, 0x66, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x09, 0x78, 0x26, 0x8a, 0x51, 0x79, 0x00, 0x00, 0x00, 0x01, 0x66, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x09, 0x4d, 0x4f, 0x44,
0x4d, 0x4f, 0x44, 0x45, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x44, 0x45, 0x45, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x44, 0x45, 0x09, 0x30, 0x0d, 0x0a, 0x23, 0x65,
0x09, 0x30, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x4e, 0x4f, 0x43,
0x69, 0x6e, 0x65, 0x09, 0x4d, 0x4f, 0x4e, 0x4f, 0x43, 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x09, 0x09, 0x09, 0x28, 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x30, 0x29, 0x0d, 0x0a, 0x23, 0x64,
0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x30, 0x29, 0x0d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x53, 0x45, 0x50, 0x49, 0x41, 0x09, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d,
0x53, 0x45, 0x50, 0x49, 0x41, 0x09, 0x09, 0x09, 0x09, 0x28, 0x4d, 0x4f, 0x44, 0x45, 0x3d, 0x3d, 0x31, 0x29, 0x3d, 0x31, 0x29, 0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00};
0x0d, 0x0a, 0x0d, 0x0a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00};
// File: nnstdshader.vert // File: nnstdshader.vert
const char toospicyFileName_16[] = "nnstdshader.vert"; const char toospicyFileName_16[] = "nnstdshader.vert";
const size_t toospicyPatchSize_16 = 652; const size_t toospicyPatchSize_16 = 652;
const unsigned char toospicyPatchBuffer_16[] = { const unsigned char toospicyPatchBuffer_16[] = {
0x39, 0x15, 0xd4, 0xa8, 0x53, 0x16, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x01, 0x00, 0x02, 0xaa, 0x39, 0x15, 0xd4, 0xa8, 0x53, 0x16, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x01, 0x00, 0x02, 0xaa, 0x01, 0x01, 0x00,
0x01, 0x01, 0x00, 0x27, 0x00, 0x00, 0x00, 0x01, 0x04, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x27, 0x00, 0x00, 0x00, 0x01, 0x04, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x39, 0x3e,
0x00, 0x00, 0x00, 0x01, 0x39, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50,
0x6e, 0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x68, 0x74, 0x28, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01,
0x20, 0x09, 0x23, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x20, 0x3e, 0x20, 0x0f, 0x20, 0x3e, 0x20, 0x31, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16,
0x31, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x67,
0x00, 0x00, 0x01, 0x39, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x28, 0x31, 0x29, 0x3b,
0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00,
0x74, 0x28, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x20, 0x3e, 0x20, 0x32, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28,
0x09, 0x23, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x20, 0x3e, 0x20, 0x32, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x39, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67,
0x00, 0x01, 0x39, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x68, 0x74, 0x28, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23,
0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x20, 0x3e, 0x20, 0x33, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x28, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x6c, 0x3e, 0x20, 0x33, 0x29, 0x20,
0x23, 0x69, 0x66, 0x02, 0xf2, 0x0d, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x20, 0x3e, 0x20, 0x33, 0x0d, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x02, 0x4a, 0x36, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x28, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a,
0x01, 0x6c, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x09, 0x6e, 0x6e, 0x67, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x65, 0x6e, 0x64,
0x6c, 0x43, 0x61, 0x6c, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x65, 0x6c, 0x6c, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x28, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09,
0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x02, 0x3a, 0x37, 0x00, 0x00, 0x20, 0x00,
0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x6c, 0x75, 0x4e, 0x75, 0x6d, 0x50,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x02, 0xd2, 0x02, 0x01, 0x00, 0x18, 0x00,
0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x09, 0x02, 0x3a, 0x37, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x09, 0x02, 0x3a, 0x37, 0x00, 0x00, 0x1e, 0x00, 0x00,
0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x21, 0x20, 0x20, 0x20, 0x20, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x00, 0x01, 0x23, 0x20, 0x3e, 0x20, 0x31, 0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x6c, 0x75, 0x4e, 0x75, 0x6d,
0x6c, 0x75, 0x4e, 0x75, 0x6d, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x02, 0xd2, 0x02, 0x01, 0x00, 0x18,
0x29, 0x20, 0x02, 0xd2, 0x02, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x34, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x00, 0x00, 0x00, 0x01, 0x09, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x02, 0x54, 0xc9, 0x00, 0x00, 0x15, 0x00, 0x00,
0x7d, 0x0d, 0x0a, 0x09, 0x02, 0x3a, 0x37, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x23, 0x20, 0x3e, 0x20, 0x31, 0x00, 0x01, 0x03, 0x23, 0x69, 0x66, 0x02, 0xef, 0x38, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x36, 0x0d, 0x0a, 0x09, 0x69, 0x66,
0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x6c, 0x75, 0x4e, 0x75, 0x6d, 0x50, 0x6f, 0x69, 0x6e, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x6c, 0x75, 0x4e, 0x75, 0x6d, 0x53, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20,
0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x02, 0xd2, 0x02, 0x01, 0x00, 0x18, 0x00, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x6e, 0x6e, 0x67, 0x6c, 0x43, 0x61, 0x6c, 0x63, 0x53, 0x70, 0x6f, 0x74, 0x4c, 0x69,
0x00, 0x00, 0x01, 0x09, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x02, 0x54, 0xc9, 0x00, 0x00, 0x15, 0x67, 0x68, 0x74, 0x28, 0x36, 0x02, 0xb0, 0x03, 0x01, 0x00, 0xa3, 0x12, 0x00, 0x00};
0x00, 0x00, 0x00, 0x01, 0x03, 0x23, 0x69, 0x66, 0x02, 0xef, 0x38, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x36,
0x0d, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6e, 0x67, 0x6c, 0x75, 0x4e, 0x75, 0x6d, 0x53, 0x70, 0x6f, 0x74,
0x4c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x6e, 0x6e, 0x67,
0x6c, 0x43, 0x61, 0x6c, 0x63, 0x53, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x28, 0x36, 0x02, 0xb0, 0x03,
0x01, 0x00, 0xa3, 0x12, 0x00, 0x00};
// File: Posterization.frag // File: Posterization.frag
const char toospicyFileName_17[] = "Posterization.frag"; const char toospicyFileName_17[] = "Posterization.frag";
const size_t toospicyPatchSize_17 = 59; const size_t toospicyPatchSize_17 = 59;
const unsigned char toospicyPatchBuffer_17[] = {0xc1, 0xb7, 0x73, 0x37, 0xa9, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, const unsigned char toospicyPatchBuffer_17[] = {0xc1, 0xb7, 0x73, 0x37, 0xa9, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01,
0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x05,
0x01, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x1a, 0x02, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00};
0x61, 0x74, 0x02, 0x1a, 0x02, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00};
// File: Sepia.frag // File: Sepia.frag
const char toospicyFileName_18[] = "Sepia.frag"; const char toospicyFileName_18[] = "Sepia.frag";
const size_t toospicyPatchSize_18 = 320; const size_t toospicyPatchSize_18 = 320;
const unsigned char toospicyPatchBuffer_18[] = { const unsigned char toospicyPatchBuffer_18[] = {
0xe5, 0x2e, 0xad, 0xed, 0xa1, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0xe5, 0x2e, 0xad, 0xed, 0xa1, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02,
0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x22, 0x2f, 0x2f, 0x23, 0x65, 0x6e, 0x64, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x22, 0x2f, 0x2f, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a,
0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b,
0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x02, 0xf2, 0x01, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf2, 0x01, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x61, 0x74, 0x65, 0x3b,
0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x61, 0x74, 0x65, 0x3b, 0x02, 0x44, 0x02, 0x00, 0x00, 0x18, 0x00, 0x02, 0x44, 0x02, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0xdd, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x6f,
0x00, 0x00, 0x01, 0xdd, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x63, 0x72, 0x69, 0x67, 0x63, 0x6f, 0x6c, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x4f, 0x72, 0x69, 0x67, 0x50,
0x6f, 0x6c, 0x3d, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x4f, 0x72, 0x69, 0x67, 0x50, 0x69, 0x69, 0x63, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c,
0x63, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x66, 0x34, 0x20, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x70, 0x69,
0x61, 0x6c, 0x66, 0x34, 0x20, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x61, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x64, 0x6f, 0x74, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x63, 0x6f, 0x6c, 0x2e, 0x72,
0x20, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x64, 0x6f, 0x74, 0x28, 0x6f, 0x67, 0x62, 0x2c, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x39, 0x39, 0x2c, 0x30, 0x2e, 0x35, 0x38, 0x37, 0x2c, 0x30,
0x72, 0x69, 0x67, 0x63, 0x6f, 0x6c, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x30, 0x2e, 0x2e, 0x31, 0x34, 0x34, 0x29, 0x29, 0x2a, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x36, 0x2c, 0x30,
0x32, 0x39, 0x39, 0x2c, 0x30, 0x2e, 0x35, 0x38, 0x37, 0x2c, 0x30, 0x2e, 0x31, 0x34, 0x34, 0x29, 0x29, 0x2a, 0x68, 0x2e, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x3d, 0x31,
0x61, 0x6c, 0x66, 0x33, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x36, 0x2c, 0x30, 0x2e, 0x33, 0x29, 0x3b, 0x0d, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c, 0x2e, 0x61, 0x3d, 0x31, 0x2e, 0x30, 0x72, 0x3d, 0x6d, 0x69, 0x78, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x63, 0x6f, 0x6c, 0x2c, 0x73, 0x65, 0x70, 0x69, 0x61, 0x63, 0x6f, 0x6c,
0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x2c, 0x52, 0x61, 0x74, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x6f, 0x72, 0x3d, 0x6d, 0x69, 0x78, 0x28, 0x6f, 0x72, 0x69, 0x67, 0x63, 0x6f, 0x6c, 0x2c, 0x73, 0x65, 0x70, 0x69,
0x61, 0x63, 0x6f, 0x6c, 0x2c, 0x52, 0x61, 0x74, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
// File: Sepia.vert // File: Sepia.vert
const char toospicyFileName_19[] = "Sepia.vert"; const char toospicyFileName_19[] = "Sepia.vert";
const size_t toospicyPatchSize_19 = 68; const size_t toospicyPatchSize_19 = 68;
const unsigned char toospicyPatchBuffer_19[] = { const unsigned char toospicyPatchBuffer_19[] = {0xd1, 0x30, 0x7b, 0xf2, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x31, 0x76, 0x61, 0x72, 0x79,
0xd1, 0x30, 0x7b, 0xf2, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x31, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f,
0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0d, 0x0a, 0x6f, 0x72, 0x64, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d,
0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x29, 0x61, 0x69, 0x6e, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a,
0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x02, 0x52, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00}; 0x20, 0x20, 0x20, 0x02, 0x52, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00};
// File: Solarization.frag // File: Solarization.frag
const char toospicyFileName_20[] = "Solarization.frag"; const char toospicyFileName_20[] = "Solarization.frag";
const size_t toospicyPatchSize_20 = 98; const size_t toospicyPatchSize_20 = 98;
const unsigned char toospicyPatchBuffer_20[] = { const unsigned char toospicyPatchBuffer_20[] = {
0x90, 0xdb, 0xc4, 0x2d, 0x22, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x90, 0xdb, 0xc4, 0x2d, 0x22, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f,
0x01, 0x02, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xd0, 0x01, 0x00, 0x00, 0x46,
0x02, 0xd0, 0x01, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x1a, 0x02, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x01,
0x1a, 0x02, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xa5, 0x02, 0x00, 0x00, 0x02, 0x2e, 0x30, 0x02, 0xa5, 0x02, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xd1, 0x02, 0x00,
0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xd1, 0x02, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xfd, 0x02, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00};
0x01, 0x02, 0x2e, 0x30, 0x02, 0xfd, 0x02, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00};
// File: Test0.frag // File: Test0.frag
const char toospicyFileName_21[] = "Test0.frag"; const char toospicyFileName_21[] = "Test0.frag";
const size_t toospicyPatchSize_21 = 907; const size_t toospicyPatchSize_21 = 907;
const unsigned char toospicyPatchBuffer_21[] = { const unsigned char toospicyPatchBuffer_21[] = {
0x82, 0x87, 0xe9, 0xd6, 0x17, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x01, 0x77, 0x82, 0x87, 0xe9, 0xd6, 0x17, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x01, 0x77, 0x66, 0x6c, 0x6f,
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x52, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x52, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f,
0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x47, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x47, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f,
0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x42, 0x3b, 0x0d, 0x61, 0x74, 0x20, 0x45, 0x64, 0x67, 0x65, 0x42, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f,
0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x74, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d,
0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d,
0x61, 0x74, 0x20, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xd3, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x5e, 0x66, 0x6c, 0x6f, 0x61, 0x74,
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xd3, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x5e, 0x66, 0x6c, 0x6f, 0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d,
0x61, 0x74, 0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x29,
0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x3d, 0x66,
0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2a, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x29, 0x2f, 0x32, 0x35, 0x36, 0x2e,
0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x3d, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x44, 0x65, 0x70, 0x30, 0x02, 0x6d, 0x01, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x53, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46,
0x74, 0x68, 0x2a, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x29, 0x2f, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x02, 0x6d, 0x01, 0x00, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x67, 0x3d, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x44, 0x65, 0x70, 0x74, 0x68,
0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x53, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x2a, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x29, 0x2f, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68,
0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x67, 0x3d, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x44, 0x65, 0x70, 0x74, 0x2d, 0x3d, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x67, 0x3b, 0x44, 0x65, 0x70, 0x74, 0x68,
0x68, 0x2a, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x29, 0x2f, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x2a, 0x3d, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x02, 0xdf, 0x01, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x01, 0x31, 0x3b, 0x0d, 0x0a, 0x23,
0x65, 0x70, 0x74, 0x68, 0x2d, 0x3d, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x43, 0x44, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0d, 0x0a,
0x67, 0x3b, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2a, 0x3d, 0x32, 0x35, 0x36, 0x2e, 0x30, 0x02, 0xdf, 0x01, 0x00, 0x00, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x76, 0x65,
0x2f, 0x00, 0x00, 0x00, 0x01, 0x31, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x09, 0x66, 0x6c, 0x63, 0x02, 0x3f, 0x02, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x4e, 0x01, 0x00, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65,
0x6f, 0x61, 0x74, 0x20, 0x43, 0x44, 0x65, 0x70, 0x74, 0x68, 0x3b, 0x0d, 0x0a, 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x29,
0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x34, 0x5d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x02, 0x3f, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75,
0x02, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x4e, 0x01, 0x00, 0x00, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65,
0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2d, 0x32, 0x2e, 0x30, 0x2f, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78,
0x72, 0x64, 0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x31,
0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74,
0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2d, 0x32, 0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2b, 0x32, 0x2e, 0x30, 0x2f,
0x2e, 0x30, 0x2f, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0d,
0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44,
0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f,
0x2c, 0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2b, 0x32, 0x2e, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x2d, 0x32, 0x2e, 0x30, 0x2f, 0x48, 0x65,
0x30, 0x2f, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x69, 0x67, 0x68, 0x74, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x33, 0x5d, 0x20, 0x3d,
0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x76,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72,
0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x74, 0x65, 0x78, 0x64, 0x2e, 0x79, 0x2b, 0x32, 0x2e, 0x30, 0x2f, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x02, 0xd3, 0x03,
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x2d, 0x32, 0x2e, 0x30, 0x2f, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0xf2, 0x03, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x6e, 0x20, 0x28,
0x29, 0x2e, 0x72, 0x3b, 0x0d, 0x0a, 0x09, 0x44, 0x65, 0x70, 0x74, 0x68, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x64, 0x67, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x47, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x70, 0x74, 0x68, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67,
0x76, 0x65, 0x63, 0x32, 0x28, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x74, 0x65, 0x78, 0x62, 0x3d, 0x76, 0x65, 0x63, 0x33, 0x28, 0x45, 0x64, 0x67, 0x65, 0x52, 0x2c, 0x45, 0x64, 0x67, 0x65, 0x47, 0x2c, 0x45, 0x64, 0x67,
0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x2b, 0x32, 0x2e, 0x30, 0x2f, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x65, 0x42, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x29, 0x2e, 0x72, 0x3b, 0x02, 0xd3, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0xf2, 0x03, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x02, 0x9d,
0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x6e, 0x20, 0x28, 0x65, 0x64, 0x67, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x04, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x12, 0x3b, 0x0d, 0x0a, 0x09, 0x7d, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66,
0x29, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x3d, 0x76,
0x65, 0x63, 0x33, 0x28, 0x45, 0x64, 0x67, 0x65, 0x52, 0x2c, 0x45, 0x64, 0x67, 0x65, 0x47, 0x2c, 0x45, 0x64, 0x67,
0x65, 0x42, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x20, 0x3d,
0x20, 0x31, 0x2e, 0x30, 0x02, 0x9d, 0x04, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x01, 0x12, 0x3b, 0x0d, 0x0a, 0x09,
0x7d, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
// File: Test1.frag // File: Test1.frag
const char toospicyFileName_22[] = "Test1.frag"; const char toospicyFileName_22[] = "Test1.frag";
const size_t toospicyPatchSize_22 = 544; const size_t toospicyPatchSize_22 = 544;
const unsigned char toospicyPatchBuffer_22[] = { const unsigned char toospicyPatchBuffer_22[] = {
0xde, 0x48, 0xcd, 0x78, 0x13, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x01, 0x02, 0xde, 0x48, 0xcd, 0x78, 0x13, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02,
0x2f, 0x2f, 0x02, 0x5a, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x5a, 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0x8e, 0x01, 0x00, 0x00, 0x41, 0x00,
0x8e, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xcf, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02, 0xcf, 0x01, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x01, 0x90, 0x66, 0x6c, 0x6f, 0x61, 0x74,
0x00, 0x00, 0x01, 0x90, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x58, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x20, 0x58, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x59, 0x3b, 0x0d,
0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x59, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69,
0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69,
0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x32, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72,
0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x52, 0x32, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6c, 0x61, 0x74, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d,
0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6c, 0x61, 0x74, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x32, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72,
0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x32, 0x3b, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xd9, 0x02, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0xa6, 0x04,
0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x02, 0xd9, 0x02, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x01, 0x4b, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3d,
0x00, 0xce, 0x01, 0x00, 0x00, 0x01, 0x01, 0x2e, 0x02, 0xa6, 0x04, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x01, 0x4b, 0x30, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x28, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30,
0x68, 0x61, 0x6c, 0x66, 0x20, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x3d, 0x30, 0x2e, 0x30, 0x3b, 0x0d, 0x29, 0x7b, 0x0d, 0x0a, 0x09, 0x09, 0x20, 0x20, 0x6e, 0x2e, 0x78, 0x20, 0x2a, 0x3d, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a,
0x0a, 0x09, 0x09, 0x69, 0x66, 0x28, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x7b, 0x09, 0x09, 0x09, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x02, 0x33, 0x05, 0x00, 0x00,
0x0d, 0x0a, 0x09, 0x09, 0x20, 0x20, 0x6e, 0x2e, 0x78, 0x20, 0x2a, 0x3d, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x39, 0x00, 0x00, 0x00, 0x01, 0x23, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x79, 0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30,
0x0a, 0x09, 0x09, 0x09, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x02, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x79, 0x65, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x02, 0x89, 0x05,
0x33, 0x05, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x01, 0x23, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x79, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6e, 0x65, 0x77, 0x02, 0xb0, 0x05, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x25,
0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x65, 0x79, 0x65, 0x2e, 0x7a, 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64,
0x20, 0x3d, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x02, 0x89, 0x05, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0x48, 0x06, 0x00, 0x00, 0x26, 0x00,
0x65, 0x77, 0x02, 0xb0, 0x05, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x01, 0x25, 0x09, 0x76, 0x65, 0x63, 0x32, 0x20, 0x00, 0x00, 0x01, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0x6f, 0x06, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00,
0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0d, 0x0a, 0x01, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0xb7, 0x06, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x01, 0x2d,
0x20, 0x20, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0x48, 0x06, 0x00, 0x00, 0x26, 0x00, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x32,
0x00, 0x00, 0x01, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0x6f, 0x06, 0x00, 0x00, 0x47, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64,
0x00, 0x00, 0x00, 0x01, 0x09, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x02, 0xb7, 0x06, 0x00, 0x00, 0x32, 0x02, 0x7f, 0x07, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x11, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65,
0xbf, 0x00, 0x00, 0x00, 0x01, 0x2d, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x02, 0xa5, 0x07, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00};
0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x3b, 0x0d, 0x0a, 0x09, 0x09, 0x09, 0x6d, 0x6f, 0x64, 0x69,
0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x32, 0x02, 0x7f, 0x07, 0x00, 0x00, 0x1e,
0x00, 0x00, 0x00, 0x01, 0x11, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f,
0x72, 0x64, 0x32, 0x02, 0xa5, 0x07, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00};
// File: YUVCompose.frag // File: YUVCompose.frag
const char toospicyFileName_23[] = "YUVCompose.frag"; const char toospicyFileName_23[] = "YUVCompose.frag";
const size_t toospicyPatchSize_23 = 507; const size_t toospicyPatchSize_23 = 507;
const unsigned char toospicyPatchBuffer_23[] = { const unsigned char toospicyPatchBuffer_23[] = {
0xee, 0x1d, 0x3d, 0x9c, 0x54, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0xee, 0x1d, 0x3d, 0x9c, 0x54, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x01, 0x02, 0x2f, 0x2f, 0x02,
0x2f, 0x2f, 0x02, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2f, 0x2f, 0x23, 0x65, 0x6e, 0x64, 0x5c, 0x01, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x49, 0x2f, 0x2f, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a,
0x69, 0x66, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b,
0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x59, 0x54,
0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x59, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3b, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x02, 0x07, 0x02, 0x00, 0x00,
0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x02, 0x07, 0x02, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x25, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32,
0x01, 0x25, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x44, 0x20, 0x43, 0x62, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x09, 0x30, 0x02,
0x20, 0x43, 0x62, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x69, 0x66, 0x09, 0x33, 0x02, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xba, 0x02, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x01,
0x30, 0x02, 0x33, 0x02, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0x30, 0x02, 0xba, 0x02, 0x00, 0x00, 0x7a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x20, 0x59, 0x43, 0x62,
0x70, 0x00, 0x00, 0x00, 0x01, 0x7a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x72, 0x32, 0x52, 0x47, 0x42, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x0d, 0x0a, 0x28,
0x6d, 0x61, 0x74, 0x33, 0x20, 0x59, 0x43, 0x62, 0x43, 0x72, 0x32, 0x52, 0x47, 0x42, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x20, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x20, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x0d, 0x0a,
0x78, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x33, 0x0d, 0x0a, 0x28, 0x20, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x2d, 0x30, 0x2e, 0x33, 0x39, 0x32, 0x2c, 0x32, 0x2e, 0x30, 0x31, 0x37, 0x2c, 0x0d,
0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x31, 0x2e, 0x31, 0x36, 0x34, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x31, 0x2e, 0x35, 0x39, 0x36, 0x2c, 0x2d, 0x30, 0x2e, 0x38, 0x31, 0x33, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x30, 0x0d,
0x2e, 0x30, 0x2c, 0x2d, 0x30, 0x2e, 0x33, 0x39, 0x32, 0x2c, 0x32, 0x2e, 0x30, 0x31, 0x37, 0x2c, 0x0d, 0x0a, 0x20, 0x0a, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x02, 0x28, 0x03, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00,
0x20, 0x31, 0x2e, 0x35, 0x39, 0x36, 0x2c, 0x2d, 0x30, 0x2e, 0x38, 0x31, 0x33, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x30, 0x01, 0x2e, 0x23, 0x69, 0x66, 0x09, 0x30, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x59, 0x43, 0x62, 0x43, 0x72, 0x41, 0x2d, 0x3d, 0x68, 0x61,
0x0d, 0x0a, 0x29, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x02, 0x28, 0x03, 0x00, 0x00, 0x6c, 0x66, 0x34, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x30, 0x2e, 0x35,
0xde, 0x00, 0x00, 0x00, 0x01, 0x2e, 0x23, 0x69, 0x66, 0x09, 0x30, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x59, 0x43, 0x62, 0x2c, 0x30, 0x29, 0x3b, 0x02, 0x2d, 0x04, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x8c, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a,
0x43, 0x72, 0x41, 0x2d, 0x3d, 0x68, 0x61, 0x6c, 0x66, 0x34, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x20, 0x20, 0x20, 0x59, 0x43, 0x62, 0x43, 0x72, 0x41, 0x2e, 0x72, 0x67, 0x62, 0x2d, 0x3d, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x31,
0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x30, 0x29, 0x3b, 0x02, 0x2d, 0x04, 0x00, 0x00, 0x36, 0x2e, 0x30, 0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
0x26, 0x00, 0x00, 0x00, 0x01, 0x8c, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x59, 0x43, 0x62, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x59,
0x43, 0x72, 0x41, 0x2e, 0x72, 0x67, 0x62, 0x2d, 0x3d, 0x68, 0x61, 0x6c, 0x66, 0x33, 0x28, 0x31, 0x36, 0x2e, 0x30, 0x43, 0x62, 0x43, 0x72, 0x32, 0x52, 0x47, 0x42, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x59, 0x43, 0x62, 0x43, 0x72,
0x2f, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x2c, 0x30, 0x2e, 0x35, 0x2c, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x41, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f,
0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x72, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x7d, 0x0d,
0x3d, 0x20, 0x59, 0x43, 0x62, 0x43, 0x72, 0x32, 0x52, 0x47, 0x42, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x0a};
0x20, 0x59, 0x43, 0x62, 0x43, 0x72, 0x41, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x67, 0x6c,
0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b,
0x0d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a};
ShaderFilesToPatch tooSpicyShaderPatches[] = { ShaderFilesToPatch tooSpicyShaderPatches[] = {{toospicyFileName_0, toospicyPatchSize_0, toospicyPatchBuffer_0, 0, ""},
{toospicyFileName_0, toospicyPatchSize_0, toospicyPatchBuffer_0, 0, ""}, {toospicyFileName_1, toospicyPatchSize_1, toospicyPatchBuffer_1, 0, ""},
{toospicyFileName_1, toospicyPatchSize_1, toospicyPatchBuffer_1, 0, ""}, {toospicyFileName_2, toospicyPatchSize_2, toospicyPatchBuffer_2, 0, ""},
{toospicyFileName_2, toospicyPatchSize_2, toospicyPatchBuffer_2, 0, ""}, {toospicyFileName_3, toospicyPatchSize_3, toospicyPatchBuffer_3, 0, ""},
{toospicyFileName_3, toospicyPatchSize_3, toospicyPatchBuffer_3, 0, ""}, {toospicyFileName_4, toospicyPatchSize_4, toospicyPatchBuffer_4, 0, ""},
{toospicyFileName_4, toospicyPatchSize_4, toospicyPatchBuffer_4, 0, ""}, {toospicyFileName_5, toospicyPatchSize_5, toospicyPatchBuffer_5, 0, ""},
{toospicyFileName_5, toospicyPatchSize_5, toospicyPatchBuffer_5, 0, ""}, {toospicyFileName_6, toospicyPatchSize_6, toospicyPatchBuffer_6, 0, ""},
{toospicyFileName_6, toospicyPatchSize_6, toospicyPatchBuffer_6, 0, ""}, {toospicyFileName_7, toospicyPatchSize_7, toospicyPatchBuffer_7, 0, ""},
{toospicyFileName_7, toospicyPatchSize_7, toospicyPatchBuffer_7, 0, ""}, {toospicyFileName_8, toospicyPatchSize_8, toospicyPatchBuffer_8, 0, ""},
{toospicyFileName_8, toospicyPatchSize_8, toospicyPatchBuffer_8, 0, ""}, {toospicyFileName_9, toospicyPatchSize_9, toospicyPatchBuffer_9, 0, ""},
{toospicyFileName_9, toospicyPatchSize_9, toospicyPatchBuffer_9, 0, ""}, {toospicyFileName_10, toospicyPatchSize_10, toospicyPatchBuffer_10, 0, ""},
{toospicyFileName_10, toospicyPatchSize_10, toospicyPatchBuffer_10, 0, ""}, {toospicyFileName_11, toospicyPatchSize_11, toospicyPatchBuffer_11, 0, ""},
{toospicyFileName_11, toospicyPatchSize_11, toospicyPatchBuffer_11, 0, ""}, {toospicyFileName_12, toospicyPatchSize_12, toospicyPatchBuffer_12, 0, ""},
{toospicyFileName_12, toospicyPatchSize_12, toospicyPatchBuffer_12, 0, ""}, {toospicyFileName_13, toospicyPatchSize_13, toospicyPatchBuffer_13, 0, ""},
{toospicyFileName_13, toospicyPatchSize_13, toospicyPatchBuffer_13, 0, ""}, {toospicyFileName_14, toospicyPatchSize_14, toospicyPatchBuffer_14, 0, ""},
{toospicyFileName_14, toospicyPatchSize_14, toospicyPatchBuffer_14, 0, ""}, {toospicyFileName_15, toospicyPatchSize_15, toospicyPatchBuffer_15, 0, ""},
{toospicyFileName_15, toospicyPatchSize_15, toospicyPatchBuffer_15, 0, ""}, {toospicyFileName_16, toospicyPatchSize_16, toospicyPatchBuffer_16, 0, ""},
{toospicyFileName_16, toospicyPatchSize_16, toospicyPatchBuffer_16, 0, ""}, {toospicyFileName_17, toospicyPatchSize_17, toospicyPatchBuffer_17, 0, ""},
{toospicyFileName_17, toospicyPatchSize_17, toospicyPatchBuffer_17, 0, ""}, {toospicyFileName_18, toospicyPatchSize_18, toospicyPatchBuffer_18, 0, ""},
{toospicyFileName_18, toospicyPatchSize_18, toospicyPatchBuffer_18, 0, ""}, {toospicyFileName_19, toospicyPatchSize_19, toospicyPatchBuffer_19, 0, ""},
{toospicyFileName_19, toospicyPatchSize_19, toospicyPatchBuffer_19, 0, ""}, {toospicyFileName_20, toospicyPatchSize_20, toospicyPatchBuffer_20, 0, ""},
{toospicyFileName_20, toospicyPatchSize_20, toospicyPatchBuffer_20, 0, ""}, {toospicyFileName_21, toospicyPatchSize_21, toospicyPatchBuffer_21, 0, ""},
{toospicyFileName_21, toospicyPatchSize_21, toospicyPatchBuffer_21, 0, ""}, {toospicyFileName_22, toospicyPatchSize_22, toospicyPatchBuffer_22, 0, ""},
{toospicyFileName_22, toospicyPatchSize_22, toospicyPatchBuffer_22, 0, ""}, {toospicyFileName_23, toospicyPatchSize_23, toospicyPatchBuffer_23, 0, ""}};
{toospicyFileName_23, toospicyPatchSize_23, toospicyPatchBuffer_23, 0, ""}};
int tooSpicyShaderPatchesCount = sizeof(tooSpicyShaderPatches) / sizeof(ShaderFilesToPatch); int tooSpicyShaderPatchesCount = sizeof(tooSpicyShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
-4
View File
@@ -1,5 +1,3 @@
#ifndef ABC_H
#define ABC_H
#include "common.h" #include "common.h"
// Fragment ABC // Fragment ABC
@@ -63,5 +61,3 @@ SearchReplace abcVsMesa[] = {{"OPTION NV_vertex_program3;", "#OPTION NV_vertex_p
{"skinning_end:", " "}}; {"skinning_end:", " "}};
int abcVsMesaCount = sizeof(abcVsMesa) / sizeof(SearchReplace); int abcVsMesaCount = sizeof(abcVsMesa) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef GSEVO_H
#define GSEVO_H
#include "common.h" #include "common.h"
ElfShaderOffsets gsevoElfShaderOffsets[] = { ElfShaderOffsets gsevoElfShaderOffsets[] = {
@@ -1194,5 +1191,3 @@ ShaderFilesToPatch gsevoNvidiaShaderPatches[] = {
}; };
int gsevoShaderPatchesCount = 4; int gsevoShaderPatchesCount = 4;
#endif
-4
View File
@@ -1,5 +1,3 @@
#ifndef HARLEY_H
#define HARLEY_H
#include "common.h" #include "common.h"
// File: 16box.frag // File: 16box.frag
@@ -1191,5 +1189,3 @@ ShaderFilesToPatch harleyShaderPatches[] = {
}; };
int harleyShaderPatchesCount = sizeof(harleyShaderPatches) / sizeof(ShaderFilesToPatch); int harleyShaderPatchesCount = sizeof(harleyShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
+1 -5
View File
@@ -1,6 +1,4 @@
#ifndef HOD4_H #pragma once
#define HOD4_H
#include "common.h" #include "common.h"
// File: DoF.dat1 // File: DoF.dat1
@@ -324,5 +322,3 @@ ShaderFilesToPatch hod4ShaderPatches[] = {
}; };
int hod4ShaderPatchesCount = sizeof(hod4ShaderPatches) / sizeof(ShaderFilesToPatch); int hod4ShaderPatchesCount = sizeof(hod4ShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef HOD4SP_H
#define HOD4SP_H
#include "common.h" #include "common.h"
#include "hod4.h" #include "hod4.h"
@@ -163,5 +160,3 @@ ShaderFilesToPatch hod4spShaderPatches[] = {
}; };
int hod4spShaderPatchesCount = sizeof(hod4spShaderPatches) / sizeof(ShaderFilesToPatch); int hod4spShaderPatchesCount = sizeof(hod4spShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef HODEX_H
#define HODEX_H
#include "common.h" #include "common.h"
// File: average.frag // File: average.frag
@@ -286,5 +283,3 @@ ShaderFilesToPatch hodexShaderPatches[] = {
}; };
int hodexShaderPatchesCount = sizeof(hodexShaderPatches) / sizeof(ShaderFilesToPatch); int hodexShaderPatchesCount = sizeof(hodexShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
+1 -5
View File
@@ -1,6 +1,3 @@
#ifndef HUMMER_H
#define HUMMER_H
#include "common.h" #include "common.h"
int hummerExtremeShaderFileIndex; int hummerExtremeShaderFileIndex;
@@ -43,5 +40,4 @@ SearchReplace hummerShaderReplaceFlicker[] = {
{"#pragma optionNV(fastmath on)", "#pragma optionNV(fastmath off)"}, {"#pragma optionNV(fastmath on)", "#pragma optionNV(fastmath off)"},
{"#pragma optionNV(fastprecision on)", "#pragma optionNV(fastprecision off)"}}; {"#pragma optionNV(fastprecision on)", "#pragma optionNV(fastprecision off)"}};
int hummerShaderReplaceFlickerCount = sizeof(hummerShaderReplaceFlicker) / sizeof(SearchReplace); int hummerShaderReplaceFlickerCount = sizeof(hummerShaderReplaceFlicker) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef ID_H
#define ID_H
#include "common.h" #include "common.h"
ShaderFilesToMod idShaderFilesToMod[] = {{"/shader/Cg/inc/es_shd_base.cg", 0, ""}, ShaderFilesToMod idShaderFilesToMod[] = {{"/shader/Cg/inc/es_shd_base.cg", 0, ""},
@@ -63,5 +60,3 @@ SearchReplace id5ShaderReplaceSetForSmoke[] = {
"0.5h);\nh4OutputColor.a = 0.2h;\n#else\nh4OutputColor.a = h4Color_ColorMap.a;\n#endif"}}; "0.5h);\nh4OutputColor.a = 0.2h;\n#else\nh4OutputColor.a = h4Color_ColorMap.a;\n#endif"}};
int id5ShaderReplaceSetForSmokeCount = sizeof(id5ShaderReplaceSetForSmoke) / sizeof(SearchReplace); int id5ShaderReplaceSetForSmokeCount = sizeof(id5ShaderReplaceSetForSmoke) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef LGJ_H
#define LGJ_H
#include "common.h" #include "common.h"
ShaderFilesToMod lgjShaderFilesToMod[] = {{"/shader/Cg/inc/es_shd_base.cg", 0, ""}, ShaderFilesToMod lgjShaderFilesToMod[] = {{"/shader/Cg/inc/es_shd_base.cg", 0, ""},
@@ -26,5 +23,3 @@ SearchReplace lgjCompiledShadersPatch[] = {
{"TEX R0.x, R0, texture[0], SHADOW2D;", "TEX R0.x, R0, texture[0], 2D;"}}; {"TEX R0.x, R0, texture[0], SHADOW2D;", "TEX R0.x, R0, texture[0], 2D;"}};
int lgjCompiledShadersPatchCount = sizeof(lgjCompiledShadersPatch) / sizeof(SearchReplace); int lgjCompiledShadersPatchCount = sizeof(lgjCompiledShadersPatch) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef MJ4_H
#define MJ$_H
#include "common.h" #include "common.h"
// Fragment // Fragment
@@ -315,5 +312,3 @@ SearchReplace mj4VsMesa[] = {{"OPTION NV_vertex_program3;", "#OPTION NV_vertex_p
{"SEQC", "#SEQC "}}; {"SEQC", "#SEQC "}};
int mj4VsMesaCount = sizeof(mj4VsMesa) / sizeof(SearchReplace); int mj4VsMesaCount = sizeof(mj4VsMesa) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef OR2_H
#define OR2_H
#include "common.h" #include "common.h"
SearchReplace orFsMesa[] = { SearchReplace orFsMesa[] = {
@@ -123,5 +120,3 @@ SearchReplace orVsAti[] = {{"!!VP2.0\nBB1:\n",
{"v10", "vertex.attrib[10]"}}; {"v10", "vertex.attrib[10]"}};
int orVsAtiCount = sizeof(orVsAti) / sizeof(SearchReplace); int orVsAtiCount = sizeof(orVsAti) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef PRIMEVAL_H
#define PRIMEVAL_H
#include "common.h" #include "common.h"
// File: nnstdshader.frag // File: nnstdshader.frag
@@ -90,5 +87,3 @@ ShaderFilesToPatch phShaderPatches[] = {
}; };
int phShaderPatchesCount = sizeof(phShaderPatches) / sizeof(ShaderFilesToPatch); int phShaderPatchesCount = sizeof(phShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef RAMBO_H
#define RAMBO_H
#include "common.h" #include "common.h"
// File: 16box.frag // File: 16box.frag
@@ -1661,5 +1658,3 @@ ShaderFilesToPatch ramboNvidiaShaderPatches[] = {
}; };
int ramboNvidiaShaderPatchesCount = sizeof(ramboNvidiaShaderPatches) / sizeof(ShaderFilesToPatch); int ramboNvidiaShaderPatchesCount = sizeof(ramboNvidiaShaderPatches) / sizeof(ShaderFilesToPatch);
#endif
-4
View File
@@ -1,5 +1,3 @@
#ifndef RTUNED_H
#define RTUNED_H
#include "common.h" #include "common.h"
// Fragment // Fragment
@@ -155,5 +153,3 @@ SearchReplace rtunedVsMesa[] = {
{"DP3_SAT diff.w, normal_w, tmp;", "DP3 diff.w, normal_w, tmp;MAX diff.w, diff.w, 0.0;MIN diff.w, diff.w, 1.0;"}}; {"DP3_SAT diff.w, normal_w, tmp;", "DP3 diff.w, normal_w, tmp;MAX diff.w, diff.w, 0.0;MIN diff.w, diff.w, 1.0;"}};
int rtunedVsMesaCount = sizeof(rtunedVsMesa) / sizeof(SearchReplace); int rtunedVsMesaCount = sizeof(rtunedVsMesa) / sizeof(SearchReplace);
#endif
-20
View File
@@ -1,20 +0,0 @@
#pragma once
#include "2spicy.h"
#include "abc.h"
#include "gsevo.h"
#include "harley.h"
#include "hod4.h"
#include "hod4sp.h"
#include "hodex.h"
#include "hummer.h"
#include "id.h"
#include "lgj.h"
#include "mj4.h"
#include "or2.h"
#include "primeval.h"
#include "rambo.h"
#include "rtuned.h"
#include "srtv.h"
#include "vf5.h"
#include "vt3.h"
-5
View File
@@ -1,6 +1,3 @@
#ifndef SRTV_H
#define SRTV_H
#include "common.h" #include "common.h"
ElfShaderOffsets srtvElfShaderOffsets[] = { ElfShaderOffsets srtvElfShaderOffsets[] = {
@@ -168,5 +165,3 @@ dec_retio_list_1[4] = nngluUserUniform[KL_USER_UNIFORM_INDEX_DIRT1].z;\r\n\t\t\t
dec_retio_list_1[5] = nngluUserUniform[KL_USER_UNIFORM_INDEX_DIRT1].w;\r\n"}}; dec_retio_list_1[5] = nngluUserUniform[KL_USER_UNIFORM_INDEX_DIRT1].w;\r\n"}};
int srtvVsMesaCount = sizeof(srtvVsMesa) / sizeof(SearchReplace); int srtvVsMesaCount = sizeof(srtvVsMesa) / sizeof(SearchReplace);
#endif
-5
View File
@@ -1,7 +1,4 @@
#ifndef VF5_H
#define VF5_H
#include "common.h" #include "common.h"
#include <stdbool.h>
// Fragment // Fragment
SearchReplace vf5FsMesa[] = { SearchReplace vf5FsMesa[] = {
@@ -400,5 +397,3 @@ Vf5StagesList vf5StageList[] = {{"are", "Arena", true},
{"yuk", "Snow Mountain", false}}; {"yuk", "Snow Mountain", false}};
int vf5StageListCount = sizeof(vf5StageList) / sizeof(Vf5StagesList); int vf5StageListCount = sizeof(vf5StageList) / sizeof(Vf5StagesList);
#endif
-5
View File
@@ -1,6 +1,3 @@
#ifndef VT3_H
#define VT3_H
#include "common.h" #include "common.h"
ShaderFilesToMod vt3ShaderFilesToMod[] = {{"/shader/baka.fx", 0, ""}, {"/shader/main_p.fx", 0, ""}, ShaderFilesToMod vt3ShaderFilesToMod[] = {{"/shader/baka.fx", 0, ""}, {"/shader/main_p.fx", 0, ""},
@@ -21,5 +18,3 @@ SearchReplace vt3ShaderReplaceSet2[] = {{"POSITION0", "ATTR0"}, {"COLOR", "ATT
{"BLENDWEIGHT", "ATTR1"}, {"BLENDINDICES", "ATTR7"}}; {"BLENDWEIGHT", "ATTR1"}, {"BLENDINDICES", "ATTR7"}};
int vt3ShaderReplaceCount2 = sizeof(vt3ShaderReplaceSet2) / sizeof(SearchReplace); int vt3ShaderReplaceCount2 = sizeof(vt3ShaderReplaceSet2) / sizeof(SearchReplace);
#endif
+1 -4
View File
@@ -1,9 +1,6 @@
#ifndef TOUCHSCREEN_H #pragma once
#define TOUCHSCREEN_H
#include <sys/types.h> #include <sys/types.h>
void phCoordinates(int x, int y, int w, int h, int button); void phCoordinates(int x, int y, int w, int h, int button);
ssize_t phRead(int fd, void *buf, size_t count); ssize_t phRead(int fd, void *buf, size_t count);
#endif
-5
View File
@@ -1,8 +1,3 @@
#ifndef VERSION_H
#define VERSION_H
// Common file to hold the version information // Common file to hold the version information
#define MAJOR_VERSION 2 #define MAJOR_VERSION 2
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#endif // VERSION_H
-4
View File
@@ -1,4 +0,0 @@
#ifndef X11_H
#define X11_H
#endif