mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-05 11:33:39 -04:00
Compare commits
389 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 27274e7341 | |||
| 1cb8b19520 | |||
| d109cd891e | |||
| 63c4002ca6 | |||
| 6954efcd15 | |||
| 78c2147771 | |||
| c938d5468e | |||
| 35590c5312 | |||
| e976b10e2a | |||
| 3949706b28 | |||
| ce55916845 | |||
| 9b252cbdd2 | |||
| 97fa09f6ee | |||
| 0e7a7cccb9 | |||
| 1c0cdcc176 | |||
| 280305c2ba | |||
| d1f1d579bc | |||
| eeeb3ffe25 | |||
| 1ee0f862e1 | |||
| 6b327c9f61 | |||
| f148e0ebc1 | |||
| 6f20f4d629 | |||
| 94670270d6 | |||
| 8e21247a97 | |||
| aa84004cb4 | |||
| e1c201f4bd | |||
| 425a1d15a0 | |||
| e3ad41792a | |||
| c1ba10fc8b | |||
| 1c5686f71b | |||
| b9e0f2b9ca | |||
| ede175f141 | |||
| a301874e30 | |||
| 9b4a9a6bd9 | |||
| 04274b1884 | |||
| ca783b8424 | |||
| 2e4c2b5b46 | |||
| 4c09d8b910 | |||
| fb1b260d09 | |||
| 98eb8f718e | |||
| 68b2e0ee2d | |||
| 81771a0522 | |||
| 93c8bcc210 | |||
| 176bf5f0c4 | |||
| 65a5945778 | |||
| 8f7b9cdfdd | |||
| acecba7ff7 | |||
| 507e0aadbc | |||
| 8406d9b192 | |||
| 6f3170cb56 | |||
| 835582224e | |||
| 52879f50f0 | |||
| 2b505f1be4 | |||
| f089f9024d | |||
| 43fb421a93 | |||
| f06d6b50a9 | |||
| 2c987b0211 | |||
| 3d860ad454 | |||
| b5bf19569b | |||
| 5a7f5cb4a7 | |||
| 1affefbbfc | |||
| e4ff38a712 | |||
| f2ac4d6f44 | |||
| 48b98a5432 | |||
| a4752154f7 | |||
| 0d973a497b | |||
| ab4eccf1df | |||
| e0c449f28e | |||
| ce9a5c06d5 | |||
| 2bbba1e4e8 | |||
| 39298f8d8f | |||
| 32b4c0567a | |||
| 7ff1b5332e | |||
| 5e77a60bd6 | |||
| 9629c000bd | |||
| 9dc5fed686 | |||
| 2cc9db77dd | |||
| 8aa08c9443 | |||
| dca3e2eba6 | |||
| 57061fba38 | |||
| cee6a24309 | |||
| 62edb3abc6 | |||
| 1c9e1c0a66 | |||
| a06aeb10c1 | |||
| b84b309e00 | |||
| 62eecb3ccd | |||
| ec07572ced | |||
| b45e2fa34d | |||
| 289a718446 | |||
| 292a2a6c34 | |||
| 2e8415b950 | |||
| dbf1f6e354 | |||
| 9a2fe9745d | |||
| b5ca343fac | |||
| 88c7ff63ff | |||
| 7a438ad30f | |||
| 89649de7c3 | |||
| a1960eaa33 | |||
| d6820c9233 | |||
| 5c4bb8d33d | |||
| e3ce1f01c9 | |||
| 9b6b344ecf | |||
| 3db85d5b44 | |||
| b5871d72d9 | |||
| b70a714f88 | |||
| cad5a8d1bc | |||
| 93f8a5fa8f | |||
| b0809ea78c | |||
| b0e9033736 | |||
| ce0d89058a | |||
| 1ac6df8de7 | |||
| 5899b2157a | |||
| 3185f578fb | |||
| 4fc09799b6 | |||
| fe0e3cad72 | |||
| 37d1aa7f40 | |||
| 4a12554bf4 | |||
| fecd1d5683 | |||
| bce9bf6fd9 | |||
| fbf63b075a | |||
| b86d6e90e2 | |||
| 6425b452e7 | |||
| 1657fe8083 | |||
| ecd74a4cbd | |||
| 36dc43c602 | |||
| d92515f0d4 | |||
| f147dcac0c | |||
| ee4c84f39b | |||
| b8a83c6f59 | |||
| 4462c0ef69 | |||
| c803bfb545 | |||
| 2623c44cab | |||
| 24dd02fc81 | |||
| a97602b6dc | |||
| e2943e90dc | |||
| 3cb7fbd030 | |||
| afe54f22ab | |||
| e15f5bcee9 | |||
| 1e372a856d | |||
| b26896cad5 | |||
| f75faf6b06 | |||
| b48d9aa052 | |||
| d899706208 | |||
| 3e05789b58 | |||
| 9a7b62cbc6 | |||
| 8e0f0e878e | |||
| 79344edf0d | |||
| e59bfd1a9c | |||
| 4d12cc8ea2 | |||
| 2ed2268579 | |||
| 94a99e8da0 | |||
| ddaf50c01d | |||
| 7566949b42 | |||
| bb6db3caea | |||
| 2dc494dc1c | |||
| 3c25633ee9 | |||
| d99ed2729b | |||
| 782455d48b | |||
| 47863b34c2 | |||
| 92391d5eb8 | |||
| 0d37cb4e54 | |||
| ea528ed9d9 | |||
| f7b880c5ea | |||
| ff78bc8d6c | |||
| 6503b4e7eb | |||
| 30b7087f30 | |||
| 0c1372f986 | |||
| 8fb4ba8924 | |||
| 5f675c6f2b | |||
| b3333241c5 | |||
| e39079c0f8 | |||
| c3317d9232 | |||
| 36092f1fdb | |||
| a4777045fe | |||
| bbe8ea6aa6 | |||
| d662db69f0 | |||
| 5eb3184174 | |||
| 9b259143be | |||
| 025cb58493 | |||
| b3dee825e8 | |||
| f6c5aac3c8 | |||
| 25e9064d09 | |||
| 5f33489465 | |||
| 3e1e8f1244 | |||
| 23a91a37be | |||
| a886f8a2df | |||
| 6df7b1e9cd | |||
| 206c02b527 | |||
| a05d1a9ee6 | |||
| ed0df01b8d | |||
| 0f9d563a3e | |||
| f3fb65495e | |||
| 196f33005e | |||
| 90c0bdded0 | |||
| f856f871bb | |||
| e75ea18ef0 | |||
| 50e2d9d1a7 | |||
| 5c84978c3c | |||
| 3859f39729 | |||
| 3498ded9d9 | |||
| 8784958c40 | |||
| c1231885fe | |||
| 2b65a696dd | |||
| 02924549be | |||
| 6cf94b4491 | |||
| 30aa2dd527 | |||
| 8e121a7e51 | |||
| 34ec362876 | |||
| ba58d2486e | |||
| f7b5350d60 | |||
| 9ddfcc38c9 | |||
| cee66a6fd5 | |||
| 574b6197a2 | |||
| 6fc8628144 | |||
| ca9330b412 | |||
| 1b792eb964 | |||
| 0e5ea0d3b1 | |||
| 977ad16806 | |||
| 41420bc71c | |||
| 5ec5f8864a | |||
| 60e8836968 | |||
| e755148f16 | |||
| 0bf663141a | |||
| 17949e526b | |||
| d7dced7ddf | |||
| 4e264d6a22 | |||
| c8e89a0f99 | |||
| c61e32cd4f | |||
| 274bf61b3e | |||
| 05b2a5cbe9 | |||
| aa838c8003 | |||
| d5aabe9f9e | |||
| 171dbdd0a1 | |||
| b2c09d56d6 | |||
| f0e8379fa5 | |||
| 1fea4f02ed | |||
| 35ea13c53a | |||
| 78b0563c0e | |||
| 5fab665f21 | |||
| 109f0a50e5 | |||
| 746910c59f | |||
| ae4806ae4f | |||
| 1c00e2cdde | |||
| 78301a8a83 | |||
| ca798049b3 | |||
| daf4b1dfeb | |||
| 5bdd31a5af | |||
| 3cb5e5172b | |||
| d625c7ab0c | |||
| c2045391c8 | |||
| f04a0ffcf1 | |||
| dfdac1c1cd | |||
| f4b361ab02 | |||
| 5f3d3012ff | |||
| 0897ef1132 | |||
| 8b89dbcbf0 | |||
| f24e944ab0 | |||
| 23130d5a57 | |||
| 1e6e1976e3 | |||
| 4453316bb0 | |||
| 14aeefb813 | |||
| c991c7c407 | |||
| 251c6e7aec | |||
| cf2357fff2 | |||
| 06e6b0d47e | |||
| a83b4186af | |||
| dc5de83436 | |||
| 77425b4b25 | |||
| 5a109313cb | |||
| d8a7927602 | |||
| cccddee106 | |||
| 6c252c6d26 | |||
| b06c1911c6 | |||
| 7c9e99220a | |||
| bfd8b9f453 | |||
| 53e8662335 | |||
| ae54f024cd | |||
| 9aa391c5bf | |||
| ec48249934 | |||
| 6a8f3516f9 | |||
| 79d4835784 | |||
| b1a4783e38 | |||
| 0038afa392 | |||
| 5fcffa0b4f | |||
| 9e9d11ae89 | |||
| 97bd84725c | |||
| 19c86b1b73 | |||
| ca247095da | |||
| c350b7b8ed | |||
| ac3d3314c4 | |||
| f916a48db0 | |||
| 6963a4b554 | |||
| 4466bf4e12 | |||
| c4d01b82a6 | |||
| 42e8d9ab9d | |||
| 9c562ff740 | |||
| 1787de517c | |||
| 832e567620 | |||
| 319efbe662 | |||
| 6f34bb050a | |||
| a2a56122e2 | |||
| 58f2679def | |||
| 396ea02fe5 | |||
| 8100ddb990 | |||
| d78c46a628 | |||
| 1e93657ab5 | |||
| 366e47245e | |||
| 4c53ba91be | |||
| cf080523cb | |||
| a15d0af139 | |||
| d99205ecc6 | |||
| dd3a61d84c | |||
| 595a6f1c9e | |||
| 18d70df188 | |||
| 46f6dc67c1 | |||
| 6267b79da3 | |||
| 62f3d09076 | |||
| 4b3c559df3 | |||
| 30a99c22f1 | |||
| 360cb37028 | |||
| 4b6b41a6aa | |||
| faa8618124 | |||
| 89acf923e0 | |||
| c42a33154c | |||
| 871d18e294 | |||
| c157564da6 | |||
| ecc3b00c51 | |||
| a074e30147 | |||
| 2ce272d586 | |||
| e1636e20bd | |||
| 9904720e5a | |||
| 9910320fb4 | |||
| b43a9e2ccc | |||
| 23d81492e6 | |||
| 65b0ec3f90 | |||
| 91248d10db | |||
| f76a4d7087 | |||
| c7b609945b | |||
| 6ca6ea8065 | |||
| 315f621176 | |||
| 10d9a818c2 | |||
| e3761784af | |||
| d85556a063 | |||
| c43f33a5bc | |||
| e63897d1f7 | |||
| 35a69e7ff1 | |||
| 8b9f09bda5 | |||
| 32cddc725b | |||
| 55eec3b0de | |||
| 1cf14f176c | |||
| 74550b031f | |||
| 2f84f0eaa4 | |||
| 3ed7ef1c88 | |||
| eace147652 | |||
| 53c005c4f1 | |||
| a4ff97564c | |||
| c6beeba14f | |||
| e470278717 | |||
| 783230b654 | |||
| 4e7711725a | |||
| e5bf7606ec | |||
| aa377cd5c1 | |||
| bb9a88d7dc | |||
| 341e97ba82 | |||
| 8d3cb51157 | |||
| 7fff3b5ae0 | |||
| 6beb73b7a6 | |||
| c239a5a226 | |||
| b3f8fecfe4 | |||
| 6dcf4942f5 | |||
| cd7e429a66 | |||
| fcfcb35929 | |||
| 82b20be436 | |||
| 33101d8050 | |||
| 05160a968c | |||
| 623f29eb24 | |||
| 0a3833818a | |||
| 4f276252a3 | |||
| d17c629ce0 | |||
| 5bcc969778 | |||
| 8afb1141ab | |||
| 8c5673d9b8 | |||
| 916dfcd9da | |||
| 842210e539 | |||
| 39d951d0cb | |||
| a4be0841e5 | |||
| 31c5397ae3 | |||
| 0d76b90144 | |||
| a6690c2052 |
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
Language: Cpp
|
Language: Cpp
|
||||||
Standard: C++03
|
Standard: C++03
|
||||||
AccessModifierOffset: -4
|
AccessModifierOffset: -4
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: DontAlign
|
||||||
AlignConsecutiveAssignments: false
|
AlignConsecutiveAssignments: false
|
||||||
AlignConsecutiveDeclarations: false
|
AlignConsecutiveDeclarations: false
|
||||||
AlignOperands: true
|
AlignOperands: true
|
||||||
|
|||||||
Vendored
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
"type": "cppvsdbg",
|
"type": "cppvsdbg",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${command:cmake.launchTargetPath}",
|
"program": "${command:cmake.launchTargetPath}",
|
||||||
"args": ["-l", "1", "--dvd", "${workspaceRoot}/orig/GZ2E01/GZ2E01.iso"],
|
"args": ["-l", "1", "--dvd", "${workspaceRoot}/orig/GZ2E01/GZ2E01.iso", "--console"],
|
||||||
"MIMode": "gdb",
|
"MIMode": "gdb",
|
||||||
"miDebuggerPath": "gdb",
|
"miDebuggerPath": "gdb",
|
||||||
"symbolSearchPath": "${command:cmake.launchTargetPath}",
|
"symbolSearchPath": "${command:cmake.launchTargetPath}",
|
||||||
|
|||||||
+103
-39
@@ -90,11 +90,17 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
|
|
||||||
|
# Folder-based instead of target-based organization
|
||||||
|
# in Visual Studio and Xcode generators
|
||||||
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
|
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "_cmake")
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
if (CMAKE_SYSTEM_NAME STREQUAL Linux)
|
||||||
set(DAWN_USE_WAYLAND ON CACHE BOOL "Enable support for Wayland surface" FORCE)
|
set(DAWN_USE_WAYLAND ON CACHE BOOL "Enable support for Wayland surface" FORCE)
|
||||||
endif ()
|
endif ()
|
||||||
set(AURORA_ENABLE_DVD ON CACHE BOOL "Enable DVD API support" FORCE)
|
set(AURORA_ENABLE_DVD ON CACHE BOOL "Enable DVD API support" FORCE)
|
||||||
set(AURORA_ENABLE_CARD ON CACHE BOOL "Enable CARD API support" FORCE)
|
set(AURORA_ENABLE_CARD ON CACHE BOOL "Enable CARD API support" FORCE)
|
||||||
|
set(AURORA_ENABLE_RMLUI ON CACHE BOOL "Enable RmlUi UI support" FORCE)
|
||||||
add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)
|
add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
add_subdirectory(libs/freeverb)
|
add_subdirectory(libs/freeverb)
|
||||||
@@ -275,22 +281,16 @@ set(DUSK_COMPANY_NAME "Twilit Realm")
|
|||||||
set(DUSK_FILE_DESCRIPTION "Dusk")
|
set(DUSK_FILE_DESCRIPTION "Dusk")
|
||||||
set(DUSK_PRODUCT_NAME "Dusk")
|
set(DUSK_PRODUCT_NAME "Dusk")
|
||||||
set(DUSK_COPYRIGHT "Copyright (C) Twilit Realm contributors")
|
set(DUSK_COPYRIGHT "Copyright (C) Twilit Realm contributors")
|
||||||
set(DUSK_GAME_NAME "GZ2E")
|
|
||||||
set(DUSK_GAME_VERSION "01")
|
|
||||||
set(DUSK_TP_VERSION ${DUSK_GAME_NAME}${DUSK_GAME_VERSION})
|
|
||||||
|
|
||||||
message(STATUS "dusk: Game Version: ${DUSK_TP_VERSION}")
|
source_group("dolzel" FILES ${DOLZEL_FILES} ${Z2AUDIOLIB_FILES} ${REL_FILES})
|
||||||
|
|
||||||
source_group("dolzel" FILES ${DOLZEL_FILES} ${Z2AUDIOLIB_FILES} ${JSYSTEM_FILES} ${JSYSTEM_DEBUG_FILES} ${REL_FILES})
|
|
||||||
source_group("dusk" FILES ${DUSK_FILES})
|
source_group("dusk" FILES ${DUSK_FILES})
|
||||||
|
|
||||||
set(GAME_COMPILE_DEFS TARGET_PC WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0
|
set(GAME_COMPILE_DEFS TARGET_PC WIDESCREEN_SUPPORT=1 AVOID_UB=1 VERSION=0)
|
||||||
DUSK_TP_VERSION="${DUSK_TP_VERSION}" DUSK_GAME_NAME="${DUSK_GAME_NAME}" DUSK_GAME_VERSION="${DUSK_GAME_VERSION}")
|
|
||||||
|
|
||||||
set(GAME_INCLUDE_DIRS
|
set(GAME_INCLUDE_DIRS
|
||||||
include
|
include
|
||||||
src
|
src
|
||||||
assets/${DUSK_TP_VERSION}
|
assets/GZ2E01 # TODO: make this dynamic if needed?
|
||||||
libs/JSystem/include
|
libs/JSystem/include
|
||||||
libs
|
libs
|
||||||
extern/aurora/include/dolphin
|
extern/aurora/include/dolphin
|
||||||
@@ -307,6 +307,10 @@ if (DUSK_ENABLE_SENTRY_NATIVE)
|
|||||||
list(APPEND GAME_COMPILE_DEFS DUSK_ENABLE_SENTRY_NATIVE=1 SENTRY_BUILD_STATIC=1)
|
list(APPEND GAME_COMPILE_DEFS DUSK_ENABLE_SENTRY_NATIVE=1 SENTRY_BUILD_STATIC=1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
list(APPEND GAME_LIBS Ws2_32)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (DUSK_MOVIE_SUPPORT)
|
if (DUSK_MOVIE_SUPPORT)
|
||||||
if (TARGET libjpeg-turbo::turbojpeg-static)
|
if (TARGET libjpeg-turbo::turbojpeg-static)
|
||||||
list(APPEND GAME_LIBS libjpeg-turbo::turbojpeg-static)
|
list(APPEND GAME_LIBS libjpeg-turbo::turbojpeg-static)
|
||||||
@@ -316,6 +320,48 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
|
list(APPEND GAME_COMPILE_DEFS MOVIE_SUPPORT=1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
option(DUSK_ENABLE_DISCORD_RPC "Enable Discord Rich Presence support" ON)
|
||||||
|
if (DUSK_ENABLE_DISCORD_RPC AND NOT ANDROID AND NOT IOS AND NOT TVOS)
|
||||||
|
|
||||||
|
FetchContent_Populate(discord_rpc
|
||||||
|
URL https://github.com/discord/discord-rpc/archive/refs/tags/v3.4.0.tar.gz
|
||||||
|
URL_HASH SHA256=e13427019027acd187352dacba6c65953af66fdf3c35fcf38fc40b454a9d7855
|
||||||
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||||
|
)
|
||||||
|
# RapidJSON is a git submodule absent from the discord-rpc tarball; fetch separately.
|
||||||
|
FetchContent_Populate(rapidjson
|
||||||
|
URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.tar.gz
|
||||||
|
URL_HASH SHA256=bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
|
||||||
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||||
|
)
|
||||||
|
|
||||||
|
if (NOT TARGET discord-rpc)
|
||||||
|
set(_drpc ${discord_rpc_SOURCE_DIR}/src)
|
||||||
|
set(_drpc_src
|
||||||
|
${_drpc}/discord_rpc.cpp
|
||||||
|
${_drpc}/rpc_connection.cpp
|
||||||
|
${_drpc}/serialization.cpp
|
||||||
|
)
|
||||||
|
if (WIN32)
|
||||||
|
list(APPEND _drpc_src ${_drpc}/connection_win.cpp ${_drpc}/discord_register_win.cpp)
|
||||||
|
elseif (APPLE)
|
||||||
|
list(APPEND _drpc_src ${_drpc}/connection_unix.cpp ${_drpc}/discord_register_osx.m)
|
||||||
|
else ()
|
||||||
|
list(APPEND _drpc_src ${_drpc}/connection_unix.cpp ${_drpc}/discord_register_linux.cpp)
|
||||||
|
endif ()
|
||||||
|
add_library(discord-rpc STATIC ${_drpc_src})
|
||||||
|
target_include_directories(discord-rpc PUBLIC
|
||||||
|
${discord_rpc_SOURCE_DIR}/include
|
||||||
|
${rapidjson_SOURCE_DIR}/include
|
||||||
|
)
|
||||||
|
if (UNIX)
|
||||||
|
target_link_libraries(discord-rpc PUBLIC pthread)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
list(APPEND GAME_LIBS discord-rpc)
|
||||||
|
list(APPEND GAME_COMPILE_DEFS DUSK_DISCORD_RPC=1)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# Edit & Continue
|
# Edit & Continue
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
if ("${CMAKE_MSVC_DEBUG_INFORMATION_FORMAT}" STREQUAL "" AND CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if ("${CMAKE_MSVC_DEBUG_INFORMATION_FORMAT}" STREQUAL "" AND CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
@@ -332,47 +378,65 @@ endif ()
|
|||||||
|
|
||||||
# game_debug is for game code files that we know work when compiled with DEBUG=1
|
# game_debug is for game code files that we know work when compiled with DEBUG=1
|
||||||
# Of course, if building a release build, this distinction is irrelevant
|
# Of course, if building a release build, this distinction is irrelevant
|
||||||
add_library(game_debug OBJECT ${JSYSTEM_DEBUG_FILES} ${SSYSTEM_FILES}
|
set(GAME_DEBUG_FILES
|
||||||
|
${SSYSTEM_FILES}
|
||||||
src/dusk/audio/DuskAudioSystem.cpp
|
src/dusk/audio/DuskAudioSystem.cpp
|
||||||
src/dusk/audio/JASCriticalSection.cpp
|
src/dusk/audio/JASCriticalSection.cpp
|
||||||
src/dusk/audio/DuskDsp.cpp
|
src/dusk/audio/DuskDsp.cpp
|
||||||
src/dusk/audio/Adpcm.cpp
|
src/dusk/audio/Adpcm.cpp
|
||||||
src/dusk/audio/DspStub.cpp
|
src/dusk/audio/DspStub.cpp
|
||||||
src/dusk/imgui/ImGuiAudio.cpp)
|
src/dusk/imgui/ImGuiAudio.cpp
|
||||||
|
)
|
||||||
|
set_source_files_properties(
|
||||||
|
${GAME_DEBUG_FILES}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "$<$<CONFIG:Debug>:DEBUG=1>;$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>"
|
||||||
|
)
|
||||||
|
|
||||||
# game_base is for all other game code files
|
# game_base is for all other game code files
|
||||||
add_library(game_base OBJECT ${DOLZEL_FILES} ${Z2AUDIOLIB_FILES} ${JSYSTEM_FILES} ${REL_FILES} ${DUSK_FILES} ${DOLPHIN_FILES})
|
set(GAME_BASE_FILES
|
||||||
|
${DOLZEL_FILES}
|
||||||
|
${Z2AUDIOLIB_FILES}
|
||||||
|
${REL_FILES}
|
||||||
|
${DUSK_FILES}
|
||||||
|
${DOLPHIN_FILES}
|
||||||
|
)
|
||||||
|
set_source_files_properties(
|
||||||
|
${GAME_BASE_FILES}
|
||||||
|
PROPERTIES
|
||||||
|
COMPILE_DEFINITIONS "NDEBUG=1;NDEBUG_DEFINED=1;DEBUG_DEFINED=0;$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>"
|
||||||
|
)
|
||||||
|
|
||||||
target_compile_definitions(game_debug PRIVATE ${GAME_COMPILE_DEFS} $<$<CONFIG:Debug>:DEBUG=1> $<$<CONFIG:Debug>:PARTIAL_DEBUG=1>)
|
foreach(jsystem_lib IN LISTS JSYSTEM_LIBRARIES)
|
||||||
target_compile_definitions(game_base PRIVATE ${GAME_COMPILE_DEFS} NDEBUG=1 NDEBUG_DEFINED=1 DEBUG_DEFINED=0 $<$<CONFIG:Debug>:PARTIAL_DEBUG=1>)
|
target_compile_definitions(${jsystem_lib} PRIVATE
|
||||||
|
${GAME_COMPILE_DEFS}
|
||||||
|
$<$<CONFIG:Debug>:DEBUG=1>
|
||||||
|
$<$<CONFIG:Debug>:PARTIAL_DEBUG=1>
|
||||||
|
)
|
||||||
|
target_include_directories(${jsystem_lib} PRIVATE ${GAME_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(${jsystem_lib} PRIVATE ${GAME_LIBS})
|
||||||
|
set_target_properties(${jsystem_lib} PROPERTIES FOLDER "JSystem")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
# only apply PCH to game_base since not all headers are necessarily validated with DEBUG=1
|
set(JSYSTEM_LINK_LIBRARIES ${JSYSTEM_LIBRARIES})
|
||||||
target_precompile_headers(game_base PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/dusk_pch.hpp>")
|
if (CMAKE_CXX_LINK_GROUP_USING_RESCAN_SUPPORTED OR CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED)
|
||||||
|
# GNU ld resolves static archives in a single left-to-right pass. The split
|
||||||
target_include_directories(game_debug PRIVATE ${GAME_INCLUDE_DIRS})
|
# JSystem libraries reference each other, so they need a RESCAN group there.
|
||||||
target_include_directories(game_base PRIVATE ${GAME_INCLUDE_DIRS})
|
set(JSYSTEM_LINK_LIBRARIES "$<LINK_GROUP:RESCAN,${JSYSTEM_LIBRARIES}>")
|
||||||
|
|
||||||
# This implicitly pulls in the library include directories even though no
|
|
||||||
# linking actually takes place for object libraries
|
|
||||||
target_link_libraries(game_debug PRIVATE ${GAME_LIBS})
|
|
||||||
target_link_libraries(game_base PRIVATE ${GAME_LIBS})
|
|
||||||
|
|
||||||
# Combined game library
|
|
||||||
add_library(game STATIC
|
|
||||||
$<TARGET_OBJECTS:game_base>
|
|
||||||
$<TARGET_OBJECTS:game_debug>)
|
|
||||||
target_link_libraries(game PUBLIC ${GAME_LIBS})
|
|
||||||
|
|
||||||
if(ANDROID)
|
|
||||||
add_library(dusk SHARED src/dusk/main.cpp)
|
|
||||||
set_target_properties(dusk PROPERTIES OUTPUT_NAME main)
|
|
||||||
else ()
|
|
||||||
add_executable(dusk src/dusk/main.cpp)
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_compile_definitions(dusk PRIVATE TARGET_PC AVOID_UB=1 VERSION=0)
|
set(DUSK_FILES src/dusk/main.cpp ${GAME_BASE_FILES} ${GAME_DEBUG_FILES})
|
||||||
target_include_directories(dusk PRIVATE include)
|
if(ANDROID)
|
||||||
target_link_libraries(dusk PRIVATE game aurora::main)
|
add_library(dusk SHARED ${DUSK_FILES})
|
||||||
|
set_target_properties(dusk PROPERTIES OUTPUT_NAME main)
|
||||||
|
else ()
|
||||||
|
add_executable(dusk ${DUSK_FILES})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
target_compile_definitions(dusk PRIVATE ${GAME_COMPILE_DEFS})
|
||||||
|
target_include_directories(dusk PRIVATE ${GAME_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(dusk PRIVATE aurora::main ${GAME_LIBS} ${JSYSTEM_LINK_LIBRARIES})
|
||||||
|
target_precompile_headers(dusk PRIVATE "$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_SOURCE_DIR}/include/dusk_pch.hpp>")
|
||||||
if (TARGET crashpad_handler)
|
if (TARGET crashpad_handler)
|
||||||
add_dependencies(dusk crashpad_handler)
|
add_dependencies(dusk crashpad_handler)
|
||||||
endif ()
|
endif ()
|
||||||
|
|||||||
+4
-1
@@ -358,7 +358,10 @@
|
|||||||
"inherits": [
|
"inherits": [
|
||||||
"relwithdebinfo",
|
"relwithdebinfo",
|
||||||
"ci"
|
"ci"
|
||||||
]
|
],
|
||||||
|
"cacheVariables": {
|
||||||
|
"AURORA_SDL3_PROVIDER": "vendor"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "x-linux-ci-gcc",
|
"name": "x-linux-ci-gcc",
|
||||||
|
|||||||
@@ -1,59 +1,37 @@
|
|||||||

|

|
||||||
|
|
||||||
- ### **[Official Website](https://twilitrealm.dev)**
|
- ### **[Official Website](https://twilitrealm.dev)**
|
||||||
- ### **[Discord](https://discord.gg/QACynxeyna)**
|
- ### **[Discord](https://discord.gg/QACynxeyna)**
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
Dusk is a reverse-engineered reimplementation of Twilight Princess.
|
||||||
|
It aims to be as accurate as possible to the original while also providing new options, enhancements, and tools to customize your experience.
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
**⚠️Dusk does NOT provide any copyrighted assets. You must provide your own copy of the game.**
|
**⚠️ Dusk does NOT provide any copyrighted assets. You must provide your own copy of the game.**
|
||||||
|
|
||||||
### 1. Verify your ROM dump
|
### 1. Verify your ROM dump
|
||||||
First make sure your dump of the game is clean and supported by Dusk. You can do this by checking the sha1 hash of your dump against this list of supported versions.
|
First make sure your dump of the game is clean and supported by Dusk. You can do this by checking the sha1 hash of your dump against this list of supported versions.
|
||||||
|
|
||||||
| Version | sha1 hash |
|
| Version | sha1 hash |
|
||||||
| ------------ | ---------------------------------------- |
|
|--------------| ---------------------------------------- |
|
||||||
| GameCube USA | 75edd3ddff41f125d1b4ce1a40378f1b565519e7 |
|
| GameCube USA | 75edd3ddff41f125d1b4ce1a40378f1b565519e7 |
|
||||||
|
| GameCube PAL | 2601822a488eeb86fb89db16ca8f29c2c953e1ca |
|
||||||
|
|
||||||
### 2. Download [Dusk](https://github.com/TwilitRealm/dusk/releases)
|
### 2. Download [Dusk](https://github.com/TwilitRealm/dusk/releases)
|
||||||
|
|
||||||
### 3. Setup the game
|
### 3. Setup the game
|
||||||
#### Windows
|
|
||||||
- Extract the zip folder
|
- Extract the zip folder
|
||||||
- Place your dump of the game into the same folder where you extracted to
|
- Launch Dusk
|
||||||
- Launch `dusk.exe`
|
- Select Options, then set the ISO Path to your supported game dump
|
||||||
|
- Press Start Game to play!
|
||||||
|
|
||||||
#### macOS
|

|
||||||
- TODO
|
|
||||||
|
|
||||||
#### Linux
|
|
||||||
- TODO
|
|
||||||
|
|
||||||
#### iOS
|
|
||||||
- TODO
|
|
||||||
|
|
||||||
#### android
|
|
||||||
- TODO
|
|
||||||
|
|
||||||
# Building
|
# Building
|
||||||
If you'd like to build Dusk from source, please read the [build instructions](docs/building.md).
|
If you'd like to build Dusk from source, please read the [build instructions](docs/building.md).
|
||||||
|
|
||||||
# Credits
|
Pull Requests are welcomed! Note that we do not accept contributions that are primarily AI generated and will close your PR if we suspect as much.
|
||||||
- Taka
|
|
||||||
- encounter
|
|
||||||
- Antidote
|
|
||||||
- caseif
|
|
||||||
- CraftyBoss
|
|
||||||
- crowell
|
|
||||||
- dooplecks
|
|
||||||
- gymnast86
|
|
||||||
- Irastris
|
|
||||||
- kipcode66
|
|
||||||
- Lars
|
|
||||||
- LunarSoap
|
|
||||||
- Maddie
|
|
||||||
- MelonSpeedruns
|
|
||||||
- Pheenoh
|
|
||||||
- PJB
|
|
||||||
- Roeming
|
|
||||||
- YunataSavior
|
|
||||||
|
|
||||||
Special thanks to the TP Decomp team, the GC/Wii Decomp community, the Aurora developers, and the TP speedrunning community.
|
# Credits
|
||||||
|
Special thanks to the [TP decompilation](https://github.com/zeldaret/tp) team, the GC/Wii decompilation community, the [Aurora](https://github.com/encounter/aurora) developers, the [TP speedrunning community](https://zsrtp.link), and all [contributors](https://github.com/TwilitRealm/dusk/graphs/contributors).
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
@@ -13,13 +13,3 @@ buildType:
|
|||||||
short: RelWithDebInfo
|
short: RelWithDebInfo
|
||||||
long: Optimized, with debug symbols
|
long: Optimized, with debug symbols
|
||||||
buildType: RelWithDebInfo
|
buildType: RelWithDebInfo
|
||||||
|
|
||||||
tp_version:
|
|
||||||
default: GZ2E01
|
|
||||||
description: TP Version
|
|
||||||
choices:
|
|
||||||
GZ2E01:
|
|
||||||
short: GZ2E01
|
|
||||||
long: GZ2E01
|
|
||||||
settings:
|
|
||||||
DUSK_TP_VERSION: GZ2E01
|
|
||||||
|
|||||||
Vendored
+1
-1
Submodule extern/aurora updated: 672f1e8e5e...41d5c9c5a2
+132
-7
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
set(DOLZEL_FILES
|
set(DOLZEL_FILES
|
||||||
src/m_Do/m_Do_main.cpp
|
src/m_Do/m_Do_main.cpp
|
||||||
src/m_Do/m_Do_printf.cpp
|
#src/m_Do/m_Do_printf.cpp
|
||||||
src/m_Do/m_Do_audio.cpp
|
src/m_Do/m_Do_audio.cpp
|
||||||
src/m_Do/m_Do_controller_pad.cpp
|
src/m_Do/m_Do_controller_pad.cpp
|
||||||
#src/m_Do/m_Re_controller_pad.cpp
|
#src/m_Do/m_Re_controller_pad.cpp
|
||||||
@@ -15,7 +15,6 @@ set(DOLZEL_FILES
|
|||||||
src/m_Do/m_Do_DVDError.cpp
|
src/m_Do/m_Do_DVDError.cpp
|
||||||
src/m_Do/m_Do_MemCard.cpp
|
src/m_Do/m_Do_MemCard.cpp
|
||||||
src/m_Do/m_Do_MemCardRWmng.cpp
|
src/m_Do/m_Do_MemCardRWmng.cpp
|
||||||
src/m_Do/m_Do_machine_exception.cpp
|
|
||||||
src/m_Do/m_Do_hostIO.cpp
|
src/m_Do/m_Do_hostIO.cpp
|
||||||
src/c/c_damagereaction.cpp
|
src/c/c_damagereaction.cpp
|
||||||
src/c/c_dylink.cpp
|
src/c/c_dylink.cpp
|
||||||
@@ -315,7 +314,7 @@ set(SSYSTEM_FILES
|
|||||||
src/SSystem/SStandard/s_basic.cpp
|
src/SSystem/SStandard/s_basic.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(JSYSTEM_DEBUG_FILES
|
add_library(JSystem_JParticle STATIC
|
||||||
libs/JSystem/src/JParticle/JPAResourceManager.cpp
|
libs/JSystem/src/JParticle/JPAResourceManager.cpp
|
||||||
libs/JSystem/src/JParticle/JPAResource.cpp
|
libs/JSystem/src/JParticle/JPAResource.cpp
|
||||||
libs/JSystem/src/JParticle/JPABaseShape.cpp
|
libs/JSystem/src/JParticle/JPABaseShape.cpp
|
||||||
@@ -331,10 +330,19 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JParticle/JPAEmitter.cpp
|
libs/JSystem/src/JParticle/JPAEmitter.cpp
|
||||||
libs/JSystem/src/JParticle/JPAParticle.cpp
|
libs/JSystem/src/JParticle/JPAParticle.cpp
|
||||||
libs/JSystem/src/JParticle/JPAMath.cpp
|
libs/JSystem/src/JParticle/JPAMath.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JFramework STATIC
|
||||||
libs/JSystem/src/JFramework/JFWSystem.cpp
|
libs/JSystem/src/JFramework/JFWSystem.cpp
|
||||||
libs/JSystem/src/JFramework/JFWDisplay.cpp
|
libs/JSystem/src/JFramework/JFWDisplay.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_J3DU STATIC
|
||||||
libs/JSystem/src/J3DU/J3DUClipper.cpp
|
libs/JSystem/src/J3DU/J3DUClipper.cpp
|
||||||
libs/JSystem/src/J3DU/J3DUDL.cpp
|
libs/JSystem/src/J3DU/J3DUDL.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JKernel STATIC
|
||||||
libs/JSystem/src/JKernel/JKRHeap.cpp
|
libs/JSystem/src/JKernel/JKRHeap.cpp
|
||||||
libs/JSystem/src/JKernel/JKRExpHeap.cpp
|
libs/JSystem/src/JKernel/JKRExpHeap.cpp
|
||||||
libs/JSystem/src/JKernel/JKRSolidHeap.cpp
|
libs/JSystem/src/JKernel/JKRSolidHeap.cpp
|
||||||
@@ -360,14 +368,23 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JKernel/JKRDvdRipper.cpp
|
libs/JSystem/src/JKernel/JKRDvdRipper.cpp
|
||||||
libs/JSystem/src/JKernel/JKRDvdAramRipper.cpp
|
libs/JSystem/src/JKernel/JKRDvdAramRipper.cpp
|
||||||
libs/JSystem/src/JKernel/JKRDecomp.cpp
|
libs/JSystem/src/JKernel/JKRDecomp.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JMath STATIC
|
||||||
libs/JSystem/src/JMath/JMath.cpp
|
libs/JSystem/src/JMath/JMath.cpp
|
||||||
libs/JSystem/src/JMath/random.cpp
|
libs/JSystem/src/JMath/random.cpp
|
||||||
libs/JSystem/src/JMath/JMATrigonometric.cpp
|
libs/JSystem/src/JMath/JMATrigonometric.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JSupport STATIC
|
||||||
libs/JSystem/src/JSupport/JSUList.cpp
|
libs/JSystem/src/JSupport/JSUList.cpp
|
||||||
libs/JSystem/src/JSupport/JSUInputStream.cpp
|
libs/JSystem/src/JSupport/JSUInputStream.cpp
|
||||||
libs/JSystem/src/JSupport/JSUOutputStream.cpp
|
libs/JSystem/src/JSupport/JSUOutputStream.cpp
|
||||||
libs/JSystem/src/JSupport/JSUMemoryStream.cpp
|
libs/JSystem/src/JSupport/JSUMemoryStream.cpp
|
||||||
libs/JSystem/src/JSupport/JSUFileStream.cpp
|
libs/JSystem/src/JSupport/JSUFileStream.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JUtility STATIC
|
||||||
libs/JSystem/src/JUtility/JUTCacheFont.cpp
|
libs/JSystem/src/JUtility/JUTCacheFont.cpp
|
||||||
libs/JSystem/src/JUtility/JUTResource.cpp
|
libs/JSystem/src/JUtility/JUTResource.cpp
|
||||||
libs/JSystem/src/JUtility/JUTTexture.cpp
|
libs/JSystem/src/JUtility/JUTTexture.cpp
|
||||||
@@ -388,6 +405,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JUtility/JUTConsole.cpp
|
libs/JSystem/src/JUtility/JUTConsole.cpp
|
||||||
libs/JSystem/src/JUtility/JUTDirectFile.cpp
|
libs/JSystem/src/JUtility/JUTDirectFile.cpp
|
||||||
libs/JSystem/src/JUtility/JUTFontData_Ascfont_fix12.cpp
|
libs/JSystem/src/JUtility/JUTFontData_Ascfont_fix12.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JStage STATIC
|
||||||
libs/JSystem/src/JStage/JSGActor.cpp
|
libs/JSystem/src/JStage/JSGActor.cpp
|
||||||
libs/JSystem/src/JStage/JSGAmbientLight.cpp
|
libs/JSystem/src/JStage/JSGAmbientLight.cpp
|
||||||
libs/JSystem/src/JStage/JSGCamera.cpp
|
libs/JSystem/src/JStage/JSGCamera.cpp
|
||||||
@@ -395,6 +415,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JStage/JSGLight.cpp
|
libs/JSystem/src/JStage/JSGLight.cpp
|
||||||
libs/JSystem/src/JStage/JSGObject.cpp
|
libs/JSystem/src/JStage/JSGObject.cpp
|
||||||
libs/JSystem/src/JStage/JSGSystem.cpp
|
libs/JSystem/src/JStage/JSGSystem.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_J2DGraph STATIC
|
||||||
libs/JSystem/src/J2DGraph/J2DGrafContext.cpp
|
libs/JSystem/src/J2DGraph/J2DGrafContext.cpp
|
||||||
libs/JSystem/src/J2DGraph/J2DOrthoGraph.cpp
|
libs/JSystem/src/J2DGraph/J2DOrthoGraph.cpp
|
||||||
libs/JSystem/src/J2DGraph/J2DTevs.cpp
|
libs/JSystem/src/J2DGraph/J2DTevs.cpp
|
||||||
@@ -413,6 +436,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/J2DGraph/J2DAnmLoader.cpp
|
libs/JSystem/src/J2DGraph/J2DAnmLoader.cpp
|
||||||
libs/JSystem/src/J2DGraph/J2DAnimation.cpp
|
libs/JSystem/src/J2DGraph/J2DAnimation.cpp
|
||||||
libs/JSystem/src/J2DGraph/J2DManage.cpp
|
libs/JSystem/src/J2DGraph/J2DManage.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_J3DGraphBase STATIC
|
||||||
libs/JSystem/src/J3DGraphBase/J3DGD.cpp
|
libs/JSystem/src/J3DGraphBase/J3DGD.cpp
|
||||||
libs/JSystem/src/J3DGraphBase/J3DSys.cpp
|
libs/JSystem/src/J3DGraphBase/J3DSys.cpp
|
||||||
libs/JSystem/src/J3DGraphBase/J3DVertex.cpp
|
libs/JSystem/src/J3DGraphBase/J3DVertex.cpp
|
||||||
@@ -427,6 +453,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/J3DGraphBase/J3DTevs.cpp
|
libs/JSystem/src/J3DGraphBase/J3DTevs.cpp
|
||||||
libs/JSystem/src/J3DGraphBase/J3DDrawBuffer.cpp
|
libs/JSystem/src/J3DGraphBase/J3DDrawBuffer.cpp
|
||||||
libs/JSystem/src/J3DGraphBase/J3DStruct.cpp
|
libs/JSystem/src/J3DGraphBase/J3DStruct.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_J3DGraphAnimator STATIC
|
||||||
libs/JSystem/src/J3DGraphAnimator/J3DShapeTable.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DShapeTable.cpp
|
||||||
libs/JSystem/src/J3DGraphAnimator/J3DJointTree.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DJointTree.cpp
|
||||||
libs/JSystem/src/J3DGraphAnimator/J3DModelData.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DModelData.cpp
|
||||||
@@ -438,6 +467,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/J3DGraphAnimator/J3DCluster.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DCluster.cpp
|
||||||
libs/JSystem/src/J3DGraphAnimator/J3DJoint.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DJoint.cpp
|
||||||
libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp
|
libs/JSystem/src/J3DGraphAnimator/J3DMaterialAttach.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_J3DGraphLoader STATIC
|
||||||
libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory.cpp
|
||||||
libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory_v21.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DMaterialFactory_v21.cpp
|
||||||
libs/JSystem/src/J3DGraphLoader/J3DClusterLoader.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DClusterLoader.cpp
|
||||||
@@ -446,6 +478,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/J3DGraphLoader/J3DJointFactory.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DJointFactory.cpp
|
||||||
libs/JSystem/src/J3DGraphLoader/J3DShapeFactory.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DShapeFactory.cpp
|
||||||
libs/JSystem/src/J3DGraphLoader/J3DAnmLoader.cpp
|
libs/JSystem/src/J3DGraphLoader/J3DAnmLoader.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JStudio STATIC
|
||||||
libs/JSystem/src/JStudio/JStudio/ctb.cpp
|
libs/JSystem/src/JStudio/JStudio/ctb.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio/ctb-data.cpp
|
libs/JSystem/src/JStudio/JStudio/ctb-data.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio/functionvalue.cpp
|
libs/JSystem/src/JStudio/JStudio/functionvalue.cpp
|
||||||
@@ -460,6 +495,9 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JStudio/JStudio/stb.cpp
|
libs/JSystem/src/JStudio/JStudio/stb.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio/stb-data-parse.cpp
|
libs/JSystem/src/JStudio/JStudio/stb-data-parse.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio/stb-data.cpp
|
libs/JSystem/src/JStudio/JStudio/stb-data.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JStudio_JStage STATIC
|
||||||
libs/JSystem/src/JStudio/JStudio_JStage/control.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/control.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JStage/object.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/object.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JStage/object-actor.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/object-actor.cpp
|
||||||
@@ -467,10 +505,19 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JStudio/JStudio_JStage/object-camera.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/object-camera.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JStage/object-fog.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/object-fog.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JStage/object-light.cpp
|
libs/JSystem/src/JStudio/JStudio_JStage/object-light.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JStudio_JAudio2 STATIC
|
||||||
libs/JSystem/src/JStudio/JStudio_JAudio2/control.cpp
|
libs/JSystem/src/JStudio/JStudio_JAudio2/control.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JAudio2/object-sound.cpp
|
libs/JSystem/src/JStudio/JStudio_JAudio2/object-sound.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JStudio_JParticle STATIC
|
||||||
libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp
|
libs/JSystem/src/JStudio/JStudio_JParticle/control.cpp
|
||||||
libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp
|
libs/JSystem/src/JStudio/JStudio_JParticle/object-particle.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JAudio2 STATIC
|
||||||
libs/JSystem/src/JAudio2/JASCalc.cpp
|
libs/JSystem/src/JAudio2/JASCalc.cpp
|
||||||
libs/JSystem/src/JAudio2/JASTaskThread.cpp
|
libs/JSystem/src/JAudio2/JASTaskThread.cpp
|
||||||
libs/JSystem/src/JAudio2/JASDvdThread.cpp
|
libs/JSystem/src/JAudio2/JASDvdThread.cpp
|
||||||
@@ -535,22 +582,34 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JAudio2/JAUSoundAnimator.cpp
|
libs/JSystem/src/JAudio2/JAUSoundAnimator.cpp
|
||||||
libs/JSystem/src/JAudio2/JAUSoundTable.cpp
|
libs/JSystem/src/JAudio2/JAUSoundTable.cpp
|
||||||
libs/JSystem/src/JAudio2/JAUStreamFileTable.cpp
|
libs/JSystem/src/JAudio2/JAUStreamFileTable.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JMessage STATIC
|
||||||
libs/JSystem/src/JMessage/control.cpp
|
libs/JSystem/src/JMessage/control.cpp
|
||||||
libs/JSystem/src/JMessage/data.cpp
|
libs/JSystem/src/JMessage/data.cpp
|
||||||
libs/JSystem/src/JMessage/processor.cpp
|
libs/JSystem/src/JMessage/processor.cpp
|
||||||
libs/JSystem/src/JMessage/resource.cpp
|
libs/JSystem/src/JMessage/resource.cpp
|
||||||
libs/JSystem/src/JMessage/locale.cpp
|
libs/JSystem/src/JMessage/locale.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JGadget STATIC
|
||||||
libs/JSystem/src/JGadget/binary.cpp
|
libs/JSystem/src/JGadget/binary.cpp
|
||||||
libs/JSystem/src/JGadget/define.cpp
|
libs/JSystem/src/JGadget/define.cpp
|
||||||
libs/JSystem/src/JGadget/linklist.cpp
|
libs/JSystem/src/JGadget/linklist.cpp
|
||||||
libs/JSystem/src/JGadget/search.cpp
|
libs/JSystem/src/JGadget/search.cpp
|
||||||
libs/JSystem/src/JGadget/std-vector.cpp
|
libs/JSystem/src/JGadget/std-vector.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JAHostIO STATIC
|
||||||
libs/JSystem/src/JAHostIO/JAHFrameNode.cpp
|
libs/JSystem/src/JAHostIO/JAHFrameNode.cpp
|
||||||
libs/JSystem/src/JAHostIO/JAHioMessage.cpp
|
libs/JSystem/src/JAHostIO/JAHioMessage.cpp
|
||||||
libs/JSystem/src/JAHostIO/JAHioMgr.cpp
|
libs/JSystem/src/JAHostIO/JAHioMgr.cpp
|
||||||
libs/JSystem/src/JAHostIO/JAHioNode.cpp
|
libs/JSystem/src/JAHostIO/JAHioNode.cpp
|
||||||
libs/JSystem/src/JAHostIO/JAHioUtil.cpp
|
libs/JSystem/src/JAHostIO/JAHioUtil.cpp
|
||||||
libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp
|
libs/JSystem/src/JAHostIO/JAHVirtualNode.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(JSystem_JHostIO STATIC
|
||||||
libs/JSystem/src/JHostIO/JORFile.cpp
|
libs/JSystem/src/JHostIO/JORFile.cpp
|
||||||
libs/JSystem/src/JHostIO/JORHostInfo.cpp
|
libs/JSystem/src/JHostIO/JORHostInfo.cpp
|
||||||
libs/JSystem/src/JHostIO/JORMessageBox.cpp
|
libs/JSystem/src/JHostIO/JORMessageBox.cpp
|
||||||
@@ -560,7 +619,28 @@ set(JSYSTEM_DEBUG_FILES
|
|||||||
libs/JSystem/src/JHostIO/JHIMccBuf.cpp
|
libs/JSystem/src/JHostIO/JHIMccBuf.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(JSYSTEM_FILES
|
set(JSYSTEM_LIBRARIES
|
||||||
|
JSystem_JParticle
|
||||||
|
JSystem_JFramework
|
||||||
|
JSystem_J3DU
|
||||||
|
JSystem_JKernel
|
||||||
|
JSystem_JMath
|
||||||
|
JSystem_JSupport
|
||||||
|
JSystem_JUtility
|
||||||
|
JSystem_JStage
|
||||||
|
JSystem_J2DGraph
|
||||||
|
JSystem_J3DGraphBase
|
||||||
|
JSystem_J3DGraphAnimator
|
||||||
|
JSystem_J3DGraphLoader
|
||||||
|
JSystem_JStudio
|
||||||
|
JSystem_JStudio_JStage
|
||||||
|
JSystem_JStudio_JAudio2
|
||||||
|
JSystem_JStudio_JParticle
|
||||||
|
JSystem_JAudio2
|
||||||
|
JSystem_JMessage
|
||||||
|
JSystem_JGadget
|
||||||
|
JSystem_JAHostIO
|
||||||
|
JSystem_JHostIO
|
||||||
)
|
)
|
||||||
|
|
||||||
set(REL_FILES
|
set(REL_FILES
|
||||||
@@ -1342,13 +1422,14 @@ set(DUSK_FILES
|
|||||||
src/dusk/crash_reporting.cpp
|
src/dusk/crash_reporting.cpp
|
||||||
src/dusk/endian.cpp
|
src/dusk/endian.cpp
|
||||||
src/dusk/extras.c
|
src/dusk/extras.c
|
||||||
src/dusk/extras.cpp
|
|
||||||
src/dusk/file_select.cpp
|
src/dusk/file_select.cpp
|
||||||
src/dusk/file_select.hpp
|
src/dusk/file_select.hpp
|
||||||
src/dusk/frame_interpolation.cpp
|
src/dusk/frame_interpolation.cpp
|
||||||
src/dusk/game_clock.cpp
|
src/dusk/game_clock.cpp
|
||||||
src/dusk/globals.cpp
|
src/dusk/globals.cpp
|
||||||
src/dusk/gyro.cpp
|
src/dusk/gyro.cpp
|
||||||
|
src/dusk/gamepad_color.cpp
|
||||||
|
src/dusk/autosave.cpp
|
||||||
src/dusk/io.cpp
|
src/dusk/io.cpp
|
||||||
src/dusk/layout.cpp
|
src/dusk/layout.cpp
|
||||||
src/dusk/logging.cpp
|
src/dusk/logging.cpp
|
||||||
@@ -1366,8 +1447,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiBloomWindow.hpp
|
src/dusk/imgui/ImGuiBloomWindow.hpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.cpp
|
src/dusk/imgui/ImGuiMenuTools.cpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.hpp
|
src/dusk/imgui/ImGuiMenuTools.hpp
|
||||||
src/dusk/imgui/ImGuiMenuEnhancements.cpp
|
|
||||||
src/dusk/imgui/ImGuiMenuEnhancements.hpp
|
|
||||||
src/dusk/imgui/ImGuiPreLaunchWindow.cpp
|
src/dusk/imgui/ImGuiPreLaunchWindow.cpp
|
||||||
src/dusk/imgui/ImGuiPreLaunchWindow.hpp
|
src/dusk/imgui/ImGuiPreLaunchWindow.hpp
|
||||||
src/dusk/imgui/ImGuiFirstRunPreset.hpp
|
src/dusk/imgui/ImGuiFirstRunPreset.hpp
|
||||||
@@ -1382,9 +1461,55 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiSaveEditor.cpp
|
src/dusk/imgui/ImGuiSaveEditor.cpp
|
||||||
src/dusk/imgui/ImGuiStateShare.hpp
|
src/dusk/imgui/ImGuiStateShare.hpp
|
||||||
src/dusk/imgui/ImGuiStateShare.cpp
|
src/dusk/imgui/ImGuiStateShare.cpp
|
||||||
|
src/dusk/imgui/ImGuiAchievements.hpp
|
||||||
|
src/dusk/imgui/ImGuiAchievements.cpp
|
||||||
|
src/dusk/ui/bool_button.cpp
|
||||||
|
src/dusk/ui/bool_button.hpp
|
||||||
|
src/dusk/ui/button.cpp
|
||||||
|
src/dusk/ui/button.hpp
|
||||||
|
src/dusk/ui/component.cpp
|
||||||
|
src/dusk/ui/component.hpp
|
||||||
|
src/dusk/ui/document.cpp
|
||||||
|
src/dusk/ui/document.hpp
|
||||||
|
src/dusk/ui/editor.cpp
|
||||||
|
src/dusk/ui/editor.hpp
|
||||||
|
src/dusk/ui/event.cpp
|
||||||
|
src/dusk/ui/event.hpp
|
||||||
|
src/dusk/ui/input.cpp
|
||||||
|
src/dusk/ui/input.hpp
|
||||||
|
src/dusk/ui/nav_types.hpp
|
||||||
|
src/dusk/ui/number_button.cpp
|
||||||
|
src/dusk/ui/number_button.hpp
|
||||||
|
src/dusk/ui/overlay.cpp
|
||||||
|
src/dusk/ui/overlay.hpp
|
||||||
|
src/dusk/ui/pane.cpp
|
||||||
|
src/dusk/ui/pane.hpp
|
||||||
|
src/dusk/ui/popup.cpp
|
||||||
|
src/dusk/ui/popup.hpp
|
||||||
|
src/dusk/ui/prelaunch.cpp
|
||||||
|
src/dusk/ui/prelaunch.hpp
|
||||||
|
src/dusk/ui/prelaunch_options.cpp
|
||||||
|
src/dusk/ui/prelaunch_options.hpp
|
||||||
|
src/dusk/ui/select_button.cpp
|
||||||
|
src/dusk/ui/select_button.hpp
|
||||||
|
src/dusk/ui/settings.cpp
|
||||||
|
src/dusk/ui/settings.hpp
|
||||||
|
src/dusk/ui/string_button.cpp
|
||||||
|
src/dusk/ui/string_button.hpp
|
||||||
|
src/dusk/ui/tab_bar.cpp
|
||||||
|
src/dusk/ui/tab_bar.hpp
|
||||||
|
src/dusk/ui/ui.cpp
|
||||||
|
src/dusk/ui/ui.hpp
|
||||||
|
src/dusk/ui/window.cpp
|
||||||
|
src/dusk/ui/window.hpp
|
||||||
|
src/dusk/achievements.cpp
|
||||||
src/dusk/iso_validate.cpp
|
src/dusk/iso_validate.cpp
|
||||||
|
src/dusk/livesplit.cpp
|
||||||
src/dusk/offset_ptr.cpp
|
src/dusk/offset_ptr.cpp
|
||||||
src/dusk/OSContext.cpp
|
src/dusk/OSContext.cpp
|
||||||
|
src/dusk/OSReport.cpp
|
||||||
src/dusk/OSThread.cpp
|
src/dusk/OSThread.cpp
|
||||||
src/dusk/OSMutex.cpp
|
src/dusk/OSMutex.cpp
|
||||||
|
src/dusk/discord_presence.cpp
|
||||||
|
src/dusk/version.cpp
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -188,6 +188,15 @@ public:
|
|||||||
/* 0x273C */ f32 mKankyoBlend;
|
/* 0x273C */ f32 mKankyoBlend;
|
||||||
/* 0x2740 */ u8 field_0x2740;
|
/* 0x2740 */ u8 field_0x2740;
|
||||||
/* 0x2744 */ dMsgFlow_c mMsgFlow;
|
/* 0x2744 */ dMsgFlow_c mMsgFlow;
|
||||||
|
#if TARGET_PC
|
||||||
|
cXyz mReinsInterpPrev[2][16];
|
||||||
|
cXyz mReinsInterpCurr[2][16];
|
||||||
|
cXyz mReinsTexInterpPrev[2];
|
||||||
|
cXyz mReinsTexInterpCurr[2];
|
||||||
|
bool mReinsInterpPrevValid;
|
||||||
|
bool mReinsInterpCurrValid;
|
||||||
|
s8 mDemoCamSyncTicks;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC_ASSERT(sizeof(b_gnd_class) == 0x2790);
|
STATIC_ASSERT(sizeof(b_gnd_class) == 0x2790);
|
||||||
|
|||||||
@@ -44,6 +44,12 @@ public:
|
|||||||
/* 0x88C */ u8 field_0x88C[0x8C8 - 0x88C];
|
/* 0x88C */ u8 field_0x88C[0x8C8 - 0x88C];
|
||||||
/* 0x8C8 */ s8 field_0x8c8;
|
/* 0x8C8 */ s8 field_0x8c8;
|
||||||
/* 0x8C9 */ u8 mInitHIO;
|
/* 0x8C9 */ u8 mInitHIO;
|
||||||
|
#if TARGET_PC
|
||||||
|
cXyz mRopeInterpPrev[16];
|
||||||
|
cXyz mRopeInterpCurr[16];
|
||||||
|
bool mRopeInterpPrevValid;
|
||||||
|
bool mRopeInterpCurrValid;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC_ASSERT(sizeof(e_mb_class) == 0x8cc);
|
STATIC_ASSERT(sizeof(e_mb_class) == 0x8cc);
|
||||||
|
|||||||
@@ -220,6 +220,15 @@ public:
|
|||||||
/* 0x17E2 */ s16 wait_roll_angle; ///< @brief Roll angle during wait state.
|
/* 0x17E2 */ s16 wait_roll_angle; ///< @brief Roll angle during wait state.
|
||||||
/* 0x17E4 */ u8 field_0x17e4[0x17e8 - 0x17e4];
|
/* 0x17E4 */ u8 field_0x17e4[0x17e8 - 0x17e4];
|
||||||
/* 0x17E8 */ f32 ride_speed_max; ///< @brief Speed rate for riding calculations.
|
/* 0x17E8 */ f32 ride_speed_max; ///< @brief Speed rate for riding calculations.
|
||||||
|
#if TARGET_PC
|
||||||
|
cXyz himo_mat_interp_prev[2][16];
|
||||||
|
cXyz himo_mat_interp_curr[2][16];
|
||||||
|
cXyz himo_tex_interp_prev[2];
|
||||||
|
cXyz himo_tex_interp_curr[2];
|
||||||
|
bool himo_interp_prev_valid;
|
||||||
|
bool himo_interp_curr_valid;
|
||||||
|
s8 demo_cam_sync_ticks;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC_ASSERT(sizeof(e_wb_class) == 0x17EC);
|
STATIC_ASSERT(sizeof(e_wb_class) == 0x17EC);
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ public:
|
|||||||
/* 0x164 */ cXyz mMinVal;
|
/* 0x164 */ cXyz mMinVal;
|
||||||
/* 0x170 */ cXyz mMaxVal;
|
/* 0x170 */ cXyz mMaxVal;
|
||||||
/* 0x17C */ cXyz mViewScale;
|
/* 0x17C */ cXyz mViewScale;
|
||||||
|
#if TARGET_PC
|
||||||
|
bool mbReset = false;
|
||||||
|
bool mbHadEntry = false;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -94,6 +94,12 @@ static void __THPAudioInitialize(THPAudioDecodeInfo* info, u8* ptr);
|
|||||||
#define THP_TEXTURE_SET_COUNT 3
|
#define THP_TEXTURE_SET_COUNT 3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
namespace dusk {
|
||||||
|
void MoviePlayerShutdown();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct daMP_THPPlayer {
|
struct daMP_THPPlayer {
|
||||||
/* 0x000 */ DVDFileInfo fileInfo;
|
/* 0x000 */ DVDFileInfo fileInfo;
|
||||||
/* 0x03C */ THPHeader header;
|
/* 0x03C */ THPHeader header;
|
||||||
|
|||||||
@@ -58,6 +58,9 @@ public:
|
|||||||
void setNextPoint();
|
void setNextPoint();
|
||||||
int Draw();
|
int Draw();
|
||||||
int Delete();
|
int Delete();
|
||||||
|
#if TARGET_PC
|
||||||
|
friend void daL8Lift_interp_callback(bool isSimFrame, void* pUserWork);
|
||||||
|
#endif
|
||||||
|
|
||||||
u8 getPthID() { return fopAcM_GetParamBit(this, 0, 8); }
|
u8 getPthID() { return fopAcM_GetParamBit(this, 0, 8); }
|
||||||
u8 getMoveSpeed() { return fopAcM_GetParamBit(this, 8, 4); }
|
u8 getMoveSpeed() { return fopAcM_GetParamBit(this, 8, 4); }
|
||||||
|
|||||||
@@ -68,10 +68,8 @@ public:
|
|||||||
/* 0x904 */ cXyz field_0x904[2];
|
/* 0x904 */ cXyz field_0x904[2];
|
||||||
/* 0x91C */ int field_0x91c;
|
/* 0x91C */ int field_0x91c;
|
||||||
/* 0x920 */ cXyz field_0x920[63];
|
/* 0x920 */ cXyz field_0x920[63];
|
||||||
/* 0xC14 */ f32 field_0xc14[4];
|
/* 0xC14 */ f32 field_0xc14[63];
|
||||||
/* 0xC24 */ u8 field_0xc24[0xd10 - 0xc24];
|
/* 0xD10 */ s8 field_0xd10[64];
|
||||||
/* 0xD10 */ s8 field_0xd10[4];
|
|
||||||
/* 0xD14 */ u8 field_0xd14[0xd50 - 0xd14];
|
|
||||||
/* 0xD50 */ mDoExt_3DlineMat1_c field_0xd50;
|
/* 0xD50 */ mDoExt_3DlineMat1_c field_0xd50;
|
||||||
/* 0xD8C */ int field_0xd8c;
|
/* 0xD8C */ int field_0xd8c;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -143,6 +143,12 @@ public:
|
|||||||
/* 0x20 */ JORFile mFile;
|
/* 0x20 */ JORFile mFile;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
/* 0x24 */ u8 mManualMode;
|
||||||
|
/* 0x25 */ f32 freeXAngle;
|
||||||
|
/* 0x29 */ f32 freeYAngle;
|
||||||
|
#endif
|
||||||
|
|
||||||
u32 Id(s32 i_style) { return mCamStyleData[i_style].field_0x0; }
|
u32 Id(s32 i_style) { return mCamStyleData[i_style].field_0x0; }
|
||||||
int Algorythmn(s32 i_style) { return mCamStyleData[i_style].field_0x4; }
|
int Algorythmn(s32 i_style) { return mCamStyleData[i_style].field_0x4; }
|
||||||
int Algorythmn() { return mCurrentStyle->field_0x4; }
|
int Algorythmn() { return mCurrentStyle->field_0x4; }
|
||||||
|
|||||||
@@ -273,6 +273,8 @@ public:
|
|||||||
/* 0xA4 */ f32 field_0xa4;
|
/* 0xA4 */ f32 field_0xa4;
|
||||||
/* 0xA8 */ int field_0xa8;
|
/* 0xA8 */ int field_0xa8;
|
||||||
/* 0xAC */ f32 field_0xac;
|
/* 0xAC */ f32 field_0xac;
|
||||||
|
f32 xAngle;
|
||||||
|
f32 yAngle;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LockOnData {
|
struct LockOnData {
|
||||||
@@ -1024,6 +1026,9 @@ public:
|
|||||||
bool colosseumCamera(s32);
|
bool colosseumCamera(s32);
|
||||||
bool test1Camera(s32);
|
bool test1Camera(s32);
|
||||||
bool test2Camera(s32);
|
bool test2Camera(s32);
|
||||||
|
#if TARGET_PC
|
||||||
|
bool freeCamera();
|
||||||
|
#endif
|
||||||
bool towerCamera(s32);
|
bool towerCamera(s32);
|
||||||
bool hookshotCamera(s32);
|
bool hookshotCamera(s32);
|
||||||
bool railCamera(s32);
|
bool railCamera(s32);
|
||||||
|
|||||||
@@ -4834,8 +4834,7 @@ inline void dComIfGd_drawXluListDark() {
|
|||||||
inline void dComIfGd_drawXluListInvisible() {
|
inline void dComIfGd_drawXluListInvisible() {
|
||||||
ZoneScoped;
|
ZoneScoped;
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
if (dusk::getSettings().game.enableWaterRefraction &&
|
if (!dusk::getSettings().game.disableWaterRefraction) {
|
||||||
!dusk::getSettings().game.enableFrameInterpolation) {
|
|
||||||
#endif
|
#endif
|
||||||
g_dComIfG_gameInfo.drawlist.drawXluListInvisible();
|
g_dComIfG_gameInfo.drawlist.drawXluListInvisible();
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
@@ -4846,8 +4845,7 @@ inline void dComIfGd_drawXluListInvisible() {
|
|||||||
inline void dComIfGd_drawOpaListInvisible() {
|
inline void dComIfGd_drawOpaListInvisible() {
|
||||||
ZoneScoped;
|
ZoneScoped;
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
if (dusk::getSettings().game.enableWaterRefraction &&
|
if (!dusk::getSettings().game.disableWaterRefraction) {
|
||||||
!dusk::getSettings().game.enableFrameInterpolation) {
|
|
||||||
#endif
|
#endif
|
||||||
g_dComIfG_gameInfo.drawlist.drawOpaListInvisible();
|
g_dComIfG_gameInfo.drawlist.drawOpaListInvisible();
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
|
|||||||
@@ -209,6 +209,10 @@ public:
|
|||||||
/* 0x04 */ TGXTexObj* mpTexObj;
|
/* 0x04 */ TGXTexObj* mpTexObj;
|
||||||
/* 0x08 */ Mtx mVolumeMtx;
|
/* 0x08 */ Mtx mVolumeMtx;
|
||||||
/* 0x38 */ Mtx mMtx;
|
/* 0x38 */ Mtx mMtx;
|
||||||
|
#if TARGET_PC
|
||||||
|
const void* mVolumeMtxKey;
|
||||||
|
const void* mMtxKey;
|
||||||
|
#endif
|
||||||
}; // Size: 0x68
|
}; // Size: 0x68
|
||||||
|
|
||||||
struct cBgD_Vtx_t;
|
struct cBgD_Vtx_t;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "JSystem/J3DGraphLoader/J3DAnmLoader.h"
|
#include "JSystem/J3DGraphLoader/J3DAnmLoader.h"
|
||||||
|
|
||||||
class dFile_info_c;
|
class dFile_info_c;
|
||||||
|
class J2DPicture;
|
||||||
|
|
||||||
class dDlst_FileSel_c : public dDlst_base_c {
|
class dDlst_FileSel_c : public dDlst_base_c {
|
||||||
public:
|
public:
|
||||||
@@ -113,6 +114,14 @@ public:
|
|||||||
/* 0x04 */ J2DScreen* Scr3m;
|
/* 0x04 */ J2DScreen* Scr3m;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class dDlst_FileSelFade_c : public dDlst_base_c {
|
||||||
|
public:
|
||||||
|
void draw();
|
||||||
|
virtual ~dDlst_FileSelFade_c() {}
|
||||||
|
|
||||||
|
/* 0x04 */ J2DPicture* mpPict;
|
||||||
|
};
|
||||||
|
|
||||||
class dFs_HIO_c : public JORReflexible {
|
class dFs_HIO_c : public JORReflexible {
|
||||||
public:
|
public:
|
||||||
dFs_HIO_c();
|
dFs_HIO_c();
|
||||||
@@ -676,6 +685,9 @@ public:
|
|||||||
#if PLATFORM_GCN
|
#if PLATFORM_GCN
|
||||||
/* 0x2378 */ J2DPicture* mpFadePict;
|
/* 0x2378 */ J2DPicture* mpFadePict;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
dDlst_FileSelFade_c mFadeDlst;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if PLATFORM_WII || PLATFORM_SHIELD
|
#if PLATFORM_WII || PLATFORM_SHIELD
|
||||||
/* 0x2376 */ u8 field_0x2376[SAVEFILE_SIZE];
|
/* 0x2376 */ u8 field_0x2376[SAVEFILE_SIZE];
|
||||||
@@ -684,6 +696,10 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C + sizeof(dDlst_FileSelFade_c));
|
||||||
|
#else
|
||||||
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C);
|
STATIC_ASSERT(sizeof(dFile_select_c) == 0x237C);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* D_FILE_D_FILE_SELECT_H */
|
#endif /* D_FILE_D_FILE_SELECT_H */
|
||||||
|
|||||||
@@ -91,6 +91,10 @@ public:
|
|||||||
void calcCursor();
|
void calcCursor();
|
||||||
void drawCursor();
|
void drawCursor();
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void dMapBgWide();
|
||||||
|
#endif
|
||||||
|
|
||||||
void setDPDFloorSelCurPos(s8 i_pos) { field_0xdd6 = i_pos; }
|
void setDPDFloorSelCurPos(s8 i_pos) { field_0xdd6 = i_pos; }
|
||||||
|
|
||||||
f32 getMapWidth() { return mMapWidth; }
|
f32 getMapWidth() { return mMapWidth; }
|
||||||
@@ -103,6 +107,10 @@ public:
|
|||||||
field_0xd98 = param_1;
|
field_0xd98 = param_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void resetScrollArrowMask() { field_0xdda = 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 0xC98 */ JKRExpHeap* mpHeap;
|
/* 0xC98 */ JKRExpHeap* mpHeap;
|
||||||
/* 0xC9C */ JKRExpHeap* mpTalkHeap;
|
/* 0xC9C */ JKRExpHeap* mpTalkHeap;
|
||||||
/* 0xCA0 */ STControl* mpStick;
|
/* 0xCA0 */ STControl* mpStick;
|
||||||
|
|||||||
@@ -75,7 +75,9 @@ public:
|
|||||||
/* 0x8 */ BE(u16) mAreaName;
|
/* 0x8 */ BE(u16) mAreaName;
|
||||||
/* 0xA */ u8 mCount;
|
/* 0xA */ u8 mCount;
|
||||||
#ifdef _MSVC_LANG
|
#ifdef _MSVC_LANG
|
||||||
u8* __get_mRoomNos() const { return (u8*)(this + 1); }
|
// Room numbers start at offset 0xB (right after mCount), NOT at sizeof(data)=12.
|
||||||
|
// (u8*)(this+1) would give offset 12 because MSVC sizeof=12; use &mCount+1 instead.
|
||||||
|
u8* __get_mRoomNos() const { return (u8*)&mCount + 1; }
|
||||||
__declspec(property(get = __get_mRoomNos)) u8* mRoomNos;
|
__declspec(property(get = __get_mRoomNos)) u8* mRoomNos;
|
||||||
#else
|
#else
|
||||||
/* 0xB */ u8 mRoomNos[0];
|
/* 0xB */ u8 mRoomNos[0];
|
||||||
|
|||||||
@@ -81,6 +81,10 @@ public:
|
|||||||
void calcDrawPriority();
|
void calcDrawPriority();
|
||||||
void setArrowPosAxis(f32, f32);
|
void setArrowPosAxis(f32, f32);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void fMapBackWide();
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
virtual ~dMenu_Fmap2DBack_c();
|
virtual ~dMenu_Fmap2DBack_c();
|
||||||
|
|
||||||
@@ -330,6 +334,10 @@ public:
|
|||||||
void setHIO(bool);
|
void setHIO(bool);
|
||||||
bool isWarpAccept();
|
bool isWarpAccept();
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void fMapTopWide();
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual void draw();
|
virtual void draw();
|
||||||
virtual ~dMenu_Fmap2DTop_c();
|
virtual ~dMenu_Fmap2DTop_c();
|
||||||
|
|
||||||
|
|||||||
@@ -206,6 +206,15 @@ private:
|
|||||||
/* 0x6D3 */ u8 field_0x6d3;
|
/* 0x6D3 */ u8 field_0x6d3;
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
f32 mSelectItemSlideElapsed[4];
|
f32 mSelectItemSlideElapsed[4];
|
||||||
|
f32 mCursorInterpPrevX;
|
||||||
|
f32 mCursorInterpPrevY;
|
||||||
|
f32 mCursorInterpCurrX;
|
||||||
|
f32 mCursorInterpCurrY;
|
||||||
|
s16 mCursorInterpPrevAngle;
|
||||||
|
s16 mCursorInterpCurrAngle;
|
||||||
|
bool mCursorInterpPrevAngular;
|
||||||
|
bool mCursorInterpCurrAngular;
|
||||||
|
bool mCursorInterpInit;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -343,6 +343,11 @@ public:
|
|||||||
/* 0x624 */ f32 mMidonaPosX;
|
/* 0x624 */ f32 mMidonaPosX;
|
||||||
/* 0x628 */ f32 mMidonaPosY;
|
/* 0x628 */ f32 mMidonaPosY;
|
||||||
/* 0x62C */ f32 mMidonaScale;
|
/* 0x62C */ f32 mMidonaScale;
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
bool mWasListen[2];
|
||||||
|
bool mWasRepeat[2];
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* D_METER_D_METER_BUTTON_H */
|
#endif /* D_METER_D_METER_BUTTON_H */
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ public:
|
|||||||
bool isStaffMessage();
|
bool isStaffMessage();
|
||||||
bool isSaveMessage();
|
bool isSaveMessage();
|
||||||
bool isTalkMessage();
|
bool isTalkMessage();
|
||||||
|
#if TARGET_PC
|
||||||
|
bool isShopItemMessage();
|
||||||
|
#endif
|
||||||
const char* getSmellName();
|
const char* getSmellName();
|
||||||
const char* getPortalName();
|
const char* getPortalName();
|
||||||
const char* getBombName();
|
const char* getBombName();
|
||||||
|
|||||||
+1
-1
@@ -89,7 +89,7 @@ public:
|
|||||||
void MojiSelectAnm3();
|
void MojiSelectAnm3();
|
||||||
int mojiChange(u8);
|
int mojiChange(u8);
|
||||||
void selectMojiSet();
|
void selectMojiSet();
|
||||||
#if REGION_JPN
|
#if TARGET_PC || REGION_JPN
|
||||||
int checkDakuon(int, u8);
|
int checkDakuon(int, u8);
|
||||||
int setDakuon(int, u8);
|
int setDakuon(int, u8);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ public:
|
|||||||
bool isProgressiveMode();
|
bool isProgressiveMode();
|
||||||
void setRenderMode();
|
void setRenderMode();
|
||||||
|
|
||||||
#if VERSION == VERSION_GCN_PAL || PLATFORM_WII || PLATFORM_SHIELD
|
#if TARGET_PC || VERSION == VERSION_GCN_PAL || PLATFORM_WII || PLATFORM_SHIELD
|
||||||
u8 getPalLanguage();
|
u8 getPalLanguage();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ public:
|
|||||||
/* 0x200 */ dDlst_2D_c* mNvLogo;
|
/* 0x200 */ dDlst_2D_c* mNvLogo;
|
||||||
/* 0x204 */ dDlst_2D_c* mMocImg;
|
/* 0x204 */ dDlst_2D_c* mMocImg;
|
||||||
#endif
|
#endif
|
||||||
#if VERSION == VERSION_GCN_PAL
|
#if TARGET_PC || VERSION == VERSION_GCN_PAL
|
||||||
/* 0x1FC */ mDoDvdThd_mountArchive_c* mpPalLogoResCommand;
|
/* 0x1FC */ mDoDvdThd_mountArchive_c* mpPalLogoResCommand;
|
||||||
#endif
|
#endif
|
||||||
/* 0x1FC */ request_of_phase_process_class* m_preLoad_dylPhase;
|
/* 0x1FC */ request_of_phase_process_class* m_preLoad_dylPhase;
|
||||||
|
|||||||
@@ -47,6 +47,13 @@ public:
|
|||||||
mPositionY = y;
|
mPositionY = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
f32 getPositionX() const { return mPositionX; }
|
||||||
|
f32 getPositionY() const { return mPositionY; }
|
||||||
|
|
||||||
|
void refreshAspectScale();
|
||||||
|
#endif
|
||||||
|
|
||||||
void onUpdateFlag() { mUpdateFlag = true; }
|
void onUpdateFlag() { mUpdateFlag = true; }
|
||||||
|
|
||||||
void resetUpdateFlag() { mUpdateFlag = false; }
|
void resetUpdateFlag() { mUpdateFlag = false; }
|
||||||
@@ -79,6 +86,9 @@ private:
|
|||||||
/* 0x58 */ f32 mPositionX;
|
/* 0x58 */ f32 mPositionX;
|
||||||
/* 0x5C */ f32 mPositionY;
|
/* 0x5C */ f32 mPositionY;
|
||||||
/* 0x60 */ f32 mParam1;
|
/* 0x60 */ f32 mParam1;
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
f32 mBaseParam1;
|
||||||
|
#endif
|
||||||
/* 0x64 */ f32 mParam2;
|
/* 0x64 */ f32 mParam2;
|
||||||
/* 0x68 */ f32 mParam3;
|
/* 0x68 */ f32 mParam3;
|
||||||
/* 0x6C */ f32 mParam4;
|
/* 0x6C */ f32 mParam4;
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <functional>
|
||||||
|
#include <queue>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <vector>
|
||||||
|
#include "nlohmann/json.hpp"
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
|
||||||
|
enum class AchievementCategory : uint8_t {
|
||||||
|
Story,
|
||||||
|
Collection,
|
||||||
|
Challenge,
|
||||||
|
Minigame,
|
||||||
|
Misc,
|
||||||
|
Glitched
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Achievement {
|
||||||
|
const char* key;
|
||||||
|
const char* name;
|
||||||
|
const char* description;
|
||||||
|
AchievementCategory category;
|
||||||
|
bool isCounter;
|
||||||
|
int32_t goal;
|
||||||
|
int32_t progress;
|
||||||
|
bool unlocked;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Responsible for updating a.progress.
|
||||||
|
// Use extra for any per-achievement state that must survive across frames or sessions, extra is saved
|
||||||
|
using AchievementCheckFn = std::function<void(Achievement& a, nlohmann::json& extra)>;
|
||||||
|
|
||||||
|
class AchievementSystem {
|
||||||
|
public:
|
||||||
|
static AchievementSystem& get();
|
||||||
|
|
||||||
|
void load();
|
||||||
|
void save();
|
||||||
|
void tick();
|
||||||
|
void clearAll();
|
||||||
|
void clearOne(const char* key);
|
||||||
|
|
||||||
|
// Signals are visible to all achievement checks within the same tick, then cleared.
|
||||||
|
void signal(const char* key);
|
||||||
|
bool hasSignal(const char* key) const;
|
||||||
|
|
||||||
|
std::vector<Achievement> getAchievements() const;
|
||||||
|
bool hasPendingUnlock() const { return !m_pendingUnlocks.empty(); }
|
||||||
|
std::string consumePendingUnlock();
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct Entry {
|
||||||
|
Achievement achievement;
|
||||||
|
AchievementCheckFn check;
|
||||||
|
nlohmann::json extra;
|
||||||
|
};
|
||||||
|
|
||||||
|
AchievementSystem();
|
||||||
|
static std::vector<Entry> makeEntries();
|
||||||
|
void processEntry(Entry& e);
|
||||||
|
|
||||||
|
std::vector<Entry> m_entries;
|
||||||
|
std::unordered_set<std::string_view> m_signals;
|
||||||
|
bool m_loaded = false;
|
||||||
|
bool m_dirty = false;
|
||||||
|
std::queue<std::string> m_pendingUnlocks;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace dusk
|
||||||
@@ -12,6 +12,8 @@ namespace dusk::audio {
|
|||||||
|
|
||||||
void SetMasterVolume(f32 value);
|
void SetMasterVolume(f32 value);
|
||||||
|
|
||||||
|
void SetPaused(bool paused);
|
||||||
|
|
||||||
u32 GetResetCount(int channelIdx);
|
u32 GetResetCount(int channelIdx);
|
||||||
|
|
||||||
f32 VolumeFromU16(u16 value);
|
f32 VolumeFromU16(u16 value);
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef AUTOSAVE_H
|
||||||
|
#define AUTOSAVE_H
|
||||||
|
|
||||||
|
#include <m_Do/m_Do_MemCardRWmng.h>
|
||||||
|
#include <m_Do/m_Do_MemCard.h>
|
||||||
|
|
||||||
|
void noAutoSave();
|
||||||
|
void triggerAutoSave();
|
||||||
|
void updateAutoSave();
|
||||||
|
void enterAutoSave();
|
||||||
|
void autoSaving();
|
||||||
|
void waitingForWrite();
|
||||||
|
void endAutoSave();
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef DUSK_DISCORD_RPC
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
namespace discord {
|
||||||
|
|
||||||
|
void Initialize();
|
||||||
|
|
||||||
|
void RunCallbacks();
|
||||||
|
|
||||||
|
void UpdatePresence();
|
||||||
|
|
||||||
|
void Shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // DUSK_DISCORD_RPC
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "aurora/gfx.h"
|
#include "aurora/gfx.h"
|
||||||
|
|
||||||
extern AuroraInfo auroraInfo;
|
extern AuroraInfo auroraInfo;
|
||||||
extern const char* configPath;
|
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
extern AuroraStats lastFrameAuroraStats;
|
extern AuroraStats lastFrameAuroraStats;
|
||||||
|
|||||||
@@ -1,22 +1,31 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "dolphin/types.h"
|
#include "dolphin/types.h"
|
||||||
|
#include "version.hpp"
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
|
|
||||||
|
struct OffsetVersion {
|
||||||
|
version::GameVersion mGameVersion;
|
||||||
|
u32 mOffset;
|
||||||
|
|
||||||
|
constexpr OffsetVersion(const version::GameVersion gameVersion, const u32 offset)
|
||||||
|
: mGameVersion(gameVersion), mOffset(offset) {}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load bytes from the main DOL by GameCube virtual address
|
* Load bytes from the main DOL by GameCube virtual address
|
||||||
*/
|
*/
|
||||||
bool LoadDolAsset(void* dst, u32 virtualAddress, s32 size);
|
bool LoadDolAsset(void* dst, std::initializer_list<OffsetVersion> virtualAddress, s32 size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load bytes from a REL file in the ISO filesystem, dst must be 32-byte aligned
|
* Load bytes from a REL file in the ISO filesystem, dst must be 32-byte aligned
|
||||||
*/
|
*/
|
||||||
bool LoadRelAsset(void* dst, const char* dvdPath, s32 offset, s32 size);
|
bool LoadRelAsset(void* dst, const char* dvdPath, std::initializer_list<OffsetVersion> offset, s32 size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load bytes from a REL inside RELS.arc
|
* Load bytes from a REL inside RELS.arc
|
||||||
*/
|
*/
|
||||||
bool LoadArchivedRelAsset(void* dst, u32 memType, const char* relFileName, s32 offset, s32 size);
|
bool LoadArchivedRelAsset(void* dst, u32 memType, const char* relFileName, std::initializer_list<OffsetVersion> offset, s32 size);
|
||||||
|
|
||||||
} // namespace dusk
|
} // namespace dusk
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#ifndef DUSK_FRAME_INTERP_H
|
#pragma once
|
||||||
#define DUSK_FRAME_INTERP_H
|
|
||||||
|
|
||||||
#include <dolphin/mtx.h>
|
#include <dolphin/mtx.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -7,6 +6,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
class camera_process_class;
|
class camera_process_class;
|
||||||
|
class view_class;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
@@ -16,40 +16,37 @@ void ensure_initialized();
|
|||||||
|
|
||||||
void begin_record();
|
void begin_record();
|
||||||
void end_record();
|
void end_record();
|
||||||
void interpolate(float step);
|
void begin_sim_tick();
|
||||||
|
void begin_frame(bool enabled, bool is_sim_frame, float step);
|
||||||
|
void interpolate();
|
||||||
float get_interpolation_step();
|
float get_interpolation_step();
|
||||||
|
|
||||||
void request_presentation_sync();
|
void request_presentation_sync();
|
||||||
bool presentation_sync_active();
|
bool presentation_sync_active();
|
||||||
|
|
||||||
|
bool is_enabled();
|
||||||
|
|
||||||
// TODO: These should be phased out as UI is progressively updated to use game_clock
|
// TODO: These should be phased out as UI is progressively updated to use game_clock
|
||||||
void set_ui_tick_pending(bool value);
|
void set_ui_tick_pending(bool value);
|
||||||
bool get_ui_tick_pending();
|
bool get_ui_tick_pending();
|
||||||
|
|
||||||
void open_child(const void* key, int32_t id);
|
bool is_sim_frame();
|
||||||
void close_child();
|
|
||||||
void record_camera(::camera_process_class* cam, int camera_id);
|
|
||||||
void record_final_mtx_raw(const Mtx* dest, const Mtx src);
|
|
||||||
void record_final_mtx_raw_tagged(const Mtx* dest, const Mtx src, uint64_t stable_tag);
|
|
||||||
|
|
||||||
bool lookup_replacement(const void* source, Mtx out);
|
void record_camera(::camera_process_class* cam, int camera_id);
|
||||||
|
void interp_view(::view_class* view);
|
||||||
|
void record_final_mtx(Mtx m, const void *key);
|
||||||
|
void record_final_mtx(Mtx m);
|
||||||
|
|
||||||
|
bool lookup_replacement(const void* key, Mtx out);
|
||||||
bool lookup_concat_replacement(const void* lhs, const void* rhs, Mtx out);
|
bool lookup_concat_replacement(const void* lhs, const void* rhs, Mtx out);
|
||||||
|
|
||||||
|
typedef void (*InterpolationCallBack)(bool isSimFrame, void* pUserWork);
|
||||||
|
// call on a sim tick, will get called during presentation
|
||||||
|
void add_interpolation_callback(InterpolationCallBack pCallBack, void* pUserWork);
|
||||||
|
|
||||||
void begin_presentation_camera();
|
void begin_presentation_camera();
|
||||||
void end_presentation_camera();
|
void end_presentation_camera();
|
||||||
|
|
||||||
struct PresentationCameraScope {
|
|
||||||
PresentationCameraScope() { begin_presentation_camera(); }
|
|
||||||
~PresentationCameraScope() { end_presentation_camera(); }
|
|
||||||
PresentationCameraScope(const PresentationCameraScope&) = delete;
|
|
||||||
PresentationCameraScope& operator=(const PresentationCameraScope&) = delete;
|
|
||||||
PresentationCameraScope(PresentationCameraScope&&) = delete;
|
|
||||||
PresentationCameraScope& operator=(PresentationCameraScope&&) = delete;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint64_t alloc_simple_shadow_pair_base();
|
|
||||||
} // namespace frame_interp
|
} // namespace frame_interp
|
||||||
} // namespace dusk
|
} // namespace dusk
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
#ifndef DUSK_GAME_CLOCK_H
|
#pragma once
|
||||||
#define DUSK_GAME_CLOCK_H
|
|
||||||
|
|
||||||
#include <stddef.h>
|
namespace dusk::game_clock {
|
||||||
|
|
||||||
namespace dusk {
|
|
||||||
namespace game_clock {
|
|
||||||
|
|
||||||
void ensure_initialized();
|
void ensure_initialized();
|
||||||
void reset_accumulator();
|
void reset_frame_timer();
|
||||||
|
|
||||||
constexpr float sim_pace() { return 1.0f / 30.0f; }
|
constexpr float sim_pace() { return 1.0f / 30.0f; }
|
||||||
constexpr float period_for_original_frames(float frame_count) { return frame_count * sim_pace(); }
|
constexpr float period_for_original_frames(float frame_count) { return frame_count * sim_pace(); }
|
||||||
@@ -17,16 +13,14 @@ constexpr float ui_initial_dt() { return 1.0f / 60.0f; }
|
|||||||
struct MainLoopPacer {
|
struct MainLoopPacer {
|
||||||
float presentation_dt_seconds;
|
float presentation_dt_seconds;
|
||||||
bool is_interpolating;
|
bool is_interpolating;
|
||||||
bool do_sim_tick;
|
int sim_ticks_to_run;
|
||||||
float interpolation_step;
|
|
||||||
float sim_pace;
|
float sim_pace;
|
||||||
};
|
};
|
||||||
|
|
||||||
MainLoopPacer advance_main_loop();
|
MainLoopPacer advance_main_loop();
|
||||||
|
void commit_sim_tick();
|
||||||
|
float sample_interpolation_step();
|
||||||
|
|
||||||
float consume_interval(const void* consumer);
|
float consume_interval(const void* consumer);
|
||||||
|
|
||||||
} // namespace game_clock
|
} // namespace dusk::game_clock
|
||||||
} // namespace dusk
|
|
||||||
|
|
||||||
#endif // DUSK_GAME_CLOCK_H
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef GAMEPAD_COLOR_H
|
||||||
|
#define GAMEPAD_COLOR_H
|
||||||
|
|
||||||
|
void handleGamepadColor();
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace dusk::speedrun {
|
||||||
|
void onGameFrame();
|
||||||
|
uint64_t getFrameCount();
|
||||||
|
void start();
|
||||||
|
void reset();
|
||||||
|
void connectLiveSplit(const char* host = "127.0.0.1", int port = 16834);
|
||||||
|
void disconnectLiveSplit();
|
||||||
|
bool consumeConnectedEvent();
|
||||||
|
bool consumeDisconnectedEvent();
|
||||||
|
void updateLiveSplit();
|
||||||
|
void shutdown();
|
||||||
|
}
|
||||||
@@ -4,10 +4,12 @@
|
|||||||
#include <aurora/aurora.h>
|
#include <aurora/aurora.h>
|
||||||
#include <aurora/lib/logging.hpp>
|
#include <aurora/lib/logging.hpp>
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
void aurora_log_callback(AuroraLogLevel level, const char* module, const char* message, unsigned int len);
|
void aurora_log_callback(AuroraLogLevel level, const char* module, const char* message, unsigned int len);
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
void InitializeFileLogging(const char* configDir, AuroraLogLevel logLevel);
|
void InitializeFileLogging(const std::filesystem::path& configDir, AuroraLogLevel logLevel);
|
||||||
void ShutdownFileLogging();
|
void ShutdownFileLogging();
|
||||||
const char* GetLogFilePath();
|
const char* GetLogFilePath();
|
||||||
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
|
void SendToStubLog(AuroraLogLevel level, const char* module, const char* message);
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
#ifndef DUSK_MAIN_H
|
#ifndef DUSK_MAIN_H
|
||||||
#define DUSK_MAIN_H
|
#define DUSK_MAIN_H
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
namespace dusk {
|
namespace dusk {
|
||||||
extern bool IsRunning;
|
extern bool IsRunning;
|
||||||
extern bool IsShuttingDown;
|
extern bool IsShuttingDown;
|
||||||
extern bool IsGameLaunched;
|
extern bool IsGameLaunched;
|
||||||
|
extern bool IsFocusPaused;
|
||||||
|
extern std::filesystem::path ConfigPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // DUSK_MAIN_H
|
#endif // DUSK_MAIN_H
|
||||||
|
|||||||
+38
-2
@@ -13,12 +13,26 @@ enum class BloomMode : int {
|
|||||||
Dusk = 2,
|
Dusk = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class GameLanguage : u8 {
|
||||||
|
English = OS_LANGUAGE_ENGLISH,
|
||||||
|
German = OS_LANGUAGE_GERMAN,
|
||||||
|
French = OS_LANGUAGE_FRENCH,
|
||||||
|
Spanish = OS_LANGUAGE_SPANISH,
|
||||||
|
Italian = OS_LANGUAGE_ITALIAN,
|
||||||
|
};
|
||||||
|
|
||||||
namespace config {
|
namespace config {
|
||||||
template <>
|
template <>
|
||||||
struct ConfigEnumRange<BloomMode> {
|
struct ConfigEnumRange<BloomMode> {
|
||||||
static constexpr auto min = BloomMode::Off;
|
static constexpr auto min = BloomMode::Off;
|
||||||
static constexpr auto max = BloomMode::Dusk;
|
static constexpr auto max = BloomMode::Dusk;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct ConfigEnumRange<GameLanguage> {
|
||||||
|
static constexpr auto min = GameLanguage::English;
|
||||||
|
static constexpr auto max = GameLanguage::Italian;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Persistent user settings
|
// Persistent user settings
|
||||||
@@ -41,11 +55,14 @@ struct UserSettings {
|
|||||||
ConfigVar<int> soundEffectsVolume;
|
ConfigVar<int> soundEffectsVolume;
|
||||||
ConfigVar<int> fanfareVolume;
|
ConfigVar<int> fanfareVolume;
|
||||||
ConfigVar<bool> enableReverb;
|
ConfigVar<bool> enableReverb;
|
||||||
|
ConfigVar<bool> enableHrtf;
|
||||||
} audio;
|
} audio;
|
||||||
|
|
||||||
// Game settings
|
// Game settings
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
ConfigVar<GameLanguage> language;
|
||||||
|
|
||||||
// QoL
|
// QoL
|
||||||
ConfigVar<bool> enableQuickTransform;
|
ConfigVar<bool> enableQuickTransform;
|
||||||
ConfigVar<bool> hideTvSettingsScreen;
|
ConfigVar<bool> hideTvSettingsScreen;
|
||||||
@@ -55,27 +72,35 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> disableRupeeCutscenes;
|
ConfigVar<bool> disableRupeeCutscenes;
|
||||||
ConfigVar<bool> noSwordRecoil;
|
ConfigVar<bool> noSwordRecoil;
|
||||||
ConfigVar<int> damageMultiplier;
|
ConfigVar<int> damageMultiplier;
|
||||||
|
ConfigVar<bool> hyperEnemies;
|
||||||
ConfigVar<bool> noHeartDrops;
|
ConfigVar<bool> noHeartDrops;
|
||||||
ConfigVar<bool> instantDeath;
|
ConfigVar<bool> instantDeath;
|
||||||
ConfigVar<bool> fastClimbing;
|
ConfigVar<bool> fastClimbing;
|
||||||
ConfigVar<bool> noMissClimbing;
|
ConfigVar<bool> noMissClimbing;
|
||||||
ConfigVar<bool> fastTears;
|
ConfigVar<bool> fastTears;
|
||||||
|
ConfigVar<bool> no2ndFishForCat;
|
||||||
ConfigVar<bool> instantSaves;
|
ConfigVar<bool> instantSaves;
|
||||||
ConfigVar<bool> instantText;
|
ConfigVar<bool> instantText;
|
||||||
ConfigVar<bool> sunsSong;
|
ConfigVar<bool> sunsSong;
|
||||||
|
ConfigVar<bool> autoSave;
|
||||||
|
|
||||||
// Preferences
|
// Preferences
|
||||||
ConfigVar<bool> enableMirrorMode;
|
ConfigVar<bool> enableMirrorMode;
|
||||||
ConfigVar<bool> invertCameraXAxis;
|
|
||||||
ConfigVar<bool> disableMainHUD;
|
ConfigVar<bool> disableMainHUD;
|
||||||
|
ConfigVar<bool> pauseOnFocusLost;
|
||||||
|
ConfigVar<bool> enableLinkDollRotation;
|
||||||
|
ConfigVar<bool> enableAchievementNotifications;
|
||||||
|
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
ConfigVar<BloomMode> bloomMode;
|
ConfigVar<BloomMode> bloomMode;
|
||||||
ConfigVar<float> bloomMultiplier;
|
ConfigVar<float> bloomMultiplier;
|
||||||
ConfigVar<bool> enableWaterRefraction;
|
ConfigVar<bool> disableWaterRefraction;
|
||||||
ConfigVar<bool> enableFrameInterpolation;
|
ConfigVar<bool> enableFrameInterpolation;
|
||||||
ConfigVar<int> internalResolutionScale;
|
ConfigVar<int> internalResolutionScale;
|
||||||
ConfigVar<int> shadowResolutionMultiplier;
|
ConfigVar<int> shadowResolutionMultiplier;
|
||||||
|
ConfigVar<bool> enableDepthOfField;
|
||||||
|
ConfigVar<bool> enableMapBackground;
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
ConfigVar<bool> noLowHpSound;
|
ConfigVar<bool> noLowHpSound;
|
||||||
@@ -91,6 +116,10 @@ struct UserSettings {
|
|||||||
ConfigVar<float> gyroDeadband;
|
ConfigVar<float> gyroDeadband;
|
||||||
ConfigVar<bool> gyroInvertPitch;
|
ConfigVar<bool> gyroInvertPitch;
|
||||||
ConfigVar<bool> gyroInvertYaw;
|
ConfigVar<bool> gyroInvertYaw;
|
||||||
|
ConfigVar<bool> freeCamera;
|
||||||
|
ConfigVar<bool> invertCameraXAxis;
|
||||||
|
ConfigVar<bool> invertCameraYAxis;
|
||||||
|
ConfigVar<float> freeCameraSensitivity;
|
||||||
|
|
||||||
// Cheats
|
// Cheats
|
||||||
ConfigVar<bool> infiniteHearts;
|
ConfigVar<bool> infiniteHearts;
|
||||||
@@ -99,6 +128,7 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> infiniteOil;
|
ConfigVar<bool> infiniteOil;
|
||||||
ConfigVar<bool> infiniteOxygen;
|
ConfigVar<bool> infiniteOxygen;
|
||||||
ConfigVar<bool> infiniteRupees;
|
ConfigVar<bool> infiniteRupees;
|
||||||
|
ConfigVar<bool> enableIndefiniteItemDrops;
|
||||||
ConfigVar<bool> moonJump;
|
ConfigVar<bool> moonJump;
|
||||||
ConfigVar<bool> superClawshot;
|
ConfigVar<bool> superClawshot;
|
||||||
ConfigVar<bool> alwaysGreatspin;
|
ConfigVar<bool> alwaysGreatspin;
|
||||||
@@ -112,6 +142,10 @@ struct UserSettings {
|
|||||||
|
|
||||||
// Controls
|
// Controls
|
||||||
ConfigVar<bool> enableTurboKeybind;
|
ConfigVar<bool> enableTurboKeybind;
|
||||||
|
|
||||||
|
// Tools
|
||||||
|
ConfigVar<bool> speedrunMode;
|
||||||
|
ConfigVar<bool> liveSplitEnabled;
|
||||||
} game;
|
} game;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -122,6 +156,7 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> wasPresetChosen;
|
ConfigVar<bool> wasPresetChosen;
|
||||||
ConfigVar<bool> enableCrashReporting;
|
ConfigVar<bool> enableCrashReporting;
|
||||||
ConfigVar<bool> duskMenuOpen;
|
ConfigVar<bool> duskMenuOpen;
|
||||||
|
ConfigVar<int> cardFileType;
|
||||||
} backend;
|
} backend;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -146,6 +181,7 @@ struct TransientSettings {
|
|||||||
CollisionViewSettings collisionView;
|
CollisionViewSettings collisionView;
|
||||||
bool skipFrameRateLimit;
|
bool skipFrameRateLimit;
|
||||||
bool moveLinkActive;
|
bool moveLinkActive;
|
||||||
|
bool stateShareLoadActive;
|
||||||
};
|
};
|
||||||
|
|
||||||
TransientSettings& getTransientSettings();
|
TransientSettings& getTransientSettings();
|
||||||
|
|||||||
+25
-25
@@ -1,9 +1,10 @@
|
|||||||
#ifndef DUSK_TIME_H
|
#ifndef DUSK_TIME_H
|
||||||
#define DUSK_TIME_H
|
#define DUSK_TIME_H
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <numeric>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
|
#include "SDL3/SDL_timer.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifndef WIN32_LEAN_AND_MEAN
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
@@ -15,28 +16,26 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <intrin.h>
|
#include <intrin.h>
|
||||||
#else
|
|
||||||
#include "SDL3/SDL_timer.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class Limiter {
|
class Limiter {
|
||||||
using delta_clock = std::chrono::high_resolution_clock;
|
|
||||||
using duration_t = std::chrono::nanoseconds;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Reset() { m_oldTime = delta_clock::now(); }
|
using duration_t = Uint64;
|
||||||
|
|
||||||
|
void Reset() { m_oldTime = SDL_GetTicksNS(); }
|
||||||
|
|
||||||
void Sleep(duration_t targetFrameTime) {
|
void Sleep(duration_t targetFrameTime) {
|
||||||
if (targetFrameTime.count() == 0) {
|
if (targetFrameTime == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start = delta_clock::now();
|
const Uint64 start = SDL_GetTicksNS();
|
||||||
duration_t adjustedSleepTime = SleepTime(targetFrameTime);
|
duration_t adjustedSleepTime = SleepTime(targetFrameTime);
|
||||||
if (adjustedSleepTime.count() > 0) {
|
if (adjustedSleepTime > 0) {
|
||||||
NanoSleep(adjustedSleepTime);
|
NanoSleep(adjustedSleepTime);
|
||||||
duration_t overslept = TimeSince(start) - adjustedSleepTime;
|
const duration_t elapsed = TimeSince(start);
|
||||||
if (overslept < duration_t{targetFrameTime}) {
|
const duration_t overslept = elapsed > adjustedSleepTime ? elapsed - adjustedSleepTime : 0;
|
||||||
|
if (overslept < targetFrameTime) {
|
||||||
m_overheadTimes[m_overheadTimeIdx] = overslept;
|
m_overheadTimes[m_overheadTimeIdx] = overslept;
|
||||||
m_overheadTimeIdx = (m_overheadTimeIdx + 1) % m_overheadTimes.size();
|
m_overheadTimeIdx = (m_overheadTimeIdx + 1) % m_overheadTimes.size();
|
||||||
}
|
}
|
||||||
@@ -45,23 +44,23 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
duration_t SleepTime(duration_t targetFrameTime) {
|
duration_t SleepTime(duration_t targetFrameTime) {
|
||||||
const auto sleepTime = duration_t{targetFrameTime} - TimeSince(m_oldTime);
|
const duration_t elapsed = TimeSince(m_oldTime);
|
||||||
m_overhead = std::accumulate(m_overheadTimes.begin(), m_overheadTimes.end(), duration_t{}) / m_overheadTimes.size();
|
const duration_t sleepTime = elapsed < targetFrameTime ? targetFrameTime - elapsed : 0;
|
||||||
|
m_overhead = std::accumulate(m_overheadTimes.begin(), m_overheadTimes.end(), duration_t{0}) /
|
||||||
|
m_overheadTimes.size();
|
||||||
if (sleepTime > m_overhead) {
|
if (sleepTime > m_overhead) {
|
||||||
return sleepTime - m_overhead;
|
return sleepTime - m_overhead;
|
||||||
}
|
}
|
||||||
return duration_t{0};
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
delta_clock::time_point m_oldTime;
|
Uint64 m_oldTime = 0;
|
||||||
std::array<duration_t, 4> m_overheadTimes{};
|
std::array<duration_t, 4> m_overheadTimes{};
|
||||||
size_t m_overheadTimeIdx = 0;
|
size_t m_overheadTimeIdx = 0;
|
||||||
duration_t m_overhead = duration_t{0};
|
duration_t m_overhead = 0;
|
||||||
|
|
||||||
duration_t TimeSince(delta_clock::time_point start) {
|
duration_t TimeSince(Uint64 start) const { return SDL_GetTicksNS() - start; }
|
||||||
return std::chrono::duration_cast<duration_t>(delta_clock::now() - start);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
void NanoSleep(const duration_t duration) {
|
void NanoSleep(const duration_t duration) {
|
||||||
@@ -85,9 +84,10 @@ private:
|
|||||||
|
|
||||||
LARGE_INTEGER start, current;
|
LARGE_INTEGER start, current;
|
||||||
QueryPerformanceCounter(&start);
|
QueryPerformanceCounter(&start);
|
||||||
LONGLONG ticksToWait = static_cast<LONGLONG>(duration.count() * countPerNs);
|
const LONGLONG ticksToWait = static_cast<LONGLONG>(duration * countPerNs);
|
||||||
if (DWORD ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count(); ms > 1) {
|
const Uint64 ms = duration / 1'000'000ULL;
|
||||||
::Sleep(ms - 1);
|
if (ms > 1) {
|
||||||
|
::Sleep(static_cast<DWORD>(ms - 1));
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
QueryPerformanceCounter(¤t);
|
QueryPerformanceCounter(¤t);
|
||||||
@@ -99,7 +99,7 @@ private:
|
|||||||
} while (current.QuadPart - start.QuadPart < ticksToWait);
|
} while (current.QuadPart - start.QuadPart < ticksToWait);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration.count()); }
|
void NanoSleep(const duration_t duration) { SDL_DelayPrecise(duration); }
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#ifndef DUSK_VERSION_HPP
|
||||||
|
#define DUSK_VERSION_HPP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Functionality for switching game behavior based on the loaded game version (e.g. PAL/JPN, GC/Wii)
|
||||||
|
*/
|
||||||
|
namespace dusk::version {
|
||||||
|
enum class GameVersion : u8 {
|
||||||
|
GcnUsa = VERSION_GCN_USA,
|
||||||
|
GcnPal = VERSION_GCN_PAL,
|
||||||
|
GcnJpn = VERSION_GCN_JPN,
|
||||||
|
WiiUsaRev0 = VERSION_WII_USA_R0,
|
||||||
|
WiiUsa = VERSION_WII_USA_R2,
|
||||||
|
WiiPal = VERSION_WII_PAL,
|
||||||
|
WiiJpn = VERSION_WII_JPN,
|
||||||
|
WiiKor = VERSION_WII_KOR,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool isGcn();
|
||||||
|
bool isWii();
|
||||||
|
bool isPalOrAtLeastWiiR2();
|
||||||
|
|
||||||
|
bool isRegionPal();
|
||||||
|
bool isRegionJpn();
|
||||||
|
bool isRegionUsa();
|
||||||
|
|
||||||
|
GameVersion getGameVersion();
|
||||||
|
|
||||||
|
const DVDDiskID& getDiskID();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct VersionOption {
|
||||||
|
GameVersion mVersion;
|
||||||
|
T mValue;
|
||||||
|
|
||||||
|
constexpr VersionOption(GameVersion version, T value) : mVersion(version), mValue(value) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
const T& versionSelect(const std::initializer_list<VersionOption<T>> options) {
|
||||||
|
const auto version = getGameVersion();
|
||||||
|
for (const auto& opt : options) {
|
||||||
|
if (opt.mVersion == version) {
|
||||||
|
return opt.mValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unable to find value.
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
const T& versionSelect(const std::initializer_list<VersionOption<T>> options, const T& defaultValue) {
|
||||||
|
const auto version = getGameVersion();
|
||||||
|
for (const auto& opt : options) {
|
||||||
|
if (opt.mVersion == version) {
|
||||||
|
return opt.mValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
} // namespace dusk::version
|
||||||
|
|
||||||
|
#endif // DUSK_VERSION_HPP
|
||||||
@@ -25,7 +25,7 @@ typedef struct leafdraw_class : base_process_class {
|
|||||||
#endif
|
#endif
|
||||||
/* 0xB8 */ leafdraw_method_class* leaf_methods;
|
/* 0xB8 */ leafdraw_method_class* leaf_methods;
|
||||||
/* 0xBC */ s8 unk_0xBC;
|
/* 0xBC */ s8 unk_0xBC;
|
||||||
/* 0xBD */ u8 unk_0xBD;
|
/* 0xBD */ u8 draw_interp_frame;
|
||||||
/* 0xBE */ draw_priority_class draw_priority;
|
/* 0xBE */ draw_priority_class draw_priority;
|
||||||
} leafdraw_class;
|
} leafdraw_class;
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ typedef struct process_node_class {
|
|||||||
/* 0x0BC */ layer_class layer;
|
/* 0x0BC */ layer_class layer;
|
||||||
/* 0x0E8 */ node_list_class layer_nodelist[16];
|
/* 0x0E8 */ node_list_class layer_nodelist[16];
|
||||||
/* 0x1A8 */ s8 unk_0x1A8;
|
/* 0x1A8 */ s8 unk_0x1A8;
|
||||||
|
/* 0x1A9 */ s8 draw_interp_frame;
|
||||||
} process_node_class;
|
} process_node_class;
|
||||||
|
|
||||||
typedef struct node_process_profile_definition {
|
typedef struct node_process_profile_definition {
|
||||||
|
|||||||
+15
-1
@@ -73,6 +73,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __MWERKS__
|
#ifndef __MWERKS__
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
// Silence clangd errors about MWCC PPC intrinsics by declaring them here.
|
// Silence clangd errors about MWCC PPC intrinsics by declaring them here.
|
||||||
extern int __cntlzw(unsigned int);
|
extern int __cntlzw(unsigned int);
|
||||||
extern int __rlwimi(int, int, int, int, int);
|
extern int __rlwimi(int, int, int, int, int);
|
||||||
@@ -80,7 +83,14 @@ extern void __dcbf(void*, int);
|
|||||||
extern void __dcbz(void*, int);
|
extern void __dcbz(void*, int);
|
||||||
extern void __sync();
|
extern void __sync();
|
||||||
extern int __abs(int);
|
extern int __abs(int);
|
||||||
void* __memcpy(void*, const void*, int);
|
#if defined(__has_builtin) && __has_builtin(__builtin_memcpy)
|
||||||
|
#define __memcpy __builtin_memcpy
|
||||||
|
#else
|
||||||
|
#define __memcpy memcpy
|
||||||
|
#endif
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
@@ -220,12 +230,16 @@ using std::isnan;
|
|||||||
// Some basic macros that are more convenient than putting down #if blocks for one-line changes.
|
// Some basic macros that are more convenient than putting down #if blocks for one-line changes.
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#define IF_DUSK(statement) statement
|
#define IF_DUSK(statement) statement
|
||||||
|
#define IF_DUSK_BLOCK(cond) if (cond) {
|
||||||
|
#define IF_DUSK_BLOCK_END }
|
||||||
#define IF_DUSK_ARG(expr) , expr
|
#define IF_DUSK_ARG(expr) , expr
|
||||||
#define IF_NOT_DUSK(statement)
|
#define IF_NOT_DUSK(statement)
|
||||||
#define DUSK_IF_ELSE(dusk, orig) dusk
|
#define DUSK_IF_ELSE(dusk, orig) dusk
|
||||||
#else
|
#else
|
||||||
#define IF_DUSK(statement)
|
#define IF_DUSK(statement)
|
||||||
#define IF_DUSK_ARG(expr)
|
#define IF_DUSK_ARG(expr)
|
||||||
|
#define IF_DUSK_BLOCK(cond)
|
||||||
|
#define IF_DUSK_BLOCK_END
|
||||||
#define IF_NOT_DUSK(statement) statement
|
#define IF_NOT_DUSK(statement) statement
|
||||||
#define DUSK_IF_ELSE(dusk, orig) orig
|
#define DUSK_IF_ELSE(dusk, orig) orig
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -79,6 +79,10 @@ public:
|
|||||||
virtual void viewCalc();
|
virtual void viewCalc();
|
||||||
virtual ~J3DModel() {}
|
virtual ~J3DModel() {}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
static void interp_callback(bool isSimFrame, void* pUserWork);
|
||||||
|
#endif
|
||||||
|
|
||||||
J3DModelData* getModelData() { return mModelData; }
|
J3DModelData* getModelData() { return mModelData; }
|
||||||
|
|
||||||
void onFlag(u32 flag) { mFlags |= flag; }
|
void onFlag(u32 flag) { mFlags |= flag; }
|
||||||
@@ -105,9 +109,7 @@ public:
|
|||||||
void setAnmMtx(int jointNo, Mtx m) {
|
void setAnmMtx(int jointNo, Mtx m) {
|
||||||
mMtxBuffer->setAnmMtx(jointNo, m);
|
mMtxBuffer->setAnmMtx(jointNo, m);
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
dusk::frame_interp::record_final_mtx_raw(
|
dusk::frame_interp::record_final_mtx(mMtxBuffer->getAnmMtx(jointNo));
|
||||||
reinterpret_cast<const Mtx*>(mMtxBuffer->getAnmMtx(jointNo)),
|
|
||||||
mMtxBuffer->getAnmMtx(jointNo));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
MtxP getAnmMtx(int jointNo) { return mMtxBuffer->getAnmMtx(jointNo); }
|
MtxP getAnmMtx(int jointNo) { return mMtxBuffer->getAnmMtx(jointNo); }
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ public:
|
|||||||
void syncJ3DSysPointers() const;
|
void syncJ3DSysPointers() const;
|
||||||
void syncJ3DSysFlags() const;
|
void syncJ3DSysFlags() const;
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
bool needsInterpCallBack() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual ~J3DModelData() {}
|
virtual ~J3DModelData() {}
|
||||||
|
|
||||||
void simpleCalcMaterial(Mtx mtx) { simpleCalcMaterial(0, mtx); }
|
void simpleCalcMaterial(Mtx mtx) { simpleCalcMaterial(0, mtx); }
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ public:
|
|||||||
void copy(J3DMaterial*);
|
void copy(J3DMaterial*);
|
||||||
s32 newSharedDisplayList(u32);
|
s32 newSharedDisplayList(u32);
|
||||||
s32 newSingleSharedDisplayList(u32);
|
s32 newSingleSharedDisplayList(u32);
|
||||||
|
#if TARGET_PC
|
||||||
|
bool needsInterpCallBack() const;
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual void calc(f32 const (*)[4]);
|
virtual void calc(f32 const (*)[4]);
|
||||||
virtual void calcDiffTexMtx(f32 const (*)[4]);
|
virtual void calcDiffTexMtx(f32 const (*)[4]);
|
||||||
@@ -46,7 +49,6 @@ public:
|
|||||||
virtual void change();
|
virtual void change();
|
||||||
|
|
||||||
J3DMaterial() { initialize(); }
|
J3DMaterial() { initialize(); }
|
||||||
~J3DMaterial() {}
|
|
||||||
J3DMaterial* getNext() { return mNext; }
|
J3DMaterial* getNext() { return mNext; }
|
||||||
J3DShape* getShape() { return mShape; }
|
J3DShape* getShape() { return mShape; }
|
||||||
J3DTevBlock* getTevBlock() { return mTevBlock; }
|
J3DTevBlock* getTevBlock() { return mTevBlock; }
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ public:
|
|||||||
bool isActive() const { return mSeqList.getNumLinks() != 0; }
|
bool isActive() const { return mSeqList.getNumLinks() != 0; }
|
||||||
int getNumActiveSeqs() const { return mSeqList.getNumLinks(); }
|
int getNumActiveSeqs() const { return mSeqList.getNumLinks(); }
|
||||||
void pause(bool paused) { mActivity.field_0x0.flags.flag2 = paused; }
|
void pause(bool paused) { mActivity.field_0x0.flags.flag2 = paused; }
|
||||||
|
#if TARGET_PC
|
||||||
|
JSUList<JAISeq>* getSeqList() { return &mSeqList; }
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* 0x08 */ JAIAudience* mAudience;
|
/* 0x08 */ JAIAudience* mAudience;
|
||||||
|
|||||||
@@ -207,4 +207,11 @@ void JPARegistAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
|||||||
void JPARegistPrmAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
void JPARegistPrmAlpha(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
void JPARegistPrmAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
void JPARegistPrmAlphaEnv(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void JPAInterpBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
|
void JPAInterpRotBillboard(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
|
void JPAInterpDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
|
void JPAInterpRotDirection(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* JPABASESHAPE_H */
|
#endif /* JPABASESHAPE_H */
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ public:
|
|||||||
void init_c(JPAEmitterWorkData*, JPABaseParticle*);
|
void init_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||||
bool calc_p(JPAEmitterWorkData*);
|
bool calc_p(JPAEmitterWorkData*);
|
||||||
bool calc_c(JPAEmitterWorkData*);
|
bool calc_c(JPAEmitterWorkData*);
|
||||||
|
#if TARGET_PC
|
||||||
|
void interp(JPAEmitterWorkData*, void const* drawFunc);
|
||||||
|
#endif
|
||||||
bool canCreateChild(JPAEmitterWorkData*);
|
bool canCreateChild(JPAEmitterWorkData*);
|
||||||
f32 getWidth(JPABaseEmitter const*) const;
|
f32 getWidth(JPABaseEmitter const*) const;
|
||||||
f32 getHeight(JPABaseEmitter const*) const;
|
f32 getHeight(JPABaseEmitter const*) const;
|
||||||
|
|||||||
@@ -11,8 +11,10 @@
|
|||||||
class JUTFader {
|
class JUTFader {
|
||||||
public:
|
public:
|
||||||
enum EStatus {
|
enum EStatus {
|
||||||
UNKSTATUS_M1 = -1,
|
None,
|
||||||
UNKSTATUS_0 = 0,
|
Wait,
|
||||||
|
FadeIn,
|
||||||
|
FadeOut,
|
||||||
};
|
};
|
||||||
|
|
||||||
JUTFader(int, int, int, int, JUtility::TColor);
|
JUTFader(int, int, int, int, JUtility::TColor);
|
||||||
@@ -29,12 +31,12 @@ public:
|
|||||||
void setColor(JUtility::TColor color) { mColor.set(color); }
|
void setColor(JUtility::TColor color) { mColor.set(color); }
|
||||||
|
|
||||||
/* 0x04 */ s32 mStatus;
|
/* 0x04 */ s32 mStatus;
|
||||||
/* 0x08 */ u16 field_0x8;
|
/* 0x08 */ u16 mDuration;
|
||||||
/* 0x0A */ u16 field_0xa;
|
/* 0x0A */ u16 mTimer;
|
||||||
/* 0x0C */ JUtility::TColor mColor;
|
/* 0x0C */ JUtility::TColor mColor;
|
||||||
/* 0x10 */ JGeometry::TBox2<f32> mBox;
|
/* 0x10 */ JGeometry::TBox2<f32> mBox;
|
||||||
/* 0x20 */ int mEStatus;
|
/* 0x20 */ int mStatusTimer;
|
||||||
/* 0x24 */ u32 field_0x24;
|
/* 0x24 */ u32 mNextStatus;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* JUTFADER_H */
|
#endif /* JUTFADER_H */
|
||||||
|
|||||||
@@ -263,6 +263,9 @@ public:
|
|||||||
/* 0x9C */ u8 field_0x9c[4];
|
/* 0x9C */ u8 field_0x9c[4];
|
||||||
/* 0xA0 */ OSTime mResetHoldStartTime;
|
/* 0xA0 */ OSTime mResetHoldStartTime;
|
||||||
/* 0xA8 */ u8 field_0xa8;
|
/* 0xA8 */ u8 field_0xa8;
|
||||||
|
#if TARGET_PC
|
||||||
|
u32 mResetHoldFrameCount;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ public:
|
|||||||
JUTTransparency getTransparency() const { return JUTTransparency(mTransparency); }
|
JUTTransparency getTransparency() const { return JUTTransparency(mTransparency); }
|
||||||
u16 getNumColors() const { return mNumColors; }
|
u16 getNumColors() const { return mNumColors; }
|
||||||
ResTLUT* getColorTable() const { return mColorTable; }
|
ResTLUT* getColorTable() const { return mColorTable; }
|
||||||
|
#if TARGET_PC
|
||||||
|
void dataUploaded();
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/* 0x00 */ GXTlutObj mTlutObj;
|
/* 0x00 */ GXTlutObj mTlutObj;
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public:
|
|||||||
s32 getTransparency() const { return mTexInfo->alphaEnabled; }
|
s32 getTransparency() const { return mTexInfo->alphaEnabled; }
|
||||||
s32 getWidth() const { return mTexInfo->width; }
|
s32 getWidth() const { return mTexInfo->width; }
|
||||||
s32 getHeight() const { return mTexInfo->height; }
|
s32 getHeight() const { return mTexInfo->height; }
|
||||||
|
JUTPalette* getPalette() const { return mPalette; }
|
||||||
void setCaptureFlag(bool flag) { mFlags &= 2 | flag; }
|
void setCaptureFlag(bool flag) { mFlags &= 2 | flag; }
|
||||||
bool getCaptureFlag() const { return mFlags & 1; }
|
bool getCaptureFlag() const { return mFlags & 1; }
|
||||||
bool getEmbPaletteDelFlag() const { return mFlags & 2; }
|
bool getEmbPaletteDelFlag() const { return mFlags & 2; }
|
||||||
@@ -82,7 +83,7 @@ public:
|
|||||||
int getTlutName() const { return mTlutName; }
|
int getTlutName() const { return mTlutName; }
|
||||||
bool operator==(const JUTTexture& other) {
|
bool operator==(const JUTTexture& other) {
|
||||||
return mTexInfo == other.mTexInfo
|
return mTexInfo == other.mTexInfo
|
||||||
&& field_0x2c == other.field_0x2c
|
&& mPalette == other.mPalette
|
||||||
&& mWrapS == other.mWrapS
|
&& mWrapS == other.mWrapS
|
||||||
&& mWrapT == other.mWrapT
|
&& mWrapT == other.mWrapT
|
||||||
&& mMinFilter == other.mMinFilter
|
&& mMinFilter == other.mMinFilter
|
||||||
@@ -100,7 +101,7 @@ private:
|
|||||||
/* 0x20 */ const ResTIMG* mTexInfo;
|
/* 0x20 */ const ResTIMG* mTexInfo;
|
||||||
/* 0x24 */ void* mTexData;
|
/* 0x24 */ void* mTexData;
|
||||||
/* 0x28 */ JUTPalette* mEmbPalette;
|
/* 0x28 */ JUTPalette* mEmbPalette;
|
||||||
/* 0x2C */ JUTPalette* field_0x2c;
|
/* 0x2C */ JUTPalette* mPalette;
|
||||||
/* 0x30 */ u8 mWrapS;
|
/* 0x30 */ u8 mWrapS;
|
||||||
/* 0x31 */ u8 mWrapT;
|
/* 0x31 */ u8 mWrapT;
|
||||||
/* 0x32 */ u8 mMinFilter;
|
/* 0x32 */ u8 mMinFilter;
|
||||||
|
|||||||
@@ -97,6 +97,16 @@ s32 J3DModel::entryModelData(J3DModelData* pModelData, u32 mdlFlags, u32 mtxNum)
|
|||||||
return kJ3DError_Success;
|
return kJ3DError_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void J3DModel::interp_callback(bool isSimFrame, void* pUserWork) {
|
||||||
|
J3DModel* i_this = static_cast<J3DModel*>(pUserWork);
|
||||||
|
if (!isSimFrame) {
|
||||||
|
i_this->calcMaterial();
|
||||||
|
i_this->diff();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
s32 J3DModel::createShapePacket(J3DModelData* pModelData) {
|
s32 J3DModel::createShapePacket(J3DModelData* pModelData) {
|
||||||
J3D_ASSERTMSG(173, pModelData != NULL, "Error : null pointer.");
|
J3D_ASSERTMSG(173, pModelData != NULL, "Error : null pointer.");
|
||||||
|
|
||||||
@@ -452,11 +462,11 @@ void J3DModel::calc() {
|
|||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
for (u16 i = 0; i < mModelData->getJointNum(); ++i) {
|
for (u16 i = 0; i < mModelData->getJointNum(); ++i) {
|
||||||
dusk::frame_interp::record_final_mtx_raw(reinterpret_cast<const Mtx*>(getAnmMtx(i)), getAnmMtx(i));
|
dusk::frame_interp::record_final_mtx(getAnmMtx(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u16 i = 0; i < mModelData->getWEvlpMtxNum(); ++i) {
|
for (u16 i = 0; i < mModelData->getWEvlpMtxNum(); ++i) {
|
||||||
dusk::frame_interp::record_final_mtx_raw(reinterpret_cast<const Mtx*>(getWeightAnmMtx(i)), getWeightAnmMtx(i));
|
dusk::frame_interp::record_final_mtx(getWeightAnmMtx(i));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -485,6 +495,11 @@ void J3DModel::entry() {
|
|||||||
joint->entryIn();
|
joint->entryIn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
if (mModelData->needsInterpCallBack())
|
||||||
|
dusk::frame_interp::add_interpolation_callback(&J3DModel::interp_callback, this);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void J3DModel::viewCalc() {
|
void J3DModel::viewCalc() {
|
||||||
@@ -496,7 +511,7 @@ void J3DModel::viewCalc() {
|
|||||||
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
||||||
(MtxP)&mInternalView);
|
(MtxP)&mInternalView);
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
dusk::frame_interp::record_final_mtx_raw(&mInternalView, mInternalView);
|
dusk::frame_interp::record_final_mtx(mInternalView);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
} else if (isCpuSkinningOn()) {
|
} else if (isCpuSkinningOn()) {
|
||||||
@@ -504,7 +519,7 @@ void J3DModel::viewCalc() {
|
|||||||
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
||||||
(MtxP)&mInternalView);
|
(MtxP)&mInternalView);
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
dusk::frame_interp::record_final_mtx_raw(&mInternalView, mInternalView);
|
dusk::frame_interp::record_final_mtx(mInternalView);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
} else if (checkFlag(J3DMdlFlag_SkinPosCpu)) {
|
} else if (checkFlag(J3DMdlFlag_SkinPosCpu)) {
|
||||||
@@ -528,7 +543,7 @@ void J3DModel::viewCalc() {
|
|||||||
|
|
||||||
#ifdef TARGET_PC
|
#ifdef TARGET_PC
|
||||||
for (u16 i = 0; i < mModelData->getDrawMtxNum(); ++i) {
|
for (u16 i = 0; i < mModelData->getDrawMtxNum(); ++i) {
|
||||||
dusk::frame_interp::record_final_mtx_raw(&getDrawMtxPtr()[i], getDrawMtxPtr()[i]);
|
dusk::frame_interp::record_final_mtx(getDrawMtxPtr()[i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,15 @@ void J3DModelData::simpleCalcMaterial(u16 idx, Mtx param_1) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
bool J3DModelData::needsInterpCallBack() const {
|
||||||
|
for (u16 i = 0, n = getMaterialNum(); i < n; i++)
|
||||||
|
if (getMaterialNodePointer(i)->needsInterpCallBack())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void J3DModelData::syncJ3DSysPointers() const {
|
void J3DModelData::syncJ3DSysPointers() const {
|
||||||
j3dSys.setTexture(getTexture());
|
j3dSys.setTexture(getTexture());
|
||||||
j3dSys.setVtxPos(getVtxPosArray(), getVtxNum());
|
j3dSys.setVtxPos(getVtxPosArray(), getVtxNum());
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ void J3DMaterial::diff(u32 diffFlags) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void J3DMaterial::calc(f32 const (*param_0)[4]) {
|
void J3DMaterial::calc(f32 const (*param_0)[4]) {
|
||||||
if (j3dSys.checkFlag(0x40000000)) {
|
if (j3dSys.checkFlag(J3DSysFlag_PostTexMtx)) {
|
||||||
mTexGenBlock->calcPostTexMtx(param_0);
|
mTexGenBlock->calcPostTexMtx(param_0);
|
||||||
} else {
|
} else {
|
||||||
mTexGenBlock->calc(param_0);
|
mTexGenBlock->calc(param_0);
|
||||||
@@ -276,7 +276,7 @@ void J3DMaterial::calc(f32 const (*param_0)[4]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void J3DMaterial::calcDiffTexMtx(f32 const (*param_0)[4]) {
|
void J3DMaterial::calcDiffTexMtx(f32 const (*param_0)[4]) {
|
||||||
if (j3dSys.checkFlag(0x40000000)) {
|
if (j3dSys.checkFlag(J3DSysFlag_PostTexMtx)) {
|
||||||
mTexGenBlock->calcPostTexMtxWithoutViewMtx(param_0);
|
mTexGenBlock->calcPostTexMtxWithoutViewMtx(param_0);
|
||||||
} else {
|
} else {
|
||||||
mTexGenBlock->calcWithoutViewMtx(param_0);
|
mTexGenBlock->calcWithoutViewMtx(param_0);
|
||||||
@@ -288,7 +288,7 @@ void J3DMaterial::setCurrentMtx() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void J3DMaterial::calcCurrentMtx() {
|
void J3DMaterial::calcCurrentMtx() {
|
||||||
if (!j3dSys.checkFlag(0x40000000)) {
|
if (!j3dSys.checkFlag(J3DSysFlag_PostTexMtx)) {
|
||||||
mCurrentMtx.setCurrentTexMtx(
|
mCurrentMtx.setCurrentTexMtx(
|
||||||
getTexCoord(0)->getTexGenMtx(),
|
getTexCoord(0)->getTexGenMtx(),
|
||||||
getTexCoord(1)->getTexGenMtx(),
|
getTexCoord(1)->getTexGenMtx(),
|
||||||
@@ -371,6 +371,30 @@ s32 J3DMaterial::newSingleSharedDisplayList(u32 dlSize) {
|
|||||||
return kJ3DError_Success;
|
return kJ3DError_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
bool J3DMaterial::needsInterpCallBack() const {
|
||||||
|
for (int i = 0, n = getTexGenNum(); i < n; i++) {
|
||||||
|
J3DTexMtx* pTexMtx = mTexGenBlock->getTexMtx(i);
|
||||||
|
if (pTexMtx != NULL) {
|
||||||
|
u32 texMtxMode = pTexMtx->getTexMtxInfo().mInfo & 0x3f;
|
||||||
|
|
||||||
|
// uses j3dSys.getViewMtx()
|
||||||
|
switch (texMtxMode) {
|
||||||
|
case J3DTexMtxMode_EnvmapBasic:
|
||||||
|
case J3DTexMtxMode_EnvmapOld:
|
||||||
|
case J3DTexMtxMode_Envmap:
|
||||||
|
case J3DTexMtxMode_ProjmapBasic:
|
||||||
|
case J3DTexMtxMode_Projmap:
|
||||||
|
case J3DTexMtxMode_ViewProjmap:
|
||||||
|
case J3DTexMtxMode_ViewProjmapBasic:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void J3DPatchedMaterial::initialize() {
|
void J3DPatchedMaterial::initialize() {
|
||||||
J3DMaterial::initialize();
|
J3DMaterial::initialize();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,9 @@ void loadTexCoordGens(u32 texGenNum, J3DTexCoord* texCoords) {
|
|||||||
var_r28 = 61;
|
var_r28 = 61;
|
||||||
J3DGDWriteXFCmdHdr(GX_XF_REG_DUALTEX0, texGenNum);
|
J3DGDWriteXFCmdHdr(GX_XF_REG_DUALTEX0, texGenNum);
|
||||||
|
|
||||||
if (j3dSys.checkFlag(0x40000000)) {
|
if (j3dSys.checkFlag(J3DSysFlag_PostTexMtx)) {
|
||||||
for (int i = 0; i < texGenNum; i++) {
|
for (int i = 0; i < texGenNum; i++) {
|
||||||
if (texCoords[i].getTexGenMtx() != 60) {
|
if (texCoords[i].getTexGenMtx() != GX_IDENTITY) {
|
||||||
var_r28 = i * 3;
|
var_r28 = i * 3;
|
||||||
} else {
|
} else {
|
||||||
var_r28 = 61;
|
var_r28 = 61;
|
||||||
|
|||||||
@@ -120,11 +120,19 @@ void JAISeqMgr::mixOut() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JAISeq* JAISeqMgr::beginStartSeq_() {
|
JAISeq* JAISeqMgr::beginStartSeq_() {
|
||||||
JAISeq* seq = JKR_NEW JAISeq(this, field_0x10);
|
#ifdef TARGET_PC
|
||||||
|
if (JAISeq::getFreeMemCount() == 0) {
|
||||||
|
JUT_WARN(273, "%s", "JASPoolAllocObject::<JAISeq>::operator new failed .\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return JKR_NEW JAISeq(this, field_0x10);
|
||||||
|
#else
|
||||||
|
JAISeq* seq = new JAISeq(this, field_0x10);
|
||||||
if (seq == NULL) {
|
if (seq == NULL) {
|
||||||
JUT_WARN(273, "%s", "JASPoolAllocObject::<JAISeq>::operator new failed .\n");
|
JUT_WARN(273, "%s", "JASPoolAllocObject::<JAISeq>::operator new failed .\n");
|
||||||
}
|
}
|
||||||
return seq;
|
return seq;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JAISeqMgr::endStartSeq_(JAISeq* seq, JAISoundHandle* handle) {
|
bool JAISeqMgr::endStartSeq_(JAISeq* seq, JAISoundHandle* handle) {
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
#include "JSystem/JSystem.h" // IWYU pragma: keep
|
||||||
|
|
||||||
#include "JSystem/JAudio2/JASChannel.h"
|
#include "JSystem/JAudio2/JASChannel.h"
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/audio/DuskDsp.hpp"
|
||||||
|
#endif
|
||||||
#include "JSystem/JAudio2/JASAiCtrl.h"
|
#include "JSystem/JAudio2/JASAiCtrl.h"
|
||||||
#include "JSystem/JAudio2/JASCalc.h"
|
#include "JSystem/JAudio2/JASCalc.h"
|
||||||
#include "JSystem/JAudio2/JASDriverIF.h"
|
#include "JSystem/JAudio2/JASDriverIF.h"
|
||||||
@@ -170,7 +173,12 @@ void JASChannel::updateEffectorParam(JASDsp::TChannel* i_channel, u16* i_mixerVo
|
|||||||
|
|
||||||
f32 pan = 0.5f;
|
f32 pan = 0.5f;
|
||||||
f32 dolby = 0.0f;
|
f32 dolby = 0.0f;
|
||||||
switch (JASDriver::getOutputMode()) {
|
#if TARGET_PC
|
||||||
|
u32 effectiveOutputMode = dusk::audio::EnableHrtf ? JAS_OUTPUT_SURROUND : JASDriver::getOutputMode();
|
||||||
|
#else
|
||||||
|
u32 effectiveOutputMode = JASDriver::getOutputMode();
|
||||||
|
#endif
|
||||||
|
switch (effectiveOutputMode) {
|
||||||
case JAS_OUTPUT_MONO:
|
case JAS_OUTPUT_MONO:
|
||||||
break;
|
break;
|
||||||
case JAS_OUTPUT_STEREO:
|
case JAS_OUTPUT_STEREO:
|
||||||
|
|||||||
@@ -302,7 +302,6 @@ void JASKernel::setupRootHeap(JKRSolidHeap* heap, u32 size) {
|
|||||||
JKRHEAP_NAME(sSystemHeap, "JASKernel::sSystemHeap");
|
JKRHEAP_NAME(sSystemHeap, "JASKernel::sSystemHeap");
|
||||||
JUT_ASSERT(787, sSystemHeap);
|
JUT_ASSERT(787, sSystemHeap);
|
||||||
sCommandHeap = JKR_NEW_ARGS (heap, 0) JASMemChunkPool<1024, JASThreadingModel::ObjectLevelLockable>;
|
sCommandHeap = JKR_NEW_ARGS (heap, 0) JASMemChunkPool<1024, JASThreadingModel::ObjectLevelLockable>;
|
||||||
JKRHEAP_NAME(sSystemHeap, "JASKernel::sCommandHeap");
|
|
||||||
JUT_ASSERT(790, sCommandHeap);
|
JUT_ASSERT(790, sCommandHeap);
|
||||||
JASDram = heap;
|
JASDram = heap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -442,6 +442,7 @@ static JAUSectionHeap* JAUNewSectionHeap(JKRSolidHeap* heap, bool param_1) {
|
|||||||
JAUSectionHeap* JAUNewSectionHeap(bool param_0) {
|
JAUSectionHeap* JAUNewSectionHeap(bool param_0) {
|
||||||
s32 freeSize = JASDram->getFreeSize();
|
s32 freeSize = JASDram->getFreeSize();
|
||||||
JKRSolidHeap* sectionHeap = JKRCreateSolidHeap(freeSize, JASDram, true);
|
JKRSolidHeap* sectionHeap = JKRCreateSolidHeap(freeSize, JASDram, true);
|
||||||
|
JKRHEAP_NAME(sectionHeap, "sectionHeap");
|
||||||
JUT_ASSERT(821, sectionHeap);
|
JUT_ASSERT(821, sectionHeap);
|
||||||
return JAUNewSectionHeap(sectionHeap, param_0);
|
return JAUNewSectionHeap(sectionHeap, param_0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
#include "dusk/logging.h"
|
#include "dusk/logging.h"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include "dusk/time.h"
|
#include "dusk/time.h"
|
||||||
|
#include "f_op/f_op_overlap_mng.h"
|
||||||
|
|
||||||
#include "SDL3/SDL_timer.h"
|
#include "SDL3/SDL_timer.h"
|
||||||
#include "tracy/Tracy.hpp"
|
#include "tracy/Tracy.hpp"
|
||||||
@@ -219,7 +220,7 @@ void JFWDisplay::endGX() {
|
|||||||
if (dusk::frame_interp::get_ui_tick_pending()) {
|
if (dusk::frame_interp::get_ui_tick_pending()) {
|
||||||
mFader->advance();
|
mFader->advance();
|
||||||
}
|
}
|
||||||
if (mFader->getStatus() != 1) {
|
if (mFader->getStatus() != JUTFader::Wait) {
|
||||||
mFader->draw();
|
mFader->draw();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -368,22 +369,30 @@ constexpr auto FRAME_PERIOD = std::chrono::duration_cast<std::chrono::nanosecond
|
|||||||
std::chrono::duration<double>(1001.0 / 30000.0));
|
std::chrono::duration<double>(1001.0 / 30000.0));
|
||||||
constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2;
|
constexpr auto RETRACE_PERIOD = FRAME_PERIOD / 2;
|
||||||
|
|
||||||
static void waitPrecise(Limiter& limiter, Uint64 targetNs) {
|
static void waitPrecise(Limiter& limiter, Limiter::duration_t targetNs) {
|
||||||
const auto sleepTime = limiter.SleepTime(std::chrono::nanoseconds(targetNs));
|
const auto sleepTime = limiter.SleepTime(targetNs);
|
||||||
dusk::frameUsagePct =
|
dusk::frameUsagePct =
|
||||||
100.0f * (1.0f - static_cast<float>(sleepTime.count()) / static_cast<float>(targetNs));
|
100.0f * (1.0f - static_cast<float>(sleepTime) / static_cast<float>(targetNs));
|
||||||
limiter.Sleep(std::chrono::nanoseconds(targetNs));
|
limiter.Sleep(targetNs);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void waitForTick(u32 p1, u16 p2) {
|
static void waitForTick(u32 p1, u16 p2) {
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
if (dusk::getSettings().game.enableFrameInterpolation && !dusk::getTransientSettings().skipFrameRateLimit) {
|
if (dusk::getSettings().game.enableFrameInterpolation && !dusk::getTransientSettings().skipFrameRateLimit) {
|
||||||
|
dusk::frameUsagePct = 0.f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (dusk::getTransientSettings().skipFrameRateLimit) {
|
if (dusk::getTransientSettings().skipFrameRateLimit) {
|
||||||
p1 = OS_TIMER_CLOCK / 120;
|
p1 = OS_TIMER_CLOCK / 120;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
if (fopOvlpM_IsPeek() && dusk::getTransientSettings().stateShareLoadActive) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ZoneScopedC(tracy::Color::DimGray);
|
ZoneScopedC(tracy::Color::DimGray);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -222,16 +222,11 @@ void* JKRExpHeap::do_alloc(u32 size, int alignment) {
|
|||||||
OSReport_Error("Free block list as follows:\n");
|
OSReport_Error("Free block list as follows:\n");
|
||||||
OSReport_Error("Start | End | Size \n");
|
OSReport_Error("Start | End | Size \n");
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for (const CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
|
for (const CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
|
||||||
if (block->mMagic) {
|
if (block->mMagic) {
|
||||||
// Allocated, ignore.
|
// Allocated, ignore.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (i++ > 10) {
|
|
||||||
OSReport_Error("<more>\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto blockStart = (uintptr_t)block - (uintptr_t)mStart;
|
auto blockStart = (uintptr_t)block - (uintptr_t)mStart;
|
||||||
auto blockEnd = (uintptr_t)block + block->size - (uintptr_t)mStart;
|
auto blockEnd = (uintptr_t)block + block->size - (uintptr_t)mStart;
|
||||||
@@ -239,6 +234,14 @@ void* JKRExpHeap::do_alloc(u32 size, int alignment) {
|
|||||||
OSReport_Error("%08X | %08X | %08X\n", (u32) blockStart, (u32) blockEnd, (u32) blockSize);
|
OSReport_Error("%08X | %08X | %08X\n", (u32) blockStart, (u32) blockEnd, (u32) blockSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OSReport_Error("Child heaps as follows:\n");
|
||||||
|
OSReport_Error("Start | End | Name \n");
|
||||||
|
|
||||||
|
const JSUTree<JKRHeap>& tree = getHeapTree();
|
||||||
|
for (JSUTreeIterator iter(tree.getFirstChild()); iter != tree.getEndChild(); ++iter) {
|
||||||
|
OSReport_Error("%08X | %08X | %s\n", iter->getStartAddr(), iter->getEndAddr(), iter->getName());
|
||||||
|
}
|
||||||
|
|
||||||
CRASH("Aborting due to allocation failure!");
|
CRASH("Aborting due to allocation failure!");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -9,6 +9,9 @@
|
|||||||
#include <mtx.h>
|
#include <mtx.h>
|
||||||
#include <gx.h>
|
#include <gx.h>
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/frame_interpolation.h"
|
||||||
|
#endif
|
||||||
#include "tracy/Tracy.hpp"
|
#include "tracy/Tracy.hpp"
|
||||||
|
|
||||||
void JPASetPointSize(JPAEmitterWorkData* work) {
|
void JPASetPointSize(JPAEmitterWorkData* work) {
|
||||||
@@ -418,50 +421,95 @@ static projectionFunc p_prj[3] = {
|
|||||||
loadPrjAnm,
|
loadPrjAnm,
|
||||||
};
|
};
|
||||||
|
|
||||||
void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
#if TARGET_PC
|
||||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
void JPAInterpBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
Mtx ptclPosMtx;
|
||||||
|
MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z);
|
||||||
|
dusk::frame_interp::record_final_mtx(ptclPosMtx, ptcl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JPAInterpRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
Mtx ptclPosMtx;
|
||||||
|
f32 sinRot = JMASSin(ptcl->mRotateAngle);
|
||||||
|
f32 cosRot = JMASCos(ptcl->mRotateAngle);
|
||||||
|
MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z);
|
||||||
|
ptclPosMtx[0][0] = cosRot;
|
||||||
|
ptclPosMtx[0][1] = -sinRot;
|
||||||
|
ptclPosMtx[1][0] = sinRot;
|
||||||
|
ptclPosMtx[1][1] = cosRot;
|
||||||
|
dusk::frame_interp::record_final_mtx(ptclPosMtx, ptcl);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JGeometry::TVec3<f32> local_48;
|
JGeometry::TVec3<f32> pos;
|
||||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
#if TARGET_PC
|
||||||
Mtx local_38;
|
Mtx ptclPosMtx;
|
||||||
local_38[0][0] = work->mGlobalPtclScl.x * param_1->mParticleScaleX;
|
if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||||
local_38[0][3] = local_48.x;
|
pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]);
|
||||||
local_38[1][1] = work->mGlobalPtclScl.y * param_1->mParticleScaleY;
|
MTXMultVec(work->mPosCamMtx, &pos, &pos);
|
||||||
local_38[1][3] = local_48.y;
|
} else
|
||||||
local_38[2][2] = 1.0f;
|
#endif
|
||||||
local_38[2][3] = local_48.z;
|
{
|
||||||
local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f;
|
MTXMultVec(work->mPosCamMtx, &ptcl->mPosition, &pos);
|
||||||
GXLoadPosMtxImm(local_38, 0);
|
}
|
||||||
p_prj[work->mPrjType](work, local_38);
|
Mtx posMtx;
|
||||||
|
posMtx[0][0] = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
|
posMtx[0][3] = pos.x;
|
||||||
|
posMtx[1][1] = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
posMtx[1][3] = pos.y;
|
||||||
|
posMtx[2][2] = 1.0f;
|
||||||
|
posMtx[2][3] = pos.z;
|
||||||
|
posMtx[0][1] = posMtx[0][2] = posMtx[1][0] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f;
|
||||||
|
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||||
|
p_prj[work->mPrjType](work, posMtx);
|
||||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||||
}
|
}
|
||||||
|
|
||||||
void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JGeometry::TVec3<f32> local_48;
|
if (work->mpRes->getUsrIdx() == 0x89d7) {
|
||||||
MTXMultVec(work->mPosCamMtx, ¶m_1->mPosition, &local_48);
|
int a = 0;
|
||||||
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
}
|
||||||
f32 cosRot = JMASCos(param_1->mRotateAngle);
|
|
||||||
f32 particleX = work->mGlobalPtclScl.x * param_1->mParticleScaleX;
|
|
||||||
f32 particleY = work->mGlobalPtclScl.y * param_1->mParticleScaleY;
|
|
||||||
|
|
||||||
Mtx local_38;
|
JGeometry::TVec3<f32> pos;
|
||||||
local_38[0][0] = cosRot * particleX;
|
f32 sinRot, cosRot;
|
||||||
local_38[0][1] = -sinRot * particleY;
|
#if TARGET_PC
|
||||||
local_38[0][3] = local_48.x;
|
Mtx ptclPosMtx;
|
||||||
local_38[1][0] = sinRot * particleX;
|
MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z);
|
||||||
local_38[1][1] = cosRot * particleY;
|
if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||||
local_38[1][3] = local_48.y;
|
pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]);
|
||||||
local_38[2][2] = 1.0f;
|
sinRot = ptclPosMtx[1][0];
|
||||||
local_38[2][3] = local_48.z;
|
cosRot = ptclPosMtx[0][0];
|
||||||
local_38[0][2] = local_38[1][2] = local_38[2][0] = local_38[2][1] = 0.0f;
|
MTXMultVec(work->mPosCamMtx, &pos, &pos);
|
||||||
GXLoadPosMtxImm(local_38, 0);
|
} else
|
||||||
p_prj[work->mPrjType](work, local_38);
|
#endif
|
||||||
|
{
|
||||||
|
MTXMultVec(work->mPosCamMtx, &ptcl->mPosition, &pos);
|
||||||
|
sinRot = JMASSin(ptcl->mRotateAngle);
|
||||||
|
cosRot = JMASCos(ptcl->mRotateAngle);
|
||||||
|
}
|
||||||
|
f32 particleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
|
f32 particleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
Mtx posMtx;
|
||||||
|
posMtx[0][0] = cosRot * particleX;
|
||||||
|
posMtx[0][1] = -sinRot * particleY;
|
||||||
|
posMtx[0][3] = pos.x;
|
||||||
|
posMtx[1][0] = sinRot * particleX;
|
||||||
|
posMtx[1][1] = cosRot * particleY;
|
||||||
|
posMtx[1][3] = pos.y;
|
||||||
|
posMtx[2][2] = 1.0f;
|
||||||
|
posMtx[2][3] = pos.z;
|
||||||
|
posMtx[0][2] = posMtx[1][2] = posMtx[2][0] = posMtx[2][1] = 0.0f;
|
||||||
|
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||||
|
p_prj[work->mPrjType](work, posMtx);
|
||||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,7 +532,7 @@ void JPADrawYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
|||||||
local_38[2][2] = work->mYBBCamMtx[2][2];
|
local_38[2][2] = work->mYBBCamMtx[2][2];
|
||||||
local_38[2][3] = local_48.z;
|
local_38[2][3] = local_48.z;
|
||||||
local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[2][0] = 0.0f;
|
local_38[0][1] = local_38[0][2] = local_38[1][0] = local_38[2][0] = 0.0f;
|
||||||
GXLoadPosMtxImm(local_38, 0);
|
GXLoadPosMtxImm(local_38, GX_PNMTX0);
|
||||||
p_prj[work->mPrjType](work, local_38);
|
p_prj[work->mPrjType](work, local_38);
|
||||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||||
}
|
}
|
||||||
@@ -517,7 +565,7 @@ void JPADrawRotYBillboard(JPAEmitterWorkData* work, JPABaseParticle* param_1) {
|
|||||||
local_38[2][1] = local_94 * fVar1;
|
local_38[2][1] = local_94 * fVar1;
|
||||||
local_38[2][2] = local_90;
|
local_38[2][2] = local_90;
|
||||||
local_38[2][3] = local_48.z;
|
local_38[2][3] = local_48.z;
|
||||||
GXLoadPosMtxImm(local_38, 0);
|
GXLoadPosMtxImm(local_38, GX_PNMTX0);
|
||||||
p_prj[work->mPrjType](work, local_38);
|
p_prj[work->mPrjType](work, local_38);
|
||||||
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
GXCallDisplayList(jpa_dl, sizeof(jpa_dl));
|
||||||
}
|
}
|
||||||
@@ -681,103 +729,197 @@ static u8* p_dl[2] = {
|
|||||||
jpa_dl_x,
|
jpa_dl_x,
|
||||||
};
|
};
|
||||||
|
|
||||||
void JPADrawDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
#if TARGET_PC
|
||||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
void JPAInterpDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
JGeometry::TVec3<f32> axisY;
|
||||||
|
JGeometry::TVec3<f32> axisZ;
|
||||||
|
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||||
|
|
||||||
|
if (axisY.isZero()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
axisY.normalize();
|
||||||
|
axisZ.cross(ptcl->mBaseAxis, axisY);
|
||||||
|
|
||||||
JGeometry::TVec3<f32> local_6c;
|
if (axisZ.isZero()) {
|
||||||
JGeometry::TVec3<f32> local_78;
|
|
||||||
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
|
|
||||||
|
|
||||||
if (local_6c.isZero()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
local_6c.normalize();
|
axisZ.normalize();
|
||||||
local_78.cross(param_1->mBaseAxis, local_6c);
|
ptcl->mBaseAxis.cross(axisY, axisZ);
|
||||||
|
ptcl->mBaseAxis.normalize();
|
||||||
if (local_78.isZero()) {
|
Mtx posMtx;
|
||||||
return;
|
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
}
|
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
posMtx[0][0] = ptcl->mBaseAxis.x;
|
||||||
local_78.normalize();
|
posMtx[0][1] = axisY.x;
|
||||||
param_1->mBaseAxis.cross(local_6c, local_78);
|
posMtx[0][2] = axisZ.x;
|
||||||
param_1->mBaseAxis.normalize();
|
posMtx[0][3] = ptcl->mPosition.x;
|
||||||
Mtx local_60;
|
posMtx[1][0] = ptcl->mBaseAxis.y;
|
||||||
f32 fVar1 = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX;
|
posMtx[1][1] = axisY.y;
|
||||||
f32 fVar2 = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY;
|
posMtx[1][2] = axisZ.y;
|
||||||
local_60[0][0] = param_1->mBaseAxis.x;
|
posMtx[1][3] = ptcl->mPosition.y;
|
||||||
local_60[0][1] = local_6c.x;
|
posMtx[2][0] = ptcl->mBaseAxis.z;
|
||||||
local_60[0][2] = local_78.x;
|
posMtx[2][1] = axisY.z;
|
||||||
local_60[0][3] = param_1->mPosition.x;
|
posMtx[2][2] = axisZ.z;
|
||||||
local_60[1][0] = param_1->mBaseAxis.y;
|
posMtx[2][3] = ptcl->mPosition.z;
|
||||||
local_60[1][1] = local_6c.y;
|
p_plane[work->mPlaneType](posMtx, scaleX, scaleY);
|
||||||
local_60[1][2] = local_78.y;
|
dusk::frame_interp::record_final_mtx(posMtx, ptcl);
|
||||||
local_60[1][3] = param_1->mPosition.y;
|
|
||||||
local_60[2][0] = param_1->mBaseAxis.z;
|
|
||||||
local_60[2][1] = local_6c.z;
|
|
||||||
local_60[2][2] = local_78.z;
|
|
||||||
local_60[2][3] = param_1->mPosition.z;
|
|
||||||
p_plane[param_0->mPlaneType](local_60, fVar1, fVar2);
|
|
||||||
MTXConcat(param_0->mPosCamMtx, local_60, local_60);
|
|
||||||
GXLoadPosMtxImm(local_60, 0);
|
|
||||||
p_prj[param_0->mPrjType](param_0, local_60);
|
|
||||||
GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JPADrawRotDirection(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
void JPAInterpRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
if (param_1->checkStatus(JPAPtclStts_Invisible)) {
|
f32 sinRot = JMASSin(ptcl->mRotateAngle);
|
||||||
|
f32 cosRot = JMASCos(ptcl->mRotateAngle);
|
||||||
|
JGeometry::TVec3<f32> axisY;
|
||||||
|
JGeometry::TVec3<f32> axisZ;
|
||||||
|
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||||
|
|
||||||
|
if (axisY.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisY.normalize();
|
||||||
|
axisZ.cross(ptcl->mBaseAxis, axisY);
|
||||||
|
|
||||||
|
if (axisZ.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisZ.normalize();
|
||||||
|
ptcl->mBaseAxis.cross(axisY, axisZ);
|
||||||
|
ptcl->mBaseAxis.normalize();
|
||||||
|
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
|
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
Mtx mtx1;
|
||||||
|
Mtx mtx2;
|
||||||
|
p_rot[work->mRotType](sinRot, cosRot, mtx1);
|
||||||
|
p_plane[work->mPlaneType](mtx1, scaleX, scaleY);
|
||||||
|
mtx2[0][0] = ptcl->mBaseAxis.x;
|
||||||
|
mtx2[0][1] = axisY.x;
|
||||||
|
mtx2[0][2] = axisZ.x;
|
||||||
|
mtx2[0][3] = ptcl->mPosition.x;
|
||||||
|
mtx2[1][0] = ptcl->mBaseAxis.y;
|
||||||
|
mtx2[1][1] = axisY.y;
|
||||||
|
mtx2[1][2] = axisZ.y;
|
||||||
|
mtx2[1][3] = ptcl->mPosition.y;
|
||||||
|
mtx2[2][0] = ptcl->mBaseAxis.z;
|
||||||
|
mtx2[2][1] = axisY.z;
|
||||||
|
mtx2[2][2] = axisZ.z;
|
||||||
|
mtx2[2][3] = ptcl->mPosition.z;
|
||||||
|
MTXConcat(mtx2, mtx1, mtx1);
|
||||||
|
dusk::frame_interp::record_final_mtx(mtx1, ptcl);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZoneScoped;
|
ZoneScoped;
|
||||||
|
|
||||||
f32 sinRot = JMASSin(param_1->mRotateAngle);
|
Mtx posMtx;
|
||||||
f32 cosRot = JMASCos(param_1->mRotateAngle);
|
#if TARGET_PC
|
||||||
JGeometry::TVec3<f32> local_6c;
|
if (!dusk::frame_interp::lookup_replacement(ptcl, posMtx))
|
||||||
JGeometry::TVec3<f32> local_78;
|
#endif
|
||||||
p_direction[param_0->mDirType](param_0, param_1, &local_6c);
|
{
|
||||||
|
JGeometry::TVec3<f32> axisY;
|
||||||
|
JGeometry::TVec3<f32> axisZ;
|
||||||
|
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||||
|
|
||||||
if (local_6c.isZero()) {
|
if (axisY.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisY.normalize();
|
||||||
|
axisZ.cross(ptcl->mBaseAxis, axisY);
|
||||||
|
|
||||||
|
if (axisZ.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisZ.normalize();
|
||||||
|
ptcl->mBaseAxis.cross(axisY, axisZ);
|
||||||
|
ptcl->mBaseAxis.normalize();
|
||||||
|
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
|
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
posMtx[0][0] = ptcl->mBaseAxis.x;
|
||||||
|
posMtx[0][1] = axisY.x;
|
||||||
|
posMtx[0][2] = axisZ.x;
|
||||||
|
posMtx[0][3] = ptcl->mPosition.x;
|
||||||
|
posMtx[1][0] = ptcl->mBaseAxis.y;
|
||||||
|
posMtx[1][1] = axisY.y;
|
||||||
|
posMtx[1][2] = axisZ.y;
|
||||||
|
posMtx[1][3] = ptcl->mPosition.y;
|
||||||
|
posMtx[2][0] = ptcl->mBaseAxis.z;
|
||||||
|
posMtx[2][1] = axisY.z;
|
||||||
|
posMtx[2][2] = axisZ.z;
|
||||||
|
posMtx[2][3] = ptcl->mPosition.z;
|
||||||
|
p_plane[work->mPlaneType](posMtx, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
MTXConcat(work->mPosCamMtx, posMtx, posMtx);
|
||||||
|
GXLoadPosMtxImm(posMtx, GX_PNMTX0);
|
||||||
|
p_prj[work->mPrjType](work, posMtx);
|
||||||
|
GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl));
|
||||||
|
}
|
||||||
|
|
||||||
|
void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||||
|
if (ptcl->checkStatus(JPAPtclStts_Invisible)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
local_6c.normalize();
|
ZoneScoped;
|
||||||
local_78.cross(param_1->mBaseAxis, local_6c);
|
|
||||||
|
|
||||||
if (local_78.isZero()) {
|
Mtx mtx1;
|
||||||
return;
|
Mtx mtx2;
|
||||||
|
#if TARGET_PC
|
||||||
|
if (!dusk::frame_interp::lookup_replacement(ptcl, mtx1))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
f32 sinRot = JMASSin(ptcl->mRotateAngle);
|
||||||
|
f32 cosRot = JMASCos(ptcl->mRotateAngle);
|
||||||
|
JGeometry::TVec3<f32> axisY;
|
||||||
|
JGeometry::TVec3<f32> axisZ;
|
||||||
|
p_direction[work->mDirType](work, ptcl, &axisY);
|
||||||
|
|
||||||
|
if (axisY.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisY.normalize();
|
||||||
|
axisZ.cross(ptcl->mBaseAxis, axisY);
|
||||||
|
|
||||||
|
if (axisZ.isZero()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
axisZ.normalize();
|
||||||
|
ptcl->mBaseAxis.cross(axisY, axisZ);
|
||||||
|
ptcl->mBaseAxis.normalize();
|
||||||
|
f32 scaleX = work->mGlobalPtclScl.x * ptcl->mParticleScaleX;
|
||||||
|
f32 scaleY = work->mGlobalPtclScl.y * ptcl->mParticleScaleY;
|
||||||
|
p_rot[work->mRotType](sinRot, cosRot, mtx1);
|
||||||
|
p_plane[work->mPlaneType](mtx1, scaleX, scaleY);
|
||||||
|
mtx2[0][0] = ptcl->mBaseAxis.x;
|
||||||
|
mtx2[0][1] = axisY.x;
|
||||||
|
mtx2[0][2] = axisZ.x;
|
||||||
|
mtx2[0][3] = ptcl->mPosition.x;
|
||||||
|
mtx2[1][0] = ptcl->mBaseAxis.y;
|
||||||
|
mtx2[1][1] = axisY.y;
|
||||||
|
mtx2[1][2] = axisZ.y;
|
||||||
|
mtx2[1][3] = ptcl->mPosition.y;
|
||||||
|
mtx2[2][0] = ptcl->mBaseAxis.z;
|
||||||
|
mtx2[2][1] = axisY.z;
|
||||||
|
mtx2[2][2] = axisZ.z;
|
||||||
|
mtx2[2][3] = ptcl->mPosition.z;
|
||||||
|
MTXConcat(mtx2, mtx1, mtx1);
|
||||||
}
|
}
|
||||||
|
MTXConcat(work->mPosCamMtx, mtx1, mtx2);
|
||||||
local_78.normalize();
|
GXLoadPosMtxImm(mtx2, GX_PNMTX0);
|
||||||
param_1->mBaseAxis.cross(local_6c, local_78);
|
p_prj[work->mPrjType](work, mtx2);
|
||||||
param_1->mBaseAxis.normalize();
|
GXCallDisplayList(p_dl[work->mDLType], sizeof(jpa_dl));
|
||||||
f32 particleX = param_0->mGlobalPtclScl.x * param_1->mParticleScaleX;
|
|
||||||
f32 particleY = param_0->mGlobalPtclScl.y * param_1->mParticleScaleY;
|
|
||||||
Mtx auStack_80;
|
|
||||||
Mtx local_60;
|
|
||||||
p_rot[param_0->mRotType](sinRot, cosRot, auStack_80);
|
|
||||||
p_plane[param_0->mPlaneType](auStack_80, particleX, particleY);
|
|
||||||
local_60[0][0] = param_1->mBaseAxis.x;
|
|
||||||
local_60[0][1] = local_6c.x;
|
|
||||||
local_60[0][2] = local_78.x;
|
|
||||||
local_60[0][3] = param_1->mPosition.x;
|
|
||||||
local_60[1][0] = param_1->mBaseAxis.y;
|
|
||||||
local_60[1][1] = local_6c.y;
|
|
||||||
local_60[1][2] = local_78.y;
|
|
||||||
local_60[1][3] = param_1->mPosition.y;
|
|
||||||
local_60[2][0] = param_1->mBaseAxis.z;
|
|
||||||
local_60[2][1] = local_6c.z;
|
|
||||||
local_60[2][2] = local_78.z;
|
|
||||||
local_60[2][3] = param_1->mPosition.z;
|
|
||||||
MTXConcat(local_60, auStack_80, auStack_80);
|
|
||||||
MTXConcat(param_0->mPosCamMtx, auStack_80, local_60);
|
|
||||||
GXLoadPosMtxImm(local_60, 0);
|
|
||||||
p_prj[param_0->mPrjType](param_0, local_60);
|
|
||||||
GXCallDisplayList(p_dl[param_0->mDLType], sizeof(jpa_dl));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
void JPADrawDBillboard(JPAEmitterWorkData* param_0, JPABaseParticle* param_1) {
|
||||||
|
|||||||
@@ -204,6 +204,28 @@ void JPABaseParticle::init_c(JPAEmitterWorkData* work, JPABaseParticle* parent)
|
|||||||
mTexAnmIdx = 0;
|
mTexAnmIdx = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void JPABaseParticle::interp(JPAEmitterWorkData* work, void const* drawFunc) {
|
||||||
|
static bool enable = false;
|
||||||
|
if (!enable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// don't interpolate the first frame
|
||||||
|
if (mAge == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (drawFunc == JPADrawBillboard) {
|
||||||
|
JPAInterpBillboard(work, this);
|
||||||
|
} else if (drawFunc == JPADrawRotBillboard) {
|
||||||
|
JPAInterpRotBillboard(work, this);
|
||||||
|
} else if (drawFunc == JPADrawDirection) {
|
||||||
|
JPAInterpDirection(work, this);
|
||||||
|
} else if (drawFunc == JPADrawRotDirection) {
|
||||||
|
JPAInterpRotDirection(work, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool JPABaseParticle::calc_p(JPAEmitterWorkData* work) {
|
bool JPABaseParticle::calc_p(JPAEmitterWorkData* work) {
|
||||||
if (++mAge >= mLifeTime) {
|
if (++mAge >= mLifeTime) {
|
||||||
return true;
|
return true;
|
||||||
@@ -247,6 +269,17 @@ bool JPABaseParticle::calc_p(JPAEmitterWorkData* work) {
|
|||||||
mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y,
|
mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y,
|
||||||
mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z);
|
mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
JPABaseShape* pBsp = work->mpRes->getBsp();
|
||||||
|
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX();
|
||||||
|
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY();
|
||||||
|
work->mDirType = pBsp->getDirType();
|
||||||
|
work->mRotType = pBsp->getRotType();
|
||||||
|
work->mDLType = pBsp->getType() == 4 || pBsp->getType() == 8;
|
||||||
|
work->mPlaneType = work->mDLType ? 2 : pBsp->getBasePlaneType();
|
||||||
|
interp(work, (void const*)work->mpRes->mpDrawParticleFuncList[0]);
|
||||||
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,6 +322,23 @@ bool JPABaseParticle::calc_c(JPAEmitterWorkData* work) {
|
|||||||
mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y,
|
mOffsetPosition.y + mLocalPosition.y * work->mPublicScale.y,
|
||||||
mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z);
|
mOffsetPosition.z + mLocalPosition.z * work->mPublicScale.z);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
JPABaseShape* pBsp = work->mpRes->getBsp();
|
||||||
|
JPAChildShape* pCsp = work->mpRes->getCsp();
|
||||||
|
if (pCsp->isScaleInherited()) {
|
||||||
|
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pBsp->getBaseSizeX();
|
||||||
|
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pBsp->getBaseSizeY();
|
||||||
|
} else {
|
||||||
|
work->mGlobalPtclScl.x = work->mpEmtr->mGlobalPScl.x * pCsp->getScaleX();
|
||||||
|
work->mGlobalPtclScl.y = work->mpEmtr->mGlobalPScl.y * pCsp->getScaleY();
|
||||||
|
}
|
||||||
|
work->mDirType = pCsp->getDirType();
|
||||||
|
work->mRotType = pCsp->getRotType();
|
||||||
|
work->mDLType = pCsp->getType() == 4 || pCsp->getType() == 8;
|
||||||
|
work->mPlaneType = work->mDLType ? 2 : pCsp->getBasePlaneType();
|
||||||
|
interp(work, (void const*)work->mpRes->mpDrawParticleChildFuncList[0]);
|
||||||
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,51 +10,51 @@
|
|||||||
|
|
||||||
JUTFader::JUTFader(int x, int y, int width, int height, JUtility::TColor pColor)
|
JUTFader::JUTFader(int x, int y, int width, int height, JUtility::TColor pColor)
|
||||||
: mColor(pColor), mBox(x, y, x + width, y + height) {
|
: mColor(pColor), mBox(x, y, x + width, y + height) {
|
||||||
mStatus = 0;
|
mStatus = None;
|
||||||
field_0x8 = 0;
|
mDuration = 0;
|
||||||
field_0xa = 0;
|
mTimer = 0;
|
||||||
field_0x24 = 0;
|
mNextStatus = 0;
|
||||||
mEStatus = UNKSTATUS_M1;
|
mStatusTimer = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JUTFader::advance() {
|
void JUTFader::advance() {
|
||||||
if (0 <= mEStatus && mEStatus-- == 0) {
|
if (0 <= mStatusTimer && mStatusTimer-- == 0) {
|
||||||
mStatus = field_0x24;
|
mStatus = mNextStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mStatus == 1) {
|
if (mStatus == Wait) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mStatus) {
|
switch (mStatus) {
|
||||||
case 0:
|
case None:
|
||||||
mColor.a = 0xFF;
|
mColor.a = 0xFF;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case FadeIn:
|
||||||
#if AVOID_UB
|
#if AVOID_UB
|
||||||
if (field_0x8 == 0) {
|
if (mDuration == 0) {
|
||||||
mStatus = 1;
|
mStatus = Wait;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mColor.a = 0xFF - ((++field_0xa * 0xFF) / field_0x8);
|
mColor.a = 0xFF - ((++mTimer * 0xFF) / mDuration);
|
||||||
|
|
||||||
if (field_0xa >= field_0x8) {
|
if (mTimer >= mDuration) {
|
||||||
mStatus = 1;
|
mStatus = Wait;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 3:
|
case FadeOut:
|
||||||
#if AVOID_UB
|
#if AVOID_UB
|
||||||
if (field_0x8 == 0) {
|
if (mDuration == 0) {
|
||||||
mStatus = 0;
|
mStatus = None;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mColor.a = ((++field_0xa * 0xFF) / field_0x8);
|
mColor.a = ((++mTimer * 0xFF) / mDuration);
|
||||||
|
|
||||||
if (field_0xa >= field_0x8) {
|
if (mTimer >= mDuration) {
|
||||||
mStatus = 0;
|
mStatus = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -77,53 +77,53 @@ void JUTFader::draw() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JUTFader::startFadeIn(int param_0) {
|
bool JUTFader::startFadeIn(int duration) {
|
||||||
bool statusCheck = mStatus == 0;
|
bool statusCheck = mStatus == 0;
|
||||||
|
|
||||||
if (statusCheck) {
|
if (statusCheck) {
|
||||||
mStatus = 2;
|
mStatus = FadeIn;
|
||||||
field_0xa = 0;
|
mTimer = 0;
|
||||||
field_0x8 = param_0;
|
mDuration = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
return statusCheck;
|
return statusCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JUTFader::startFadeOut(int param_0) {
|
bool JUTFader::startFadeOut(int duration) {
|
||||||
bool statusCheck = mStatus == 1;
|
bool statusCheck = mStatus == 1;
|
||||||
|
|
||||||
if (statusCheck) {
|
if (statusCheck) {
|
||||||
mStatus = 3;
|
mStatus = FadeOut;
|
||||||
field_0xa = 0;
|
mTimer = 0;
|
||||||
field_0x8 = param_0;
|
mDuration = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
return statusCheck;
|
return statusCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
void JUTFader::setStatus(JUTFader::EStatus i_status, int param_1) {
|
void JUTFader::setStatus(JUTFader::EStatus i_status, int timer) {
|
||||||
switch (i_status) {
|
switch (i_status) {
|
||||||
case 0:
|
case None:
|
||||||
if (param_1 != 0) {
|
if (timer != 0) {
|
||||||
field_0x24 = 0;
|
mNextStatus = None;
|
||||||
mEStatus = param_1;
|
mStatusTimer = timer;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mStatus = 0;
|
mStatus = None;
|
||||||
field_0x24 = 0;
|
mNextStatus = None;
|
||||||
mEStatus = 0;
|
mStatusTimer = 0;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case Wait:
|
||||||
if (param_1 != 0) {
|
if (timer != 0) {
|
||||||
field_0x24 = 1;
|
mNextStatus = Wait;
|
||||||
mEStatus = param_1;
|
mStatusTimer = timer;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mStatus = 1;
|
mStatus = Wait;
|
||||||
field_0x24 = 1;
|
mNextStatus = Wait;
|
||||||
mEStatus = 0;
|
mStatusTimer = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ BOOL JUTGamePad::init() {
|
|||||||
void JUTGamePad::clear() {
|
void JUTGamePad::clear() {
|
||||||
mButtonReset.mReset = false;
|
mButtonReset.mReset = false;
|
||||||
field_0xa8 = 1;
|
field_0xa8 = 1;
|
||||||
|
#if TARGET_PC
|
||||||
|
mResetHoldFrameCount = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PADStatus JUTGamePad::mPadStatus[4];
|
PADStatus JUTGamePad::mPadStatus[4];
|
||||||
@@ -219,11 +222,19 @@ void JUTGamePad::update() {
|
|||||||
mButtonReset.mReset = false;
|
mButtonReset.mReset = false;
|
||||||
} else if (!JUTGamePad::C3ButtonReset::sResetOccurred) {
|
} else if (!JUTGamePad::C3ButtonReset::sResetOccurred) {
|
||||||
if (mButtonReset.mReset == true) {
|
if (mButtonReset.mReset == true) {
|
||||||
|
#if TARGET_PC
|
||||||
|
checkResetCallback(++mResetHoldFrameCount * (OS_TIMER_CLOCK / 30));
|
||||||
|
#else
|
||||||
OSTime hold_time = OSGetTime() - mResetHoldStartTime;
|
OSTime hold_time = OSGetTime() - mResetHoldStartTime;
|
||||||
checkResetCallback(hold_time);
|
checkResetCallback(hold_time);
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
mButtonReset.mReset = true;
|
mButtonReset.mReset = true;
|
||||||
|
#if TARGET_PC
|
||||||
|
mResetHoldFrameCount = 0;
|
||||||
|
#else
|
||||||
mResetHoldStartTime = OSGetTime();
|
mResetHoldStartTime = OSGetTime();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,3 +38,9 @@ bool JUTPalette::load() {
|
|||||||
|
|
||||||
return check;
|
return check;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
void JUTPalette::dataUploaded() {
|
||||||
|
GXInitTlutObjData(&mTlutObj, (void*)mColorTable);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ void JUTTexture::storeTIMG(ResTIMG const* param_0, u8 param_1) {
|
|||||||
mTexData = (void*)((intptr_t)mTexInfo + 0x20);
|
mTexData = (void*)((intptr_t)mTexInfo + 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
field_0x2c = NULL;
|
mPalette = NULL;
|
||||||
mTlutName = 0;
|
mTlutName = 0;
|
||||||
mWrapS = mTexInfo->wrapS;
|
mWrapS = mTexInfo->wrapS;
|
||||||
mWrapT = mTexInfo->wrapT;
|
mWrapT = mTexInfo->wrapT;
|
||||||
@@ -95,7 +95,7 @@ void JUTTexture::storeTIMG(ResTIMG const* param_0, JUTPalette* param_1, GXTlut p
|
|||||||
}
|
}
|
||||||
mEmbPalette = param_1;
|
mEmbPalette = param_1;
|
||||||
setEmbPaletteDelFlag(false);
|
setEmbPaletteDelFlag(false);
|
||||||
field_0x2c = NULL;
|
mPalette = NULL;
|
||||||
if (param_1 != NULL) {
|
if (param_1 != NULL) {
|
||||||
mTlutName = param_2;
|
mTlutName = param_2;
|
||||||
if (param_2 != param_1->getTlutName()) {
|
if (param_2 != param_1->getTlutName()) {
|
||||||
@@ -120,11 +120,11 @@ void JUTTexture::storeTIMG(ResTIMG const* param_0, JUTPalette* param_1, GXTlut p
|
|||||||
void JUTTexture::attachPalette(JUTPalette* param_0) {
|
void JUTTexture::attachPalette(JUTPalette* param_0) {
|
||||||
if (mTexInfo->indexTexture) {
|
if (mTexInfo->indexTexture) {
|
||||||
if (param_0 == NULL && mEmbPalette != NULL) {
|
if (param_0 == NULL && mEmbPalette != NULL) {
|
||||||
field_0x2c = mEmbPalette;
|
mPalette = mEmbPalette;
|
||||||
} else {
|
} else {
|
||||||
field_0x2c = param_0;
|
mPalette = param_0;
|
||||||
}
|
}
|
||||||
initTexObj(field_0x2c->getTlutName());
|
initTexObj(mPalette->getTlutName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,9 +133,9 @@ void JUTTexture::init() {
|
|||||||
initTexObj();
|
initTexObj();
|
||||||
} else {
|
} else {
|
||||||
if (mEmbPalette != NULL) {
|
if (mEmbPalette != NULL) {
|
||||||
field_0x2c = mEmbPalette;
|
mPalette = mEmbPalette;
|
||||||
|
|
||||||
initTexObj(field_0x2c->getTlutName());
|
initTexObj(mPalette->getTlutName());
|
||||||
} else {
|
} else {
|
||||||
OS_REPORT("This texture is CI-Format, but EmbPalette is NULL.\n");
|
OS_REPORT("This texture is CI-Format, but EmbPalette is NULL.\n");
|
||||||
}
|
}
|
||||||
@@ -179,8 +179,8 @@ void JUTTexture::initTexObj(GXTlut param_0) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JUTTexture::load(GXTexMapID param_0) {
|
void JUTTexture::load(GXTexMapID param_0) {
|
||||||
if (field_0x2c) {
|
if (mPalette) {
|
||||||
field_0x2c->load();
|
mPalette->load();
|
||||||
}
|
}
|
||||||
GXLoadTexObj(&mTexObj, param_0);
|
GXLoadTexObj(&mTexObj, param_0);
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 457 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 188 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.3 MiB |
@@ -0,0 +1,147 @@
|
|||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow: visible;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-size: 24dp;
|
||||||
|
color: #FFFFFF;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-root {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 45%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: stretch;
|
||||||
|
decorator: vertical-gradient(#00000000 #151610F2);
|
||||||
|
padding: 48dp 0 40dp 0;
|
||||||
|
filter: opacity(0);
|
||||||
|
transition: filter 0.2s linear-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay-root[open] {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 1216dp;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 24dp;
|
||||||
|
padding: 0 32dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-height: 800dp) {
|
||||||
|
.overlay-root {
|
||||||
|
min-height: 38%;
|
||||||
|
padding: 32dp 0 28dp 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overlay {
|
||||||
|
gap: 16dp;
|
||||||
|
padding: 0 24dp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
gap: 24dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-container {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
font-size: 18dp;
|
||||||
|
line-height: 22dp;
|
||||||
|
color: rgba(255, 255, 255, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.divider {
|
||||||
|
margin: 1dp 0;
|
||||||
|
border-top: 1dp rgba(217, 217, 217, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
gap: 24dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer-button {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 220dp;
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20dp;
|
||||||
|
line-height: 24dp;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #FFFFFF;
|
||||||
|
opacity: 1;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer-button.return {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer-button.reset {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stepped-carousel {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 16dp;
|
||||||
|
width: auto;
|
||||||
|
min-width: 246dp;
|
||||||
|
padding: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stepped-carousel-value {
|
||||||
|
line-height: 29dp;
|
||||||
|
min-width: 166dp;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stepped-carousel-arrow {
|
||||||
|
width: 24dp;
|
||||||
|
height: 24dp;
|
||||||
|
min-width: 24dp;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
opacity: 1;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow: visible;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18dp;
|
||||||
|
color: #E0DBC8;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
cursor: pointer;
|
||||||
|
focus: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
popup {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
height: 64dp;
|
||||||
|
background-color: rgba(21, 22, 16, 80%);
|
||||||
|
border-bottom: 2dp #92875B;
|
||||||
|
backdrop-filter: blur(5dp);
|
||||||
|
transform: translateY(-64dp);
|
||||||
|
transition: transform 0.2s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
popup[open] {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
popup tab-bar {
|
||||||
|
flex: 1 1 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
popup tab-bar tab {
|
||||||
|
opacity: 0.35;
|
||||||
|
color: #E0DBC8;
|
||||||
|
}
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
font-family: "Fira Sans";
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 20dp;
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #000000;
|
||||||
|
decorator: image(../prelaunch-bg.png cover left center);
|
||||||
|
filter: opacity(0);
|
||||||
|
transition: filter 1s 0.1s linear-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
body[open] {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
content {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
filter: opacity(0);
|
||||||
|
transition: filter 0.2s linear-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
content[open] {
|
||||||
|
filter: opacity(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu {
|
||||||
|
position: absolute;
|
||||||
|
left: 96dp;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
/* Scale based on a reference screen width, 428/1216 */
|
||||||
|
width: 35.230264vw;
|
||||||
|
min-width: 428dp;
|
||||||
|
max-width: 856dp;
|
||||||
|
height: auto;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 48dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
hero {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
hero img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow {
|
||||||
|
font-family: "Alegreya SC";
|
||||||
|
font-size: 32dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1216dp) {
|
||||||
|
.eyebrow {
|
||||||
|
/* Same logic as .menu, 32/1216 */
|
||||||
|
font-size: 2.631579vw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow span {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-list button {
|
||||||
|
width: 428dp;
|
||||||
|
height: 54dp;
|
||||||
|
padding: 8dp 16dp;
|
||||||
|
border-radius: 8dp;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-size: 32dp;
|
||||||
|
font-weight: normal;
|
||||||
|
cursor: pointer;
|
||||||
|
/* Define a fully transparent gradient as the default state, otherwise a white flash occurs */
|
||||||
|
decorator: horizontal-gradient(#00000000 #00000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-list button.anim-done {
|
||||||
|
transition: decorator color 0.1s linear-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu-list button:hover,
|
||||||
|
#menu-list button:focus-visible {
|
||||||
|
color: black;
|
||||||
|
decorator: horizontal-gradient(#FEE685FF #FEE68500);
|
||||||
|
}
|
||||||
|
|
||||||
|
disk-status {
|
||||||
|
position: absolute;
|
||||||
|
left: 96dp;
|
||||||
|
bottom: 72dp;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
version-info {
|
||||||
|
position: absolute;
|
||||||
|
right: 96dp;
|
||||||
|
bottom: 72dp;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8dp;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status,
|
||||||
|
.version {
|
||||||
|
font-size: 24dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status,
|
||||||
|
.update {
|
||||||
|
color: #D8F999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status[bad] {
|
||||||
|
color: #FFC9C9;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Hidden until an actual update checker is introduced */
|
||||||
|
.update {
|
||||||
|
display: none;
|
||||||
|
font-size: 16dp;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail,
|
||||||
|
.update span {
|
||||||
|
color: #A6A09B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Startup animation */
|
||||||
|
.intro-item {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(10dp);
|
||||||
|
transition: opacity transform 0.3s 0.1s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.animate-in .intro-item {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0dp);
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-0 {
|
||||||
|
transition: opacity transform 0.3s 0.1s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-1 {
|
||||||
|
transition: opacity transform 0.3s 0.2s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-2 {
|
||||||
|
transition: opacity transform 0.3s 0.3s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-3 {
|
||||||
|
transition: opacity transform 0.3s 0.4s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-4 {
|
||||||
|
transition: opacity transform 0.3s 0.5s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-5 {
|
||||||
|
transition: opacity transform 0.3s 0.6s cubic-in-out;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
tab-bar {
|
||||||
|
display: flex;
|
||||||
|
min-width: 0;
|
||||||
|
overflow: auto hidden;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
tab-bar tab {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
padding: 0 24dp;
|
||||||
|
line-height: 64dp;
|
||||||
|
white-space: nowrap;
|
||||||
|
decorator: vertical-gradient(#c2a42d00 #c2a42d00);
|
||||||
|
transition: decorator 0.1s linear-in-out, opacity 0.1s linear-in-out;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
tab-bar tab:selected {
|
||||||
|
opacity: 1;
|
||||||
|
border-bottom: 4dp #C2A42D;
|
||||||
|
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||||
|
}
|
||||||
|
|
||||||
|
tab-bar tab:focus-visible,
|
||||||
|
tab-bar tab:hover {
|
||||||
|
opacity: 1;
|
||||||
|
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||||
|
decorator: vertical-gradient(#c2a42d00 #c2a42d26);
|
||||||
|
}
|
||||||
|
|
||||||
|
tab-bar tab:active {
|
||||||
|
decorator: vertical-gradient(#c2a42d10 #c2a42d40);
|
||||||
|
}
|
||||||
@@ -0,0 +1,239 @@
|
|||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 64dp;
|
||||||
|
font-family: "Fira Sans";
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-size: 15dp;
|
||||||
|
color: #E0DBC8;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 1088dp;
|
||||||
|
max-height: 768dp;
|
||||||
|
margin: auto;
|
||||||
|
border-radius: 14dp;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 2dp #92875B;
|
||||||
|
backdrop-filter: blur(5dp);
|
||||||
|
box-shadow: 0 0 25dp 5dp;
|
||||||
|
background-color: rgba(21, 22, 16, 90%);
|
||||||
|
filter: opacity(0);
|
||||||
|
transform: scale(0.9);
|
||||||
|
transform-origin: center;
|
||||||
|
transition: filter transform 0.2s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
window[open] {
|
||||||
|
filter: opacity(1);
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-height: 640dp) {
|
||||||
|
body {
|
||||||
|
padding: 16dp;
|
||||||
|
}
|
||||||
|
window {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window tab-bar {
|
||||||
|
flex: 0 0 64dp;
|
||||||
|
height: 64dp;
|
||||||
|
background-color: rgba(217, 217, 217, 10%);
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18dp;
|
||||||
|
border-bottom: 2dp #92875B;
|
||||||
|
}
|
||||||
|
|
||||||
|
window tab-bar tab {
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
window content {
|
||||||
|
display: flex;
|
||||||
|
flex: 1 1 0;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
window content pane {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
flex: 1 1 0;
|
||||||
|
height: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
padding: 24dp;
|
||||||
|
padding-bottom: 0dp;
|
||||||
|
gap: 8dp;
|
||||||
|
overflow: hidden auto;
|
||||||
|
font-size: 20dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
window content pane:not(:last-of-type) {
|
||||||
|
border-right: 1dp #92875B;
|
||||||
|
}
|
||||||
|
|
||||||
|
window content pane > * {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
window content pane > spacer {
|
||||||
|
display: block;
|
||||||
|
/* Completes the 24dp bottom inset after the pane's 8dp gap. */
|
||||||
|
flex: 0 0 16dp;
|
||||||
|
height: 16dp;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarvertical {
|
||||||
|
width: 8dp;
|
||||||
|
margin: 4dp 4dp 4dp 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarvertical sliderarrowdec,
|
||||||
|
scrollbarvertical sliderarrowinc {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarvertical slidertrack {
|
||||||
|
width: 8dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarvertical sliderbar {
|
||||||
|
width: 8dp;
|
||||||
|
min-height: 24dp;
|
||||||
|
background-color: rgba(224, 219, 200, 45%);
|
||||||
|
border-radius: 2dp;
|
||||||
|
transition: background-color 0.2s cubic-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarvertical sliderbar:hover,
|
||||||
|
scrollbarvertical sliderbar:active {
|
||||||
|
background-color: rgba(194, 164, 45, 80%);
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarhorizontal {
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarhorizontal sliderarrowdec,
|
||||||
|
scrollbarhorizontal sliderarrowinc {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollbarhorizontal slidertrack,
|
||||||
|
scrollbarhorizontal sliderbar {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-heading {
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 22dp;
|
||||||
|
opacity: 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-heading:not(:first-of-type) {
|
||||||
|
padding-top: 12dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
text-align: center;
|
||||||
|
background-color: rgba(17, 16, 10, 20%);
|
||||||
|
opacity: 0.9;
|
||||||
|
padding: 8dp 16dp;
|
||||||
|
border-radius: 14dp;
|
||||||
|
box-shadow: rgba(146, 135, 91, 25%) 0 0 0 1dp;
|
||||||
|
font-size: 20dp;
|
||||||
|
transition: background-color 0.1s linear-in-out, opacity 0.1s linear-in-out;
|
||||||
|
cursor: pointer;
|
||||||
|
focus: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:not(:disabled):hover,
|
||||||
|
button:not(:disabled):focus-visible {
|
||||||
|
background-color: rgba(204, 184, 119, 20%);
|
||||||
|
box-shadow: #C2A42D 0 0 0 2dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:not(:disabled):selected {
|
||||||
|
opacity: 1;
|
||||||
|
background-color: rgba(204, 184, 119, 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:not(:disabled):active {
|
||||||
|
opacity: 1;
|
||||||
|
background-color: rgba(204, 184, 119, 40%);
|
||||||
|
box-shadow: #C2A42D 0 0 0 2dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8dp;
|
||||||
|
background-color: rgba(17, 16, 10, 20%);
|
||||||
|
opacity: 0.9;
|
||||||
|
padding: 8dp 16dp;
|
||||||
|
border-radius: 14dp;
|
||||||
|
box-shadow: rgba(146, 135, 91, 25%) 0 0 0 1dp;
|
||||||
|
transition: background-color 0.1s linear-in-out, opacity 0.1s linear-in-out;
|
||||||
|
cursor: pointer;
|
||||||
|
focus: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button:not(:disabled):hover,
|
||||||
|
select-button:not(:disabled):focus-visible {
|
||||||
|
background-color: rgba(204, 184, 119, 20%);
|
||||||
|
box-shadow: #C2A42D 0 0 0 2dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button:not(:disabled):selected {
|
||||||
|
opacity: 1;
|
||||||
|
background-color: rgba(204, 184, 119, 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button:not(:disabled):active {
|
||||||
|
opacity: 1;
|
||||||
|
background-color: rgba(204, 184, 119, 40%);
|
||||||
|
box-shadow: #C2A42D 0 0 0 2dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button:disabled {
|
||||||
|
opacity: 0.35;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button key {
|
||||||
|
font-family: "Fira Sans Condensed";
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18dp;
|
||||||
|
text-transform: uppercase;
|
||||||
|
flex: 1 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button value {
|
||||||
|
margin-left: auto;
|
||||||
|
font-size: 20dp;
|
||||||
|
}
|
||||||
|
|
||||||
|
select-button input {
|
||||||
|
text-align: right;
|
||||||
|
font-size: 20dp;
|
||||||
|
}
|
||||||
@@ -468,9 +468,20 @@ s16 cLib_targetAngleX(cXyz const* lhs, cXyz const* rhs) {
|
|||||||
void cLib_offsetPos(cXyz* pdest, cXyz const* psrc, s16 angle, cXyz const* vec) {
|
void cLib_offsetPos(cXyz* pdest, cXyz const* psrc, s16 angle, cXyz const* vec) {
|
||||||
f32 cos = cM_scos(angle);
|
f32 cos = cM_scos(angle);
|
||||||
f32 sin = cM_ssin(angle);
|
f32 sin = cM_ssin(angle);
|
||||||
|
// MWCC loads vec members into registers before writing to pdest; other compilers may not,
|
||||||
|
// which corrupts results when pdest and vec alias the same memory.
|
||||||
|
#if !__MWERKS__
|
||||||
|
f32 vx = vec->x;
|
||||||
|
f32 vy = vec->y;
|
||||||
|
f32 vz = vec->z;
|
||||||
|
pdest->x = psrc->x + (vx * cos + vz * sin);
|
||||||
|
pdest->y = psrc->y + vy;
|
||||||
|
pdest->z = psrc->z + (vz * cos - vx * sin);
|
||||||
|
#else
|
||||||
pdest->x = psrc->x + (vec->x * cos + vec->z * sin);
|
pdest->x = psrc->x + (vec->x * cos + vec->z * sin);
|
||||||
pdest->y = psrc->y + vec->y;
|
pdest->y = psrc->y + vec->y;
|
||||||
pdest->z = psrc->z + (vec->z * cos - vec->x * sin);
|
pdest->z = psrc->z + (vec->z * cos - vec->x * sin);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#include "Z2AudioLib/Z2Audience.h"
|
#include "Z2AudioLib/Z2Audience.h"
|
||||||
#include "Z2AudioLib/Z2SoundInfo.h"
|
#include "Z2AudioLib/Z2SoundInfo.h"
|
||||||
|
#if TARGET_PC
|
||||||
|
#include "dusk/audio/DuskDsp.hpp"
|
||||||
|
#include <cmath>
|
||||||
|
#endif
|
||||||
#include "Z2AudioLib/Z2Calc.h"
|
#include "Z2AudioLib/Z2Calc.h"
|
||||||
#include "Z2AudioLib/Z2Param.h"
|
#include "Z2AudioLib/Z2Param.h"
|
||||||
#include "JSystem/JAudio2/JAISound.h"
|
#include "JSystem/JAudio2/JAISound.h"
|
||||||
@@ -734,9 +738,22 @@ f32 Z2Audience::calcRelPosPan(const Vec& param_0, int camID) {
|
|||||||
|
|
||||||
f32 Z2Audience::calcRelPosDolby(const Vec& param_0, int camID) {
|
f32 Z2Audience::calcRelPosDolby(const Vec& param_0, int camID) {
|
||||||
f32 fVar1 = param_0.z + mAudioCamera[camID].getDolbyCenterZ();
|
f32 fVar1 = param_0.z + mAudioCamera[camID].getDolbyCenterZ();
|
||||||
|
#if TARGET_PC
|
||||||
|
if (dusk::audio::EnableHrtf) {
|
||||||
|
// Normalize the direction so result is purely front/back orientation,
|
||||||
|
// independent of how far away the sound is
|
||||||
|
f32 lenSq = param_0.x * param_0.x + param_0.y * param_0.y + param_0.z * param_0.z;
|
||||||
|
if (lenSq < 0.0001f) {
|
||||||
|
return 0.5f;
|
||||||
|
}
|
||||||
|
f32 zNorm = param_0.z / sqrtf(lenSq);
|
||||||
|
f32 t = (zNorm + 1.0f) * 0.5f;
|
||||||
|
return 0.5f - 0.5f * cosf(t * static_cast<f32>(M_PI));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (fVar1 > mSetting.field_0x48) {
|
if (fVar1 > mSetting.field_0x48) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fVar1 < mSetting.field_0x44) {
|
if (fVar1 < mSetting.field_0x44) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
|
|||||||
@@ -117,8 +117,8 @@ static Z2WolfHowlLine sNewSong3[9] = {
|
|||||||
|
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
static Z2WolfHowlLine sHowlTimeSong[6] = {
|
static Z2WolfHowlLine sHowlTimeSong[6] = {
|
||||||
{HOWL_LINE_MID, 20}, {HOWL_LINE_LOW, 20}, {HOWL_LINE_HIGH, 40},
|
{HOWL_LINE_MID, 15}, {HOWL_LINE_LOW, 15}, {HOWL_LINE_HIGH, 30},
|
||||||
{HOWL_LINE_MID, 20}, {HOWL_LINE_LOW, 20}, {HOWL_LINE_HIGH, 40},
|
{HOWL_LINE_MID, 15}, {HOWL_LINE_LOW, 15}, {HOWL_LINE_HIGH, 30},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -368,9 +368,9 @@ void Z2WolfHowlMgr::setCorrectData(s8 curveID, Z2WolfHowlData* data) {
|
|||||||
break;
|
break;
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
case Z2WOLFHOWL_TIMESONG:
|
case Z2WOLFHOWL_TIMESONG:
|
||||||
cPitchUp = 1.259906f;
|
cPitchUp = 1.3348f;
|
||||||
cPitchCenter = 0.94387f;
|
cPitchCenter = 0.8909f;
|
||||||
cPitchDown = 0.840885f;
|
cPitchDown = 0.7937f;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -4962,13 +4962,16 @@ int daAlink_c::create() {
|
|||||||
|
|
||||||
setArcName(checkWolf());
|
setArcName(checkWolf());
|
||||||
setOriginalHeap(&mpArcHeap, 0xA2800);
|
setOriginalHeap(&mpArcHeap, 0xA2800);
|
||||||
|
JKRHEAP_NAME(mpArcHeap, "Alink ArcHeap");
|
||||||
if (dComIfG_resLoad(&mPhaseReq, mArcName, mpArcHeap) != cPhs_COMPLEATE_e) {
|
if (dComIfG_resLoad(&mPhaseReq, mArcName, mpArcHeap) != cPhs_COMPLEATE_e) {
|
||||||
return cPhs_INIT_e;
|
return cPhs_INIT_e;
|
||||||
}
|
}
|
||||||
|
|
||||||
setShieldArcName();
|
setShieldArcName();
|
||||||
setOriginalHeap(&mpShieldArcHeap, 0x7000);
|
setOriginalHeap(&mpShieldArcHeap, 0x7000);
|
||||||
if (dComIfG_resLoad(&mShieldPhaseReq, mShieldArcName, mpShieldArcHeap) != cPhs_COMPLEATE_e) {
|
JKRHEAP_NAME(mpShieldArcHeap, "Alink ShieldArcHeap");
|
||||||
|
if (dComIfG_resLoad(&mShieldPhaseReq, mShieldArcName, mpShieldArcHeap) != cPhs_COMPLEATE_e)
|
||||||
|
{
|
||||||
return cPhs_INIT_e;
|
return cPhs_INIT_e;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5877,6 +5880,11 @@ void daAlink_c::setItemMatrix(int param_0) {
|
|||||||
modelCalc(mSheathModel);
|
modelCalc(mSheathModel);
|
||||||
|
|
||||||
int var_r26;
|
int var_r26;
|
||||||
|
|
||||||
|
#if AVOID_UB
|
||||||
|
var_r26 = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!checkNoResetFlg3(FLG3_UNK_4000000)) {
|
if (!checkNoResetFlg3(FLG3_UNK_4000000)) {
|
||||||
if (mEquipItem == 0x103 || param_0 != 0) {
|
if (mEquipItem == 0x103 || param_0 != 0) {
|
||||||
mSwordModel->setBaseTRMtx(mpLinkModel->getAnmMtx(mLeftItemJntNo));
|
mSwordModel->setBaseTRMtx(mpLinkModel->getAnmMtx(mLeftItemJntNo));
|
||||||
@@ -18936,11 +18944,20 @@ void daAlink_c::setDrawHand() {
|
|||||||
mpLinkHandModel->setBaseTRMtx(mpLinkModel->getBaseTRMtx());
|
mpLinkHandModel->setBaseTRMtx(mpLinkModel->getBaseTRMtx());
|
||||||
mpLinkHandModel->calc();
|
mpLinkHandModel->calc();
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
// FRAME INTERP NOTE: Always set these, otherwise the hands occasionally zip to origin.
|
||||||
|
// Doing it regardless of interpolation being active seems harmless.
|
||||||
|
mpLinkHandModel->setAnmMtx(1, mpLinkModel->getAnmMtx(9));
|
||||||
|
mpLinkHandModel->setAnmMtx(2, mpLinkModel->getAnmMtx(0xE));
|
||||||
|
#endif
|
||||||
|
|
||||||
if (var_r30 == 0xFE || var_r30 == 0xFB) {
|
if (var_r30 == 0xFE || var_r30 == 0xFB) {
|
||||||
field_0x06d0 = field_0x06d8;
|
field_0x06d0 = field_0x06d8;
|
||||||
} else {
|
} else {
|
||||||
field_0x06d0 = mpLinkHandModel->getModelData()->getMaterialNodePointer(var_r30)->getShape();
|
field_0x06d0 = mpLinkHandModel->getModelData()->getMaterialNodePointer(var_r30)->getShape();
|
||||||
|
#if !TARGET_PC
|
||||||
mpLinkHandModel->setAnmMtx(1, mpLinkModel->getAnmMtx(9));
|
mpLinkHandModel->setAnmMtx(1, mpLinkModel->getAnmMtx(9));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (var_r30 == 0xFB) {
|
if (var_r30 == 0xFB) {
|
||||||
@@ -18959,7 +18976,9 @@ void daAlink_c::setDrawHand() {
|
|||||||
field_0x06d4 = field_0x06dc;
|
field_0x06d4 = field_0x06dc;
|
||||||
} else {
|
} else {
|
||||||
field_0x06d4 = mpLinkHandModel->getModelData()->getMaterialNodePointer(var_r29)->getShape();
|
field_0x06d4 = mpLinkHandModel->getModelData()->getMaterialNodePointer(var_r29)->getShape();
|
||||||
|
#if !TARGET_PC
|
||||||
mpLinkHandModel->setAnmMtx(2, mpLinkModel->getAnmMtx(0xE));
|
mpLinkHandModel->setAnmMtx(2, mpLinkModel->getAnmMtx(0xE));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (var_r29 == 0xFB) {
|
if (var_r29 == 0xFB) {
|
||||||
|
|||||||
@@ -37,18 +37,40 @@ void daAlink_c::setCrawlMoveDirectionArrow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (field_0x3198 & 4) {
|
if (field_0x3198 & 4) {
|
||||||
if (!bvar) {
|
#if TARGET_PC
|
||||||
direction |= data_80452F38;
|
if (dusk::getSettings().game.enableMirrorMode) {
|
||||||
} else {
|
if (!bvar) {
|
||||||
direction |= data_80452F39;
|
direction |= data_80452F39;
|
||||||
|
} else {
|
||||||
|
direction |= data_80452F38;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (!bvar) {
|
||||||
|
direction |= data_80452F38;
|
||||||
|
} else {
|
||||||
|
direction |= data_80452F39;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field_0x3198 & 8) {
|
if (field_0x3198 & 8) {
|
||||||
if (!bvar) {
|
#if TARGET_PC
|
||||||
direction |= data_80452F39;
|
if (dusk::getSettings().game.enableMirrorMode) {
|
||||||
} else {
|
if (!bvar) {
|
||||||
direction |= data_80452F38;
|
direction |= data_80452F38;
|
||||||
|
} else {
|
||||||
|
direction |= data_80452F39;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (!bvar) {
|
||||||
|
direction |= data_80452F39;
|
||||||
|
} else {
|
||||||
|
direction |= data_80452F38;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
#include "d/actor/d_a_horse.h"
|
#include "d/actor/d_a_horse.h"
|
||||||
#include "d/actor/d_a_crod.h"
|
#include "d/actor/d_a_crod.h"
|
||||||
#include "d/d_msg_object.h"
|
#include "d/d_msg_object.h"
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
#include "d/actor/d_a_obj_carry.h"
|
||||||
|
#include "dusk/achievements.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
#include "d/d_s_menu.h"
|
#include "d/d_s_menu.h"
|
||||||
@@ -677,6 +681,15 @@ BOOL daAlink_c::checkDamageAction() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setDamagePoint(dmg, at_mtrl == dCcD_MTRL_FIRE || at_mtrl == dCcD_MTRL_ICE, TRUE, 0);
|
setDamagePoint(dmg, at_mtrl == dCcD_MTRL_FIRE || at_mtrl == dCcD_MTRL_ICE, TRUE, 0);
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
if (tghit_ac_name == fpcNm_Obj_Carry_e) {
|
||||||
|
auto* carry = static_cast<daObjCarry_c*>(tghit_ac);
|
||||||
|
if (carry->prm_chk_type_ironball() && carry->checkCannon()) {
|
||||||
|
dusk::AchievementSystem::get().signal("iron_ball_hit_player");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (armor_no_dmg && at_mtrl != dCcD_MTRL_ELECTRIC && at_mtrl != dCcD_MTRL_ICE) {
|
if (armor_no_dmg && at_mtrl != dCcD_MTRL_ELECTRIC && at_mtrl != dCcD_MTRL_ICE) {
|
||||||
setGuardSe(var_r29);
|
setGuardSe(var_r29);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "d/actor/d_a_npc_tkc.h"
|
#include "d/actor/d_a_npc_tkc.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
#include "dusk/imgui/ImGuiConsole.hpp"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
|
|
||||||
BOOL daAlink_c::checkEventRun() const {
|
BOOL daAlink_c::checkEventRun() const {
|
||||||
@@ -4005,6 +4006,15 @@ int daAlink_c::procGanonFinishInit() {
|
|||||||
|
|
||||||
field_0x37c8 = current.pos;
|
field_0x37c8 = current.pos;
|
||||||
onEndResetFlg1(ERFLG1_SHIELD_BACKBONE);
|
onEndResetFlg1(ERFLG1_SHIELD_BACKBONE);
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
if (dusk::getSettings().game.speedrunMode) {
|
||||||
|
if (dusk::m_speedrunInfo.m_isRunStarted) {
|
||||||
|
dusk::m_speedrunInfo.stopRun();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ void daAlink_c::handleWolfHowl() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool canTransform = false;
|
bool canHowl = false;
|
||||||
|
|
||||||
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn()) {
|
if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && !checkMagneBootsOn()) {
|
||||||
if (!checkForestOldCentury()) {
|
if (!checkForestOldCentury()) {
|
||||||
@@ -52,12 +52,17 @@ void daAlink_c::handleWolfHowl() {
|
|||||||
(checkEventRun() || getMidnaActor()->checkMetamorphoseEnable()) &&
|
(checkEventRun() || getMidnaActor()->checkMetamorphoseEnable()) &&
|
||||||
(checkModeFlg(4) || dComIfGp_checkPlayerStatus0(0, 0x10))))
|
(checkModeFlg(4) || dComIfGp_checkPlayerStatus0(0, 0x10))))
|
||||||
{
|
{
|
||||||
canTransform = true;
|
canHowl = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!canHowl) {
|
||||||
|
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
getWolfHowlMgrP()->setCorrectCurve(9);
|
getWolfHowlMgrP()->setCorrectCurve(9);
|
||||||
procWolfHowlDemoInit();
|
procWolfHowlDemoInit();
|
||||||
}
|
}
|
||||||
@@ -154,6 +159,7 @@ bool daAlink_c::checkGyroAimContext() {
|
|||||||
case PROC_BOW_SUBJECT:
|
case PROC_BOW_SUBJECT:
|
||||||
case PROC_BOOMERANG_SUBJECT:
|
case PROC_BOOMERANG_SUBJECT:
|
||||||
case PROC_COPY_ROD_SUBJECT:
|
case PROC_COPY_ROD_SUBJECT:
|
||||||
|
case PROC_HAWK_SUBJECT:
|
||||||
case PROC_HOOKSHOT_SUBJECT:
|
case PROC_HOOKSHOT_SUBJECT:
|
||||||
case PROC_SWIM_HOOKSHOT_SUBJECT:
|
case PROC_SWIM_HOOKSHOT_SUBJECT:
|
||||||
case PROC_HORSE_BOW_SUBJECT:
|
case PROC_HORSE_BOW_SUBJECT:
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void daAlink_c::hsChainShape_c::draw() {
|
void daAlink_c::hsChainShape_c::draw() {
|
||||||
|
if (dusk::getSettings().game.superClawshot) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static const int dummy = 0;
|
static const int dummy = 0;
|
||||||
|
|
||||||
daAlink_c* alink = (daAlink_c*)getUserArea();
|
daAlink_c* alink = (daAlink_c*)getUserArea();
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ void daAlink_c::setOriginalHeap(JKRExpHeap** i_ppheap, u32 i_size) {
|
|||||||
JKRHeap* parent = mDoExt_getGameHeap();
|
JKRHeap* parent = mDoExt_getGameHeap();
|
||||||
|
|
||||||
JKRExpHeap* heap = JKRExpHeap::create(size + (var_r29 + var_r28), parent, true);
|
JKRExpHeap* heap = JKRExpHeap::create(size + (var_r29 + var_r28), parent, true);
|
||||||
JKRHEAP_NAME(heap, "Alink original");
|
|
||||||
*i_ppheap = heap;
|
*i_ppheap = heap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,6 +149,23 @@ void daAlink_c::changeWolf() {
|
|||||||
|
|
||||||
mpLinkModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 14)), 0x20200);
|
mpLinkModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 14)), 0x20200);
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
// Update Wolf Link's eye maxLOD to prevent the eyes from disappearing
|
||||||
|
{
|
||||||
|
J3DTexture* tex = mpLinkModel->getModelData()->getTexture();
|
||||||
|
JUTNameTab* nametable = mpLinkModel->getModelData()->getTextureName();
|
||||||
|
if (tex != nullptr && nametable != nullptr) {
|
||||||
|
for (u16 i = 0; i < tex->getNum(); i++) {
|
||||||
|
const char* tex_name = nametable->getName(i);
|
||||||
|
if (tex_name != NULL && strcmp(tex_name, "wl_eyeball") == 0) {
|
||||||
|
ResTIMG* timg = tex->getResTIMG(i);
|
||||||
|
timg->maxLOD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
J3DModelData* chainModelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 15));
|
J3DModelData* chainModelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 15));
|
||||||
for (u16 i = 0; i < 4; i++) {
|
for (u16 i = 0; i < 4; i++) {
|
||||||
mpWlChainModels[i] = initModel(chainModelData, 0);
|
mpWlChainModels[i] = initModel(chainModelData, 0);
|
||||||
@@ -162,6 +179,23 @@ void daAlink_c::changeWolf() {
|
|||||||
mpWlMidnaHairModel =
|
mpWlMidnaHairModel =
|
||||||
initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 11)), 0x1000000);
|
initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 11)), 0x1000000);
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
// Update Midna's eye maxLOD to prevent the eyes from disappearing
|
||||||
|
{
|
||||||
|
J3DTexture* tex = mpWlMidnaModel->getModelData()->getTexture();
|
||||||
|
JUTNameTab* nametable = mpWlMidnaModel->getModelData()->getTextureName();
|
||||||
|
if (tex != nullptr && nametable != nullptr) {
|
||||||
|
for (u16 i = 0; i < tex->getNum(); i++) {
|
||||||
|
const char* tex_name = nametable->getName(i);
|
||||||
|
if (tex_name != NULL && strcmp(tex_name, "midona_eyeball") == 0) {
|
||||||
|
ResTIMG* timg = tex->getResTIMG(i);
|
||||||
|
timg->maxLOD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
mpDMidnaBrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_wArcName, 18));
|
mpDMidnaBrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_wArcName, 18));
|
||||||
mpDMidnaBrk->searchUpdateMaterialID(mpWlMidnaModel->getModelData());
|
mpDMidnaBrk->searchUpdateMaterialID(mpWlMidnaModel->getModelData());
|
||||||
mpWlMidnaModel->getModelData()->entryTevRegAnimator(mpDMidnaBrk);
|
mpWlMidnaModel->getModelData()->entryTevRegAnimator(mpDMidnaBrk);
|
||||||
@@ -342,6 +376,26 @@ void daAlink_c::changeLink(int param_0) {
|
|||||||
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "zl_face.bmd")), 0x20200);
|
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "zl_face.bmd")), 0x20200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TARGET_PC
|
||||||
|
// Update Adult Link's eye maxLOD to prevent the eyes from disappearing
|
||||||
|
{
|
||||||
|
J3DTexture* tex = mpLinkFaceModel->getModelData()->getTexture();
|
||||||
|
JUTNameTab* nametable = mpLinkFaceModel->getModelData()->getTextureName();
|
||||||
|
if (tex != nullptr && nametable != nullptr) {
|
||||||
|
for (u16 i = 0; i < tex->getNum(); i++) {
|
||||||
|
const char* tex_name = nametable->getName(i);
|
||||||
|
if (tex_name != nullptr &&
|
||||||
|
(strcmp(tex_name, "al_eyeball") == 0 || strcmp(tex_name, "highlight02") == 0 ||
|
||||||
|
strcmp(tex_name, "eye_kage01") == 0))
|
||||||
|
{
|
||||||
|
ResTIMG* timg = tex->getResTIMG(i);
|
||||||
|
timg->maxLOD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "al_bootsH.bmd"));
|
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "al_bootsH.bmd"));
|
||||||
u16 i;
|
u16 i;
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
|
|||||||
@@ -2059,7 +2059,15 @@ static void demo_camera(b_bq_class* i_this) {
|
|||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
static u16 g_e_i[] = {0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF};
|
static u16 g_e_i[] = {0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF};
|
||||||
|
|
||||||
dComIfGp_particle_set(g_e_i[i], &pos, NULL, NULL);
|
#if TARGET_PC
|
||||||
|
if (i == 0) {
|
||||||
|
static const cXyz effWideScale = {mDoGph_gInf_c::getAspect(), 1.0f, 1.0f};
|
||||||
|
dComIfGp_particle_set(g_e_i[i], &pos, NULL, &effWideScale);
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
dComIfGp_particle_set(g_e_i[i], &pos, NULL, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i_this->mSound.startCreatureSound(Z2SE_EN_BOSS_CONVERGE, 0, 0);
|
i_this->mSound.startCreatureSound(Z2SE_EN_BOSS_CONVERGE, 0, 0);
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
#include "Z2AudioLib/Z2Instances.h"
|
#include "Z2AudioLib/Z2Instances.h"
|
||||||
|
|
||||||
|
#include "dusk/frame_interpolation.h"
|
||||||
|
#include "dusk/settings.h"
|
||||||
|
|
||||||
class daB_GND_HIO_c : public JORReflexible {
|
class daB_GND_HIO_c : public JORReflexible {
|
||||||
public:
|
public:
|
||||||
daB_GND_HIO_c();
|
daB_GND_HIO_c();
|
||||||
@@ -279,6 +282,30 @@ static int h_nodeCallBack(J3DJoint* i_joint, int param_2) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_PC
|
||||||
|
static void b_gnd_rein_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||||
|
b_gnd_class* i_this = (b_gnd_class*)pUserWork;
|
||||||
|
if (!i_this->mReinsInterpPrevValid || !i_this->mReinsInterpCurrValid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||||
|
for (int r = 0; r < 2; r++) {
|
||||||
|
cXyz* dst = i_this->mHorseReins[r].getPos(0);
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
const cXyz& p0 = i_this->mReinsInterpPrev[r][i];
|
||||||
|
const cXyz& p1 = i_this->mReinsInterpCurr[r][i];
|
||||||
|
dst[i] = p0 + (p1 - p0) * alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cXyz* dst = i_this->field_0x21e8.getPos(0);
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
const cXyz& p0 = i_this->mReinsTexInterpPrev[i];
|
||||||
|
const cXyz& p1 = i_this->mReinsTexInterpCurr[i];
|
||||||
|
dst[i] = p0 + (p1 - p0) * alpha;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int daB_GND_Draw(b_gnd_class* i_this) {
|
static int daB_GND_Draw(b_gnd_class* i_this) {
|
||||||
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
|
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
|
||||||
|
|
||||||
@@ -366,6 +393,21 @@ static int daB_GND_Draw(b_gnd_class* i_this) {
|
|||||||
|
|
||||||
i_this->field_0x21e8.update(2, l_color, &a_this->tevStr);
|
i_this->field_0x21e8.update(2, l_color, &a_this->tevStr);
|
||||||
dComIfGd_set3DlineMat(&i_this->field_0x21e8);
|
dComIfGd_set3DlineMat(&i_this->field_0x21e8);
|
||||||
|
#if TARGET_PC
|
||||||
|
if (dusk::getSettings().game.enableFrameInterpolation) {
|
||||||
|
if (i_this->mReinsInterpCurrValid) {
|
||||||
|
memcpy(i_this->mReinsInterpPrev, i_this->mReinsInterpCurr, sizeof(i_this->mReinsInterpCurr));
|
||||||
|
memcpy(i_this->mReinsTexInterpPrev, i_this->mReinsTexInterpCurr, sizeof(i_this->mReinsTexInterpCurr));
|
||||||
|
i_this->mReinsInterpPrevValid = true;
|
||||||
|
}
|
||||||
|
for (int r = 0; r < 2; r++) {
|
||||||
|
memcpy(i_this->mReinsInterpCurr[r], i_this->mHorseReins[r].getPos(0), 16 * sizeof(cXyz));
|
||||||
|
}
|
||||||
|
memcpy(i_this->mReinsTexInterpCurr, i_this->field_0x21e8.getPos(0), 2 * sizeof(cXyz));
|
||||||
|
i_this->mReinsInterpCurrValid = true;
|
||||||
|
dusk::frame_interp::add_interpolation_callback(&b_gnd_rein_interp_callback, i_this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@@ -1189,10 +1231,16 @@ static void b_gnd_h_end(b_gnd_class* i_this) {
|
|||||||
|
|
||||||
if (i_this->mDemoCamMode < 32) {
|
if (i_this->mDemoCamMode < 32) {
|
||||||
i_this->mDemoCamMode = 32;
|
i_this->mDemoCamMode = 32;
|
||||||
|
#if TARGET_PC
|
||||||
|
i_this->mDemoCamSyncTicks = 2;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
i_this->mDemoCamMode = 34;
|
i_this->mDemoCamMode = 34;
|
||||||
i_this->mDemoCamTimer = 0;
|
i_this->mDemoCamTimer = 0;
|
||||||
i_this->mMoveMode = 2;
|
i_this->mMoveMode = 2;
|
||||||
|
#if TARGET_PC
|
||||||
|
i_this->mDemoCamSyncTicks = 2;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -2887,6 +2935,9 @@ static void demo_camera(b_gnd_class* i_this) {
|
|||||||
cXyz spF0;
|
cXyz spF0;
|
||||||
|
|
||||||
s8 sp8 = false;
|
s8 sp8 = false;
|
||||||
|
#if TARGET_PC
|
||||||
|
const s16 entry_demo_cam_mode = i_this->mDemoCamMode;
|
||||||
|
#endif
|
||||||
switch (i_this->mDemoCamMode) {
|
switch (i_this->mDemoCamMode) {
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
@@ -3725,6 +3776,15 @@ static void demo_camera(b_gnd_class* i_this) {
|
|||||||
i_this->mDemoCamTimer = 10000;
|
i_this->mDemoCamTimer = 10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if TARGET_PC
|
||||||
|
if (entry_demo_cam_mode != i_this->mDemoCamMode) {
|
||||||
|
i_this->mDemoCamSyncTicks = 2;
|
||||||
|
}
|
||||||
|
if (i_this->mDemoCamSyncTicks > 0) {
|
||||||
|
dusk::frame_interp::request_presentation_sync();
|
||||||
|
i_this->mDemoCamSyncTicks--;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void anm_se_set(b_gnd_class* i_this) {
|
static void anm_se_set(b_gnd_class* i_this) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user