mirror of
https://github.com/hedge-dev/UnleashedRecomp
synced 2026-06-08 20:30:02 -04:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f32e2495f | |||
| 0aa1a256dd | |||
| df8234ab3b | |||
| c68b5247c7 | |||
| 910d043f19 | |||
| beac8339c2 | |||
| 02c23384f3 | |||
| 868e0f922a | |||
| 95c044299e | |||
| b04d9e683c | |||
| 5e8d15e334 | |||
| 8f8b574e56 | |||
| c8feff3f8d | |||
| 414ccb3637 | |||
| 431a6d9841 | |||
| 7a5cfe55f5 | |||
| 4f3144472a | |||
| e9f510e8c9 | |||
| a54f850425 | |||
| ab382deb04 | |||
| 8df3e0e440 | |||
| fe083f0eed | |||
| a8e78c21d1 | |||
| 9ec6bd95e1 | |||
| 771c2626b8 | |||
| 54a63e857a | |||
| a13fdc136b | |||
| 86b346e037 | |||
| 3081aec7c1 | |||
| dd294a30d4 | |||
| 99d6cebf92 | |||
| e86922b2b2 | |||
| a07610fb7a | |||
| db4974a9ca | |||
| 4b09a22041 | |||
| 989bf85986 | |||
| 0194c372e9 | |||
| 854d7412fa | |||
| 0441845f2a | |||
| f6d820faae | |||
| a7063dc118 | |||
| fb55ac1087 | |||
| e76cbff3ea | |||
| d2a3818700 | |||
| 3285ad045f | |||
| c687d87126 | |||
| 4502a9efee | |||
| fc99db7c97 | |||
| 0b8b243404 | |||
| 8220f6772b | |||
| b7cee84bda | |||
| 073065c6a6 | |||
| ed6f8f082b | |||
| f23d8ae08e | |||
| f7e660b5d8 | |||
| 7c1aea4e24 | |||
| 138d9b616d | |||
| 7f108285fe | |||
| 97b20742a3 | |||
| fcd1673cfc | |||
| fff96a8528 | |||
| 2fdd32e889 | |||
| 54aacf9a1f | |||
| 39272b7975 | |||
| d696524dbf | |||
| e3ac47a797 | |||
| 72640c8749 | |||
| 1687c65be9 | |||
| 6dac017d00 | |||
| 2150faed2e | |||
| 2f1b98c570 | |||
| 70ebdaa685 | |||
| e1edd5f35d | |||
| 88df0e08b7 | |||
| 511c670def | |||
| 16c35b45c2 | |||
| b291bdba91 | |||
| 727be2b47c | |||
| 62ad3a1a13 | |||
| 6c8dbdb6bc | |||
| 71bb081645 | |||
| 871515b3be | |||
| 266d436c28 | |||
| e7cc5a858e | |||
| 9549ba54aa | |||
| 47b1f20679 | |||
| ef51f04d4f | |||
| b68dbec612 | |||
| 96108e1759 | |||
| d3589979e4 | |||
| 2db4a9c78c | |||
| 2d56566924 | |||
| 553e011dad | |||
| 900ba7c916 | |||
| 66648d550a | |||
| c40ffbc70d | |||
| ee97736d58 | |||
| bbb3ebc25d | |||
| 52558a674e | |||
| 11d0fd2f9c | |||
| aaad10d797 | |||
| 342d696f99 | |||
| 0426b79094 | |||
| 3497d9b34b |
@@ -0,0 +1,73 @@
|
|||||||
|
name: Build Project (Linux)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
LLVM_VERSION: 18
|
||||||
|
CMAKE_PRESET: linux-relwithdebinfo
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build Linux
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
token: ${{ secrets.ORG_TOKEN }}
|
||||||
|
|
||||||
|
- name: Checkout Private Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: ${{ secrets.ASSET_REPO }}
|
||||||
|
token: ${{ secrets.ASSET_REPO_TOKEN }}
|
||||||
|
path: ./private
|
||||||
|
|
||||||
|
- name: Setup ccache
|
||||||
|
uses: hendrikmuhs/ccache-action@v1.2
|
||||||
|
with:
|
||||||
|
key: ccache-${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Cache vcpkg
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./thirdparty/vcpkg/downloads
|
||||||
|
./thirdparty/vcpkg/packages
|
||||||
|
key: vcpkg-${{ runner.os }}-${{ hashFiles('vcpkg.json') }}
|
||||||
|
restore-keys: |
|
||||||
|
vcpkg-${{ runner.os }}-
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: |-
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y ninja-build llvm-${{ env.LLVM_VERSION }}-dev libgtk-3-dev
|
||||||
|
|
||||||
|
- name: Cache ccache Directory
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: /tmp/ccache
|
||||||
|
key: ccache-${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Prepare Project
|
||||||
|
run: cp ./private/* ./UnleashedRecompLib/private
|
||||||
|
|
||||||
|
- name: Configure Project
|
||||||
|
env:
|
||||||
|
CCACHE_DIR: /tmp/ccache
|
||||||
|
run: cmake . --preset ${{ env.CMAKE_PRESET }} -DSDL2MIXER_VORBIS=VORBISFILE -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
|
||||||
|
|
||||||
|
- name: Build Project
|
||||||
|
env:
|
||||||
|
CCACHE_DIR: /tmp/ccache
|
||||||
|
run: cmake --build ./out/build/${{ env.CMAKE_PRESET }} --target UnleashedRecomp
|
||||||
|
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: UnleashedRecomp-Linux
|
||||||
|
path: ./out/build/${{ env.CMAKE_PRESET }}/UnleashedRecomp/UnleashedRecomp
|
||||||
|
|
||||||
@@ -137,6 +137,7 @@ set(UNLEASHED_RECOMP_PATCHES_CXX_SOURCES
|
|||||||
"patches/CTitleStateIntro_patches.cpp"
|
"patches/CTitleStateIntro_patches.cpp"
|
||||||
"patches/CTitleStateMenu_patches.cpp"
|
"patches/CTitleStateMenu_patches.cpp"
|
||||||
"patches/fps_patches.cpp"
|
"patches/fps_patches.cpp"
|
||||||
|
"patches/free_camera_patches.cpp"
|
||||||
"patches/frontend_listener.cpp"
|
"patches/frontend_listener.cpp"
|
||||||
"patches/input_patches.cpp"
|
"patches/input_patches.cpp"
|
||||||
"patches/inspire_patches.cpp"
|
"patches/inspire_patches.cpp"
|
||||||
@@ -149,7 +150,8 @@ set(UNLEASHED_RECOMP_PATCHES_CXX_SOURCES
|
|||||||
|
|
||||||
set(UNLEASHED_RECOMP_UI_CXX_SOURCES
|
set(UNLEASHED_RECOMP_UI_CXX_SOURCES
|
||||||
"ui/achievement_menu.cpp"
|
"ui/achievement_menu.cpp"
|
||||||
"ui/achievement_overlay.cpp"
|
"ui/achievement_overlay.cpp"
|
||||||
|
"ui/black_bar.cpp"
|
||||||
"ui/button_guide.cpp"
|
"ui/button_guide.cpp"
|
||||||
"ui/fader.cpp"
|
"ui/fader.cpp"
|
||||||
"ui/game_window.cpp"
|
"ui/game_window.cpp"
|
||||||
@@ -157,7 +159,8 @@ set(UNLEASHED_RECOMP_UI_CXX_SOURCES
|
|||||||
"ui/installer_wizard.cpp"
|
"ui/installer_wizard.cpp"
|
||||||
"ui/message_window.cpp"
|
"ui/message_window.cpp"
|
||||||
"ui/options_menu.cpp"
|
"ui/options_menu.cpp"
|
||||||
"ui/options_menu_thumbnails.cpp"
|
"ui/options_menu_thumbnails.cpp"
|
||||||
|
"ui/tv_static.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(UNLEASHED_RECOMP_INSTALL_CXX_SOURCES
|
set(UNLEASHED_RECOMP_INSTALL_CXX_SOURCES
|
||||||
@@ -350,10 +353,12 @@ file(CHMOD ${DIRECTX_DXC_TOOL} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)
|
|||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(UnleashedRecomp PRIVATE
|
target_link_libraries(UnleashedRecomp PRIVATE
|
||||||
comctl32
|
comctl32
|
||||||
ntdll
|
dwmapi
|
||||||
winmm
|
ntdll
|
||||||
|
Shcore
|
||||||
Synchronization
|
Synchronization
|
||||||
|
winmm
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -414,7 +419,9 @@ function(compile_pixel_shader FILE_PATH)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
compile_pixel_shader(blend_color_alpha_ps)
|
compile_pixel_shader(blend_color_alpha_ps)
|
||||||
compile_vertex_shader(copy_vs)
|
compile_vertex_shader(copy_vs)
|
||||||
|
compile_pixel_shader(copy_color_ps)
|
||||||
|
compile_pixel_shader(copy_depth_ps)
|
||||||
compile_pixel_shader(csd_filter_ps)
|
compile_pixel_shader(csd_filter_ps)
|
||||||
compile_vertex_shader(csd_no_tex_vs)
|
compile_vertex_shader(csd_no_tex_vs)
|
||||||
compile_vertex_shader(csd_vs)
|
compile_vertex_shader(csd_vs)
|
||||||
@@ -427,7 +434,10 @@ compile_pixel_shader(gamma_correction_ps)
|
|||||||
compile_pixel_shader(imgui_ps)
|
compile_pixel_shader(imgui_ps)
|
||||||
compile_vertex_shader(imgui_vs)
|
compile_vertex_shader(imgui_vs)
|
||||||
compile_pixel_shader(movie_ps)
|
compile_pixel_shader(movie_ps)
|
||||||
compile_vertex_shader(movie_vs)
|
compile_vertex_shader(movie_vs)
|
||||||
|
compile_pixel_shader(resolve_msaa_color_2x)
|
||||||
|
compile_pixel_shader(resolve_msaa_color_4x)
|
||||||
|
compile_pixel_shader(resolve_msaa_color_8x)
|
||||||
compile_pixel_shader(resolve_msaa_depth_2x)
|
compile_pixel_shader(resolve_msaa_depth_2x)
|
||||||
compile_pixel_shader(resolve_msaa_depth_4x)
|
compile_pixel_shader(resolve_msaa_depth_4x)
|
||||||
compile_pixel_shader(resolve_msaa_depth_8x)
|
compile_pixel_shader(resolve_msaa_depth_8x)
|
||||||
@@ -463,7 +473,8 @@ generate_aggregate_header(
|
|||||||
|
|
||||||
set(RESOURCES_SOURCE_PATH "${PROJECT_SOURCE_DIR}/../UnleashedRecompResources")
|
set(RESOURCES_SOURCE_PATH "${PROJECT_SOURCE_DIR}/../UnleashedRecompResources")
|
||||||
set(RESOURCES_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/res")
|
set(RESOURCES_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/res")
|
||||||
|
|
||||||
|
## Miscellaneous ##
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/bc_diff/button_bc_diff.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/bc_diff/button_bc_diff.bin" ARRAY_NAME "g_button_bc_diff" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/bc_diff/button_bc_diff.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/bc_diff/button_bc_diff.bin" ARRAY_NAME "g_button_bc_diff" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.bin" ARRAY_NAME "g_im_font_atlas" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.bin" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.bin" ARRAY_NAME "g_im_font_atlas" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.dds" ARRAY_NAME "g_im_font_atlas_texture" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/font/im_font_atlas.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/font/im_font_atlas.dds" ARRAY_NAME "g_im_font_atlas_texture" COMPRESSION_TYPE "zstd")
|
||||||
@@ -472,9 +483,10 @@ BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/co
|
|||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/general_window.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/general_window.dds" ARRAY_NAME "g_general_window" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/general_window.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/general_window.dds" ARRAY_NAME "g_general_window" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/hedge-dev.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/hedge-dev.dds" ARRAY_NAME "g_hedgedev" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/hedge-dev.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/hedge-dev.dds" ARRAY_NAME "g_hedgedev" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/kbm.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/kbm.dds" ARRAY_NAME "g_kbm" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/kbm.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/kbm.dds" ARRAY_NAME "g_kbm" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/select_fade.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/select_fade.dds" ARRAY_NAME "g_select_fade" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/select.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/select.dds" ARRAY_NAME "g_select" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/select_fill.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/select_fill.dds" ARRAY_NAME "g_select_fill" COMPRESSION_TYPE "zstd")
|
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/light.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/light.dds" ARRAY_NAME "g_light" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/common/light.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/common/light.dds" ARRAY_NAME "g_light" COMPRESSION_TYPE "zstd")
|
||||||
|
|
||||||
|
## Installer ##
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/arrow_circle.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/arrow_circle.dds" ARRAY_NAME "g_arrow_circle" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/arrow_circle.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/arrow_circle.dds" ARRAY_NAME "g_arrow_circle" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_001.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_001.dds" ARRAY_NAME "g_install_001" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_001.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_001.dds" ARRAY_NAME "g_install_001" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_002.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_002.dds" ARRAY_NAME "g_install_002" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_002.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_002.dds" ARRAY_NAME "g_install_002" COMPRESSION_TYPE "zstd")
|
||||||
@@ -485,14 +497,23 @@ BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/in
|
|||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_007.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_007.dds" ARRAY_NAME "g_install_007" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_007.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_007.dds" ARRAY_NAME "g_install_007" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_008.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_008.dds" ARRAY_NAME "g_install_008" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/install_008.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/install_008.dds" ARRAY_NAME "g_install_008" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/miles_electric_icon.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/miles_electric_icon.dds" ARRAY_NAME "g_miles_electric_icon" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/miles_electric_icon.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/miles_electric_icon.dds" ARRAY_NAME "g_miles_electric_icon" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/pulse_install.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/pulse_install.dds" ARRAY_NAME "g_pulse_install" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/installer/pulse_install.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/installer/pulse_install.dds" ARRAY_NAME "g_pulse_install" COMPRESSION_TYPE "zstd")
|
||||||
|
|
||||||
|
## Options Menu ##
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/achievement_notifications.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/achievement_notifications.dds" ARRAY_NAME "g_achievement_notifications" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/achievement_notifications.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/achievement_notifications.dds" ARRAY_NAME "g_achievement_notifications" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/allow_background_input.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/allow_background_input.dds" ARRAY_NAME "g_allow_background_input" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/allow_background_input.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/allow_background_input.dds" ARRAY_NAME "g_allow_background_input" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/antialiasing.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/antialiasing.dds" ARRAY_NAME "g_antialiasing" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/allow_dpad_movement.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/allow_dpad_movement.dds" ARRAY_NAME "g_allow_dpad_movement" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/antialiasing_none.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/antialiasing_none.dds" ARRAY_NAME "g_antialiasing_none" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/antialiasing_2x.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/antialiasing_2x.dds" ARRAY_NAME "g_antialiasing_2x" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/antialiasing_4x.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/antialiasing_4x.dds" ARRAY_NAME "g_antialiasing_4x" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/antialiasing_8x.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/antialiasing_8x.dds" ARRAY_NAME "g_antialiasing_8x" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/aspect_ratio.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/aspect_ratio.dds" ARRAY_NAME "g_aspect_ratio" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/aspect_ratio.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/aspect_ratio.dds" ARRAY_NAME "g_aspect_ratio" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/battle_theme.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/battle_theme.dds" ARRAY_NAME "g_battle_theme" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/battle_theme.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/battle_theme.dds" ARRAY_NAME "g_battle_theme" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/brightness.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/brightness.dds" ARRAY_NAME "g_brightness" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/brightness.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/brightness.dds" ARRAY_NAME "g_brightness" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/control_tutorial.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/control_tutorial.dds" ARRAY_NAME "g_control_tutorial" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/channel_stereo.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/channel_stereo.dds" ARRAY_NAME "g_channel_stereo" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/channel_surround.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/channel_surround.dds" ARRAY_NAME "g_channel_surround" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/control_tutorial_xb.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/control_tutorial_xb.dds" ARRAY_NAME "g_control_tutorial_xb" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/control_tutorial_ps.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/control_tutorial_ps.dds" ARRAY_NAME "g_control_tutorial_ps" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/controller_icons.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/controller_icons.dds" ARRAY_NAME "g_controller_icons" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/controller_icons.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/controller_icons.dds" ARRAY_NAME "g_controller_icons" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/default.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/default.dds" ARRAY_NAME "g_default" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/default.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/default.dds" ARRAY_NAME "g_default" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/effects_volume.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/effects_volume.dds" ARRAY_NAME "g_effects_volume" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/effects_volume.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/effects_volume.dds" ARRAY_NAME "g_effects_volume" COMPRESSION_TYPE "zstd")
|
||||||
@@ -508,7 +529,8 @@ BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/op
|
|||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_off.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_off.dds" ARRAY_NAME "g_motion_blur_off" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_off.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_off.dds" ARRAY_NAME "g_motion_blur_off" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_original.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_original.dds" ARRAY_NAME "g_motion_blur_original" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_original.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_original.dds" ARRAY_NAME "g_motion_blur_original" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_enhanced.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_enhanced.dds" ARRAY_NAME "g_motion_blur_enhanced" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/motion_blur_enhanced.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/motion_blur_enhanced.dds" ARRAY_NAME "g_motion_blur_enhanced" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/movie_scale_mode.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/movie_scale_mode.dds" ARRAY_NAME "g_movie_scale_mode" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/movie_scale_fit.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/movie_scale_fit.dds" ARRAY_NAME "g_movie_scale_fit" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/movie_scale_fill.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/movie_scale_fill.dds" ARRAY_NAME "g_movie_scale_fill" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/music_attenuation.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/music_attenuation.dds" ARRAY_NAME "g_music_attenuation" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/music_attenuation.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/music_attenuation.dds" ARRAY_NAME "g_music_attenuation" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/music_volume.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/music_volume.dds" ARRAY_NAME "g_music_volume" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/music_volume.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/music_volume.dds" ARRAY_NAME "g_music_volume" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/resolution_scale.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/resolution_scale.dds" ARRAY_NAME "g_resolution_scale" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/resolution_scale.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/resolution_scale.dds" ARRAY_NAME "g_resolution_scale" COMPRESSION_TYPE "zstd")
|
||||||
@@ -519,25 +541,32 @@ BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/op
|
|||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/shadow_resolution_x4096.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/shadow_resolution_x4096.dds" ARRAY_NAME "g_shadow_resolution_x4096" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/shadow_resolution_x4096.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/shadow_resolution_x4096.dds" ARRAY_NAME "g_shadow_resolution_x4096" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/shadow_resolution_x8192.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/shadow_resolution_x8192.dds" ARRAY_NAME "g_shadow_resolution_x8192" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/shadow_resolution_x8192.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/shadow_resolution_x8192.dds" ARRAY_NAME "g_shadow_resolution_x8192" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/subtitles.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/subtitles.dds" ARRAY_NAME "g_subtitles" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/subtitles.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/subtitles.dds" ARRAY_NAME "g_subtitles" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/time_of_day_transition_xbox.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/time_of_day_transition_xbox.dds" ARRAY_NAME "g_time_of_day_transition_xbox" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/time_transition_xb.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/time_transition_xb.dds" ARRAY_NAME "g_time_of_day_transition_xbox" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/time_of_day_transition_playstation.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/time_of_day_transition_playstation.dds" ARRAY_NAME "g_time_of_day_transition_playstation" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/time_transition_ps.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/time_transition_ps.dds" ARRAY_NAME "g_time_of_day_transition_playstation" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/transparency_antialiasing_false.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/transparency_antialiasing_false.dds" ARRAY_NAME "g_transparency_antialiasing_false" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/transparency_antialiasing_false.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/transparency_antialiasing_false.dds" ARRAY_NAME "g_transparency_antialiasing_false" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/transparency_antialiasing_true.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/transparency_antialiasing_true.dds" ARRAY_NAME "g_transparency_antialiasing_true" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/transparency_antialiasing_true.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/transparency_antialiasing_true.dds" ARRAY_NAME "g_transparency_antialiasing_true" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/ui_scale_mode.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/ui_scale_mode.dds" ARRAY_NAME "g_ui_scale_mode" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/ui_alignment_centre.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/ui_alignment_centre.dds" ARRAY_NAME "g_ui_alignment_centre" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/ui_alignment_edge.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/ui_alignment_edge.dds" ARRAY_NAME "g_ui_alignment_edge" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vertical_camera.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vertical_camera.dds" ARRAY_NAME "g_vertical_camera" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vertical_camera.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vertical_camera.dds" ARRAY_NAME "g_vertical_camera" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/voice_language.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/voice_language.dds" ARRAY_NAME "g_voice_language" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/voice_language.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/voice_language.dds" ARRAY_NAME "g_voice_language" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vibration.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vibration.dds" ARRAY_NAME "g_vibration" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vibration.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vibration.dds" ARRAY_NAME "g_vibration" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vsync.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vsync.dds" ARRAY_NAME "g_vsync" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vsync_on.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vsync_on.dds" ARRAY_NAME "g_vsync_on" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/vsync_off.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/vsync_off.dds" ARRAY_NAME "g_vsync_off" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/window_size.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/window_size.dds" ARRAY_NAME "g_window_size" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/window_size.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/window_size.dds" ARRAY_NAME "g_window_size" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/xbox_color_correction.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/xbox_color_correction.dds" ARRAY_NAME "g_xbox_color_correction" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/thumbnails/xbox_color_correction.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/thumbnails/xbox_color_correction.dds" ARRAY_NAME "g_xbox_color_correction" COMPRESSION_TYPE "zstd")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/miles_electric.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/miles_electric.dds" ARRAY_NAME "g_miles_electric" COMPRESSION_TYPE "zstd")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/miles_electric.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/miles_electric.dds" ARRAY_NAME "g_miles_electric" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/options_static.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/options_static.dds" ARRAY_NAME "g_options_static" COMPRESSION_TYPE "zstd")
|
||||||
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/options_menu/options_static_flash.dds" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/options_menu/options_static_flash.dds" ARRAY_NAME "g_options_static_flash" COMPRESSION_TYPE "zstd")
|
||||||
|
|
||||||
|
## Game Icon ##
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/game_icon.bmp" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/game_icon.bmp" ARRAY_NAME "g_game_icon")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/game_icon.bmp" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/game_icon.bmp" ARRAY_NAME "g_game_icon")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/game_icon_night.bmp" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/game_icon_night.bmp" ARRAY_NAME "g_game_icon_night")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/images/game_icon_night.bmp" DEST_FILE "${RESOURCES_OUTPUT_PATH}/images/game_icon_night.bmp" ARRAY_NAME "g_game_icon_night")
|
||||||
|
|
||||||
|
## Audio ##
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_worldmap_cursor.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_worldmap_cursor.ogg" ARRAY_NAME "g_sys_worldmap_cursor")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_worldmap_cursor.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_worldmap_cursor.ogg" ARRAY_NAME "g_sys_worldmap_cursor")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_worldmap_finaldecide.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_worldmap_finaldecide.ogg" ARRAY_NAME "g_sys_worldmap_finaldecide")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_worldmap_finaldecide.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_worldmap_finaldecide.ogg" ARRAY_NAME "g_sys_worldmap_finaldecide")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausecansel.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausecansel.ogg" ARRAY_NAME "g_sys_actstg_pausecansel")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausecansel.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausecansel.ogg" ARRAY_NAME "g_sys_actstg_pausecansel")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausecursor.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausecursor.ogg" ARRAY_NAME "g_sys_actstg_pausecursor")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausecursor.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausecursor.ogg" ARRAY_NAME "g_sys_actstg_pausecursor")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausedecide.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausedecide.ogg" ARRAY_NAME "g_sys_actstg_pausedecide")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausedecide.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausedecide.ogg" ARRAY_NAME "g_sys_actstg_pausedecide")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausewinclose.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausewinclose.ogg" ARRAY_NAME "g_sys_actstg_pausewinclose")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausewinclose.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausewinclose.ogg" ARRAY_NAME "g_sys_actstg_pausewinclose")
|
||||||
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausewinopen.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausewinopen.ogg" ARRAY_NAME "g_sys_actstg_pausewinopen")
|
BIN2C(TARGET_OBJ UnleashedRecomp SOURCE_FILE "${RESOURCES_SOURCE_PATH}/sounds/sys_actstg_pausewinopen.ogg" DEST_FILE "${RESOURCES_OUTPUT_PATH}/sounds/sys_actstg_pausewinopen.ogg" ARRAY_NAME "g_sys_actstg_pausewinopen")
|
||||||
|
|
||||||
|
|||||||
@@ -21,3 +21,5 @@ namespace Hedgehog::Base
|
|||||||
void operator delete(void* in_pMem, void* in_pObj);
|
void operator delete(void* in_pMem, void* in_pObj);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "hhObject.inl"
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
namespace Hedgehog::Base
|
||||||
|
{
|
||||||
|
inline CObject::CObject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline CObject::CObject(const swa_null_ctor&)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void* CObject::operator new(const size_t in_Size)
|
||||||
|
{
|
||||||
|
return __HH_ALLOC(in_Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// inline void* CObject::operator new(const size_t in_Size, const size_t in_Align)
|
||||||
|
// {
|
||||||
|
// return __HH_ALLOCALIGN(in_Size, in_Align);
|
||||||
|
// }
|
||||||
|
|
||||||
|
inline void CObject::operator delete(void* in_pMem)
|
||||||
|
{
|
||||||
|
return __HH_FREE(in_pMem);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void* CObject::operator new(const size_t in_Size, void* in_pObj)
|
||||||
|
{
|
||||||
|
return in_pObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void* CObject::operator new(const size_t in_Size, const size_t in_Align, void* in_pObj)
|
||||||
|
{
|
||||||
|
return in_pObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void CObject::operator delete(void* in_pMem, void* in_pObj)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace Hedgehog::Math
|
||||||
|
{
|
||||||
|
class CMatrix
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
be<float> m_M00;
|
||||||
|
be<float> m_M01;
|
||||||
|
be<float> m_M02;
|
||||||
|
be<float> m_M03;
|
||||||
|
be<float> m_M10;
|
||||||
|
be<float> m_M11;
|
||||||
|
be<float> m_M12;
|
||||||
|
be<float> m_M13;
|
||||||
|
be<float> m_M20;
|
||||||
|
be<float> m_M21;
|
||||||
|
be<float> m_M22;
|
||||||
|
be<float> m_M23;
|
||||||
|
be<float> m_M30;
|
||||||
|
be<float> m_M31;
|
||||||
|
be<float> m_M32;
|
||||||
|
be<float> m_M33;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace Hedgehog::Math
|
||||||
|
{
|
||||||
|
class CQuaternion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
be<float> X;
|
||||||
|
be<float> Y;
|
||||||
|
be<float> Z;
|
||||||
|
be<float> W;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -18,6 +18,16 @@ namespace Hedgehog::Math
|
|||||||
be<float> Y;
|
be<float> Y;
|
||||||
be<float> Z;
|
be<float> Z;
|
||||||
be<float> W;
|
be<float> W;
|
||||||
|
|
||||||
|
CVector operator*(const float& scalar) const
|
||||||
|
{
|
||||||
|
return { X * scalar, Y * scalar, Z * scalar };
|
||||||
|
}
|
||||||
|
|
||||||
|
CVector operator+(const CVector& v) const
|
||||||
|
{
|
||||||
|
return { X + v.X, Y + v.Y, Z + v.Z };
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CVector4
|
class CVector4
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace Hedgehog::Mirage
|
||||||
|
{
|
||||||
|
class CMatrixNodeListener;
|
||||||
|
|
||||||
|
class CMatrixNode : public Base::CObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x60);
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_SIZEOF(CMatrixNode, 0x60);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace Hedgehog::Mirage
|
||||||
|
{
|
||||||
|
class CTransform
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Math::CQuaternion m_Rotation;
|
||||||
|
Math::CVector m_Position;
|
||||||
|
Math::CMatrix m_Matrix;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CTransform, m_Rotation, 0x00);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTransform, m_Position, 0x10);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTransform, m_Matrix, 0x20);
|
||||||
|
SWA_ASSERT_SIZEOF(CTransform, 0x60);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include <Hedgehog/Base/hhObject.h>
|
||||||
|
#include <boost/smart_ptr/shared_ptr.h>
|
||||||
|
|
||||||
|
namespace Hedgehog::Universe
|
||||||
|
{
|
||||||
|
class Message : public Base::CObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
be<uint32_t> m_pVftable;
|
||||||
|
be<uint32_t> m_SenderActorID;
|
||||||
|
boost::shared_ptr<Message> m_spSelf;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MessageTypeGet : public Message {};
|
||||||
|
class MessageTypeSet : public Message {};
|
||||||
|
}
|
||||||
@@ -27,7 +27,11 @@
|
|||||||
#include "Hedgehog/Base/Type/hhSharedString.h"
|
#include "Hedgehog/Base/Type/hhSharedString.h"
|
||||||
#include "Hedgehog/Base/hhObject.h"
|
#include "Hedgehog/Base/hhObject.h"
|
||||||
#include "Hedgehog/Database/System/hhDatabaseData.h"
|
#include "Hedgehog/Database/System/hhDatabaseData.h"
|
||||||
|
#include "Hedgehog/Math/Matrix.h"
|
||||||
|
#include "Hedgehog/Math/Quaternion.h"
|
||||||
#include "Hedgehog/Math/Vector.h"
|
#include "Hedgehog/Math/Vector.h"
|
||||||
|
#include "Hedgehog/MirageCore/MatrixNode/hhMatrixNode.h"
|
||||||
|
#include "Hedgehog/MirageCore/Misc/hhTransform.h"
|
||||||
#include "Hedgehog/MirageCore/Misc/hhVertexDeclarationPtr.h"
|
#include "Hedgehog/MirageCore/Misc/hhVertexDeclarationPtr.h"
|
||||||
#include "Hedgehog/MirageCore/RenderData/hhMaterialData.h"
|
#include "Hedgehog/MirageCore/RenderData/hhMaterialData.h"
|
||||||
#include "Hedgehog/MirageCore/RenderData/hhMeshData.h"
|
#include "Hedgehog/MirageCore/RenderData/hhMeshData.h"
|
||||||
@@ -45,6 +49,7 @@
|
|||||||
#include "Hedgehog/MirageCore/RenderData/hhVertexShaderData.h"
|
#include "Hedgehog/MirageCore/RenderData/hhVertexShaderData.h"
|
||||||
#include "Hedgehog/MirageCore/Renderable/hhRenderable.h"
|
#include "Hedgehog/MirageCore/Renderable/hhRenderable.h"
|
||||||
#include "Hedgehog/Sparkle/hhParticleMaterial.h"
|
#include "Hedgehog/Sparkle/hhParticleMaterial.h"
|
||||||
|
#include "Hedgehog/Universe/Engine/hhMessage.h"
|
||||||
#include "Hedgehog/Universe/Engine/hhMessageActor.h"
|
#include "Hedgehog/Universe/Engine/hhMessageActor.h"
|
||||||
#include "Hedgehog/Universe/Engine/hhMessageProcess.h"
|
#include "Hedgehog/Universe/Engine/hhMessageProcess.h"
|
||||||
#include "Hedgehog/Universe/Engine/hhStateMachineBase.h"
|
#include "Hedgehog/Universe/Engine/hhStateMachineBase.h"
|
||||||
@@ -55,13 +60,19 @@
|
|||||||
#include "SWA/Achievement/AchievementID.h"
|
#include "SWA/Achievement/AchievementID.h"
|
||||||
#include "SWA/Achievement/AchievementManager.h"
|
#include "SWA/Achievement/AchievementManager.h"
|
||||||
#include "SWA/Achievement/AchievementTest.h"
|
#include "SWA/Achievement/AchievementTest.h"
|
||||||
|
#include "SWA/Boss/EggDragoon/Object/BossEggDragoonDrillMissile.h"
|
||||||
#include "SWA/CSD/CsdDatabaseWrapper.h"
|
#include "SWA/CSD/CsdDatabaseWrapper.h"
|
||||||
#include "SWA/CSD/CsdProject.h"
|
#include "SWA/CSD/CsdProject.h"
|
||||||
#include "SWA/CSD/CsdTexListMirage.h"
|
#include "SWA/CSD/CsdTexListMirage.h"
|
||||||
#include "SWA/CSD/GameObjectCSD.h"
|
#include "SWA/CSD/GameObjectCSD.h"
|
||||||
#include "SWA/Camera/Camera.h"
|
#include "SWA/Camera/Camera.h"
|
||||||
#include "SWA/Camera/CameraController.h"
|
#include "SWA/Camera/Controller/CameraController.h"
|
||||||
|
#include "SWA/Camera/Controller/FreeCamera.h"
|
||||||
#include "SWA/CharacterUtility/CharacterProxy.h"
|
#include "SWA/CharacterUtility/CharacterProxy.h"
|
||||||
|
#include "SWA/ExtraStage/Tails/Enemy/Boss/ExStageBoss.h"
|
||||||
|
#include "SWA/ExtraStage/Tails/Enemy/Boss/State/StateBase.h"
|
||||||
|
#include "SWA/ExtraStage/Tails/Enemy/Boss/State/StateBattle.h"
|
||||||
|
#include "SWA/ExtraStage/Tails/Player/ExPlayerTails.h"
|
||||||
#include "SWA/Globals.h"
|
#include "SWA/Globals.h"
|
||||||
#include "SWA/HUD/GeneralWindow/GeneralWindow.h"
|
#include "SWA/HUD/GeneralWindow/GeneralWindow.h"
|
||||||
#include "SWA/HUD/Loading/Loading.h"
|
#include "SWA/HUD/Loading/Loading.h"
|
||||||
@@ -78,11 +89,20 @@
|
|||||||
#include "SWA/Inspire/InspireTextureOverlay.h"
|
#include "SWA/Inspire/InspireTextureOverlay.h"
|
||||||
#include "SWA/Inspire/InspireTextureOverlayInfo.h"
|
#include "SWA/Inspire/InspireTextureOverlayInfo.h"
|
||||||
#include "SWA/Menu/MenuWindowBase.h"
|
#include "SWA/Menu/MenuWindowBase.h"
|
||||||
|
#include "SWA/Message/MsgCameraPauseMove.h"
|
||||||
|
#include "SWA/Message/MsgPopCameraController.h"
|
||||||
|
#include "SWA/Message/MsgSetPosition.h"
|
||||||
|
#include "SWA/Message/MsgSetVelocity.h"
|
||||||
#include "SWA/Movie/MovieDisplayer.h"
|
#include "SWA/Movie/MovieDisplayer.h"
|
||||||
#include "SWA/Movie/MovieManager.h"
|
#include "SWA/Movie/MovieManager.h"
|
||||||
|
#include "SWA/Object/Common/DashPanel/ObjDashPanel.h"
|
||||||
|
#include "SWA/Object/SonicStage/EU/RollingBarrel/ObjRollingBarrel.h"
|
||||||
|
#include "SWA/Player/Character/Base/PlayerContext.h"
|
||||||
#include "SWA/Player/Character/EvilSonic/EvilSonic.h"
|
#include "SWA/Player/Character/EvilSonic/EvilSonic.h"
|
||||||
#include "SWA/Player/Character/EvilSonic/EvilSonicContext.h"
|
#include "SWA/Player/Character/EvilSonic/EvilSonicContext.h"
|
||||||
#include "SWA/Player/Character/EvilSonic/Hud/EvilHudGuide.h"
|
#include "SWA/Player/Character/EvilSonic/Hud/EvilHudGuide.h"
|
||||||
|
#include "SWA/Player/Character/Speed/PlayerSpeedContext.h"
|
||||||
|
#include "SWA/Replay/Camera/ReplayFreeCamera.h"
|
||||||
#include "SWA/Sequence/Unit/SequenceUnitBase.h"
|
#include "SWA/Sequence/Unit/SequenceUnitBase.h"
|
||||||
#include "SWA/Sequence/Unit/SequenceUnitPlayMovie.h"
|
#include "SWA/Sequence/Unit/SequenceUnitPlayMovie.h"
|
||||||
#include "SWA/Sequence/Utility/SequencePlayMovieWrapper.h"
|
#include "SWA/Sequence/Utility/SequencePlayMovieWrapper.h"
|
||||||
@@ -102,6 +122,7 @@
|
|||||||
#include "SWA/System/GameMode/Title/TitleMenu.h"
|
#include "SWA/System/GameMode/Title/TitleMenu.h"
|
||||||
#include "SWA/System/GameMode/Title/TitleStateBase.h"
|
#include "SWA/System/GameMode/Title/TitleStateBase.h"
|
||||||
#include "SWA/System/GameMode/Title/TitleStateIntro.h"
|
#include "SWA/System/GameMode/Title/TitleStateIntro.h"
|
||||||
|
#include "SWA/System/GameMode/Title/TitleStateMenu.h"
|
||||||
#include "SWA/System/GameMode/Title/TitleStateWorldMap.h"
|
#include "SWA/System/GameMode/Title/TitleStateWorldMap.h"
|
||||||
#include "SWA/System/GameMode/WorldMap/WorldMapCamera.h"
|
#include "SWA/System/GameMode/WorldMap/WorldMapCamera.h"
|
||||||
#include "SWA/System/GameMode/WorldMap/WorldMapCursor.h"
|
#include "SWA/System/GameMode/WorldMap/WorldMapCursor.h"
|
||||||
@@ -109,7 +130,9 @@
|
|||||||
#include "SWA/System/GameParameter.h"
|
#include "SWA/System/GameParameter.h"
|
||||||
#include "SWA/System/GammaController.h"
|
#include "SWA/System/GammaController.h"
|
||||||
#include "SWA/System/InputState.h"
|
#include "SWA/System/InputState.h"
|
||||||
|
#include "SWA/System/MatrixNodeTransform.h"
|
||||||
#include "SWA/System/PadState.h"
|
#include "SWA/System/PadState.h"
|
||||||
#include "SWA/System/World.h"
|
#include "SWA/System/World.h"
|
||||||
|
#include "SWA/Tool/FreeCameraTool/FreeCameraTool.h"
|
||||||
#include "boost/smart_ptr/make_shared_object.h"
|
#include "boost/smart_ptr/make_shared_object.h"
|
||||||
#include "boost/smart_ptr/shared_ptr.h"
|
#include "boost/smart_ptr/shared_ptr.h"
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "SWA/System/MatrixNodeTransform.h"
|
||||||
|
|
||||||
|
namespace SWA::Boss::EggDragoon::DrillMissile
|
||||||
|
{
|
||||||
|
class CMissile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0xC4);
|
||||||
|
xpointer<CMatrixNodeTransform> m_pMatrixNodeTransform;
|
||||||
|
SWA_INSERT_PADDING(0x68);
|
||||||
|
be<float> m_Speed;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <SWA.inl>
|
|
||||||
|
|
||||||
namespace SWA
|
|
||||||
{
|
|
||||||
class CCameraController : public Hedgehog::Universe::CStateMachineBase::CStateBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SWA_INSERT_PADDING(0x04);
|
|
||||||
be<float> m_FieldOfView;
|
|
||||||
SWA_INSERT_PADDING(0x68);
|
|
||||||
};
|
|
||||||
|
|
||||||
SWA_ASSERT_OFFSETOF(CCameraController, m_FieldOfView, 0x64);
|
|
||||||
SWA_ASSERT_SIZEOF(CCameraController, 0xD0);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CCameraController
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
xpointer<CCamera> m_pCamera;
|
||||||
|
SWA_INSERT_PADDING(0x58);
|
||||||
|
be<float> m_FieldOfView;
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
Hedgehog::Math::CVector m_Position;
|
||||||
|
Hedgehog::Math::CVector m_UpVector;
|
||||||
|
Hedgehog::Math::CQuaternion m_Rotation;
|
||||||
|
SWA_INSERT_PADDING(0x30);
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CCameraController, m_pCamera, 0x08);
|
||||||
|
SWA_ASSERT_OFFSETOF(CCameraController, m_FieldOfView, 0x64);
|
||||||
|
SWA_ASSERT_SIZEOF(CCameraController, 0xD0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "SWA/Camera/Controller/CameraController.h"
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CFreeCamera : public CCameraController
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
|
be<float> m_Speed;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CFreeCamera, m_Speed, 0xE0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CExStageBoss
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class CStateBase;
|
||||||
|
class CStateBattle;
|
||||||
|
|
||||||
|
class CExStageBossStateContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x14C);
|
||||||
|
be<float> m_SplineProgress;
|
||||||
|
SWA_INSERT_PADDING(0x0C);
|
||||||
|
be<float> m_SplineSpeed;
|
||||||
|
SWA_INSERT_PADDING(0x28);
|
||||||
|
be<float> m_Field188;
|
||||||
|
be<float> m_Field18C;
|
||||||
|
SWA_INSERT_PADDING(0x21);
|
||||||
|
bool m_IsBattleStart;
|
||||||
|
SWA_INSERT_PADDING(0x36E);
|
||||||
|
be<float> m_Field520;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_SplineProgress, 0x14C);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_SplineSpeed, 0x15C);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_Field188, 0x188);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_Field18C, 0x18C);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_IsBattleStart, 0x1B1);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CExStageBossStateContext, m_Field520, 0x520);
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "SWA/ExtraStage/Tails/Enemy/Boss/ExStageBoss.h"
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CExStageBoss::CStateBase : public Hedgehog::Universe::CStateMachineBase::CStateBase {};
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "SWA/ExtraStage/Tails/Enemy/Boss/ExStageBoss.h"
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CExStageBoss::CStateBattle : public CExStageBoss::CStateBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
be<float> m_Field68;
|
||||||
|
be<float> m_FramesSinceLastMissile;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CStateBattle, m_Field68, 0x68);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExStageBoss::CStateBattle, m_FramesSinceLastMissile, 0x6C);
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CExPlayerTails
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class CExPlayerTailsStateContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x1F8);
|
||||||
|
be<float> m_SplineBossStart;
|
||||||
|
be<float> m_SplineEnd;
|
||||||
|
SWA_INSERT_PADDING(0x30);
|
||||||
|
be<float> m_SplineProgress;
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
|
xpointer<void> m_Field244;
|
||||||
|
SWA_INSERT_PADDING(0x18);
|
||||||
|
be<float> m_SplineSpeed;
|
||||||
|
SWA_INSERT_PADDING(0x0C);
|
||||||
|
be<uint32_t> m_State; // 0 - Intro; 1 - Boss Intro; 3 - Boss
|
||||||
|
};
|
||||||
|
|
||||||
|
class CStateBase : public Hedgehog::Universe::CStateMachineBase::CStateBase {};
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_SplineBossStart, 0x1F8);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_SplineEnd, 0x1FC);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_SplineProgress, 0x230);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_Field244, 0x244);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_SplineSpeed, 0x260);
|
||||||
|
SWA_ASSERT_OFFSETOF(CExPlayerTails::CExPlayerTailsStateContext, m_State, 0x270);
|
||||||
|
}
|
||||||
@@ -9,6 +9,12 @@ namespace SWA
|
|||||||
// ms_DrawLightFieldSamplingPoint: サンプリング点をデバッグ表示
|
// ms_DrawLightFieldSamplingPoint: サンプリング点をデバッグ表示
|
||||||
static inline bool* ms_DrawLightFieldSamplingPoint;
|
static inline bool* ms_DrawLightFieldSamplingPoint;
|
||||||
|
|
||||||
|
// N/A
|
||||||
|
static inline be<float>* ms_FreeCameraSpeed;
|
||||||
|
|
||||||
|
// N/A
|
||||||
|
static inline bool* ms_IsAutoSaveWarningShown;
|
||||||
|
|
||||||
// ms_IgnoreLightFieldData: データを無視する
|
// ms_IgnoreLightFieldData: データを無視する
|
||||||
static inline bool* ms_IgnoreLightFieldData;
|
static inline bool* ms_IgnoreLightFieldData;
|
||||||
|
|
||||||
@@ -30,6 +36,9 @@ namespace SWA
|
|||||||
// ms_IsRenderDebugPositionDraw: デバッグ位置描画
|
// ms_IsRenderDebugPositionDraw: デバッグ位置描画
|
||||||
static inline bool* ms_IsRenderDebugPositionDraw;
|
static inline bool* ms_IsRenderDebugPositionDraw;
|
||||||
|
|
||||||
|
// N/A
|
||||||
|
static inline bool* ms_IsRenderDepthOfField;
|
||||||
|
|
||||||
// ms_IsRenderGameMainHud: ゲームメインHUD 描画
|
// ms_IsRenderGameMainHud: ゲームメインHUD 描画
|
||||||
static inline bool* ms_IsRenderGameMainHud;
|
static inline bool* ms_IsRenderGameMainHud;
|
||||||
|
|
||||||
@@ -39,6 +48,9 @@ namespace SWA
|
|||||||
// ms_IsRenderHudPause: ポーズメニュー 描画
|
// ms_IsRenderHudPause: ポーズメニュー 描画
|
||||||
static inline bool* ms_IsRenderHudPause;
|
static inline bool* ms_IsRenderHudPause;
|
||||||
|
|
||||||
|
// N/A
|
||||||
|
static inline bool* ms_IsTitleStateMenu;
|
||||||
|
|
||||||
// IsTriggerRender
|
// IsTriggerRender
|
||||||
static inline bool* ms_IsTriggerRender;
|
static inline bool* ms_IsTriggerRender;
|
||||||
|
|
||||||
@@ -51,16 +63,20 @@ namespace SWA
|
|||||||
static void Init()
|
static void Init()
|
||||||
{
|
{
|
||||||
ms_DrawLightFieldSamplingPoint = (bool*)MmGetHostAddress(0x83367BCE);
|
ms_DrawLightFieldSamplingPoint = (bool*)MmGetHostAddress(0x83367BCE);
|
||||||
|
ms_FreeCameraSpeed = (be<float>*)MmGetHostAddress(0x83366DF8);
|
||||||
ms_IgnoreLightFieldData = (bool*)MmGetHostAddress(0x83367BCF);
|
ms_IgnoreLightFieldData = (bool*)MmGetHostAddress(0x83367BCF);
|
||||||
|
ms_IsAutoSaveWarningShown = (bool*)MmGetHostAddress(0x83367BC1);
|
||||||
ms_IsCollisionRender = (bool*)MmGetHostAddress(0x833678A6);
|
ms_IsCollisionRender = (bool*)MmGetHostAddress(0x833678A6);
|
||||||
ms_IsLoading = (bool*)MmGetHostAddress(0x83367A4C);
|
ms_IsLoading = (bool*)MmGetHostAddress(0x83367A4C);
|
||||||
ms_IsObjectCollisionRender = (bool*)MmGetHostAddress(0x83367905);
|
ms_IsObjectCollisionRender = (bool*)MmGetHostAddress(0x83367905);
|
||||||
ms_IsRenderDebugDraw = (bool*)MmGetHostAddress(0x8328BB23);
|
ms_IsRenderDebugDraw = (bool*)MmGetHostAddress(0x8328BB23);
|
||||||
ms_IsRenderDebugDrawText = (bool*)MmGetHostAddress(0x8328BB25);
|
ms_IsRenderDebugDrawText = (bool*)MmGetHostAddress(0x8328BB25);
|
||||||
ms_IsRenderDebugPositionDraw = (bool*)MmGetHostAddress(0x8328BB24);
|
ms_IsRenderDebugPositionDraw = (bool*)MmGetHostAddress(0x8328BB24);
|
||||||
|
ms_IsRenderDepthOfField = (bool*)MmGetHostAddress(0x83302720);
|
||||||
ms_IsRenderGameMainHud = (bool*)MmGetHostAddress(0x8328BB27);
|
ms_IsRenderGameMainHud = (bool*)MmGetHostAddress(0x8328BB27);
|
||||||
ms_IsRenderHud = (bool*)MmGetHostAddress(0x8328BB26);
|
ms_IsRenderHud = (bool*)MmGetHostAddress(0x8328BB26);
|
||||||
ms_IsRenderHudPause = (bool*)MmGetHostAddress(0x8328BB28);
|
ms_IsRenderHudPause = (bool*)MmGetHostAddress(0x8328BB28);
|
||||||
|
ms_IsTitleStateMenu = (bool*)MmGetHostAddress(0x83367BC0);
|
||||||
ms_IsTriggerRender = (bool*)MmGetHostAddress(0x83367904);
|
ms_IsTriggerRender = (bool*)MmGetHostAddress(0x83367904);
|
||||||
ms_LightFieldDebug = (bool*)MmGetHostAddress(0x83367BCD);
|
ms_LightFieldDebug = (bool*)MmGetHostAddress(0x83367BCD);
|
||||||
ms_VisualizeLoadedLevel = (bool*)MmGetHostAddress(0x833678C1);
|
ms_VisualizeLoadedLevel = (bool*)MmGetHostAddress(0x833678C1);
|
||||||
|
|||||||
@@ -4,6 +4,15 @@
|
|||||||
|
|
||||||
namespace SWA
|
namespace SWA
|
||||||
{
|
{
|
||||||
|
enum EWindowStatus : uint32_t
|
||||||
|
{
|
||||||
|
eWindowStatus_Closed,
|
||||||
|
eWindowStatus_OpeningMessage = 2,
|
||||||
|
eWindowStatus_DisplayingMessage,
|
||||||
|
eWindowStatus_OpeningControls,
|
||||||
|
eWindowStatus_DisplayingControls
|
||||||
|
};
|
||||||
|
|
||||||
class CGeneralWindow
|
class CGeneralWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -14,5 +23,20 @@ namespace SWA
|
|||||||
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcWindow_2;
|
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcWindow_2;
|
||||||
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcWindowSelect;
|
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcWindowSelect;
|
||||||
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcFooter;
|
Chao::CSD::RCPtr<Chao::CSD::CScene> m_rcFooter;
|
||||||
|
SWA_INSERT_PADDING(0x58);
|
||||||
|
be<EWindowStatus> m_Status;
|
||||||
|
be<uint32_t> m_CursorIndex;
|
||||||
|
SWA_INSERT_PADDING(0x04);
|
||||||
|
be<uint32_t> m_SelectedIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcGeneral, 0xD0);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcBg, 0xD8);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcWindow, 0xE0);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcWindow_2, 0xE8);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcWindowSelect, 0xF0);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_rcFooter, 0xF8);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_Status, 0x158);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_CursorIndex, 0x15C);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGeneralWindow, m_SelectedIndex, 0x164);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA::Message
|
||||||
|
{
|
||||||
|
class MsgCameraPauseMove : public Hedgehog::Universe::MessageTypeSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
bool m_isPaused;
|
||||||
|
|
||||||
|
MsgCameraPauseMove(bool in_isPaused) : m_isPaused(in_isPaused) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgCameraPauseMove, m_isPaused, 0x18);
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA::Message
|
||||||
|
{
|
||||||
|
class MsgPopCameraController : public Hedgehog::Universe::MessageTypeSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
xpointer<CCameraController> m_pCameraController;
|
||||||
|
SWA_INSERT_PADDING(0x08);
|
||||||
|
xpointer<Hedgehog::Base::CSharedString> m_pCameraName;
|
||||||
|
be<float> m_InterpolateTime;
|
||||||
|
bool m_Field2C;
|
||||||
|
bool m_Field2D;
|
||||||
|
bool m_Field2E;
|
||||||
|
|
||||||
|
MsgPopCameraController(CCameraController* in_pCameraController, float in_interpolateTime)
|
||||||
|
: m_pCameraController(in_pCameraController), m_InterpolateTime(in_interpolateTime) {}
|
||||||
|
|
||||||
|
MsgPopCameraController(Hedgehog::Base::CSharedString* in_pCameraName, float in_interpolateTime)
|
||||||
|
: m_pCameraName(in_pCameraName), m_InterpolateTime(in_interpolateTime) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_pCameraController, 0x18);
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_pCameraName, 0x24);
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_InterpolateTime, 0x28);
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2C, 0x2C);
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2D, 0x2D);
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgPopCameraController, m_Field2E, 0x2E);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA::Message
|
||||||
|
{
|
||||||
|
class MsgSetPosition : public Hedgehog::Universe::MessageTypeSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
|
Hedgehog::Math::CVector m_Position;
|
||||||
|
|
||||||
|
MsgSetPosition(const Hedgehog::Math::CVector& in_rPosition) : m_Position(in_rPosition) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgSetPosition, m_Position, 0x20);
|
||||||
|
SWA_ASSERT_SIZEOF(MsgSetPosition, 0x30);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA::Message
|
||||||
|
{
|
||||||
|
class MsgSetVelocity : public Hedgehog::Universe::MessageTypeSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
|
Hedgehog::Math::CVector m_Velocity;
|
||||||
|
|
||||||
|
MsgSetVelocity(const Hedgehog::Math::CVector& in_rVelocity) : m_Velocity(in_rVelocity) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(MsgSetVelocity, m_Velocity, 0x20);
|
||||||
|
SWA_ASSERT_SIZEOF(MsgSetVelocity, 0x30);
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CObjDashPanel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0xE8);
|
||||||
|
be<float> m_FieldE8;
|
||||||
|
be<float> m_Speed;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CObjRollingBarrel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class CElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0xEC);
|
||||||
|
xpointer<void> m_FieldEC;
|
||||||
|
SWA_INSERT_PADDING(0x20);
|
||||||
|
be<float> m_Roll;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_INSERT_PADDING(0xE8);
|
||||||
|
be<float> m_GenerationTime;
|
||||||
|
SWA_INSERT_PADDING(0x09);
|
||||||
|
bool m_FieldF5;
|
||||||
|
SWA_INSERT_PADDING(0x0A);
|
||||||
|
be<float> m_RandomRange;
|
||||||
|
be<float> m_Field104;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel::CElement, m_FieldEC, 0xEC);
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel::CElement, m_Roll, 0x110);
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel, m_GenerationTime, 0xE8);
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel, m_FieldF5, 0xF5);
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel, m_RandomRange, 0x100);
|
||||||
|
SWA_ASSERT_OFFSETOF(CObjRollingBarrel, m_Field104, 0x104);
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "boost/smart_ptr/shared_ptr.h"
|
||||||
|
|
||||||
|
namespace SWA::Player
|
||||||
|
{
|
||||||
|
class CPlayer;
|
||||||
|
|
||||||
|
class CPlayerContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
|
boost::shared_ptr<CMatrixNodeTransform> m_spMatrixNode;
|
||||||
|
SWA_INSERT_PADDING(0x18);
|
||||||
|
boost::anonymous_shared_ptr m_spRayCastCollision;
|
||||||
|
SWA_INSERT_PADDING(0xC8);
|
||||||
|
xpointer<CPlayer> m_pPlayer;
|
||||||
|
SWA_INSERT_PADDING(0xF8);
|
||||||
|
boost::shared_ptr<void> m_spParameter;
|
||||||
|
SWA_INSERT_PADDING(0x0C);
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spMatrixNode, 0x10);
|
||||||
|
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spRayCastCollision, 0x30);
|
||||||
|
SWA_ASSERT_OFFSETOF(CPlayerContext, m_pPlayer, 0x100);
|
||||||
|
SWA_ASSERT_OFFSETOF(CPlayerContext, m_spParameter, 0x1FC);
|
||||||
|
SWA_ASSERT_SIZEOF(CPlayerContext, 0x210);
|
||||||
|
}
|
||||||
@@ -5,19 +5,26 @@
|
|||||||
|
|
||||||
namespace SWA::Player
|
namespace SWA::Player
|
||||||
{
|
{
|
||||||
class CEvilSonicContext // : public CPlayerContext
|
class CEvilSonicContext : public CPlayerContext
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SWA_INSERT_PADDING(0x688);
|
SWA_INSERT_PADDING(0x478);
|
||||||
be<float> m_DarkGaiaEnergy;
|
be<float> m_DarkGaiaEnergy;
|
||||||
SWA_INSERT_PADDING(0x138);
|
SWA_INSERT_PADDING(0x138);
|
||||||
be<uint32_t> m_AnimationID;
|
be<uint32_t> m_AnimationID;
|
||||||
SWA_INSERT_PADDING(0x38);
|
SWA_INSERT_PADDING(0x38);
|
||||||
be<float> m_UnkHudGuideF32;
|
be<float> m_Field800; // Related to EvilHudGuide
|
||||||
be<uint32_t> m_UnkHudGuideU32;
|
be<uint32_t> m_Field804; // Related to EvilHudGuide
|
||||||
SWA_INSERT_PADDING(0x18);
|
SWA_INSERT_PADDING(0x18);
|
||||||
be<EGuideType> m_GuideType;
|
be<EGuideType> m_GuideType;
|
||||||
SWA_INSERT_PADDING(0xA8);
|
SWA_INSERT_PADDING(0xA8);
|
||||||
be<uint32_t> m_OutOfControlCount;
|
be<uint32_t> m_OutOfControlCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_DarkGaiaEnergy, 0x688);
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_AnimationID, 0x7C4);
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_Field800, 0x800);
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_Field804, 0x804);
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_GuideType, 0x820);
|
||||||
|
SWA_ASSERT_OFFSETOF(CEvilSonicContext, m_OutOfControlCount, 0x8CC);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA::Player
|
||||||
|
{
|
||||||
|
class CPlayerSpeedContext : public CPlayerContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// TODO: Hedgehog::Base::TSynchronizedPtr<CGameDocument>
|
||||||
|
static CPlayerSpeedContext* GetInstance();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "PlayerSpeedContext.inl"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace SWA::Player
|
||||||
|
{
|
||||||
|
inline CPlayerSpeedContext* CPlayerSpeedContext::GetInstance()
|
||||||
|
{
|
||||||
|
return *(xpointer<CPlayerSpeedContext>*)MmGetHostAddress(0x83362F98);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
#include "SWA/Camera/Controller/CameraController.h"
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CReplayFreeCamera : public CCameraController
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x90);
|
||||||
|
be<float> m_Speed;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CReplayFreeCamera, m_Speed, 0x160);
|
||||||
|
}
|
||||||
@@ -71,7 +71,8 @@ namespace SWA
|
|||||||
boost::shared_ptr<Hedgehog::Mirage::CMatrixNode> m_spMatrixNodeRoot;
|
boost::shared_ptr<Hedgehog::Mirage::CMatrixNode> m_spMatrixNodeRoot;
|
||||||
SWA_INSERT_PADDING(0x14);
|
SWA_INSERT_PADDING(0x14);
|
||||||
CGammaController m_GammaController;
|
CGammaController m_GammaController;
|
||||||
SWA_INSERT_PADDING(0x1C);
|
boost::shared_ptr<CLoading> m_spLoading;
|
||||||
|
SWA_INSERT_PADDING(0x14);
|
||||||
boost::shared_ptr<Achievement::CManager> m_spAchievementManager;
|
boost::shared_ptr<Achievement::CManager> m_spAchievementManager;
|
||||||
boost::shared_ptr<CDatabaseTree> m_spDatabaseTree;
|
boost::shared_ptr<CDatabaseTree> m_spDatabaseTree;
|
||||||
Hedgehog::Base::CSharedString m_Field10C;
|
Hedgehog::Base::CSharedString m_Field10C;
|
||||||
@@ -104,6 +105,7 @@ namespace SWA
|
|||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_Field74, 0x74);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_Field74, 0x74);
|
||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spMatrixNodeRoot, 0x84);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spMatrixNodeRoot, 0x84);
|
||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_GammaController, 0xA0);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_GammaController, 0xA0);
|
||||||
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spLoading, 0xE0);
|
||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spAchievementManager, 0xFC);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spAchievementManager, 0xFC);
|
||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spDatabaseTree, 0x104);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_spDatabaseTree, 0x104);
|
||||||
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_Field10C, 0x10C);
|
SWA_ASSERT_OFFSETOF(CApplicationDocument::CMember, m_Field10C, 0x10C);
|
||||||
|
|||||||
@@ -34,7 +34,11 @@ namespace SWA
|
|||||||
SWA_INSERT_PADDING(0x88);
|
SWA_INSERT_PADDING(0x88);
|
||||||
Hedgehog::Base::CSharedString m_StageName;
|
Hedgehog::Base::CSharedString m_StageName;
|
||||||
xpointer<CSoundAdministrator> m_pSoundAdministrator;
|
xpointer<CSoundAdministrator> m_pSoundAdministrator;
|
||||||
SWA_INSERT_PADDING(0x124);
|
SWA_INSERT_PADDING(0x48);
|
||||||
|
xpointer<CGeneralWindow> m_pGeneralWindow;
|
||||||
|
SWA_INSERT_PADDING(0xC0);
|
||||||
|
boost::anonymous_shared_ptr m_spPlayerSwitchManager;
|
||||||
|
SWA_INSERT_PADDING(0x10);
|
||||||
SScoreInfo m_ScoreInfo;
|
SScoreInfo m_ScoreInfo;
|
||||||
SWA_INSERT_PADDING(0x0C);
|
SWA_INSERT_PADDING(0x0C);
|
||||||
};
|
};
|
||||||
@@ -60,6 +64,8 @@ namespace SWA
|
|||||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_spDatabase, 0x1C);
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_spDatabase, 0x1C);
|
||||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_StageName, 0xAC);
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_StageName, 0xAC);
|
||||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_pSoundAdministrator, 0xB0);
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_pSoundAdministrator, 0xB0);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_pGeneralWindow, 0xFC);
|
||||||
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_spPlayerSwitchManager, 0x1C0);
|
||||||
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_ScoreInfo, 0x1D8);
|
SWA_ASSERT_OFFSETOF(CGameDocument::CMember, m_ScoreInfo, 0x1D8);
|
||||||
SWA_ASSERT_SIZEOF(CGameDocument::CMember, 0x230);
|
SWA_ASSERT_SIZEOF(CGameDocument::CMember, 0x230);
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,36 @@
|
|||||||
|
|
||||||
namespace SWA
|
namespace SWA
|
||||||
{
|
{
|
||||||
class CTitleMenu
|
class CTitleMenu : public CMenuWindowBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SWA_INSERT_PADDING(0x44);
|
SWA_INSERT_PADDING(0x28);
|
||||||
|
be<uint32_t> m_Field38;
|
||||||
|
bool m_Field3C; // Seems to be related to exit transition.
|
||||||
|
SWA_INSERT_PADDING(0x04);
|
||||||
be<uint32_t> m_CursorIndex;
|
be<uint32_t> m_CursorIndex;
|
||||||
|
SWA_INSERT_PADDING(0x0C);
|
||||||
|
bool m_Field54; // Seems to be related to exit transition.
|
||||||
|
SWA_INSERT_PADDING(0x0B);
|
||||||
|
be<float> m_Field60;
|
||||||
|
SWA_INSERT_PADDING(0x34);
|
||||||
|
bool m_Field98;
|
||||||
|
bool m_IsDeleteCheckMessageOpen;
|
||||||
|
bool m_Field9A; // Seems to be related to cursor selection.
|
||||||
|
SWA_INSERT_PADDING(0x04);
|
||||||
|
bool m_Field9F;
|
||||||
|
SWA_INSERT_PADDING(0x02);
|
||||||
|
bool m_IsDLCInfoMessageOpen;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field38, 0x38);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field3C, 0x3C);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_CursorIndex, 0x44);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field54, 0x54);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field60, 0x60);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field98, 0x98);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_IsDeleteCheckMessageOpen, 0x99);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field9A, 0x9A);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_Field9F, 0x9F);
|
||||||
|
SWA_ASSERT_OFFSETOF(CTitleMenu, m_IsDLCInfoMessageOpen, 0xA2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,5 @@
|
|||||||
|
|
||||||
namespace SWA
|
namespace SWA
|
||||||
{
|
{
|
||||||
class CTitleStateBase : public Hedgehog::Universe::CStateMachineBase::CStateBase
|
class CTitleStateBase : public Hedgehog::Universe::CStateMachineBase::CStateBase {};
|
||||||
{
|
|
||||||
public:
|
|
||||||
class CTitleStateContext
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SWA_INSERT_PADDING(0x1E8);
|
|
||||||
xpointer<CTitleMenu> m_pTitleMenu;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CTitleStateMenu : public CTitleStateBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class CTitleStateMenuContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x1E8);
|
||||||
|
xpointer<CTitleMenu> m_pTitleMenu;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CMatrixNodeTransform : public Hedgehog::Mirage::CMatrixNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Hedgehog::Mirage::CTransform m_Transform;
|
||||||
|
Hedgehog::Math::CMatrix m_WorldMatrix;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CMatrixNodeTransform, m_Transform, 0x60);
|
||||||
|
SWA_ASSERT_OFFSETOF(CMatrixNodeTransform, m_WorldMatrix, 0xC0);
|
||||||
|
SWA_ASSERT_SIZEOF(CMatrixNodeTransform, 0x100);
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SWA.inl>
|
||||||
|
|
||||||
|
namespace SWA
|
||||||
|
{
|
||||||
|
class CFreeCameraTool : public CGameObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SWA_INSERT_PADDING(0x04);
|
||||||
|
xpointer<CFreeCamera> m_pFreeCamera;
|
||||||
|
};
|
||||||
|
|
||||||
|
SWA_ASSERT_OFFSETOF(CFreeCameraTool, m_pFreeCamera, 0xC0);
|
||||||
|
}
|
||||||
+28
-2
@@ -5,6 +5,7 @@
|
|||||||
#include <kernel/function.h>
|
#include <kernel/function.h>
|
||||||
#include <os/process.h>
|
#include <os/process.h>
|
||||||
#include <patches/audio_patches.h>
|
#include <patches/audio_patches.h>
|
||||||
|
#include <patches/free_camera_patches.h>
|
||||||
#include <patches/inspire_patches.h>
|
#include <patches/inspire_patches.h>
|
||||||
#include <ui/game_window.h>
|
#include <ui/game_window.h>
|
||||||
#include <user/config.h>
|
#include <user/config.h>
|
||||||
@@ -28,7 +29,7 @@ void App::Exit()
|
|||||||
std::_Exit(0);
|
std::_Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SWA::CApplication
|
// SWA::CApplication::CApplication
|
||||||
PPC_FUNC_IMPL(__imp__sub_824EB490);
|
PPC_FUNC_IMPL(__imp__sub_824EB490);
|
||||||
PPC_FUNC(sub_824EB490)
|
PPC_FUNC(sub_824EB490)
|
||||||
{
|
{
|
||||||
@@ -69,12 +70,37 @@ PPC_FUNC(sub_822C1130)
|
|||||||
{
|
{
|
||||||
SDL_PumpEvents();
|
SDL_PumpEvents();
|
||||||
SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
|
SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
|
||||||
|
GameWindow::Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
GameWindow::Update();
|
|
||||||
AudioPatches::Update(App::s_deltaTime);
|
AudioPatches::Update(App::s_deltaTime);
|
||||||
|
FreeCameraPatches::Update();
|
||||||
InspirePatches::Update();
|
InspirePatches::Update();
|
||||||
|
|
||||||
|
// Apply subtitles option.
|
||||||
|
if (auto pApplicationDocument = SWA::CApplicationDocument::GetInstance())
|
||||||
|
pApplicationDocument->m_InspireSubtitles = Config::Subtitles;
|
||||||
|
|
||||||
|
if (Config::EnableEventCollisionDebugView)
|
||||||
|
*SWA::SGlobals::ms_IsTriggerRender = true;
|
||||||
|
|
||||||
|
if (Config::EnableGIMipLevelDebugView)
|
||||||
|
*SWA::SGlobals::ms_VisualizeLoadedLevel = true;
|
||||||
|
|
||||||
|
if (Config::EnableObjectCollisionDebugView)
|
||||||
|
*SWA::SGlobals::ms_IsObjectCollisionRender = true;
|
||||||
|
|
||||||
|
if (Config::EnableStageCollisionDebugView)
|
||||||
|
*SWA::SGlobals::ms_IsCollisionRender = true;
|
||||||
|
|
||||||
__imp__sub_822C1130(ctx, base);
|
__imp__sub_822C1130(ctx, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SWA::CGameModeStage::CGameModeStage
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82541138);
|
||||||
|
PPC_FUNC(sub_82541138)
|
||||||
|
{
|
||||||
|
App::s_pGameModeStage = (SWA::CGameModeStage*)g_memory.Translate(ctx.r3.u32);
|
||||||
|
|
||||||
|
__imp__sub_82541138(ctx, base);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <api/SWA.h>
|
||||||
#include <user/config.h>
|
#include <user/config.h>
|
||||||
|
|
||||||
class App
|
class App
|
||||||
@@ -8,9 +9,11 @@ public:
|
|||||||
static inline bool s_isInit;
|
static inline bool s_isInit;
|
||||||
static inline bool s_isMissingDLC;
|
static inline bool s_isMissingDLC;
|
||||||
static inline bool s_isLoading;
|
static inline bool s_isLoading;
|
||||||
static inline bool s_isWerehog;
|
|
||||||
static inline bool s_isSaveDataCorrupt;
|
static inline bool s_isSaveDataCorrupt;
|
||||||
|
|
||||||
|
static inline SWA::CGameModeStage* s_pGameModeStage;
|
||||||
|
static inline SWA::Player::CEvilSonicContext* s_pEvilSonicContext;
|
||||||
|
|
||||||
static inline ELanguage s_language;
|
static inline ELanguage s_language;
|
||||||
|
|
||||||
static inline double s_deltaTime;
|
static inline double s_deltaTime;
|
||||||
|
|||||||
@@ -165,11 +165,7 @@ int GetThreadPriorityImpl(GuestThreadHandle* hThread)
|
|||||||
|
|
||||||
uint32_t SetThreadIdealProcessorImpl(GuestThreadHandle* hThread, uint32_t dwIdealProcessor)
|
uint32_t SetThreadIdealProcessorImpl(GuestThreadHandle* hThread, uint32_t dwIdealProcessor)
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
|
||||||
return SetThreadIdealProcessor(hThread == GetKernelObject(CURRENT_THREAD_HANDLE) ? GetCurrentThread() : hThread->thread.native_handle(), dwIdealProcessor);
|
|
||||||
#else
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GUEST_FUNCTION_HOOK(sub_82DFA2E8, SetThreadNameImpl);
|
GUEST_FUNCTION_HOOK(sub_82DFA2E8, SetThreadNameImpl);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <kernel/heap.h>
|
#include <kernel/heap.h>
|
||||||
#include <kernel/memory.h>
|
#include <kernel/memory.h>
|
||||||
#include <ui/game_window.h>
|
#include <ui/game_window.h>
|
||||||
|
#include <patches/inspire_patches.h>
|
||||||
|
|
||||||
void Game_PlaySound(const char* pName)
|
void Game_PlaySound(const char* pName)
|
||||||
{
|
{
|
||||||
@@ -14,8 +15,11 @@ void Game_PlaySound(const char* pName)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Use EVENT category in cutscenes since SYSTEM gets muted by the game.
|
||||||
|
uint32_t category = !InspirePatches::s_sceneName.empty() ? 10 : 7;
|
||||||
|
|
||||||
guest_stack_var<boost::anonymous_shared_ptr> soundPlayer;
|
guest_stack_var<boost::anonymous_shared_ptr> soundPlayer;
|
||||||
GuestToHostFunction<void>(sub_82B4DF50, soundPlayer.get(), ((be<uint32_t>*)g_memory.Translate(0x83367900))->get(), 7, 0, 0);
|
GuestToHostFunction<void>(sub_82B4DF50, soundPlayer.get(), ((be<uint32_t>*)g_memory.Translate(0x83367900))->get(), category, 0, 0);
|
||||||
|
|
||||||
auto soundPlayerVtable = (be<uint32_t>*)g_memory.Translate(*(be<uint32_t>*)soundPlayer->get());
|
auto soundPlayerVtable = (be<uint32_t>*)g_memory.Translate(*(be<uint32_t>*)soundPlayer->get());
|
||||||
uint32_t virtualFunction = *(soundPlayerVtable + 1);
|
uint32_t virtualFunction = *(soundPlayerVtable + 1);
|
||||||
@@ -27,13 +31,3 @@ void Game_PlaySound(const char* pName)
|
|||||||
g_userHeap.Free(strAllocation);
|
g_userHeap.Free(strAllocation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window_SetDisplay(int displayIndex)
|
|
||||||
{
|
|
||||||
GameWindow::SetDisplay(displayIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Window_SetFullscreen(bool isEnabled)
|
|
||||||
{
|
|
||||||
GameWindow::SetFullscreen(isEnabled);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void Game_PlaySound(const char* pName);
|
void Game_PlaySound(const char* pName);
|
||||||
void Window_SetDisplay(int displayIndex);
|
|
||||||
void Window_SetFullscreen(bool isEnabled);
|
|
||||||
|
|||||||
@@ -15,10 +15,13 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x36DB3B40FA419EF6),reinterpret_cast<GuestShader*>(0x4FDE8FFB7DC1D1CE),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x36DB3B40FA419EF6),reinterpret_cast<GuestShader*>(0x4FDE8FFB7DC1D1CE),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x36DB3B40FA419EF6),reinterpret_cast<GuestShader*>(0xD56D0D7219E51F1D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x36DB3B40FA419EF6),reinterpret_cast<GuestShader*>(0xD56D0D7219E51F1D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x115813F8DBF6CCFF),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x115813F8DBF6CCFF),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x3073F2C856F3333E),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x3382CD5552FAB33C),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x3382CD5552FAB33C),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x6563290A54293E7A),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x7A8F23548FF778),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x7A8F23548FF778),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x85E3EE1021089A76),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x85E3EE1021089A76),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x933E17818464BC39),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0x933E17818464BC39),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
@@ -27,6 +30,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xB8F71746F39A1166),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xB8F71746F39A1166),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xF9F82EC882CD3D08),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xF9F82EC882CD3D08),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xF9F82EC882CD3D08),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x3A4537B51DE9818),reinterpret_cast<GuestShader*>(0xF9F82EC882CD3D08),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x40E4064FE517DFD2),reinterpret_cast<GuestShader*>(0x11958CFF684E1F4B),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x28FD2057B9BD5D1B),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x28FD2057B9BD5D1B),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x2A6D72391BFFFA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x2A6D72391BFFFA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x2A6D72391BFFFA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x4620B236DC38100C),reinterpret_cast<GuestShader*>(0xBBDB735BEACC8F41),reinterpret_cast<GuestVertexDeclaration*>(0x2A6D72391BFFFA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
@@ -53,11 +57,13 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x624F608ACB374E12),reinterpret_cast<GuestShader*>(0xA624AF834723B59),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x2CA0127E60EB4507),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x2E5AA3C0A9E32751),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x2E5AA3C0A9E32751),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x326BB3169FF92317),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x326BB3169FF92317),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x3838E2D27966B21C),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x3838E2D27966B21C),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x5A75A52C3F722625),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x5A75A52C3F722625),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x86CD1B8641C60EE6),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x86CD1B8641C60EE6),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0x874793F8CC9C7EB0),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB0F7121362A63137),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB0F7121362A63137),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB0F7121362A63137),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB0F7121362A63137),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB23ACF01C99C2988),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xB23ACF01C99C2988),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
@@ -65,6 +71,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xC03A891201D4E9E7),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xC03A891201D4E9E7),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xCE7A73C836F03E6),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xCE7A73C836F03E6),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xD4D1534DD857403),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xD4D1534DD857403),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xD4D1534DD857403),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xD4D1534DD857403),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xD4D1534DD857403),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xE1748A1E1E38FC5F),reinterpret_cast<GuestVertexDeclaration*>(0x6538EB0019C3A29A),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xE1748A1E1E38FC5F),reinterpret_cast<GuestVertexDeclaration*>(0x6538EB0019C3A29A),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xE1748A1E1E38FC5F),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0x666E7FB7FCAE0FB7),reinterpret_cast<GuestShader*>(0xE1748A1E1E38FC5F),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
@@ -94,6 +101,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0x9FA5AACB5B14A226),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0x9FA5AACB5B14A226),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0xC47F2F91BA2A5D86),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0xC47F2F91BA2A5D86),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0xFB79F59782376846),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0xFB79F59782376846),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x6DE86503F8AA38E2),reinterpret_cast<GuestShader*>(0xFF42BE2DBCE820C9),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x720D6E5EDA78433B),reinterpret_cast<GuestShader*>(0x96EACBACDE1AAFAA),reinterpret_cast<GuestVertexDeclaration*>(0xA81F28FA43A9B511),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x720D6E5EDA78433B),reinterpret_cast<GuestShader*>(0x96EACBACDE1AAFAA),reinterpret_cast<GuestVertexDeclaration*>(0xA81F28FA43A9B511),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x720D6E5EDA78433B),reinterpret_cast<GuestShader*>(0x96EACBACDE1AAFAA),reinterpret_cast<GuestVertexDeclaration*>(0xA81F28FA43A9B511),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
{ reinterpret_cast<GuestShader*>(0x720D6E5EDA78433B),reinterpret_cast<GuestShader*>(0x96EACBACDE1AAFAA),reinterpret_cast<GuestVertexDeclaration*>(0xA81F28FA43A9B511),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x734799D14CC5177E),reinterpret_cast<GuestShader*>(0xC9978EB328E1066E),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x734799D14CC5177E),reinterpret_cast<GuestShader*>(0xC9978EB328E1066E),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
@@ -104,6 +112,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0x86FE3502D5EC24AA),reinterpret_cast<GuestShader*>(0x68FCC0B90EBC457B),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x86FE3502D5EC24AA),reinterpret_cast<GuestShader*>(0x68FCC0B90EBC457B),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x86FE3502D5EC24AA),reinterpret_cast<GuestShader*>(0x94A71CC9B94E3101),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x86FE3502D5EC24AA),reinterpret_cast<GuestShader*>(0x94A71CC9B94E3101),reinterpret_cast<GuestVertexDeclaration*>(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x88F67387B88F932F),reinterpret_cast<GuestShader*>(0x49101E452DF2FE98),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x88F67387B88F932F),reinterpret_cast<GuestShader*>(0x49101E452DF2FE98),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0x8E4BB23465BD909E),reinterpret_cast<GuestShader*>(0x0),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::FRONT,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x8E4BB23465BD909E),reinterpret_cast<GuestShader*>(0x0),reinterpret_cast<GuestVertexDeclaration*>(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_LIST,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x8E4BB23465BD909E),reinterpret_cast<GuestShader*>(0x0),reinterpret_cast<GuestVertexDeclaration*>(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_LIST,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x8E4BB23465BD909E),reinterpret_cast<GuestShader*>(0x0),reinterpret_cast<GuestVertexDeclaration*>(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 },
|
{ reinterpret_cast<GuestShader*>(0x8E4BB23465BD909E),reinterpret_cast<GuestShader*>(0x0),reinterpret_cast<GuestVertexDeclaration*>(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 },
|
||||||
{ reinterpret_cast<GuestShader*>(0x8EA8F71BA3BE59E7),reinterpret_cast<GuestShader*>(0xA557DD8B24CD2B25),reinterpret_cast<GuestVertexDeclaration*>(0xEC0CD05EE1B1636),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_LIST,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::UNKNOWN,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0x8EA8F71BA3BE59E7),reinterpret_cast<GuestShader*>(0xA557DD8B24CD2B25),reinterpret_cast<GuestVertexDeclaration*>(0xEC0CD05EE1B1636),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_LIST,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::UNKNOWN,1,false,0x10 },
|
||||||
@@ -145,6 +154,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0xA4CF0215A03D9571),reinterpret_cast<GuestShader*>(0xA3A659F1590CC180),reinterpret_cast<GuestVertexDeclaration*>(0x5A2395E29F93DA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_FAN,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0xA4CF0215A03D9571),reinterpret_cast<GuestShader*>(0xA3A659F1590CC180),reinterpret_cast<GuestVertexDeclaration*>(0x5A2395E29F93DA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_FAN,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xA59B07C00039C660),reinterpret_cast<GuestShader*>(0x2E69CC2B4937A698),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xA59B07C00039C660),reinterpret_cast<GuestShader*>(0x2E69CC2B4937A698),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xA59B07C00039C660),reinterpret_cast<GuestShader*>(0xF6FAD0CDA667264),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xA59B07C00039C660),reinterpret_cast<GuestShader*>(0xF6FAD0CDA667264),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0xA790E2F622DADAD8),reinterpret_cast<GuestShader*>(0xD56D0D7219E51F1D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xA7C9D01F7AD3B9D0),reinterpret_cast<GuestShader*>(0x481905CF40E1678D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
{ reinterpret_cast<GuestShader*>(0xA7C9D01F7AD3B9D0),reinterpret_cast<GuestShader*>(0x481905CF40E1678D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xA7C9D01F7AD3B9D0),reinterpret_cast<GuestShader*>(0x481905CF40E1678D),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xA7C9D01F7AD3B9D0),reinterpret_cast<GuestShader*>(0x481905CF40E1678D),reinterpret_cast<GuestVertexDeclaration*>(0xC64D046063DE2F63),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xAC38B793E9C54AC5),reinterpret_cast<GuestShader*>(0x24CAF5A2F1B2AF40),reinterpret_cast<GuestVertexDeclaration*>(0x3CB3EF6B1C43B8C),true,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0xAC38B793E9C54AC5),reinterpret_cast<GuestShader*>(0x24CAF5A2F1B2AF40),reinterpret_cast<GuestVertexDeclaration*>(0x3CB3EF6B1C43B8C),true,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
@@ -163,6 +173,8 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0xBE3AD1D0FE788D2),reinterpret_cast<GuestShader*>(0x4CB3784D7108745F),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xBE3AD1D0FE788D2),reinterpret_cast<GuestShader*>(0x4CB3784D7108745F),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xBE3AD1D0FE788D2),reinterpret_cast<GuestShader*>(0xD57D71ED84D8F864),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xBE3AD1D0FE788D2),reinterpret_cast<GuestShader*>(0xD57D71ED84D8F864),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xCF28F33974EC44F6),reinterpret_cast<GuestShader*>(0xD5EA32DB758EF0B8),reinterpret_cast<GuestVertexDeclaration*>(0x7F12180DC3A24B53),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
{ reinterpret_cast<GuestShader*>(0xCF28F33974EC44F6),reinterpret_cast<GuestShader*>(0xD5EA32DB758EF0B8),reinterpret_cast<GuestVertexDeclaration*>(0x7F12180DC3A24B53),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x47CDF40D1C605E0D),reinterpret_cast<GuestVertexDeclaration*>(0xFB4544424558E4C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x96B8F9FDAAB9B658),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
{ reinterpret_cast<GuestShader*>(0xD738D79626374EBE),reinterpret_cast<GuestShader*>(0x96B8F9FDAAB9B658),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 },
|
||||||
@@ -196,6 +208,7 @@
|
|||||||
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0x4C4032F88196B450),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0x4C4032F88196B450),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0xC7E2C782C058A625),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0xC7E2C782C058A625),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0xFB66DF5D27D3891D),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xECC9C0BD668FE449),reinterpret_cast<GuestShader*>(0xFB66DF5D27D3891D),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
|
{ reinterpret_cast<GuestShader*>(0xF060DE53CF3B9BB8),reinterpret_cast<GuestShader*>(0xEAADA73091BF526C),reinterpret_cast<GuestVertexDeclaration*>(0xDEB308DCDDF979C7),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xF066433D33B62D54),reinterpret_cast<GuestShader*>(0xE5256B7D753C9D5F),reinterpret_cast<GuestVertexDeclaration*>(0x3CB3EF6B1C43B8C),true,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0xF066433D33B62D54),reinterpret_cast<GuestShader*>(0xE5256B7D753C9D5F),reinterpret_cast<GuestVertexDeclaration*>(0x3CB3EF6B1C43B8C),true,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xF1D7C544D61D055C),reinterpret_cast<GuestShader*>(0x5A75A52C3F722625),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
{ reinterpret_cast<GuestShader*>(0xF1D7C544D61D055C),reinterpret_cast<GuestShader*>(0x5A75A52C3F722625),reinterpret_cast<GuestVertexDeclaration*>(0xF10787EFFEEC0153),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 },
|
||||||
{ reinterpret_cast<GuestShader*>(0xF58C10092C9EF1AF),reinterpret_cast<GuestShader*>(0x1DD6832FA7E79530),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
{ reinterpret_cast<GuestShader*>(0xF58C10092C9EF1AF),reinterpret_cast<GuestShader*>(0x1DD6832FA7E79530),reinterpret_cast<GuestVertexDeclaration*>(0x84BACD816D86543C),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 },
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback)
|
|||||||
auto& callbackData = g_callbackData[g_callbackDataIndex];
|
auto& callbackData = g_callbackData[g_callbackDataIndex];
|
||||||
++g_callbackDataIndex;
|
++g_callbackDataIndex;
|
||||||
|
|
||||||
ImGui::GetForegroundDrawList()->AddCallback(reinterpret_cast<ImDrawCallback>(callback), callbackData.get());
|
ImGui::GetBackgroundDrawList()->AddCallback(reinterpret_cast<ImDrawCallback>(callback), callbackData.get());
|
||||||
|
|
||||||
return callbackData.get();
|
return callbackData.get();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define IMGUI_SHADER_MODIFIER_NONE 0
|
#define IMGUI_SHADER_MODIFIER_NONE 0
|
||||||
#define IMGUI_SHADER_MODIFIER_SCANLINE 1
|
#define IMGUI_SHADER_MODIFIER_SCANLINE 1
|
||||||
#define IMGUI_SHADER_MODIFIER_CHECKERBOARD 2
|
#define IMGUI_SHADER_MODIFIER_CHECKERBOARD 2
|
||||||
#define IMGUI_SHADER_MODIFIER_SCANLINE_BUTTON 3
|
#define IMGUI_SHADER_MODIFIER_SCANLINE_BUTTON 3
|
||||||
#define IMGUI_SHADER_MODIFIER_TEXT_SKEW 4
|
#define IMGUI_SHADER_MODIFIER_TEXT_SKEW 4
|
||||||
#define IMGUI_SHADER_MODIFIER_MARQUEE_FADE 5
|
#define IMGUI_SHADER_MODIFIER_HORIZONTAL_MARQUEE_FADE 5
|
||||||
#define IMGUI_SHADER_MODIFIER_GRAYSCALE 6
|
#define IMGUI_SHADER_MODIFIER_VERTICAL_MARQUEE_FADE 6
|
||||||
#define IMGUI_SHADER_MODIFIER_TITLE_BEVEL 7
|
#define IMGUI_SHADER_MODIFIER_GRAYSCALE 7
|
||||||
#define IMGUI_SHADER_MODIFIER_CATEGORY_BEVEL 8
|
#define IMGUI_SHADER_MODIFIER_TITLE_BEVEL 8
|
||||||
#define IMGUI_SHADER_MODIFIER_RECTANGLE_BEVEL 9
|
#define IMGUI_SHADER_MODIFIER_CATEGORY_BEVEL 9
|
||||||
|
#define IMGUI_SHADER_MODIFIER_RECTANGLE_BEVEL 10
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
|||||||
@@ -221,6 +221,8 @@ static bool FontBuilder_Build(ImFontAtlas* atlas)
|
|||||||
for (size_t i = 0; i < atlas->ConfigData.size(); i++)
|
for (size_t i = 0; i < atlas->ConfigData.size(); i++)
|
||||||
{
|
{
|
||||||
auto& config = atlas->ConfigData[i];
|
auto& config = atlas->ConfigData[i];
|
||||||
|
bool increaseSpacing = strstr(config.Name, "Seurat") != nullptr;
|
||||||
|
|
||||||
auto& [index, count] = ranges[i];
|
auto& [index, count] = ranges[i];
|
||||||
for (size_t j = 0; j < count; j++)
|
for (size_t j = 0; j < count; j++)
|
||||||
{
|
{
|
||||||
@@ -228,6 +230,11 @@ static bool FontBuilder_Build(ImFontAtlas* atlas)
|
|||||||
double x0, y0, x1, y1, u0, v0, u1, v1;
|
double x0, y0, x1, y1, u0, v0, u1, v1;
|
||||||
glyph.getQuadPlaneBounds(x0, y0, x1, y1);
|
glyph.getQuadPlaneBounds(x0, y0, x1, y1);
|
||||||
glyph.getQuadAtlasBounds(u0, v0, u1, v1);
|
glyph.getQuadAtlasBounds(u0, v0, u1, v1);
|
||||||
|
|
||||||
|
double advance = glyph.getAdvance();
|
||||||
|
if (increaseSpacing && glyph.getCodepoint() == ' ')
|
||||||
|
advance *= 1.5;
|
||||||
|
|
||||||
config.DstFont->AddGlyph(
|
config.DstFont->AddGlyph(
|
||||||
&config,
|
&config,
|
||||||
glyph.getCodepoint(),
|
glyph.getCodepoint(),
|
||||||
@@ -239,7 +246,7 @@ static bool FontBuilder_Build(ImFontAtlas* atlas)
|
|||||||
v1 / packer.height,
|
v1 / packer.height,
|
||||||
u1 / packer.width,
|
u1 / packer.width,
|
||||||
v0 / packer.height,
|
v0 / packer.height,
|
||||||
glyph.getAdvance());
|
advance);
|
||||||
}
|
}
|
||||||
|
|
||||||
config.DstFont->BuildLookupTable();
|
config.DstFont->BuildLookupTable();
|
||||||
|
|||||||
@@ -27,6 +27,8 @@
|
|||||||
//# define D3D12_DEBUG_LAYER_GPU_BASED_VALIDATION_ENABLED
|
//# define D3D12_DEBUG_LAYER_GPU_BASED_VALIDATION_ENABLED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//#define D3D12_DEBUG_SET_STABLE_POWER_STATE
|
||||||
|
|
||||||
// Old Windows SDK versions don't provide this macro, so we workaround it by making sure it is defined.
|
// Old Windows SDK versions don't provide this macro, so we workaround it by making sure it is defined.
|
||||||
#ifndef D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE
|
#ifndef D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE
|
||||||
#define D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE (D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)
|
#define D3D12_RESOURCE_STATE_ALL_SHADER_RESOURCE (D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)
|
||||||
@@ -692,6 +694,20 @@ namespace plume {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static D3D12_RESOLVE_MODE toD3D12(RenderResolveMode resolveMode) {
|
||||||
|
switch (resolveMode) {
|
||||||
|
case RenderResolveMode::MIN:
|
||||||
|
return D3D12_RESOLVE_MODE_MIN;
|
||||||
|
case RenderResolveMode::MAX:
|
||||||
|
return D3D12_RESOLVE_MODE_MAX;
|
||||||
|
case RenderResolveMode::AVERAGE:
|
||||||
|
return D3D12_RESOLVE_MODE_AVERAGE;
|
||||||
|
default:
|
||||||
|
assert(false && "Unknown resolve mode.");
|
||||||
|
return D3D12_RESOLVE_MODE_AVERAGE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void setObjectName(ID3D12Object *object, const std::string &name) {
|
static void setObjectName(ID3D12Object *object, const std::string &name) {
|
||||||
const std::wstring wideCharName = Utf8ToUtf16(name);
|
const std::wstring wideCharName = Utf8ToUtf16(name);
|
||||||
object->SetName(wideCharName.c_str());
|
object->SetName(wideCharName.c_str());
|
||||||
@@ -1421,6 +1437,52 @@ namespace plume {
|
|||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// D3D12QueryPool
|
||||||
|
|
||||||
|
D3D12QueryPool::D3D12QueryPool(D3D12Device *device, uint32_t queryCount) {
|
||||||
|
assert(device != nullptr);
|
||||||
|
assert(queryCount > 0);
|
||||||
|
|
||||||
|
this->device = device;
|
||||||
|
|
||||||
|
D3D12_QUERY_HEAP_DESC queryHeapDesc = {};
|
||||||
|
queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP;
|
||||||
|
queryHeapDesc.Count = queryCount;
|
||||||
|
|
||||||
|
HRESULT res = device->d3d->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&d3d));
|
||||||
|
if (FAILED(res)) {
|
||||||
|
fprintf(stderr, "CreateQueryHeap failed with error code 0x%lX.\n", res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
readbackBuffer = device->createBuffer(RenderBufferDesc::ReadbackBuffer(sizeof(uint64_t) * queryCount));
|
||||||
|
results.resize(queryCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12QueryPool::~D3D12QueryPool() {
|
||||||
|
if (d3d != nullptr) {
|
||||||
|
d3d->Release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void D3D12QueryPool::queryResults() {
|
||||||
|
void *readbackData = readbackBuffer->map();
|
||||||
|
memcpy(results.data(), readbackData, sizeof(uint64_t) * results.size());
|
||||||
|
readbackBuffer->unmap();
|
||||||
|
|
||||||
|
for (uint64_t &result : results) {
|
||||||
|
result = result / double(device->timestampFrequency) * 1000000000.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t *D3D12QueryPool::getResults() const {
|
||||||
|
return results.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t D3D12QueryPool::getCount() const {
|
||||||
|
return uint32_t(results.size());
|
||||||
|
}
|
||||||
|
|
||||||
// D3D12CommandList
|
// D3D12CommandList
|
||||||
|
|
||||||
D3D12CommandList::D3D12CommandList(D3D12Device *device, RenderCommandListType type) {
|
D3D12CommandList::D3D12CommandList(D3D12Device *device, RenderCommandListType type) {
|
||||||
@@ -1916,7 +1978,7 @@ namespace plume {
|
|||||||
resetSamplePositions();
|
resetSamplePositions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D12CommandList::resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect) {
|
void D3D12CommandList::resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) {
|
||||||
assert(dstTexture != nullptr);
|
assert(dstTexture != nullptr);
|
||||||
assert(srcTexture != nullptr);
|
assert(srcTexture != nullptr);
|
||||||
|
|
||||||
@@ -1931,7 +1993,7 @@ namespace plume {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setSamplePositions(interfaceDstTexture);
|
setSamplePositions(interfaceDstTexture);
|
||||||
d3d->ResolveSubresourceRegion(interfaceDstTexture->d3d, 0, dstX, dstY, interfaceSrcTexture->d3d, 0, (srcRect != nullptr) ? &rect : nullptr, toDXGI(interfaceDstTexture->desc.format), D3D12_RESOLVE_MODE_AVERAGE);
|
d3d->ResolveSubresourceRegion(interfaceDstTexture->d3d, 0, dstX, dstY, interfaceSrcTexture->d3d, 0, (srcRect != nullptr) ? &rect : nullptr, toDXGI(interfaceDstTexture->desc.format), toD3D12(resolveMode));
|
||||||
resetSamplePositions();
|
resetSamplePositions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1988,6 +2050,19 @@ namespace plume {
|
|||||||
d3d->DiscardResource(interfaceTexture->d3d, nullptr);
|
d3d->DiscardResource(interfaceTexture->d3d, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void D3D12CommandList::resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
void D3D12CommandList::writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) {
|
||||||
|
assert(queryPool != nullptr);
|
||||||
|
|
||||||
|
const D3D12QueryPool *interfaceQueryPool = static_cast<const D3D12QueryPool *>(queryPool);
|
||||||
|
const D3D12Buffer *readbackBuffer = static_cast<const D3D12Buffer *>(interfaceQueryPool->readbackBuffer.get());
|
||||||
|
d3d->EndQuery(interfaceQueryPool->d3d, D3D12_QUERY_TYPE_TIMESTAMP, queryIndex);
|
||||||
|
d3d->ResolveQueryData(interfaceQueryPool->d3d, D3D12_QUERY_TYPE_TIMESTAMP, queryIndex, 1, readbackBuffer->d3d, queryIndex * sizeof(uint64_t));
|
||||||
|
}
|
||||||
|
|
||||||
void D3D12CommandList::checkDescriptorHeaps() {
|
void D3D12CommandList::checkDescriptorHeaps() {
|
||||||
if (!descriptorHeapsSet) {
|
if (!descriptorHeapsSet) {
|
||||||
ID3D12DescriptorHeap *descriptorHeaps[] = { device->viewHeapAllocator->heap, device->samplerHeapAllocator->heap };
|
ID3D12DescriptorHeap *descriptorHeaps[] = { device->viewHeapAllocator->heap, device->samplerHeapAllocator->heap };
|
||||||
@@ -3243,7 +3318,7 @@ namespace plume {
|
|||||||
|
|
||||||
// D3D12Device
|
// D3D12Device
|
||||||
|
|
||||||
D3D12Device::D3D12Device(D3D12Interface *renderInterface) {
|
D3D12Device::D3D12Device(D3D12Interface *renderInterface, const std::string &preferredDeviceName) {
|
||||||
assert(renderInterface != nullptr);
|
assert(renderInterface != nullptr);
|
||||||
|
|
||||||
this->renderInterface = renderInterface;
|
this->renderInterface = renderInterface;
|
||||||
@@ -3333,9 +3408,10 @@ namespace plume {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pick this adapter and device if it has better feature support than the current one.
|
// Pick this adapter and device if it has better feature support than the current one.
|
||||||
|
std::string deviceName = Utf16ToUtf8(adapterDesc.Description);
|
||||||
bool preferOverNothing = (adapter == nullptr) || (d3d == nullptr);
|
bool preferOverNothing = (adapter == nullptr) || (d3d == nullptr);
|
||||||
bool preferVideoMemory = adapterDesc.DedicatedVideoMemory > description.dedicatedVideoMemory;
|
bool preferVideoMemory = adapterDesc.DedicatedVideoMemory > description.dedicatedVideoMemory;
|
||||||
bool preferUserChoice = false;//wcsstr(adapterDesc.Description, L"AMD") != nullptr;
|
bool preferUserChoice = preferredDeviceName == deviceName;
|
||||||
bool preferOption = preferOverNothing || preferVideoMemory || preferUserChoice;
|
bool preferOption = preferOverNothing || preferVideoMemory || preferUserChoice;
|
||||||
if (preferOption) {
|
if (preferOption) {
|
||||||
if (d3d != nullptr) {
|
if (d3d != nullptr) {
|
||||||
@@ -3355,8 +3431,15 @@ namespace plume {
|
|||||||
capabilities.triangleFan = triangleFanSupportOption;
|
capabilities.triangleFan = triangleFanSupportOption;
|
||||||
capabilities.dynamicDepthBias = dynamicDepthBiasOption;
|
capabilities.dynamicDepthBias = dynamicDepthBiasOption;
|
||||||
capabilities.uma = uma;
|
capabilities.uma = uma;
|
||||||
description.name = Utf16ToUtf8(adapterDesc.Description);
|
description.name = deviceName;
|
||||||
description.dedicatedVideoMemory = adapterDesc.DedicatedVideoMemory;
|
description.dedicatedVideoMemory = adapterDesc.DedicatedVideoMemory;
|
||||||
|
description.vendor = RenderDeviceVendor(adapterDesc.VendorId);
|
||||||
|
|
||||||
|
LARGE_INTEGER adapterVersion = {};
|
||||||
|
res = adapter->CheckInterfaceSupport(__uuidof(IDXGIDevice), &adapterVersion);
|
||||||
|
if (SUCCEEDED(res)) {
|
||||||
|
description.driverVersion = adapterVersion.QuadPart;
|
||||||
|
}
|
||||||
|
|
||||||
if (preferUserChoice) {
|
if (preferUserChoice) {
|
||||||
break;
|
break;
|
||||||
@@ -3373,6 +3456,10 @@ namespace plume {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef D3D12_DEBUG_SET_STABLE_POWER_STATE
|
||||||
|
d3d->SetStablePowerState(TRUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
D3D12MA::ALLOCATOR_DESC allocatorDesc = {};
|
D3D12MA::ALLOCATOR_DESC allocatorDesc = {};
|
||||||
allocatorDesc.pDevice = d3d;
|
allocatorDesc.pDevice = d3d;
|
||||||
allocatorDesc.pAdapter = adapter;
|
allocatorDesc.pAdapter = adapter;
|
||||||
@@ -3440,6 +3527,13 @@ namespace plume {
|
|||||||
samplerHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, SamplerDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
|
samplerHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, SamplerDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
|
||||||
colorTargetHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, TargetDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
colorTargetHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, TargetDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
|
||||||
depthTargetHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, TargetDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
|
depthTargetHeapAllocator = std::make_unique<D3D12DescriptorHeapAllocator>(this, TargetDescriptorHeapSize, D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
|
||||||
|
|
||||||
|
// Create a command queue only for retrieving the timestamp frequency. Delete it immediately afterwards.
|
||||||
|
std::unique_ptr<D3D12CommandQueue> timestampCommandQueue = std::make_unique<D3D12CommandQueue>(this, RenderCommandListType::DIRECT);
|
||||||
|
res = timestampCommandQueue->d3d->GetTimestampFrequency(×tampFrequency);
|
||||||
|
if (FAILED(res)) {
|
||||||
|
fprintf(stderr, "GetTimestampFrequency failed with error code 0x%lX. Timestamps will be inaccurate.\n", res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12Device::~D3D12Device() {
|
D3D12Device::~D3D12Device() {
|
||||||
@@ -3514,6 +3608,10 @@ namespace plume {
|
|||||||
return std::make_unique<D3D12Framebuffer>(this, desc);
|
return std::make_unique<D3D12Framebuffer>(this, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<RenderQueryPool> D3D12Device::createQueryPool(uint32_t queryCount) {
|
||||||
|
return std::make_unique<D3D12QueryPool>(this, queryCount);
|
||||||
|
}
|
||||||
|
|
||||||
void D3D12Device::setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) {
|
void D3D12Device::setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) {
|
||||||
assert(meshes != nullptr);
|
assert(meshes != nullptr);
|
||||||
assert(meshCount > 0);
|
assert(meshCount > 0);
|
||||||
@@ -3747,6 +3845,21 @@ namespace plume {
|
|||||||
|
|
||||||
// Fill capabilities.
|
// Fill capabilities.
|
||||||
capabilities.shaderFormat = RenderShaderFormat::DXIL;
|
capabilities.shaderFormat = RenderShaderFormat::DXIL;
|
||||||
|
|
||||||
|
// Fill device names.
|
||||||
|
UINT adapterIndex = 0;
|
||||||
|
IDXGIAdapter1 *adapterOption = nullptr;
|
||||||
|
while (dxgiFactory->EnumAdapters1(adapterIndex++, &adapterOption) != DXGI_ERROR_NOT_FOUND) {
|
||||||
|
DXGI_ADAPTER_DESC1 adapterDesc;
|
||||||
|
adapterOption->GetDesc1(&adapterDesc);
|
||||||
|
|
||||||
|
// Ignore remote or software adapters.
|
||||||
|
if ((adapterDesc.Flags & (DXGI_ADAPTER_FLAG_REMOTE | DXGI_ADAPTER_FLAG_SOFTWARE)) == 0) {
|
||||||
|
deviceNames.emplace_back(Utf16ToUtf8(adapterDesc.Description));
|
||||||
|
}
|
||||||
|
|
||||||
|
adapterOption->Release();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D12Interface::~D3D12Interface() {
|
D3D12Interface::~D3D12Interface() {
|
||||||
@@ -3755,8 +3868,8 @@ namespace plume {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<RenderDevice> D3D12Interface::createDevice() {
|
std::unique_ptr<RenderDevice> D3D12Interface::createDevice(const std::string &preferredDeviceName) {
|
||||||
std::unique_ptr<D3D12Device> createdDevice = std::make_unique<D3D12Device>(this);
|
std::unique_ptr<D3D12Device> createdDevice = std::make_unique<D3D12Device>(this, preferredDeviceName);
|
||||||
return createdDevice->isValid() ? std::move(createdDevice) : nullptr;
|
return createdDevice->isValid() ? std::move(createdDevice) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3764,6 +3877,10 @@ namespace plume {
|
|||||||
return capabilities;
|
return capabilities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string> &D3D12Interface::getDeviceNames() const {
|
||||||
|
return deviceNames;
|
||||||
|
}
|
||||||
|
|
||||||
bool D3D12Interface::isValid() const {
|
bool D3D12Interface::isValid() const {
|
||||||
return dxgiFactory != nullptr;
|
return dxgiFactory != nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,19 @@ namespace plume {
|
|||||||
uint32_t getHeight() const override;
|
uint32_t getHeight() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct D3D12QueryPool : RenderQueryPool {
|
||||||
|
D3D12Device *device = nullptr;
|
||||||
|
ID3D12QueryHeap *d3d = nullptr;
|
||||||
|
std::vector<uint64_t> results;
|
||||||
|
std::unique_ptr<RenderBuffer> readbackBuffer;
|
||||||
|
|
||||||
|
D3D12QueryPool(D3D12Device *device, uint32_t queryCount);
|
||||||
|
virtual ~D3D12QueryPool() override;
|
||||||
|
virtual void queryResults() override;
|
||||||
|
virtual const uint64_t *getResults() const override;
|
||||||
|
virtual uint32_t getCount() const override;
|
||||||
|
};
|
||||||
|
|
||||||
struct D3D12CommandList : RenderCommandList {
|
struct D3D12CommandList : RenderCommandList {
|
||||||
ID3D12GraphicsCommandList9 *d3d = nullptr;
|
ID3D12GraphicsCommandList9 *d3d = nullptr;
|
||||||
ID3D12CommandAllocator *commandAllocator = nullptr;
|
ID3D12CommandAllocator *commandAllocator = nullptr;
|
||||||
@@ -192,10 +205,12 @@ namespace plume {
|
|||||||
void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override;
|
void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override;
|
||||||
void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
||||||
void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
||||||
void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect) override;
|
void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) override;
|
||||||
void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override;
|
void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override;
|
||||||
void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override;
|
void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override;
|
||||||
void discardTexture(const RenderTexture* texture) override;
|
void discardTexture(const RenderTexture* texture) override;
|
||||||
|
void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) override;
|
||||||
|
void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) override;
|
||||||
void checkDescriptorHeaps();
|
void checkDescriptorHeaps();
|
||||||
void notifyDescriptorHeapWasChangedExternally();
|
void notifyDescriptorHeapWasChangedExternally();
|
||||||
void checkTopology();
|
void checkTopology();
|
||||||
@@ -417,8 +432,9 @@ namespace plume {
|
|||||||
std::unique_ptr<D3D12DescriptorHeapAllocator> depthTargetHeapAllocator;
|
std::unique_ptr<D3D12DescriptorHeapAllocator> depthTargetHeapAllocator;
|
||||||
RenderDeviceCapabilities capabilities;
|
RenderDeviceCapabilities capabilities;
|
||||||
RenderDeviceDescription description;
|
RenderDeviceDescription description;
|
||||||
|
uint64_t timestampFrequency = 1;
|
||||||
|
|
||||||
D3D12Device(D3D12Interface *renderInterface);
|
D3D12Device(D3D12Interface *renderInterface, const std::string &preferredDeviceName);
|
||||||
~D3D12Device() override;
|
~D3D12Device() override;
|
||||||
std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override;
|
std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override;
|
||||||
std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override;
|
std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override;
|
||||||
@@ -436,6 +452,7 @@ namespace plume {
|
|||||||
std::unique_ptr<RenderCommandFence> createCommandFence() override;
|
std::unique_ptr<RenderCommandFence> createCommandFence() override;
|
||||||
std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override;
|
std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override;
|
||||||
std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override;
|
std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override;
|
||||||
|
std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) override;
|
||||||
void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override;
|
void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override;
|
||||||
void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override;
|
void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override;
|
||||||
void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override;
|
void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override;
|
||||||
@@ -450,11 +467,13 @@ namespace plume {
|
|||||||
struct D3D12Interface : RenderInterface {
|
struct D3D12Interface : RenderInterface {
|
||||||
IDXGIFactory4 *dxgiFactory = nullptr;
|
IDXGIFactory4 *dxgiFactory = nullptr;
|
||||||
RenderInterfaceCapabilities capabilities;
|
RenderInterfaceCapabilities capabilities;
|
||||||
|
std::vector<std::string> deviceNames;
|
||||||
|
|
||||||
D3D12Interface();
|
D3D12Interface();
|
||||||
~D3D12Interface() override;
|
~D3D12Interface() override;
|
||||||
std::unique_ptr<RenderDevice> createDevice() override;
|
std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName) override;
|
||||||
const RenderInterfaceCapabilities &getCapabilities() const override;
|
const RenderInterfaceCapabilities &getCapabilities() const override;
|
||||||
|
const std::vector<std::string> &getDeviceNames() const override;
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -143,10 +143,12 @@ namespace plume {
|
|||||||
virtual void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) = 0;
|
virtual void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) = 0;
|
||||||
virtual void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0;
|
virtual void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0;
|
||||||
virtual void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0;
|
virtual void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) = 0;
|
||||||
virtual void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect = nullptr) = 0;
|
virtual void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect = nullptr, RenderResolveMode resolveMode = RenderResolveMode::AVERAGE) = 0;
|
||||||
virtual void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) = 0;
|
virtual void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) = 0;
|
||||||
virtual void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) = 0;
|
virtual void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) = 0;
|
||||||
virtual void discardTexture(const RenderTexture* texture) = 0; // D3D12 only.
|
virtual void discardTexture(const RenderTexture* texture) = 0; // D3D12 only.
|
||||||
|
virtual void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) = 0;
|
||||||
|
virtual void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) = 0;
|
||||||
|
|
||||||
// Concrete implementation shortcuts.
|
// Concrete implementation shortcuts.
|
||||||
inline void barriers(RenderBarrierStages stages, const RenderBufferBarrier &barrier) {
|
inline void barriers(RenderBarrierStages stages, const RenderBufferBarrier &barrier) {
|
||||||
@@ -208,6 +210,13 @@ namespace plume {
|
|||||||
virtual std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) = 0;
|
virtual std::unique_ptr<RenderTexture> createTexture(const RenderTextureDesc &desc) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RenderQueryPool {
|
||||||
|
virtual ~RenderQueryPool() { }
|
||||||
|
virtual void queryResults() = 0;
|
||||||
|
virtual const uint64_t *getResults() const = 0;
|
||||||
|
virtual uint32_t getCount() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
struct RenderDevice {
|
struct RenderDevice {
|
||||||
virtual ~RenderDevice() { }
|
virtual ~RenderDevice() { }
|
||||||
virtual std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) = 0;
|
virtual std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) = 0;
|
||||||
@@ -226,6 +235,7 @@ namespace plume {
|
|||||||
virtual std::unique_ptr<RenderCommandFence> createCommandFence() = 0;
|
virtual std::unique_ptr<RenderCommandFence> createCommandFence() = 0;
|
||||||
virtual std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() = 0;
|
virtual std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() = 0;
|
||||||
virtual std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) = 0;
|
virtual std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) = 0;
|
||||||
|
virtual std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) = 0;
|
||||||
virtual void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0;
|
virtual void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0;
|
||||||
virtual void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0;
|
virtual void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild = true, bool preferFastTrace = false) = 0;
|
||||||
virtual void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) = 0;
|
virtual void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) = 0;
|
||||||
@@ -237,7 +247,8 @@ namespace plume {
|
|||||||
|
|
||||||
struct RenderInterface {
|
struct RenderInterface {
|
||||||
virtual ~RenderInterface() { }
|
virtual ~RenderInterface() { }
|
||||||
virtual std::unique_ptr<RenderDevice> createDevice() = 0;
|
virtual std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName = "") = 0;
|
||||||
|
virtual const std::vector<std::string> &getDeviceNames() const = 0;
|
||||||
virtual const RenderInterfaceCapabilities &getCapabilities() const = 0;
|
virtual const RenderInterfaceCapabilities &getCapabilities() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -69,9 +69,17 @@ namespace plume {
|
|||||||
struct RenderSampler;
|
struct RenderSampler;
|
||||||
struct RenderShader;
|
struct RenderShader;
|
||||||
struct RenderTexture;
|
struct RenderTexture;
|
||||||
|
struct RenderQueryPool;
|
||||||
|
|
||||||
// Enums.
|
// Enums.
|
||||||
|
|
||||||
|
enum class RenderDeviceVendor {
|
||||||
|
UNKNOWN = 0x0,
|
||||||
|
AMD = 0x1002,
|
||||||
|
NVIDIA = 0x10DE,
|
||||||
|
INTEL = 0x8086
|
||||||
|
};
|
||||||
|
|
||||||
enum class RenderFormat {
|
enum class RenderFormat {
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
R32G32B32A32_TYPELESS,
|
R32G32B32A32_TYPELESS,
|
||||||
@@ -483,6 +491,12 @@ namespace plume {
|
|||||||
CPU
|
CPU
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class RenderResolveMode {
|
||||||
|
MIN,
|
||||||
|
MAX,
|
||||||
|
AVERAGE
|
||||||
|
};
|
||||||
|
|
||||||
// Global functions.
|
// Global functions.
|
||||||
|
|
||||||
constexpr uint32_t RenderFormatSize(RenderFormat format) {
|
constexpr uint32_t RenderFormatSize(RenderFormat format) {
|
||||||
@@ -1763,7 +1777,8 @@ namespace plume {
|
|||||||
struct RenderDeviceDescription {
|
struct RenderDeviceDescription {
|
||||||
std::string name = "Unknown";
|
std::string name = "Unknown";
|
||||||
RenderDeviceType type = RenderDeviceType::UNKNOWN;
|
RenderDeviceType type = RenderDeviceType::UNKNOWN;
|
||||||
uint32_t driverVersion = 0;
|
RenderDeviceVendor vendor = RenderDeviceVendor::UNKNOWN;
|
||||||
|
uint64_t driverVersion = 0;
|
||||||
uint64_t dedicatedVideoMemory = 0;
|
uint64_t dedicatedVideoMemory = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2522,6 +2522,80 @@ namespace plume {
|
|||||||
return (depthAttachment == attachment);
|
return (depthAttachment == attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VulkanQueryPool
|
||||||
|
|
||||||
|
VulkanQueryPool::VulkanQueryPool(VulkanDevice *device, uint32_t queryCount) {
|
||||||
|
assert(device != nullptr);
|
||||||
|
assert(queryCount > 0);
|
||||||
|
|
||||||
|
this->device = device;
|
||||||
|
|
||||||
|
VkQueryPoolCreateInfo createInfo = {};
|
||||||
|
createInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
|
||||||
|
createInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;
|
||||||
|
createInfo.queryCount = queryCount;
|
||||||
|
|
||||||
|
VkResult res = vkCreateQueryPool(device->vk, &createInfo, nullptr, &vk);
|
||||||
|
if (res != VK_SUCCESS) {
|
||||||
|
fprintf(stderr, "vkCreateQueryPool failed with error code 0x%X.\n", res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
results.resize(queryCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
VulkanQueryPool::~VulkanQueryPool() {
|
||||||
|
vkDestroyQueryPool(device->vk, vk, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanQueryPool::queryResults() {
|
||||||
|
VkResult res = vkGetQueryPoolResults(device->vk, vk, 0, uint32_t(results.size()), sizeof(uint64_t) * results.size(), results.data(), sizeof(uint64_t), VK_QUERY_RESULT_64_BIT);
|
||||||
|
if (res != VK_SUCCESS) {
|
||||||
|
fprintf(stderr, "vkGetQueryPoolResults failed with error code 0x%X.\n", res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Conversion sourced from Godot Engine's Vulkan Rendering Driver.
|
||||||
|
auto mult64to128 = [](uint64_t u, uint64_t v, uint64_t &h, uint64_t &l) {
|
||||||
|
uint64_t u1 = (u & 0xffffffff);
|
||||||
|
uint64_t v1 = (v & 0xffffffff);
|
||||||
|
uint64_t t = (u1 * v1);
|
||||||
|
uint64_t w3 = (t & 0xffffffff);
|
||||||
|
uint64_t k = (t >> 32);
|
||||||
|
|
||||||
|
u >>= 32;
|
||||||
|
t = (u * v1) + k;
|
||||||
|
k = (t & 0xffffffff);
|
||||||
|
uint64_t w1 = (t >> 32);
|
||||||
|
|
||||||
|
v >>= 32;
|
||||||
|
t = (u1 * v) + k;
|
||||||
|
k = (t >> 32);
|
||||||
|
|
||||||
|
h = (u * v) + w1 + k;
|
||||||
|
l = (t << 32) + w3;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Convert results to timestamps.
|
||||||
|
constexpr uint64_t shift_bits = 16;
|
||||||
|
double timestampPeriod = double(device->physicalDeviceProperties.limits.timestampPeriod);
|
||||||
|
uint64_t h = 0, l = 0;
|
||||||
|
for (uint64_t &result : results) {
|
||||||
|
mult64to128(result, uint64_t(timestampPeriod * double(1 << shift_bits)), h, l);
|
||||||
|
result = l;
|
||||||
|
result >>= shift_bits;
|
||||||
|
result |= h << (64 - shift_bits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t *VulkanQueryPool::getResults() const {
|
||||||
|
return results.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t VulkanQueryPool::getCount() const {
|
||||||
|
return uint32_t(results.size());
|
||||||
|
}
|
||||||
|
|
||||||
// VulkanCommandList
|
// VulkanCommandList
|
||||||
|
|
||||||
VulkanCommandList::VulkanCommandList(VulkanDevice *device, RenderCommandListType type) {
|
VulkanCommandList::VulkanCommandList(VulkanDevice *device, RenderCommandListType type) {
|
||||||
@@ -3074,12 +3148,13 @@ namespace plume {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VulkanCommandList::resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) {
|
void VulkanCommandList::resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) {
|
||||||
resolveTextureRegion(dstTexture, 0, 0, srcTexture, nullptr);
|
resolveTextureRegion(dstTexture, 0, 0, srcTexture, nullptr, RenderResolveMode::AVERAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VulkanCommandList::resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect) {
|
void VulkanCommandList::resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) {
|
||||||
assert(dstTexture != nullptr);
|
assert(dstTexture != nullptr);
|
||||||
assert(srcTexture != nullptr);
|
assert(srcTexture != nullptr);
|
||||||
|
assert(resolveMode == RenderResolveMode::AVERAGE && "Vulkan only supports AVERAGE resolve mode.");
|
||||||
|
|
||||||
thread_local std::vector<VkImageResolve> imageResolves;
|
thread_local std::vector<VkImageResolve> imageResolves;
|
||||||
imageResolves.clear();
|
imageResolves.clear();
|
||||||
@@ -3209,6 +3284,20 @@ namespace plume {
|
|||||||
// Not required in Vulkan.
|
// Not required in Vulkan.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VulkanCommandList::resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) {
|
||||||
|
assert(queryPool != nullptr);
|
||||||
|
|
||||||
|
const VulkanQueryPool *interfaceQueryPool = static_cast<const VulkanQueryPool *>(queryPool);
|
||||||
|
vkCmdResetQueryPool(vk, interfaceQueryPool->vk, queryFirstIndex, queryCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VulkanCommandList::writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) {
|
||||||
|
assert(queryPool != nullptr);
|
||||||
|
|
||||||
|
const VulkanQueryPool *interfaceQueryPool = static_cast<const VulkanQueryPool *>(queryPool);
|
||||||
|
vkCmdWriteTimestamp(vk, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, interfaceQueryPool->vk, queryIndex);
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanCommandList::checkActiveRenderPass() {
|
void VulkanCommandList::checkActiveRenderPass() {
|
||||||
assert(targetFramebuffer != nullptr);
|
assert(targetFramebuffer != nullptr);
|
||||||
|
|
||||||
@@ -3472,7 +3561,7 @@ namespace plume {
|
|||||||
|
|
||||||
// VulkanDevice
|
// VulkanDevice
|
||||||
|
|
||||||
VulkanDevice::VulkanDevice(VulkanInterface *renderInterface) {
|
VulkanDevice::VulkanDevice(VulkanInterface *renderInterface, const std::string &preferredDeviceName) {
|
||||||
assert(renderInterface != nullptr);
|
assert(renderInterface != nullptr);
|
||||||
|
|
||||||
this->renderInterface = renderInterface;
|
this->renderInterface = renderInterface;
|
||||||
@@ -3505,15 +3594,22 @@ namespace plume {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string deviceName(deviceProperties.deviceName);
|
||||||
uint32_t deviceTypeScore = deviceTypeScoreTable[deviceTypeIndex];
|
uint32_t deviceTypeScore = deviceTypeScoreTable[deviceTypeIndex];
|
||||||
bool preferDeviceTypeScore = (deviceTypeScore > currentDeviceTypeScore);
|
bool preferDeviceTypeScore = (deviceTypeScore > currentDeviceTypeScore);
|
||||||
bool preferOption = preferDeviceTypeScore;
|
bool preferUserChoice = preferredDeviceName == deviceName;
|
||||||
|
bool preferOption = preferDeviceTypeScore || preferUserChoice;
|
||||||
if (preferOption) {
|
if (preferOption) {
|
||||||
physicalDevice = physicalDevices[i];
|
physicalDevice = physicalDevices[i];
|
||||||
description.name = std::string(deviceProperties.deviceName);
|
description.name = deviceName;
|
||||||
description.type = toDeviceType(deviceProperties.deviceType);
|
description.type = toDeviceType(deviceProperties.deviceType);
|
||||||
description.driverVersion = deviceProperties.driverVersion;
|
description.driverVersion = deviceProperties.driverVersion;
|
||||||
|
description.vendor = RenderDeviceVendor(deviceProperties.vendorID);
|
||||||
currentDeviceTypeScore = deviceTypeScore;
|
currentDeviceTypeScore = deviceTypeScore;
|
||||||
|
|
||||||
|
if (preferUserChoice) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3884,6 +3980,10 @@ namespace plume {
|
|||||||
return std::make_unique<VulkanFramebuffer>(this, desc);
|
return std::make_unique<VulkanFramebuffer>(this, desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<RenderQueryPool> VulkanDevice::createQueryPool(uint32_t queryCount) {
|
||||||
|
return std::make_unique<VulkanQueryPool>(this, queryCount);
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanDevice::setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) {
|
void VulkanDevice::setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) {
|
||||||
assert(meshes != nullptr);
|
assert(meshes != nullptr);
|
||||||
assert(meshCount > 0);
|
assert(meshCount > 0);
|
||||||
@@ -4232,6 +4332,23 @@ namespace plume {
|
|||||||
|
|
||||||
// Fill capabilities.
|
// Fill capabilities.
|
||||||
capabilities.shaderFormat = RenderShaderFormat::SPIRV;
|
capabilities.shaderFormat = RenderShaderFormat::SPIRV;
|
||||||
|
|
||||||
|
// Fill device names.
|
||||||
|
uint32_t deviceCount = 0;
|
||||||
|
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
|
||||||
|
if (deviceCount > 0) {
|
||||||
|
std::vector<VkPhysicalDevice> physicalDevices(deviceCount);
|
||||||
|
vkEnumeratePhysicalDevices(instance, &deviceCount, physicalDevices.data());
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < deviceCount; i++) {
|
||||||
|
VkPhysicalDeviceProperties deviceProperties;
|
||||||
|
vkGetPhysicalDeviceProperties(physicalDevices[i], &deviceProperties);
|
||||||
|
uint32_t deviceTypeIndex = deviceProperties.deviceType;
|
||||||
|
if (deviceTypeIndex <= 4) {
|
||||||
|
deviceNames.emplace_back(deviceProperties.deviceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VulkanInterface::~VulkanInterface() {
|
VulkanInterface::~VulkanInterface() {
|
||||||
@@ -4240,8 +4357,8 @@ namespace plume {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<RenderDevice> VulkanInterface::createDevice() {
|
std::unique_ptr<RenderDevice> VulkanInterface::createDevice(const std::string &preferredDeviceName) {
|
||||||
std::unique_ptr<VulkanDevice> createdDevice = std::make_unique<VulkanDevice>(this);
|
std::unique_ptr<VulkanDevice> createdDevice = std::make_unique<VulkanDevice>(this, preferredDeviceName);
|
||||||
return createdDevice->isValid() ? std::move(createdDevice) : nullptr;
|
return createdDevice->isValid() ? std::move(createdDevice) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4249,6 +4366,10 @@ namespace plume {
|
|||||||
return capabilities;
|
return capabilities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string> &VulkanInterface::getDeviceNames() const {
|
||||||
|
return deviceNames;
|
||||||
|
}
|
||||||
|
|
||||||
bool VulkanInterface::isValid() const {
|
bool VulkanInterface::isValid() const {
|
||||||
return instance != nullptr;
|
return instance != nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -271,6 +271,18 @@ namespace plume {
|
|||||||
bool contains(const VulkanTexture *attachment) const;
|
bool contains(const VulkanTexture *attachment) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct VulkanQueryPool : RenderQueryPool {
|
||||||
|
VulkanDevice *device = nullptr;
|
||||||
|
std::vector<uint64_t> results;
|
||||||
|
VkQueryPool vk = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
VulkanQueryPool(VulkanDevice *device, uint32_t queryCount);
|
||||||
|
virtual ~VulkanQueryPool() override;
|
||||||
|
virtual void queryResults() override;
|
||||||
|
virtual const uint64_t *getResults() const override;
|
||||||
|
virtual uint32_t getCount() const override;
|
||||||
|
};
|
||||||
|
|
||||||
struct VulkanCommandList : RenderCommandList {
|
struct VulkanCommandList : RenderCommandList {
|
||||||
VkCommandBuffer vk = VK_NULL_HANDLE;
|
VkCommandBuffer vk = VK_NULL_HANDLE;
|
||||||
VkCommandPool commandPool = VK_NULL_HANDLE;
|
VkCommandPool commandPool = VK_NULL_HANDLE;
|
||||||
@@ -315,10 +327,12 @@ namespace plume {
|
|||||||
void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override;
|
void copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) override;
|
||||||
void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
void copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
||||||
void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
void resolveTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) override;
|
||||||
void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect) override;
|
void resolveTextureRegion(const RenderTexture *dstTexture, uint32_t dstX, uint32_t dstY, const RenderTexture *srcTexture, const RenderRect *srcRect, RenderResolveMode resolveMode) override;
|
||||||
void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override;
|
void buildBottomLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, const RenderBottomLevelASBuildInfo &buildInfo) override;
|
||||||
void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override;
|
void buildTopLevelAS(const RenderAccelerationStructure *dstAccelerationStructure, RenderBufferReference scratchBuffer, RenderBufferReference instancesBuffer, const RenderTopLevelASBuildInfo &buildInfo) override;
|
||||||
void discardTexture(const RenderTexture* texture) override;
|
void discardTexture(const RenderTexture* texture) override;
|
||||||
|
void resetQueryPool(const RenderQueryPool *queryPool, uint32_t queryFirstIndex, uint32_t queryCount) override;
|
||||||
|
void writeTimestamp(const RenderQueryPool *queryPool, uint32_t queryIndex) override;
|
||||||
void checkActiveRenderPass();
|
void checkActiveRenderPass();
|
||||||
void endActiveRenderPass();
|
void endActiveRenderPass();
|
||||||
void setDescriptorSet(VkPipelineBindPoint bindPoint, const VulkanPipelineLayout *pipelineLayout, const RenderDescriptorSet *descriptorSet, uint32_t setIndex);
|
void setDescriptorSet(VkPipelineBindPoint bindPoint, const VulkanPipelineLayout *pipelineLayout, const RenderDescriptorSet *descriptorSet, uint32_t setIndex);
|
||||||
@@ -391,7 +405,7 @@ namespace plume {
|
|||||||
VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationProperties = {};
|
VkPhysicalDeviceSampleLocationsPropertiesEXT sampleLocationProperties = {};
|
||||||
bool loadStoreOpNoneSupported = false;
|
bool loadStoreOpNoneSupported = false;
|
||||||
|
|
||||||
VulkanDevice(VulkanInterface *renderInterface);
|
VulkanDevice(VulkanInterface *renderInterface, const std::string &preferredDeviceName);
|
||||||
~VulkanDevice() override;
|
~VulkanDevice() override;
|
||||||
std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override;
|
std::unique_ptr<RenderCommandList> createCommandList(RenderCommandListType type) override;
|
||||||
std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override;
|
std::unique_ptr<RenderDescriptorSet> createDescriptorSet(const RenderDescriptorSetDesc &desc) override;
|
||||||
@@ -409,6 +423,7 @@ namespace plume {
|
|||||||
std::unique_ptr<RenderCommandFence> createCommandFence() override;
|
std::unique_ptr<RenderCommandFence> createCommandFence() override;
|
||||||
std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override;
|
std::unique_ptr<RenderCommandSemaphore> createCommandSemaphore() override;
|
||||||
std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override;
|
std::unique_ptr<RenderFramebuffer> createFramebuffer(const RenderFramebufferDesc &desc) override;
|
||||||
|
std::unique_ptr<RenderQueryPool> createQueryPool(uint32_t queryCount) override;
|
||||||
void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override;
|
void setBottomLevelASBuildInfo(RenderBottomLevelASBuildInfo &buildInfo, const RenderBottomLevelASMesh *meshes, uint32_t meshCount, bool preferFastBuild, bool preferFastTrace) override;
|
||||||
void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override;
|
void setTopLevelASBuildInfo(RenderTopLevelASBuildInfo &buildInfo, const RenderTopLevelASInstance *instances, uint32_t instanceCount, bool preferFastBuild, bool preferFastTrace) override;
|
||||||
void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override;
|
void setShaderBindingTableInfo(RenderShaderBindingTableInfo &tableInfo, const RenderShaderBindingGroups &groups, const RenderPipeline *pipeline, RenderDescriptorSet **descriptorSets, uint32_t descriptorSetCount) override;
|
||||||
@@ -424,6 +439,7 @@ namespace plume {
|
|||||||
VkInstance instance = VK_NULL_HANDLE;
|
VkInstance instance = VK_NULL_HANDLE;
|
||||||
VkApplicationInfo appInfo = {};
|
VkApplicationInfo appInfo = {};
|
||||||
RenderInterfaceCapabilities capabilities;
|
RenderInterfaceCapabilities capabilities;
|
||||||
|
std::vector<std::string> deviceNames;
|
||||||
|
|
||||||
# if SDL_VULKAN_ENABLED
|
# if SDL_VULKAN_ENABLED
|
||||||
VulkanInterface(RenderWindow sdlWindow);
|
VulkanInterface(RenderWindow sdlWindow);
|
||||||
@@ -432,8 +448,9 @@ namespace plume {
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
~VulkanInterface() override;
|
~VulkanInterface() override;
|
||||||
std::unique_ptr<RenderDevice> createDevice() override;
|
std::unique_ptr<RenderDevice> createDevice(const std::string &preferredDeviceName) override;
|
||||||
const RenderInterfaceCapabilities &getCapabilities() const override;
|
const RenderInterfaceCapabilities &getCapabilities() const override;
|
||||||
|
const std::vector<std::string> &getDeviceNames() const override;
|
||||||
bool isValid() const;
|
bool isValid() const;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "copy_common.hlsli"
|
||||||
|
|
||||||
|
Texture2D<float4> g_Texture2DDescriptorHeap[] : register(t0, space0);
|
||||||
|
|
||||||
|
float4 main(in float4 position : SV_Position) : SV_Target
|
||||||
|
{
|
||||||
|
return g_Texture2DDescriptorHeap[g_PushConstants.ResourceDescriptorIndex].Load(int3(position.xy, 0));
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
struct PushConstants
|
||||||
|
{
|
||||||
|
uint ResourceDescriptorIndex;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[vk::push_constant]] ConstantBuffer<PushConstants> g_PushConstants : register(b3, space4);
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "copy_common.hlsli"
|
||||||
|
|
||||||
|
Texture2D<float> g_Texture2DDescriptorHeap[] : register(t0, space0);
|
||||||
|
|
||||||
|
float main(in float4 position : SV_Position) : SV_Depth
|
||||||
|
{
|
||||||
|
return g_Texture2DDescriptorHeap[g_PushConstants.ResourceDescriptorIndex].Load(int3(position.xy, 0));
|
||||||
|
}
|
||||||
@@ -135,10 +135,18 @@ float4 main(in Interpolators interpolators) : SV_Target
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_PushConstants.ShaderModifier == IMGUI_SHADER_MODIFIER_MARQUEE_FADE)
|
if (g_PushConstants.ShaderModifier == IMGUI_SHADER_MODIFIER_HORIZONTAL_MARQUEE_FADE)
|
||||||
{
|
{
|
||||||
float minAlpha = saturate((interpolators.Position.x - g_PushConstants.BoundsMin.x) / g_PushConstants.Scale.x);
|
float minAlpha = saturate((interpolators.Position.x - g_PushConstants.BoundsMin.x) / g_PushConstants.Scale.x);
|
||||||
float maxAlpha = saturate((g_PushConstants.BoundsMax.x - interpolators.Position.x) / g_PushConstants.Scale.x);
|
float maxAlpha = saturate((g_PushConstants.BoundsMax.x - interpolators.Position.x) / g_PushConstants.Scale.y);
|
||||||
|
|
||||||
|
color.a *= minAlpha;
|
||||||
|
color.a *= maxAlpha;
|
||||||
|
}
|
||||||
|
else if (g_PushConstants.ShaderModifier == IMGUI_SHADER_MODIFIER_VERTICAL_MARQUEE_FADE)
|
||||||
|
{
|
||||||
|
float minAlpha = saturate((interpolators.Position.y - g_PushConstants.BoundsMin.y) / g_PushConstants.Scale.x);
|
||||||
|
float maxAlpha = saturate((g_PushConstants.BoundsMax.y - interpolators.Position.y) / g_PushConstants.Scale.y);
|
||||||
|
|
||||||
color.a *= minAlpha;
|
color.a *= minAlpha;
|
||||||
color.a *= maxAlpha;
|
color.a *= maxAlpha;
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ void main(in float2 position : POSITION, in float2 uv : TEXCOORD, in float4 colo
|
|||||||
if (position.y < g_PushConstants.Origin.y)
|
if (position.y < g_PushConstants.Origin.y)
|
||||||
position.x += g_PushConstants.Scale.x;
|
position.x += g_PushConstants.Scale.x;
|
||||||
}
|
}
|
||||||
else if (g_PushConstants.ShaderModifier != IMGUI_SHADER_MODIFIER_MARQUEE_FADE)
|
else if (g_PushConstants.ShaderModifier != IMGUI_SHADER_MODIFIER_HORIZONTAL_MARQUEE_FADE &&
|
||||||
|
g_PushConstants.ShaderModifier != IMGUI_SHADER_MODIFIER_VERTICAL_MARQUEE_FADE)
|
||||||
{
|
{
|
||||||
position.xy = g_PushConstants.Origin + (position.xy - g_PushConstants.Origin) * g_PushConstants.Scale;
|
position.xy = g_PushConstants.Origin + (position.xy - g_PushConstants.Origin) * g_PushConstants.Scale;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "copy_common.hlsli"
|
||||||
|
|
||||||
|
Texture2DMS<float4, SAMPLE_COUNT> g_Texture2DMSDescriptorHeap[] : register(t0, space0);
|
||||||
|
|
||||||
|
float4 main(in float4 position : SV_Position) : SV_Target
|
||||||
|
{
|
||||||
|
float4 result = g_Texture2DMSDescriptorHeap[g_PushConstants.ResourceDescriptorIndex].Load(int2(position.xy), 0);
|
||||||
|
|
||||||
|
[unroll] for (int i = 1; i < SAMPLE_COUNT; i++)
|
||||||
|
result += g_Texture2DMSDescriptorHeap[g_PushConstants.ResourceDescriptorIndex].Load(int2(position.xy), i);
|
||||||
|
|
||||||
|
return result / SAMPLE_COUNT;
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#define SAMPLE_COUNT 2
|
||||||
|
#include "resolve_msaa_color.hlsli"
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#define SAMPLE_COUNT 4
|
||||||
|
#include "resolve_msaa_color.hlsli"
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#define SAMPLE_COUNT 8
|
||||||
|
#include "resolve_msaa_color.hlsli"
|
||||||
@@ -1,11 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
struct PushConstants
|
#include "copy_common.hlsli"
|
||||||
{
|
|
||||||
uint ResourceDescriptorIndex;
|
|
||||||
};
|
|
||||||
|
|
||||||
[[vk::push_constant]] ConstantBuffer<PushConstants> g_PushConstants : register(b3, space4);
|
|
||||||
|
|
||||||
Texture2DMS<float, SAMPLE_COUNT> g_Texture2DMSDescriptorHeap[] : register(t0, space0);
|
Texture2DMS<float, SAMPLE_COUNT> g_Texture2DMSDescriptorHeap[] : register(t0, space0);
|
||||||
|
|
||||||
|
|||||||
+874
-244
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
//#define ASYNC_PSO_DEBUG
|
//#define ASYNC_PSO_DEBUG
|
||||||
#define PSO_CACHING
|
/////////////////////////////////////////////////////////////////////#define PSO_CACHING
|
||||||
//#define PSO_CACHING_CLEANUP
|
//#define PSO_CACHING_CLEANUP
|
||||||
|
|
||||||
#include "rhi/plume_render_interface.h"
|
#include "rhi/plume_render_interface.h"
|
||||||
@@ -158,6 +158,7 @@ struct GuestTexture : GuestBaseTexture
|
|||||||
void* mappedMemory = nullptr;
|
void* mappedMemory = nullptr;
|
||||||
std::unique_ptr<RenderFramebuffer> framebuffer;
|
std::unique_ptr<RenderFramebuffer> framebuffer;
|
||||||
std::unique_ptr<GuestTexture> patchedTexture;
|
std::unique_ptr<GuestTexture> patchedTexture;
|
||||||
|
struct GuestSurface* sourceSurface = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuestLockedRect
|
struct GuestLockedRect
|
||||||
@@ -205,6 +206,7 @@ struct GuestSurface : GuestBaseTexture
|
|||||||
uint32_t guestFormat = 0;
|
uint32_t guestFormat = 0;
|
||||||
ankerl::unordered_dense::map<const RenderTexture*, std::unique_ptr<RenderFramebuffer>> framebuffers;
|
ankerl::unordered_dense::map<const RenderTexture*, std::unique_ptr<RenderFramebuffer>> framebuffers;
|
||||||
RenderSampleCounts sampleCount = RenderSampleCount::COUNT_1;
|
RenderSampleCounts sampleCount = RenderSampleCount::COUNT_1;
|
||||||
|
ankerl::unordered_dense::set<GuestTexture*> destinationTextures;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum GuestDeclType
|
enum GuestDeclType
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ int HID_OnSDLEvent(void*, SDL_Event* event)
|
|||||||
|
|
||||||
g_controllers[freeIndex] = controller;
|
g_controllers[freeIndex] = controller;
|
||||||
|
|
||||||
SetControllerTimeOfDayLED(controller, App::s_isWerehog);
|
SetControllerTimeOfDayLED(controller, App::s_pEvilSonicContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -239,12 +239,16 @@ int HID_OnSDLEvent(void*, SDL_Event* event)
|
|||||||
if (event->type == SDL_CONTROLLERAXISMOTION)
|
if (event->type == SDL_CONTROLLERAXISMOTION)
|
||||||
{
|
{
|
||||||
if (abs(event->caxis.value) > 8000)
|
if (abs(event->caxis.value) > 8000)
|
||||||
|
{
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
SetControllerInputDevice(controller);
|
SetControllerInputDevice(controller);
|
||||||
|
}
|
||||||
|
|
||||||
controller->PollAxis();
|
controller->PollAxis();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
SetControllerInputDevice(controller);
|
SetControllerInputDevice(controller);
|
||||||
|
|
||||||
controller->Poll();
|
controller->Poll();
|
||||||
@@ -261,8 +265,14 @@ int HID_OnSDLEvent(void*, SDL_Event* event)
|
|||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
case SDL_MOUSEBUTTONUP:
|
case SDL_MOUSEBUTTONUP:
|
||||||
|
{
|
||||||
|
if (!GameWindow::IsFullscreen() || GameWindow::s_isFullscreenCursorVisible)
|
||||||
|
SDL_ShowCursor(SDL_ENABLE);
|
||||||
|
|
||||||
hid::g_inputDevice = hid::EInputDevice::Mouse;
|
hid::g_inputDevice = hid::EInputDevice::Mouse;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,10 +7,14 @@ hid::EInputDevice hid::g_inputDeviceController;
|
|||||||
hid::EInputDeviceExplicit hid::g_inputDeviceExplicit;
|
hid::EInputDeviceExplicit hid::g_inputDeviceExplicit;
|
||||||
|
|
||||||
uint16_t hid::g_prohibitedButtons;
|
uint16_t hid::g_prohibitedButtons;
|
||||||
|
bool hid::g_isLeftStickProhibited;
|
||||||
|
bool hid::g_isRightStickProhibited;
|
||||||
|
|
||||||
void hid::SetProhibitedButtons(uint16_t wButtons)
|
void hid::SetProhibitedInputs(uint16_t wButtons, bool leftStick, bool rightStick)
|
||||||
{
|
{
|
||||||
hid::g_prohibitedButtons = wButtons;
|
hid::g_prohibitedButtons = wButtons;
|
||||||
|
hid::g_isLeftStickProhibited = leftStick;
|
||||||
|
hid::g_isRightStickProhibited = rightStick;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hid::IsInputAllowed()
|
bool hid::IsInputAllowed()
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ namespace hid
|
|||||||
extern EInputDeviceExplicit g_inputDeviceExplicit;
|
extern EInputDeviceExplicit g_inputDeviceExplicit;
|
||||||
|
|
||||||
extern uint16_t g_prohibitedButtons;
|
extern uint16_t g_prohibitedButtons;
|
||||||
|
extern bool g_isLeftStickProhibited;
|
||||||
|
extern bool g_isRightStickProhibited;
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
|
|
||||||
@@ -40,7 +42,7 @@ namespace hid
|
|||||||
uint32_t SetState(uint32_t dwUserIndex, XAMINPUT_VIBRATION* pVibration);
|
uint32_t SetState(uint32_t dwUserIndex, XAMINPUT_VIBRATION* pVibration);
|
||||||
uint32_t GetCapabilities(uint32_t dwUserIndex, XAMINPUT_CAPABILITIES* pCaps);
|
uint32_t GetCapabilities(uint32_t dwUserIndex, XAMINPUT_CAPABILITIES* pCaps);
|
||||||
|
|
||||||
void SetProhibitedButtons(uint16_t wButtons);
|
void SetProhibitedInputs(uint16_t wButtons = 0, bool leftStick = false, bool rightStick = false);
|
||||||
bool IsInputAllowed();
|
bool IsInputAllowed();
|
||||||
bool IsInputDeviceController();
|
bool IsInputDeviceController();
|
||||||
std::string GetInputDeviceName();
|
std::string GetInputDeviceName();
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ static std::unique_ptr<VirtualFileSystem> createFileSystemFromPath(const std::fi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool copyFile(const FilePair &pair, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, bool skipHashChecks, std::vector<uint8_t> &fileData, Journal &journal, const std::function<void()> &progressCallback) {
|
static bool copyFile(const FilePair &pair, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, bool skipHashChecks, std::vector<uint8_t> &fileData, Journal &journal, const std::function<bool()> &progressCallback) {
|
||||||
const std::string filename(pair.first);
|
const std::string filename(pair.first);
|
||||||
const uint32_t hashCount = pair.second;
|
const uint32_t hashCount = pair.second;
|
||||||
if (!sourceVfs.exists(filename))
|
if (!sourceVfs.exists(filename))
|
||||||
@@ -139,7 +139,13 @@ static bool copyFile(const FilePair &pair, const uint64_t *fileHashes, VirtualFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
journal.progressCounter += fileData.size();
|
journal.progressCounter += fileData.size();
|
||||||
progressCallback();
|
|
||||||
|
if (!progressCallback())
|
||||||
|
{
|
||||||
|
journal.lastResult = Journal::Result::Cancelled;
|
||||||
|
journal.lastErrorMessage = "Installation was cancelled.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -266,7 +272,7 @@ bool Installer::computeTotalSize(std::span<const FilePair> filePairs, const uint
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Installer::copyFiles(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, const std::string &validationFile, bool skipHashChecks, Journal &journal, const std::function<void()> &progressCallback)
|
bool Installer::copyFiles(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, const std::string &validationFile, bool skipHashChecks, Journal &journal, const std::function<bool()> &progressCallback)
|
||||||
{
|
{
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
if (!std::filesystem::exists(targetDirectory) && !std::filesystem::create_directories(targetDirectory, ec))
|
if (!std::filesystem::exists(targetDirectory) && !std::filesystem::create_directories(targetDirectory, ec))
|
||||||
@@ -429,7 +435,7 @@ bool Installer::parseSources(const Input &input, Journal &journal, Sources &sour
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Installer::install(const Sources &sources, const std::filesystem::path &targetDirectory, bool skipHashChecks, Journal &journal, const std::function<void()> &progressCallback)
|
bool Installer::install(const Sources &sources, const std::filesystem::path &targetDirectory, bool skipHashChecks, Journal &journal, std::chrono::seconds endWaitTime, const std::function<bool()> &progressCallback)
|
||||||
{
|
{
|
||||||
// Install files in reverse order of importance. In case of a process crash or power outage, this will increase the likelihood of the installation
|
// Install files in reverse order of importance. In case of a process crash or power outage, this will increase the likelihood of the installation
|
||||||
// missing critical files required for the game to run. These files are used as the way to detect if the game is installed.
|
// missing critical files required for the game to run. These files are used as the way to detect if the game is installed.
|
||||||
@@ -497,7 +503,22 @@ bool Installer::install(const Sources &sources, const std::filesystem::path &tar
|
|||||||
|
|
||||||
// Update the progress with the artificial amount attributed to the patching.
|
// Update the progress with the artificial amount attributed to the patching.
|
||||||
journal.progressCounter += PatcherContribution;
|
journal.progressCounter += PatcherContribution;
|
||||||
progressCallback();
|
|
||||||
|
for (uint32_t i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
if (!progressCallback())
|
||||||
|
{
|
||||||
|
journal.lastResult = Journal::Result::Cancelled;
|
||||||
|
journal.lastErrorMessage = "Installation was cancelled.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
// Wait the specified amount of time to allow the consumer of the callbacks to animate, halt or cancel the installation for a while after it's finished.
|
||||||
|
std::this_thread::sleep_for(endWaitTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ struct Journal
|
|||||||
enum class Result
|
enum class Result
|
||||||
{
|
{
|
||||||
Success,
|
Success,
|
||||||
|
Cancelled,
|
||||||
VirtualFileSystemFailed,
|
VirtualFileSystemFailed,
|
||||||
DirectoryCreationFailed,
|
DirectoryCreationFailed,
|
||||||
FileMissing,
|
FileMissing,
|
||||||
@@ -75,10 +76,10 @@ struct Installer
|
|||||||
static bool checkDLCInstall(const std::filesystem::path &baseDirectory, DLC dlc);
|
static bool checkDLCInstall(const std::filesystem::path &baseDirectory, DLC dlc);
|
||||||
static bool checkAllDLC(const std::filesystem::path &baseDirectory);
|
static bool checkAllDLC(const std::filesystem::path &baseDirectory);
|
||||||
static bool computeTotalSize(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, Journal &journal, uint64_t &totalSize);
|
static bool computeTotalSize(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, Journal &journal, uint64_t &totalSize);
|
||||||
static bool copyFiles(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, const std::string &validationFile, bool skipHashChecks, Journal &journal, const std::function<void()> &progressCallback);
|
static bool copyFiles(std::span<const FilePair> filePairs, const uint64_t *fileHashes, VirtualFileSystem &sourceVfs, const std::filesystem::path &targetDirectory, const std::string &validationFile, bool skipHashChecks, Journal &journal, const std::function<bool()> &progressCallback);
|
||||||
static bool parseContent(const std::filesystem::path &sourcePath, std::unique_ptr<VirtualFileSystem> &targetVfs, Journal &journal);
|
static bool parseContent(const std::filesystem::path &sourcePath, std::unique_ptr<VirtualFileSystem> &targetVfs, Journal &journal);
|
||||||
static bool parseSources(const Input &input, Journal &journal, Sources &sources);
|
static bool parseSources(const Input &input, Journal &journal, Sources &sources);
|
||||||
static bool install(const Sources &sources, const std::filesystem::path &targetDirectory, bool skipHashChecks, Journal &journal, const std::function<void()> &progressCallback);
|
static bool install(const Sources &sources, const std::filesystem::path &targetDirectory, bool skipHashChecks, Journal &journal, std::chrono::seconds endWaitTime, const std::function<bool()> &progressCallback);
|
||||||
static void rollback(Journal &journal);
|
static void rollback(Journal &journal);
|
||||||
|
|
||||||
// Convenience method for checking if the specified file contains the game. This should be used when the user selects the file.
|
// Convenience method for checking if the specified file contains the game. This should be used when the user selects the file.
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#include <stdafx.h>
|
|
||||||
#include "file_system.h"
|
#include "file_system.h"
|
||||||
|
#include <cpu/guest_thread.h>
|
||||||
#include <kernel/xam.h>
|
#include <kernel/xam.h>
|
||||||
#include <kernel/xdm.h>
|
#include <kernel/xdm.h>
|
||||||
#include <kernel/function.h>
|
#include <kernel/function.h>
|
||||||
#include <cpu/guest_thread.h>
|
|
||||||
#include <os/logger.h>
|
|
||||||
#include <mod/mod_loader.h>
|
#include <mod/mod_loader.h>
|
||||||
|
#include <os/logger.h>
|
||||||
|
#include <user/config.h>
|
||||||
|
#include <stdafx.h>
|
||||||
|
|
||||||
struct FileHandle : KernelObject
|
struct FileHandle : KernelObject
|
||||||
{
|
{
|
||||||
@@ -365,8 +366,14 @@ std::filesystem::path FileSystem::ResolvePath(const std::string_view& path, bool
|
|||||||
if (checkForMods)
|
if (checkForMods)
|
||||||
{
|
{
|
||||||
std::filesystem::path resolvedPath = ModLoader::ResolvePath(path);
|
std::filesystem::path resolvedPath = ModLoader::ResolvePath(path);
|
||||||
|
|
||||||
if (!resolvedPath.empty())
|
if (!resolvedPath.empty())
|
||||||
|
{
|
||||||
|
if (ModLoader::s_isLogTypeConsole)
|
||||||
|
LOGF_IMPL(Utility, "Mod Loader", "Loading file: \"{}\"", reinterpret_cast<const char*>(resolvedPath.u8string().c_str()));
|
||||||
|
|
||||||
return resolvedPath;
|
return resolvedPath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thread_local std::string builtPath;
|
thread_local std::string builtPath;
|
||||||
|
|||||||
@@ -466,6 +466,18 @@ uint32_t XamInputGetState(uint32_t userIndex, uint32_t flags, XAMINPUT_STATE* st
|
|||||||
|
|
||||||
state->Gamepad.wButtons &= ~hid::g_prohibitedButtons;
|
state->Gamepad.wButtons &= ~hid::g_prohibitedButtons;
|
||||||
|
|
||||||
|
if (hid::g_isLeftStickProhibited)
|
||||||
|
{
|
||||||
|
state->Gamepad.sThumbLX = 0;
|
||||||
|
state->Gamepad.sThumbLY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hid::g_isRightStickProhibited)
|
||||||
|
{
|
||||||
|
state->Gamepad.sThumbRX = 0;
|
||||||
|
state->Gamepad.sThumbRY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ByteSwapInplace(state->Gamepad.wButtons);
|
ByteSwapInplace(state->Gamepad.wButtons);
|
||||||
ByteSwapInplace(state->Gamepad.sThumbLX);
|
ByteSwapInplace(state->Gamepad.sThumbLX);
|
||||||
ByteSwapInplace(state->Gamepad.sThumbLY);
|
ByteSwapInplace(state->Gamepad.sThumbLY);
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ namespace xdbf
|
|||||||
{
|
{
|
||||||
inline std::string& FixInvalidSequences(std::string& str)
|
inline std::string& FixInvalidSequences(std::string& str)
|
||||||
{
|
{
|
||||||
static std::vector<std::string> invalidSequences =
|
static std::array<std::string_view, 1> invalidSequences =
|
||||||
{
|
{
|
||||||
"\xE2\x80\x99"
|
"\xE2\x80\x99"
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<std::string> replaceSequences =
|
static std::array<std::string_view, 1> replaceSequences =
|
||||||
{
|
{
|
||||||
"'"
|
"'"
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -15,6 +15,28 @@
|
|||||||
360, which is one of the few consoles to have a port of Sonic
|
360, which is one of the few consoles to have a port of Sonic
|
||||||
Unleashed.
|
Unleashed.
|
||||||
|
|
||||||
|
- Ensure your locale is added in the correct order following the language enum.
|
||||||
|
|
||||||
|
Correct:
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Example" },
|
||||||
|
{ ELanguage::Japanese, "Example" },
|
||||||
|
{ ELanguage::German, "Example" },
|
||||||
|
{ ELanguage::French, "Example" },
|
||||||
|
{ ELanguage::Spanish, "Example" },
|
||||||
|
{ ELanguage::Italian, "Example" }
|
||||||
|
}
|
||||||
|
|
||||||
|
Incorrect:
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Example" },
|
||||||
|
{ ELanguage::French, "Example" },
|
||||||
|
{ ELanguage::Spanish, "Example" },
|
||||||
|
{ ELanguage::German, "Example" },
|
||||||
|
{ ELanguage::Italian, "Example" },
|
||||||
|
{ ELanguage::Japanese, "Example" }
|
||||||
|
}
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -27,13 +49,14 @@
|
|||||||
CONFIG_DEFINE_LOCALE(Language)
|
CONFIG_DEFINE_LOCALE(Language)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Language", "Change the language used for text and logos." } },
|
{ ELanguage::English, { "Language", "Change the language used for text and logos." } },
|
||||||
{ ELanguage::Japanese, { "言語", "[PLACEHOLDER]" } },
|
{ ELanguage::Japanese, { "言語", "" } },
|
||||||
{ ELanguage::German, { "Sprache", "[PLACEHOLDER]" } },
|
{ ELanguage::German, { "Sprache", "" } },
|
||||||
{ ELanguage::French, { "Langue", "[PLACEHOLDER]" } },
|
{ ELanguage::French, { "Langue", "" } },
|
||||||
{ ELanguage::Spanish, { "Idioma", "[PLACEHOLDER]" } },
|
{ ELanguage::Spanish, { "Idioma", "" } },
|
||||||
{ ELanguage::Italian, { "Lingua", "[PLACEHOLDER]" } }
|
{ ELanguage::Italian, { "Lingua", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Notes: do not localise this.
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(ELanguage)
|
CONFIG_DEFINE_ENUM_LOCALE(ELanguage)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -97,22 +120,42 @@ CONFIG_DEFINE_ENUM_LOCALE(EVoiceLanguage)
|
|||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Hints)
|
CONFIG_DEFINE_LOCALE(Hints)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Hints", "Show hint rings in stages." } }
|
{ ELanguage::English, { "Hints", "Show hints during gameplay." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(ControlTutorial)
|
CONFIG_DEFINE_LOCALE(ControlTutorial)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Control Tutorial", "Show controller hints in stages." } }
|
{ ELanguage::English, { "Control Tutorial", "Show controller hints during gameplay.\n\nThe Werehog Critical Attack prompt will be unaffected." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(AchievementNotifications)
|
CONFIG_DEFINE_LOCALE(AchievementNotifications)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Achievement Notifications", "Show notifications for unlocking achievements.\n\nAchievements will still be rewarded with notifications disabled." } }
|
{ ELanguage::English, { "Achievement Notifications", "Show notifications for unlocking achievements.\n\nAchievements will still be rewarded with notifications disabled." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(TimeOfDayTransition)
|
CONFIG_DEFINE_LOCALE(TimeOfDayTransition)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Time of Day Transition", "Change how the loading screen appears when switching time of day in the hub areas." } }
|
{ ELanguage::English, { "Time of Day Transition", "Change how the loading screen appears when switching time of day in the hub areas." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(ETimeOfDayTransition)
|
CONFIG_DEFINE_ENUM_LOCALE(ETimeOfDayTransition)
|
||||||
@@ -123,12 +166,52 @@ CONFIG_DEFINE_ENUM_LOCALE(ETimeOfDayTransition)
|
|||||||
{ ETimeOfDayTransition::Xbox, { "XBOX", "Xbox: the transformation cutscene will play with artificial loading times." } },
|
{ ETimeOfDayTransition::Xbox, { "XBOX", "Xbox: the transformation cutscene will play with artificial loading times." } },
|
||||||
{ ETimeOfDayTransition::PlayStation, { "PLAYSTATION", "PlayStation: a spinning medal loading screen will be used instead." } }
|
{ ETimeOfDayTransition::PlayStation, { "PLAYSTATION", "PlayStation: a spinning medal loading screen will be used instead." } }
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ ETimeOfDayTransition::Xbox, { "", "" } },
|
||||||
|
{ ETimeOfDayTransition::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ ETimeOfDayTransition::Xbox, { "", "" } },
|
||||||
|
{ ETimeOfDayTransition::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ ETimeOfDayTransition::Xbox, { "", "" } },
|
||||||
|
{ ETimeOfDayTransition::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ ETimeOfDayTransition::Xbox, { "", "" } },
|
||||||
|
{ ETimeOfDayTransition::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ ETimeOfDayTransition::Xbox, { "", "" } },
|
||||||
|
{ ETimeOfDayTransition::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(ControllerIcons)
|
CONFIG_DEFINE_LOCALE(ControllerIcons)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Controller Icons", "Change the icons to match your controller." } }
|
{ ELanguage::English, { "Controller Icons", "Change the icons to match your controller." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EControllerIcons)
|
CONFIG_DEFINE_ENUM_LOCALE(EControllerIcons)
|
||||||
@@ -140,17 +223,67 @@ CONFIG_DEFINE_ENUM_LOCALE(EControllerIcons)
|
|||||||
{ EControllerIcons::Xbox, { "XBOX", "" } },
|
{ EControllerIcons::Xbox, { "XBOX", "" } },
|
||||||
{ EControllerIcons::PlayStation, { "PLAYSTATION", "" } }
|
{ EControllerIcons::PlayStation, { "PLAYSTATION", "" } }
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EControllerIcons::Auto, { "", "" } },
|
||||||
|
{ EControllerIcons::Xbox, { "", "" } },
|
||||||
|
{ EControllerIcons::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EControllerIcons::Auto, { "", "" } },
|
||||||
|
{ EControllerIcons::Xbox, { "", "" } },
|
||||||
|
{ EControllerIcons::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EControllerIcons::Auto, { "", "" } },
|
||||||
|
{ EControllerIcons::Xbox, { "", "" } },
|
||||||
|
{ EControllerIcons::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EControllerIcons::Auto, { "", "" } },
|
||||||
|
{ EControllerIcons::Xbox, { "", "" } },
|
||||||
|
{ EControllerIcons::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EControllerIcons::Auto, { "", "" } },
|
||||||
|
{ EControllerIcons::Xbox, { "", "" } },
|
||||||
|
{ EControllerIcons::PlayStation, { "", "" } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(HorizontalCamera)
|
CONFIG_DEFINE_LOCALE(HorizontalCamera)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Horizontal Camera", "Change how the camera moves left and right." } }
|
{ ELanguage::English, { "Horizontal Camera", "Change how the camera moves left and right." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(VerticalCamera)
|
CONFIG_DEFINE_LOCALE(VerticalCamera)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Vertical Camera", "Change how the camera moves up and down." } }
|
{ ELanguage::English, { "Vertical Camera", "Change how the camera moves up and down." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(ECameraRotationMode)
|
CONFIG_DEFINE_ENUM_LOCALE(ECameraRotationMode)
|
||||||
@@ -161,42 +294,112 @@ CONFIG_DEFINE_ENUM_LOCALE(ECameraRotationMode)
|
|||||||
{ ECameraRotationMode::Normal, { "NORMAL", "" } },
|
{ ECameraRotationMode::Normal, { "NORMAL", "" } },
|
||||||
{ ECameraRotationMode::Reverse, { "REVERSE", "" } }
|
{ ECameraRotationMode::Reverse, { "REVERSE", "" } }
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ ECameraRotationMode::Normal, { "", "" } },
|
||||||
|
{ ECameraRotationMode::Reverse, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ ECameraRotationMode::Normal, { "", "" } },
|
||||||
|
{ ECameraRotationMode::Reverse, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ ECameraRotationMode::Normal, { "", "" } },
|
||||||
|
{ ECameraRotationMode::Reverse, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ ECameraRotationMode::Normal, { "", "" } },
|
||||||
|
{ ECameraRotationMode::Reverse, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ ECameraRotationMode::Normal, { "", "" } },
|
||||||
|
{ ECameraRotationMode::Reverse, { "", "" } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Vibration)
|
CONFIG_DEFINE_LOCALE(Vibration)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Vibration", "Toggle controller vibration." } }
|
{ ELanguage::English, { "Vibration", "Toggle controller vibration." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(AllowBackgroundInput)
|
CONFIG_DEFINE_LOCALE(AllowBackgroundInput)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Allow Background Input", "Allow controller input whilst the game window is unfocused." } }
|
{ ELanguage::English, { "Allow Background Input", "Allow controller input whilst the game window is unfocused." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(MasterVolume)
|
CONFIG_DEFINE_LOCALE(MasterVolume)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Master Volume", "Adjust the overall volume." } }
|
{ ELanguage::English, { "Master Volume", "Adjust the overall volume." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(MusicVolume)
|
CONFIG_DEFINE_LOCALE(MusicVolume)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Music Volume", "Adjust the volume for the music." } }
|
{ ELanguage::English, { "Music Volume", "Adjust the volume for the music." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(EffectsVolume)
|
CONFIG_DEFINE_LOCALE(EffectsVolume)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Effects Volume", "Adjust the volume for sound effects." } }
|
{ ELanguage::English, { "Effects Volume", "Adjust the volume for sound effects." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(MusicAttenuation)
|
CONFIG_DEFINE_LOCALE(MusicAttenuation)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Music Attenuation", "Fade out the game's music when external media is playing." } }
|
{ ELanguage::English, { "Music Attenuation", "Fade out the game's music when external media is playing." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(ChannelConfiguration)
|
CONFIG_DEFINE_LOCALE(ChannelConfiguration)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Channel Configuration", "" } }
|
{ ELanguage::English, { "Channel Configuration", "Change the output mode for your audio device." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EChannelConfiguration)
|
CONFIG_DEFINE_ENUM_LOCALE(EChannelConfiguration)
|
||||||
@@ -207,37 +410,102 @@ CONFIG_DEFINE_ENUM_LOCALE(EChannelConfiguration)
|
|||||||
{ EChannelConfiguration::Stereo, { "STEREO", "" } },
|
{ EChannelConfiguration::Stereo, { "STEREO", "" } },
|
||||||
{ EChannelConfiguration::Surround, { "SURROUND", "" } }
|
{ EChannelConfiguration::Surround, { "SURROUND", "" } }
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EChannelConfiguration::Stereo, { "", "" } },
|
||||||
|
{ EChannelConfiguration::Surround, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EChannelConfiguration::Stereo, { "", "" } },
|
||||||
|
{ EChannelConfiguration::Surround, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EChannelConfiguration::Stereo, { "", "" } },
|
||||||
|
{ EChannelConfiguration::Surround, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EChannelConfiguration::Stereo, { "", "" } },
|
||||||
|
{ EChannelConfiguration::Surround, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EChannelConfiguration::Stereo, { "", "" } },
|
||||||
|
{ EChannelConfiguration::Surround, { "", "" } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(VoiceLanguage)
|
CONFIG_DEFINE_LOCALE(VoiceLanguage)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Voice Language", "Change the language used for character voices." } }
|
{ ELanguage::English, { "Voice Language", "Change the language used for character voices." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Subtitles)
|
CONFIG_DEFINE_LOCALE(Subtitles)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Subtitles", "Show subtitles during dialogue." } }
|
{ ELanguage::English, { "Subtitles", "Show subtitles during dialogue." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(BattleTheme)
|
CONFIG_DEFINE_LOCALE(BattleTheme)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Battle Theme", "Play the Werehog battle theme during combat.\n\nThis option will apply the next time you're in combat." } }
|
{ ELanguage::English, { "Battle Theme", "Play the Werehog battle theme during combat.\n\nThis option will apply the next time you're in combat.\n\nExorcism missions and miniboss themes will be unaffected." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(WindowSize)
|
CONFIG_DEFINE_LOCALE(WindowSize)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Window Size", "Adjust the size of the game window in windowed mode." } }
|
{ ELanguage::English, { "Window Size", "Adjust the size of the game window in windowed mode." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Monitor)
|
CONFIG_DEFINE_LOCALE(Monitor)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Monitor", "Change which monitor to display the game on." } }
|
{ ELanguage::English, { "Monitor", "Change which monitor to display the game on." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(AspectRatio)
|
CONFIG_DEFINE_LOCALE(AspectRatio)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Aspect Ratio", "Change the aspect ratio." } }
|
{ ELanguage::English, { "Aspect Ratio", "Change the aspect ratio." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio)
|
CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio)
|
||||||
@@ -246,39 +514,116 @@ CONFIG_DEFINE_ENUM_LOCALE(EAspectRatio)
|
|||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ EAspectRatio::Auto, { "AUTO", "Auto: the aspect ratio will dynamically adjust to the window size." } },
|
{ EAspectRatio::Auto, { "AUTO", "Auto: the aspect ratio will dynamically adjust to the window size." } },
|
||||||
{ EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "" } }
|
{ EAspectRatio::Wide, { "16:9", "16:9: locks the game to a widescreen aspect ratio." } },
|
||||||
|
{ EAspectRatio::Narrow, { "4:3", "4:3: locks the game to a narrow aspect ratio." } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "ORIGINAL 4:3", "Original 4:3: locks the game to a narrow aspect ratio and retains parity with the game's original implementation." } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EAspectRatio::Auto, { "", "" } },
|
||||||
|
{ EAspectRatio::Wide, { "", "" } },
|
||||||
|
{ EAspectRatio::Narrow, { "", "" } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EAspectRatio::Auto, { "", "" } },
|
||||||
|
{ EAspectRatio::Wide, { "", "" } },
|
||||||
|
{ EAspectRatio::Narrow, { "", "" } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EAspectRatio::Auto, { "", "" } },
|
||||||
|
{ EAspectRatio::Wide, { "", "" } },
|
||||||
|
{ EAspectRatio::Narrow, { "", "" } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EAspectRatio::Auto, { "", "" } },
|
||||||
|
{ EAspectRatio::Wide, { "", "" } },
|
||||||
|
{ EAspectRatio::Narrow, { "", "" } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EAspectRatio::Auto, { "", "" } },
|
||||||
|
{ EAspectRatio::Wide, { "", "" } },
|
||||||
|
{ EAspectRatio::Narrow, { "", "" } },
|
||||||
|
{ EAspectRatio::OriginalNarrow, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(ResolutionScale)
|
CONFIG_DEFINE_LOCALE(ResolutionScale)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Resolution Scale", "Adjust the internal resolution of the game.\n\n%dx%d" } }
|
{ ELanguage::English, { "Resolution Scale", "Adjust the internal resolution of the game.\n\n%dx%d" } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Fullscreen)
|
CONFIG_DEFINE_LOCALE(Fullscreen)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Fullscreen", "Toggle between borderless fullscreen or windowed mode." } }
|
{ ELanguage::English, { "Fullscreen", "Toggle between borderless fullscreen or windowed mode." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(VSync)
|
CONFIG_DEFINE_LOCALE(VSync)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "V-Sync", "Synchronize the game to the refresh rate of the display to prevent screen tearing." } }
|
{ ELanguage::English, { "V-Sync", "Synchronize the game to the refresh rate of the display to prevent screen tearing." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(FPS)
|
CONFIG_DEFINE_LOCALE(FPS)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "FPS", "Set the max frame rate the game can run at.\n\nWARNING: this may introduce glitches at frame rates higher than 60 FPS." } }
|
{ ELanguage::English, { "FPS", "Set the max frame rate the game can run at.\n\nWARNING: this may introduce glitches at frame rates higher than 60 FPS." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(Brightness)
|
CONFIG_DEFINE_LOCALE(Brightness)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Brightness", "Adjust the brightness level of the game." } }
|
{ ELanguage::English, { "Brightness", "Adjust the brightness level until the symbol on the left is barely visible." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(AntiAliasing)
|
CONFIG_DEFINE_LOCALE(AntiAliasing)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Anti-Aliasing", "Adjust the amount of smoothing applied to jagged edges." } }
|
{ ELanguage::English, { "Anti-Aliasing", "Adjust the amount of smoothing applied to jagged edges." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing)
|
CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing)
|
||||||
@@ -286,19 +631,59 @@ CONFIG_DEFINE_ENUM_LOCALE(EAntiAliasing)
|
|||||||
{
|
{
|
||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ EAntiAliasing::None, { "NONE", "" } },
|
{ EAntiAliasing::None, { "NONE", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EAntiAliasing::None, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EAntiAliasing::None, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EAntiAliasing::None, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EAntiAliasing::None, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EAntiAliasing::None, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(TransparencyAntiAliasing)
|
CONFIG_DEFINE_LOCALE(TransparencyAntiAliasing)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Transparency Anti-Aliasing", "Apply anti-aliasing to alpha transparent textures." } }
|
{ ELanguage::English, { "Transparency Anti-Aliasing", "Apply anti-aliasing to alpha transparent textures." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(ShadowResolution)
|
CONFIG_DEFINE_LOCALE(ShadowResolution)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Shadow Resolution", "Set the resolution of real-time shadows." } }
|
{ ELanguage::English, { "Shadow Resolution", "Set the resolution of real-time shadows." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution)
|
CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution)
|
||||||
@@ -306,16 +691,49 @@ CONFIG_DEFINE_ENUM_LOCALE(EShadowResolution)
|
|||||||
{
|
{
|
||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ EShadowResolution::Original, { "ORIGINAL", "Original: the game will automatically determine the resolution of the shadows." } },
|
{ EShadowResolution::Original, { "ORIGINAL", "Original: the game will automatically determine the resolution of the shadows." } }
|
||||||
{ EShadowResolution::x4096, { "4096", "High resolutions can degrade performance significantly on lower end hardware." } },
|
}
|
||||||
{ EShadowResolution::x8192, { "8192", "High resolutions can degrade performance significantly on lower end hardware." } },
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EShadowResolution::Original, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EShadowResolution::Original, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EShadowResolution::Original, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EShadowResolution::Original, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EShadowResolution::Original, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(GITextureFiltering)
|
CONFIG_DEFINE_LOCALE(GITextureFiltering)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "GI Texture Filtering", "Change the quality of the filtering used for global illumination textures." } }
|
{ ELanguage::English, { "GI Texture Filtering", "Change the quality of the filtering used for global illumination textures." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering)
|
CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering)
|
||||||
@@ -324,14 +742,54 @@ CONFIG_DEFINE_ENUM_LOCALE(EGITextureFiltering)
|
|||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ EGITextureFiltering::Bilinear, { "BILINEAR", "" } },
|
{ EGITextureFiltering::Bilinear, { "BILINEAR", "" } },
|
||||||
{ EGITextureFiltering::Bicubic, { "BICUBIC", "" } },
|
{ EGITextureFiltering::Bicubic, { "BICUBIC", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EGITextureFiltering::Bilinear, { "", "" } },
|
||||||
|
{ EGITextureFiltering::Bicubic, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EGITextureFiltering::Bilinear, { "", "" } },
|
||||||
|
{ EGITextureFiltering::Bicubic, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EGITextureFiltering::Bilinear, { "", "" } },
|
||||||
|
{ EGITextureFiltering::Bicubic, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EGITextureFiltering::Bilinear, { "", "" } },
|
||||||
|
{ EGITextureFiltering::Bicubic, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EGITextureFiltering::Bilinear, { "", "" } },
|
||||||
|
{ EGITextureFiltering::Bicubic, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(MotionBlur)
|
CONFIG_DEFINE_LOCALE(MotionBlur)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Motion Blur", "Change the quality of the motion blur." } }
|
{ ELanguage::English, { "Motion Blur", "Change the quality of the motion blur." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EMotionBlur)
|
CONFIG_DEFINE_ENUM_LOCALE(EMotionBlur)
|
||||||
@@ -343,17 +801,67 @@ CONFIG_DEFINE_ENUM_LOCALE(EMotionBlur)
|
|||||||
{ EMotionBlur::Original, { "ORIGINAL", "" } },
|
{ EMotionBlur::Original, { "ORIGINAL", "" } },
|
||||||
{ EMotionBlur::Enhanced, { "ENHANCED", "Enhanced: uses more samples for smoother motion blur at the cost of performance." } }
|
{ EMotionBlur::Enhanced, { "ENHANCED", "Enhanced: uses more samples for smoother motion blur at the cost of performance." } }
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EMotionBlur::Off, { "", "" } },
|
||||||
|
{ EMotionBlur::Original, { "", "" } },
|
||||||
|
{ EMotionBlur::Enhanced, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EMotionBlur::Off, { "", "" } },
|
||||||
|
{ EMotionBlur::Original, { "", "" } },
|
||||||
|
{ EMotionBlur::Enhanced, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EMotionBlur::Off, { "", "" } },
|
||||||
|
{ EMotionBlur::Original, { "", "" } },
|
||||||
|
{ EMotionBlur::Enhanced, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EMotionBlur::Off, { "", "" } },
|
||||||
|
{ EMotionBlur::Original, { "", "" } },
|
||||||
|
{ EMotionBlur::Enhanced, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EMotionBlur::Off, { "", "" } },
|
||||||
|
{ EMotionBlur::Original, { "", "" } },
|
||||||
|
{ EMotionBlur::Enhanced, { "", "" } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(XboxColorCorrection)
|
CONFIG_DEFINE_LOCALE(XboxColorCorrection)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Xbox Color Correction", "Use the warm tint from the Xbox version of the game." } }
|
{ ELanguage::English, { "Xbox Color Correction", "Use the warm tint from the Xbox version of the game." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(CutsceneAspectRatio)
|
CONFIG_DEFINE_LOCALE(CutsceneAspectRatio)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "Cutscene Aspect Ratio", "" } }
|
{ ELanguage::English, { "Cutscene Aspect Ratio", "Change the aspect ratio of the real-time cutscenes." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(ECutsceneAspectRatio)
|
CONFIG_DEFINE_ENUM_LOCALE(ECutsceneAspectRatio)
|
||||||
@@ -361,24 +869,99 @@ CONFIG_DEFINE_ENUM_LOCALE(ECutsceneAspectRatio)
|
|||||||
{
|
{
|
||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ ECutsceneAspectRatio::Original, { "ORIGINAL", "" } },
|
{ ECutsceneAspectRatio::Original, { "ORIGINAL", "Original: locks cutscenes to their original 16:9 aspect ratio." } },
|
||||||
{ ECutsceneAspectRatio::Unlocked, { "UNLOCKED", "" } },
|
{ ECutsceneAspectRatio::Unlocked, { "UNLOCKED", "Unlocked: allows cutscenes to adjust their aspect ratio to the window size.\n\nWARNING: this will introduce visual oddities past the original 16:9 aspect ratio." } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ ECutsceneAspectRatio::Original, { "", "" } },
|
||||||
|
{ ECutsceneAspectRatio::Unlocked, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ ECutsceneAspectRatio::Original, { "", "" } },
|
||||||
|
{ ECutsceneAspectRatio::Unlocked, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ ECutsceneAspectRatio::Original, { "", "" } },
|
||||||
|
{ ECutsceneAspectRatio::Unlocked, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ ECutsceneAspectRatio::Original, { "", "" } },
|
||||||
|
{ ECutsceneAspectRatio::Unlocked, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ ECutsceneAspectRatio::Original, { "", "" } },
|
||||||
|
{ ECutsceneAspectRatio::Unlocked, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_LOCALE(UIScaleMode)
|
CONFIG_DEFINE_LOCALE(UIAlignmentMode)
|
||||||
{
|
{
|
||||||
{ ELanguage::English, { "UI Scale Mode", "Change how the UI scales to the display." } }
|
{ ELanguage::English, { "UI Alignment Mode", "Change how the UI aligns with the display." } },
|
||||||
|
{ ELanguage::Japanese, { "", "" } },
|
||||||
|
{ ELanguage::German, { "", "" } },
|
||||||
|
{ ELanguage::French, { "", "" } },
|
||||||
|
{ ELanguage::Spanish, { "", "" } },
|
||||||
|
{ ELanguage::Italian, { "", "" } }
|
||||||
};
|
};
|
||||||
|
|
||||||
CONFIG_DEFINE_ENUM_LOCALE(EUIScaleMode)
|
CONFIG_DEFINE_ENUM_LOCALE(EUIAlignmentMode)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
ELanguage::English,
|
ELanguage::English,
|
||||||
{
|
{
|
||||||
{ EUIScaleMode::Edge, { "EDGE", "Edge: the UI will anchor to the edges of the display." } },
|
{ EUIAlignmentMode::Edge, { "EDGE", "Edge: the UI will align with the edges of the display." } },
|
||||||
{ EUIScaleMode::Centre, { "CENTER", "Center: the UI will anchor to the center of the display." } },
|
{ EUIAlignmentMode::Centre, { "CENTER", "Center: the UI will align with the center of the display." } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Japanese,
|
||||||
|
{
|
||||||
|
{ EUIAlignmentMode::Edge, { "", "" } },
|
||||||
|
{ EUIAlignmentMode::Centre, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::German,
|
||||||
|
{
|
||||||
|
{ EUIAlignmentMode::Edge, { "", "" } },
|
||||||
|
{ EUIAlignmentMode::Centre, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::French,
|
||||||
|
{
|
||||||
|
{ EUIAlignmentMode::Edge, { "", "" } },
|
||||||
|
{ EUIAlignmentMode::Centre, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Spanish,
|
||||||
|
{
|
||||||
|
{ EUIAlignmentMode::Edge, { "", "" } },
|
||||||
|
{ EUIAlignmentMode::Centre, { "", "" } }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ELanguage::Italian,
|
||||||
|
{
|
||||||
|
{ EUIAlignmentMode::Edge, { "", "" } },
|
||||||
|
{ EUIAlignmentMode::Centre, { "", "" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+419
-104
@@ -16,6 +16,28 @@
|
|||||||
360, which is one of the few consoles to have a port of Sonic
|
360, which is one of the few consoles to have a port of Sonic
|
||||||
Unleashed.
|
Unleashed.
|
||||||
|
|
||||||
|
- Ensure your locale is added in the correct order following the language enum.
|
||||||
|
|
||||||
|
Correct:
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Example" },
|
||||||
|
{ ELanguage::Japanese, "Example" },
|
||||||
|
{ ELanguage::German, "Example" },
|
||||||
|
{ ELanguage::French, "Example" },
|
||||||
|
{ ELanguage::Spanish, "Example" },
|
||||||
|
{ ELanguage::Italian, "Example" }
|
||||||
|
}
|
||||||
|
|
||||||
|
Incorrect:
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Example" },
|
||||||
|
{ ELanguage::French, "Example" },
|
||||||
|
{ ELanguage::Spanish, "Example" },
|
||||||
|
{ ELanguage::German, "Example" },
|
||||||
|
{ ELanguage::Italian, "Example" },
|
||||||
|
{ ELanguage::Japanese, "Example" }
|
||||||
|
}
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -24,327 +46,550 @@ std::unordered_map<std::string, std::unordered_map<ELanguage, std::string>> g_lo
|
|||||||
{
|
{
|
||||||
"Options_Header_Name",
|
"Options_Header_Name",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "OPTIONS" },
|
{ ELanguage::English, "OPTIONS" },
|
||||||
{ ELanguage::Japanese, "OPTION" },
|
{ ELanguage::Japanese, "OPTION" },
|
||||||
{ ELanguage::German, "OPTIONEN" },
|
{ ELanguage::German, "OPTIONEN" },
|
||||||
{ ELanguage::French, "OPTIONS" },
|
{ ELanguage::French, "OPTIONS" },
|
||||||
{ ELanguage::Spanish, "OPCIONES" },
|
{ ELanguage::Spanish, "OPCIONES" },
|
||||||
{ ELanguage::Italian, "OPZIONI" }
|
{ ELanguage::Italian, "OPZIONI" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Category_System",
|
"Options_Category_System",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "SYSTEM" }
|
{ ELanguage::English, "SYSTEM" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Category_Input",
|
"Options_Category_Input",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "INPUT" }
|
{ ELanguage::English, "INPUT" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Category_Audio",
|
"Options_Category_Audio",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "AUDIO" }
|
{ ELanguage::English, "AUDIO" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Category_Video",
|
"Options_Category_Video",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "VIDEO" }
|
{ ELanguage::English, "VIDEO" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: integer values in the options menu (e.g. FPS) when at their maximum value.
|
// Notes: integer values in the options menu (e.g. FPS) when at their maximum value.
|
||||||
"Options_Value_Max",
|
"Options_Value_Max",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "MAX" }
|
{ ELanguage::English, "MAX" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Name_WindowSize",
|
"Options_Name_WindowSize",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Window Size" }
|
{ ELanguage::English, "Window Size" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Options_Desc_WindowSize",
|
"Options_Desc_WindowSize",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Adjust the size of the game window in windowed mode." }
|
{ ELanguage::English, "Adjust the size of the game window in windowed mode." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: description for options that cannot be accessed anywhere but the title screen or world map (e.g. Language).
|
// Notes: description for options that cannot be accessed anywhere but the title screen or world map (e.g. Language).
|
||||||
"Options_Desc_NotAvailable",
|
"Options_Desc_NotAvailable",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not available at this location." }
|
{ ELanguage::English, "This option is not available at this location." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: currently the description for Window Size when in fullscreen.
|
// Notes: currently the description for Window Size when in fullscreen.
|
||||||
"Options_Desc_NotAvailableFullscreen",
|
"Options_Desc_NotAvailableFullscreen",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not available in fullscreen mode." }
|
{ ELanguage::English, "This option is not available in fullscreen mode." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: currently the description for Monitor when in fullscreen.
|
// Notes: currently the description for Monitor when in fullscreen.
|
||||||
"Options_Desc_NotAvailableWindowed",
|
"Options_Desc_NotAvailableWindowed",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not available in windowed mode." }
|
{ ELanguage::English, "This option is not available in windowed mode." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: currently the description for Monitor when the user only has one display connected.
|
// Notes: currently the description for Monitor when the user only has one display connected.
|
||||||
"Options_Desc_NotAvailableHardware",
|
"Options_Desc_NotAvailableHardware",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not available with your current hardware configuration." }
|
{ ELanguage::English, "This option is not available with your current hardware configuration." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: description for Transparency Anti-Aliasing when MSAA is disabled.
|
// Notes: description for Transparency Anti-Aliasing when MSAA is disabled.
|
||||||
"Options_Desc_NotAvailableMSAA",
|
"Options_Desc_NotAvailableMSAA",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not available without MSAA." }
|
{ ELanguage::English, "This option is not available without MSAA." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: description for Music Attenuation when the user is not running a supported OS.
|
// Notes: description for Music Attenuation when the user is not running a supported OS.
|
||||||
"Options_Desc_OSNotSupported",
|
"Options_Desc_OSNotSupported",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This option is not supported by your operating system." }
|
{ ELanguage::English, "This option is not supported by your operating system." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when changing the Language option and backing out of the options menu.
|
// Notes: message appears when changing the Language option and backing out of the options menu.
|
||||||
"Options_Message_Restart",
|
"Options_Message_Restart",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The game will now restart." }
|
{ ELanguage::English, "The game will now restart." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: used for the button guide at the pause menu.
|
// Notes: used for the button guide at the pause menu.
|
||||||
"Achievements_Name",
|
"Achievements_Name",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Achievements" }
|
{ ELanguage::English, "Achievements" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: used for the header in the achievements menu.
|
// Notes: used for the header in the achievements menu.
|
||||||
"Achievements_Name_Uppercase",
|
"Achievements_Name_Uppercase",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "ACHIEVEMENTS" }
|
{ ELanguage::English, "ACHIEVEMENTS" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Achievements_Unlock",
|
"Achievements_Unlock",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Achievement Unlocked!" }
|
{ ELanguage::English, "Achievement Unlocked!" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Header_Installer",
|
"Installer_Header_Installer",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "INSTALLER" },
|
{ ELanguage::English, "INSTALLER" },
|
||||||
{ ELanguage::Spanish, "INSTALADOR" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::Italian, "INSTALLATORE" },
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "INSTALADOR" },
|
||||||
|
{ ELanguage::Italian, "INSTALLATORE" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Header_Installing",
|
"Installer_Header_Installing",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "INSTALLING" },
|
{ ELanguage::English, "INSTALLING" },
|
||||||
{ ELanguage::Spanish, "INSTALANDO" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::Italian, "INSTALLANDO" },
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "INSTALANDO" },
|
||||||
|
{ ELanguage::Italian, "INSTALLANDO" },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_SelectLanguage",
|
"Installer_Page_SelectLanguage",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Please select a language." },
|
{ ELanguage::English, "Please select a language." },
|
||||||
{ ELanguage::Italian, "Seleziona una lingua." }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Seleziona una lingua." }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_Introduction",
|
"Installer_Page_Introduction",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Welcome to\nUnleashed Recompiled!\n\nYou'll need an Xbox 360 copy\nof Sonic Unleashed in order to proceed with the installation." },
|
{ ELanguage::English, "Welcome to\nUnleashed Recompiled!\n\nYou'll need an Xbox 360 copy\nof Sonic Unleashed in order to proceed with the installation." },
|
||||||
{ ELanguage::Italian, "Benvenuto a\nUnleashed Recompiled!\n\nDovrai avere una copia di\nSonic Unleashed per la Xbox 360\nper proseguire con l'installazione." }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Benvenuto a\nUnleashed Recompiled!\n\nDovrai avere una copia di\nSonic Unleashed per la Xbox 360\nper proseguire con l'installazione." }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_SelectGameAndUpdate",
|
"Installer_Page_SelectGameAndUpdate",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Add the sources for the game and its title update." }
|
{ ELanguage::English, "Add the sources for the game and its title update." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_SelectDLC",
|
"Installer_Page_SelectDLC",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Add the sources for the DLC." }
|
{ ELanguage::English, "Add the sources for the DLC." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_CheckSpace",
|
"Installer_Page_CheckSpace",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The content will be installed to the program's folder.\n\nPlease confirm that you have enough free space.\n\n" },
|
{ ELanguage::English, "The content will be installed to the program's folder.\n\n" },
|
||||||
{ ELanguage::Italian, "Il contenuto verrà installato nella cartella di questo programma. Assicurati di avere abbastanza spazio libero sul tuo hard disk.\n\n" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Il contenuto verrà installato nella cartella di questo programma.\n\n" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_Installing",
|
"Installer_Page_Installing",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Please wait while the content is being installed..." },
|
{ ELanguage::English, "Please wait while the content is being installed..." },
|
||||||
{ ELanguage::Italian, "Attendi mentre il contenuto viene installato... " }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Attendi mentre il contenuto viene installato... " }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_InstallSucceeded",
|
"Installer_Page_InstallSucceeded",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Installation complete!\nThis project is brought to you by:" }
|
{ ELanguage::English, "Installation complete!\nThis project is brought to you by:" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Page_InstallFailed",
|
"Installer_Page_InstallFailed",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Installation failed.\n\nError:\n\n" },
|
{ ELanguage::English, "Installation failed.\n\nError:\n\n" },
|
||||||
{ ELanguage::Italian, "Installazione fallita.\n\nErrore:\n\n" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Installazione fallita.\n\nErrore:\n\n" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Step_Game",
|
"Installer_Step_Game",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "GAME" },
|
{ ELanguage::English, "GAME" },
|
||||||
{ ELanguage::Italian, "GIOCO" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "GIOCO" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Step_Update",
|
"Installer_Step_Update",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "UPDATE" },
|
{ ELanguage::English, "UPDATE" },
|
||||||
{ ELanguage::Italian, "AGGIORNAMENTO" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "AGGIORNAMENTO" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Step_RequiredSpace",
|
"Installer_Step_RequiredSpace",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Required space: %2.2f GiB" },
|
{ ELanguage::English, "Required space: %2.2f GiB" },
|
||||||
{ ELanguage::Italian, "Spazio necessario: %2.2f GiB" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Spazio necessario: %2.2f GiB" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Step_AvailableSpace",
|
"Installer_Step_AvailableSpace",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Available space: %2.2f GiB" },
|
{ ELanguage::English, "Available space: %2.2f GiB" },
|
||||||
{ ELanguage::Italian, "Spazio disponibile: %2.2f GiB" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Spazio disponibile: %2.2f GiB" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Button_Next",
|
"Installer_Button_Next",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "NEXT" },
|
{ ELanguage::English, "NEXT" },
|
||||||
{ ELanguage::Spanish, "SIGUIENTE" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::German, "WEITER" },
|
{ ELanguage::German, "WEITER" },
|
||||||
{ ELanguage::Italian, "CONTINUA" }
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "SIGUIENTE" },
|
||||||
|
{ ELanguage::Italian, "CONTINUA" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Button_Skip",
|
"Installer_Button_Skip",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "SKIP" },
|
{ ELanguage::English, "SKIP" },
|
||||||
{ ELanguage::Spanish, "SALTAR" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::German, "ÜBERSPRINGEN" },
|
{ ELanguage::German, "ÜBERSPRINGEN" },
|
||||||
{ ELanguage::Italian, "SALTA" }
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "SALTAR" },
|
||||||
|
{ ELanguage::Italian, "SALTA" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Installer_Button_Retry",
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "RETRY" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Button_AddFiles",
|
"Installer_Button_AddFiles",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "ADD FILES" },
|
{ ELanguage::English, "ADD FILES" },
|
||||||
{ ELanguage::Spanish, "AÑADIR ARCHIVOS" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::German, "DATEIEN HINZUFÜGEN" },
|
{ ELanguage::German, "DATEIEN HINZUFÜGEN" },
|
||||||
{ ELanguage::Italian, "AGGIUNGI FILE" }
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "AÑADIR ARCHIVOS" },
|
||||||
|
{ ELanguage::Italian, "AGGIUNGI FILE" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Installer_Button_AddFolder",
|
"Installer_Button_AddFolder",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "ADD FOLDER" },
|
{ ELanguage::English, "ADD FOLDER" },
|
||||||
{ ELanguage::Spanish, "AÑADIR CARPETA" },
|
{ ELanguage::Japanese, "" },
|
||||||
{ ELanguage::German, "ORDNER HINZUFÜGEN" },
|
{ ELanguage::German, "ORDNER HINZUFÜGEN" },
|
||||||
{ ELanguage::Italian, "AGGIUNGI CARTELLA" }
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "AÑADIR CARPETA" },
|
||||||
|
{ ELanguage::Italian, "AGGIUNGI CARTELLA" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when using the "Add Files" option and choosing any file that is not an Xbox 360 game dump.
|
// Notes: message appears when using the "Add Files" option and choosing any file that is not an Xbox 360 game dump.
|
||||||
"Installer_Message_InvalidFilesList",
|
"Installer_Message_InvalidFilesList",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The following selected files are invalid:" },
|
{ ELanguage::English, "The following selected files are invalid:" },
|
||||||
{ ELanguage::Italian, "I seguenti file non sono validi:" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "I seguenti file non sono validi:" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears in the event there are some invalid files after adding the DLC and moving onto the next step.
|
// Notes: message appears in the event there are some invalid files after adding the DLC and moving onto the next step.
|
||||||
"Installer_Message_InvalidFiles",
|
"Installer_Message_InvalidFiles",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Some of the files that have\nbeen provided are not valid.\n\nPlease make sure all the\nspecified files are correct\nand try again." },
|
{ ELanguage::English, "Some of the files that have\nbeen provided are not valid.\n\nPlease make sure all the\nspecified files are correct\nand try again." },
|
||||||
{ ELanguage::Italian, "Alcuni dei file che sono stati\nselezionati non sono validi.\n\nAssicurati che tutti\ni file sono quelli corretti\ne riprova." }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Alcuni dei file che sono stati\nselezionati non sono validi.\n\nAssicurati che tutti\ni file sono quelli corretti\ne riprova." }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when clicking the "Add Files" option for the first time.
|
// Notes: message appears when clicking the "Add Files" option for the first time.
|
||||||
"Installer_Message_FilePickerTutorial",
|
"Installer_Message_FilePickerTutorial",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Select a digital dump.\n\nFor choosing a folder with\nextracted and unmodified\ngame files, use the\n\"Add Folder\" option instead." },
|
{ ELanguage::English, "Select a digital dump with\ncontent from the game.\n\nThese files can be obtained from\nyour Xbox 360 hard drive by\nfollowing the instructions on\nthe GitHub page.\n\nFor choosing a folder with extracted\nand unmodified game files, use\nthe \"Add Folder\" option instead." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when clicking the "Add Folder" option for the first time.
|
// Notes: message appears when clicking the "Add Folder" option for the first time.
|
||||||
"Installer_Message_FolderPickerTutorial",
|
"Installer_Message_FolderPickerTutorial",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Select a folder that contains\nthe unmodified files that have\nbeen extracted from the game.\n\nFor choosing a digital dump,\nuse the\"Add Files\" option instead." },
|
{ ELanguage::English, "Select a folder that contains the\nunmodified files that have been\nextracted from the game.\n\nThese files can be obtained from\nyour Xbox 360 hard drive by\nfollowing the instructions on\nthe GitHub page.\n\nFor choosing a digital dump,\nuse the\"Add Files\" option instead." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when providing a title update that does not match the region or version of the game dump.
|
// Notes: message appears when providing a title update that does not match the region or version of the game dump.
|
||||||
"Installer_Message_IncompatibleGameData",
|
"Installer_Message_IncompatibleGameData",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The specified game and\ntitle update are incompatible.\n\nPlease ensure the files are\nfor the same version and\nregion and try again." },
|
{ ELanguage::English, "The specified game and\ntitle update are incompatible.\n\nPlease ensure the files are\nfor the same version and\nregion and try again." },
|
||||||
{ ELanguage::Italian, "I file del gioco\ne dell'aggiornamento sono incompatibili.\n\nAssicurati che i file sono\ndella stessa versione\ne regione e riprova." }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "I file del gioco\ne dell'aggiornamento sono incompatibili.\n\nAssicurati che i file sono\ndella stessa versione\ne regione e riprova." }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when clicking Skip at the DLC step.
|
// Notes: message appears when clicking Skip at the DLC step.
|
||||||
"Installer_Message_DLCWarning",
|
"Installer_Message_DLCWarning",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "It is highly recommended\nthat you install all of the\nDLC, as it includes high\nquality lighting textures\nfor the base game.\n\nAre you sure you want to\nskip this step?" },
|
{ ELanguage::English, "It is highly recommended\nthat you install all of the\nDLC, as it includes high\nquality lighting textures\nfor the base game.\n\nAre you sure you want to\nskip this step?" },
|
||||||
{ ELanguage::Italian, "Si consiglia di installare\ntutti i DLC, poichè includono\ntexture di illuminazione di qualità migliore.\n\nSei sicuro di voler saltare?" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Si consiglia di installare\ntutti i DLC, poichè includono\ntexture di illuminazione di qualità migliore.\n\nSei sicuro di voler saltare?" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when choosing the Install option at the title screen when the user is missing DLC content.
|
// Notes: message appears when choosing the Install option at the title screen when the user is missing DLC content.
|
||||||
"Installer_Message_TitleMissingDLC",
|
"Installer_Message_TitleMissingDLC",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This will restart the game to\nallow you to install any DLC\nthat you are missing.\n\nInstalling DLC will improve the\nlighting quality across the game.\n\nWould you like to install missing\ncontent?" },
|
{ ELanguage::English, "This will restart the game to\nallow you to install any DLC\nthat you are missing.\n\nInstalling DLC will improve the\nlighting quality across the game.\n\nWould you like to install missing\ncontent?" },
|
||||||
{ ELanguage::Italian, "Questa opzione riavviera il gioco\nper farti installare qualsiasi DLC\nche non hai installato.\n\nL'installazione dei DLC migliorerà la qualità\ndell'illuminazione del gioco.\n\nVuoi installare i DLC mancanti?" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Questa opzione riavviera il gioco\nper farti installare qualsiasi DLC\nche non hai installato.\n\nL'installazione dei DLC migliorerà la qualità\ndell'illuminazione del gioco.\n\nVuoi installare i DLC mancanti?" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when choosing the Install option at the title screen when the user is not missing any content.
|
// Notes: message appears when choosing the Install option at the title screen when the user is not missing any content.
|
||||||
"Installer_Message_Title",
|
"Installer_Message_Title",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "This restarts the game to\nallow you to install any DLC\nthat you may be missing.\n\nYou are not currently\nmissing any DLC.\n\nWould you like to proceed\nanyway?" },
|
{ ELanguage::English, "This restarts the game to\nallow you to install any DLC\nthat you may be missing.\n\nYou are not currently\nmissing any DLC.\n\nWould you like to proceed\nanyway?" },
|
||||||
{ ELanguage::Italian, "Questa opzione riavviera il gioco\nper farti installare qualsiasi DLC\nche non hai installato.\n\nHai già installato tutti i DLC.\n\nVuoi procedere comunque?" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Questa opzione riavviera il gioco\nper farti installare qualsiasi DLC\nche non hai installato.\n\nHai già installato tutti i DLC.\n\nVuoi procedere comunque?" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Notes: message appears when user chooses "Quit" on the first available installation screen.
|
||||||
|
"Installer_Message_Quit",
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Are you sure you want to quit?" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Notes: message appears when user chooses "Cancel" during installation.
|
||||||
|
"Installer_Message_Cancel",
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Are you sure you want to cancel the installation?" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// Notes: message appears when pressing B at the title screen.
|
// Notes: message appears when pressing B at the title screen.
|
||||||
"Title_Message_Quit",
|
"Title_Message_Quit",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Are you sure you want to quit?" },
|
{ ELanguage::English, "Are you sure you want to quit?" },
|
||||||
{ ELanguage::Italian, "Sei sicuro di voler uscire?" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Sei sicuro di voler uscire?" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -353,12 +598,12 @@ std::unordered_map<std::string, std::unordered_map<ELanguage, std::string>> g_lo
|
|||||||
// Do not localise this unless absolutely necessary, these strings are from the XEX.
|
// Do not localise this unless absolutely necessary, these strings are from the XEX.
|
||||||
"Title_Message_SaveDataCorrupt",
|
"Title_Message_SaveDataCorrupt",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The save file appears to be\ncorrupted and cannot be loaded." },
|
{ ELanguage::English, "The save file appears to be\ncorrupted and cannot be loaded." },
|
||||||
{ ELanguage::Japanese, "ゲームデータの読み込みに失敗しました。\nこのまま続けるとゲームデータをセーブすることはできません" },
|
{ ELanguage::Japanese, "ゲームデータの読み込みに失敗しました。\nこのまま続けるとゲームデータをセーブすることはできません" },
|
||||||
{ ELanguage::German, "Diese Speicherdatei ist beschädigt\nund kann nicht geladen werden." },
|
{ ELanguage::German, "Diese Speicherdatei ist beschädigt\nund kann nicht geladen werden." },
|
||||||
{ ELanguage::French, "Le fichier de sauvegarde semble être\nendommagé et ne peut être chargé." },
|
{ ELanguage::French, "Le fichier de sauvegarde semble être\nendommagé et ne peut être chargé." },
|
||||||
{ ELanguage::Spanish, "El archivo parece estar dañado\ny no se puede cargar." },
|
{ ELanguage::Spanish, "El archivo parece estar dañado\ny no se puede cargar." },
|
||||||
{ ELanguage::Italian, "I file di salvataggio sembrano danneggiati\ne non possono essere caricati." }
|
{ ELanguage::Italian, "I file di salvataggio sembrano danneggiati\ne non possono essere caricati." }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -366,7 +611,12 @@ std::unordered_map<std::string, std::unordered_map<ELanguage, std::string>> g_lo
|
|||||||
// To make this occur, open the file in any editor and just remove a large chunk of data.
|
// To make this occur, open the file in any editor and just remove a large chunk of data.
|
||||||
"Title_Message_AchievementDataCorrupt",
|
"Title_Message_AchievementDataCorrupt",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The achievement data appears to be\ncorrupted and cannot be loaded.\n\nProceeding from this point will\nclear your achievement data." }
|
{ ELanguage::English, "The achievement data appears to be\ncorrupted and cannot be loaded.\n\nProceeding from this point will\nclear your achievement data." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -374,19 +624,34 @@ std::unordered_map<std::string, std::unordered_map<ELanguage, std::string>> g_lo
|
|||||||
// To make this occur, lock the ACH-DATA file using an external program so that it cannot be accessed by the game.
|
// To make this occur, lock the ACH-DATA file using an external program so that it cannot be accessed by the game.
|
||||||
"Title_Message_AchievementDataIOError",
|
"Title_Message_AchievementDataIOError",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "The achievement data could not be loaded.\nYour achievements will not be saved." }
|
{ ELanguage::English, "The achievement data could not be loaded.\nYour achievements will not be saved." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Title_Message_UpdateAvailable",
|
"Title_Message_UpdateAvailable",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "An update is available!\n\nWould you like to visit the\nreleases page to download it?" }
|
{ ELanguage::English, "An update is available!\n\nWould you like to visit the\nreleases page to download it?" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Video_BackendError",
|
"Video_BackendError",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Unable to create a D3D12 (Windows) or Vulkan backend.\n\nPlease make sure that:\n\n- Your system meets the minimum requirements.\n- Your GPU drivers are up to date.\n- Your operating system is on the latest version available." }
|
{ ELanguage::English, "Unable to create a D3D12 (Windows) or Vulkan backend.\n\nPlease make sure that:\n\n- Your system meets the minimum requirements.\n- Your GPU drivers are up to date.\n- Your operating system is on the latest version available." },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -414,50 +679,100 @@ std::unordered_map<std::string, std::unordered_map<ELanguage, std::string>> g_lo
|
|||||||
{
|
{
|
||||||
"Common_Yes",
|
"Common_Yes",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Yes" },
|
{ ELanguage::English, "Yes" },
|
||||||
{ ELanguage::Italian, "Sì" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Sì" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_No",
|
"Common_No",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "No" },
|
{ ELanguage::English, "No" },
|
||||||
{ ELanguage::Italian, "No" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "No" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_Next",
|
"Common_Next",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Next" },
|
{ ELanguage::English, "Next" },
|
||||||
{ ELanguage::Italian, "Continua" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Continua" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_Select",
|
"Common_Select",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Select" },
|
{ ELanguage::English, "Select" },
|
||||||
{ ELanguage::Italian, "Seleziona" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Seleziona" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_Back",
|
"Common_Back",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Back" },
|
{ ELanguage::English, "Back" },
|
||||||
{ ELanguage::Italian, "Indietro" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Indietro" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Common_Quit",
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Quit" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Common_Cancel",
|
||||||
|
{
|
||||||
|
{ ELanguage::English, "Cancel" },
|
||||||
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_Reset",
|
"Common_Reset",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Reset" },
|
{ ELanguage::English, "Reset" },
|
||||||
{ ELanguage::Italian, "Ripristina" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Ripristina" }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Common_Switch",
|
"Common_Switch",
|
||||||
{
|
{
|
||||||
{ ELanguage::English, "Switch" },
|
{ ELanguage::English, "Switch" },
|
||||||
{ ELanguage::Italian, "Cambia" }
|
{ ELanguage::Japanese, "" },
|
||||||
|
{ ELanguage::German, "" },
|
||||||
|
{ ELanguage::French, "" },
|
||||||
|
{ ELanguage::Spanish, "" },
|
||||||
|
{ ELanguage::Italian, "Cambia" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -203,12 +203,12 @@ int main(int argc, char *argv[])
|
|||||||
if (!Video::CreateHostDevice(sdlVideoDriver))
|
if (!Video::CreateHostDevice(sdlVideoDriver))
|
||||||
{
|
{
|
||||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, GameWindow::GetTitle(), Localise("Video_BackendError").c_str(), GameWindow::s_pWindow);
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, GameWindow::GetTitle(), Localise("Video_BackendError").c_str(), GameWindow::s_pWindow);
|
||||||
return 1;
|
std::_Exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!InstallerWizard::Run(GAME_INSTALL_DIRECTORY, isGameInstalled && forceDLCInstaller))
|
if (!InstallerWizard::Run(GAME_INSTALL_DIRECTORY, isGameInstalled && forceDLCInstaller))
|
||||||
{
|
{
|
||||||
return 1;
|
std::_Exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ int main(int argc, char *argv[])
|
|||||||
if (!Video::CreateHostDevice(sdlVideoDriver))
|
if (!Video::CreateHostDevice(sdlVideoDriver))
|
||||||
{
|
{
|
||||||
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, GameWindow::GetTitle(), Localise("Video_BackendError").c_str(), GameWindow::s_pWindow);
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, GameWindow::GetTitle(), Localise("Video_BackendError").c_str(), GameWindow::s_pWindow);
|
||||||
return 1;
|
std::_Exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
#include <cpu/guest_stack_var.h>
|
#include <cpu/guest_stack_var.h>
|
||||||
#include <kernel/function.h>
|
#include <kernel/function.h>
|
||||||
#include <kernel/heap.h>
|
#include <kernel/heap.h>
|
||||||
|
#include <user/config.h>
|
||||||
#include <user/paths.h>
|
#include <user/paths.h>
|
||||||
|
#include <os/logger.h>
|
||||||
#include <os/process.h>
|
#include <os/process.h>
|
||||||
#include <xxHashMap.h>
|
#include <xxHashMap.h>
|
||||||
|
|
||||||
@@ -117,7 +119,10 @@ void ModLoader::Init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (configIni.getString("CPKREDIR", "LogType", std::string()) == "console")
|
if (configIni.getString("CPKREDIR", "LogType", std::string()) == "console")
|
||||||
|
{
|
||||||
os::process::ShowConsole();
|
os::process::ShowConsole();
|
||||||
|
s_isLogTypeConsole = true;
|
||||||
|
}
|
||||||
|
|
||||||
std::string modsDbIniFilePathU8 = configIni.getString("CPKREDIR", "ModsDbIni", "");
|
std::string modsDbIniFilePathU8 = configIni.getString("CPKREDIR", "ModsDbIni", "");
|
||||||
if (modsDbIniFilePathU8.empty())
|
if (modsDbIniFilePathU8.empty())
|
||||||
@@ -208,6 +213,42 @@ void ModLoader::Init()
|
|||||||
if (!mod.includeDirs.empty())
|
if (!mod.includeDirs.empty())
|
||||||
g_mods.emplace_back(std::move(mod));
|
g_mods.emplace_back(std::move(mod));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto codeCount = modsDbIni.get<size_t>("Codes", "CodeCount", 0);
|
||||||
|
|
||||||
|
if (codeCount)
|
||||||
|
{
|
||||||
|
std::vector<std::string> codes{};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < codeCount; i++)
|
||||||
|
{
|
||||||
|
auto name = modsDbIni.getString("Codes", fmt::format("Code{}", i), "");
|
||||||
|
|
||||||
|
if (name.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
codes.push_back(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& def : g_configDefinitions)
|
||||||
|
{
|
||||||
|
if (!def->IsHidden() || def->GetSection() != "Codes")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* NOTE: this is inefficient, but it happens
|
||||||
|
once on boot for a handful of codes at release
|
||||||
|
and is temporary until we support real code mods. */
|
||||||
|
for (size_t i = 0; i < codes.size(); i++)
|
||||||
|
{
|
||||||
|
if (def->GetName() == codes[i])
|
||||||
|
{
|
||||||
|
LOGF_IMPL(Utility, "Mod Loader", "Loading code: \"{}\"", codes[i]);
|
||||||
|
*(bool*)def->GetValue() = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr uint32_t LZX_SIGNATURE = 0xFF512EE;
|
static constexpr uint32_t LZX_SIGNATURE = 0xFF512EE;
|
||||||
@@ -337,6 +378,9 @@ PPC_FUNC(sub_82E0D3E8)
|
|||||||
std::ifstream stream(filePath, std::ios::binary);
|
std::ifstream stream(filePath, std::ios::binary);
|
||||||
if (stream.good())
|
if (stream.good())
|
||||||
{
|
{
|
||||||
|
if (ModLoader::s_isLogTypeConsole)
|
||||||
|
LOGF_IMPL(Utility, "Mod Loader", "Loading file: \"{}\"", reinterpret_cast<const char*>(filePath.u8string().c_str()));
|
||||||
|
|
||||||
be<uint32_t> signature{};
|
be<uint32_t> signature{};
|
||||||
stream.read(reinterpret_cast<char*>(&signature), sizeof(signature));
|
stream.read(reinterpret_cast<char*>(&signature), sizeof(signature));
|
||||||
|
|
||||||
@@ -518,14 +562,68 @@ PPC_FUNC(sub_82E0D3E8)
|
|||||||
g_userHeap.Free(newArlFileData);
|
g_userHeap.Free(newArlFileData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load elements have an unused "pretty name" field. We will use this field to store the archive file path,
|
||||||
|
// prefixed with a magic string. When the first load detects this string, it will load append archives
|
||||||
|
// and then clear the field to prevent remaining splits from loading the append archives again.
|
||||||
|
// We cannot rely on .ar.00 being the first split to be loaded, so this approach is necessary.
|
||||||
|
static thread_local uint32_t g_prefixedArFilePath = NULL;
|
||||||
|
|
||||||
|
// Hedgehog::Database::CDatabaseLoader::LoadArchives
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82E0CC38);
|
||||||
|
PPC_FUNC(sub_82E0CC38)
|
||||||
|
{
|
||||||
|
if (g_mods.empty())
|
||||||
|
{
|
||||||
|
__imp__sub_82E0CC38(ctx, base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto r3 = ctx.r3;
|
||||||
|
auto r4 = ctx.r4;
|
||||||
|
auto r5 = ctx.r5;
|
||||||
|
auto r6 = ctx.r6;
|
||||||
|
auto r7 = ctx.r7;
|
||||||
|
auto r8 = ctx.r8;
|
||||||
|
|
||||||
|
const char* arFilePath = reinterpret_cast<const char*>(base + PPC_LOAD_U32(r5.u32));
|
||||||
|
|
||||||
|
// __HH_ALLOC
|
||||||
|
ctx.r3.u32 = 22 + strlen(arFilePath);
|
||||||
|
sub_822C0988(ctx, base);
|
||||||
|
char* prefixedArFilePath = reinterpret_cast<char*>(base + ctx.r3.u32);
|
||||||
|
|
||||||
|
*reinterpret_cast<be<uint32_t>*>(prefixedArFilePath) = 1;
|
||||||
|
strcpy(prefixedArFilePath + 0x4, "/UnleashedRecomp/");
|
||||||
|
strcpy(prefixedArFilePath + 0x15, arFilePath);
|
||||||
|
|
||||||
|
ctx.r1.u32 -= 0x10;
|
||||||
|
uint32_t stackSpace = ctx.r1.u32;
|
||||||
|
PPC_STORE_U32(stackSpace, static_cast<uint32_t>(reinterpret_cast<uint8_t*>(prefixedArFilePath) - base) + 0x4);
|
||||||
|
g_prefixedArFilePath = stackSpace;
|
||||||
|
|
||||||
|
ctx.r3 = r3;
|
||||||
|
ctx.r4 = r4;
|
||||||
|
ctx.r5 = r5;
|
||||||
|
ctx.r6 = r6;
|
||||||
|
ctx.r7 = r7;
|
||||||
|
ctx.r8 = r8;
|
||||||
|
__imp__sub_82E0CC38(ctx, base);
|
||||||
|
|
||||||
|
// Hedgehog::Base::CSharedString::~CSharedString
|
||||||
|
ctx.r3.u32 = stackSpace;
|
||||||
|
sub_82DFB148(ctx, base);
|
||||||
|
|
||||||
|
g_prefixedArFilePath = NULL;
|
||||||
|
ctx.r1.u32 += 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
// Hedgehog::Database::SLoadElement::SLoadElement
|
// Hedgehog::Database::SLoadElement::SLoadElement
|
||||||
PPC_FUNC_IMPL(__imp__sub_82E140D8);
|
PPC_FUNC_IMPL(__imp__sub_82E140D8);
|
||||||
PPC_FUNC(sub_82E140D8)
|
PPC_FUNC(sub_82E140D8)
|
||||||
{
|
{
|
||||||
// Store archive name as the pretty name to use it later for append archive loading.
|
// Store the prefixed archive file path as the pretty name. It's unused for archives we want to append to.
|
||||||
// This is always set to an empty string for archives, so it should be safe to replace.
|
if (!g_mods.empty() && PPC_LOAD_U32(ctx.r5.u32) == 0x8200A621 && g_prefixedArFilePath != NULL)
|
||||||
if (!g_mods.empty() && PPC_LOAD_U32(ctx.r5.u32) == 0x8200A621)
|
ctx.r5.u32 = g_prefixedArFilePath;
|
||||||
ctx.r5.u32 = ctx.r6.u32;
|
|
||||||
|
|
||||||
__imp__sub_82E140D8(ctx, base);
|
__imp__sub_82E140D8(ctx, base);
|
||||||
}
|
}
|
||||||
@@ -540,25 +638,17 @@ PPC_FUNC(sub_82E0B500)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::u8string_view arFilePathU8(reinterpret_cast<const char8_t*>(base + PPC_LOAD_U32(ctx.r5.u32)));
|
uint32_t prefixedArFilePath = PPC_LOAD_U32(ctx.r5.u32);
|
||||||
size_t index = arFilePathU8.find(u8".ar.00");
|
std::u8string_view arFilePathU8(reinterpret_cast<const char8_t*>(base + prefixedArFilePath));
|
||||||
if (index == (arFilePathU8.size() - 6))
|
if (!arFilePathU8.starts_with(u8"/UnleashedRecomp/"))
|
||||||
{
|
{
|
||||||
arFilePathU8.remove_suffix(3);
|
__imp__sub_82E0B500(ctx, base);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
index = arFilePathU8.find(u8".ar");
|
|
||||||
|
|
||||||
if (index != (arFilePathU8.size() - 3) ||
|
// Immediately clear the string, so the remaining splits don't load append archives again.
|
||||||
arFilePathU8.starts_with(u8"tg-") ||
|
PPC_STORE_U8(prefixedArFilePath, 0x00);
|
||||||
arFilePathU8.starts_with(u8"gia-") ||
|
arFilePathU8.remove_prefix(0x11);
|
||||||
arFilePathU8.starts_with(u8"gi-texture-"))
|
|
||||||
{
|
|
||||||
__imp__sub_82E0B500(ctx, base);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto r3 = ctx.r3; // Callback
|
auto r3 = ctx.r3; // Callback
|
||||||
auto r4 = ctx.r4; // Database
|
auto r4 = ctx.r4; // Database
|
||||||
@@ -572,6 +662,9 @@ PPC_FUNC(sub_82E0B500)
|
|||||||
std::ifstream stream(arFilePath, std::ios::binary);
|
std::ifstream stream(arFilePath, std::ios::binary);
|
||||||
if (stream.good())
|
if (stream.good())
|
||||||
{
|
{
|
||||||
|
if (ModLoader::s_isLogTypeConsole)
|
||||||
|
LOGF_IMPL(Utility, "Mod Loader", "Loading file: \"{}\"", reinterpret_cast<const char*>(arFilePath.u8string().c_str()));
|
||||||
|
|
||||||
stream.seekg(0, std::ios::end);
|
stream.seekg(0, std::ios::end);
|
||||||
size_t arFileSize = stream.tellg();
|
size_t arFileSize = stream.tellg();
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
struct ModLoader
|
struct ModLoader
|
||||||
{
|
{
|
||||||
|
static inline bool s_isLogTypeConsole;
|
||||||
|
|
||||||
static inline std::filesystem::path s_saveFilePath;
|
static inline std::filesystem::path s_saveFilePath;
|
||||||
|
|
||||||
static std::filesystem::path ResolvePath(std::string_view path);
|
static std::filesystem::path ResolvePath(std::string_view path);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include <kernel/function.h>
|
#include <kernel/function.h>
|
||||||
#include <api/SWA.h>
|
#include <api/SWA.h>
|
||||||
|
#include <patches/free_camera_patches.h>
|
||||||
#include <ui/achievement_menu.h>
|
#include <ui/achievement_menu.h>
|
||||||
#include <ui/button_guide.h>
|
#include <ui/button_guide.h>
|
||||||
#include <ui/options_menu.h>
|
#include <ui/options_menu.h>
|
||||||
@@ -24,6 +25,9 @@ void CHudPauseAddOptionsItemMidAsmHook(PPCRegister& pThis)
|
|||||||
|
|
||||||
bool InjectMenuBehaviour(uint32_t pThis, uint32_t count)
|
bool InjectMenuBehaviour(uint32_t pThis, uint32_t count)
|
||||||
{
|
{
|
||||||
|
if (App::s_isLoading)
|
||||||
|
return true;
|
||||||
|
|
||||||
auto pHudPause = (SWA::CHudPause*)g_memory.Translate(pThis);
|
auto pHudPause = (SWA::CHudPause*)g_memory.Translate(pThis);
|
||||||
auto cursorIndex = *(be<uint32_t>*)g_memory.Translate(4 * (*(be<uint32_t>*)g_memory.Translate(pThis + 0x19C) + 0x68) + pThis);
|
auto cursorIndex = *(be<uint32_t>*)g_memory.Translate(4 * (*(be<uint32_t>*)g_memory.Translate(pThis + 0x19C) + 0x68) + pThis);
|
||||||
|
|
||||||
@@ -116,6 +120,15 @@ bool CHudPauseMiscInjectOptionsMidAsmHook(PPCRegister& pThis)
|
|||||||
PPC_FUNC_IMPL(__imp__sub_824B0930);
|
PPC_FUNC_IMPL(__imp__sub_824B0930);
|
||||||
PPC_FUNC(sub_824B0930)
|
PPC_FUNC(sub_824B0930)
|
||||||
{
|
{
|
||||||
|
if (FreeCameraPatches::s_isActive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (App::s_isLoading)
|
||||||
|
{
|
||||||
|
__imp__sub_824B0930(ctx, base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto pHudPause = (SWA::CHudPause*)g_memory.Translate(ctx.r3.u32);
|
auto pHudPause = (SWA::CHudPause*)g_memory.Translate(ctx.r3.u32);
|
||||||
auto pInputState = SWA::CInputState::GetInstance();
|
auto pInputState = SWA::CInputState::GetInstance();
|
||||||
|
|
||||||
@@ -163,7 +176,7 @@ PPC_FUNC(sub_824B0930)
|
|||||||
|
|
||||||
if (*SWA::SGlobals::ms_IsRenderHud && pHudPause->m_IsShown && !pHudPause->m_Submenu && pHudPause->m_Transition == SWA::eTransitionType_Undefined)
|
if (*SWA::SGlobals::ms_IsRenderHud && pHudPause->m_IsShown && !pHudPause->m_Submenu && pHudPause->m_Transition == SWA::eTransitionType_Undefined)
|
||||||
{
|
{
|
||||||
ButtonGuide::Open(Button(Localise("Achievements_Name"), EButtonIcon::Back, EButtonAlignment::Left, EFontQuality::Low));
|
ButtonGuide::Open(Button("Achievements_Name", EButtonIcon::Back, EButtonAlignment::Left, EFontQuality::Low));
|
||||||
g_isClosed = false;
|
g_isClosed = false;
|
||||||
}
|
}
|
||||||
else if (!g_isClosed)
|
else if (!g_isClosed)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <user/paths.h>
|
#include <user/paths.h>
|
||||||
#include <app.h>
|
#include <app.h>
|
||||||
|
|
||||||
static bool g_faderBegun = false;
|
static std::atomic<bool> g_faderBegun = false;
|
||||||
|
|
||||||
bool g_quitMessageOpen = false;
|
bool g_quitMessageOpen = false;
|
||||||
static int g_quitMessageResult = -1;
|
static int g_quitMessageResult = -1;
|
||||||
@@ -16,39 +16,29 @@ static int g_quitMessageResult = -1;
|
|||||||
static std::atomic<bool> g_corruptSaveMessageOpen = false;
|
static std::atomic<bool> g_corruptSaveMessageOpen = false;
|
||||||
static int g_corruptSaveMessageResult = -1;
|
static int g_corruptSaveMessageResult = -1;
|
||||||
|
|
||||||
static bool g_corruptAchievementsMessageOpen = false;
|
static std::atomic<bool> g_corruptAchievementsMessageOpen = false;
|
||||||
static int g_corruptAchievementsMessageResult = -1;
|
static int g_corruptAchievementsMessageResult = -1;
|
||||||
|
|
||||||
static bool g_updateAvailableMessageOpen = false;
|
static std::atomic<bool> g_updateAvailableMessageOpen = false;
|
||||||
static int g_updateAvailableMessageResult = -1;
|
static int g_updateAvailableMessageResult = -1;
|
||||||
|
|
||||||
static bool ProcessQuitMessage()
|
static bool ProcessQuitMessage()
|
||||||
{
|
{
|
||||||
if (g_corruptSaveMessageOpen)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!g_quitMessageOpen)
|
if (!g_quitMessageOpen)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (g_faderBegun)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
std::array<std::string, 2> options = { Localise("Common_Yes"), Localise("Common_No") };
|
std::array<std::string, 2> options = { Localise("Common_Yes"), Localise("Common_No") };
|
||||||
|
|
||||||
if (MessageWindow::Open(Localise("Title_Message_Quit"), &g_quitMessageResult, options, 1) == MSG_CLOSED)
|
if (MessageWindow::Open(Localise("Title_Message_Quit"), &g_quitMessageResult, options, 1) == MSG_CLOSED)
|
||||||
{
|
{
|
||||||
switch (g_quitMessageResult)
|
if (!g_quitMessageResult)
|
||||||
{
|
{
|
||||||
case 0:
|
Fader::FadeOut(1, []() { App::Exit(); });
|
||||||
Fader::FadeOut(1, []() { App::Exit(); });
|
g_faderBegun = true;
|
||||||
g_faderBegun = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
g_quitMessageOpen = false;
|
|
||||||
g_quitMessageResult = -1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_quitMessageOpen = false;
|
||||||
|
g_quitMessageResult = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -86,6 +76,7 @@ static bool ProcessCorruptAchievementsMessage()
|
|||||||
AchievementManager::Save(true);
|
AchievementManager::Save(true);
|
||||||
|
|
||||||
g_corruptAchievementsMessageOpen = false;
|
g_corruptAchievementsMessageOpen = false;
|
||||||
|
g_corruptAchievementsMessageOpen.notify_one();
|
||||||
g_corruptAchievementsMessageResult = -1;
|
g_corruptAchievementsMessageResult = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,9 +88,6 @@ static bool ProcessUpdateAvailableMessage()
|
|||||||
if (!g_updateAvailableMessageOpen)
|
if (!g_updateAvailableMessageOpen)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (g_faderBegun)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
std::array<std::string, 2> options = { Localise("Common_Yes"), Localise("Common_No") };
|
std::array<std::string, 2> options = { Localise("Common_Yes"), Localise("Common_No") };
|
||||||
|
|
||||||
if (MessageWindow::Open(Localise("Title_Message_UpdateAvailable"), &g_updateAvailableMessageResult, options) == MSG_CLOSED)
|
if (MessageWindow::Open(Localise("Title_Message_UpdateAvailable"), &g_updateAvailableMessageResult, options) == MSG_CLOSED)
|
||||||
@@ -119,6 +107,7 @@ static bool ProcessUpdateAvailableMessage()
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_updateAvailableMessageOpen = false;
|
g_updateAvailableMessageOpen = false;
|
||||||
|
g_updateAvailableMessageOpen.notify_one();
|
||||||
g_updateAvailableMessageResult = -1;
|
g_updateAvailableMessageResult = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,13 +126,32 @@ PPC_FUNC(sub_822C55B0)
|
|||||||
ctx.r3.u32 = 0;
|
ctx.r3.u32 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PressStartSaveLoadThreadMidAsmHook()
|
||||||
|
{
|
||||||
|
if (UpdateChecker::check() == UpdateChecker::Result::UpdateAvailable)
|
||||||
|
{
|
||||||
|
g_updateAvailableMessageOpen = true;
|
||||||
|
g_updateAvailableMessageOpen.wait(true);
|
||||||
|
g_faderBegun.wait(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
AchievementManager::Load();
|
||||||
|
|
||||||
|
if (AchievementManager::Status != EAchStatus::Success)
|
||||||
|
{
|
||||||
|
g_corruptAchievementsMessageOpen = true;
|
||||||
|
g_corruptAchievementsMessageOpen.wait(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SWA::CTitleStateIntro::Update
|
// SWA::CTitleStateIntro::Update
|
||||||
PPC_FUNC_IMPL(__imp__sub_82587E50);
|
PPC_FUNC_IMPL(__imp__sub_82587E50);
|
||||||
PPC_FUNC(sub_82587E50)
|
PPC_FUNC(sub_82587E50)
|
||||||
{
|
{
|
||||||
auto isAutoSaveWarningShown = *(bool*)g_memory.Translate(0x83367BC1);
|
auto pTitleStateIntro = (SWA::CTitleStateIntro*)g_memory.Translate(ctx.r3.u32);
|
||||||
|
auto pTime = (be<float>*)((uint8_t*)pTitleStateIntro->GetContextBase() + 0x10C);
|
||||||
|
|
||||||
if (isAutoSaveWarningShown)
|
if (*SWA::SGlobals::ms_IsAutoSaveWarningShown)
|
||||||
{
|
{
|
||||||
__imp__sub_82587E50(ctx, base);
|
__imp__sub_82587E50(ctx, base);
|
||||||
}
|
}
|
||||||
@@ -151,21 +159,7 @@ PPC_FUNC(sub_82587E50)
|
|||||||
{
|
{
|
||||||
if (auto pInputState = SWA::CInputState::GetInstance())
|
if (auto pInputState = SWA::CInputState::GetInstance())
|
||||||
{
|
{
|
||||||
auto& rPadState = pInputState->GetPadState();
|
if (pInputState->GetPadState().IsTapped(SWA::eKeyState_B) && *pTime > 0.5f)
|
||||||
auto isAccepted = rPadState.IsTapped(SWA::eKeyState_A) || rPadState.IsTapped(SWA::eKeyState_Start);
|
|
||||||
auto isDeclined = rPadState.IsTapped(SWA::eKeyState_B);
|
|
||||||
|
|
||||||
if (isAccepted)
|
|
||||||
{
|
|
||||||
g_updateAvailableMessageOpen = UpdateChecker::check() == UpdateChecker::Result::UpdateAvailable;
|
|
||||||
|
|
||||||
AchievementManager::Load();
|
|
||||||
|
|
||||||
if (AchievementManager::Status != EAchStatus::Success)
|
|
||||||
g_corruptAchievementsMessageOpen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isDeclined)
|
|
||||||
g_quitMessageOpen = true;
|
g_quitMessageOpen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
#include <api/SWA.h>
|
#include <api/SWA.h>
|
||||||
|
#include <cpu/guest_stack_var.h>
|
||||||
#include <locale/locale.h>
|
#include <locale/locale.h>
|
||||||
|
#include <os/logger.h>
|
||||||
#include <ui/button_guide.h>
|
#include <ui/button_guide.h>
|
||||||
#include <ui/fader.h>
|
#include <ui/fader.h>
|
||||||
#include <ui/message_window.h>
|
#include <ui/message_window.h>
|
||||||
#include <ui/options_menu.h>
|
#include <ui/options_menu.h>
|
||||||
|
#include <user/achievement_manager.h>
|
||||||
#include <user/paths.h>
|
#include <user/paths.h>
|
||||||
#include <app.h>
|
#include <app.h>
|
||||||
#include <exports.h>
|
#include <exports.h>
|
||||||
@@ -49,13 +52,15 @@ static bool ProcessInstallMessage()
|
|||||||
PPC_FUNC_IMPL(__imp__sub_825882B8);
|
PPC_FUNC_IMPL(__imp__sub_825882B8);
|
||||||
PPC_FUNC(sub_825882B8)
|
PPC_FUNC(sub_825882B8)
|
||||||
{
|
{
|
||||||
auto pTitleState = (SWA::CTitleStateBase*)g_memory.Translate(ctx.r3.u32);
|
auto pTitleStateMenu = (SWA::CTitleStateMenu*)g_memory.Translate(ctx.r3.u32);
|
||||||
|
auto pGameDocument = SWA::CGameDocument::GetInstance();
|
||||||
|
|
||||||
auto pInputState = SWA::CInputState::GetInstance();
|
auto pInputState = SWA::CInputState::GetInstance();
|
||||||
auto& pPadState = pInputState->GetPadState();
|
auto& pPadState = pInputState->GetPadState();
|
||||||
auto isAccepted = pPadState.IsTapped(SWA::eKeyState_A) || pPadState.IsTapped(SWA::eKeyState_Start);
|
auto isAccepted = pPadState.IsTapped(SWA::eKeyState_A) || pPadState.IsTapped(SWA::eKeyState_Start);
|
||||||
|
|
||||||
auto pContext = pTitleState->GetContextBase<SWA::CTitleStateBase::CTitleStateContext>();
|
auto pContext = pTitleStateMenu->GetContextBase<SWA::CTitleStateMenu::CTitleStateMenuContext>();
|
||||||
|
auto isNewGameIndex = pContext->m_pTitleMenu->m_CursorIndex == 0;
|
||||||
auto isOptionsIndex = pContext->m_pTitleMenu->m_CursorIndex == 2;
|
auto isOptionsIndex = pContext->m_pTitleMenu->m_CursorIndex == 2;
|
||||||
auto isInstallIndex = pContext->m_pTitleMenu->m_CursorIndex == 3;
|
auto isInstallIndex = pContext->m_pTitleMenu->m_CursorIndex == 3;
|
||||||
|
|
||||||
@@ -63,7 +68,17 @@ PPC_FUNC(sub_825882B8)
|
|||||||
if (App::s_isSaveDataCorrupt && pContext->m_pTitleMenu->m_CursorIndex == 1)
|
if (App::s_isSaveDataCorrupt && pContext->m_pTitleMenu->m_CursorIndex == 1)
|
||||||
pContext->m_pTitleMenu->m_CursorIndex = 0;
|
pContext->m_pTitleMenu->m_CursorIndex = 0;
|
||||||
|
|
||||||
if (!OptionsMenu::s_isVisible && isOptionsIndex)
|
if (isNewGameIndex && isAccepted)
|
||||||
|
{
|
||||||
|
if (pContext->m_pTitleMenu->m_IsDeleteCheckMessageOpen &&
|
||||||
|
pGameDocument->m_pMember->m_pGeneralWindow->m_SelectedIndex == 1)
|
||||||
|
{
|
||||||
|
LOGN("Resetting achievements...");
|
||||||
|
|
||||||
|
AchievementManager::Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!OptionsMenu::s_isVisible && isOptionsIndex)
|
||||||
{
|
{
|
||||||
if (OptionsMenu::s_isRestartRequired)
|
if (OptionsMenu::s_isRestartRequired)
|
||||||
{
|
{
|
||||||
@@ -76,7 +91,6 @@ PPC_FUNC(sub_825882B8)
|
|||||||
{
|
{
|
||||||
Game_PlaySound("sys_worldmap_window");
|
Game_PlaySound("sys_worldmap_window");
|
||||||
Game_PlaySound("sys_worldmap_decide");
|
Game_PlaySound("sys_worldmap_decide");
|
||||||
|
|
||||||
OptionsMenu::Open();
|
OptionsMenu::Open();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,7 +107,6 @@ PPC_FUNC(sub_825882B8)
|
|||||||
if (OptionsMenu::CanClose() && pPadState.IsTapped(SWA::eKeyState_B))
|
if (OptionsMenu::CanClose() && pPadState.IsTapped(SWA::eKeyState_B))
|
||||||
{
|
{
|
||||||
Game_PlaySound("sys_worldmap_cansel");
|
Game_PlaySound("sys_worldmap_cansel");
|
||||||
|
|
||||||
OptionsMenu::Close();
|
OptionsMenu::Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,13 @@
|
|||||||
#include <api/SWA.h>
|
#include <api/SWA.h>
|
||||||
#include <app.h>
|
#include <app.h>
|
||||||
#include <ui/game_window.h>
|
#include <ui/game_window.h>
|
||||||
|
#include <ui/black_bar.h>
|
||||||
#include <gpu/video.h>
|
#include <gpu/video.h>
|
||||||
|
#include <xxHashMap.h>
|
||||||
|
|
||||||
#include "aspect_ratio_patches.h"
|
#include "aspect_ratio_patches.h"
|
||||||
#include "camera_patches.h"
|
#include "camera_patches.h"
|
||||||
|
#include "inspire_patches.h"
|
||||||
|
|
||||||
// These are here for now to not recompile basically all of the project.
|
// These are here for now to not recompile basically all of the project.
|
||||||
namespace Chao::CSD
|
namespace Chao::CSD
|
||||||
@@ -271,7 +274,7 @@ PPC_FUNC(sub_8258B558)
|
|||||||
ctx.f1.f64 = offsetX + g_aspectRatioNarrowScale * 140.0f;
|
ctx.f1.f64 = offsetX + g_aspectRatioNarrowScale * 140.0f;
|
||||||
ctx.f2.f64 = offsetY;
|
ctx.f2.f64 = offsetY;
|
||||||
|
|
||||||
if (Config::UIScaleMode == EUIScaleMode::Edge && g_aspectRatioNarrowScale >= 1.0f)
|
if (Config::UIAlignmentMode == EUIAlignmentMode::Edge && g_aspectRatioNarrowScale >= 1.0f)
|
||||||
ctx.f1.f64 += g_aspectRatioOffsetX / g_aspectRatioScale;
|
ctx.f1.f64 += g_aspectRatioOffsetX / g_aspectRatioScale;
|
||||||
|
|
||||||
sub_830BB3D0(ctx, base);
|
sub_830BB3D0(ctx, base);
|
||||||
@@ -293,7 +296,7 @@ PPC_FUNC(sub_8258B558)
|
|||||||
if (textBox != NULL)
|
if (textBox != NULL)
|
||||||
{
|
{
|
||||||
float value = 708.0f + g_aspectRatioNarrowScale * 140.0f;
|
float value = 708.0f + g_aspectRatioNarrowScale * 140.0f;
|
||||||
if (Config::UIScaleMode == EUIScaleMode::Edge && g_aspectRatioNarrowScale >= 1.0f)
|
if (Config::UIAlignmentMode == EUIAlignmentMode::Edge && g_aspectRatioNarrowScale >= 1.0f)
|
||||||
value += g_aspectRatioOffsetX / g_aspectRatioScale;
|
value += g_aspectRatioOffsetX / g_aspectRatioScale;
|
||||||
|
|
||||||
PPC_STORE_U32(textBox + 0x38, reinterpret_cast<uint32_t&>(value));
|
PPC_STORE_U32(textBox + 0x38, reinterpret_cast<uint32_t&>(value));
|
||||||
@@ -339,6 +342,19 @@ enum
|
|||||||
REPEAT_LEFT = 1 << 15,
|
REPEAT_LEFT = 1 << 15,
|
||||||
|
|
||||||
TORNADO_DEFENSE = 1 << 16,
|
TORNADO_DEFENSE = 1 << 16,
|
||||||
|
|
||||||
|
LOADING_BLACK_BAR_MIN = 1 << 17,
|
||||||
|
LOADING_BLACK_BAR_MAX = 1 << 18,
|
||||||
|
|
||||||
|
UNSTRETCH_HORIZONTAL = 1 << 19,
|
||||||
|
|
||||||
|
CORNER_EXTRACT = 1 << 20,
|
||||||
|
|
||||||
|
SKIP_INSPIRE = 1 << 21,
|
||||||
|
|
||||||
|
CONTROL_TUTORIAL = 1 << 22,
|
||||||
|
|
||||||
|
LOADING_ARROW = 1 << 23,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CsdModifier
|
struct CsdModifier
|
||||||
@@ -348,17 +364,21 @@ struct CsdModifier
|
|||||||
uint32_t cornerIndex{};
|
uint32_t cornerIndex{};
|
||||||
};
|
};
|
||||||
|
|
||||||
static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers =
|
static const xxHashMap<CsdModifier> g_modifiers =
|
||||||
{
|
{
|
||||||
// ui_balloon
|
// ui_balloon
|
||||||
{ HashStr("ui_balloon/window/bg"), { STRETCH } },
|
{ HashStr("ui_balloon/window/bg"), { STRETCH } },
|
||||||
{ HashStr("ui_balloon/window/footer"), { ALIGN_BOTTOM } },
|
{ HashStr("ui_balloon/window/footer"), { ALIGN_BOTTOM } },
|
||||||
|
|
||||||
// ui_boss_gauge
|
// ui_boss_gauge
|
||||||
{ HashStr("ui_boss_gauge/gauge_bg"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_boss_gauge/gauge_bg"), { ALIGN_TOP_RIGHT | SCALE | SKIP_INSPIRE} },
|
||||||
{ HashStr("ui_boss_gauge/gauge_2"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_boss_gauge/gauge_2"), { ALIGN_TOP_RIGHT | SCALE | SKIP_INSPIRE} },
|
||||||
{ HashStr("ui_boss_gauge/gauge_1"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_boss_gauge/gauge_1"), { ALIGN_TOP_RIGHT | SCALE | SKIP_INSPIRE} },
|
||||||
{ HashStr("ui_boss_gauge/gauge_breakpoint"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_boss_gauge/gauge_breakpoint"), { ALIGN_TOP_RIGHT | SCALE | SKIP_INSPIRE} },
|
||||||
|
|
||||||
|
// ui_boss_name
|
||||||
|
{ HashStr("ui_boss_name/name_so/bg"), { UNSTRETCH_HORIZONTAL } },
|
||||||
|
{ HashStr("ui_boss_name/name_so/pale"), { UNSTRETCH_HORIZONTAL } },
|
||||||
|
|
||||||
// ui_exstage
|
// ui_exstage
|
||||||
{ HashStr("ui_exstage/shield/L_gauge"), { ALIGN_BOTTOM_LEFT | SCALE } },
|
{ HashStr("ui_exstage/shield/L_gauge"), { ALIGN_BOTTOM_LEFT | SCALE } },
|
||||||
@@ -367,10 +387,10 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
{ HashStr("ui_exstage/energy/R_gauge"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/energy/R_gauge"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
||||||
{ HashStr("ui_exstage/energy/R_gauge_effect"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/energy/R_gauge_effect"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
||||||
{ HashStr("ui_exstage/energy/R_gauge_effect_2"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/energy/R_gauge_effect_2"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
||||||
{ HashStr("ui_exstage/hit/hit_counter_bg"), { ALIGN_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/hit/hit_counter_bg"), { ALIGN_RIGHT | SCALE | OFFSET_SCALE_RIGHT, 986.0f } },
|
||||||
{ HashStr("ui_exstage/hit/hit_counter_bg/C"), { ALIGN_RIGHT | SCALE | EXTEND_RIGHT } },
|
{ HashStr("ui_exstage/hit/hit_counter_bg/C"), { ALIGN_RIGHT | SCALE | EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_exstage/hit/hit_counter_bg/C/L"), { ALIGN_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/hit/hit_counter_bg/C/L"), { SKIP } }, // L/R are mixed up
|
||||||
{ HashStr("ui_exstage/hit/hit_counter_bg/C/R"), { SKIP } },
|
{ HashStr("ui_exstage/hit/hit_counter_bg/C/R"), { ALIGN_RIGHT | SCALE | STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_exstage/hit/hit_counter_num"), { ALIGN_RIGHT | SCALE } },
|
{ HashStr("ui_exstage/hit/hit_counter_num"), { ALIGN_RIGHT | SCALE } },
|
||||||
|
|
||||||
// ui_gate
|
// ui_gate
|
||||||
@@ -387,21 +407,29 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
|
|
||||||
// ui_itemresult
|
// ui_itemresult
|
||||||
{ HashStr("ui_itemresult/footer/result_footer"), { ALIGN_BOTTOM } },
|
{ HashStr("ui_itemresult/footer/result_footer"), { ALIGN_BOTTOM } },
|
||||||
{ HashStr("ui_itemresult/main/iresult_title"), { ALIGN_TOP } },
|
|
||||||
{ HashStr("ui_itemresult/main/iresult_title"), { ALIGN_TOP | OFFSET_SCALE_LEFT, 688.0f } },
|
{ HashStr("ui_itemresult/main/iresult_title"), { ALIGN_TOP | OFFSET_SCALE_LEFT, 688.0f } },
|
||||||
{ HashStr("ui_itemresult/main/iresult_title/title_bg/center"), { ALIGN_TOP | EXTEND_LEFT } },
|
{ HashStr("ui_itemresult/main/iresult_title/title_bg/center"), { ALIGN_TOP | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_itemresult/main/iresult_title/title_bg/center/h_light"), { ALIGN_TOP | EXTEND_LEFT } },
|
{ HashStr("ui_itemresult/main/iresult_title/title_bg/center/h_light"), { ALIGN_TOP | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_itemresult/main/iresult_title/title_bg/right"), { ALIGN_TOP | STORE_RIGHT_CORNER } },
|
{ HashStr("ui_itemresult/main/iresult_title/title_bg/right"), { ALIGN_TOP | STORE_RIGHT_CORNER } },
|
||||||
|
{ HashStr("ui_itemresult/main/iresult_title/title_brilliance1"), { ALIGN_TOP | STORE_RIGHT_CORNER | OFFSET_SCALE_LEFT, 632.25775f, 1 } },
|
||||||
|
{ HashStr("ui_itemresult/main/iresult_title/title_brilliance2"), { ALIGN_TOP | STORE_RIGHT_CORNER | OFFSET_SCALE_LEFT, 830.0f, 2 } },
|
||||||
|
{ HashStr("ui_itemresult/main/iresult_title/title_brilliance3"), { ALIGN_TOP | STORE_RIGHT_CORNER | OFFSET_SCALE_LEFT, 640.0f, 3 } },
|
||||||
|
|
||||||
// ui_loading
|
// ui_loading
|
||||||
{ HashStr("ui_loading/bg_1"), { STRETCH } },
|
{ HashStr("ui_loading/bg_1"), { STRETCH } },
|
||||||
|
{ HashStr("ui_loading/bg_1/arrow"), { STRETCH | LOADING_ARROW } },
|
||||||
{ HashStr("ui_loading/bg_2"), { STRETCH } },
|
{ HashStr("ui_loading/bg_2"), { STRETCH } },
|
||||||
|
{ HashStr("ui_loading/bg_2/arrow"), { STRETCH | LOADING_ARROW } },
|
||||||
{ HashStr("ui_loading/n_2_d/bg/sky"), { STRETCH } },
|
{ HashStr("ui_loading/n_2_d/bg/sky"), { STRETCH } },
|
||||||
{ HashStr("ui_loading/n_2_d/bg/under"), { STRETCH } },
|
{ HashStr("ui_loading/n_2_d/bg/under"), { STRETCH } },
|
||||||
{ HashStr("ui_loading/n_2_d/letterbox/letterbox_under"), { STRETCH } },
|
{ HashStr("ui_loading/n_2_d/letterbox/letterbox_under"), { STRETCH } },
|
||||||
{ HashStr("ui_loading/n_2_d/letterbox/letterbox_top"), { STRETCH } },
|
{ HashStr("ui_loading/n_2_d/letterbox/letterbox_top"), { STRETCH } },
|
||||||
{ HashStr("ui_loading/n_2_d/letterbox/black_l"), { EXTEND_LEFT | STRETCH_VERTICAL } },
|
{ HashStr("ui_loading/n_2_d/letterbox/black_l"), { EXTEND_LEFT | STRETCH_VERTICAL } },
|
||||||
{ HashStr("ui_loading/n_2_d/letterbox/black_r"), { EXTEND_RIGHT | STRETCH_VERTICAL } },
|
{ HashStr("ui_loading/n_2_d/letterbox/black_r"), { EXTEND_RIGHT | STRETCH_VERTICAL } },
|
||||||
|
{ HashStr("ui_loading/event_viewer/black/black_top"), { LOADING_BLACK_BAR_MIN } },
|
||||||
|
{ HashStr("ui_loading/event_viewer/black/black_under"), { LOADING_BLACK_BAR_MAX } },
|
||||||
|
{ HashStr("ui_loading/pda/pda_frame/L"), { LOADING_BLACK_BAR_MIN } },
|
||||||
|
{ HashStr("ui_loading/pda/pda_frame/R"), { LOADING_BLACK_BAR_MAX } },
|
||||||
|
|
||||||
// ui_mediaroom
|
// ui_mediaroom
|
||||||
{ HashStr("ui_mediaroom/header/bg/img_1"), { EXTEND_LEFT } },
|
{ HashStr("ui_mediaroom/header/bg/img_1"), { EXTEND_LEFT } },
|
||||||
@@ -412,10 +440,40 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
// ui_missionscreen
|
// ui_missionscreen
|
||||||
{ HashStr("ui_missionscreen/player_count"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_missionscreen/player_count"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
{ HashStr("ui_missionscreen/time_count"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_missionscreen/time_count"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
{ HashStr("ui_missionscreen/score_count"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_missionscreen/time_count/position_S/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_missionscreen/item_count"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_missionscreen/time_count/position_S/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_S/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_S/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_L/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_L/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_L/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/time_count/position_L/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_missionscreen/laptime_count"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_missionscreen/laptime_count"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_S/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_S/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_S/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_S/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_L/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_L/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_L/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/laptime_count/position_L/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_S/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_S/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_S/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_S/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_L/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_L/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_L/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/score_count/position_L/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/item_count"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
|
{ HashStr("ui_missionscreen/item_count/position_L/bg_1"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/item_count/position_L/bg_1/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/item_count/position_L/bg_2"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
|
{ HashStr("ui_missionscreen/item_count/position_L/bg_2/C_h"), { ALIGN_TOP_LEFT | SCALE | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_missionscreen/lap_count"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_missionscreen/lap_count"), { ALIGN_TOP_RIGHT | SCALE } },
|
||||||
|
{ HashStr("ui_missionscreen/lap_count/position/bar"), { ALIGN_RIGHT | SCALE | EXTEND_RIGHT } },
|
||||||
|
{ HashStr("ui_missionscreen/lap_count/position/bar/R"), { SKIP } },
|
||||||
|
|
||||||
// ui_misson
|
// ui_misson
|
||||||
{ HashStr("ui_misson/bg"), { STRETCH } },
|
{ HashStr("ui_misson/bg"), { STRETCH } },
|
||||||
@@ -536,9 +594,11 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
{ HashStr("ui_playscreen_ev_hit/chance_attack"), { ALIGN_RIGHT | SCALE } },
|
{ HashStr("ui_playscreen_ev_hit/chance_attack"), { ALIGN_RIGHT | SCALE } },
|
||||||
|
|
||||||
// ui_playscreen_su
|
// ui_playscreen_su
|
||||||
{ HashStr("ui_playscreen_su/su_sonic_gauge"), { ALIGN_BOTTOM_LEFT | SCALE } },
|
{ HashStr("ui_playscreen_su/su_sonic_gauge"), { ALIGN_BOTTOM_LEFT | SCALE | OFFSET_SCALE_LEFT, 632.0f } },
|
||||||
{ HashStr("ui_playscreen_su/gaia_gauge"), { ALIGN_BOTTOM_LEFT | SCALE } },
|
{ HashStr("ui_playscreen_su/su_sonic_gauge/position/C/R"), { ALIGN_BOTTOM_LEFT | SCALE | STORE_RIGHT_CORNER } },
|
||||||
{ HashStr("ui_playscreen_su/footer"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
{ HashStr("ui_playscreen_su/gaia_gauge"), { ALIGN_BOTTOM_LEFT | SCALE | OFFSET_SCALE_LEFT, 632.0f } },
|
||||||
|
{ HashStr("ui_playscreen_su/gaia_gauge/position/C/R"), { ALIGN_BOTTOM_LEFT | SCALE | STORE_RIGHT_CORNER } },
|
||||||
|
{ HashStr("ui_playscreen_su/footer"), { ALIGN_BOTTOM_RIGHT | SCALE | CONTROL_TUTORIAL } },
|
||||||
|
|
||||||
// ui_prov_playscreen
|
// ui_prov_playscreen
|
||||||
{ HashStr("ui_prov_playscreen/so_speed_gauge"), { ALIGN_BOTTOM_LEFT | SCALE | TORNADO_DEFENSE } },
|
{ HashStr("ui_prov_playscreen/so_speed_gauge"), { ALIGN_BOTTOM_LEFT | SCALE | TORNADO_DEFENSE } },
|
||||||
@@ -562,37 +622,43 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
{ HashStr("ui_result/main/result_title/title_bg/center"), { ALIGN_TOP | EXTEND_LEFT } },
|
{ HashStr("ui_result/main/result_title/title_bg/center"), { ALIGN_TOP | EXTEND_LEFT } },
|
||||||
{ HashStr("ui_result/main/result_title/title_bg/center/h_light"), { ALIGN_TOP | EXTEND_LEFT} },
|
{ HashStr("ui_result/main/result_title/title_bg/center/h_light"), { ALIGN_TOP | EXTEND_LEFT} },
|
||||||
{ HashStr("ui_result/main/result_title/title_bg/right"), { ALIGN_TOP | STORE_RIGHT_CORNER } },
|
{ HashStr("ui_result/main/result_title/title_bg/right"), { ALIGN_TOP | STORE_RIGHT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_1"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
{ HashStr("ui_result/main/result_num_1"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_1/num_bg"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/h_light"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/h_light"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/left"), { STORE_LEFT_CORNER } },
|
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/left"), { STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/right"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/right"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/right/h_light"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_1/num_bg/position_1/center_1/right/h_light"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_2"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
{ HashStr("ui_result/main/result_num_2"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_2/num_bg"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/h_light"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/h_light"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/left"), { STORE_LEFT_CORNER } },
|
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/left"), { STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/right"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/right"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/right/h_light"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_2/num_bg/position_2/center_1/right/h_light"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_3"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
{ HashStr("ui_result/main/result_num_3"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_3/num_bg"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/h_light"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/h_light"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/left"), { STORE_LEFT_CORNER } },
|
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/left"), { STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/right"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/right"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/right/h_light"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_3/num_bg/position_3/center_1/right/h_light"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_4"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
{ HashStr("ui_result/main/result_num_4"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_4/num_bg"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/h_light"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/h_light"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/left"), { STORE_LEFT_CORNER } },
|
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/left"), { STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/right"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/right"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/right/h_light"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_4/num_bg/position_4/center_1/right/h_light"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_5"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
{ HashStr("ui_result/main/result_num_5"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_5/num_bg"), { OFFSET_SCALE_RIGHT, 669.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/h_light"), { EXTEND_RIGHT } },
|
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/h_light"), { EXTEND_RIGHT } },
|
||||||
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/left"), { STORE_LEFT_CORNER } },
|
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/left"), { STORE_LEFT_CORNER } },
|
||||||
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/right"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/right"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/right/h_light"), { SKIP } },
|
{ HashStr("ui_result/main/result_num_5/num_bg/position_5/center_1/right/h_light"), { SKIP } },
|
||||||
{ HashStr("ui_result/main/result_num_6"), { OFFSET_SCALE_LEFT, 1094.0f } },
|
{ HashStr("ui_result/main/result_num_6"), { CORNER_EXTRACT } },
|
||||||
|
{ HashStr("ui_result/main/result_num_6/num_bg"), { OFFSET_SCALE_LEFT, 1094.0f } },
|
||||||
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center"), { EXTEND_LEFT } },
|
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center"), { EXTEND_LEFT } },
|
||||||
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center/h_light"), { EXTEND_LEFT } },
|
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center/h_light"), { EXTEND_LEFT } },
|
||||||
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center/right"), { STORE_RIGHT_CORNER } },
|
{ HashStr("ui_result/main/result_num_6/num_bg/position_6/center/right"), { STORE_RIGHT_CORNER } },
|
||||||
@@ -689,7 +755,7 @@ static const ankerl::unordered_dense::map<XXH64_hash_t, CsdModifier> g_modifiers
|
|||||||
{ HashStr("ui_townscreen/time_effect"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_townscreen/time_effect"), { ALIGN_TOP_RIGHT | SCALE } },
|
||||||
{ HashStr("ui_townscreen/info"), { ALIGN_TOP_LEFT | SCALE } },
|
{ HashStr("ui_townscreen/info"), { ALIGN_TOP_LEFT | SCALE } },
|
||||||
{ HashStr("ui_townscreen/cam"), { ALIGN_TOP_RIGHT | SCALE } },
|
{ HashStr("ui_townscreen/cam"), { ALIGN_TOP_RIGHT | SCALE } },
|
||||||
{ HashStr("ui_townscreen/footer"), { ALIGN_BOTTOM } },
|
{ HashStr("ui_townscreen/footer"), { ALIGN_BOTTOM_RIGHT | SCALE } },
|
||||||
|
|
||||||
// ui_worldmap
|
// ui_worldmap
|
||||||
{ HashStr("ui_worldmap/contents/choices/cts_choices_bg"), { STRETCH } },
|
{ HashStr("ui_worldmap/contents/choices/cts_choices_bg"), { STRETCH } },
|
||||||
@@ -789,6 +855,11 @@ PPC_FUNC(sub_830C6A00)
|
|||||||
|
|
||||||
if (g_sceneModifier.has_value())
|
if (g_sceneModifier.has_value())
|
||||||
{
|
{
|
||||||
|
if (!Config::ControlTutorial && (g_sceneModifier->flags & CONTROL_TUTORIAL) != 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Tornado Defense bugs out when applying gameplay UI scaling.
|
// Tornado Defense bugs out when applying gameplay UI scaling.
|
||||||
// This seems consistent with base game behavior, because the UI
|
// This seems consistent with base game behavior, because the UI
|
||||||
// is normally squashed, which was probably done to work around this.
|
// is normally squashed, which was probably done to work around this.
|
||||||
@@ -798,7 +869,7 @@ PPC_FUNC(sub_830C6A00)
|
|||||||
g_scenePositionY = 0.0f;
|
g_scenePositionY = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((g_sceneModifier->flags & (OFFSET_SCALE_LEFT | OFFSET_SCALE_RIGHT)) != 0)
|
if (g_aspectRatio > WIDE_ASPECT_RATIO && (g_sceneModifier->flags & (OFFSET_SCALE_LEFT | OFFSET_SCALE_RIGHT | CORNER_EXTRACT)) != 0)
|
||||||
{
|
{
|
||||||
auto r3 = ctx.r3;
|
auto r3 = ctx.r3;
|
||||||
auto r4 = ctx.r4;
|
auto r4 = ctx.r4;
|
||||||
@@ -867,6 +938,12 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// That goddamn boss gauge doesn't disappear in the cutscene where Dark Gaia and Chip hug each other
|
||||||
|
if ((modifier.flags & SKIP_INSPIRE) != 0 && !InspirePatches::s_sceneName.empty() && *reinterpret_cast<be<float>*>(base + ctx.r4.u32) >= 1280.0f)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_cornerExtract)
|
if (g_cornerExtract)
|
||||||
{
|
{
|
||||||
if ((modifier.flags & (STORE_LEFT_CORNER | STORE_RIGHT_CORNER)) != 0)
|
if ((modifier.flags & (STORE_LEFT_CORNER | STORE_RIGHT_CORNER)) != 0)
|
||||||
@@ -878,7 +955,7 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config::UIScaleMode == EUIScaleMode::Centre)
|
if (Config::UIAlignmentMode == EUIAlignmentMode::Centre)
|
||||||
{
|
{
|
||||||
if (g_aspectRatio >= WIDE_ASPECT_RATIO)
|
if (g_aspectRatio >= WIDE_ASPECT_RATIO)
|
||||||
modifier.flags &= ~(ALIGN_LEFT | ALIGN_RIGHT);
|
modifier.flags &= ~(ALIGN_LEFT | ALIGN_RIGHT);
|
||||||
@@ -898,6 +975,22 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
return reinterpret_cast<be<float>*>(stack + index * stride);
|
return reinterpret_cast<be<float>*>(stack + index * stride);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Subtract half a pixel from loading arrows to prevent transparent pixels surrounding them from leaking into the texture filtering.
|
||||||
|
if (Video::s_viewportHeight > 720 && (modifier.flags & LOADING_ARROW) != 0 && stride == 0x14)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
auto texCoord = getPosition(i) + 4;
|
||||||
|
|
||||||
|
constexpr float OFFSET = 0.5f / 720.0f;
|
||||||
|
|
||||||
|
if (i == 0 || i == 2) // Top
|
||||||
|
*texCoord = (*texCoord + OFFSET);
|
||||||
|
else // Bottom
|
||||||
|
*texCoord = (*texCoord - OFFSET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float offsetX = 0.0f;
|
float offsetX = 0.0f;
|
||||||
float offsetY = 0.0f;
|
float offsetY = 0.0f;
|
||||||
float pivotX = 0.0f;
|
float pivotX = 0.0f;
|
||||||
@@ -905,7 +998,9 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
float scaleX = 1.0f;
|
float scaleX = 1.0f;
|
||||||
float scaleY = 1.0f;
|
float scaleY = 1.0f;
|
||||||
|
|
||||||
if (squash || ((modifier.flags & STRETCH_HORIZONTAL) != 0 && g_aspectRatio >= WIDE_ASPECT_RATIO))
|
bool needsStretch = g_aspectRatio >= WIDE_ASPECT_RATIO;
|
||||||
|
|
||||||
|
if (squash || (needsStretch && (modifier.flags & STRETCH_HORIZONTAL) != 0))
|
||||||
{
|
{
|
||||||
scaleX = Video::s_viewportWidth / 1280.0f;
|
scaleX = Video::s_viewportWidth / 1280.0f;
|
||||||
}
|
}
|
||||||
@@ -913,28 +1008,36 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
{
|
{
|
||||||
scaleX = g_aspectRatioScale;
|
scaleX = g_aspectRatioScale;
|
||||||
|
|
||||||
if ((modifier.flags & ALIGN_RIGHT) != 0)
|
if (needsStretch && (modifier.flags & UNSTRETCH_HORIZONTAL) != 0)
|
||||||
offsetX = g_aspectRatioOffsetX * 2.0f;
|
|
||||||
else if ((modifier.flags & ALIGN_LEFT) == 0)
|
|
||||||
offsetX = g_aspectRatioOffsetX;
|
|
||||||
|
|
||||||
if ((modifier.flags & SCALE) != 0)
|
|
||||||
{
|
{
|
||||||
scaleX *= g_aspectRatioGameplayScale;
|
pivotX = *getPosition(0);
|
||||||
pivotX = g_scenePositionX;
|
offsetX = pivotX * Video::s_viewportWidth / 1280.0f;
|
||||||
|
|
||||||
if ((modifier.flags & ALIGN_RIGHT) != 0)
|
|
||||||
offsetX += 1280.0f * (1.0f - g_aspectRatioGameplayScale) * g_aspectRatioScale;
|
|
||||||
else if ((modifier.flags & ALIGN_LEFT) == 0)
|
|
||||||
offsetX += 640.0f * (1.0f - g_aspectRatioGameplayScale) * g_aspectRatioScale;
|
|
||||||
|
|
||||||
offsetX += pivotX * g_aspectRatioScale;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if ((modifier.flags & WORLD_MAP) != 0)
|
|
||||||
{
|
{
|
||||||
if ((modifier.flags & ALIGN_LEFT) != 0)
|
if ((modifier.flags & ALIGN_RIGHT) != 0)
|
||||||
offsetX += (1.0f - g_aspectRatioNarrowScale) * g_aspectRatioScale * -20.0f;
|
offsetX = g_aspectRatioOffsetX * 2.0f;
|
||||||
|
else if ((modifier.flags & ALIGN_LEFT) == 0)
|
||||||
|
offsetX = g_aspectRatioOffsetX;
|
||||||
|
|
||||||
|
if ((modifier.flags & SCALE) != 0)
|
||||||
|
{
|
||||||
|
scaleX *= g_aspectRatioGameplayScale;
|
||||||
|
pivotX = g_scenePositionX;
|
||||||
|
|
||||||
|
if ((modifier.flags & ALIGN_RIGHT) != 0)
|
||||||
|
offsetX += 1280.0f * (1.0f - g_aspectRatioGameplayScale) * g_aspectRatioScale;
|
||||||
|
else if ((modifier.flags & ALIGN_LEFT) == 0)
|
||||||
|
offsetX += 640.0f * (1.0f - g_aspectRatioGameplayScale) * g_aspectRatioScale;
|
||||||
|
|
||||||
|
offsetX += pivotX * g_aspectRatioScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((modifier.flags & WORLD_MAP) != 0)
|
||||||
|
{
|
||||||
|
if ((modifier.flags & ALIGN_LEFT) != 0)
|
||||||
|
offsetX += (1.0f - g_aspectRatioNarrowScale) * g_aspectRatioScale * -20.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,6 +1124,18 @@ static void Draw(PPCContext& ctx, uint8_t* base, PPCFunc* original, uint32_t str
|
|||||||
position[1] = round(y);
|
position[1] = round(y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((modifier.flags & LOADING_BLACK_BAR_MIN) != 0)
|
||||||
|
{
|
||||||
|
auto position = getPosition(0);
|
||||||
|
BlackBar::g_loadingBlackBarMin = ImVec2{ position[0], position[1] };
|
||||||
|
BlackBar::g_loadingBlackBarAlpha = *(base + ctx.r1.u32 + 0xB);
|
||||||
|
}
|
||||||
|
else if ((modifier.flags & LOADING_BLACK_BAR_MAX) != 0)
|
||||||
|
{
|
||||||
|
auto position = getPosition(3);
|
||||||
|
BlackBar::g_loadingBlackBarMax = ImVec2{ position[0], position[1] };
|
||||||
|
}
|
||||||
|
|
||||||
if ((modifier.flags & REPEAT_LEFT) != 0)
|
if ((modifier.flags & REPEAT_LEFT) != 0)
|
||||||
{
|
{
|
||||||
float width = *getPosition(2) - *getPosition(0);
|
float width = *getPosition(2) - *getPosition(0);
|
||||||
@@ -1223,12 +1338,12 @@ static double ComputeObjGetItemX(uint32_t type)
|
|||||||
|
|
||||||
double scaleOffset = (1280.0 * (1.0 - g_aspectRatioGameplayScale)) * g_aspectRatioScale;
|
double scaleOffset = (1280.0 * (1.0 - g_aspectRatioGameplayScale)) * g_aspectRatioScale;
|
||||||
|
|
||||||
if (Config::UIScaleMode == EUIScaleMode::Edge)
|
if (Config::UIAlignmentMode == EUIAlignmentMode::Edge)
|
||||||
{
|
{
|
||||||
if (type != 47) // Medal
|
if (type != 47) // Medal
|
||||||
x += g_aspectRatioOffsetX * 2.0 + scaleOffset;
|
x += g_aspectRatioOffsetX * 2.0 + scaleOffset;
|
||||||
}
|
}
|
||||||
else if (Config::UIScaleMode == EUIScaleMode::Centre)
|
else if (Config::UIAlignmentMode == EUIAlignmentMode::Centre)
|
||||||
{
|
{
|
||||||
x += g_aspectRatioOffsetX + scaleOffset;
|
x += g_aspectRatioOffsetX + scaleOffset;
|
||||||
}
|
}
|
||||||
@@ -1362,6 +1477,12 @@ PPC_FUNC(sub_82B8AA40)
|
|||||||
|
|
||||||
// Restore the original letterbox value.
|
// Restore the original letterbox value.
|
||||||
PPC_STORE_U8(r3.u32, letterbox);
|
PPC_STORE_U8(r3.u32, letterbox);
|
||||||
|
|
||||||
|
if (letterbox)
|
||||||
|
{
|
||||||
|
// Would be nice to also push this as a 2D primitive but I really cannot be bothered right now...
|
||||||
|
BlackBar::g_inspirePillarbox = Config::CutsceneAspectRatio != ECutsceneAspectRatio::Unlocked && g_aspectRatio > WIDE_ASPECT_RATIO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InspireLetterboxTopMidAsmHook(PPCRegister& r3)
|
void InspireLetterboxTopMidAsmHook(PPCRegister& r3)
|
||||||
@@ -1444,3 +1565,90 @@ void YggdrasillRenderQuadMidAsmHook(PPCRegister& r3, PPCRegister& r6)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Explicit CSD set position calls don't seem to care about the
|
||||||
|
// viewport size. This causes them to appear shifted by 1.5x,
|
||||||
|
// as the backbuffer resolution is 640x480 at 4:3. We need to account
|
||||||
|
// for this manually to make the positioning match with the original game.
|
||||||
|
static constexpr uint32_t EVIL_HUD_GUIDE_BYTE_SIZE = 0x154;
|
||||||
|
|
||||||
|
void EvilHudGuideAllocMidAsmHook(PPCRegister& r3)
|
||||||
|
{
|
||||||
|
r3.u32 += sizeof(float);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SWA::Player::CEvilHudGuide::CEvilHudGuide
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82448CF0);
|
||||||
|
PPC_FUNC(sub_82448CF0)
|
||||||
|
{
|
||||||
|
*reinterpret_cast<float*>(base + ctx.r3.u32 + EVIL_HUD_GUIDE_BYTE_SIZE) = 0.0f;
|
||||||
|
__imp__sub_82448CF0(ctx, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EvilHudGuideUpdateMidAsmHook(PPCRegister& r30, PPCRegister& f30)
|
||||||
|
{
|
||||||
|
*reinterpret_cast<float*>(g_memory.base + r30.u32 + EVIL_HUD_GUIDE_BYTE_SIZE) = f30.f64;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SWA::Player::CEvilHudGuide::Update
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82449088);
|
||||||
|
PPC_FUNC(sub_82449088)
|
||||||
|
{
|
||||||
|
auto r3 = ctx.r3;
|
||||||
|
__imp__sub_82449088(ctx, base);
|
||||||
|
|
||||||
|
float positionX = *reinterpret_cast<float*>(base + r3.u32 + EVIL_HUD_GUIDE_BYTE_SIZE);
|
||||||
|
constexpr uint32_t OFFSETS[] = { 312, 320 };
|
||||||
|
|
||||||
|
for (const auto offset : OFFSETS)
|
||||||
|
{
|
||||||
|
uint32_t scene = PPC_LOAD_U32(r3.u32 + offset + 0x4);
|
||||||
|
if (scene != NULL)
|
||||||
|
{
|
||||||
|
scene = PPC_LOAD_U32(scene + 0x4);
|
||||||
|
if (scene != NULL)
|
||||||
|
{
|
||||||
|
ctx.r3.u32 = scene;
|
||||||
|
ctx.f1.f64 = (1.5 - 0.5 * g_aspectRatioNarrowScale) * positionX;
|
||||||
|
ctx.f2.f64 = 0.0;
|
||||||
|
|
||||||
|
sub_830BB3D0(ctx, base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The shadow offseting is buggy for FCO text just like Werehog button guide,
|
||||||
|
// making them appear thicker than they actually are.
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82E54950);
|
||||||
|
PPC_FUNC(sub_82E54950)
|
||||||
|
{
|
||||||
|
if (Config::AspectRatio == EAspectRatio::OriginalNarrow)
|
||||||
|
{
|
||||||
|
// Luckily, they have shadow offset scale values that are only used in this function.
|
||||||
|
uint32_t x = PPC_LOAD_U32(0x8332B7B8);
|
||||||
|
uint32_t y = PPC_LOAD_U32(0x8332B7BC);
|
||||||
|
|
||||||
|
PPCRegister scaled;
|
||||||
|
|
||||||
|
// X
|
||||||
|
scaled.u32 = x;
|
||||||
|
scaled.f32 *= 1.5f;
|
||||||
|
PPC_STORE_U32(0x8332B7B8, scaled.u32);
|
||||||
|
|
||||||
|
// Y
|
||||||
|
scaled.u32 = y;
|
||||||
|
scaled.f32 *= 1.5f;
|
||||||
|
PPC_STORE_U32(0x8332B7BC, scaled.u32);
|
||||||
|
|
||||||
|
__imp__sub_82E54950(ctx, base);
|
||||||
|
|
||||||
|
// Restore old values.
|
||||||
|
PPC_STORE_U32(0x8332B7B8, x);
|
||||||
|
PPC_STORE_U32(0x8332B7BC, y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__imp__sub_82E54950(ctx, base);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
|
#include "camera_patches.h"
|
||||||
#include <api/SWA.h>
|
#include <api/SWA.h>
|
||||||
|
#include <gpu/video.h>
|
||||||
|
#include <patches/aspect_ratio_patches.h>
|
||||||
|
#include <patches/free_camera_patches.h>
|
||||||
#include <ui/game_window.h>
|
#include <ui/game_window.h>
|
||||||
#include <user/config.h>
|
#include <user/config.h>
|
||||||
#include <gpu/video.h>
|
|
||||||
#include "camera_patches.h"
|
|
||||||
#include "aspect_ratio_patches.h"
|
|
||||||
|
|
||||||
void CameraAspectRatioMidAsmHook(PPCRegister& r30, PPCRegister& r31)
|
void CameraAspectRatioMidAsmHook(PPCRegister& r30, PPCRegister& r31)
|
||||||
{
|
{
|
||||||
@@ -35,7 +36,9 @@ void CameraFieldOfViewMidAsmHook(PPCRegister& r31, PPCRegister& f31)
|
|||||||
{
|
{
|
||||||
auto camera = (SWA::CCamera*)g_memory.Translate(r31.u32);
|
auto camera = (SWA::CCamera*)g_memory.Translate(r31.u32);
|
||||||
|
|
||||||
f31.f64 = AdjustFieldOfView(f31.f64, camera->m_HorzAspectRatio);
|
f31.f64 = FreeCameraPatches::s_isActive
|
||||||
|
? FreeCameraPatches::s_fieldOfView
|
||||||
|
: AdjustFieldOfView(f31.f64, camera->m_HorzAspectRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
PPC_FUNC_IMPL(__imp__sub_824697B0);
|
PPC_FUNC_IMPL(__imp__sub_824697B0);
|
||||||
|
|||||||
@@ -28,6 +28,17 @@ void HighFrameRateDeltaTimeFixMidAsmHook(PPCRegister& f1)
|
|||||||
f1.f64 = threshold;
|
f1.f64 = threshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This hook expects the vector register to store delta time at the first index.
|
||||||
|
void HighFrameRateDeltaTimeFixVectorMidAsmHook(PPCVRegister& v62)
|
||||||
|
{
|
||||||
|
// Having 60 FPS threshold ensures we still retain
|
||||||
|
// the original game behavior when locked to 30/60 FPS.
|
||||||
|
constexpr double threshold = 1.0 / 60.0;
|
||||||
|
|
||||||
|
if (v62.f32[3] < threshold)
|
||||||
|
v62.f32[3] = threshold;
|
||||||
|
}
|
||||||
|
|
||||||
void CameraDeltaTimeFixMidAsmHook(PPCRegister& dest, PPCRegister& src)
|
void CameraDeltaTimeFixMidAsmHook(PPCRegister& dest, PPCRegister& src)
|
||||||
{
|
{
|
||||||
dest.f64 = src.f64 / 30.0;
|
dest.f64 = src.f64 / 30.0;
|
||||||
@@ -115,10 +126,7 @@ PPC_FUNC(sub_8312DBF8)
|
|||||||
constexpr auto INTERVAL = 1000000000ns / 60;
|
constexpr auto INTERVAL = 1000000000ns / 60;
|
||||||
auto next = now + (INTERVAL - now.time_since_epoch() % INTERVAL);
|
auto next = now + (INTERVAL - now.time_since_epoch() % INTERVAL);
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::floor<std::chrono::milliseconds>(next - now - 1ms));
|
std::this_thread::sleep_until(next);
|
||||||
|
|
||||||
while (std::chrono::steady_clock::now() < next)
|
|
||||||
std::this_thread::yield();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaitVsyncMidAsmHook()
|
void WaitVsyncMidAsmHook()
|
||||||
@@ -128,3 +136,62 @@ void WaitVsyncMidAsmHook()
|
|||||||
void ApplicationFrameLimiterMidAsmHook()
|
void ApplicationFrameLimiterMidAsmHook()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tornado Defense boss increments timers without respecting delta time.
|
||||||
|
// We run the update function with a 30 FPS time step to ensure all timers update at the correct rate.
|
||||||
|
static constexpr size_t EX_STAGE_BOSS_STATE_BATTLE_SIZE = 0x70;
|
||||||
|
|
||||||
|
void CExStageBossCStateBattleAllocMidAsmHook(PPCRegister& r3)
|
||||||
|
{
|
||||||
|
r3.u32 += sizeof(float);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CExStageBossCStateBattleCtorMidAsmHook(PPCRegister& r3)
|
||||||
|
{
|
||||||
|
new (g_memory.base + r3.u32 + EX_STAGE_BOSS_STATE_BATTLE_SIZE) float(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SWA::CExStageBoss::CStateBattle::Update
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82B00D00);
|
||||||
|
PPC_FUNC(sub_82B00D00)
|
||||||
|
{
|
||||||
|
constexpr auto referenceDeltaTime = 1.0f / 30.0f;
|
||||||
|
constexpr auto deltaTimeTolerance = 0.0001f;
|
||||||
|
|
||||||
|
auto pElapsedTime = (float*)(base + ctx.r3.u32 + EX_STAGE_BOSS_STATE_BATTLE_SIZE);
|
||||||
|
|
||||||
|
*pElapsedTime += std::min(App::s_deltaTime, 1.0 / 15.0);
|
||||||
|
|
||||||
|
if ((*pElapsedTime + deltaTimeTolerance) > referenceDeltaTime)
|
||||||
|
{
|
||||||
|
__imp__sub_82B00D00(ctx, base);
|
||||||
|
*pElapsedTime -= referenceDeltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pElapsedTime = std::max(*pElapsedTime, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix for Egg Dragoon's drill missile attack rotating 90 degrees at HFR.
|
||||||
|
void BossEggDragoonDrillMissileCMissileSetRotationMidAsmHook(PPCRegister& r4)
|
||||||
|
{
|
||||||
|
auto pRotation = (Hedgehog::Math::CQuaternion*)g_memory.Translate(r4.u32);
|
||||||
|
auto magnitude = std::sqrt(pRotation->X * pRotation->X + pRotation->Y * pRotation->Y + pRotation->Z * pRotation->Z + pRotation->W * pRotation->W);
|
||||||
|
|
||||||
|
if (magnitude < 0.0f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto magnitudeNrm = 1.0f / magnitude;
|
||||||
|
|
||||||
|
pRotation->X = pRotation->X * magnitudeNrm;
|
||||||
|
pRotation->Y = pRotation->Y * magnitudeNrm;
|
||||||
|
pRotation->Z = pRotation->Z * magnitudeNrm;
|
||||||
|
pRotation->W = pRotation->W * magnitudeNrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SparkleLocusMidAsmHook()
|
||||||
|
{
|
||||||
|
// There is an epsilon check in sparkle locus particle code that seems to never pass at high frame rates, which causes vertex corruption.
|
||||||
|
// Checking for equality doesn't fix it either, so we can fix it by forcing it to always execute instead.
|
||||||
|
// This has the side effect of the locus particle eventually snapping to the rest position during pause, but it's better than vertices exploding.
|
||||||
|
return App::s_deltaTime < (1.0 / 60.0);
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,250 @@
|
|||||||
|
#include "free_camera_patches.h"
|
||||||
|
#include <api/SWA.h>
|
||||||
|
#include <os/logger.h>
|
||||||
|
#include <ui/game_window.h>
|
||||||
|
#include <user/config.h>
|
||||||
|
#include <app.h>
|
||||||
|
|
||||||
|
#define DEGREES_TO_RADIANS(x) (float)(x / 180.0f * M_PI)
|
||||||
|
#define RADIANS_TO_DEGREES(x) (float)(x / M_PI * 180.0f)
|
||||||
|
|
||||||
|
constexpr float DEFAULT_SPEED = 1.0f;
|
||||||
|
constexpr float DEFAULT_FIELD_OF_VIEW = 45.0f;
|
||||||
|
constexpr float MOVE_SPEED_SLOW = 0.075f;
|
||||||
|
constexpr float MOVE_SPEED_FAST = 8.0f;
|
||||||
|
constexpr float MOVE_SPEED_MODIFIER_RATIO = 0.02f;
|
||||||
|
constexpr float FOV_MODIFIER_RATIO = 1.0f;
|
||||||
|
|
||||||
|
static float g_baseSpeed = DEFAULT_SPEED;
|
||||||
|
static float g_baseFieldOfView = DEFAULT_FIELD_OF_VIEW;
|
||||||
|
|
||||||
|
static bool g_isDisablingFreeCamera;
|
||||||
|
static bool g_isCameraLocked;
|
||||||
|
static float g_speed;
|
||||||
|
static float g_fieldOfView;
|
||||||
|
|
||||||
|
static void ResetParameters()
|
||||||
|
{
|
||||||
|
g_isCameraLocked = false;
|
||||||
|
g_speed = g_baseSpeed = DEFAULT_SPEED;
|
||||||
|
|
||||||
|
*SWA::SGlobals::ms_IsRenderDepthOfField = true;
|
||||||
|
FreeCameraPatches::s_fieldOfView = g_fieldOfView = g_baseFieldOfView = DEFAULT_FIELD_OF_VIEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FreeCameraActiveMidAsmHook()
|
||||||
|
{
|
||||||
|
return Config::EnableFreeCamera && FreeCameraPatches::s_isActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FreeCameraSpeedInputMidAsmHook(PPCRegister& r31, PPCRegister& r29, PPCRegister& f0)
|
||||||
|
{
|
||||||
|
if (!Config::EnableFreeCamera)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto pCamera = (SWA::CFreeCamera*)g_memory.Translate(r31.u32);
|
||||||
|
auto pPadState = (SWA::SPadState*)g_memory.Translate(r29.u32);
|
||||||
|
auto factor = App::s_deltaTime / (1.0f / 60.0f);
|
||||||
|
|
||||||
|
if (g_isCameraLocked)
|
||||||
|
{
|
||||||
|
g_speed = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
static auto isLeftTriggerSpeedModifier = false;
|
||||||
|
static auto isRightTriggerSpeedModifier = false;
|
||||||
|
|
||||||
|
if (pPadState->IsDown(SWA::eKeyState_LeftTrigger))
|
||||||
|
{
|
||||||
|
g_speed = MOVE_SPEED_SLOW;
|
||||||
|
isLeftTriggerSpeedModifier = true;
|
||||||
|
}
|
||||||
|
else if (isLeftTriggerSpeedModifier)
|
||||||
|
{
|
||||||
|
g_speed = g_baseSpeed;
|
||||||
|
isLeftTriggerSpeedModifier = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPadState->IsDown(SWA::eKeyState_RightTrigger))
|
||||||
|
{
|
||||||
|
g_speed = MOVE_SPEED_FAST;
|
||||||
|
isRightTriggerSpeedModifier = true;
|
||||||
|
}
|
||||||
|
else if (isRightTriggerSpeedModifier)
|
||||||
|
{
|
||||||
|
g_speed = g_baseSpeed;
|
||||||
|
isRightTriggerSpeedModifier = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLeftTriggerSpeedModifier && isRightTriggerSpeedModifier)
|
||||||
|
g_speed = MOVE_SPEED_FAST / 3;
|
||||||
|
|
||||||
|
if (pPadState->IsDown(SWA::eKeyState_A))
|
||||||
|
g_speed = g_baseSpeed = DEFAULT_SPEED;
|
||||||
|
|
||||||
|
if (pPadState->IsDown(SWA::eKeyState_B))
|
||||||
|
{
|
||||||
|
g_baseSpeed -= MOVE_SPEED_MODIFIER_RATIO * factor;
|
||||||
|
g_speed = g_baseSpeed;
|
||||||
|
|
||||||
|
LOGFN("[Free Camera] Speed: {}", g_speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPadState->IsDown(SWA::eKeyState_X))
|
||||||
|
{
|
||||||
|
g_baseSpeed += MOVE_SPEED_MODIFIER_RATIO * factor;
|
||||||
|
g_speed = g_baseSpeed;
|
||||||
|
|
||||||
|
LOGFN("[Free Camera] Speed: {}", g_speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_speed = std::clamp(g_speed, 0.01f, 20.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
f0.f64 = g_speed;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SWA::CFreeCamera::Update
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82472A18);
|
||||||
|
PPC_FUNC(sub_82472A18)
|
||||||
|
{
|
||||||
|
if (Config::EnableFreeCamera)
|
||||||
|
{
|
||||||
|
auto pCamera = (SWA::CFreeCamera*)g_memory.Translate(ctx.r3.u32);
|
||||||
|
auto aspectRatio = (float)GameWindow::s_width / (float)GameWindow::s_height;
|
||||||
|
|
||||||
|
if (auto pInputState = SWA::CInputState::GetInstance())
|
||||||
|
{
|
||||||
|
auto& rPadState = pInputState->GetPadState();
|
||||||
|
|
||||||
|
// Deactivate.
|
||||||
|
if (rPadState.IsTapped(SWA::eKeyState_Select))
|
||||||
|
{
|
||||||
|
guest_stack_var<SWA::Message::MsgPopCameraController> msgPopCameraController(pCamera, 0.0f);
|
||||||
|
guest_stack_var<SWA::Message::MsgCameraPauseMove> msgCameraPauseMove(false);
|
||||||
|
|
||||||
|
// Process SWA::Message::MsgPopCameraController.
|
||||||
|
GuestToHostFunction<int>(sub_8246A840, pCamera->m_pCamera.get(), msgPopCameraController.get());
|
||||||
|
|
||||||
|
// Process SWA::Message::MsgFinishFreeCamera.
|
||||||
|
GuestToHostFunction<int>(sub_8253ADB8, App::s_pGameModeStage);
|
||||||
|
|
||||||
|
// Process SWA::Message::MsgCameraPauseMove.
|
||||||
|
GuestToHostFunction<int>(sub_824679C0, pCamera->m_pCamera.get(), msgCameraPauseMove.get());
|
||||||
|
|
||||||
|
FreeCameraPatches::s_isActive = false;
|
||||||
|
*SWA::SGlobals::ms_IsRenderHud = true;
|
||||||
|
|
||||||
|
LOGN("[Free Camera] Disabled");
|
||||||
|
|
||||||
|
g_isDisablingFreeCamera = true;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Teleport player to camera.
|
||||||
|
if (rPadState.IsTapped(SWA::eKeyState_LeftStick))
|
||||||
|
{
|
||||||
|
guest_stack_var<SWA::Message::MsgSetPosition> msgSetPosition(pCamera->m_Position);
|
||||||
|
guest_stack_var<SWA::Message::MsgSetVelocity> msgSetVelocity(Hedgehog::Math::CVector(0.0f, 0.0f, 0.0f));
|
||||||
|
|
||||||
|
if (auto pPlayerSpeedContext = SWA::Player::CPlayerSpeedContext::GetInstance())
|
||||||
|
{
|
||||||
|
// Process SWA::Message::MsgSetPosition.
|
||||||
|
GuestToHostFunction<int>(sub_82303100, pPlayerSpeedContext->m_pPlayer.get(), msgSetPosition.get());
|
||||||
|
|
||||||
|
// Process SWA::Message::MsgSetVelocity.
|
||||||
|
GuestToHostFunction<int>(sub_82311820, pPlayerSpeedContext->m_pPlayer.get(), msgSetVelocity.get());
|
||||||
|
}
|
||||||
|
else if (App::s_pEvilSonicContext)
|
||||||
|
{
|
||||||
|
// Process SWA::Message::MsgSetPosition.
|
||||||
|
GuestToHostFunction<int>(sub_82303100, App::s_pEvilSonicContext->m_pPlayer.get(), msgSetPosition.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lock camera.
|
||||||
|
if (rPadState.IsTapped(SWA::eKeyState_DpadLeft))
|
||||||
|
{
|
||||||
|
g_isCameraLocked = !g_isCameraLocked;
|
||||||
|
|
||||||
|
if (g_isCameraLocked)
|
||||||
|
{
|
||||||
|
LOGN("[Free Camera] Locked");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_speed = g_baseSpeed;
|
||||||
|
|
||||||
|
LOGN("[Free Camera] Unlocked");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle depth of field.
|
||||||
|
if (rPadState.IsTapped(SWA::eKeyState_DpadRight))
|
||||||
|
{
|
||||||
|
*SWA::SGlobals::ms_IsRenderDepthOfField = !*SWA::SGlobals::ms_IsRenderDepthOfField;
|
||||||
|
|
||||||
|
if (*SWA::SGlobals::ms_IsRenderDepthOfField)
|
||||||
|
{
|
||||||
|
LOGN("[Free Camera] Depth of Field ON");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGN("[Free Camera] Depth of Field OFF");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto isResetFOV = rPadState.IsDown(SWA::eKeyState_Y);
|
||||||
|
auto isIncreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadUp);
|
||||||
|
auto isDecreaseFOV = rPadState.IsDown(SWA::eKeyState_DpadDown);
|
||||||
|
|
||||||
|
auto fovScaleFactor = 0.0f;
|
||||||
|
|
||||||
|
if (isIncreaseFOV)
|
||||||
|
{
|
||||||
|
fovScaleFactor = FOV_MODIFIER_RATIO;
|
||||||
|
}
|
||||||
|
else if (isDecreaseFOV)
|
||||||
|
{
|
||||||
|
fovScaleFactor = -FOV_MODIFIER_RATIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_fieldOfView = fmodf(isResetFOV ? DEFAULT_FIELD_OF_VIEW : g_fieldOfView + fovScaleFactor * App::s_deltaTime * 60.0f, 180.0f);
|
||||||
|
|
||||||
|
FreeCameraPatches::s_fieldOfView = 2.0f * atan(tan(DEGREES_TO_RADIANS(g_fieldOfView / 2.0f) * (16.0f / 9.0f / std::min(aspectRatio, 16.0f / 9.0f))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__imp__sub_82472A18(ctx, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeCameraPatches::Update()
|
||||||
|
{
|
||||||
|
if (!Config::EnableFreeCamera || !App::s_pGameModeStage)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (auto pInputState = SWA::CInputState::GetInstance())
|
||||||
|
{
|
||||||
|
auto& rPadState = pInputState->GetPadState();
|
||||||
|
|
||||||
|
if (rPadState.IsTapped(SWA::eKeyState_Select) && !FreeCameraPatches::s_isActive && !g_isDisablingFreeCamera)
|
||||||
|
{
|
||||||
|
ResetParameters();
|
||||||
|
|
||||||
|
// Process SWA::Message::MsgStartFreeCamera.
|
||||||
|
GuestToHostFunction<int>(sub_8253ACB8, App::s_pGameModeStage);
|
||||||
|
|
||||||
|
FreeCameraPatches::s_isActive = true;
|
||||||
|
*SWA::SGlobals::ms_IsRenderHud = false;
|
||||||
|
|
||||||
|
LOGN("[Free Camera] Enabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rPadState.IsReleased(SWA::eKeyState_Select) && !FreeCameraPatches::s_isActive)
|
||||||
|
g_isDisablingFreeCamera = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
class FreeCameraPatches
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static inline bool s_isActive;
|
||||||
|
|
||||||
|
static inline float s_fieldOfView;
|
||||||
|
|
||||||
|
static void Update();
|
||||||
|
};
|
||||||
@@ -9,10 +9,10 @@ static class FrontendListener : public SDLEventListener
|
|||||||
bool m_isF8KeyDown = false;
|
bool m_isF8KeyDown = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void OnSDLEvent(SDL_Event* event) override
|
bool OnSDLEvent(SDL_Event* event) override
|
||||||
{
|
{
|
||||||
if (!Config::HUDToggleHotkey || OptionsMenu::s_isVisible)
|
if (!Config::HUDToggleKey || OptionsMenu::s_isVisible)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
@@ -34,6 +34,8 @@ public:
|
|||||||
m_isF8KeyDown = event->key.keysym.sym != SDLK_F8;
|
m_isF8KeyDown = event->key.keysym.sym != SDLK_F8;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_frontendListener;
|
g_frontendListener;
|
||||||
|
|||||||
@@ -121,10 +121,10 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnSDLEvent(SDL_Event* event) override
|
bool OnSDLEvent(SDL_Event* event) override
|
||||||
{
|
{
|
||||||
if (!hid::IsInputAllowed())
|
if (!hid::IsInputAllowed())
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
@@ -202,6 +202,8 @@ public:
|
|||||||
ms_touchpadFingerCount--;
|
ms_touchpadFingerCount--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_sdlEventListenerForInputPatches;
|
g_sdlEventListenerForInputPatches;
|
||||||
|
|||||||
@@ -5,8 +5,9 @@
|
|||||||
#include <app.h>
|
#include <app.h>
|
||||||
#include <sdl_events.h>
|
#include <sdl_events.h>
|
||||||
|
|
||||||
|
std::string InspirePatches::s_sceneName;
|
||||||
|
|
||||||
static SWA::Inspire::CScene* g_pScene;
|
static SWA::Inspire::CScene* g_pScene;
|
||||||
static std::string g_sceneName;
|
|
||||||
static bool g_isFirstFrameChecked;
|
static bool g_isFirstFrameChecked;
|
||||||
static uint32_t g_eventDispatchCount;
|
static uint32_t g_eventDispatchCount;
|
||||||
|
|
||||||
@@ -31,6 +32,11 @@ static std::unordered_map<std::string_view, std::pair<float, float>> g_evilSonic
|
|||||||
{ "evrt_m8_04", { 0, 2314 } } // Dark Gaia Appears
|
{ "evrt_m8_04", { 0, 2314 } } // Dark Gaia Appears
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Sonic's mouth EXPLODES for a single frame in Temple Entrance cutscene.
|
||||||
|
// Looks very nasty. Let's hide morph models inbetween certain frames to solve it.
|
||||||
|
static bool g_loadedMouthExplosionAnimation;
|
||||||
|
static bool g_hideMorphModels;
|
||||||
|
|
||||||
// SWA::Inspire::CScene
|
// SWA::Inspire::CScene
|
||||||
PPC_FUNC_IMPL(__imp__sub_82B98D80);
|
PPC_FUNC_IMPL(__imp__sub_82B98D80);
|
||||||
PPC_FUNC(sub_82B98D80)
|
PPC_FUNC(sub_82B98D80)
|
||||||
@@ -49,9 +55,12 @@ PPC_FUNC(sub_82B98D30)
|
|||||||
__imp__sub_82B98D30(ctx, base);
|
__imp__sub_82B98D30(ctx, base);
|
||||||
|
|
||||||
g_pScene = nullptr;
|
g_pScene = nullptr;
|
||||||
g_sceneName.clear();
|
InspirePatches::s_sceneName.clear();
|
||||||
|
|
||||||
SDL_User_EvilSonic(App::s_isWerehog);
|
SDL_User_EvilSonic(App::s_pEvilSonicContext);
|
||||||
|
|
||||||
|
g_loadedMouthExplosionAnimation = false;
|
||||||
|
g_hideMorphModels = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PPC_FUNC_IMPL(__imp__sub_82B9BA98);
|
PPC_FUNC_IMPL(__imp__sub_82B9BA98);
|
||||||
@@ -59,11 +68,31 @@ PPC_FUNC(sub_82B9BA98)
|
|||||||
{
|
{
|
||||||
auto sceneName = (Hedgehog::Base::CSharedString*)g_memory.Translate(ctx.r5.u32);
|
auto sceneName = (Hedgehog::Base::CSharedString*)g_memory.Translate(ctx.r5.u32);
|
||||||
|
|
||||||
g_sceneName = sceneName->c_str();
|
InspirePatches::s_sceneName = sceneName->c_str();
|
||||||
|
|
||||||
__imp__sub_82B9BA98(ctx, base);
|
__imp__sub_82B9BA98(ctx, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AnimationDataMakeMidAsmHook(PPCRegister& r31, PPCRegister& r29, PPCRegister& r28)
|
||||||
|
{
|
||||||
|
uint8_t* base = g_memory.base;
|
||||||
|
|
||||||
|
if (r28.u32 == 0x222E0 &&
|
||||||
|
strcmp(reinterpret_cast<const char*>(base + PPC_LOAD_U32(r31.u32)), "t0_04_SN") == 0 &&
|
||||||
|
XXH3_64bits(base + r29.u32, r28.u32) == 0xEC634F0F379F478A)
|
||||||
|
{
|
||||||
|
g_loadedMouthExplosionAnimation = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hedgehog::Mirage::CSingleMorphElement::Render
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82E32048);
|
||||||
|
PPC_FUNC(sub_82E32048)
|
||||||
|
{
|
||||||
|
if (!g_hideMorphModels)
|
||||||
|
__imp__sub_82E32048(ctx, base);
|
||||||
|
}
|
||||||
|
|
||||||
void InspirePatches::DrawDebug()
|
void InspirePatches::DrawDebug()
|
||||||
{
|
{
|
||||||
if (!g_pScene)
|
if (!g_pScene)
|
||||||
@@ -72,7 +101,7 @@ void InspirePatches::DrawDebug()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Text("Name: %s", g_sceneName.c_str());
|
ImGui::Text("Name: %s", InspirePatches::s_sceneName.c_str());
|
||||||
ImGui::Text("Frame: %f", g_pScene->m_pData->Frame.get());
|
ImGui::Text("Frame: %f", g_pScene->m_pData->Frame.get());
|
||||||
ImGui::Text("Cut: %d", g_pScene->m_pData->Cut.get());
|
ImGui::Text("Cut: %d", g_pScene->m_pData->Cut.get());
|
||||||
|
|
||||||
@@ -97,17 +126,20 @@ void InspirePatches::DrawDebug()
|
|||||||
|
|
||||||
void InspirePatches::Update()
|
void InspirePatches::Update()
|
||||||
{
|
{
|
||||||
if (!g_pScene || !g_sceneName.size())
|
if (!g_pScene || !InspirePatches::s_sceneName.size())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!g_isFirstFrameChecked && std::find(g_alwaysEvilSonic.begin(), g_alwaysEvilSonic.end(), g_sceneName) != g_alwaysEvilSonic.end())
|
g_hideMorphModels = g_loadedMouthExplosionAnimation && g_pScene->m_pData->Frame >= 185.0f &&
|
||||||
|
g_pScene->m_pData->Frame < 195.0f && InspirePatches::s_sceneName == "evrt_t0_04";
|
||||||
|
|
||||||
|
if (!g_isFirstFrameChecked && std::find(g_alwaysEvilSonic.begin(), g_alwaysEvilSonic.end(), InspirePatches::s_sceneName) != g_alwaysEvilSonic.end())
|
||||||
{
|
{
|
||||||
SDL_User_EvilSonic(true);
|
SDL_User_EvilSonic(true);
|
||||||
g_isFirstFrameChecked = true;
|
g_isFirstFrameChecked = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto findResult = g_evilSonicTimings.find(g_sceneName);
|
auto findResult = g_evilSonicTimings.find(InspirePatches::s_sceneName);
|
||||||
|
|
||||||
if (findResult != g_evilSonicTimings.end())
|
if (findResult != g_evilSonicTimings.end())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
class InspirePatches
|
class InspirePatches
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static std::string s_sceneName;
|
||||||
|
|
||||||
static void DrawDebug();
|
static void DrawDebug();
|
||||||
static void Update();
|
static void Update();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,6 +13,17 @@ bool DisableHintsMidAsmHook()
|
|||||||
return !Config::Hints;
|
return !Config::Hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disable Perfect Dark Gaia hints.
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82AC36E0);
|
||||||
|
PPC_FUNC(sub_82AC36E0)
|
||||||
|
{
|
||||||
|
auto pPerfectDarkGaiaChipHintName = (xpointer<char>*)g_memory.Translate(0x8338EF10);
|
||||||
|
|
||||||
|
strcpy(pPerfectDarkGaiaChipHintName->get(), Config::Hints ? "V_CHP_067\0" : "end\0");
|
||||||
|
|
||||||
|
__imp__sub_82AC36E0(ctx, base);
|
||||||
|
}
|
||||||
|
|
||||||
bool DisableControlTutorialMidAsmHook()
|
bool DisableControlTutorialMidAsmHook()
|
||||||
{
|
{
|
||||||
return !Config::ControlTutorial;
|
return !Config::ControlTutorial;
|
||||||
@@ -32,13 +43,6 @@ bool DisableDLCIconMidAsmHook()
|
|||||||
return Config::DisableDLCIcon;
|
return Config::DisableDLCIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToggleSubtitlesMidAsmHook(PPCRegister& r27)
|
|
||||||
{
|
|
||||||
auto pApplicationDocument = (SWA::CApplicationDocument*)g_memory.Translate(r27.u32);
|
|
||||||
|
|
||||||
pApplicationDocument->m_InspireSubtitles = Config::Subtitles;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WerehogBattleMusicMidAsmHook(PPCRegister& r11)
|
void WerehogBattleMusicMidAsmHook(PPCRegister& r11)
|
||||||
{
|
{
|
||||||
if (Config::BattleTheme)
|
if (Config::BattleTheme)
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
#include <api/SWA.h>
|
||||||
#include <user/config.h>
|
#include <user/config.h>
|
||||||
#include <SWA/CharacterUtility/CharacterProxy.h>
|
|
||||||
#include <hid/hid.h>
|
#include <hid/hid.h>
|
||||||
|
#include <app.h>
|
||||||
|
|
||||||
// CObjFlame::CObjFlame
|
// SWA::CObjFlame::CObjFlame
|
||||||
// A field is not zero initialized,
|
// A field is not zero initialized,
|
||||||
// causing collisions to constantly get created
|
// causing collisions to constantly get created
|
||||||
// and slow down the game.
|
// and slow down the game.
|
||||||
@@ -28,7 +29,7 @@ void ObjBigBarrelAllocMidAsmHook(PPCRegister& r3)
|
|||||||
r3.u32 += sizeof(ObjBigBarrelEx);
|
r3.u32 += sizeof(ObjBigBarrelEx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CObjBigBarrel::CObjBigBarrel
|
// SWA::CObjBigBarrel::CObjBigBarrel
|
||||||
PPC_FUNC_IMPL(__imp__sub_8271AC08);
|
PPC_FUNC_IMPL(__imp__sub_8271AC08);
|
||||||
PPC_FUNC(sub_8271AC08)
|
PPC_FUNC(sub_8271AC08)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -97,16 +97,16 @@ void PostUnleashMidAsmHook(PPCRegister& r30)
|
|||||||
|
|
||||||
void SetXButtonHomingMidAsmHook(PPCRegister& r30)
|
void SetXButtonHomingMidAsmHook(PPCRegister& r30)
|
||||||
{
|
{
|
||||||
r30.u32 = Config::HomingAttackOnBoost;
|
r30.u32 = !Config::HomingAttackOnJump;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SWA::Player::CEvilSonicContext
|
// SWA::Player::CEvilSonicContext
|
||||||
PPC_FUNC_IMPL(__imp__sub_823B49D8);
|
PPC_FUNC_IMPL(__imp__sub_823B49D8);
|
||||||
PPC_FUNC(sub_823B49D8)
|
PPC_FUNC(sub_823B49D8)
|
||||||
{
|
{
|
||||||
__imp__sub_823B49D8(ctx, base);
|
App::s_pEvilSonicContext = (SWA::Player::CEvilSonicContext*)g_memory.Translate(ctx.r3.u32);
|
||||||
|
|
||||||
App::s_isWerehog = true;
|
__imp__sub_823B49D8(ctx, base);
|
||||||
|
|
||||||
SDL_User_EvilSonic(true);
|
SDL_User_EvilSonic(true);
|
||||||
}
|
}
|
||||||
@@ -115,9 +115,9 @@ PPC_FUNC(sub_823B49D8)
|
|||||||
PPC_FUNC_IMPL(__imp__sub_823B4590);
|
PPC_FUNC_IMPL(__imp__sub_823B4590);
|
||||||
PPC_FUNC(sub_823B4590)
|
PPC_FUNC(sub_823B4590)
|
||||||
{
|
{
|
||||||
__imp__sub_823B4590(ctx, base);
|
App::s_pEvilSonicContext = nullptr;
|
||||||
|
|
||||||
App::s_isWerehog = false;
|
__imp__sub_823B4590(ctx, base);
|
||||||
|
|
||||||
SDL_User_EvilSonic(false);
|
SDL_User_EvilSonic(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,25 +15,31 @@ PPC_FUNC(sub_824DCF38)
|
|||||||
|
|
||||||
App::s_isLoading = true;
|
App::s_isLoading = true;
|
||||||
|
|
||||||
if (Config::TimeOfDayTransition == ETimeOfDayTransition::PlayStation)
|
if (ctx.r4.u32 == SWA::eLoadingDisplayType_WerehogMovie)
|
||||||
{
|
{
|
||||||
if (ctx.r4.u32 == SWA::eLoadingDisplayType_WerehogMovie)
|
if (Config::TimeOfDayTransition == ETimeOfDayTransition::PlayStation)
|
||||||
{
|
{
|
||||||
ctx.r4.u32 = SWA::eLoadingDisplayType_ChangeTimeOfDay;
|
ctx.r4.u32 = SWA::eLoadingDisplayType_ChangeTimeOfDay;
|
||||||
pLoading->m_IsNightToDay = App::s_isWerehog;
|
pLoading->m_IsNightToDay = App::s_pEvilSonicContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Config::UseArrowsForTimeOfDayTransition)
|
||||||
|
ctx.r4.u32 = SWA::eLoadingDisplayType_Arrows;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto pGameDocument = SWA::CGameDocument::GetInstance())
|
if (Config::FixEggmanlandUsingEventGalleryTransition)
|
||||||
{
|
{
|
||||||
auto stageName = pGameDocument->m_pMember->m_StageName.c_str();
|
if (auto pGameDocument = SWA::CGameDocument::GetInstance())
|
||||||
|
|
||||||
if (stageName && strlen(stageName))
|
|
||||||
{
|
{
|
||||||
/* Fix restarting Eggmanland as the Werehog
|
auto stageName = pGameDocument->m_pMember->m_StageName.c_str();
|
||||||
erroneously using the Event Gallery transition. */
|
|
||||||
if (ctx.r4.u32 == SWA::eLoadingDisplayType_EventGallery && !strcmp(stageName, "Act_EggmanLand"))
|
if (stageName && strlen(stageName))
|
||||||
ctx.r4.u32 = SWA::eLoadingDisplayType_NowLoading;
|
{
|
||||||
|
/* Fix restarting Eggmanland as the Werehog
|
||||||
|
erroneously using the Event Gallery transition. */
|
||||||
|
if (ctx.r4.u32 == SWA::eLoadingDisplayType_EventGallery && !strcmp(stageName, "Act_EggmanLand"))
|
||||||
|
ctx.r4.u32 = SWA::eLoadingDisplayType_NowLoading;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,8 +76,12 @@ PPC_FUNC(sub_830D25D8)
|
|||||||
auto device = reinterpret_cast<GuestDevice*>(base + PPC_LOAD_U32(ctx.r4.u32));
|
auto device = reinterpret_cast<GuestDevice*>(base + PPC_LOAD_U32(ctx.r4.u32));
|
||||||
|
|
||||||
// Set first sampler to use linear filtering.
|
// Set first sampler to use linear filtering.
|
||||||
device->samplerStates[0].data[3] = (device->samplerStates[0].data[3].get() & ~0x1f80000) | 0x1280000;
|
// NOTE: We only check for height here since all 2D primitives get centered.
|
||||||
device->dirtyFlags[3] = device->dirtyFlags[3].get() | 0x80000000ull;
|
if (Video::s_viewportHeight > 720)
|
||||||
|
{
|
||||||
|
device->samplerStates[0].data[3] = (device->samplerStates[0].data[3].get() & ~0x1f80000) | 0x1280000;
|
||||||
|
device->dirtyFlags[3] = device->dirtyFlags[3].get() | 0x80000000ull;
|
||||||
|
}
|
||||||
|
|
||||||
__imp__sub_830D25D8(ctx, base);
|
__imp__sub_830D25D8(ctx, base);
|
||||||
}
|
}
|
||||||
@@ -113,3 +117,27 @@ PPC_FUNC(sub_8260BBF8)
|
|||||||
SetDefaultMaterialParameters(reinterpret_cast<GuestDevice*>(base + PPC_LOAD_U32(PPC_LOAD_U32(ctx.r4.u32))));
|
SetDefaultMaterialParameters(reinterpret_cast<GuestDevice*>(base + PPC_LOAD_U32(PPC_LOAD_U32(ctx.r4.u32))));
|
||||||
__imp__sub_8260BBF8(ctx, base);
|
__imp__sub_8260BBF8(ctx, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The pedestal in Gaia Temple is placed on an opaque mesh slot, despite using additive blending.
|
||||||
|
// This somehow works. Except when the delta time is too stable, it flashes black for one frame.
|
||||||
|
// We can fix it by detecting the asset runtime, and swapping the mesh slots to transparent by hand.
|
||||||
|
|
||||||
|
// Hedgehog::Mirage::CModelData::Make
|
||||||
|
PPC_FUNC_IMPL(__imp__sub_82E38650);
|
||||||
|
PPC_FUNC(sub_82E38650)
|
||||||
|
{
|
||||||
|
if (ctx.r5.u32 == 0xBB90 && XXH3_64bits(base + ctx.r4.u32, ctx.r5.u32) == 0xB524C8C3B80C3F54)
|
||||||
|
{
|
||||||
|
// Mesh Count
|
||||||
|
std::swap(
|
||||||
|
*reinterpret_cast<uint32_t*>(base + ctx.r4.u32 + 0x18),
|
||||||
|
*reinterpret_cast<uint32_t*>(base + ctx.r4.u32 + 0x20));
|
||||||
|
|
||||||
|
// Mesh Offset
|
||||||
|
std::swap(
|
||||||
|
*reinterpret_cast<uint32_t*>(base + ctx.r4.u32 + 0x1C),
|
||||||
|
*reinterpret_cast<uint32_t*>(base + ctx.r4.u32 + 0x24));
|
||||||
|
}
|
||||||
|
|
||||||
|
__imp__sub_82E38650(ctx, base);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,20 +1,19 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
inline const char* g_credits[] =
|
inline std::array<const char*, 14> g_credits =
|
||||||
{
|
{
|
||||||
"Skyth",
|
"Skyth",
|
||||||
"Hyper",
|
"Hyper",
|
||||||
"Darío",
|
"Darío",
|
||||||
"Sajid",
|
"Sajid",
|
||||||
|
"DeaThProj",
|
||||||
"RadiantDerg",
|
"RadiantDerg",
|
||||||
"PTKay",
|
"PTKay",
|
||||||
"DeaThProj",
|
|
||||||
"SuperSonic16",
|
"SuperSonic16",
|
||||||
"NextinHKRY",
|
"NextinHKRY",
|
||||||
"M&M",
|
|
||||||
"saguinee",
|
"saguinee",
|
||||||
"LadyLunanova",
|
"LadyLunanova",
|
||||||
"LJSTAR"
|
"LJSTAR",
|
||||||
|
"Goalringmod27",
|
||||||
|
"M&M"
|
||||||
};
|
};
|
||||||
|
|
||||||
inline size_t g_creditsSize = 12;
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
VERSION_MILESTONE="Beta 1"
|
VERSION_MILESTONE="Beta 3"
|
||||||
VERSION_MAJOR=1
|
VERSION_MAJOR=1
|
||||||
VERSION_MINOR=0
|
VERSION_MINOR=0
|
||||||
VERSION_REVISION=0
|
VERSION_REVISION=0
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class ISDLEventListener
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~ISDLEventListener() = default;
|
virtual ~ISDLEventListener() = default;
|
||||||
virtual void OnSDLEvent(SDL_Event* event) = 0;
|
virtual bool OnSDLEvent(SDL_Event* event) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern std::vector<ISDLEventListener*>& GetEventListeners();
|
extern std::vector<ISDLEventListener*>& GetEventListeners();
|
||||||
@@ -17,5 +17,5 @@ public:
|
|||||||
GetEventListeners().emplace_back(this);
|
GetEventListeners().emplace_back(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnSDLEvent(SDL_Event* event) override {}
|
bool OnSDLEvent(SDL_Event* event) override { return false; }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -48,13 +48,11 @@ static std::unique_ptr<GuestTexture> g_upTrophyIcon;
|
|||||||
static int g_firstVisibleRowIndex;
|
static int g_firstVisibleRowIndex;
|
||||||
static int g_selectedRowIndex;
|
static int g_selectedRowIndex;
|
||||||
static double g_rowSelectionTime;
|
static double g_rowSelectionTime;
|
||||||
|
static double g_lastTappedTime;
|
||||||
|
static double g_lastIncrementTime;
|
||||||
|
|
||||||
static bool g_upWasHeld;
|
static bool g_upWasHeld;
|
||||||
static bool g_downWasHeld;
|
static bool g_downWasHeld;
|
||||||
static bool g_leftWasHeld;
|
|
||||||
static bool g_rightWasHeld;
|
|
||||||
static bool g_upRSWasHeld;
|
|
||||||
static bool g_downRSWasHeld;
|
|
||||||
|
|
||||||
static void ResetSelection()
|
static void ResetSelection()
|
||||||
{
|
{
|
||||||
@@ -67,7 +65,7 @@ static void ResetSelection()
|
|||||||
|
|
||||||
static void DrawContainer(ImVec2 min, ImVec2 max, ImU32 gradientTop, ImU32 gradientBottom, float alpha = 1, float cornerRadius = 25)
|
static void DrawContainer(ImVec2 min, ImVec2 max, ImU32 gradientTop, ImU32 gradientBottom, float alpha = 1, float cornerRadius = 25)
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
DrawPauseContainer(min, max, alpha);
|
DrawPauseContainer(min, max, alpha);
|
||||||
|
|
||||||
@@ -76,8 +74,9 @@ static void DrawContainer(ImVec2 min, ImVec2 max, ImU32 gradientTop, ImU32 gradi
|
|||||||
|
|
||||||
static void DrawHeaderContainer(const char* text)
|
static void DrawHeaderContainer(const char* text)
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
auto fontSize = Scale(24);
|
auto fontSize = Scale(24);
|
||||||
|
auto minTextSize = Scale(294.575989);
|
||||||
auto textSize = g_fntNewRodinUB->CalcTextSizeA(fontSize, FLT_MAX, 0, text);
|
auto textSize = g_fntNewRodinUB->CalcTextSizeA(fontSize, FLT_MAX, 0, text);
|
||||||
auto cornerRadius = 23;
|
auto cornerRadius = 23;
|
||||||
auto textMarginX = Scale(16) + (Scale(cornerRadius) / 2);
|
auto textMarginX = Scale(16) + (Scale(cornerRadius) / 2);
|
||||||
@@ -101,13 +100,12 @@ static void DrawHeaderContainer(const char* text)
|
|||||||
: Lerp(0, 1, colourMotion);
|
: Lerp(0, 1, colourMotion);
|
||||||
|
|
||||||
ImVec2 min = { g_aspectRatioOffsetX + Scale(containerMarginX), g_aspectRatioOffsetY + Scale(136) };
|
ImVec2 min = { g_aspectRatioOffsetX + Scale(containerMarginX), g_aspectRatioOffsetY + Scale(136) };
|
||||||
ImVec2 max = { min.x + textMarginX * 2 + textSize.x + Scale(5), g_aspectRatioOffsetY + Scale(196) };
|
ImVec2 max = { std::max(min.x + minTextSize, min.x + textMarginX * 2 + textSize.x + Scale(5)), g_aspectRatioOffsetY + Scale(196) };
|
||||||
|
|
||||||
DrawPauseHeaderContainer(min, max, alpha);
|
DrawPauseHeaderContainer(min, max, alpha);
|
||||||
|
|
||||||
SetTextSkew((min.y + max.y) / 2.0f, Scale(3.0f));
|
SetTextSkew((min.y + max.y) / 2.0f, Scale(3.0f));
|
||||||
|
|
||||||
// TODO: Apply bevel.
|
|
||||||
DrawTextWithOutline
|
DrawTextWithOutline
|
||||||
(
|
(
|
||||||
g_fntNewRodinUB,
|
g_fntNewRodinUB,
|
||||||
@@ -124,7 +122,7 @@ static void DrawHeaderContainer(const char* text)
|
|||||||
|
|
||||||
static void DrawAchievement(int rowIndex, float yOffset, Achievement& achievement, bool isUnlocked)
|
static void DrawAchievement(int rowIndex, float yOffset, Achievement& achievement, bool isUnlocked)
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
auto clipRectMin = drawList->GetClipRectMin();
|
auto clipRectMin = drawList->GetClipRectMin();
|
||||||
auto clipRectMax = drawList->GetClipRectMax();
|
auto clipRectMax = drawList->GetClipRectMax();
|
||||||
@@ -197,7 +195,7 @@ static void DrawAchievement(int rowIndex, float yOffset, Achievement& achievemen
|
|||||||
ImVec2 marqueeMin = { textMarqueeX, min.y };
|
ImVec2 marqueeMin = { textMarqueeX, min.y };
|
||||||
ImVec2 marqueeMax = { max.x - Scale(10) /* timestamp margin X */, max.y };
|
ImVec2 marqueeMax = { max.x - Scale(10) /* timestamp margin X */, max.y };
|
||||||
|
|
||||||
SetMarqueeFade(marqueeMin, marqueeMax, Scale(32));
|
SetHorizontalMarqueeFade(marqueeMin, marqueeMax, Scale(32));
|
||||||
|
|
||||||
if (isSelected && textX + textSize.x >= max.x - Scale(10))
|
if (isSelected && textX + textSize.x >= max.x - Scale(10))
|
||||||
{
|
{
|
||||||
@@ -339,7 +337,7 @@ static void DrawAchievement(int rowIndex, float yOffset, Achievement& achievemen
|
|||||||
|
|
||||||
static void DrawTrophySparkles(ImVec2 min, ImVec2 max, int recordCount, int trophyFrameIndex)
|
static void DrawTrophySparkles(ImVec2 min, ImVec2 max, int recordCount, int trophyFrameIndex)
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
constexpr auto recordsHalfTotal = ACH_RECORDS / 2;
|
constexpr auto recordsHalfTotal = ACH_RECORDS / 2;
|
||||||
|
|
||||||
@@ -427,7 +425,7 @@ static void DrawTrophySparkles(ImVec2 min, ImVec2 max, int recordCount, int trop
|
|||||||
|
|
||||||
static void DrawAchievementTotal(ImVec2 min, ImVec2 max)
|
static void DrawAchievementTotal(ImVec2 min, ImVec2 max)
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
// Transparency fade animation.
|
// Transparency fade animation.
|
||||||
auto alpha = Cubic(0, 1, ComputeMotion(g_appearTime, COUNTER_INTRO_FADE_START, COUNTER_INTRO_FADE_END));
|
auto alpha = Cubic(0, 1, ComputeMotion(g_appearTime, COUNTER_INTRO_FADE_START, COUNTER_INTRO_FADE_END));
|
||||||
@@ -511,7 +509,7 @@ static void DrawAchievementTotal(ImVec2 min, ImVec2 max)
|
|||||||
|
|
||||||
static void DrawContentContainer()
|
static void DrawContentContainer()
|
||||||
{
|
{
|
||||||
auto drawList = ImGui::GetForegroundDrawList();
|
auto drawList = ImGui::GetBackgroundDrawList();
|
||||||
|
|
||||||
// Expand/retract animation.
|
// Expand/retract animation.
|
||||||
auto motion = g_isClosing
|
auto motion = g_isClosing
|
||||||
@@ -566,15 +564,12 @@ static void DrawContentContainer()
|
|||||||
// Draw separators.
|
// Draw separators.
|
||||||
for (int i = 1; i <= 3; i++)
|
for (int i = 1; i <= 3; i++)
|
||||||
{
|
{
|
||||||
auto lineMarginLeft = Scale(35);
|
ImVec2 lineMin = { clipRectMin.x + Scale(35), clipRectMin.y + itemHeight * i + Scale(2) };
|
||||||
auto lineMarginRight = Scale(55);
|
ImVec2 lineMax = { clipRectMax.x - Scale(55), lineMin.y + Scale(1.3f) };
|
||||||
auto lineMarginY = Scale(2);
|
|
||||||
|
|
||||||
ImVec2 lineMin = { clipRectMin.x + lineMarginLeft, clipRectMin.y + itemHeight * i + lineMarginY };
|
SetAdditive(true);
|
||||||
ImVec2 lineMax = { clipRectMax.x - lineMarginRight, clipRectMin.y + itemHeight * i + lineMarginY };
|
drawList->AddRectFilled(lineMin, lineMax, IM_COL32(160, 160, 160, 60));
|
||||||
|
SetAdditive(false);
|
||||||
drawList->AddLine(lineMin, lineMax, IM_COL32(163, 163, 163, 255));
|
|
||||||
drawList->AddLine({ lineMin.x, lineMin.y + Scale(1) }, { lineMax.x, lineMax.y + Scale(1) }, IM_COL32(143, 148, 143, 255));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& tpl : g_achievements)
|
for (auto& tpl : g_achievements)
|
||||||
@@ -601,26 +596,41 @@ static void DrawContentContainer()
|
|||||||
bool downIsHeld = inputState->GetPadState().IsDown(SWA::eKeyState_DpadDown) ||
|
bool downIsHeld = inputState->GetPadState().IsDown(SWA::eKeyState_DpadDown) ||
|
||||||
inputState->GetPadState().LeftStickVertical < -0.5f;
|
inputState->GetPadState().LeftStickVertical < -0.5f;
|
||||||
|
|
||||||
bool leftIsHeld = inputState->GetPadState().IsDown(SWA::eKeyState_DpadLeft) ||
|
|
||||||
inputState->GetPadState().LeftStickHorizontal < -0.5f;
|
|
||||||
|
|
||||||
bool rightIsHeld = inputState->GetPadState().IsDown(SWA::eKeyState_DpadRight) ||
|
|
||||||
inputState->GetPadState().LeftStickHorizontal > 0.5f;
|
|
||||||
|
|
||||||
bool upRSIsHeld = inputState->GetPadState().RightStickVertical > 0.5f;
|
|
||||||
bool downRSIsHeld = inputState->GetPadState().RightStickVertical < -0.5f;
|
|
||||||
|
|
||||||
bool isReachedTop = g_selectedRowIndex == 0;
|
bool isReachedTop = g_selectedRowIndex == 0;
|
||||||
bool isReachedBottom = g_selectedRowIndex == rowCount - 1;
|
bool isReachedBottom = g_selectedRowIndex == rowCount - 1;
|
||||||
|
|
||||||
bool scrollUp = !g_upWasHeld && upIsHeld;
|
bool scrollUp = !g_upWasHeld && upIsHeld;
|
||||||
bool scrollDown = !g_downWasHeld && downIsHeld;
|
bool scrollDown = !g_downWasHeld && downIsHeld;
|
||||||
bool scrollPageUp = !g_leftWasHeld && leftIsHeld && !isReachedTop;
|
|
||||||
bool scrollPageDown = !g_rightWasHeld && rightIsHeld && !isReachedBottom;
|
|
||||||
bool jumpToTop = !g_upRSWasHeld && upRSIsHeld && !isReachedTop;
|
|
||||||
bool jumpToBottom = !g_downRSWasHeld && downRSIsHeld && !isReachedBottom;
|
|
||||||
|
|
||||||
int prevSelectedRowIndex = g_selectedRowIndex;
|
auto time = ImGui::GetTime();
|
||||||
|
auto fastScroll = (time - g_lastTappedTime) > 0.6;
|
||||||
|
auto fastScrollSpeed = 1.0 / 3.5;
|
||||||
|
static auto fastScrollSpeedUp = false;
|
||||||
|
|
||||||
|
if (scrollUp || scrollDown)
|
||||||
|
g_lastTappedTime = time;
|
||||||
|
|
||||||
|
if (!upIsHeld && !downIsHeld)
|
||||||
|
fastScrollSpeedUp = false;
|
||||||
|
|
||||||
|
if (fastScrollSpeedUp)
|
||||||
|
fastScrollSpeed /= 2;
|
||||||
|
|
||||||
|
if (fastScroll)
|
||||||
|
{
|
||||||
|
if ((time - g_lastIncrementTime) < fastScrollSpeed)
|
||||||
|
{
|
||||||
|
fastScroll = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_lastIncrementTime = time;
|
||||||
|
|
||||||
|
scrollUp = upIsHeld;
|
||||||
|
scrollDown = downIsHeld;
|
||||||
|
fastScrollSpeedUp = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (scrollUp)
|
if (scrollUp)
|
||||||
{
|
{
|
||||||
@@ -634,40 +644,15 @@ static void DrawContentContainer()
|
|||||||
if (g_selectedRowIndex >= rowCount)
|
if (g_selectedRowIndex >= rowCount)
|
||||||
g_selectedRowIndex = 0;
|
g_selectedRowIndex = 0;
|
||||||
}
|
}
|
||||||
else if (scrollPageUp)
|
|
||||||
{
|
|
||||||
g_selectedRowIndex -= 3;
|
|
||||||
if (g_selectedRowIndex < 0)
|
|
||||||
g_selectedRowIndex = 0;
|
|
||||||
}
|
|
||||||
else if (scrollPageDown)
|
|
||||||
{
|
|
||||||
g_selectedRowIndex += 3;
|
|
||||||
if (g_selectedRowIndex >= rowCount)
|
|
||||||
g_selectedRowIndex = rowCount - 1;
|
|
||||||
}
|
|
||||||
else if (jumpToTop)
|
|
||||||
{
|
|
||||||
g_selectedRowIndex = 0;
|
|
||||||
}
|
|
||||||
else if (jumpToBottom)
|
|
||||||
{
|
|
||||||
g_selectedRowIndex = rowCount - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// lol
|
if (scrollUp || scrollDown)
|
||||||
if (scrollUp || scrollDown || scrollPageUp || scrollPageDown || jumpToTop || jumpToBottom)
|
|
||||||
{
|
{
|
||||||
g_rowSelectionTime = ImGui::GetTime();
|
g_rowSelectionTime = time;
|
||||||
Game_PlaySound("sys_actstg_pausecursor");
|
Game_PlaySound("sys_actstg_pausecursor");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_upWasHeld = upIsHeld;
|
g_upWasHeld = upIsHeld;
|
||||||
g_downWasHeld = downIsHeld;
|
g_downWasHeld = downIsHeld;
|
||||||
g_leftWasHeld = leftIsHeld;
|
|
||||||
g_rightWasHeld = rightIsHeld;
|
|
||||||
g_upRSWasHeld = upRSIsHeld;
|
|
||||||
g_downRSWasHeld = downRSIsHeld;
|
|
||||||
|
|
||||||
int visibleRowCount = int(floor((clipRectMax.y - clipRectMin.y) / itemHeight));
|
int visibleRowCount = int(floor((clipRectMax.y - clipRectMin.y) / itemHeight));
|
||||||
|
|
||||||
@@ -778,12 +763,12 @@ void AchievementMenu::Open()
|
|||||||
return std::get<1>(a) > std::get<1>(b);
|
return std::get<1>(a) > std::get<1>(b);
|
||||||
});
|
});
|
||||||
|
|
||||||
ButtonGuide::Open(Button(Localise("Common_Back"), EButtonIcon::B));
|
ButtonGuide::Open(Button("Common_Back", EButtonIcon::B));
|
||||||
|
|
||||||
ResetSelection();
|
ResetSelection();
|
||||||
Game_PlaySound("sys_actstg_pausewinopen");
|
Game_PlaySound("sys_actstg_pausewinopen");
|
||||||
|
|
||||||
hid::SetProhibitedButtons(XAMINPUT_GAMEPAD_START);
|
hid::SetProhibitedInputs(XAMINPUT_GAMEPAD_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AchievementMenu::Close()
|
void AchievementMenu::Close()
|
||||||
@@ -793,7 +778,7 @@ void AchievementMenu::Close()
|
|||||||
g_appearTime = ImGui::GetTime();
|
g_appearTime = ImGui::GetTime();
|
||||||
g_isClosing = true;
|
g_isClosing = true;
|
||||||
|
|
||||||
hid::SetProhibitedButtons(0);
|
hid::SetProhibitedInputs();
|
||||||
}
|
}
|
||||||
|
|
||||||
ButtonGuide::Close();
|
ButtonGuide::Close();
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user