mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-09-11 03:13:20 -04:00
Merge main
This commit is contained in:
+18
-3
@@ -182,8 +182,15 @@ FetchContent_Declare(miniz
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
message(STATUS "dusklight: Fetching PicoSHA2")
|
||||
FetchContent_Declare(picosha2
|
||||
URL https://github.com/okdshin/PicoSHA2/archive/refs/tags/v1.0.1.tar.gz
|
||||
URL_HASH SHA256=9983136544234e573fe07cc1a22fdf978ad7979043e7be2e9082f6d4991ff8a8
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
|
||||
set(_fetch_content_deps miniz)
|
||||
set(_fetch_content_deps miniz picosha2)
|
||||
|
||||
if (DUSK_ENABLE_OPUS)
|
||||
message(STATUS "dusklight: Fetching opusfile")
|
||||
@@ -237,6 +244,14 @@ if (DUSK_HAS_FUNCHOOK)
|
||||
endif ()
|
||||
FetchContent_MakeAvailable(${_fetch_content_deps})
|
||||
|
||||
if (DUSK_HAS_FUNCHOOK AND APPLE)
|
||||
target_sources(funchook-static PRIVATE src/dusk/mods/loader/code_patch_macos.cpp)
|
||||
target_include_directories(funchook-static PRIVATE src/dusk/mods/loader)
|
||||
set_source_files_properties(src/dusk/mods/loader/code_patch_macos.cpp
|
||||
TARGET_DIRECTORY funchook-static PROPERTIES
|
||||
COMPILE_OPTIONS "-O2;-fno-sanitize=all;-fno-stack-protector")
|
||||
endif ()
|
||||
|
||||
# Use signed char on ARM to match the original game (and x86)
|
||||
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _arch)
|
||||
if(_arch MATCHES "^(arm|aarch64)" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
|
||||
@@ -262,8 +277,8 @@ include(cmake/GameABIConfig.cmake)
|
||||
find_package(Threads REQUIRED)
|
||||
set(GAME_COMPILE_DEFS DUSK_BUILDING_GAME=1)
|
||||
set(GAME_LIBS aurora::core aurora::gx aurora::gd aurora::si aurora::vi aurora::pad aurora::mtx aurora::os aurora::dvd aurora::thp
|
||||
aurora::card borealis::cli borealis::crash borealis::data borealis::disc borealis::discord borealis::file_select borealis::io borealis::log borealis::net borealis::presentation borealis::sentry borealis::update borealis::ws freeverb cxxopts::cxxopts absl::flat_hash_map nlohmann_json::nlohmann_json TracyClient fmt::fmt
|
||||
Threads::Threads zstd::libzstd dusklight_game_headers)
|
||||
aurora::card borealis::http borealis::cli borealis::crash borealis::data borealis::disc borealis::discord borealis::file_select borealis::io borealis::log borealis::net borealis::presentation borealis::sentry borealis::update borealis::ws freeverb cxxopts::cxxopts absl::flat_hash_map nlohmann_json::nlohmann_json TracyClient fmt::fmt
|
||||
Threads::Threads zstd::libzstd dusklight_game_headers picosha2 PNG::PNG)
|
||||
if (DUSK_HAS_FUNCHOOK)
|
||||
list(APPEND GAME_LIBS funchook-static)
|
||||
endif ()
|
||||
|
||||
@@ -14,6 +14,9 @@ Dusklight 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.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Dusklight's official website is https://twilitrealm.dev/, any other website is not affiliated and may be promoting AI-generated misinformation.
|
||||
|
||||
# Setup
|
||||
|
||||
> [!IMPORTANT]
|
||||
|
||||
+49
-53
@@ -2,59 +2,55 @@ file(READ "${SOURCE_DIR}/cmake/capstone.cmake.in" _content)
|
||||
|
||||
# Insert PATCH_COMMAND before CONFIGURE_COMMAND in the ExternalProject_Add.
|
||||
# Bracket args prevent cmake from substituting ${...} while writing this file.
|
||||
string(REPLACE
|
||||
" CONFIGURE_COMMAND \"\""
|
||||
[=[ PATCH_COMMAND "${CMAKE_COMMAND}" -DDIR=${CMAKE_CURRENT_BINARY_DIR}/capstone-src -P "${CAPSTONE_FIX_SCRIPT}"
|
||||
if (NOT _content MATCHES "CAPSTONE_FIX_SCRIPT")
|
||||
string(REPLACE
|
||||
" CONFIGURE_COMMAND \"\""
|
||||
[=[ PATCH_COMMAND "${CMAKE_COMMAND}" -DDIR=${CMAKE_CURRENT_BINARY_DIR}/capstone-src -P "${CAPSTONE_FIX_SCRIPT}"
|
||||
CONFIGURE_COMMAND ""]=]
|
||||
_content "${_content}")
|
||||
|
||||
file(WRITE "${SOURCE_DIR}/cmake/capstone.cmake.in" "${_content}")
|
||||
|
||||
file(READ "${SOURCE_DIR}/src/funchook_unix.c" _unix_content)
|
||||
|
||||
# macOS rejects the POSIX mprotect RWX/RW transition for executable image pages on arm64.
|
||||
# Use Mach VM_PROT_COPY for the short patch window, then restore RX permissions.
|
||||
if (NOT _unix_content MATCHES "VM_PROT_READ \\| VM_PROT_WRITE \\| VM_PROT_COPY")
|
||||
string(REPLACE
|
||||
[=[ rv = mprotect(mstate->addr, mstate->size, prot);]=]
|
||||
[=[#ifdef __APPLE__
|
||||
kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)mstate->addr,
|
||||
(vm_size_t)mstate->size, FALSE,
|
||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY);
|
||||
if (kr == KERN_SUCCESS) {
|
||||
funchook_log(funchook, " unprotect memory %p (size=%"PRIuPTR", prot=read,write,copy) <- %p (size=%"PRIuPTR")\n",
|
||||
mstate->addr, mstate->size, start, len);
|
||||
return 0;
|
||||
}
|
||||
funchook_set_error_message(funchook, "Failed to unprotect memory %p (size=%"PRIuPTR", prot=read,write,copy) <- %p (size=%"PRIuPTR", error=%s)",
|
||||
mstate->addr, mstate->size, start, len,
|
||||
mach_error_string(kr));
|
||||
return FUNCHOOK_ERROR_MEMORY_FUNCTION;
|
||||
#endif
|
||||
rv = mprotect(mstate->addr, mstate->size, prot);]=]
|
||||
_unix_content "${_unix_content}")
|
||||
|
||||
string(REPLACE
|
||||
[=[ char errbuf[128];
|
||||
int rv = mprotect(mstate->addr, mstate->size, PROT_READ | PROT_EXEC);]=]
|
||||
[=[ char errbuf[128];
|
||||
#ifdef __APPLE__
|
||||
kern_return_t kr = vm_protect(mach_task_self(), (vm_address_t)mstate->addr,
|
||||
(vm_size_t)mstate->size, FALSE,
|
||||
VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr == KERN_SUCCESS) {
|
||||
funchook_log(funchook, " protect memory %p (size=%"PRIuPTR", prot=read,exec)\n",
|
||||
mstate->addr, mstate->size);
|
||||
return 0;
|
||||
}
|
||||
funchook_set_error_message(funchook, "Failed to protect memory %p (size=%"PRIuPTR", prot=read,exec, error=%s)",
|
||||
mstate->addr, mstate->size,
|
||||
mach_error_string(kr));
|
||||
return FUNCHOOK_ERROR_MEMORY_FUNCTION;
|
||||
#endif
|
||||
int rv = mprotect(mstate->addr, mstate->size, PROT_READ | PROT_EXEC);]=]
|
||||
_unix_content "${_unix_content}")
|
||||
_content "${_content}")
|
||||
file(WRITE "${SOURCE_DIR}/cmake/capstone.cmake.in" "${_content}")
|
||||
endif ()
|
||||
|
||||
file(WRITE "${SOURCE_DIR}/src/funchook_unix.c" "${_unix_content}")
|
||||
file(READ "${SOURCE_DIR}/src/funchook.c" _content)
|
||||
if (NOT _content MATCHES "commit_code_patch")
|
||||
string(REPLACE "#include \"funchook_internal.h\""
|
||||
"#include \"funchook_internal.h\"\n#ifdef __APPLE__\n#include \"code_patch_macos.hpp\"\n#endif"
|
||||
_content "${_content}")
|
||||
|
||||
foreach(_operation install uninstall)
|
||||
if (_operation STREQUAL "install")
|
||||
set(_expected old_code)
|
||||
set(_replacement new_code)
|
||||
else ()
|
||||
set(_expected new_code)
|
||||
set(_replacement old_code)
|
||||
endif ()
|
||||
set(_original " mem_state_t mstate;
|
||||
int rv = funchook_unprotect_begin(funchook, &mstate, entry->target_func, JUMP32_BYTE_SIZE);
|
||||
|
||||
if (rv != 0) {
|
||||
return rv;
|
||||
}
|
||||
memcpy(entry->target_func, entry->${_replacement}, JUMP32_BYTE_SIZE);
|
||||
rv = funchook_unprotect_end(funchook, &mstate);
|
||||
if (rv != 0) {
|
||||
return rv;
|
||||
}
|
||||
flush_instruction_cache(entry->target_func, JUMP32_BYTE_SIZE);")
|
||||
string(FIND "${_content}" "${_original}" _position)
|
||||
if (_position EQUAL -1)
|
||||
message(FATAL_ERROR "Funchook ${_operation} patch site changed")
|
||||
endif ()
|
||||
string(REPLACE "${_original}" "#ifdef __APPLE__
|
||||
int rv = commit_code_patch(entry->target_func, entry->${_expected},
|
||||
entry->${_replacement}, JUMP32_BYTE_SIZE);
|
||||
if (rv != 0) {
|
||||
funchook_set_error_message(funchook, \"Code patch commit failed (Mach error %d)\", rv);
|
||||
return FUNCHOOK_ERROR_MEMORY_FUNCTION;
|
||||
}
|
||||
#else
|
||||
${_original}
|
||||
#endif" _content "${_content}")
|
||||
endforeach ()
|
||||
file(WRITE "${SOURCE_DIR}/src/funchook.c" "${_content}")
|
||||
endif ()
|
||||
|
||||
Vendored
+1
-1
Submodule extern/borealis updated: f55910bd79...0bdba6c50a
+35
-1
@@ -1422,6 +1422,8 @@ set(DUSK_FILES
|
||||
src/dusk/achievements.cpp
|
||||
src/dusk/action_bindings.cpp
|
||||
src/dusk/action_bindings.h
|
||||
src/dusk/archive.cpp
|
||||
src/dusk/archive.hpp
|
||||
src/dusk/asserts.cpp
|
||||
src/dusk/autosave.cpp
|
||||
src/dusk/config.cpp
|
||||
@@ -1432,10 +1434,10 @@ set(DUSK_FILES
|
||||
src/dusk/dvd_asset.cpp
|
||||
src/dusk/dvd_asset.hpp
|
||||
src/dusk/extras.c
|
||||
src/dusk/frame_interpolation.cpp
|
||||
src/dusk/commands.cpp
|
||||
src/dusk/commands.hpp
|
||||
src/dusk/game_clock.cpp
|
||||
src/dusk/hash.hpp
|
||||
src/dusk/game_mode.cpp
|
||||
src/dusk/gamepad_color.cpp
|
||||
src/dusk/globals.cpp
|
||||
@@ -1462,6 +1464,10 @@ set(DUSK_FILES
|
||||
src/dusk/imgui/ImGuiStateShare.cpp
|
||||
src/dusk/imgui/ImGuiStateShare.hpp
|
||||
src/dusk/imgui/ImGuiStubLog.cpp
|
||||
src/dusk/interp/camera.cpp
|
||||
src/dusk/interp/dual_buffer.cpp
|
||||
src/dusk/interp/frame_interpolation.cpp
|
||||
src/dusk/interp/line.cpp
|
||||
src/dusk/io.cpp
|
||||
src/dusk/iso_validate.cpp
|
||||
src/dusk/language.cpp
|
||||
@@ -1478,10 +1484,20 @@ set(DUSK_FILES
|
||||
src/dusk/mods/loader/depgraph.hpp
|
||||
src/dusk/mods/loader/loader.cpp
|
||||
src/dusk/mods/loader/loader.hpp
|
||||
src/dusk/mods/loader/manifest.cpp
|
||||
src/dusk/mods/loader/manifest.hpp
|
||||
src/dusk/mods/loader/natives.cpp
|
||||
src/dusk/mods/loader/natives.hpp
|
||||
src/dusk/mods/loader/packages.cpp
|
||||
src/dusk/mods/loader/packages.hpp
|
||||
src/dusk/mods/loader/native_module.cpp
|
||||
src/dusk/mods/loader/native_module.hpp
|
||||
src/dusk/mods/loader/prepatch.cpp
|
||||
src/dusk/mods/loader/prepatch.hpp
|
||||
src/dusk/mods/catalog.cpp
|
||||
src/dusk/mods/catalog.hpp
|
||||
src/dusk/mods/queue.cpp
|
||||
src/dusk/mods/queue.hpp
|
||||
src/dusk/mods/item.hpp
|
||||
src/dusk/mods/item_actor.cpp
|
||||
src/dusk/mods/item_checks.cpp
|
||||
@@ -1558,6 +1574,8 @@ set(DUSK_FILES
|
||||
src/dusk/ui/controls.hpp
|
||||
src/dusk/ui/document.cpp
|
||||
src/dusk/ui/document.hpp
|
||||
src/dusk/ui/drop_install_modal.cpp
|
||||
src/dusk/ui/drop_install_modal.hpp
|
||||
src/dusk/ui/editor.cpp
|
||||
src/dusk/ui/editor.hpp
|
||||
src/dusk/ui/event.cpp
|
||||
@@ -1578,8 +1596,18 @@ set(DUSK_FILES
|
||||
src/dusk/ui/list.hpp
|
||||
src/dusk/ui/menu_bar.cpp
|
||||
src/dusk/ui/menu_bar.hpp
|
||||
src/dusk/ui/mod_browser.cpp
|
||||
src/dusk/ui/mod_browser.hpp
|
||||
src/dusk/ui/queue_window.cpp
|
||||
src/dusk/ui/queue_window.hpp
|
||||
src/dusk/ui/package_row.cpp
|
||||
src/dusk/ui/package_row.hpp
|
||||
src/dusk/ui/mod_texture_provider.cpp
|
||||
src/dusk/ui/mod_texture_provider.hpp
|
||||
src/dusk/ui/remote_texture_provider.cpp
|
||||
src/dusk/ui/remote_texture_provider.hpp
|
||||
src/dusk/ui/runtime_image.cpp
|
||||
src/dusk/ui/runtime_image.hpp
|
||||
src/dusk/ui/mod_window.cpp
|
||||
src/dusk/ui/mod_window.hpp
|
||||
src/dusk/ui/modal.cpp
|
||||
@@ -1589,6 +1617,12 @@ set(DUSK_FILES
|
||||
src/dusk/ui/nav_types.hpp
|
||||
src/dusk/ui/nav_group.cpp
|
||||
src/dusk/ui/nav_group.hpp
|
||||
src/dusk/ui/context_menu.cpp
|
||||
src/dusk/ui/context_menu.hpp
|
||||
src/dusk/ui/icon_button.cpp
|
||||
src/dusk/ui/icon_button.hpp
|
||||
src/dusk/ui/tooltip.cpp
|
||||
src/dusk/ui/tooltip.hpp
|
||||
src/dusk/ui/number_button.cpp
|
||||
src/dusk/ui/number_button.hpp
|
||||
src/dusk/ui/overlay.cpp
|
||||
|
||||
@@ -4556,29 +4556,6 @@ public:
|
||||
bool checkAimContext();
|
||||
bool checkAimInputContext();
|
||||
|
||||
void onIronBallChainInterpCallback();
|
||||
|
||||
static const int IRON_BALL_CHAIN_COUNT = 102;
|
||||
cXyz mIBChainInterpPrevPos[IRON_BALL_CHAIN_COUNT];
|
||||
cXyz mIBChainInterpCurrPos[IRON_BALL_CHAIN_COUNT];
|
||||
csXyz mIBChainInterpPrevAngle[IRON_BALL_CHAIN_COUNT];
|
||||
csXyz mIBChainInterpCurrAngle[IRON_BALL_CHAIN_COUNT];
|
||||
cXyz mIBChainInterpPrevHandRoot;
|
||||
cXyz mIBChainInterpCurrHandRoot;
|
||||
bool mIBChainInterpPrevValid;
|
||||
bool mIBChainInterpCurrValid;
|
||||
|
||||
cXyz mHsChainInterpPrevTop;
|
||||
cXyz mHsChainInterpCurrTop;
|
||||
cXyz mHsChainInterpPrevRoot;
|
||||
cXyz mHsChainInterpCurrRoot;
|
||||
cXyz mHsChainInterpPrevSubRoot;
|
||||
cXyz mHsChainInterpCurrSubRoot;
|
||||
cXyz mHsChainInterpPrevSubTop;
|
||||
cXyz mHsChainInterpCurrSubTop;
|
||||
bool mHsChainInterpPrevValid;
|
||||
bool mHsChainInterpCurrValid;
|
||||
|
||||
bool mIsRollstab = false;
|
||||
void* mAnmBuffers[3] = {};
|
||||
#endif
|
||||
|
||||
@@ -189,12 +189,6 @@ public:
|
||||
/* 0x2740 */ u8 field_0x2740;
|
||||
/* 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
|
||||
};
|
||||
|
||||
@@ -80,12 +80,6 @@ public:
|
||||
/* 0x125C */ u32 field_0x125c;
|
||||
/* 0x1260 */ u8 field_0x1260[0x126C - 0x1260];
|
||||
/* 0x126C */ u8 HIOInit;
|
||||
#if TARGET_PC
|
||||
cXyz mStalkLineInterpPrev[12];
|
||||
cXyz mStalkLineInterpCurr[12];
|
||||
bool mStalkLineInterpPrevValid;
|
||||
bool mStalkLineInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_db_class) == 0x1270);
|
||||
|
||||
@@ -73,12 +73,6 @@ public:
|
||||
/* 0x124C */ f32 field_0x124c;
|
||||
/* 0x1250 */ u8 field_0x1250[0x1264 - 0x1250];
|
||||
/* 0x1264 */ u8 HIOInit;
|
||||
#if TARGET_PC
|
||||
cXyz mStalkLineInterpPrev[12];
|
||||
cXyz mStalkLineInterpCurr[12];
|
||||
bool mStalkLineInterpPrevValid;
|
||||
bool mStalkLineInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_hb_class) == 0x1268);
|
||||
|
||||
@@ -44,12 +44,6 @@ public:
|
||||
/* 0x88C */ u8 field_0x88C[0x8C8 - 0x88C];
|
||||
/* 0x8C8 */ s8 field_0x8c8;
|
||||
/* 0x8C9 */ u8 mInitHIO;
|
||||
#if TARGET_PC
|
||||
cXyz mRopeInterpPrev[16];
|
||||
cXyz mRopeInterpCurr[16];
|
||||
bool mRopeInterpPrevValid;
|
||||
bool mRopeInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_mb_class) == 0x8cc);
|
||||
|
||||
@@ -81,15 +81,6 @@ public:
|
||||
/* 0x306D */ u8 field_0x306D[0x307C - 0x306D];
|
||||
/* 0x307C */ u32 mBodyEffEmtrID;
|
||||
/* 0x3080 */ u8 mInitHIO;
|
||||
|
||||
#if TARGET_PC
|
||||
static const int HAIR_STRAND_COUNT = 22;
|
||||
static const int HAIR_SEGMENT_COUNT = 16;
|
||||
cXyz mHairInterpPrev[HAIR_STRAND_COUNT * HAIR_SEGMENT_COUNT];
|
||||
cXyz mHairInterpCurr[HAIR_STRAND_COUNT * HAIR_SEGMENT_COUNT];
|
||||
bool mHairInterpPrevValid;
|
||||
bool mHairInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_s1_class) == 0x3084);
|
||||
|
||||
@@ -221,12 +221,6 @@ public:
|
||||
/* 0x17E4 */ u8 field_0x17e4[0x17e8 - 0x17e4];
|
||||
/* 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
|
||||
};
|
||||
|
||||
@@ -74,12 +74,6 @@ public:
|
||||
/* 0x1250 */ f32 field_0x1250;
|
||||
/* 0x1254 */ u8 field_0x1254[0x1268 - 0x1254];
|
||||
/* 0x1268 */ u8 field_0x1268;
|
||||
#if TARGET_PC
|
||||
cXyz mLineMatInterpPrev[12];
|
||||
cXyz mLineMatInterpCurr[12];
|
||||
bool mLineMatInterpPrevValid;
|
||||
bool mLineMatInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_yd_class) == 0x126c);
|
||||
|
||||
@@ -63,15 +63,6 @@ public:
|
||||
/* 0x0BB4 */ yg_ke_s mYgKes[13];
|
||||
/* 0x1880 */ mDoExt_3DlineMat0_c mLineMat;
|
||||
/* 0x189C */ u8 mIsFirstSpawn;
|
||||
|
||||
#if TARGET_PC
|
||||
static const int TENTACLE_STRAND_COUNT = 13;
|
||||
static const int TENTACLE_SEGMENT_COUNT = 10;
|
||||
cXyz mTentacleInterpPrev[TENTACLE_STRAND_COUNT * TENTACLE_SEGMENT_COUNT];
|
||||
cXyz mTentacleInterpCurr[TENTACLE_STRAND_COUNT * TENTACLE_SEGMENT_COUNT];
|
||||
bool mTentacleInterpPrevValid;
|
||||
bool mTentacleInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_yg_class) == 0x18a0);
|
||||
|
||||
@@ -77,12 +77,6 @@ public:
|
||||
/* 0x1260 */ u32 field_0x1260;
|
||||
/* 0x1260 */ u8 field_0x1264[0x1270 - 0x1264];
|
||||
/* 0x1270 */ bool mIsHIOOwner;
|
||||
#if TARGET_PC
|
||||
cXyz mLineInterpPrev[12];
|
||||
cXyz mLineInterpCurr[12];
|
||||
bool mLineInterpPrevValid;
|
||||
bool mLineInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(e_yh_class) == 0x1274);
|
||||
|
||||
@@ -196,9 +196,6 @@ public:
|
||||
void copyReinPos();
|
||||
void setReinPosHandSubstance(int);
|
||||
void setReinPosNormalSubstance();
|
||||
#if TARGET_PC
|
||||
void lerpControlPoints(f32 alpha);
|
||||
#endif
|
||||
void bgCheck();
|
||||
bool checkSpecialWallHitSubstance(cXyz const&) const;
|
||||
void setServiceWaitTimer();
|
||||
|
||||
@@ -299,13 +299,6 @@ public:
|
||||
/* 0x168C */ u8 field_0x168c;
|
||||
/* 0x168D */ u8 field_0x168d;
|
||||
/* 0x168E */ u8 HIOInit;
|
||||
|
||||
#if TARGET_PC
|
||||
cXyz mLineInterpPrev[MG_ROD_LURE_LINE_LEN];
|
||||
cXyz mLineInterpCurr[MG_ROD_LURE_LINE_LEN];
|
||||
bool mLineInterpPrevValid;
|
||||
bool mLineInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* D_A_MG_ROD_H */
|
||||
|
||||
@@ -370,6 +370,9 @@ public:
|
||||
u32 getAngleNoFromParam() { return (u8)(fopAcM_GetParam(this) >> 8); }
|
||||
void setBlastFlag(u8 i_flag) { mBlastFlag = i_flag; }
|
||||
MtxP getHeadMtx() { return mAnm_p->getModel()->getAnmMtx(4); }
|
||||
#if TARGET_PC
|
||||
friend void daNpc_zrA_interp_callback(void* pUserWork);
|
||||
#endif
|
||||
|
||||
/* 0x0B48 */ Z2Creature mCreatureSound;
|
||||
/* 0x0BD8 */ J3DModel* mpObjectModel[3];
|
||||
|
||||
@@ -31,10 +31,6 @@ public:
|
||||
csXyz* getAngle() { return field_0x8a4; }
|
||||
J3DModelData* getModelData() { return mModelData; }
|
||||
|
||||
#if TARGET_PC
|
||||
void onInterpCallback();
|
||||
#endif
|
||||
|
||||
/* 0x568 */ request_of_phase_process_class mPhase;
|
||||
/* 0x570 */ J3DModelData* mModelData;
|
||||
/* 0x574 */ daObjFchain_shape_c mShape;
|
||||
@@ -45,14 +41,6 @@ public:
|
||||
/* 0x694 */ cXyz field_0x694[22];
|
||||
/* 0x79C */ cXyz field_0x79c[22];
|
||||
/* 0x8A4 */ csXyz field_0x8a4[22];
|
||||
|
||||
#if TARGET_PC
|
||||
static const int CHAIN_COUNT = 22;
|
||||
cXyz mChainInterpPrev[CHAIN_COUNT];
|
||||
cXyz mChainInterpCurr[CHAIN_COUNT];
|
||||
bool mChainInterpPrevValid;
|
||||
bool mChainInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
STATIC_ASSERT(sizeof(daObjFchain_c) == 0x928);
|
||||
|
||||
@@ -66,18 +66,9 @@ public:
|
||||
/* 0x2CA7 */ s8 hide_lock;
|
||||
/* 0x2CA8 */ cXyz field_0x2ca8;
|
||||
/* 0x2CB4 */ u8 field_0x2cb4;
|
||||
|
||||
#if TARGET_PC
|
||||
Mtx mChainInterpPrev[6][16];
|
||||
Mtx mChainInterpCurr[6][16];
|
||||
bool mChainInterpPrevValid;
|
||||
bool mChainInterpCurrValid;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !TARGET_PC
|
||||
STATIC_ASSERT(sizeof(obj_keyhole_class) == 0x2CB8);
|
||||
#endif
|
||||
|
||||
class daObj_Keyhole_HIO_c : public JORReflexible {
|
||||
public:
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
int Delete();
|
||||
|
||||
#if TARGET_PC
|
||||
void onInterpCallback();
|
||||
void onInterpPresentation();
|
||||
#endif
|
||||
|
||||
enum Param_e {
|
||||
@@ -53,13 +53,6 @@ public:
|
||||
/* 0x1020 */ dCcD_Cyl mCylinderCollider;
|
||||
/* 0x115C */ s32 mStopSwingingFrames;
|
||||
|
||||
#if TARGET_PC
|
||||
cXyz mChainInterpPrev[64];
|
||||
cXyz mChainInterpCurr[64];
|
||||
bool mChainInterpPrevValid;
|
||||
bool mChainInterpCurrValid;
|
||||
#endif
|
||||
|
||||
// Number of chain models
|
||||
u32 getArg0() {
|
||||
return fopAcM_GetParamBit(this, 0, 6);
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
int Draw();
|
||||
int Delete();
|
||||
#if TARGET_PC
|
||||
friend void daL8Lift_interp_callback(bool isSimFrame, void* pUserWork);
|
||||
friend void daL8Lift_interp_callback(void* pUserWork);
|
||||
#endif
|
||||
|
||||
u8 getPthID() { return fopAcM_GetParamBit(this, 0, 8); }
|
||||
|
||||
@@ -441,7 +441,7 @@ public:
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void refresh3DlineMats(const cXyz& eye);
|
||||
void refresh3DlineMats();
|
||||
#endif
|
||||
|
||||
void peekZdata() { mPeekZ.peekData(); }
|
||||
|
||||
+15
-12
@@ -542,10 +542,18 @@ public:
|
||||
virtual void setMaterial() = 0;
|
||||
virtual void draw() = 0;
|
||||
#if TARGET_PC
|
||||
virtual void refreshGeometryForPresentationEye(const cXyz& eye) {}
|
||||
virtual void captureInterpPoints() {}
|
||||
virtual void refreshGeometryForPresentation() {}
|
||||
#endif
|
||||
|
||||
/* 0x4 */ mDoExt_3DlineMat_c* field_0x4;
|
||||
|
||||
#if TARGET_PC
|
||||
protected:
|
||||
u8 mInterpKind;
|
||||
f32 mInterpWidth;
|
||||
u16 mInterpTaper;
|
||||
#endif
|
||||
};
|
||||
|
||||
class mDoExt_3DlineMat0_c : public mDoExt_3DlineMat_c {
|
||||
@@ -567,6 +575,10 @@ public:
|
||||
virtual int getMaterialID() { return 0; }
|
||||
virtual void setMaterial();
|
||||
virtual void draw();
|
||||
#if TARGET_PC
|
||||
void captureInterpPoints() override;
|
||||
void refreshGeometryForPresentation() override;
|
||||
#endif
|
||||
|
||||
cXyz* getPos(int param_0) { return field_0x18[param_0].field_0x0; }
|
||||
f32* getSize(int param_0) { return field_0x18[param_0].field_0x4; }
|
||||
@@ -585,18 +597,14 @@ class dKy_tevstr_c;
|
||||
class mDoExt_3DlineMat1_c : public mDoExt_3DlineMat_c {
|
||||
public:
|
||||
int init(u16, u16, ResTIMG*, int);
|
||||
#if TARGET_PC
|
||||
void update(int, GXColor&, dKy_tevstr_c*, const cXyz* presentationEye = nullptr);
|
||||
void update(int, f32, GXColor&, u16, dKy_tevstr_c*, const cXyz* presentationEye = nullptr);
|
||||
#else
|
||||
void update(int, GXColor&, dKy_tevstr_c*);
|
||||
void update(int, f32, GXColor&, u16, dKy_tevstr_c*);
|
||||
#endif
|
||||
int getMaterialID() { return 1; }
|
||||
void setMaterial();
|
||||
void draw();
|
||||
#if TARGET_PC
|
||||
void refreshGeometryForPresentationEye(const cXyz& eye) override;
|
||||
void captureInterpPoints() override;
|
||||
void refreshGeometryForPresentation() override;
|
||||
#endif
|
||||
|
||||
cXyz* getPos(int i_idx) { return mpLines[i_idx].field_0x0; }
|
||||
@@ -611,11 +619,6 @@ private:
|
||||
/* 0x34 */ u16 field_0x34;
|
||||
/* 0x36 */ u8 mIsDrawn;
|
||||
/* 0x38 */ mDoExt_3Dline_c* mpLines;
|
||||
#if TARGET_PC
|
||||
u8 mInterpLineKind;
|
||||
f32 mInterpLineF;
|
||||
u16 mInterpLineU16;
|
||||
#endif
|
||||
};
|
||||
|
||||
class mDoExt_3DlineMat2_c : public mDoExt_3DlineMat1_c {
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
|
||||
#include <types.h>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "helpers/endian.h"
|
||||
#endif
|
||||
|
||||
class JSUInputStream;
|
||||
|
||||
/**
|
||||
|
||||
@@ -79,7 +79,9 @@ public:
|
||||
virtual ~J3DModel() {}
|
||||
|
||||
#if TARGET_PC
|
||||
static void interp_callback(bool isSimFrame, void* pUserWork);
|
||||
static void interp_callback(void* pUserWork);
|
||||
void calc_presentation_base_mtx();
|
||||
void prepare_presentation_view();
|
||||
#endif
|
||||
|
||||
J3DModelData* getModelData() { return mModelData; }
|
||||
@@ -133,6 +135,9 @@ public:
|
||||
/* 0xD0 */ J3DVtxColorCalc* mVtxColorCalc;
|
||||
/* 0xD4 */ J3DUnkCalc1* mUnkCalc1;
|
||||
/* 0xD8 */ J3DUnkCalc2* mUnkCalc2;
|
||||
#if TARGET_PC
|
||||
Mtx mPresentationBase;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* J3DMODEL_H */
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "JSystem/JKernel/JKRHeap.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
#define J3D_ASSERTMSG(LINE, COND, MSG) JUT_ASSERT_MSG(LINE, (COND) != 0, MSG)
|
||||
@@ -29,6 +29,7 @@ void J3DModel::initialize() {
|
||||
|
||||
MTXIdentity(mBaseTransformMtx);
|
||||
MTXIdentity(mInternalView);
|
||||
IF_DUSK(MTXIdentity(mPresentationBase));
|
||||
|
||||
mMtxBuffer = NULL;
|
||||
mMatPacket = NULL;
|
||||
@@ -101,17 +102,32 @@ s32 J3DModel::entryModelData(J3DModelData* pModelData, u32 mdlFlags, u32 mtxNum)
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void J3DModel::interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
void J3DModel::interp_callback(void* pUserWork) {
|
||||
J3DModel* i_this = static_cast<J3DModel*>(pUserWork);
|
||||
if (!isSimFrame) {
|
||||
i_this->calcMaterial();
|
||||
i_this->diff();
|
||||
}
|
||||
i_this->calcMaterial();
|
||||
i_this->diff();
|
||||
}
|
||||
|
||||
void J3DModel::setAnmMtx(int jointNo, Mtx m) {
|
||||
mMtxBuffer->setAnmMtx(jointNo, m);
|
||||
dusk::frame_interp::record_final_mtx(mMtxBuffer->getAnmMtx(jointNo));
|
||||
dusk::interp::record_final_mtx(mMtxBuffer->getAnmMtx(jointNo));
|
||||
}
|
||||
|
||||
void J3DModel::calc_presentation_base_mtx() {
|
||||
Mtx identity;
|
||||
MTXIdentity(identity);
|
||||
J3DCalcViewBaseMtx(identity, mBaseScale, mBaseTransformMtx, mPresentationBase);
|
||||
dusk::interp::record_final_mtx(mPresentationBase);
|
||||
prepare_presentation_view();
|
||||
}
|
||||
|
||||
void J3DModel::prepare_presentation_view() {
|
||||
Mtx replacement;
|
||||
MtxP presentationBase = mPresentationBase;
|
||||
if (dusk::interp::lookup_replacement(mPresentationBase, replacement)) {
|
||||
presentationBase = replacement;
|
||||
}
|
||||
MTXConcat(j3dSys.getViewMtx(), presentationBase, mInternalView);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -470,11 +486,11 @@ void J3DModel::calc() {
|
||||
|
||||
#ifdef TARGET_PC
|
||||
for (u16 i = 0; i < mModelData->getJointNum(); ++i) {
|
||||
dusk::frame_interp::record_final_mtx(getAnmMtx(i));
|
||||
dusk::interp::record_final_mtx(getAnmMtx(i));
|
||||
}
|
||||
|
||||
for (u16 i = 0; i < mModelData->getWEvlpMtxNum(); ++i) {
|
||||
dusk::frame_interp::record_final_mtx(getWeightAnmMtx(i));
|
||||
dusk::interp::record_final_mtx(getWeightAnmMtx(i));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -505,8 +521,9 @@ void J3DModel::entry() {
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
if (mModelData->needsInterpCallBack())
|
||||
dusk::frame_interp::add_interpolation_callback(&J3DModel::interp_callback, this);
|
||||
if (mModelData->needsInterpCallBack()) {
|
||||
dusk::interp::add_interpolation_callback(&J3DModel::interp_callback, this);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -516,18 +533,20 @@ void J3DModel::viewCalc() {
|
||||
|
||||
if (getModelData()->checkFlag(0x10)) {
|
||||
if (getMtxCalcMode() == 2) {
|
||||
#if TARGET_PC
|
||||
calc_presentation_base_mtx();
|
||||
#else
|
||||
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
||||
(MtxP)&mInternalView);
|
||||
#ifdef TARGET_PC
|
||||
dusk::frame_interp::record_final_mtx(mInternalView);
|
||||
#endif
|
||||
}
|
||||
} else if (isCpuSkinningOn()) {
|
||||
if (getMtxCalcMode() == 2) {
|
||||
#if TARGET_PC
|
||||
calc_presentation_base_mtx();
|
||||
#else
|
||||
J3DCalcViewBaseMtx(j3dSys.getViewMtx(), mBaseScale, mBaseTransformMtx,
|
||||
(MtxP)&mInternalView);
|
||||
#ifdef TARGET_PC
|
||||
dusk::frame_interp::record_final_mtx(mInternalView);
|
||||
#endif
|
||||
}
|
||||
} else if (checkFlag(J3DMdlFlag_SkinPosCpu)) {
|
||||
@@ -549,15 +568,6 @@ void J3DModel::viewCalc() {
|
||||
DCStoreRange(getNrmMtxPtr(), mModelData->getDrawMtxNum() * sizeof(Mtx33));
|
||||
}
|
||||
|
||||
#ifdef TARGET_PC
|
||||
Mtx* drawMtx = getDrawMtxPtr();
|
||||
if (drawMtx != J3DMtxBuffer::sNoUseDrawMtxPtr) {
|
||||
for (u16 i = 0; i < mModelData->getDrawMtxNum(); ++i) {
|
||||
dusk::frame_interp::record_final_mtx(drawMtx[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
prepareShapePackets();
|
||||
}
|
||||
|
||||
|
||||
@@ -342,6 +342,11 @@ int J3DShapePacket::newDifferedDisplayList(u32 diffFlags) {
|
||||
void J3DShapePacket::prepareDraw() const {
|
||||
mpModel->getVertexBuffer()->setArray();
|
||||
j3dSys.setModel(mpModel);
|
||||
#if TARGET_PC
|
||||
if (mpModel->getMtxCalcMode() == 2) {
|
||||
mpModel->prepare_presentation_view();
|
||||
}
|
||||
#endif
|
||||
j3dSys.setShapePacket((J3DShapePacket*)this);
|
||||
|
||||
J3DShapeMtx::setLODFlag(mpModel->checkFlag(J3DMdlFlag_EnableLOD) != 0);
|
||||
|
||||
@@ -8,14 +8,14 @@
|
||||
#include "JSystem/J3DGraphBase/J3DTexture.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
DUSK_GAME_DATA u16 J3DShapeMtx::sMtxLoadCache[10];
|
||||
|
||||
#if TARGET_PC
|
||||
static void J3DFrameInterpConcat(MtxP lhs, MtxP rhs, Mtx out) {
|
||||
if (!dusk::frame_interp::lookup_concat_replacement(lhs, rhs, out)) {
|
||||
if (!dusk::interp::lookup_concat_replacement(lhs, rhs, out)) {
|
||||
MTXConcat(lhs, rhs, out);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "global.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "helpers/gx_helper.h"
|
||||
|
||||
#include <tracy/Tracy.hpp>
|
||||
@@ -379,7 +379,7 @@ void J3DSys::reinitPixelProc() {
|
||||
#if TARGET_PC
|
||||
void J3DSys::setViewMtx(const Mtx m) {
|
||||
Mtx patched;
|
||||
if (dusk::frame_interp::lookup_replacement(m, patched)) {
|
||||
if (dusk::interp::lookup_replacement(m, patched)) {
|
||||
m = patched;
|
||||
}
|
||||
MTXCopy(m, mViewMtx);
|
||||
|
||||
@@ -176,11 +176,7 @@ void JASChannel::updateEffectorParam(JASDsp::TChannel* i_channel, u16* i_mixerVo
|
||||
|
||||
f32 pan = 0.5f;
|
||||
f32 dolby = 0.0f;
|
||||
#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:
|
||||
break;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "JSystem/JAudio2/JASDriverIF.h"
|
||||
#include "JSystem/JAudio2/JASAiCtrl.h"
|
||||
#include "JSystem/JAudio2/JASDSPInterface.h"
|
||||
#include "dusk/settings.h"
|
||||
#include <os.h>
|
||||
|
||||
void JASDriver::setDSPLevel(f32 param_0) {
|
||||
@@ -30,7 +31,18 @@ void JASDriver::setOutputMode(u32 mode) {
|
||||
}
|
||||
|
||||
u32 JASDriver::getOutputMode() {
|
||||
#ifdef TARGET_PC
|
||||
switch (dusk::getSettings().audio.outputMode) {
|
||||
case dusk::AudioOutputMode::StereoSpeakers:
|
||||
return JAS_OUTPUT_STEREO;
|
||||
case dusk::AudioOutputMode::StereoHeadphones:
|
||||
case dusk::AudioOutputMode::Surround6ch:
|
||||
case dusk::AudioOutputMode::Surround8ch:
|
||||
return JAS_OUTPUT_SURROUND;
|
||||
}
|
||||
#else
|
||||
return JASDriver::JAS_SYSTEM_OUTPUT_MODE;
|
||||
#endif
|
||||
}
|
||||
|
||||
void JASDriver::waitSubFrame() {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/dusk.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "dusk/logging.h"
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/time.h"
|
||||
@@ -218,8 +218,8 @@ void JFWDisplay::endGX() {
|
||||
|
||||
if (mFader != NULL) {
|
||||
ortho.setPort();
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::frame_interp::get_ui_tick_pending()) {
|
||||
#if TARGET_PC
|
||||
if (dusk::interp::get_ui_tick_pending()) {
|
||||
mFader->advance();
|
||||
}
|
||||
if (mFader->getStatus() != JUTFader::Wait) {
|
||||
@@ -382,7 +382,7 @@ static void waitForTick(u32 p1, u16 p2) {
|
||||
#if TARGET_PC
|
||||
static Limiter limiter;
|
||||
|
||||
if (dusk::frame_interp::is_enabled() || dusk::getTransientSettings().turboMode) {
|
||||
if (dusk::interp::is_enabled() || dusk::getTransientSettings().turboMode) {
|
||||
limiter.Reset();
|
||||
dusk::frameUsagePct = 0.f;
|
||||
return;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <gx.h>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
|
||||
#include <tracy/Tracy.hpp>
|
||||
#endif
|
||||
@@ -552,7 +552,7 @@ static void submit_particle_quad(
|
||||
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);
|
||||
dusk::interp::record_final_mtx(ptclPosMtx, ptcl);
|
||||
}
|
||||
|
||||
void JPAInterpRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
@@ -564,7 +564,7 @@ void JPAInterpRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
ptclPosMtx[0][1] = -sinRot;
|
||||
ptclPosMtx[1][0] = sinRot;
|
||||
ptclPosMtx[1][1] = cosRot;
|
||||
dusk::frame_interp::record_final_mtx(ptclPosMtx, ptcl);
|
||||
dusk::interp::record_final_mtx(ptclPosMtx, ptcl);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -577,7 +577,7 @@ void JPADrawBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_C
|
||||
JGeometry::TVec3<f32> pos;
|
||||
#if TARGET_PC
|
||||
Mtx ptclPosMtx;
|
||||
if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||
if (dusk::interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||
pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]);
|
||||
MTXMultVec(work->mPosCamMtx, &pos, &pos);
|
||||
} else
|
||||
@@ -617,7 +617,7 @@ void JPADrawRotBillboard(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRA
|
||||
#if TARGET_PC
|
||||
Mtx ptclPosMtx;
|
||||
MTXTrans(ptclPosMtx, ptcl->mPosition.x, ptcl->mPosition.y, ptcl->mPosition.z);
|
||||
if (dusk::frame_interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||
if (dusk::interp::lookup_replacement(ptcl, ptclPosMtx)) {
|
||||
pos.set(ptclPosMtx[0][3], ptclPosMtx[1][3], ptclPosMtx[2][3]);
|
||||
sinRot = ptclPosMtx[1][0];
|
||||
cosRot = ptclPosMtx[0][0];
|
||||
@@ -994,7 +994,7 @@ void JPAInterpDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
posMtx[2][2] = axisZ.z;
|
||||
posMtx[2][3] = ptcl->mPosition.z;
|
||||
p_plane[work->mPlaneType](posMtx, scaleX, scaleY);
|
||||
dusk::frame_interp::record_final_mtx(posMtx, ptcl);
|
||||
dusk::interp::record_final_mtx(posMtx, ptcl);
|
||||
}
|
||||
|
||||
void JPAInterpRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
@@ -1037,7 +1037,7 @@ void JPAInterpRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl) {
|
||||
mtx2[2][2] = axisZ.z;
|
||||
mtx2[2][3] = ptcl->mPosition.z;
|
||||
MTXConcat(mtx2, mtx1, mtx1);
|
||||
dusk::frame_interp::record_final_mtx(mtx1, ptcl);
|
||||
dusk::interp::record_final_mtx(mtx1, ptcl);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1050,7 +1050,7 @@ void JPADrawDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRAW_C
|
||||
|
||||
Mtx posMtx;
|
||||
#if TARGET_PC
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, posMtx) &&
|
||||
if (!dusk::interp::lookup_replacement(ptcl, posMtx) &&
|
||||
!make_direction_mtx(work, ptcl, posMtx))
|
||||
{
|
||||
return;
|
||||
@@ -1113,7 +1113,7 @@ void JPADrawRotDirection(JPAEmitterWorkData* work, JPABaseParticle* ptcl JPA_DRA
|
||||
Mtx mtx1;
|
||||
Mtx mtx2;
|
||||
#if TARGET_PC
|
||||
if (!dusk::frame_interp::lookup_replacement(ptcl, mtx1) &&
|
||||
if (!dusk::interp::lookup_replacement(ptcl, mtx1) &&
|
||||
!make_rot_direction_mtx(work, ptcl, mtx1))
|
||||
{
|
||||
return;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "JSystem/JParticle/JPAExtraShape.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
JPAParticleCallBack::~JPAParticleCallBack() {
|
||||
@@ -210,7 +210,7 @@ void JPABaseParticle::init_c(JPAEmitterWorkData* work, JPABaseParticle* parent)
|
||||
|
||||
#if TARGET_PC
|
||||
void JPABaseParticle::interp(JPAEmitterWorkData* work, void const* drawFunc) {
|
||||
if (!dusk::frame_interp::is_enabled())
|
||||
if (!dusk::interp::is_enabled())
|
||||
return;
|
||||
|
||||
// don't interpolate the first frame
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "global.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
|
||||
#include <tracy/Tracy.hpp>
|
||||
|
||||
@@ -839,7 +839,7 @@ bool JPAResource::calc(JPAEmitterWorkData* work, JPABaseEmitter* emtr) {
|
||||
|
||||
#ifdef TARGET_PC
|
||||
if (((pBsp && pBsp->getDirType() == 3) || (pCsp && pCsp->getDirType() == 3)) &&
|
||||
dusk::frame_interp::is_enabled())
|
||||
dusk::interp::is_enabled())
|
||||
{
|
||||
// ensure mGlobalEmtrDir is valid
|
||||
calcWorkData_d(work);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/audio.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#endif
|
||||
|
||||
@@ -655,10 +655,10 @@ value_or_fun:
|
||||
|
||||
value:
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled() && u <= 5 &&
|
||||
if (dusk::interp::is_enabled() && u <= 5 &&
|
||||
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
||||
{
|
||||
dusk::frame_interp::request_presentation_sync();
|
||||
dusk::interp::request_presentation_sync();
|
||||
}
|
||||
#endif
|
||||
adaptor->adaptor_setVariableValue(control, u, operation, param_2, param_3);
|
||||
@@ -666,11 +666,11 @@ value:
|
||||
|
||||
value_n:
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled() &&
|
||||
if (dusk::interp::is_enabled() &&
|
||||
(pN == TAdaptor_camera::sauVariableValue_3_POSITION_XYZ || pN == TAdaptor_camera::sauVariableValue_3_TARGET_POSITION_XYZ) &&
|
||||
(operation == data::UNK_0x2 || operation == data::UNK_0x3 || operation == data::UNK_0x12))
|
||||
{
|
||||
dusk::frame_interp::request_presentation_sync();
|
||||
dusk::interp::request_presentation_sync();
|
||||
}
|
||||
#endif
|
||||
adaptor->adaptor_setVariableValue_n(control, pN, u, operation, param_2, param_3);
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
|
||||
|
||||
#ifdef TARGET_PC
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
JUTFader::JUTFader(int x, int y, int width, int height, JUtility::TColor pColor)
|
||||
@@ -74,8 +75,8 @@ void JUTFader::control() {
|
||||
void JUTFader::draw() {
|
||||
if (mColor.a != 0) {
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled() && mDuration != 0) {
|
||||
const auto step = dusk::frame_interp::get_interpolation_step();
|
||||
if (dusk::interp::is_enabled() && mDuration != 0) {
|
||||
const auto step = dusk::interp::get_interpolation_step();
|
||||
const auto progress = static_cast<f32>(mTimer) / static_cast<f32>(mDuration);
|
||||
const auto timer = mTimer - 1 + step + progress;
|
||||
auto alpha = timer / mDuration;
|
||||
|
||||
@@ -161,6 +161,7 @@ std::optional<std::string> normalize_module_path(
|
||||
}
|
||||
|
||||
int module_require(lua_State* state);
|
||||
int print(lua_State* state);
|
||||
|
||||
void install_module_require(lua_State* state, Vm& vm, std::string_view currentPath) {
|
||||
lua_pushlightuserdata(state, &vm);
|
||||
@@ -169,6 +170,11 @@ void install_module_require(lua_State* state, Vm& vm, std::string_view currentPa
|
||||
lua_setglobal(state, "require");
|
||||
}
|
||||
|
||||
void install_globals(Vm& vm) {
|
||||
push_vm_closure(vm.state, vm, print, "print");
|
||||
lua_setglobal(vm.state, "print");
|
||||
}
|
||||
|
||||
bool load_source_module(
|
||||
lua_State* caller, Vm& vm, const std::string& path, bool keepResult, std::string& outError) {
|
||||
if (svc_resource == nullptr) {
|
||||
@@ -281,6 +287,29 @@ int module_require(lua_State* state) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int print(lua_State* state) {
|
||||
Vm& vm = vm_from_upvalue(state);
|
||||
if (svc_log == nullptr) {
|
||||
service_unavailable(state, "LogService");
|
||||
}
|
||||
|
||||
std::string value;
|
||||
int const numArgs = lua_gettop(state);
|
||||
for (int i = 0; i < numArgs; i += 1) {
|
||||
if (i != 0) {
|
||||
value.push_back('\t');
|
||||
}
|
||||
|
||||
size_t length;
|
||||
char const* str = luaL_tolstring(state, i + 1, &length);
|
||||
value.append(str, length);
|
||||
lua_pop(state, 1);
|
||||
}
|
||||
|
||||
svc_log->info(vm.subject, value.data());
|
||||
return 0;
|
||||
}
|
||||
|
||||
ModResult runtime_activate(ModContext*, ModContext* subject, ModError* outError) {
|
||||
if (subject == nullptr) {
|
||||
return set_error(outError, MOD_INVALID_ARGUMENT, "Delegated mod context is null");
|
||||
@@ -298,6 +327,7 @@ ModResult runtime_activate(ModContext*, ModContext* subject, ModError* outError)
|
||||
lua_pushlightuserdata(vm->state, vm.get());
|
||||
lua_rawsetp(vm->state, LUA_REGISTRYINDEX, &vm_registry_index);
|
||||
lua_callbacks(vm->state)->userdata = vm.get();
|
||||
#if NDEBUG // Annoying for debuggers
|
||||
lua_callbacks(vm->state)->interrupt = [](lua_State* state, int gc) {
|
||||
auto* current = static_cast<Vm*>(lua_callbacks(state)->userdata);
|
||||
if (gc < 0 && current != nullptr && current->deadlineActive &&
|
||||
@@ -306,7 +336,9 @@ ModResult runtime_activate(ModContext*, ModContext* subject, ModError* outError)
|
||||
luaL_error(state, "script execution exceeded its time budget");
|
||||
}
|
||||
};
|
||||
#endif
|
||||
luaL_openlibs(vm->state);
|
||||
install_globals(*vm);
|
||||
luaL_sandbox(vm->state);
|
||||
|
||||
std::string error;
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
--console-command-color: #FFD966;
|
||||
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -19,11 +17,11 @@ console {
|
||||
width: 50%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background-color: rgba(0, 0, 0, 60%);
|
||||
background-color: rgba(var(--color-black-rgb), 60%);
|
||||
pointer-events: auto;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 14dp;
|
||||
color: #FFFFFF;
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-sm);
|
||||
color: var(--color-white);
|
||||
transition: background-color 0.8s linear-in-out;
|
||||
}
|
||||
|
||||
@@ -31,7 +29,7 @@ output {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
max-height: 480dp;
|
||||
padding: 4dp 8dp;
|
||||
padding: var(--space-xs) var(--space-sm);
|
||||
line-height: 1.4em;
|
||||
}
|
||||
|
||||
@@ -46,11 +44,11 @@ console:not([open]) {
|
||||
}
|
||||
|
||||
console:not([open])[fading] {
|
||||
background-color: rgba(0, 0, 0, 0%);
|
||||
background-color: rgba(var(--color-black-rgb), 0%);
|
||||
}
|
||||
|
||||
console[open] {
|
||||
background-color: rgba(0, 0, 0, 60%);
|
||||
background-color: rgba(var(--color-black-rgb), 60%);
|
||||
transition: none;
|
||||
}
|
||||
|
||||
@@ -75,19 +73,19 @@ output[open] line {
|
||||
}
|
||||
|
||||
line.cmd {
|
||||
color: #FFD966;
|
||||
color: var(--console-command-color);
|
||||
}
|
||||
|
||||
console input {
|
||||
display: none;
|
||||
width: 100%;
|
||||
background-color: rgba(0, 0, 0, 40%);
|
||||
background-color: rgba(var(--color-black-rgb), 40%);
|
||||
border: 0dp;
|
||||
border-top: 1dp rgba(255, 255, 255, 20%);
|
||||
color: #FFFFFF;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 14dp;
|
||||
padding: 4dp 8dp;
|
||||
border-top: 1dp rgba(var(--color-white-rgb), 20%);
|
||||
color: var(--color-white);
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-sm);
|
||||
padding: var(--space-xs) var(--space-sm);
|
||||
}
|
||||
|
||||
console[open] input {
|
||||
|
||||
+38
-36
@@ -2,19 +2,20 @@ window.logs content {
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
window.logs .log-toolbar {
|
||||
window.logs log-toolbar {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
flex: 0 0 64dp;
|
||||
height: 64dp;
|
||||
flex: 0 0 var(--toolbar-height);
|
||||
height: var(--toolbar-height);
|
||||
align-items: center;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
padding-right: 72dp;
|
||||
background-color: rgba(217, 217, 217, 10%);
|
||||
border-bottom: 2dp #92875B;
|
||||
font-family: "Fira Sans Condensed";
|
||||
background-color: rgba(var(--color-neutral-rgb), 10%);
|
||||
border-bottom-width: 2dp;
|
||||
border-bottom-color: var(--color-border);
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 18dp;
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
window.logs > close {
|
||||
@@ -22,76 +23,77 @@ window.logs > close {
|
||||
right: 8dp;
|
||||
}
|
||||
|
||||
window.logs .log-title {
|
||||
window.logs log-title {
|
||||
align-self: stretch;
|
||||
flex: 0 0 auto;
|
||||
padding: 0 24dp;
|
||||
line-height: 64dp;
|
||||
padding: 0 var(--space-xl);
|
||||
line-height: var(--toolbar-height);
|
||||
text-transform: uppercase;
|
||||
border-bottom: 4dp #C2A42D;
|
||||
border-bottom-width: 4dp;
|
||||
border-bottom-color: var(--color-accent);
|
||||
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||
}
|
||||
|
||||
window.logs .log-title-mod {
|
||||
window.logs log-title-mod {
|
||||
flex: 0 1 auto;
|
||||
min-width: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
font-family: "Fira Sans";
|
||||
font-family: var(--font-family-body);
|
||||
font-weight: normal;
|
||||
font-size: 15dp;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
font-size: var(--font-size-base);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
}
|
||||
|
||||
.log-toolbar-spacer {
|
||||
log-toolbar-spacer {
|
||||
flex: 1 1 0;
|
||||
}
|
||||
|
||||
.log-toolbar button {
|
||||
log-toolbar button {
|
||||
flex: 0 0 auto;
|
||||
font-family: "Fira Sans";
|
||||
font-family: var(--font-family-body);
|
||||
font-weight: normal;
|
||||
font-size: 15dp;
|
||||
padding: 5dp 12dp;
|
||||
font-size: var(--font-size-base);
|
||||
padding: 5dp var(--space-md);
|
||||
}
|
||||
|
||||
window.logs content pane.log-view {
|
||||
flex: 1 1 0;
|
||||
padding: 12dp 16dp;
|
||||
padding: var(--space-md) var(--space-lg);
|
||||
padding-bottom: 0dp;
|
||||
gap: 0dp;
|
||||
}
|
||||
|
||||
.log-lines {
|
||||
log-lines {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.log-line {
|
||||
log-line {
|
||||
display: block;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 13dp;
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-xs);
|
||||
line-height: 1.5;
|
||||
word-break: break-word;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.log-line .log-time {
|
||||
color: rgba(224, 219, 200, 45%);
|
||||
log-line log-time {
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
}
|
||||
|
||||
.log-line .log-mod {
|
||||
color: rgba(194, 164, 45, 80%);
|
||||
log-line log-mod {
|
||||
color: rgba(var(--color-accent-rgb), 80%);
|
||||
}
|
||||
|
||||
.log-line.lvl-trace,
|
||||
.log-line.lvl-debug {
|
||||
log-line.lvl-trace,
|
||||
log-line.lvl-debug {
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
.log-line.lvl-warn .log-msg {
|
||||
color: #ffa826;
|
||||
log-line.lvl-warn log-msg {
|
||||
color: var(--color-warning);
|
||||
}
|
||||
|
||||
.log-line.lvl-error .log-msg {
|
||||
color: #cc4444;
|
||||
log-line.lvl-error log-msg {
|
||||
color: var(--color-error);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,922 @@
|
||||
window.mod-browser,
|
||||
window.mod-browser-detail,
|
||||
window.screenshot-viewer {
|
||||
background-color: rgba(var(--color-surface-rgb), 96%);
|
||||
}
|
||||
|
||||
window.mod-browser > content {
|
||||
flex-flow: row;
|
||||
}
|
||||
|
||||
catalog-filters {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 0 0 264dp;
|
||||
min-width: 0;
|
||||
padding: var(--space-xl) 18dp;
|
||||
gap: var(--space-sm);
|
||||
border-right-width: 1dp;
|
||||
border-right-color: var(--color-border);
|
||||
background-color: rgba(var(--color-control-rgb), 45%);
|
||||
}
|
||||
|
||||
catalog-filters h1,
|
||||
catalog-results header h1 {
|
||||
margin: 0;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-5xl);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
catalog-filters h1 {
|
||||
padding: 0 var(--space-sm) var(--space-sm) var(--space-sm);
|
||||
}
|
||||
|
||||
catalog-filters h2 {
|
||||
margin: var(--space-md) var(--space-sm) 0 var(--space-sm);
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-xs);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
opacity: 0.42;
|
||||
}
|
||||
|
||||
catalog-filters select-button {
|
||||
padding: var(--space-sm) 10dp;
|
||||
border-radius: var(--radius-panel);
|
||||
}
|
||||
|
||||
catalog-filters select-button key {
|
||||
font-size: var(--font-size-xs);
|
||||
}
|
||||
|
||||
catalog-filters select-button value,
|
||||
catalog-filters select-button input {
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
.catalog-library-link {
|
||||
padding: var(--space-sm) 10dp;
|
||||
border-radius: var(--radius-panel);
|
||||
text-align: left;
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
catalog-results {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
padding: var(--space-xl);
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
catalog-results header {
|
||||
display: block;
|
||||
flex: 0 0 auto;
|
||||
padding-right: var(--space-2xl);
|
||||
}
|
||||
|
||||
catalog-results > header small {
|
||||
display: block;
|
||||
margin-top: var(--space-2xs);
|
||||
font-size: var(--font-size-xs);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
catalog-viewport {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
overflow: hidden auto;
|
||||
}
|
||||
|
||||
catalog-grid {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
min-width: 0;
|
||||
gap: 14dp;
|
||||
padding: var(--space-2xs);
|
||||
}
|
||||
|
||||
.catalog-card {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 0 0 48%;
|
||||
min-width: 260dp;
|
||||
height: 310dp;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
text-align: left;
|
||||
border-radius: 12dp;
|
||||
}
|
||||
|
||||
catalog-card-art {
|
||||
display: block;
|
||||
position: relative;
|
||||
flex: 0 0 118dp;
|
||||
min-height: 118dp;
|
||||
}
|
||||
|
||||
catalog-card-art-image {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
mask-image: linear-gradient(180deg, #fff 45%, transparent);
|
||||
}
|
||||
|
||||
catalog-card-body {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-flow: column;
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
padding: var(--space-xl) var(--space-lg) var(--space-lg);
|
||||
gap: 7dp;
|
||||
}
|
||||
|
||||
catalog-official-badge {
|
||||
padding: var(--space-2xs) 5dp;
|
||||
border-radius: var(--radius-small);
|
||||
background-color: rgba(var(--color-accent-rgb), 28%);
|
||||
color: var(--color-info);
|
||||
font-style: normal;
|
||||
font-size: var(--font-size-3xs);
|
||||
}
|
||||
|
||||
catalog-card-body > section > b {
|
||||
display: block;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-sm);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-accent);
|
||||
}
|
||||
|
||||
catalog-card-body > small {
|
||||
position: absolute;
|
||||
top: var(--space-md);
|
||||
right: var(--space-lg);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: var(--font-size-sm);
|
||||
font-weight: normal;
|
||||
text-transform: none;
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
.catalog-card mod-icon {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 14dp;
|
||||
bottom: -18dp;
|
||||
z-index: 1;
|
||||
width: 56dp;
|
||||
height: 56dp;
|
||||
border-radius: var(--radius-panel);
|
||||
overflow: hidden;
|
||||
box-shadow: rgba(var(--color-black-rgb), 60%) 0 6dp 16dp;
|
||||
}
|
||||
|
||||
mod-icon-image {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: var(--radius-panel);
|
||||
}
|
||||
|
||||
catalog-card-body > section {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
catalog-card-body > section h2 {
|
||||
display: block;
|
||||
margin: 0;
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-3xl);
|
||||
font-weight: bold;
|
||||
color: var(--color-neutral);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
catalog-card-body > section small {
|
||||
display: block;
|
||||
font-size: var(--font-size-3xs);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
catalog-card-body > p {
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
font-size: var(--font-size-base);
|
||||
line-height: 1.35;
|
||||
color: rgba(var(--color-text-rgb), 68%);
|
||||
}
|
||||
|
||||
catalog-card-body > footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10dp;
|
||||
font-size: var(--font-size-3xs);
|
||||
opacity: 0.52;
|
||||
}
|
||||
|
||||
catalog-card-body > footer stat {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
align-items: center;
|
||||
gap: 3dp;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
catalog-card-body > footer icon {
|
||||
flex: 0 0 13dp;
|
||||
font-size: var(--font-size-sm);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
catalog-card-body > footer .size {
|
||||
margin-left: auto;
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
catalog-card-body > footer .size.installed {
|
||||
color: var(--color-success);
|
||||
}
|
||||
|
||||
catalog-pagination {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
flex: 0 0 auto;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
catalog-pagination-label {
|
||||
flex: 1 1 auto;
|
||||
text-align: center;
|
||||
font-size: var(--font-size-xs);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
catalog-pagination button {
|
||||
font-size: var(--font-size-sm);
|
||||
padding: 6dp var(--space-md);
|
||||
}
|
||||
|
||||
catalog-results-status,
|
||||
catalog-detail-status {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
gap: var(--space-sm);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
catalog-results-status h2,
|
||||
catalog-detail-status h2 {
|
||||
display: block;
|
||||
margin: 0;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-4xl);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
catalog-results-status p,
|
||||
catalog-detail-status p {
|
||||
display: block;
|
||||
margin: 0;
|
||||
opacity: 0.58;
|
||||
}
|
||||
|
||||
catalog-results-status button,
|
||||
catalog-detail-status button {
|
||||
margin-top: var(--space-sm);
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
|
||||
window.mod-browser-detail > content {
|
||||
display: block;
|
||||
}
|
||||
|
||||
detail-scroll {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-width: 0;
|
||||
overflow: hidden auto;
|
||||
padding-bottom: var(--space-2xl);
|
||||
}
|
||||
|
||||
catalog-detail-hero {
|
||||
display: flex;
|
||||
position: relative;
|
||||
flex-flow: column;
|
||||
justify-content: space-between;
|
||||
flex: 0 0 220dp;
|
||||
min-height: 220dp;
|
||||
padding: 18dp var(--space-xl) 20dp var(--space-xl);
|
||||
}
|
||||
|
||||
catalog-detail-hero-image {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
mask-image: linear-gradient(180deg, #fff 40%, transparent);
|
||||
}
|
||||
|
||||
catalog-detail-actions {
|
||||
display: flex;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
flex-flow: row;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
catalog-detail-actions button,
|
||||
catalog-source-actions button {
|
||||
font-size: var(--font-size-sm);
|
||||
padding: 7dp var(--space-md);
|
||||
--button-background: rgba(var(--color-control-rgb), 75%);
|
||||
--button-background-hover: rgba(var(--color-control-rgb), 90%);
|
||||
--button-background-selected: rgba(var(--color-control-rgb), 90%);
|
||||
--button-background-active: rgba(var(--color-surface-rgb), 90%);
|
||||
}
|
||||
|
||||
.catalog-icon-action {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
.catalog-icon-action icon {
|
||||
flex: 0 0 18dp;
|
||||
font-size: var(--font-size-xl);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.catalog-install-action {
|
||||
display: flex;
|
||||
position: relative;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 10dp;
|
||||
min-width: 132dp;
|
||||
padding: 8dp 22dp;
|
||||
border-radius: var(--radius-window);
|
||||
overflow: hidden;
|
||||
font-size: var(--font-size-2xl);
|
||||
opacity: 1;
|
||||
--button-background: rgba(var(--color-control-rgb), 20%);
|
||||
--button-background-hover: rgba(var(--color-interactive-rgb), 20%);
|
||||
--button-background-selected: rgba(var(--color-interactive-rgb), 20%);
|
||||
--button-background-active: rgba(var(--color-interactive-rgb), 20%);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
.catalog-install-action icon {
|
||||
flex: 0 0 22dp;
|
||||
font-size: var(--font-size-3xl);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.catalog-install-action > span {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.catalog-install-action.idle {
|
||||
--button-background: rgba(var(--color-interactive-rgb), 18%);
|
||||
--button-background-hover: rgba(var(--color-interactive-rgb), 42%);
|
||||
--button-background-selected: rgba(var(--color-interactive-rgb), 42%);
|
||||
--button-background-active: rgba(var(--color-interactive-rgb), 65%);
|
||||
box-shadow: rgba(var(--color-accent-rgb), 65%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
.catalog-install-action.paused {
|
||||
box-shadow: rgba(var(--color-border-rgb), 25%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
.catalog-install-action.paused:not(:disabled):hover,
|
||||
.catalog-install-action.paused:not(:disabled):focus-visible {
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
.catalog-install-action progress {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 4dp;
|
||||
margin: 0;
|
||||
border-radius: 0;
|
||||
overflow: hidden;
|
||||
background-color: rgba(var(--color-white-rgb), 10%);
|
||||
}
|
||||
|
||||
.catalog-install-action progress fill {
|
||||
border-radius: 0;
|
||||
background-color: rgba(var(--color-accent-rgb), 80%);
|
||||
}
|
||||
|
||||
.catalog-install-action.paused progress fill {
|
||||
background-color: rgba(var(--color-text-rgb), 35%);
|
||||
}
|
||||
|
||||
.catalog-install-action.retrying {
|
||||
color: var(--color-warning);
|
||||
box-shadow: rgba(var(--color-warning-rgb), 60%) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
.catalog-install-action.retrying progress fill {
|
||||
background-color: rgba(var(--color-warning-rgb), 60%);
|
||||
}
|
||||
|
||||
.catalog-install-action.failed {
|
||||
color: var(--color-white);
|
||||
--button-background: rgba(var(--color-error-rgb), 20%);
|
||||
--button-background-hover: rgba(var(--color-error-rgb), 35%);
|
||||
--button-background-selected: rgba(var(--color-error-rgb), 35%);
|
||||
--button-background-active: rgba(var(--color-error-rgb), 35%);
|
||||
box-shadow: var(--color-error) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
.catalog-install-action.failed progress fill {
|
||||
background-color: rgba(var(--color-error-rgb), 70%);
|
||||
}
|
||||
|
||||
.catalog-install-action.installed {
|
||||
color: var(--color-success);
|
||||
box-shadow: rgba(var(--color-success-rgb), 50%) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
.catalog-install-action.installing progress fill {
|
||||
background-color: rgba(var(--color-info-rgb), 80%);
|
||||
}
|
||||
|
||||
catalog-install-control {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: flex-end;
|
||||
flex: 0 0 auto;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
catalog-install-caption {
|
||||
display: block;
|
||||
max-width: 240dp;
|
||||
overflow: hidden;
|
||||
font-size: var(--font-size-xs);
|
||||
color: rgba(var(--color-text-rgb), 50%);
|
||||
text-align: right;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
catalog-install-caption.failed {
|
||||
color: var(--color-error);
|
||||
}
|
||||
|
||||
catalog-detail-identity {
|
||||
display: flex;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
align-items: flex-end;
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
catalog-detail-identity mod-icon {
|
||||
display: block;
|
||||
flex: 0 0 70dp;
|
||||
width: 70dp;
|
||||
height: 70dp;
|
||||
border-radius: var(--radius-panel);
|
||||
overflow: hidden;
|
||||
box-shadow: rgba(var(--color-black-rgb), 65%) 0 8dp 20dp;
|
||||
}
|
||||
|
||||
catalog-detail-identity > header {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
catalog-detail-identity > header > b {
|
||||
display: block;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-sm);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: var(--color-accent);
|
||||
}
|
||||
|
||||
catalog-detail-identity h1 {
|
||||
display: block;
|
||||
margin: 1dp 0;
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-5xl);
|
||||
font-weight: bold;
|
||||
color: var(--color-neutral);
|
||||
}
|
||||
|
||||
catalog-detail-identity h1 small {
|
||||
margin-left: 9dp;
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-xs);
|
||||
font-weight: normal;
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
catalog-detail-identity p {
|
||||
display: block;
|
||||
margin: 0;
|
||||
font-size: var(--font-size-xs);
|
||||
opacity: 0.72;
|
||||
}
|
||||
|
||||
catalog-detail-stats {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: center;
|
||||
gap: 28dp;
|
||||
margin: 0 var(--space-xl);
|
||||
font-size: var(--font-size-2xs);
|
||||
color: rgba(var(--color-text-rgb), 58%);
|
||||
}
|
||||
|
||||
catalog-detail-stats > stat {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 5dp;
|
||||
}
|
||||
|
||||
catalog-detail-stats icon {
|
||||
flex: 0 0 17dp;
|
||||
font-size: var(--font-size-lg);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
catalog-detail-body {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: flex-start;
|
||||
gap: 28dp;
|
||||
padding: var(--space-xl);
|
||||
}
|
||||
|
||||
catalog-detail-body main {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
gap: 28dp;
|
||||
}
|
||||
|
||||
catalog-detail-body section {
|
||||
display: block;
|
||||
}
|
||||
|
||||
catalog-detail-body section.catalog-scroll-anchor {
|
||||
focus: auto;
|
||||
}
|
||||
|
||||
catalog-detail-body section.catalog-scroll-anchor:focus-visible {
|
||||
border-radius: var(--radius-control);
|
||||
box-shadow: rgba(var(--color-accent-rgb), 45%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
catalog-detail-body h2,
|
||||
catalog-detail-body h3 {
|
||||
display: block;
|
||||
margin: 0 0 10dp 0;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-2xl);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
catalog-detail-body h2 small {
|
||||
margin-left: 7dp;
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-3xs);
|
||||
font-weight: normal;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
catalog-fragment {
|
||||
display: block;
|
||||
font-size: var(--font-size-md);
|
||||
line-height: 1.55;
|
||||
color: var(--color-neutral);
|
||||
}
|
||||
|
||||
catalog-fragment p,
|
||||
catalog-fragment ul,
|
||||
catalog-fragment ol {
|
||||
display: block;
|
||||
margin: 0 0 10dp 0;
|
||||
}
|
||||
|
||||
catalog-fragment ul,
|
||||
catalog-fragment ol {
|
||||
padding-left: var(--space-xl);
|
||||
}
|
||||
|
||||
catalog-fragment li {
|
||||
display: block;
|
||||
position: relative;
|
||||
margin: 3dp 0;
|
||||
}
|
||||
|
||||
catalog-list-marker {
|
||||
display: block;
|
||||
position: absolute;
|
||||
right: 100%;
|
||||
width: var(--space-xl);
|
||||
padding-right: var(--space-sm);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
catalog-fragment h1,
|
||||
catalog-fragment h2,
|
||||
catalog-fragment h3,
|
||||
catalog-fragment h4,
|
||||
catalog-fragment h5,
|
||||
catalog-fragment h6 {
|
||||
display: block;
|
||||
margin: 15dp 0 5dp 0;
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: var(--font-size-xl);
|
||||
color: var(--color-neutral);
|
||||
}
|
||||
|
||||
catalog-fragment h1 {
|
||||
font-size: var(--font-size-5xl);
|
||||
}
|
||||
|
||||
catalog-fragment h2 {
|
||||
font-size: var(--font-size-4xl);
|
||||
}
|
||||
|
||||
catalog-fragment h3 {
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
window.screenshot-viewer > close {
|
||||
display: none;
|
||||
}
|
||||
|
||||
catalog-gallery {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
height: 210dp;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
.catalog-screenshot {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
flex: 1 1 0;
|
||||
height: 100%;
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
border-radius: var(--radius-panel);
|
||||
--button-background: rgba(var(--color-border-rgb), 14%);
|
||||
font-size: var(--font-size-5xl);
|
||||
}
|
||||
|
||||
.catalog-screenshot.primary {
|
||||
flex: 2 1 0;
|
||||
}
|
||||
|
||||
catalog-screenshot-image,
|
||||
catalog-screenshot-more {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
catalog-screenshot-more {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: rgba(var(--color-black-rgb), 60%);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
catalog-dependencies {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 7dp;
|
||||
font-size: var(--font-size-xs);
|
||||
}
|
||||
|
||||
catalog-dependency {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
padding: 9dp 11dp;
|
||||
border-radius: var(--radius-control);
|
||||
background-color: rgba(var(--color-border-rgb), 9%);
|
||||
}
|
||||
|
||||
catalog-dependency-status {
|
||||
display: block;
|
||||
font-size: var(--font-size-3xs);
|
||||
opacity: 0.56;
|
||||
}
|
||||
|
||||
catalog-dependency.missing {
|
||||
color: var(--color-warning);
|
||||
}
|
||||
|
||||
catalog-detail-body aside {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 0 0 264dp;
|
||||
min-width: 0;
|
||||
padding: var(--space-lg);
|
||||
gap: var(--space-md);
|
||||
border-radius: 9dp;
|
||||
background-color: rgba(var(--color-control-rgb), 42%);
|
||||
box-shadow: rgba(var(--color-border-rgb), 24%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
catalog-detail-body dl {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
margin: 0;
|
||||
font-size: var(--font-size-sm);
|
||||
}
|
||||
|
||||
catalog-detail-body dt {
|
||||
flex: 0 0 42%;
|
||||
padding: 5dp 0;
|
||||
font-weight: bold;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
catalog-detail-body dd {
|
||||
flex: 1 1 52%;
|
||||
margin: 0;
|
||||
padding: 5dp 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
window.screenshot-viewer > content {
|
||||
flex-flow: column;
|
||||
padding: 18dp;
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
catalog-screenshot-full {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
background-color: rgba(var(--color-black-rgb), 45%);
|
||||
}
|
||||
|
||||
catalog-screenshot-actions {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
justify-content: center;
|
||||
flex: 0 0 auto;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
catalog-screenshot-actions button {
|
||||
font-size: var(--font-size-sm);
|
||||
padding: 7dp 13dp;
|
||||
}
|
||||
|
||||
@media (max-height: 640dp) {
|
||||
catalog-filters {
|
||||
flex-basis: 232dp;
|
||||
padding: 15dp var(--space-md);
|
||||
gap: 5dp;
|
||||
}
|
||||
|
||||
catalog-filters h1,
|
||||
catalog-results header h1 {
|
||||
font-size: var(--font-size-4xl);
|
||||
}
|
||||
|
||||
catalog-filters h2 {
|
||||
margin-top: 6dp;
|
||||
}
|
||||
|
||||
catalog-results {
|
||||
padding: 15dp;
|
||||
gap: 10dp;
|
||||
}
|
||||
|
||||
.catalog-card {
|
||||
min-width: 220dp;
|
||||
height: 254dp;
|
||||
}
|
||||
|
||||
catalog-card-art {
|
||||
flex-basis: 78dp;
|
||||
min-height: 78dp;
|
||||
}
|
||||
|
||||
catalog-card-body {
|
||||
padding: 18dp 10dp var(--space-sm) 10dp;
|
||||
}
|
||||
|
||||
.catalog-card mod-icon {
|
||||
left: 10dp;
|
||||
bottom: -14dp;
|
||||
width: 40dp;
|
||||
height: 40dp;
|
||||
}
|
||||
|
||||
catalog-card-body > section > b,
|
||||
catalog-card-body > small {
|
||||
font-size: var(--font-size-3xs);
|
||||
}
|
||||
|
||||
catalog-card-body > section h2 {
|
||||
font-size: var(--font-size-md);
|
||||
}
|
||||
|
||||
catalog-card-body > p {
|
||||
font-size: var(--font-size-3xs);
|
||||
}
|
||||
|
||||
catalog-detail-hero {
|
||||
flex-basis: 160dp;
|
||||
min-height: 160dp;
|
||||
padding: var(--space-md) 18dp;
|
||||
}
|
||||
|
||||
catalog-detail-identity mod-icon {
|
||||
flex-basis: 56dp;
|
||||
width: 56dp;
|
||||
height: 56dp;
|
||||
}
|
||||
|
||||
catalog-detail-identity {
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
catalog-detail-identity > header > b {
|
||||
font-size: var(--font-size-2xs);
|
||||
}
|
||||
|
||||
.catalog-install-action {
|
||||
gap: var(--space-sm);
|
||||
min-width: 112dp;
|
||||
padding: 7dp 18dp;
|
||||
border-radius: 12dp;
|
||||
font-size: var(--font-size-md);
|
||||
}
|
||||
|
||||
.catalog-install-action icon {
|
||||
flex-basis: 18dp;
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
catalog-install-control {
|
||||
gap: 3dp;
|
||||
}
|
||||
|
||||
catalog-install-caption {
|
||||
max-width: 190dp;
|
||||
font-size: var(--font-size-3xs);
|
||||
}
|
||||
|
||||
catalog-detail-identity h1 {
|
||||
font-size: var(--font-size-3xl);
|
||||
}
|
||||
|
||||
catalog-detail-body {
|
||||
padding: 18dp;
|
||||
gap: 18dp;
|
||||
}
|
||||
|
||||
catalog-gallery {
|
||||
height: 160dp;
|
||||
}
|
||||
}
|
||||
+137
-77
@@ -1,8 +1,8 @@
|
||||
window.mods content pane.mod-list {
|
||||
flex: 0 0 360dp;
|
||||
padding: 16dp;
|
||||
padding: var(--space-lg);
|
||||
padding-bottom: 0dp;
|
||||
gap: 4dp;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
@media (max-height: 640dp) {
|
||||
@@ -12,29 +12,66 @@ window.mods content pane.mod-list {
|
||||
}
|
||||
|
||||
window.mods content pane.mod-detail {
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
.mod-info-row {
|
||||
mod-entry.browser,
|
||||
mod-entry.installs {
|
||||
min-height: 76dp;
|
||||
}
|
||||
|
||||
mod-entry.browser mod-icon {
|
||||
color: var(--color-accent);
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
mod-entry.installs mod-icon {
|
||||
color: var(--color-accent);
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
mod-entry.installs {
|
||||
background-color: rgba(var(--color-control-rgb), 20%);
|
||||
box-shadow: rgba(var(--color-border-rgb), 25%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
mod-entry.installs:hover,
|
||||
mod-entry.installs:focus-visible {
|
||||
background-color: rgba(var(--color-interactive-rgb), 12%);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
mod-entry.installs progress {
|
||||
height: 6dp;
|
||||
margin: var(--space-xs) 0 0 0;
|
||||
}
|
||||
|
||||
mod-list-separator {
|
||||
display: block;
|
||||
height: 1dp;
|
||||
margin: var(--space-sm) 10dp;
|
||||
background-color: rgba(var(--color-border-rgb), 30%);
|
||||
}
|
||||
|
||||
mod-info-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12dp;
|
||||
padding: 4dp 0;
|
||||
gap: var(--space-md);
|
||||
padding: var(--space-xs) 0;
|
||||
}
|
||||
|
||||
.mod-info-label {
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-weight: bold;
|
||||
mod-info-row > b {
|
||||
font-family: var(--font-family-heading);
|
||||
opacity: 0.55;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.mod-info-value {
|
||||
mod-info-row > span {
|
||||
flex: 1 1 0;
|
||||
}
|
||||
|
||||
.mod-path {
|
||||
font-size: 14dp;
|
||||
font-size: var(--font-size-sm);
|
||||
word-break: break-all;
|
||||
opacity: 0.7;
|
||||
}
|
||||
@@ -42,106 +79,113 @@ window.mods content pane.mod-detail {
|
||||
mod-entry {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
padding: 10dp;
|
||||
border-radius: 10dp;
|
||||
decorator: vertical-gradient(#c2a42d00 #c2a42d00);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 0%) rgba(var(--color-accent-rgb), 0%));
|
||||
transition: decorator 0.1s linear-in-out;
|
||||
cursor: pointer;
|
||||
focus: auto;
|
||||
}
|
||||
|
||||
mod-entry.current {
|
||||
box-shadow: rgba(146, 135, 91, 40%) 0 0 0 1dp;
|
||||
box-shadow: rgba(var(--color-border-rgb), 40%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
mod-entry:hover,
|
||||
mod-entry:focus-visible {
|
||||
decorator: vertical-gradient(#c2a42d00 #c2a42d26);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 0) rgba(var(--color-accent-rgb), 38));
|
||||
}
|
||||
|
||||
mod-entry:selected {
|
||||
decorator: vertical-gradient(#c2a42d10 #c2a42d40);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 16) rgba(var(--color-accent-rgb), 64));
|
||||
}
|
||||
|
||||
mod-entry .mod-icon {
|
||||
mod-icon {
|
||||
display: block;
|
||||
flex: 0 0 auto;
|
||||
width: 56dp;
|
||||
height: 56dp;
|
||||
border-radius: 8dp;
|
||||
}
|
||||
|
||||
mod-entry icon.mod-icon {
|
||||
border-radius: var(--radius-panel);
|
||||
font-family: var(--font-family-icons);
|
||||
font-size: 36dp;
|
||||
background-color: rgba(17, 16, 10, 20%);
|
||||
color: rgba(224, 219, 200, 45%);
|
||||
background-color: rgba(var(--color-control-rgb), 20%);
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
decorator: text("" center center);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-info {
|
||||
mod-icon img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: var(--radius-panel);
|
||||
}
|
||||
|
||||
mod-info {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
gap: 2dp;
|
||||
gap: var(--space-2xs);
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-name {
|
||||
mod-info header {
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
align-items: baseline;
|
||||
gap: 6dp;
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-name-text {
|
||||
mod-info header b {
|
||||
flex: 0 1 auto;
|
||||
min-width: 0;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-version {
|
||||
mod-info header small {
|
||||
flex: 0 0 auto;
|
||||
font-size: 13dp;
|
||||
color: rgba(224, 219, 200, 50%);
|
||||
font-size: var(--font-size-xs);
|
||||
color: rgba(var(--color-text-rgb), 50%);
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-status.active {
|
||||
color: #44cc55;
|
||||
mod-status.active {
|
||||
color: var(--color-success);
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-status.failed {
|
||||
color: #cc4444;
|
||||
mod-status.failed {
|
||||
color: var(--color-error);
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-network {
|
||||
mod-network {
|
||||
margin-left: 6dp;
|
||||
padding: 1dp 5dp;
|
||||
border-radius: 5dp;
|
||||
background-color: rgba(67, 151, 219, 20%);
|
||||
color: #6fb7ef;
|
||||
background-color: rgba(var(--color-info-rgb), 20%);
|
||||
color: var(--color-info);
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-desc {
|
||||
font-size: 14dp;
|
||||
mod-info > p {
|
||||
margin: 0;
|
||||
font-size: var(--font-size-sm);
|
||||
line-height: 1.3;
|
||||
color: rgba(224, 219, 200, 65%);
|
||||
color: rgba(var(--color-text-rgb), 65%);
|
||||
max-height: 2.6em;
|
||||
overflow: hidden;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
mod-entry .mod-entry-sub {
|
||||
font-size: 13dp;
|
||||
color: rgba(224, 219, 200, 50%);
|
||||
mod-info > small {
|
||||
font-size: var(--font-size-xs);
|
||||
color: rgba(var(--color-text-rgb), 50%);
|
||||
}
|
||||
|
||||
mod-entry.inactive .mod-icon {
|
||||
mod-entry.inactive mod-icon {
|
||||
filter: grayscale(1);
|
||||
}
|
||||
|
||||
mod-entry.inactive .mod-entry-info {
|
||||
mod-entry.inactive mod-info {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
@@ -155,20 +199,37 @@ mod-header.has-banner {
|
||||
margin: -24dp -24dp 0dp -24dp;
|
||||
}
|
||||
|
||||
mod-header .mod-actions {
|
||||
mod-header-image {
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
mask-image: linear-gradient(180deg, #fff 40%, transparent);
|
||||
filter: grayscale(0);
|
||||
}
|
||||
|
||||
mod-header.inactive mod-header-image {
|
||||
filter: grayscale(1);
|
||||
}
|
||||
|
||||
mod-actions {
|
||||
position: absolute;
|
||||
top: 24dp;
|
||||
left: 24dp;
|
||||
display: flex;
|
||||
flex-flow: row;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
mod-header .mod-actions button {
|
||||
font-size: 16dp;
|
||||
padding: 6dp 14dp;
|
||||
background-color: rgba(21, 22, 16, 80%);
|
||||
box-shadow: rgba(146, 135, 91, 60%) 0 0 0 1dp;
|
||||
mod-actions button {
|
||||
--button-background: rgba(var(--color-surface-rgb), 80%);
|
||||
--button-background-hover: rgba(var(--color-control-rgb), 90%);
|
||||
--button-background-selected: rgba(var(--color-control-rgb), 90%);
|
||||
--button-background-active: rgba(var(--color-surface-rgb), 90%);
|
||||
box-shadow: rgba(var(--color-border-rgb), 60%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
mod-header.no-banner {
|
||||
@@ -177,56 +238,55 @@ mod-header.no-banner {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
mod-header.no-banner .mod-actions {
|
||||
mod-header.no-banner mod-actions {
|
||||
position: static;
|
||||
}
|
||||
|
||||
window.mods .mod-title {
|
||||
mod-title {
|
||||
display: block;
|
||||
font-size: 28dp;
|
||||
font-size: var(--font-size-5xl);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
window.mods .mod-title .mod-title-version {
|
||||
mod-title small {
|
||||
font-weight: normal;
|
||||
font-size: 16dp;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
font-size: var(--font-size-md);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
}
|
||||
|
||||
window.mods .mod-author {
|
||||
mod-author {
|
||||
display: block;
|
||||
font-size: 15dp;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
font-size: var(--font-size-base);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
}
|
||||
|
||||
window.mods .mod-restart-note {
|
||||
font-size: 15dp;
|
||||
color: #ffa826;
|
||||
mod-restart-note {
|
||||
font-size: var(--font-size-base);
|
||||
color: var(--color-warning);
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
window.mods .mod-description {
|
||||
mod-description {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
font-size: 14dp;
|
||||
status-badge {
|
||||
font-size: var(--font-size-sm);
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.status-badge.active,
|
||||
.mod-info-label.active {
|
||||
color: #44cc55;
|
||||
status-badge.active,
|
||||
mod-info-row > b.active {
|
||||
color: var(--color-success);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.status-badge.failed,
|
||||
.mod-info-label.failed {
|
||||
color: #cc4444;
|
||||
status-badge.failed,
|
||||
mod-info-row > b.failed {
|
||||
color: var(--color-error);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.status-badge.network {
|
||||
color: #6fb7ef;
|
||||
status-badge.network {
|
||||
color: var(--color-info);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
+92
-54
@@ -8,10 +8,10 @@ body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: "Fira Sans";
|
||||
font-family: var(--font-family-body);
|
||||
font-weight: normal;
|
||||
font-size: 20dp;
|
||||
color: #E0DBC8;
|
||||
font-size: var(--font-size-2xl);
|
||||
color: var(--color-text);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
@@ -24,16 +24,22 @@ fps,
|
||||
pipeline-progress,
|
||||
toast {
|
||||
position: absolute;
|
||||
border: 1dp #92875B;
|
||||
background-color: rgba(21, 22, 16, 80%);
|
||||
border-width: 1dp;
|
||||
background-color: rgba(var(--color-surface-rgb), 80%);
|
||||
}
|
||||
|
||||
fps,
|
||||
pipeline-progress {
|
||||
border-color: var(--color-border);
|
||||
}
|
||||
|
||||
toast {
|
||||
border-color: var(--toast-border-color);
|
||||
top: 40dp;
|
||||
right: 40dp;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
border-radius: 14dp;
|
||||
border-radius: var(--radius-window);
|
||||
overflow: hidden;
|
||||
backdrop-filter: blur(5dp);
|
||||
box-shadow: 0 0 15dp 3dp;
|
||||
@@ -41,8 +47,8 @@ toast {
|
||||
transform: scale(0.9);
|
||||
transform-origin: center;
|
||||
transition: filter transform 0.2s cubic-in-out;
|
||||
padding: 18dp 24dp;
|
||||
gap: 8dp;
|
||||
padding: 18dp var(--space-xl);
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
toast[open] {
|
||||
@@ -50,15 +56,6 @@ toast[open] {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
/*toast:hover {
|
||||
cursor: pointer;
|
||||
background-color: rgba(61, 59, 36, 80%);
|
||||
}
|
||||
|
||||
toast:active {
|
||||
background-color: rgba(45, 43, 26, 80%);
|
||||
}*/
|
||||
|
||||
b {
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -67,14 +64,14 @@ toast heading {
|
||||
display: flex;
|
||||
gap: 18dp;
|
||||
align-items: center;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-size: 18dp;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-xl);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: #92875B;
|
||||
color: var(--toast-heading-color);
|
||||
}
|
||||
|
||||
toast heading > span {
|
||||
toast heading > toast-title {
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
|
||||
@@ -82,13 +79,13 @@ toast heading > row {
|
||||
flex: 1 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4dp;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
toast message {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
toast message row {
|
||||
@@ -99,6 +96,50 @@ toast message row.muted {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
toast.mod-installed row {
|
||||
align-items: center;
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
mod-icon {
|
||||
flex: 0 0 42dp;
|
||||
width: 42dp;
|
||||
height: 42dp;
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-panel);
|
||||
background-color: rgba(var(--color-control-rgb), 45%);
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
font-family: var(--font-family-icons);
|
||||
font-size: var(--font-size-4xl);
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
mod-icon img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: var(--radius-panel);
|
||||
}
|
||||
|
||||
mod-info {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
min-width: 0;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
mod-name {
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
toast.mod-installed small {
|
||||
font-size: var(--font-size-sm);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
}
|
||||
|
||||
toast.mod-installed small.version {
|
||||
margin-left: var(--space-sm);
|
||||
}
|
||||
|
||||
progress {
|
||||
height: 4dp;
|
||||
position: absolute;
|
||||
@@ -108,7 +149,7 @@ progress {
|
||||
}
|
||||
|
||||
progress fill {
|
||||
background-color: rgba(194, 164, 45, 80%);
|
||||
background-color: rgba(var(--color-accent-rgb), 80%);
|
||||
}
|
||||
|
||||
pipeline-progress {
|
||||
@@ -119,8 +160,8 @@ pipeline-progress {
|
||||
z-index: 100;
|
||||
min-width: 260dp;
|
||||
max-width: 90%;
|
||||
padding: 10dp 16dp 12dp;
|
||||
border-radius: 7dp;
|
||||
padding: 10dp var(--space-lg) var(--space-md);
|
||||
border-radius: var(--radius-control);
|
||||
overflow: hidden;
|
||||
filter: opacity(0);
|
||||
transition: filter 0.2s linear-in-out;
|
||||
@@ -134,8 +175,8 @@ pipeline-progress[open] {
|
||||
pipeline-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8dp;
|
||||
font-size: 18dp;
|
||||
gap: var(--space-sm);
|
||||
font-size: var(--font-size-xl);
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
}
|
||||
@@ -145,26 +186,16 @@ icon.pipeline-spinner {
|
||||
height: 1.2em;
|
||||
line-height: 1.2em;
|
||||
font-size: 1.2em;
|
||||
color: #C2A42D;
|
||||
color: var(--color-accent);
|
||||
text-align: center;
|
||||
transform-origin: center;
|
||||
animation: 1s linear infinite pipeline-spinner-spin;
|
||||
}
|
||||
|
||||
toast.achievement {
|
||||
border: 1dp #C2A42D;
|
||||
}
|
||||
|
||||
toast.achievement heading {
|
||||
color: #C2A42D;
|
||||
}
|
||||
|
||||
toast.achievement,
|
||||
toast.warning {
|
||||
border: 1dp #C2A42D;
|
||||
}
|
||||
|
||||
toast.warning heading {
|
||||
color: #C2A42D;
|
||||
--toast-border-color: var(--color-accent);
|
||||
--toast-heading-color: var(--color-accent);
|
||||
}
|
||||
|
||||
toast.controller-warning {
|
||||
@@ -181,8 +212,8 @@ toast.controller-warning[open] {
|
||||
transform: translateX(-50%) scale(1);
|
||||
}
|
||||
|
||||
toast.controller-warning heading {
|
||||
color: #C2A42D;
|
||||
toast.controller-warning {
|
||||
--toast-heading-color: var(--color-accent);
|
||||
}
|
||||
|
||||
toast.menu-notification {
|
||||
@@ -209,7 +240,7 @@ toast.menu-notification message row {
|
||||
}
|
||||
|
||||
icon {
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
@@ -243,13 +274,20 @@ icon.warning {
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
icon.download-done {
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
font-size: 1.2em;
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
fps {
|
||||
display: none;
|
||||
z-index: 99;
|
||||
font-size: 18dp;
|
||||
font-size: var(--font-size-xl);
|
||||
font-weight: bold;
|
||||
padding: 9dp 12dp;
|
||||
border-radius: 7dp;
|
||||
padding: 9dp var(--space-md);
|
||||
border-radius: var(--radius-control);
|
||||
pointer-events: none;
|
||||
white-space: nowrap;
|
||||
}
|
||||
@@ -260,12 +298,12 @@ speedrun-timer {
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 99;
|
||||
background-color: rgba(0, 0, 0, 65%);
|
||||
padding: 2dp 4dp;
|
||||
background-color: rgba(var(--color-black-rgb), 65%);
|
||||
padding: var(--space-2xs) var(--space-xs);
|
||||
pointer-events: none;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 16dp;
|
||||
color: #ffffff;
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-md);
|
||||
color: var(--color-white);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@@ -329,7 +367,7 @@ logo img {
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
filter: drop-shadow(#0008 0 0 14dp);
|
||||
filter: drop-shadow(rgba(var(--color-black-rgb), 53.333333%) 0 0 14dp);
|
||||
transform-origin: center;
|
||||
}
|
||||
|
||||
|
||||
+106
-40
@@ -3,6 +3,8 @@
|
||||
}
|
||||
|
||||
body {
|
||||
--button-background: rgba(var(--color-control-rgb), 35%);
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 10;
|
||||
@@ -12,14 +14,15 @@ popover {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
font-family: "Fira Sans";
|
||||
font-size: 14dp;
|
||||
color: #E0DBC8;
|
||||
border-radius: 14dp;
|
||||
border: 2dp #92875B;
|
||||
background-color: rgba(21, 22, 16, 96%);
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-sm);
|
||||
color: var(--color-text);
|
||||
border-radius: var(--radius-window);
|
||||
border-width: 2dp;
|
||||
border-color: var(--color-border);
|
||||
background-color: rgba(var(--color-surface-rgb), 96%);
|
||||
backdrop-filter: blur(5dp);
|
||||
box-shadow: 0 6dp 24dp 2dp rgba(0, 0, 0, 55%);
|
||||
box-shadow: 0 6dp 24dp 2dp rgba(var(--color-black-rgb), 55%);
|
||||
filter: opacity(0);
|
||||
transform: scale(0.95);
|
||||
transform-origin: center;
|
||||
@@ -43,8 +46,8 @@ color-sv {
|
||||
position: relative;
|
||||
width: 240dp;
|
||||
height: 150dp;
|
||||
border-radius: 8dp;
|
||||
box-shadow: rgba(146, 135, 91, 50%) 0 0 0 1dp;
|
||||
border-radius: var(--radius-panel);
|
||||
box-shadow: rgba(var(--color-border-rgb), 50%) 0 0 0 1dp;
|
||||
drag: drag;
|
||||
focus: auto;
|
||||
}
|
||||
@@ -55,8 +58,8 @@ color-alpha {
|
||||
position: relative;
|
||||
width: 240dp;
|
||||
height: 14dp;
|
||||
border-radius: 7dp;
|
||||
box-shadow: rgba(146, 135, 91, 50%) 0 0 0 1dp;
|
||||
border-radius: var(--radius-control);
|
||||
box-shadow: rgba(var(--color-border-rgb), 50%) 0 0 0 1dp;
|
||||
drag: drag;
|
||||
focus: auto;
|
||||
}
|
||||
@@ -64,13 +67,13 @@ color-alpha {
|
||||
color-sv:focus-visible,
|
||||
color-hue:focus-visible,
|
||||
color-alpha:focus-visible {
|
||||
box-shadow: #C2A42D 0 0 0 2dp;
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
color-sv.adjusting,
|
||||
color-hue.adjusting,
|
||||
color-alpha.adjusting {
|
||||
box-shadow: #FFFFFF 0 0 0 3dp;
|
||||
box-shadow: var(--color-white) 0 0 0 3dp;
|
||||
}
|
||||
|
||||
color-hue {
|
||||
@@ -82,20 +85,21 @@ color-cursor {
|
||||
position: absolute;
|
||||
width: 14dp;
|
||||
height: 14dp;
|
||||
border-radius: 7dp;
|
||||
border: 2dp #ffffff;
|
||||
box-shadow: 0 0 4dp 1dp rgba(0, 0, 0, 70%);
|
||||
border-radius: var(--radius-control);
|
||||
border-width: 2dp;
|
||||
border-color: var(--color-white);
|
||||
box-shadow: 0 0 4dp 1dp rgba(var(--color-black-rgb), 70%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
color-heading {
|
||||
display: block;
|
||||
margin-top: 2dp;
|
||||
font-family: "Fira Sans Condensed";
|
||||
margin-top: var(--space-2xs);
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 13dp;
|
||||
font-size: var(--font-size-xs);
|
||||
text-transform: uppercase;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
}
|
||||
|
||||
color-presets {
|
||||
@@ -114,7 +118,7 @@ button.color-swatch-button {
|
||||
width: 25dp;
|
||||
height: 25dp;
|
||||
padding: 0;
|
||||
border-radius: 7dp;
|
||||
border-radius: var(--radius-control);
|
||||
}
|
||||
|
||||
color-chip {
|
||||
@@ -123,62 +127,124 @@ color-chip {
|
||||
width: 20dp;
|
||||
height: 20dp;
|
||||
border-radius: 5dp;
|
||||
box-shadow: rgba(255, 255, 255, 45%) 0 0 0 1dp;
|
||||
box-shadow: rgba(var(--color-white-rgb), 45%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
button.color-swatch-button color-chip {
|
||||
width: 25dp;
|
||||
height: 25dp;
|
||||
border-radius: 7dp;
|
||||
border-radius: var(--radius-control);
|
||||
}
|
||||
|
||||
color-chip.empty,
|
||||
color-swatch.empty {
|
||||
background-color: rgba(224, 219, 200, 12%);
|
||||
decorator: linear-gradient(135deg, rgba(224, 219, 200, 0) 45%,
|
||||
rgba(194, 164, 45, 70%) 48%, rgba(194, 164, 45, 70%) 52%,
|
||||
rgba(224, 219, 200, 0) 55%);
|
||||
background-color: rgba(var(--color-text-rgb), 12%);
|
||||
decorator: linear-gradient(135deg, rgba(var(--color-text-rgb), 0) 45%,
|
||||
rgba(var(--color-accent-rgb), 70%) 48%, rgba(var(--color-accent-rgb), 70%) 52%,
|
||||
rgba(var(--color-text-rgb), 0) 55%);
|
||||
}
|
||||
|
||||
color-footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6dp;
|
||||
padding-top: 2dp;
|
||||
padding-top: var(--space-2xs);
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: rgba(17, 16, 10, 35%);
|
||||
padding: 4dp 8dp;
|
||||
border-radius: 8dp;
|
||||
box-shadow: rgba(146, 135, 91, 30%) 0 0 0 1dp;
|
||||
color: #E0DBC8;
|
||||
background-color: var(--button-background);
|
||||
padding: var(--space-xs) var(--space-sm);
|
||||
border-radius: var(--radius-panel);
|
||||
box-shadow: rgba(var(--color-border-rgb), 30%) 0 0 0 1dp;
|
||||
color: var(--button-color);
|
||||
cursor: pointer;
|
||||
focus: auto;
|
||||
}
|
||||
|
||||
button:hover,
|
||||
button:focus-visible {
|
||||
background-color: rgba(204, 184, 119, 20%);
|
||||
box-shadow: #C2A42D 0 0 0 2dp;
|
||||
background-color: var(--button-background-hover);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
button:active {
|
||||
background-color: rgba(204, 184, 119, 40%);
|
||||
background-color: var(--button-background-active);
|
||||
}
|
||||
|
||||
color-value {
|
||||
display: block;
|
||||
flex: 1 1 auto;
|
||||
text-align: right;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 12dp;
|
||||
color: #FFFFFF;
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-2xs);
|
||||
color: var(--color-white);
|
||||
cursor: pointer;
|
||||
focus: auto;
|
||||
}
|
||||
|
||||
color-value:hover,
|
||||
color-value:focus-visible {
|
||||
color: #C2A42D;
|
||||
color: var(--color-accent);
|
||||
}
|
||||
|
||||
popover.context-menu {
|
||||
min-width: 200dp;
|
||||
max-width: 90%;
|
||||
max-height: 90%;
|
||||
overflow-y: auto;
|
||||
padding: 6dp;
|
||||
gap: 2dp;
|
||||
transform-origin: left top;
|
||||
}
|
||||
|
||||
.context-menu button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10dp;
|
||||
padding: 8dp 12dp;
|
||||
flex: 0 0 auto;
|
||||
white-space: nowrap;
|
||||
--button-background: transparent;
|
||||
background-color: var(--button-background);
|
||||
box-shadow: none;
|
||||
transition: background-color 0.1s linear-in-out;
|
||||
}
|
||||
|
||||
.context-menu button:not(:disabled):hover,
|
||||
.context-menu button:not(:disabled):focus-visible {
|
||||
background-color: var(--button-background-hover);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.context-menu button:not(:disabled):active {
|
||||
background-color: var(--button-background-active);
|
||||
}
|
||||
|
||||
.context-menu button:disabled {
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
opacity: 0.4;
|
||||
cursor: unavailable;
|
||||
}
|
||||
|
||||
.context-menu button.destructive {
|
||||
color: var(--color-error);
|
||||
}
|
||||
|
||||
.context-menu icon {
|
||||
display: block;
|
||||
flex: 0 0 1em;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
menu-separator {
|
||||
display: block;
|
||||
flex: 0 0 1dp;
|
||||
height: 1dp;
|
||||
margin: 4dp 6dp;
|
||||
background-color: var(--color-border);
|
||||
}
|
||||
|
||||
+9
-8
@@ -8,10 +8,10 @@ body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 18dp;
|
||||
color: #E0DBC8;
|
||||
font-size: var(--font-size-xl);
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
button {
|
||||
@@ -23,11 +23,12 @@ popup {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
height: 64dp;
|
||||
background-color: rgba(21, 22, 16, 80%);
|
||||
border-bottom: 2dp #92875B;
|
||||
height: var(--toolbar-height);
|
||||
background-color: rgba(var(--color-surface-rgb), 80%);
|
||||
border-bottom-width: 2dp;
|
||||
border-bottom-color: var(--color-border);
|
||||
backdrop-filter: blur(5dp);
|
||||
transform: translateY(-64dp);
|
||||
transform: translateY(var(--toolbar-hidden-offset));
|
||||
transition: transform 0.2s cubic-in-out;
|
||||
}
|
||||
|
||||
@@ -41,5 +42,5 @@ popup tab-bar {
|
||||
|
||||
popup tab-bar tab {
|
||||
opacity: 0.35;
|
||||
color: #E0DBC8;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
+91
-90
@@ -1,32 +1,40 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
--color-prelaunch-accent: #FEE685;
|
||||
--color-prelaunch-muted: #A6A09B;
|
||||
--color-disc-error: #FFC9C9;
|
||||
--color-disc-mismatch: #FFD6A7;
|
||||
--color-ready: #D8F999;
|
||||
--menu-button-decorator: horizontal-gradient(rgba(var(--color-black-rgb), 0%) rgba(var(--color-black-rgb), 0%));
|
||||
--menu-button-decorator-hover: horizontal-gradient(#FEE685FF #FEE68500);
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-family: "Fira Sans";
|
||||
font-family: var(--font-family-body);
|
||||
font-weight: normal;
|
||||
font-size: 20dp;
|
||||
color: #FFFFFF;
|
||||
font-size: var(--font-size-2xl);
|
||||
color: var(--color-white);
|
||||
filter: opacity(0);
|
||||
transition: filter 1s 0.2s linear-in-out;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.gradient {
|
||||
body.mirrored {
|
||||
--menu-button-decorator-hover: horizontal-gradient(#FEE68500 #FEE685FF);
|
||||
}
|
||||
|
||||
prelaunch-gradient {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
/* The color gradient from the Figma bands really badly. A fully black gradient does as well, but not as badly. */
|
||||
decorator: horizontal-gradient(#000000FF #00000000);
|
||||
decorator: horizontal-gradient(rgba(var(--color-black-rgb), 100%) rgba(var(--color-black-rgb), 0%));
|
||||
}
|
||||
|
||||
body.mirrored .gradient {
|
||||
decorator: horizontal-gradient(#00000000 #000000FF);
|
||||
body.mirrored prelaunch-gradient {
|
||||
decorator: horizontal-gradient(rgba(var(--color-black-rgb), 0%) rgba(var(--color-black-rgb), 100%));
|
||||
}
|
||||
|
||||
.background {
|
||||
prelaunch-background {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -39,11 +47,11 @@ body[open] {
|
||||
filter: opacity(1);
|
||||
}
|
||||
|
||||
body[open] .background {
|
||||
body[open] prelaunch-background {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
body.disc-ready .background {
|
||||
body.disc-ready prelaunch-background {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@@ -84,7 +92,7 @@ hero {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 4dp;
|
||||
gap: var(--space-xs);
|
||||
}
|
||||
|
||||
body.mirrored hero {
|
||||
@@ -96,8 +104,8 @@ hero img {
|
||||
}
|
||||
|
||||
eyebrow {
|
||||
font-family: "Alegreya SC";
|
||||
font-size: 32dp;
|
||||
font-family: var(--font-family-display);
|
||||
font-size: var(--font-size-6xl);
|
||||
}
|
||||
|
||||
@media (min-width: 1216dp) {
|
||||
@@ -107,36 +115,36 @@ eyebrow {
|
||||
}
|
||||
}
|
||||
|
||||
eyebrow span {
|
||||
eyebrow studio-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#menu-list {
|
||||
menu-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
#menu-list button {
|
||||
width: 428dp;
|
||||
height: 54dp;
|
||||
padding: 8dp 16dp;
|
||||
border-radius: 8dp;
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
border-radius: var(--radius-panel);
|
||||
text-align: left;
|
||||
text-transform: uppercase;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-size: 32dp;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-6xl);
|
||||
font-weight: normal;
|
||||
cursor: pointer;
|
||||
/* Define a fully transparent gradient as the default state, otherwise a white flash occurs */
|
||||
decorator: horizontal-gradient(#00000000 #00000000);
|
||||
decorator: var(--menu-button-decorator);
|
||||
}
|
||||
|
||||
#menu-list button:disabled {
|
||||
opacity: 0.75;
|
||||
cursor: default;
|
||||
decorator: horizontal-gradient(#00000000 #00000000);
|
||||
decorator: var(--menu-button-decorator);
|
||||
}
|
||||
|
||||
#menu-list button.anim-done {
|
||||
@@ -157,7 +165,7 @@ eyebrow span {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
border-radius: 8dp;
|
||||
border-radius: var(--radius-panel);
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
}
|
||||
@@ -169,7 +177,7 @@ eyebrow span {
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 8dp 16dp;
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
opacity: 0;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
@@ -189,8 +197,8 @@ eyebrow span {
|
||||
height: 54dp;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #FFFFFF;
|
||||
font-family: "Material Symbols Rounded";
|
||||
color: var(--color-white);
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
font-size: 30dp;
|
||||
z-index: 1;
|
||||
@@ -213,8 +221,8 @@ eyebrow span {
|
||||
|
||||
#menu-list button:hover,
|
||||
#menu-list button:focus-visible {
|
||||
color: black;
|
||||
decorator: horizontal-gradient(#FEE685FF #FEE68500);
|
||||
color: var(--color-black);
|
||||
decorator: var(--menu-button-decorator-hover);
|
||||
}
|
||||
|
||||
body.mirrored #menu-list {
|
||||
@@ -225,11 +233,6 @@ body.mirrored #menu-list button {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
body.mirrored #menu-list button:hover,
|
||||
body.mirrored #menu-list button:focus-visible {
|
||||
decorator: horizontal-gradient(#FEE68500 #FEE685FF);
|
||||
}
|
||||
|
||||
disc-info {
|
||||
position: absolute;
|
||||
left: 96dp;
|
||||
@@ -237,8 +240,8 @@ disc-info {
|
||||
bottom: 72dp;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12dp;
|
||||
font-size: 24dp;
|
||||
gap: var(--space-md);
|
||||
font-size: var(--font-size-4xl);
|
||||
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||
text-align: left;
|
||||
}
|
||||
@@ -256,9 +259,9 @@ version-info {
|
||||
bottom: 72dp;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
text-align: right;
|
||||
font-size: 24dp;
|
||||
font-size: var(--font-size-4xl);
|
||||
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||
text-align: right;
|
||||
}
|
||||
@@ -272,40 +275,40 @@ body.mirrored version-info {
|
||||
#disc-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
#disc-status[status=good] {
|
||||
color: #D8F999;
|
||||
color: var(--color-ready);
|
||||
}
|
||||
|
||||
#disc-status[status=bad] {
|
||||
color: #FFC9C9;
|
||||
color: var(--color-disc-error);
|
||||
}
|
||||
|
||||
#disc-status[status=verifying] {
|
||||
color: #FFFFFF;
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
#disc-status[status=mismatch] {
|
||||
color: #FFD6A7;
|
||||
color: var(--color-disc-mismatch);
|
||||
}
|
||||
|
||||
#disc-status[status=unknown] {
|
||||
color: rgba(224, 219, 200, 65%);
|
||||
color: rgba(var(--color-text-rgb), 65%);
|
||||
}
|
||||
|
||||
#disc-status[status=pending] {
|
||||
color: #FEE685;
|
||||
color: var(--color-prelaunch-accent);
|
||||
}
|
||||
|
||||
#disc-status icon {
|
||||
display: none;
|
||||
width: 24dp;
|
||||
height: 24dp;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
font-size: 24dp;
|
||||
font-size: var(--font-size-4xl);
|
||||
}
|
||||
|
||||
#disc-status[status] icon {
|
||||
@@ -337,24 +340,24 @@ body.mirrored version-info {
|
||||
}
|
||||
|
||||
#disc-version {
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
.update {
|
||||
update-status {
|
||||
display: none;
|
||||
color: #A6A09B;
|
||||
color: var(--color-prelaunch-muted);
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 8dp;
|
||||
font-size: 20dp;
|
||||
gap: var(--space-sm);
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
.update[state=checking],
|
||||
.update[state=failed] {
|
||||
update-status[state=checking],
|
||||
update-status[state=failed] {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.update[state=available] {
|
||||
update-status[state=available] {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
@@ -364,33 +367,33 @@ body.mirrored version-info {
|
||||
padding: 0dp;
|
||||
border-width: 0dp;
|
||||
background-color: transparent;
|
||||
color: #D8F999;
|
||||
color: var(--color-ready);
|
||||
cursor: pointer;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
decorator: horizontal-gradient(#00000000 #00000000);
|
||||
decorator: var(--menu-button-decorator);
|
||||
}
|
||||
|
||||
.update[state=available] #update-download {
|
||||
update-status[state=available] #update-download {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 2dp;
|
||||
gap: var(--space-2xs);
|
||||
}
|
||||
|
||||
#update-download icon {
|
||||
display: block;
|
||||
width: 18dp;
|
||||
height: 18dp;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
.detail {
|
||||
color: #A6A09B;
|
||||
disc-version {
|
||||
color: var(--color-prelaunch-muted);
|
||||
}
|
||||
|
||||
body.mirrored .update {
|
||||
body.mirrored update-status {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
@@ -436,12 +439,20 @@ body.animate-in .intro-item {
|
||||
|
||||
/* Mobile layout */
|
||||
@media (max-height: 640dp) {
|
||||
.gradient {
|
||||
decorator: horizontal-gradient(#00000000 #000000FF);
|
||||
body {
|
||||
--menu-button-decorator-hover: horizontal-gradient(#FEE68500 #FEE685FF);
|
||||
}
|
||||
|
||||
body.mirrored .gradient {
|
||||
decorator: horizontal-gradient(#000000FF #00000000);
|
||||
body.mirrored {
|
||||
--menu-button-decorator-hover: horizontal-gradient(#FEE685FF #FEE68500);
|
||||
}
|
||||
|
||||
prelaunch-gradient {
|
||||
decorator: horizontal-gradient(rgba(var(--color-black-rgb), 0%) rgba(var(--color-black-rgb), 100%));
|
||||
}
|
||||
|
||||
body.mirrored prelaunch-gradient {
|
||||
decorator: horizontal-gradient(rgba(var(--color-black-rgb), 100%) rgba(var(--color-black-rgb), 0%));
|
||||
}
|
||||
|
||||
menu {
|
||||
@@ -453,7 +464,7 @@ body.animate-in .intro-item {
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16dp;
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
body.mirrored menu {
|
||||
@@ -466,7 +477,7 @@ body.animate-in .intro-item {
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
max-width: 48%;
|
||||
margin-left: 32dp;
|
||||
margin-left: var(--space-2xl);
|
||||
}
|
||||
|
||||
body.mirrored hero {
|
||||
@@ -490,11 +501,6 @@ body.animate-in .intro-item {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#menu-list button:hover,
|
||||
#menu-list button:focus-visible {
|
||||
decorator: horizontal-gradient(#FEE68500 #FEE685FF);
|
||||
}
|
||||
|
||||
body.mirrored #menu-list {
|
||||
align-items: flex-start;
|
||||
}
|
||||
@@ -503,11 +509,6 @@ body.animate-in .intro-item {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
body.mirrored #menu-list button:hover,
|
||||
body.mirrored #menu-list button:focus-visible {
|
||||
decorator: horizontal-gradient(#FEE685FF #FEE68500);
|
||||
}
|
||||
|
||||
eyebrow {
|
||||
display: none;
|
||||
}
|
||||
@@ -518,8 +519,8 @@ body.animate-in .intro-item {
|
||||
bottom: 32dp;
|
||||
top: auto;
|
||||
text-align: right;
|
||||
font-size: 16dp;
|
||||
gap: 8dp;
|
||||
font-size: var(--font-size-md);
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
#disc-status {
|
||||
@@ -527,11 +528,11 @@ body.animate-in .intro-item {
|
||||
}
|
||||
|
||||
#disc-status icon {
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
#disc-version {
|
||||
font-size: 16dp;
|
||||
font-size: var(--font-size-md);
|
||||
}
|
||||
|
||||
version-info {
|
||||
@@ -540,12 +541,12 @@ body.animate-in .intro-item {
|
||||
bottom: auto;
|
||||
top: 32dp;
|
||||
text-align: right;
|
||||
font-size: 16dp;
|
||||
gap: 8dp;
|
||||
font-size: var(--font-size-md);
|
||||
gap: var(--space-sm);
|
||||
}
|
||||
|
||||
.update {
|
||||
font-size: 16dp;
|
||||
update-status {
|
||||
font-size: var(--font-size-md);
|
||||
}
|
||||
|
||||
body.mirrored disc-info {
|
||||
|
||||
+17
-16
@@ -18,17 +18,18 @@ tab-bar scrollbarhorizontal sliderbar {
|
||||
|
||||
tab-bar tab {
|
||||
flex: 0 0 auto;
|
||||
padding: 0 24dp;
|
||||
line-height: 64dp;
|
||||
padding: 0 var(--space-xl);
|
||||
line-height: var(--toolbar-height);
|
||||
white-space: nowrap;
|
||||
decorator: vertical-gradient(#c2a42d00 #c2a42d00);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 0%) rgba(var(--color-accent-rgb), 0%));
|
||||
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;
|
||||
border-bottom-width: 4dp;
|
||||
border-bottom-color: var(--color-accent);
|
||||
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||
}
|
||||
|
||||
@@ -36,17 +37,17 @@ tab-bar tab:focus-visible,
|
||||
tab-bar tab:hover {
|
||||
opacity: 1;
|
||||
font-effect: glow(0dp 4dp 0dp 4dp black);
|
||||
decorator: vertical-gradient(#c2a42d00 #c2a42d26);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 0) rgba(var(--color-accent-rgb), 38));
|
||||
}
|
||||
|
||||
tab-bar tab:active {
|
||||
decorator: vertical-gradient(#c2a42d10 #c2a42d40);
|
||||
decorator: vertical-gradient(rgba(var(--color-accent-rgb), 16) rgba(var(--color-accent-rgb), 64));
|
||||
}
|
||||
|
||||
tab-bar[closable] tab-end-spacer {
|
||||
display: block;
|
||||
flex: 0 0 64dp;
|
||||
width: 64dp;
|
||||
flex: 0 0 var(--toolbar-height);
|
||||
width: var(--toolbar-height);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@@ -56,13 +57,13 @@ window > close {
|
||||
position: fixed;
|
||||
top: 8dp;
|
||||
right: 8dp;
|
||||
z-index: 1;
|
||||
z-index: 2;
|
||||
width: 48dp;
|
||||
height: 48dp;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
font-size: 24dp;
|
||||
color: rgba(224, 219, 200, 70%);
|
||||
font-size: var(--font-size-4xl);
|
||||
color: rgba(var(--color-text-rgb), 70%);
|
||||
backdrop-filter: blur(2dp);
|
||||
border-radius: 6dp;
|
||||
decorator: text("" center center);
|
||||
@@ -74,8 +75,8 @@ tab-bar[closable] close:hover,
|
||||
tab-bar[closable] close:focus-visible,
|
||||
window > close:hover,
|
||||
window > close:focus-visible {
|
||||
color: #fff;
|
||||
background-color: rgba(194, 164, 45, 24%);
|
||||
color: var(--color-white);
|
||||
background-color: rgba(var(--color-accent-rgb), 24%);
|
||||
}
|
||||
|
||||
window > close {
|
||||
@@ -85,6 +86,6 @@ window > close {
|
||||
|
||||
tab-bar[closable] close:active,
|
||||
window > close:active {
|
||||
color: #fff;
|
||||
background-color: rgba(194, 164, 45, 40%);
|
||||
color: var(--color-white);
|
||||
background-color: rgba(var(--color-accent-rgb), 40%);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
--font-family-body: Fira Sans;
|
||||
--font-family-heading: Fira Sans Condensed;
|
||||
--font-family-monospace: Noto Mono;
|
||||
--font-family-icons: Material Symbols Rounded;
|
||||
--font-family-display: Alegreya SC;
|
||||
|
||||
--font-size-3xs: 11dp;
|
||||
--font-size-2xs: 12dp;
|
||||
--font-size-xs: 13dp;
|
||||
--font-size-sm: 14dp;
|
||||
--font-size-base: 15dp;
|
||||
--font-size-md: 16dp;
|
||||
--font-size-lg: 17dp;
|
||||
--font-size-xl: 18dp;
|
||||
--font-size-2xl: 20dp;
|
||||
--font-size-3xl: 22dp;
|
||||
--font-size-4xl: 24dp;
|
||||
--font-size-5xl: 28dp;
|
||||
--font-size-6xl: 32dp;
|
||||
|
||||
--space-2xs: 2dp;
|
||||
--space-xs: 4dp;
|
||||
--space-sm: 8dp;
|
||||
--space-md: 12dp;
|
||||
--space-lg: 16dp;
|
||||
--space-xl: 24dp;
|
||||
--space-2xl: 32dp;
|
||||
|
||||
--radius-small: 4dp;
|
||||
--radius-control: 7dp;
|
||||
--radius-panel: 8dp;
|
||||
--radius-window: 14dp;
|
||||
|
||||
--toolbar-height: 64dp;
|
||||
--toolbar-hidden-offset: -64dp;
|
||||
|
||||
--color-text-rgb: 224, 219, 200;
|
||||
--color-text: rgb(var(--color-text-rgb));
|
||||
--color-accent-rgb: 194, 164, 45;
|
||||
--color-accent: rgb(var(--color-accent-rgb));
|
||||
--color-border-rgb: 146, 135, 91;
|
||||
--color-border: rgb(var(--color-border-rgb));
|
||||
--color-surface-rgb: 21, 22, 16;
|
||||
--color-interactive-rgb: 204, 184, 119;
|
||||
--color-control-rgb: 17, 16, 10;
|
||||
--color-neutral-rgb: 217, 217, 217;
|
||||
--color-neutral: rgb(var(--color-neutral-rgb));
|
||||
--color-white-rgb: 255, 255, 255;
|
||||
--color-white: rgb(var(--color-white-rgb));
|
||||
--color-black-rgb: 0, 0, 0;
|
||||
--color-black: rgb(var(--color-black-rgb));
|
||||
|
||||
--color-success-rgb: 68, 204, 85;
|
||||
--color-success: rgb(var(--color-success-rgb));
|
||||
--color-info-rgb: 111, 183, 239;
|
||||
--color-info: rgb(var(--color-info-rgb));
|
||||
--color-warning-rgb: 255, 168, 38;
|
||||
--color-warning: rgb(var(--color-warning-rgb));
|
||||
--color-error-rgb: 204, 68, 68;
|
||||
--color-error: rgb(var(--color-error-rgb));
|
||||
|
||||
--color-progress-done: #44AA22;
|
||||
--color-progress-ongoing: #2255BB;
|
||||
--color-danger-border: #852221;
|
||||
--color-danger-heading: #B3261E;
|
||||
|
||||
--button-color: var(--color-text);
|
||||
--button-background: rgba(var(--color-control-rgb), 20%);
|
||||
--button-background-hover: rgba(var(--color-interactive-rgb), 20%);
|
||||
--button-background-selected: rgba(var(--color-interactive-rgb), 40%);
|
||||
--button-background-active: rgba(var(--color-interactive-rgb), 40%);
|
||||
|
||||
--toast-border-color: var(--color-border);
|
||||
--toast-heading-color: var(--color-border);
|
||||
}
|
||||
+64
-57
@@ -1,16 +1,28 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
--color-oil-border: rgba(42, 32, 18, 82%);
|
||||
--color-oil-background: rgba(18, 14, 10, 70%);
|
||||
--color-oil-fill: rgb(255, 232, 74);
|
||||
--color-button-a: rgba(34, 112, 123, 62%);
|
||||
--color-button-b: rgba(161, 61, 66, 58%);
|
||||
--color-button-x: rgba(83, 115, 151, 56%);
|
||||
--color-button-y: rgba(113, 91, 150, 54%);
|
||||
--color-stick-background: rgba(18, 20, 24, 35%);
|
||||
--color-stick-knob: rgba(238, 236, 226, 55%);
|
||||
|
||||
--button-color: rgba(248, 244, 232, 90%);
|
||||
--button-background: rgba(22, 24, 28, 48%);
|
||||
--button-background-active: rgba(63, 78, 90, 68%);
|
||||
--button-border-color: rgba(var(--color-white-rgb), 22%);
|
||||
--button-border-color-active: rgba(var(--color-white-rgb), 48%);
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
color: rgba(248, 244, 232, 90%);
|
||||
color: var(--button-color);
|
||||
z-index: 1;
|
||||
filter: opacity(0);
|
||||
transition: filter 0.2s linear-in-out;
|
||||
@@ -30,12 +42,11 @@ button {
|
||||
justify-content: center;
|
||||
decorator: none;
|
||||
padding: 0;
|
||||
border: 1dp rgba(255, 255, 255, 22%);
|
||||
background-color: rgba(22, 24, 28, 48%);
|
||||
color: rgba(248, 244, 232, 90%);
|
||||
border-width: 1dp;
|
||||
border-color: var(--button-border-color);
|
||||
background-color: var(--button-background);
|
||||
color: var(--button-color);
|
||||
text-align: center;
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 6dp 18dp rgba(0, 0, 0, 28%); */
|
||||
transform-origin: center;
|
||||
transition: background-color border-color filter transform 0.08s linear-in-out,
|
||||
opacity 0.2s linear-in-out;
|
||||
@@ -43,8 +54,8 @@ button {
|
||||
|
||||
button.pressed,
|
||||
button.active {
|
||||
background-color: rgba(63, 78, 90, 68%);
|
||||
border-color: rgba(255, 255, 255, 48%);
|
||||
background-color: var(--button-background-active);
|
||||
border-color: var(--button-border-color-active);
|
||||
filter: brightness(1.18);
|
||||
}
|
||||
|
||||
@@ -68,9 +79,9 @@ button icon {
|
||||
|
||||
button icon glyph {
|
||||
display: block;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
font-size: 24dp;
|
||||
font-size: var(--font-size-4xl);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
@@ -92,9 +103,9 @@ button icon glyph {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.trigger-l.active {
|
||||
background-color: rgba(57, 116, 133, 74%);
|
||||
border-color: rgba(128, 222, 234, 72%);
|
||||
.trigger-l {
|
||||
--button-background-active: rgba(57, 116, 133, 74%);
|
||||
--button-border-color-active: rgba(128, 222, 234, 72%);
|
||||
}
|
||||
|
||||
.trigger,
|
||||
@@ -103,12 +114,14 @@ button icon glyph {
|
||||
}
|
||||
|
||||
.trigger {
|
||||
font-size: 22dp;
|
||||
font-size: var(--font-size-3xl);
|
||||
}
|
||||
|
||||
.button-z {
|
||||
background-color: rgba(118, 79, 158, 58%);
|
||||
border-color: rgba(203, 170, 255, 36%);
|
||||
--button-background: rgba(118, 79, 158, 58%);
|
||||
--button-background-active: rgba(139, 91, 187, 82%);
|
||||
--button-border-color: rgba(203, 170, 255, 36%);
|
||||
--button-border-color-active: rgba(220, 194, 255, 70%);
|
||||
}
|
||||
|
||||
.midna-icon {
|
||||
@@ -121,7 +134,7 @@ button icon glyph {
|
||||
.button-z.has-icon span,
|
||||
.face.has-item span {
|
||||
position: absolute;
|
||||
font-size: 13dp;
|
||||
font-size: var(--font-size-xs);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
@@ -130,20 +143,14 @@ button icon glyph {
|
||||
bottom: 7dp;
|
||||
}
|
||||
|
||||
.button-z.pressed {
|
||||
background-color: rgba(139, 91, 187, 82%);
|
||||
border-color: rgba(220, 194, 255, 70%);
|
||||
}
|
||||
|
||||
action-bar {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border: 1dp rgba(255, 255, 255, 22%);
|
||||
border-width: 1dp;
|
||||
border-color: var(--button-border-color);
|
||||
border-radius: 23dp;
|
||||
background-color: rgba(22, 24, 28, 48%);
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 -6dp 18dp rgba(0, 0, 0, 28%); */
|
||||
background-color: var(--button-background);
|
||||
overflow: hidden;
|
||||
opacity: 1;
|
||||
transform-origin: center;
|
||||
@@ -175,7 +182,7 @@ action-bar:hidden separator {
|
||||
}
|
||||
|
||||
.utility.pressed {
|
||||
background-color: rgba(63, 78, 90, 68%);
|
||||
background-color: var(--button-background-active);
|
||||
}
|
||||
|
||||
.utility.pressed,
|
||||
@@ -185,7 +192,7 @@ action-bar:hidden separator {
|
||||
|
||||
.skip {
|
||||
z-index: 1;
|
||||
border-color: rgba(255, 255, 255, 36%);
|
||||
border-color: rgba(var(--color-white-rgb), 36%);
|
||||
}
|
||||
|
||||
separator {
|
||||
@@ -193,7 +200,7 @@ separator {
|
||||
flex: 0 0 1dp;
|
||||
width: 1dp;
|
||||
height: 24dp;
|
||||
background-color: rgba(255, 255, 255, 18%);
|
||||
background-color: rgba(var(--color-white-rgb), 18%);
|
||||
opacity: 1;
|
||||
transition: opacity 0.2s linear-in-out;
|
||||
}
|
||||
@@ -201,7 +208,7 @@ separator {
|
||||
.face {
|
||||
position: absolute;
|
||||
border-radius: 29dp;
|
||||
font-size: 24dp;
|
||||
font-size: var(--font-size-4xl);
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
@@ -219,10 +226,10 @@ separator {
|
||||
min-width: 17dp;
|
||||
height: 15dp;
|
||||
padding: 1dp 3dp;
|
||||
border-radius: 7dp;
|
||||
background-color: rgba(0, 0, 0, 52%);
|
||||
color: rgba(255, 255, 255, 92%);
|
||||
font-size: 12dp;
|
||||
border-radius: var(--radius-control);
|
||||
background-color: rgba(var(--color-black-rgb), 52%);
|
||||
color: rgba(var(--color-white-rgb), 92%);
|
||||
font-size: var(--font-size-2xs);
|
||||
line-height: 13dp;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -233,11 +240,10 @@ separator {
|
||||
bottom: -5dp;
|
||||
width: 34dp;
|
||||
height: 8dp;
|
||||
padding: 2dp;
|
||||
border: 1dp rgba(42, 32, 18, 82%);
|
||||
border-radius: 4dp;
|
||||
background-color: rgba(18, 14, 10, 70%);
|
||||
/* box-shadow: 0 2dp 6dp rgba(0, 0, 0, 35%); */
|
||||
padding: var(--space-2xs);
|
||||
border: 1dp var(--color-oil-border);
|
||||
border-radius: var(--radius-small);
|
||||
background-color: var(--color-oil-background);
|
||||
}
|
||||
|
||||
oil-fill {
|
||||
@@ -245,31 +251,31 @@ oil-fill {
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
border-radius: 2dp;
|
||||
background-color: rgb(255, 232, 74);
|
||||
background-color: var(--color-oil-fill);
|
||||
}
|
||||
|
||||
.face.has-item span {
|
||||
right: 6dp;
|
||||
bottom: 6dp;
|
||||
color: rgba(255, 255, 255, 88%);
|
||||
color: rgba(var(--color-white-rgb), 88%);
|
||||
}
|
||||
|
||||
.face.a {
|
||||
border-radius: 37dp;
|
||||
font-size: 31dp;
|
||||
background-color: rgba(34, 112, 123, 62%);
|
||||
background-color: var(--color-button-a);
|
||||
}
|
||||
|
||||
.face.b {
|
||||
background-color: rgba(161, 61, 66, 58%);
|
||||
background-color: var(--color-button-b);
|
||||
}
|
||||
|
||||
.face.x {
|
||||
background-color: rgba(83, 115, 151, 56%);
|
||||
background-color: var(--color-button-x);
|
||||
}
|
||||
|
||||
.face.y {
|
||||
background-color: rgba(113, 91, 150, 54%);
|
||||
background-color: var(--color-button-y);
|
||||
}
|
||||
|
||||
button.control.docked-top,
|
||||
@@ -306,10 +312,9 @@ touch-stick {
|
||||
width: 124dp;
|
||||
height: 124dp;
|
||||
border-radius: 62dp;
|
||||
background-color: rgba(18, 20, 24, 35%);
|
||||
border: 1dp rgba(255, 255, 255, 20%);
|
||||
/* backdrop-filter: blur(7dp); */
|
||||
/* box-shadow: 0 8dp 24dp rgba(0, 0, 0, 24%); */
|
||||
background-color: var(--color-stick-background);
|
||||
border-width: 1dp;
|
||||
border-color: rgba(var(--color-white-rgb), 20%);
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.18s linear-in-out;
|
||||
@@ -326,7 +331,8 @@ stick-ring {
|
||||
width: 88dp;
|
||||
height: 88dp;
|
||||
border-radius: 44dp;
|
||||
border: 1dp rgba(255, 255, 255, 18%);
|
||||
border-width: 1dp;
|
||||
border-color: rgba(var(--color-white-rgb), 18%);
|
||||
}
|
||||
|
||||
stick-knob {
|
||||
@@ -334,6 +340,7 @@ stick-knob {
|
||||
width: 48dp;
|
||||
height: 48dp;
|
||||
border-radius: 24dp;
|
||||
background-color: rgba(238, 236, 226, 55%);
|
||||
border: 1dp rgba(255, 255, 255, 45%);
|
||||
background-color: var(--color-stick-knob);
|
||||
border-width: 1dp;
|
||||
border-color: rgba(var(--color-white-rgb), 45%);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
body.touch-editor {
|
||||
background-color: rgba(4, 6, 8, 34%);
|
||||
--color-editor-backdrop: rgba(4, 6, 8, 34%);
|
||||
--color-editor-handle: rgba(34, 37, 42, 86%);
|
||||
--color-editor-accent-rgb: 255, 232, 128;
|
||||
--color-editor-highlight-rgb: 255, 244, 190;
|
||||
|
||||
background-color: var(--color-editor-backdrop);
|
||||
z-index: 8;
|
||||
}
|
||||
|
||||
@@ -14,7 +19,7 @@ body.touch-editor .control:hover,
|
||||
body.touch-editor action-bar:hover,
|
||||
body.touch-editor .control.editor-selected,
|
||||
body.touch-editor action-bar.editor-selected {
|
||||
border-color: rgba(255, 232, 128, 80%);
|
||||
border-color: rgba(var(--color-editor-accent-rgb), 80%);
|
||||
filter: brightness(1.15);
|
||||
}
|
||||
|
||||
@@ -27,8 +32,9 @@ selection-frame {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 20;
|
||||
border: 2dp rgba(255, 232, 128, 88%);
|
||||
background-color: rgba(255, 232, 128, 7%);
|
||||
border-width: 2dp;
|
||||
border-color: rgba(var(--color-editor-accent-rgb), 88%);
|
||||
background-color: rgba(var(--color-editor-accent-rgb), 7%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@@ -41,9 +47,10 @@ resize-handle {
|
||||
position: absolute;
|
||||
width: 22dp;
|
||||
height: 22dp;
|
||||
border: 2dp rgba(255, 244, 190, 96%);
|
||||
border-width: 2dp;
|
||||
border-color: rgba(var(--color-editor-highlight-rgb), 96%);
|
||||
border-radius: 11dp;
|
||||
background-color: rgba(34, 37, 42, 86%);
|
||||
background-color: var(--color-editor-handle);
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
@@ -90,6 +97,12 @@ resize-handle.corner.bottom {
|
||||
}
|
||||
|
||||
editor-toolbar {
|
||||
--button-background: rgba(17, 19, 24, 88%);
|
||||
--button-background-hover: rgba(78, 85, 96, 92%);
|
||||
--button-border-color: rgba(var(--color-white-rgb), 26%);
|
||||
--button-border-color-hover: rgba(var(--color-editor-highlight-rgb), 92%);
|
||||
--button-color: rgba(255, 250, 232, 94%);
|
||||
|
||||
display: flex;
|
||||
position: absolute;
|
||||
left: 24dp;
|
||||
@@ -98,7 +111,7 @@ editor-toolbar {
|
||||
z-index: 30;
|
||||
height: 48dp;
|
||||
margin-top: -24dp;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
justify-content: center;
|
||||
pointer-events: auto;
|
||||
}
|
||||
@@ -108,12 +121,13 @@ editor-toolbar button.editor-command {
|
||||
min-width: 96dp;
|
||||
height: 48dp;
|
||||
padding: 0 14dp;
|
||||
border-radius: 8dp;
|
||||
border: 1dp rgba(255, 255, 255, 26%);
|
||||
background-color: rgba(17, 19, 24, 88%);
|
||||
color: rgba(255, 250, 232, 94%);
|
||||
font-family: "Fira Sans";
|
||||
font-size: 18dp;
|
||||
border-radius: var(--radius-panel);
|
||||
border-width: 1dp;
|
||||
border-color: var(--button-border-color);
|
||||
background-color: var(--button-background);
|
||||
color: var(--button-color);
|
||||
font-family: var(--font-family-body);
|
||||
font-size: var(--font-size-xl);
|
||||
line-height: 48dp;
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
@@ -127,12 +141,12 @@ editor-toolbar button.editor-command span {
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command.primary {
|
||||
border-color: rgba(255, 232, 128, 70%);
|
||||
background-color: rgba(96, 82, 38, 90%);
|
||||
--button-border-color: rgba(var(--color-editor-accent-rgb), 70%);
|
||||
--button-background: rgba(96, 82, 38, 90%);
|
||||
}
|
||||
|
||||
editor-toolbar button.editor-command:hover,
|
||||
editor-toolbar button.editor-command:focus-visible {
|
||||
border-color: rgba(255, 244, 190, 92%);
|
||||
background-color: rgba(78, 85, 96, 92%);
|
||||
border-color: var(--button-border-color-hover);
|
||||
background-color: var(--button-background-hover);
|
||||
}
|
||||
|
||||
+31
-34
@@ -1,90 +1,87 @@
|
||||
*, *: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;
|
||||
font-family: var(--font-family-heading);
|
||||
font-size: var(--font-size-4xl);
|
||||
color: var(--color-white);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.tuner-root {
|
||||
tuner-root {
|
||||
width: 100%;
|
||||
min-height: 45%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
align-items: stretch;
|
||||
decorator: vertical-gradient(#00000000 #151610F2);
|
||||
decorator: vertical-gradient(rgba(var(--color-black-rgb), 0%) rgba(var(--color-surface-rgb), 242));
|
||||
filter: opacity(0);
|
||||
transition: filter 0.2s linear-in-out;
|
||||
}
|
||||
|
||||
.tuner-root[open] {
|
||||
tuner-root[open] {
|
||||
filter: opacity(1);
|
||||
}
|
||||
|
||||
.tuner {
|
||||
graphics-tuner {
|
||||
width: 100%;
|
||||
max-width: 1216dp;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24dp;
|
||||
gap: var(--space-xl);
|
||||
padding: 48dp 64dp;
|
||||
}
|
||||
|
||||
@media (max-height: 800dp) {
|
||||
.tuner-root {
|
||||
tuner-root {
|
||||
min-height: 38%;
|
||||
}
|
||||
|
||||
.tuner {
|
||||
gap: 16dp;
|
||||
padding: 32dp 48dp;
|
||||
graphics-tuner {
|
||||
gap: var(--space-lg);
|
||||
padding: var(--space-2xl) 48dp;
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
tuner-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 24dp;
|
||||
gap: var(--space-xl);
|
||||
}
|
||||
|
||||
.carousel-container {
|
||||
carousel-container {
|
||||
flex: 1 1 auto;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 18dp;
|
||||
tuner-description {
|
||||
font-size: var(--font-size-xl);
|
||||
line-height: 22dp;
|
||||
color: rgba(255, 255, 255, 50%);
|
||||
color: rgba(var(--color-white-rgb), 50%);
|
||||
}
|
||||
|
||||
.divider {
|
||||
tuner-divider {
|
||||
margin: 1dp 0;
|
||||
border-top: 1dp rgba(217, 217, 217, 50%);
|
||||
border-top-width: 1dp;
|
||||
border-top-color: rgba(var(--color-neutral-rgb), 50%);
|
||||
}
|
||||
|
||||
.footer {
|
||||
tuner-footer {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 24dp;
|
||||
gap: var(--space-xl);
|
||||
}
|
||||
|
||||
footer-button {
|
||||
@@ -94,12 +91,12 @@ footer-button {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
line-height: 24dp;
|
||||
text-transform: uppercase;
|
||||
color: #FFFFFF;
|
||||
color: var(--color-white);
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -112,20 +109,20 @@ footer-button.reset {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.stepped-carousel {
|
||||
stepped-carousel {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 16dp;
|
||||
gap: var(--space-lg);
|
||||
width: auto;
|
||||
min-width: 246dp;
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.stepped-carousel-value {
|
||||
stepped-carousel-value {
|
||||
line-height: 29dp;
|
||||
min-width: 166dp;
|
||||
text-align: center;
|
||||
@@ -142,6 +139,6 @@ footer-button.reset {
|
||||
background-color: transparent;
|
||||
opacity: 1;
|
||||
cursor: pointer;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
+443
-158
@@ -1,17 +1,13 @@
|
||||
*, *:before, *:after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 64dp;
|
||||
font-family: "Fira Sans";
|
||||
font-family: var(--font-family-body);
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-size: 15dp;
|
||||
color: #E0DBC8;
|
||||
font-size: var(--font-size-base);
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
b {
|
||||
@@ -27,12 +23,13 @@ window {
|
||||
max-width: 1088dp;
|
||||
max-height: 768dp;
|
||||
margin: auto;
|
||||
border-radius: 14dp;
|
||||
border-radius: var(--radius-window);
|
||||
overflow: hidden;
|
||||
border: 2dp #92875B;
|
||||
border-width: 2dp;
|
||||
border-color: var(--color-border);
|
||||
backdrop-filter: blur(5dp);
|
||||
box-shadow: 0 0 25dp 5dp;
|
||||
background-color: rgba(21, 22, 16, 90%);
|
||||
background-color: rgba(var(--color-surface-rgb), 90%);
|
||||
filter: opacity(0);
|
||||
transform: scale(0.9);
|
||||
transform-origin: center;
|
||||
@@ -61,7 +58,7 @@ window[open] {
|
||||
|
||||
@media (max-height: 640dp) {
|
||||
body {
|
||||
padding: 16dp;
|
||||
padding: var(--space-lg);
|
||||
}
|
||||
window {
|
||||
box-shadow: none;
|
||||
@@ -70,7 +67,7 @@ window[open] {
|
||||
|
||||
@media (max-width: 768dp) {
|
||||
body {
|
||||
padding: 16dp;
|
||||
padding: var(--space-lg);
|
||||
}
|
||||
window.modal {
|
||||
width: 100%;
|
||||
@@ -79,13 +76,14 @@ window[open] {
|
||||
}
|
||||
|
||||
window tab-bar {
|
||||
flex: 0 0 64dp;
|
||||
height: 64dp;
|
||||
background-color: rgba(217, 217, 217, 10%);
|
||||
font-family: "Fira Sans Condensed";
|
||||
flex: 0 0 var(--toolbar-height);
|
||||
height: var(--toolbar-height);
|
||||
background-color: rgba(var(--color-neutral-rgb), 10%);
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 18dp;
|
||||
border-bottom: 2dp #92875B;
|
||||
font-size: var(--font-size-xl);
|
||||
border-bottom-width: 2dp;
|
||||
border-bottom-color: var(--color-border);
|
||||
}
|
||||
|
||||
window tab-bar tab {
|
||||
@@ -106,14 +104,15 @@ window content pane {
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
padding: 24dp;
|
||||
gap: 8dp;
|
||||
padding: var(--space-xl);
|
||||
gap: var(--space-sm);
|
||||
overflow: hidden auto;
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
window content pane:not(:last-of-type) {
|
||||
border-right: 1dp #92875B;
|
||||
border-right-width: 1dp;
|
||||
border-right-color: var(--color-border);
|
||||
}
|
||||
|
||||
window content pane > * {
|
||||
@@ -129,7 +128,7 @@ ui-list {
|
||||
}
|
||||
|
||||
window content pane > ui-list,
|
||||
.modal-content pane > ui-list {
|
||||
modal-content pane > ui-list {
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
@@ -146,7 +145,7 @@ ui-list-viewport {
|
||||
ui-list-content {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
@@ -156,7 +155,7 @@ ui-list-content > button.ui-list-row {
|
||||
|
||||
ui-list-empty {
|
||||
display: block;
|
||||
padding: 16dp;
|
||||
padding: var(--space-lg);
|
||||
text-align: center;
|
||||
opacity: 0.45;
|
||||
}
|
||||
@@ -176,33 +175,33 @@ window content pane > ui-list:last-child {
|
||||
|
||||
window content pane > ui-list ui-list-content,
|
||||
window content pane > ui-list ui-list-empty {
|
||||
padding-left: 24dp;
|
||||
padding-right: 24dp;
|
||||
padding-left: var(--space-xl);
|
||||
padding-right: var(--space-xl);
|
||||
}
|
||||
|
||||
window content pane > ui-list:first-child ui-list-content,
|
||||
window content pane > ui-list:first-child ui-list-empty {
|
||||
padding-top: 24dp;
|
||||
padding-top: var(--space-xl);
|
||||
}
|
||||
|
||||
window content pane > ui-list:last-child ui-list-content,
|
||||
window content pane > ui-list:last-child ui-list-empty {
|
||||
padding-bottom: 24dp;
|
||||
padding-bottom: var(--space-xl);
|
||||
}
|
||||
|
||||
window content pane:last-of-type > div {
|
||||
line-height: 1.625;
|
||||
}
|
||||
|
||||
.data-folder-current {
|
||||
data-folder-current {
|
||||
display: block;
|
||||
font-size: 16dp;
|
||||
color: rgba(224, 219, 200, 65%);
|
||||
font-size: var(--font-size-md);
|
||||
color: rgba(var(--color-text-rgb), 65%);
|
||||
}
|
||||
|
||||
scrollbarvertical {
|
||||
width: 8dp;
|
||||
margin: 4dp 4dp 4dp 0;
|
||||
margin: var(--space-xs) var(--space-xs) var(--space-xs) 0;
|
||||
}
|
||||
|
||||
scrollbarvertical sliderarrowdec,
|
||||
@@ -218,14 +217,14 @@ scrollbarvertical slidertrack {
|
||||
scrollbarvertical sliderbar {
|
||||
width: 8dp;
|
||||
min-height: 24dp;
|
||||
background-color: rgba(224, 219, 200, 45%);
|
||||
background-color: rgba(var(--color-text-rgb), 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%);
|
||||
background-color: rgba(var(--color-accent-rgb), 80%);
|
||||
}
|
||||
|
||||
scrollbarhorizontal {
|
||||
@@ -244,26 +243,27 @@ scrollbarhorizontal sliderbar {
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.section-heading {
|
||||
font-family: "Fira Sans Condensed";
|
||||
section-heading {
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
font-size: 22dp;
|
||||
font-size: var(--font-size-3xl);
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
.section-heading:not(:first-of-type) {
|
||||
padding-top: 12dp;
|
||||
section-heading:not(:first-of-type) {
|
||||
padding-top: var(--space-md);
|
||||
}
|
||||
|
||||
button {
|
||||
text-align: center;
|
||||
background-color: rgba(17, 16, 10, 20%);
|
||||
color: var(--button-color);
|
||||
background-color: var(--button-background);
|
||||
opacity: 0.9;
|
||||
padding: 8dp 16dp;
|
||||
border-radius: 14dp;
|
||||
box-shadow: rgba(146, 135, 91, 25%) 0 0 0 1dp;
|
||||
font-size: 20dp;
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
border-radius: var(--radius-window);
|
||||
box-shadow: rgba(var(--color-border-rgb), 25%) 0 0 0 1dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
transition: background-color 0.1s linear-in-out, opacity 0.1s linear-in-out;
|
||||
cursor: pointer;
|
||||
focus: auto;
|
||||
@@ -271,19 +271,19 @@ button {
|
||||
|
||||
button:not(:disabled):hover,
|
||||
button:not(:disabled):focus-visible {
|
||||
background-color: rgba(204, 184, 119, 20%);
|
||||
box-shadow: #C2A42D 0 0 0 2dp;
|
||||
background-color: var(--button-background-hover);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
button:not(:disabled):selected {
|
||||
opacity: 1;
|
||||
background-color: rgba(204, 184, 119, 40%);
|
||||
background-color: var(--button-background-selected);
|
||||
}
|
||||
|
||||
button:not(:disabled):active {
|
||||
opacity: 1;
|
||||
background-color: rgba(204, 184, 119, 40%);
|
||||
box-shadow: #C2A42D 0 0 0 2dp;
|
||||
background-color: var(--button-background-active);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
@@ -299,12 +299,13 @@ button.modal-btn {
|
||||
select-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8dp;
|
||||
background-color: rgba(17, 16, 10, 20%);
|
||||
gap: var(--space-sm);
|
||||
color: var(--button-color);
|
||||
background-color: var(--button-background);
|
||||
opacity: 0.9;
|
||||
padding: 8dp 16dp;
|
||||
border-radius: 14dp;
|
||||
box-shadow: rgba(146, 135, 91, 25%) 0 0 0 1dp;
|
||||
padding: var(--space-sm) var(--space-lg);
|
||||
border-radius: var(--radius-window);
|
||||
box-shadow: rgba(var(--color-border-rgb), 25%) 0 0 0 1dp;
|
||||
transition: background-color 0.1s linear-in-out, opacity 0.1s linear-in-out;
|
||||
cursor: pointer;
|
||||
focus: auto;
|
||||
@@ -312,19 +313,19 @@ select-button {
|
||||
|
||||
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;
|
||||
background-color: var(--button-background-hover);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
select-button:not(:disabled):selected {
|
||||
opacity: 1;
|
||||
background-color: rgba(204, 184, 119, 40%);
|
||||
background-color: var(--button-background-selected);
|
||||
}
|
||||
|
||||
select-button:not(:disabled):active {
|
||||
opacity: 1;
|
||||
background-color: rgba(204, 184, 119, 40%);
|
||||
box-shadow: #C2A42D 0 0 0 2dp;
|
||||
background-color: var(--button-background-active);
|
||||
box-shadow: var(--color-accent) 0 0 0 2dp;
|
||||
}
|
||||
|
||||
select-button:disabled {
|
||||
@@ -333,9 +334,9 @@ select-button:disabled {
|
||||
}
|
||||
|
||||
select-button key {
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 18dp;
|
||||
font-size: var(--font-size-xl);
|
||||
text-transform: uppercase;
|
||||
flex: 0 1 auto;
|
||||
}
|
||||
@@ -343,7 +344,7 @@ select-button key {
|
||||
select-button value {
|
||||
flex: 1 1 auto;
|
||||
text-align: right;
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
select-button value.modified {
|
||||
@@ -352,7 +353,7 @@ select-button value.modified {
|
||||
|
||||
select-button input {
|
||||
text-align: right;
|
||||
font-size: 20dp;
|
||||
font-size: var(--font-size-2xl);
|
||||
}
|
||||
|
||||
select-button.group-button icon {
|
||||
@@ -360,8 +361,8 @@ select-button.group-button icon {
|
||||
margin-left: auto;
|
||||
width: 24dp;
|
||||
height: 24dp;
|
||||
font-size: 24dp;
|
||||
color: inherit;
|
||||
font-size: var(--font-size-4xl);
|
||||
color: var(--button-color);
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
@@ -371,8 +372,8 @@ select-button.group-button value {
|
||||
|
||||
select-button.color-input value {
|
||||
min-width: 0;
|
||||
font-family: "Noto Mono";
|
||||
font-size: 15dp;
|
||||
font-family: var(--font-family-monospace);
|
||||
font-size: var(--font-size-base);
|
||||
}
|
||||
|
||||
select-button.color-input color-swatch {
|
||||
@@ -380,19 +381,19 @@ select-button.color-input color-swatch {
|
||||
flex: 0 0 48dp;
|
||||
width: 48dp;
|
||||
height: 24dp;
|
||||
border-radius: 7dp;
|
||||
box-shadow: rgba(255, 255, 255, 45%) 0 0 0 1dp;
|
||||
border-radius: var(--radius-control);
|
||||
box-shadow: rgba(var(--color-white-rgb), 45%) 0 0 0 1dp;
|
||||
}
|
||||
|
||||
select-button.color-input color-swatch.empty {
|
||||
background-color: rgba(224, 219, 200, 12%);
|
||||
decorator: linear-gradient(135deg, rgba(224, 219, 200, 0) 45%, rgba(194, 164, 45, 70%) 48%, rgba(194, 164, 45, 70%) 52%, rgba(224, 219, 200, 0) 55%);
|
||||
background-color: rgba(var(--color-text-rgb), 12%);
|
||||
decorator: linear-gradient(135deg, rgba(var(--color-text-rgb), 0) 45%, rgba(var(--color-accent-rgb), 70%) 48%, rgba(var(--color-accent-rgb), 70%) 52%, rgba(var(--color-text-rgb), 0) 55%);
|
||||
}
|
||||
|
||||
icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
font-family: "Material Symbols Rounded";
|
||||
font-family: var(--font-family-icons);
|
||||
font-weight: normal;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
@@ -410,6 +411,10 @@ icon.verifying {
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
icon.download {
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
icon.celebration {
|
||||
decorator: text("" center center);
|
||||
}
|
||||
@@ -418,73 +423,74 @@ icon.question-mark {
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
.achievement-total {
|
||||
achievement-total {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 64dp;
|
||||
height: 64dp;
|
||||
line-height: 64dp;
|
||||
font-family: "Fira Sans Condensed";
|
||||
right: var(--toolbar-height);
|
||||
height: var(--toolbar-height);
|
||||
line-height: var(--toolbar-height);
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
font-size: 16dp;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
font-size: var(--font-size-md);
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.achievement-row {
|
||||
achievement-row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10dp;
|
||||
padding: 12dp 0;
|
||||
border-bottom: 1dp rgba(146, 135, 91, 30%);
|
||||
padding: var(--space-md) 0;
|
||||
border-bottom-width: 1dp;
|
||||
border-bottom-color: rgba(var(--color-border-rgb), 30%);
|
||||
}
|
||||
|
||||
.achievement-info {
|
||||
achievement-info {
|
||||
display: block;
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.achievement-header {
|
||||
achievement-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.achievement-name {
|
||||
achievement-name {
|
||||
flex: 1;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.achievement-name.unlocked {
|
||||
color: #ffa826;
|
||||
achievement-name.unlocked {
|
||||
color: var(--color-warning);
|
||||
}
|
||||
|
||||
.achievement-badge {
|
||||
font-size: 14dp;
|
||||
achievement-badge {
|
||||
font-size: var(--font-size-sm);
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.achievement-badge.unlocked {
|
||||
color: #44cc55;
|
||||
achievement-badge.unlocked {
|
||||
color: var(--color-success);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.achievement-badge.locked {
|
||||
color: #cc4444;
|
||||
achievement-badge.locked {
|
||||
color: var(--color-error);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.achievement-desc {
|
||||
display: block;
|
||||
color: rgba(224, 219, 200, 55%);
|
||||
font-size: 16dp;
|
||||
margin: 4dp 0 0 0;
|
||||
color: rgba(var(--color-text-rgb), 55%);
|
||||
font-size: var(--font-size-md);
|
||||
margin: var(--space-xs) 0 0 0;
|
||||
}
|
||||
|
||||
.achievement-progress {
|
||||
achievement-progress {
|
||||
display: block;
|
||||
font-size: 13dp;
|
||||
color: rgba(224, 219, 200, 45%);
|
||||
font-size: var(--font-size-xs);
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
}
|
||||
|
||||
progress {
|
||||
@@ -492,32 +498,32 @@ progress {
|
||||
width: 100%;
|
||||
height: 6dp;
|
||||
border-radius: 3dp;
|
||||
background-color: rgba(255, 255, 255, 10%);
|
||||
margin: 6dp 0 2dp 0;
|
||||
background-color: rgba(var(--color-white-rgb), 10%);
|
||||
margin: 6dp 0 var(--space-2xs) 0;
|
||||
}
|
||||
|
||||
progress fill {
|
||||
background-color: rgba(194, 164, 45, 80%);
|
||||
background-color: rgba(var(--color-accent-rgb), 80%);
|
||||
border-radius: 3dp;
|
||||
}
|
||||
|
||||
progress.progress-done fill {
|
||||
background-color: #44aa22;
|
||||
background-color: var(--color-progress-done);
|
||||
}
|
||||
|
||||
progress.progress-ongoing fill {
|
||||
background-color: #2255bb;
|
||||
background-color: var(--color-progress-ongoing);
|
||||
}
|
||||
|
||||
button.achievement-clear {
|
||||
flex: 0 0 auto;
|
||||
align-self: center;
|
||||
font-size: 14dp;
|
||||
padding: 2dp 8dp;
|
||||
font-size: var(--font-size-sm);
|
||||
padding: var(--space-2xs) var(--space-sm);
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
.preset-grid {
|
||||
preset-grid {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 20dp;
|
||||
@@ -526,24 +532,24 @@ button.achievement-clear {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.preset-col {
|
||||
preset-option {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
flex: 1 1 0;
|
||||
}
|
||||
|
||||
.preset-desc {
|
||||
preset-description {
|
||||
display: block;
|
||||
font-size: 16dp;
|
||||
font-size: var(--font-size-md);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
modal-dialog {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
padding: 24dp;
|
||||
padding: var(--space-xl);
|
||||
gap: 20dp;
|
||||
flex: 0 1 auto;
|
||||
min-height: 0;
|
||||
@@ -553,55 +559,55 @@ button.achievement-clear {
|
||||
}
|
||||
|
||||
window.modal.danger {
|
||||
border: 2dp #852221;
|
||||
border: 2dp var(--color-danger-border);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
modal-header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
flex: 0 0 auto;
|
||||
gap: 16dp;
|
||||
gap: var(--space-lg);
|
||||
}
|
||||
|
||||
.modal-header icon {
|
||||
font-size: 24dp;
|
||||
color: #92875B;
|
||||
modal-header icon {
|
||||
font-size: var(--font-size-4xl);
|
||||
color: var(--color-border);
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
modal-title {
|
||||
display: block;
|
||||
font-family: "Fira Sans Condensed";
|
||||
font-family: var(--font-family-heading);
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
font-size: 18dp;
|
||||
color: #92875B;
|
||||
font-size: var(--font-size-xl);
|
||||
color: var(--color-border);
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
window.modal.danger .modal-title,
|
||||
window.modal.danger .modal-header icon {
|
||||
color: #B3261E;
|
||||
window.modal.danger modal-title,
|
||||
window.modal.danger modal-header icon {
|
||||
color: var(--color-danger-heading);
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
modal-body {
|
||||
display: block;
|
||||
width: 100%;
|
||||
flex: 0 0 auto;
|
||||
min-width: 0;
|
||||
font-size: 20dp;
|
||||
color: #FFFFFF;
|
||||
font-size: var(--font-size-2xl);
|
||||
color: var(--color-white);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.modal-body span.tip {
|
||||
font-size: 14dp;
|
||||
color: #92875B;
|
||||
modal-body modal-tip {
|
||||
font-size: var(--font-size-sm);
|
||||
color: var(--color-border);
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
modal-content {
|
||||
display: none;
|
||||
width: 100%;
|
||||
flex: 1 1 auto;
|
||||
@@ -609,88 +615,367 @@ window.modal.danger .modal-header icon {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.modal-content.active {
|
||||
modal-content.active {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.modal-content pane {
|
||||
modal-content pane {
|
||||
display: flex;
|
||||
flex: 1 1 auto;
|
||||
flex-direction: column;
|
||||
min-height: 0;
|
||||
width: 100%;
|
||||
gap: 8dp;
|
||||
gap: var(--space-sm);
|
||||
overflow: hidden auto;
|
||||
}
|
||||
|
||||
.modal-content pane > * {
|
||||
modal-content pane > * {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.verification-progress {
|
||||
window.modal.install-queue {
|
||||
max-height: 768dp;
|
||||
}
|
||||
|
||||
window.modal.drop-install {
|
||||
max-height: 720dp;
|
||||
}
|
||||
|
||||
window.modal.drop-install package-row {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
window.modal.install-queue modal-body {
|
||||
display: none;
|
||||
}
|
||||
|
||||
window.modal.install-queue modal-content pane {
|
||||
gap: 0;
|
||||
padding-right: 14dp;
|
||||
padding-bottom: 6dp;
|
||||
}
|
||||
|
||||
package-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
gap: 10dp;
|
||||
padding: var(--space-md) 0;
|
||||
border-bottom-width: 1dp;
|
||||
border-bottom-color: rgba(var(--color-border-rgb), 30%);
|
||||
}
|
||||
|
||||
package-row:last-child {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
|
||||
package-row > mod-icon {
|
||||
display: none;
|
||||
flex: 0 0 36dp;
|
||||
width: 36dp;
|
||||
height: 36dp;
|
||||
margin-top: var(--space-2xs);
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-panel);
|
||||
background-color: rgba(var(--color-control-rgb), 45%);
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
font-family: var(--font-family-icons);
|
||||
font-size: var(--font-size-4xl);
|
||||
decorator: text("" center center);
|
||||
}
|
||||
|
||||
package-row > mod-icon.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
package-row > mod-icon.has-image {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
package-row.paused > mod-icon,
|
||||
package-row.retrying > mod-icon,
|
||||
package-row.failed > mod-icon {
|
||||
filter: grayscale(1);
|
||||
opacity: 0.55;
|
||||
}
|
||||
|
||||
package-row > section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
package-row > section > header {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
gap: var(--space-sm);
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
padding: 0 0 6dp 0;
|
||||
}
|
||||
|
||||
package-row h3 {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
gap: var(--space-xs);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
package-row h3 > span {
|
||||
display: block;
|
||||
flex: 0 1 auto;
|
||||
min-width: 0;
|
||||
font-weight: bold;
|
||||
color: var(--color-white);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
package-row h3 > small {
|
||||
display: block;
|
||||
flex: 0 0 auto;
|
||||
font-size: var(--font-size-xs);
|
||||
font-weight: normal;
|
||||
color: rgba(var(--color-text-rgb), 50%);
|
||||
}
|
||||
|
||||
package-row header > small {
|
||||
display: block;
|
||||
flex: 0 0 auto;
|
||||
font-size: var(--font-size-sm);
|
||||
color: rgba(var(--color-text-rgb), 60%);
|
||||
}
|
||||
|
||||
package-row.downloading header > small {
|
||||
color: var(--color-accent);
|
||||
}
|
||||
|
||||
package-row.retrying header > small {
|
||||
color: var(--color-warning);
|
||||
}
|
||||
|
||||
package-row.failed header > small,
|
||||
package-row.failed footer > small {
|
||||
color: var(--color-error);
|
||||
}
|
||||
|
||||
package-row.installed header > small,
|
||||
package-row.installed footer > small {
|
||||
color: var(--color-success);
|
||||
}
|
||||
|
||||
package-row progress {
|
||||
width: 100%;
|
||||
height: 6dp;
|
||||
margin: 0 0 var(--space-sm) 0;
|
||||
border-radius: 3dp;
|
||||
}
|
||||
|
||||
package-row.failed progress fill {
|
||||
background-color: var(--color-error);
|
||||
}
|
||||
|
||||
package-row.paused progress fill {
|
||||
background-color: rgba(var(--color-text-rgb), 35%);
|
||||
}
|
||||
|
||||
package-row.retrying progress fill {
|
||||
background-color: rgba(var(--color-warning-rgb), 55%);
|
||||
}
|
||||
|
||||
package-row.installed progress fill {
|
||||
background-color: var(--color-success);
|
||||
}
|
||||
|
||||
package-row footer {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
gap: var(--space-sm);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
package-row footer > small {
|
||||
display: block;
|
||||
flex: 1 1 0;
|
||||
min-width: 0;
|
||||
font-size: var(--font-size-xs);
|
||||
line-height: 1;
|
||||
color: rgba(var(--color-text-rgb), 45%);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
package-row nav {
|
||||
display: flex;
|
||||
flex: 0 0 auto;
|
||||
gap: 6dp;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
package-row nav > button.icon-action {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 0 0 30dp;
|
||||
width: 30dp;
|
||||
min-width: 30dp;
|
||||
height: 26dp;
|
||||
padding: 0;
|
||||
border-radius: 14dp;
|
||||
font-size: var(--font-size-md);
|
||||
}
|
||||
|
||||
package-row nav > button.icon-action icon {
|
||||
flex: 0 0 var(--font-size-md);
|
||||
width: var(--font-size-md);
|
||||
height: var(--font-size-md);
|
||||
font-size: var(--font-size-md);
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
package-row.installed {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
package-row.installed > mod-icon {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
package-row.installed > section {
|
||||
padding-right: 38dp;
|
||||
}
|
||||
|
||||
package-row.installed header > small {
|
||||
display: none;
|
||||
}
|
||||
|
||||
package-row.installed nav {
|
||||
position: absolute;
|
||||
top: 17dp;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
package-row.installed nav > button.icon-action {
|
||||
opacity: 0.45;
|
||||
}
|
||||
|
||||
verification-progress {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10dp;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.verification-file {
|
||||
verification-file {
|
||||
display: block;
|
||||
font-size: 17dp;
|
||||
color: #FFFFFF;
|
||||
font-size: var(--font-size-lg);
|
||||
color: var(--color-white);
|
||||
}
|
||||
|
||||
progress.verification-progress-bar {
|
||||
height: 8dp;
|
||||
margin: 2dp 0 0 0;
|
||||
margin: var(--space-2xs) 0 0 0;
|
||||
}
|
||||
|
||||
.verification-detail {
|
||||
verification-detail {
|
||||
display: block;
|
||||
font-size: 14dp;
|
||||
color: rgba(224, 219, 200, 65%);
|
||||
font-size: var(--font-size-sm);
|
||||
color: rgba(var(--color-text-rgb), 65%);
|
||||
}
|
||||
|
||||
.modal-actions {
|
||||
modal-actions {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
align-items: stretch;
|
||||
gap: 12dp;
|
||||
gap: var(--space-md);
|
||||
width: 100%;
|
||||
flex: 0 0 auto;
|
||||
padding-top: 4dp;
|
||||
padding-top: var(--space-xs);
|
||||
}
|
||||
|
||||
.modal-actions-vertical {
|
||||
modal-actions.vertical {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.modal-actions-vertical button.modal-btn {
|
||||
modal-actions.vertical button.modal-btn {
|
||||
flex: 0 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@media (max-height: 640dp) {
|
||||
.modal-dialog {
|
||||
padding: 16dp;
|
||||
gap: 12dp;
|
||||
modal-dialog {
|
||||
padding: var(--space-lg);
|
||||
gap: var(--space-md);
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
font-size: 17dp;
|
||||
modal-body {
|
||||
font-size: var(--font-size-lg);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640dp) {
|
||||
.modal-actions {
|
||||
modal-actions {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.modal-actions button.modal-btn {
|
||||
modal-actions button.modal-btn {
|
||||
flex: 0 0 auto;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
button.icon-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 44dp;
|
||||
height: 44dp;
|
||||
padding: var(--space-sm);
|
||||
box-sizing: border-box;
|
||||
flex-shrink: 0;
|
||||
font-size: var(--font-size-5xl);
|
||||
}
|
||||
|
||||
button.icon-button icon {
|
||||
display: block;
|
||||
flex-shrink: 0;
|
||||
line-height: 1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
ui-tooltip {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
max-width: 240dp;
|
||||
padding: 6dp 10dp;
|
||||
border: 1dp var(--color-border);
|
||||
border-radius: var(--radius-panel);
|
||||
background-color: rgba(var(--color-surface-rgb), 96%);
|
||||
color: var(--color-text);
|
||||
font-size: var(--font-size-md);
|
||||
word-break: break-word;
|
||||
pointer-events: none;
|
||||
focus: none;
|
||||
}
|
||||
|
||||
ui-tooltip.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ extern "C" {
|
||||
#define MOD_ABI_VERSION 1u
|
||||
#define MOD_ERROR_MESSAGE_SIZE 512u
|
||||
|
||||
#define DUSKLIGHT_SERVICE_ID_PREFIX "dev.twilitrealm.dusklight."
|
||||
|
||||
typedef struct ModContext ModContext;
|
||||
|
||||
typedef enum ModResult {
|
||||
|
||||
@@ -13,11 +13,15 @@
|
||||
* modmeta records. Each IMPORT_SERVICE/EXPORT_SERVICE/DEFINE_HOOK use places one
|
||||
* constant-initialized record object in the metadata section.
|
||||
*/
|
||||
#if defined(_MSVC_LANG) && !defined(__clang__)
|
||||
#define MOD_META_NO_ASAN
|
||||
#else
|
||||
#if defined(__has_attribute) && __has_attribute(no_sanitize)
|
||||
#define MOD_META_NO_ASAN __attribute__((no_sanitize("address")))
|
||||
#else
|
||||
#define MOD_META_NO_ASAN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#pragma section("modmeta$a", read, write)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <mods/api.h>
|
||||
#include <mods/svc/config.h>
|
||||
|
||||
#define ACTOR_SERVICE_ID "dev.twilitrealm.dusklight.actor"
|
||||
#define ACTOR_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "actor"
|
||||
#define ACTOR_SERVICE_MAJOR 1u
|
||||
#define ACTOR_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define CAMERA_SERVICE_ID "dev.twilitrealm.dusklight.camera"
|
||||
#define CAMERA_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "camera"
|
||||
#define CAMERA_SERVICE_MAJOR 1u
|
||||
#define CAMERA_SERVICE_MINOR 1u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define CONFIG_SERVICE_ID "dev.twilitrealm.dusklight.config"
|
||||
#define CONFIG_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "config"
|
||||
#define CONFIG_SERVICE_MAJOR 1u
|
||||
#define CONFIG_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define FILE_SERVICE_ID "dev.twilitrealm.dusklight.file"
|
||||
#define FILE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "file"
|
||||
#define FILE_SERVICE_MAJOR 1u
|
||||
#define FILE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define FLOW_SERVICE_ID "dev.twilitrealm.dusklight.flow"
|
||||
#define FLOW_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "flow"
|
||||
#define FLOW_SERVICE_MAJOR 1u
|
||||
#define FLOW_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
* ordinary version check then fails mods built against the old epoch with a clear message instead
|
||||
* of letting them corrupt memory.
|
||||
*/
|
||||
#define GAME_SERVICE_ID "dev.twilitrealm.dusklight.game"
|
||||
#define GAME_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "game"
|
||||
#define GAME_SERVICE_MAJOR 2u
|
||||
#define GAME_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <mods/api.h>
|
||||
#include <mods/svc/config.h>
|
||||
|
||||
#define GAME_MODE_SERVICE_ID "dev.twilitrealm.dusklight.gamemode"
|
||||
#define GAME_MODE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "gamemode"
|
||||
#define GAME_MODE_SERVICE_MAJOR 1u
|
||||
#define GAME_MODE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
* should be released in mod_shutdown. The device outlives all mods.
|
||||
*/
|
||||
|
||||
#define GFX_SERVICE_ID "dev.twilitrealm.dusklight.gfx"
|
||||
#define GFX_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "gfx"
|
||||
#define GFX_SERVICE_MAJOR 1u
|
||||
#define GFX_SERVICE_MINOR 2u
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* (file-local statics included).
|
||||
*/
|
||||
|
||||
#define HOOK_SERVICE_ID "dev.twilitrealm.dusklight.hook"
|
||||
#define HOOK_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "hook"
|
||||
#define HOOK_SERVICE_MAJOR 1u
|
||||
#define HOOK_SERVICE_MINOR 1u
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* Always available; every other service can be reached from it.
|
||||
*/
|
||||
|
||||
#define HOST_SERVICE_ID "dev.twilitrealm.dusklight.host"
|
||||
#define HOST_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "host"
|
||||
#define HOST_SERVICE_MAJOR 2u
|
||||
#define HOST_SERVICE_MINOR 2u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define HTTP_SERVICE_ID "dev.twilitrealm.dusklight.http"
|
||||
#define HTTP_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "http"
|
||||
#define HTTP_SERVICE_MAJOR 1u
|
||||
#define HTTP_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define ITEM_SERVICE_ID "dev.twilitrealm.dusklight.item"
|
||||
#define ITEM_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "item"
|
||||
#define ITEM_SERVICE_MAJOR 2u
|
||||
#define ITEM_SERVICE_MINOR 3u
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* (prefixed with its ID).
|
||||
*/
|
||||
|
||||
#define LOG_SERVICE_ID "dev.twilitrealm.dusklight.log"
|
||||
#define LOG_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "log"
|
||||
#define LOG_SERVICE_MAJOR 1u
|
||||
#define LOG_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define MESSAGE_SERVICE_ID "dev.twilitrealm.dusklight.message"
|
||||
#define MESSAGE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "message"
|
||||
#define MESSAGE_SERVICE_MAJOR 1u
|
||||
#define MESSAGE_SERVICE_MINOR 1u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define NET_SERVICE_ID "dev.twilitrealm.dusklight.net"
|
||||
#define NET_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "net"
|
||||
#define NET_SERVICE_MAJOR 1u
|
||||
#define NET_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define OVERLAY_SERVICE_ID "dev.twilitrealm.dusklight.overlay"
|
||||
#define OVERLAY_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "overlay"
|
||||
#define OVERLAY_SERVICE_MAJOR 1u
|
||||
#define OVERLAY_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
* for temporary storage.
|
||||
*/
|
||||
|
||||
#define RESOURCE_SERVICE_ID "dev.twilitrealm.dusklight.resource"
|
||||
#define RESOURCE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "resource"
|
||||
#define RESOURCE_SERVICE_MAJOR 1u
|
||||
#define RESOURCE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define SAVE_SERVICE_ID "dev.twilitrealm.dusklight.save"
|
||||
#define SAVE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "save"
|
||||
#define SAVE_SERVICE_MAJOR 1u
|
||||
#define SAVE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define STAGE_SERVICE_ID "dev.twilitrealm.dusklight.stage"
|
||||
#define STAGE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "stage"
|
||||
#define STAGE_SERVICE_MAJOR 1u
|
||||
#define STAGE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define TEXTURE_SERVICE_ID "dev.twilitrealm.dusklight.texture"
|
||||
#define TEXTURE_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "texture"
|
||||
#define TEXTURE_SERVICE_MAJOR 1u
|
||||
#define TEXTURE_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define UI_SERVICE_ID "dev.twilitrealm.dusklight.ui"
|
||||
#define UI_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "ui"
|
||||
#define UI_SERVICE_MAJOR 2u
|
||||
#define UI_SERVICE_MINOR 2u
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include <mods/service.hpp>
|
||||
#endif
|
||||
|
||||
#define WEBSOCKET_SERVICE_ID "dev.twilitrealm.dusklight.websocket"
|
||||
#define WEBSOCKET_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "websocket"
|
||||
#define WEBSOCKET_SERVICE_MAJOR 1u
|
||||
#define WEBSOCKET_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#define WINDOW_SERVICE_ID "dev.twilitrealm.dusklight.window"
|
||||
#define WINDOW_SERVICE_ID DUSKLIGHT_SERVICE_ID_PREFIX "window"
|
||||
#define WINDOW_SERVICE_MAJOR 1u
|
||||
#define WINDOW_SERVICE_MINOR 0u
|
||||
|
||||
|
||||
@@ -746,16 +746,26 @@ f32 Z2Audience::calcRelPosPan(const Vec& param_0, int camID) {
|
||||
f32 Z2Audience::calcRelPosDolby(const Vec& param_0, int camID) {
|
||||
f32 fVar1 = param_0.z + mAudioCamera[camID].getDolbyCenterZ();
|
||||
#if TARGET_PC
|
||||
if (dusk::audio::EnableHrtf) {
|
||||
const auto mode = dusk::getSettings().audio.outputMode.getValue();
|
||||
if (mode >= dusk::AudioOutputMode::StereoHeadphones) {
|
||||
// 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;
|
||||
f32 lenSq = param_0.x * param_0.x + param_0.z * param_0.z;
|
||||
if (mode == dusk::AudioOutputMode::StereoHeadphones) {
|
||||
// original HRTF math
|
||||
lenSq += param_0.y * param_0.y;
|
||||
}
|
||||
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));
|
||||
if (mode == dusk::AudioOutputMode::StereoHeadphones) {
|
||||
// original HRTF math
|
||||
return 0.5f - 0.5f * cosf(t * static_cast<f32>(M_PI));
|
||||
} else {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (fVar1 > mSetting.mDolbyBehindDistanceMax) {
|
||||
|
||||
+34
-32
@@ -53,11 +53,25 @@
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/action_bindings.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/dual_buffer.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#include "res/Object/Alink.h"
|
||||
#include <cstring>
|
||||
#include <helpers/string.hpp>
|
||||
|
||||
static const int IRON_BALL_CHAIN_COUNT = 102;
|
||||
static const int HS_CHAIN_ANCHOR_COUNT = 4;
|
||||
|
||||
namespace {
|
||||
struct AlinkInterp {
|
||||
dusk::interp::DualBuffer<cXyz, IRON_BALL_CHAIN_COUNT> ib_pos;
|
||||
dusk::interp::DualBuffer<csXyz, IRON_BALL_CHAIN_COUNT> ib_angle;
|
||||
dusk::interp::DualBuffer<cXyz, 1> ib_hand;
|
||||
cXyz hs_draw[HS_CHAIN_ANCHOR_COUNT];
|
||||
dusk::interp::DualBuffer<cXyz, HS_CHAIN_ANCHOR_COUNT> hs_chain{hs_draw};
|
||||
};
|
||||
} // namespace
|
||||
#endif
|
||||
|
||||
static int daAlink_Create(fopAc_ac_c* i_this);
|
||||
@@ -5993,7 +6007,7 @@ void daAlink_c::setItemMatrix(int param_0) {
|
||||
|
||||
mDoMtx_stack_c::XrotS(-0x8000);
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (dusk::interp::is_enabled()) {
|
||||
Mtx boot_mtx;
|
||||
mDoMtx_concat(mpLinkModel->getAnmMtx(0x18), mDoMtx_stack_c::get(), boot_mtx);
|
||||
mpLinkBootModels[1]->setAnmMtx(1, boot_mtx);
|
||||
@@ -14816,10 +14830,13 @@ void daAlink_c::deleteEquipItem(BOOL i_isPlaySound, BOOL i_isDeleteKantera) {
|
||||
mIronBallChainAngle = NULL;
|
||||
field_0x3848 = NULL;
|
||||
#if TARGET_PC
|
||||
mIBChainInterpPrevValid = false;
|
||||
mIBChainInterpCurrValid = false;
|
||||
mHsChainInterpPrevValid = false;
|
||||
mHsChainInterpCurrValid = false;
|
||||
{
|
||||
auto& interp = dusk::interp::get<AlinkInterp>(this);
|
||||
interp.ib_pos.reset();
|
||||
interp.ib_angle.reset();
|
||||
interp.ib_hand.reset();
|
||||
interp.hs_chain.reset();
|
||||
}
|
||||
#endif
|
||||
field_0x0774 = NULL;
|
||||
field_0x0778 = NULL;
|
||||
@@ -19792,36 +19809,21 @@ int daAlink_c::draw() {
|
||||
dComIfGd_getOpaListDark()->entryImm(mpHookChain, 0);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (dusk::interp::is_enabled()) {
|
||||
auto& interp = dusk::interp::get<AlinkInterp>(this);
|
||||
if (mEquipItem == dItemNo_IRONBALL_e &&
|
||||
mIronBallChainPos != NULL && mIronBallChainAngle != NULL)
|
||||
{
|
||||
if (mIBChainInterpCurrValid) {
|
||||
memcpy(mIBChainInterpPrevPos, mIBChainInterpCurrPos, IRON_BALL_CHAIN_COUNT * sizeof(cXyz));
|
||||
memcpy(mIBChainInterpPrevAngle, mIBChainInterpCurrAngle, IRON_BALL_CHAIN_COUNT * sizeof(csXyz));
|
||||
mIBChainInterpPrevHandRoot = mIBChainInterpCurrHandRoot;
|
||||
mIBChainInterpPrevValid = true;
|
||||
}
|
||||
|
||||
memcpy(mIBChainInterpCurrPos, mIronBallChainPos, IRON_BALL_CHAIN_COUNT * sizeof(cXyz));
|
||||
memcpy(mIBChainInterpCurrAngle, mIronBallChainAngle, IRON_BALL_CHAIN_COUNT * sizeof(csXyz));
|
||||
mIBChainInterpCurrHandRoot = mHookshotTopPos;
|
||||
mIBChainInterpCurrValid = true;
|
||||
|
||||
dusk::frame_interp::add_interpolation_callback(&ironBallChainInterpCallback, this);
|
||||
interp.ib_pos.writeback(mIronBallChainPos, IRON_BALL_CHAIN_COUNT);
|
||||
interp.ib_angle.writeback(mIronBallChainAngle, IRON_BALL_CHAIN_COUNT);
|
||||
interp.ib_hand.writeback(&mHookshotTopPos, 1);
|
||||
} else {
|
||||
if (mHsChainInterpCurrValid) {
|
||||
mHsChainInterpPrevTop = mHsChainInterpCurrTop;
|
||||
mHsChainInterpPrevRoot = mHsChainInterpCurrRoot;
|
||||
mHsChainInterpPrevSubRoot = mHsChainInterpCurrSubRoot;
|
||||
mHsChainInterpPrevSubTop = mHsChainInterpCurrSubTop;
|
||||
mHsChainInterpPrevValid = true;
|
||||
}
|
||||
mHsChainInterpCurrTop = mHookshotTopPos;
|
||||
mHsChainInterpCurrRoot = mHeldItemRootPos;
|
||||
mHsChainInterpCurrSubRoot = field_0x3810;
|
||||
mHsChainInterpCurrSubTop = mIronBallBgChkPos;
|
||||
mHsChainInterpCurrValid = true;
|
||||
cXyz hsAnchors[HS_CHAIN_ANCHOR_COUNT];
|
||||
hsAnchors[0] = mHookshotTopPos;
|
||||
hsAnchors[1] = mHeldItemRootPos;
|
||||
hsAnchors[2] = field_0x3810;
|
||||
hsAnchors[3] = mIronBallBgChkPos;
|
||||
interp.hs_chain.capture_and_schedule(hsAnchors, HS_CHAIN_ANCHOR_COUNT);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
#include "JSystem/J3DGraphBase/J3DMaterial.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/dual_buffer.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
|
||||
static const int HS_CHAIN_MAX_LINKS = 600;
|
||||
@@ -137,15 +138,15 @@ void daAlink_c::hsChainShape_c::draw() {
|
||||
} else {
|
||||
#if TARGET_PC
|
||||
cXyz hsInterpTop, hsInterpRoot, hsInterpSubRoot, hsInterpSubTop;
|
||||
if (dusk::frame_interp::is_enabled() && alink->mHsChainInterpPrevValid && alink->mHsChainInterpCurrValid) {
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
hsInterpTop = alink->mHsChainInterpPrevTop + (alink->mHsChainInterpCurrTop - alink->mHsChainInterpPrevTop) * alpha;
|
||||
hsInterpRoot = alink->mHsChainInterpPrevRoot + (alink->mHsChainInterpCurrRoot - alink->mHsChainInterpPrevRoot) * alpha;
|
||||
hsInterpSubRoot = alink->mHsChainInterpPrevSubRoot + (alink->mHsChainInterpCurrSubRoot - alink->mHsChainInterpPrevSubRoot) * alpha;
|
||||
hsInterpSubTop = alink->mHsChainInterpPrevSubTop + (alink->mHsChainInterpCurrSubTop - alink->mHsChainInterpPrevSubTop) * alpha;
|
||||
auto& hsInterp = dusk::interp::get<AlinkInterp>(alink);
|
||||
if (dusk::interp::is_enabled() && hsInterp.hs_chain.ready()) {
|
||||
hsInterpTop = hsInterp.hs_draw[0];
|
||||
hsInterpRoot = hsInterp.hs_draw[1];
|
||||
hsInterpSubRoot = hsInterp.hs_draw[2];
|
||||
hsInterpSubTop = hsInterp.hs_draw[3];
|
||||
} else {
|
||||
hsInterpTop = alink->getHsChainTopPos();
|
||||
hsInterpRoot = alink->getHsChainRootPos();
|
||||
hsInterpTop = alink->getHsChainTopPos();
|
||||
hsInterpRoot = alink->getHsChainRootPos();
|
||||
hsInterpSubRoot = alink->getHsSubChainRootPos();
|
||||
hsInterpSubTop = alink->getHsSubChainTopPos();
|
||||
}
|
||||
@@ -243,31 +244,6 @@ void daAlink_c::hsChainShape_c::draw() {
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void ironBallChainInterpCallback(bool isSimFrame, void* pUserWork) {
|
||||
static_cast<daAlink_c*>(pUserWork)->onIronBallChainInterpCallback();
|
||||
}
|
||||
|
||||
void daAlink_c::onIronBallChainInterpCallback() {
|
||||
if (!mIBChainInterpPrevValid || !mIBChainInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
if (mIronBallChainPos == NULL || mIronBallChainAngle == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
|
||||
for (int i = 0; i < IRON_BALL_CHAIN_COUNT; i++) {
|
||||
mIronBallChainPos[i] = mIBChainInterpPrevPos[i] + (mIBChainInterpCurrPos[i] - mIBChainInterpPrevPos[i]) * alpha;
|
||||
mIronBallChainAngle[i].x = mIBChainInterpPrevAngle[i].x + (s16)((s16)(mIBChainInterpCurrAngle[i].x - mIBChainInterpPrevAngle[i].x) * alpha);
|
||||
mIronBallChainAngle[i].y = mIBChainInterpPrevAngle[i].y + (s16)((s16)(mIBChainInterpCurrAngle[i].y - mIBChainInterpPrevAngle[i].y) * alpha);
|
||||
mIronBallChainAngle[i].z = mIBChainInterpPrevAngle[i].z + (s16)((s16)(mIBChainInterpCurrAngle[i].z - mIBChainInterpPrevAngle[i].z) * alpha);
|
||||
}
|
||||
mHookshotTopPos = mIBChainInterpPrevHandRoot + (mIBChainInterpCurrHandRoot - mIBChainInterpPrevHandRoot) * alpha;
|
||||
}
|
||||
#endif
|
||||
|
||||
void daAlink_c::hookshotAtHitCallBack(dCcD_GObjInf* i_atObjInf, fopAc_ac_c* i_tgActor,
|
||||
dCcD_GObjInf* i_tgObjInf) {
|
||||
if (i_tgActor != NULL && fopAcM_IsActor(i_tgActor) && !i_tgObjInf->ChkTgHookshotThrough()) {
|
||||
|
||||
@@ -340,18 +340,31 @@ void daAlink_c::setHorseStirrup() {
|
||||
mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30bc));
|
||||
mDoMtx_stack_c::transM(-2.0f, -11.0f, 1.5f);
|
||||
mDoMtx_stack_c::ZXYrotM(0, -0x8000, 0x4000);
|
||||
#if TARGET_PC
|
||||
horse->m_model->setAnmMtx(0x17, mDoMtx_stack_c::get());
|
||||
#else
|
||||
mDoMtx_copy(mDoMtx_stack_c::get(), horse->getLeftStirrupMtx());
|
||||
#endif
|
||||
}
|
||||
|
||||
if (field_0x2fab & 2) {
|
||||
mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(field_0x30be));
|
||||
mDoMtx_stack_c::transM(-2.0f, 11.0f, 1.5f);
|
||||
mDoMtx_stack_c::ZrotM(-0x4000);
|
||||
#if TARGET_PC
|
||||
horse->m_model->setAnmMtx(0x19, mDoMtx_stack_c::get());
|
||||
#else
|
||||
mDoMtx_copy(mDoMtx_stack_c::get(), horse->getRightStirrupMtx());
|
||||
#endif
|
||||
}
|
||||
|
||||
if (field_0x2fab & 3) {
|
||||
horse->calcWeightEnvMtx();
|
||||
#if TARGET_PC
|
||||
for (u16 i = 0; i < horse->m_model->getModelData()->getWEvlpMtxNum(); i++) {
|
||||
dusk::interp::record_final_mtx(horse->m_model->getWeightAnmMtx(i));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int hand_type = getReinHandType();
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#if TARGET_PC
|
||||
#include "dusk/achievements.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#endif
|
||||
|
||||
class daB_GND_HIO_c : public JORReflexible {
|
||||
@@ -285,30 +285,6 @@ static int h_nodeCallBack(J3DJoint* i_joint, int param_2) {
|
||||
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) {
|
||||
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
|
||||
|
||||
@@ -396,21 +372,6 @@ static int daB_GND_Draw(b_gnd_class* i_this) {
|
||||
|
||||
i_this->field_0x21e8.update(2, l_color, &a_this->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->field_0x21e8);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
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;
|
||||
@@ -3791,7 +3752,7 @@ static void demo_camera(b_gnd_class* i_this) {
|
||||
i_this->mDemoCamSyncTicks = 2;
|
||||
}
|
||||
if (i_this->mDemoCamSyncTicks > 0) {
|
||||
dusk::frame_interp::request_presentation_sync();
|
||||
dusk::interp::request_presentation_sync();
|
||||
i_this->mDemoCamSyncTicks--;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
||||
|
||||
#include "d/actor/d_a_balloon_2D.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "JSystem/J2DGraph/J2DGrafContext.h"
|
||||
#include "JSystem/J2DGraph/J2DScreen.h"
|
||||
#include "JSystem/J2DGraph/J2DTextBox.h"
|
||||
@@ -21,6 +20,10 @@
|
||||
#include "m_Do/m_Do_lib.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daBalloon2D_HIO_c : public mDoHIO_entry_c {
|
||||
public:
|
||||
inline daBalloon2D_HIO_c() {
|
||||
@@ -439,12 +442,9 @@ void daBalloon2D_c::setComboAlpha() {
|
||||
void daBalloon2D_c::drawAddScore() {
|
||||
for (s32 i = 19; i >= 0; i--) {
|
||||
if (field_0x5f8[i].field_0xe != 0) {
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::frame_interp::get_ui_tick_pending())
|
||||
#endif
|
||||
{
|
||||
field_0x5f8[i].field_0xe--;
|
||||
}
|
||||
IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending())
|
||||
field_0x5f8[i].field_0xe--;
|
||||
IF_DUSK_BLOCK_END
|
||||
s32 score3;
|
||||
s32 score2;
|
||||
s32 score = field_0x5f8[i].field_0xc;
|
||||
@@ -452,13 +452,10 @@ void daBalloon2D_c::drawAddScore() {
|
||||
u8 local_88 = 0xff;
|
||||
f32 dVar11 = 30.0f;
|
||||
f32 dVar9 = 30.0f;
|
||||
#ifdef TARGET_PC
|
||||
if (dusk::frame_interp::get_ui_tick_pending())
|
||||
#endif
|
||||
{
|
||||
field_0x5f8[i].field_0x0.x += cM_ssin(temp0) * 0.3f;
|
||||
field_0x5f8[i].field_0x0.y -= 1.0f;
|
||||
}
|
||||
IF_DUSK_BLOCK(dusk::interp::get_ui_tick_pending())
|
||||
field_0x5f8[i].field_0x0.x += cM_ssin(temp0) * 0.3f;
|
||||
field_0x5f8[i].field_0x0.y -= 1.0f;
|
||||
IF_DUSK_BLOCK_END
|
||||
if (field_0x5f8[i].field_0xe < 10) {
|
||||
f32 fVar5 = field_0x5f8[i].field_0xe / 10.0f;
|
||||
local_88 = fVar5 * 255.0f;
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
#include "SSystem/SComponent/c_math.h"
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
static bool hio_set;
|
||||
|
||||
static daE_Bee_HIO_c l_HIO;
|
||||
@@ -50,6 +54,26 @@ static int daE_Bee_Draw(e_bee_class* i_this) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void bee_interp(bee_s* i_bee) {
|
||||
if (!dusk::interp::is_enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
J3DModel* models[] = {
|
||||
i_bee->mpModel1,
|
||||
i_bee->mpModel2,
|
||||
i_bee->mpModel3,
|
||||
i_bee->mpModel4,
|
||||
};
|
||||
MtxP mtx = mDoMtx_stack_c::get();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
models[i]->setBaseTRMtx(mtx);
|
||||
models[i]->calc();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void bee_mtxset(bee_s* i_bee) {
|
||||
mDoMtx_stack_c::transS(i_bee->mPos.x, i_bee->mPos.y, i_bee->mPos.z);
|
||||
mDoMtx_stack_c::YrotM(i_bee->mAngle.y);
|
||||
@@ -62,6 +86,7 @@ static void bee_mtxset(bee_s* i_bee) {
|
||||
} else {
|
||||
i_bee->mpModel2->setBaseTRMtx(mDoMtx_stack_c::get());
|
||||
}
|
||||
IF_DUSK(bee_interp(i_bee));
|
||||
}
|
||||
|
||||
static void bee_ground_ang_set(bee_s* i_bee) {
|
||||
@@ -332,6 +357,7 @@ static void bee_nest_action(e_bee_class* i_this, bee_s* i_bee, s8 i_nestHealth)
|
||||
i_bee->mpModel4->setBaseTRMtx(mDoMtx_stack_c::get());
|
||||
}
|
||||
}
|
||||
IF_DUSK(bee_interp(i_bee));
|
||||
|
||||
if (i_nestHealth == 1) {
|
||||
i_bee->mAction = bee_s::ACT_FLY;
|
||||
|
||||
@@ -10,10 +10,6 @@
|
||||
#include "f_op/f_op_kankyo_mng.h"
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daE_DB_HIO_c : public JORReflexible {
|
||||
public:
|
||||
daE_DB_HIO_c();
|
||||
@@ -70,22 +66,6 @@ static BOOL leaf_anm_init(e_db_class* i_this, int i_anm, f32 i_morf, u8 i_mode,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_DB_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_db_class* i_this = (e_db_class*)pUserWork;
|
||||
if (!i_this->mStalkLineInterpPrevValid || !i_this->mStalkLineInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
cXyz* dst = i_this->stalkLine.getPos(0);
|
||||
for (int i = 0; i < 12; i++) {
|
||||
const cXyz& p0 = i_this->mStalkLineInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mStalkLineInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_DB_Draw(e_db_class* i_this) {
|
||||
fopAc_ac_c* actor = &i_this->enemy;
|
||||
|
||||
@@ -115,17 +95,6 @@ static int daE_DB_Draw(e_db_class* i_this) {
|
||||
static GXColor l_color = {0x14, 0x0F, 0x00, 0xFF};
|
||||
i_this->stalkLine.update(12, l_color, &actor->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->stalkLine);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mStalkLineInterpCurrValid) {
|
||||
memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr));
|
||||
i_this->mStalkLineInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mStalkLineInterpCurr, i_this->stalkLine.getPos(0), 12 * sizeof(cXyz));
|
||||
i_this->mStalkLineInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_DB_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 1; i < 11; i++) {
|
||||
if (i_this->thornModel[i] != NULL) {
|
||||
|
||||
@@ -9,10 +9,6 @@
|
||||
#include "d/actor/d_a_e_hb_leaf.h"
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
enum daE_HB_ACTION {
|
||||
ACTION_STAY,
|
||||
ACTION_APPEAR,
|
||||
@@ -68,22 +64,6 @@ static BOOL leaf_anm_init(e_hb_class* i_this, int i_anm, f32 i_morf, u8 i_mode,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_HB_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_hb_class* i_this = (e_hb_class*)pUserWork;
|
||||
if (!i_this->mStalkLineInterpPrevValid || !i_this->mStalkLineInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
cXyz* dst = i_this->stalkLine.getPos(0);
|
||||
for (int i = 0; i < 12; i++) {
|
||||
const cXyz& p0 = i_this->mStalkLineInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mStalkLineInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_HB_Draw(e_hb_class* i_this) {
|
||||
fopAc_ac_c* actor = &i_this->enemy;
|
||||
|
||||
@@ -102,17 +82,6 @@ static int daE_HB_Draw(e_hb_class* i_this) {
|
||||
static GXColor l_color = {0x14, 0x0F, 0x00, 0xFF};
|
||||
i_this->stalkLine.update(12, l_color, &actor->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->stalkLine);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mStalkLineInterpCurrValid) {
|
||||
memcpy(i_this->mStalkLineInterpPrev, i_this->mStalkLineInterpCurr, sizeof(i_this->mStalkLineInterpCurr));
|
||||
i_this->mStalkLineInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mStalkLineInterpCurr, i_this->stalkLine.getPos(0), 12 * sizeof(cXyz));
|
||||
i_this->mStalkLineInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_HB_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 1; i < 11; i++) {
|
||||
if (i_this->thornModel[i] != NULL) {
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
#include "d/d_bomb.h"
|
||||
#include "c/c_damagereaction.h"
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
|
||||
#define ACTION_STANDBY 0
|
||||
#define ACTION_WALK1 1
|
||||
@@ -65,22 +63,6 @@ static void anm_init(e_mb_class* i_this, int i_anmID, f32 i_morf, u8 i_attr, f32
|
||||
i_this->mAnm = i_anmID;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void e_mb_rope_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_mb_class* i_this = (e_mb_class*)pUserWork;
|
||||
if (!i_this->mRopeInterpPrevValid || !i_this->mRopeInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
cXyz* dst = i_this->mRopeMat.getPos(0);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
const cXyz& p0 = i_this->mRopeInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mRopeInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_MB_Draw(e_mb_class* i_this) {
|
||||
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
|
||||
|
||||
@@ -104,17 +86,6 @@ static int daE_MB_Draw(e_mb_class* i_this) {
|
||||
static GXColor l_color = {0x14, 0x0F, 0x00, 0xFF};
|
||||
i_this->mRopeMat.update(16, l_color, &a_this->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->mRopeMat);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mRopeInterpCurrValid) {
|
||||
memcpy(i_this->mRopeInterpPrev, i_this->mRopeInterpCurr, sizeof(i_this->mRopeInterpCurr));
|
||||
i_this->mRopeInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mRopeInterpCurr, i_this->mRopeMat.getPos(0), 16 * sizeof(cXyz));
|
||||
i_this->mRopeInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&e_mb_rope_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
#include "d/d_s_play.h"
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
#include "f_op/f_op_camera_mng.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#include <cstring>
|
||||
|
||||
class daE_S1_HIO_c {
|
||||
@@ -101,32 +99,6 @@ static void anm_init(e_s1_class* i_this, int i_resNo, f32 i_morf, u8 i_attr, f32
|
||||
i_this->mAnm = i_resNo;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_S1_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_s1_class* i_this = (e_s1_class*)pUserWork;
|
||||
if (!i_this->mHairInterpPrevValid || !i_this->mHairInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
for (int s = 0; s < e_s1_class::HAIR_STRAND_COUNT; s++) {
|
||||
cXyz* dst = i_this->mLineMat.getPos(s);
|
||||
for (int i = 0; i < e_s1_class::HAIR_SEGMENT_COUNT; i++) {
|
||||
int idx = s * e_s1_class::HAIR_SEGMENT_COUNT + i;
|
||||
const cXyz& p0 = i_this->mHairInterpPrev[idx];
|
||||
const cXyz& p1 = i_this->mHairInterpCurr[idx];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
GXColor line_color;
|
||||
line_color.r = JREG_S(0) + 5;
|
||||
line_color.g = JREG_S(1) + 10;
|
||||
line_color.b = JREG_S(2) + 10;
|
||||
line_color.a = 0xFF;
|
||||
|
||||
i_this->mLineMat.update(16, line_color, &i_this->tevStr);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_S1_Draw(e_s1_class* i_this) {
|
||||
if (i_this->field_0x306c != 0) {
|
||||
return 1;
|
||||
@@ -160,22 +132,6 @@ static int daE_S1_Draw(e_s1_class* i_this) {
|
||||
i_this->mLineMat.update(16, line_color, &i_this->tevStr);
|
||||
dComIfGd_set3DlineMatDark(&i_this->mLineMat);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mHairInterpCurrValid) {
|
||||
memcpy(i_this->mHairInterpPrev, i_this->mHairInterpCurr, sizeof(i_this->mHairInterpCurr));
|
||||
i_this->mHairInterpPrevValid = true;
|
||||
}
|
||||
for (int s = 0; s < e_s1_class::HAIR_STRAND_COUNT; s++) {
|
||||
cXyz* src = i_this->mLineMat.getPos(s);
|
||||
memcpy(&i_this->mHairInterpCurr[s * e_s1_class::HAIR_SEGMENT_COUNT], src,
|
||||
e_s1_class::HAIR_SEGMENT_COUNT * sizeof(cXyz));
|
||||
}
|
||||
i_this->mHairInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_S1_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
dComIfGd_setList();
|
||||
return 1;
|
||||
}
|
||||
@@ -2193,11 +2149,6 @@ static int daE_S1_Create(fopAc_ac_c* i_this) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
a_this->mHairInterpPrevValid = false;
|
||||
a_this->mHairInterpCurrValid = false;
|
||||
#endif
|
||||
|
||||
OS_REPORT("//////////////E_S1 SET 2 !!\n");
|
||||
|
||||
if (path_no != 0xFF) {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daE_SM2_HIO_c : public fOpAcm_HIO_entry_c {
|
||||
@@ -81,7 +81,7 @@ static int nodeCallBack(J3DJoint* i_joint, int param_1) {
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_SM2_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
static void daE_SM2_interp_callback(void* pUserWork) {
|
||||
e_sm2_class* i_this = static_cast<e_sm2_class*>(pUserWork);
|
||||
if (i_this == NULL) {
|
||||
return;
|
||||
@@ -133,7 +133,7 @@ static int daE_SM2_Draw(e_sm2_class* i_this) {
|
||||
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->enemy;
|
||||
|
||||
#if TARGET_PC
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_SM2_interp_callback, i_this);
|
||||
dusk::interp::add_interpolation_callback(&daE_SM2_interp_callback, i_this);
|
||||
#endif
|
||||
|
||||
g_env_light.settingTevStruct(0, &actor->current.pos, &actor->tevStr);
|
||||
|
||||
@@ -18,10 +18,12 @@
|
||||
#include "m_Do/m_Do_controller_pad.h"
|
||||
#include "m_Do/m_Do_graphic.h"
|
||||
#include "res/Object/Always.h"
|
||||
#include "dusk/dusk.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/dusk.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daE_WB_HIO_c : public JORReflexible {
|
||||
public:
|
||||
@@ -186,30 +188,6 @@ static bool hio_set;
|
||||
|
||||
static daE_WB_HIO_c l_HIO;
|
||||
|
||||
#if TARGET_PC
|
||||
static void e_wb_rein_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_wb_class* i_this = (e_wb_class*)pUserWork;
|
||||
if (!i_this->himo_interp_prev_valid || !i_this->himo_interp_curr_valid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
for (int r = 0; r < 2; r++) {
|
||||
cXyz* dst = i_this->himo_mat[r].getPos(0);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
const cXyz& p0 = i_this->himo_mat_interp_prev[r][i];
|
||||
const cXyz& p1 = i_this->himo_mat_interp_curr[r][i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
cXyz* dst = i_this->himo_tex.getPos(0);
|
||||
for (int i = 0; i < 2; i++) {
|
||||
const cXyz& p0 = i_this->himo_tex_interp_prev[i];
|
||||
const cXyz& p1 = i_this->himo_tex_interp_curr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void himo_control1(e_wb_class* i_this, cXyz* i_pos, int i_no, s8 param_3) {
|
||||
fopEn_enemy_c* enemy = &i_this->enemy;
|
||||
cXyz mae, ato;
|
||||
@@ -534,21 +512,6 @@ static int daE_WB_Draw(e_wb_class* i_this) {
|
||||
dComIfGd_set3DlineMat(&i_this->himo_mat[1]);
|
||||
i_this->himo_tex.update(2, l_color, &actor->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->himo_tex);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->himo_interp_curr_valid) {
|
||||
memcpy(i_this->himo_mat_interp_prev, i_this->himo_mat_interp_curr, sizeof(i_this->himo_mat_interp_curr));
|
||||
memcpy(i_this->himo_tex_interp_prev, i_this->himo_tex_interp_curr, sizeof(i_this->himo_tex_interp_curr));
|
||||
i_this->himo_interp_prev_valid = true;
|
||||
}
|
||||
for (int r = 0; r < 2; r++) {
|
||||
memcpy(i_this->himo_mat_interp_curr[r], i_this->himo_mat[r].getPos(0), 16 * sizeof(cXyz));
|
||||
}
|
||||
memcpy(i_this->himo_tex_interp_curr, i_this->himo_tex.getPos(0), 2 * sizeof(cXyz));
|
||||
i_this->himo_interp_curr_valid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&e_wb_rein_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -4542,7 +4505,7 @@ static void demo_camera(e_wb_class* i_this) {
|
||||
i_this->demo_cam_way_spd.z = fabsf(i_this->demo_cam_way.z - i_this->demo_cam_ctr.z);
|
||||
i_this->demo_cam_morf = 0;
|
||||
pla->setPlayerPosAndAngle(&pla->current.pos, pla->shape_angle.y - 4000, 0);
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
}
|
||||
if (i_this->demo_timer == 345) {
|
||||
daPy_getPlayerActorClass()->setThrowDamage(boss->enemy.shape_angle.y - 8000 + TREG_S(8),
|
||||
@@ -4789,7 +4752,7 @@ static void demo_camera(e_wb_class* i_this) {
|
||||
i_this->demo_cam_eye.x += 300.0f + VREG_F(8);
|
||||
i_this->demo_cam_eye.y += 150.0f + VREG_F(9);
|
||||
i_this->demo_cam_eye.z -= 1400.0f + VREG_F(10);
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
}
|
||||
} else {
|
||||
i_this->demo_cam_eye = enemy->current.pos;
|
||||
@@ -5050,7 +5013,7 @@ static void demo_camera(e_wb_class* i_this) {
|
||||
i_this->demo_cam_sync_ticks = 2;
|
||||
}
|
||||
if (i_this->demo_cam_sync_ticks > 0) {
|
||||
dusk::frame_interp::request_presentation_sync();
|
||||
dusk::interp::request_presentation_sync();
|
||||
i_this->demo_cam_sync_ticks--;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
#include "d/d_cc_uty.h"
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daE_YD_HIO_c {
|
||||
public:
|
||||
daE_YD_HIO_c();
|
||||
@@ -77,22 +73,6 @@ static s32 leaf_anm_init(e_yd_class* i_this, int param_1, f32 param_2, u8 param_
|
||||
return false;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_YD_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_yd_class* i_this = (e_yd_class*)pUserWork;
|
||||
if (!i_this->mLineMatInterpPrevValid || !i_this->mLineMatInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
cXyz* dst = i_this->mLineMat.getPos(0);
|
||||
for (int i = 0; i < 12; i++) {
|
||||
const cXyz& p0 = i_this->mLineMatInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mLineMatInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static s32 daE_YD_Draw(e_yd_class* i_this) {
|
||||
static GXColor l_color = { 0x14, 0x0F, 0x00, 0xFF };
|
||||
|
||||
@@ -106,17 +86,6 @@ static s32 daE_YD_Draw(e_yd_class* i_this) {
|
||||
i_this->mpMorf->entryDL();
|
||||
i_this->mLineMat.update(12, l_color, &i_this->actor.tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->mLineMat);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mLineMatInterpCurrValid) {
|
||||
memcpy(i_this->mLineMatInterpPrev, i_this->mLineMatInterpCurr, sizeof(i_this->mLineMatInterpCurr));
|
||||
i_this->mLineMatInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mLineMatInterpCurr, i_this->mLineMat.getPos(0), 12 * sizeof(cXyz));
|
||||
i_this->mLineMatInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_YD_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
for (s32 i = 1; i < 11; i++) {
|
||||
if (i_this->field_0x77c[i] != 0) {
|
||||
g_env_light.setLightTevColorType_MAJI(i_this->field_0x77c[i], &i_this->actor.tevStr);
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
#include "f_op/f_op_kankyo_mng.h"
|
||||
#include "d/actor/d_a_obj_carry.h"
|
||||
#include "Z2AudioLib/Z2Instances.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
|
||||
enum E_yg_RES_File_ID {
|
||||
@@ -136,33 +134,6 @@ static BOOL pl_check(e_yg_class* i_this, f32 i_dist) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_YG_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_yg_class* i_this = (e_yg_class*)pUserWork;
|
||||
fopAc_ac_c* actor = (fopAc_ac_c*)&i_this->actor;
|
||||
if (!i_this->mTentacleInterpPrevValid || !i_this->mTentacleInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
for (int s = 0; s < e_yg_class::TENTACLE_STRAND_COUNT; s++) {
|
||||
cXyz* dst = i_this->mLineMat.getPos(s);
|
||||
for (int i = 0; i < e_yg_class::TENTACLE_SEGMENT_COUNT; i++) {
|
||||
int idx = s * e_yg_class::TENTACLE_SEGMENT_COUNT + i;
|
||||
const cXyz& p0 = i_this->mTentacleInterpPrev[idx];
|
||||
const cXyz& p1 = i_this->mTentacleInterpCurr[idx];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
GXColor color;
|
||||
color.r = JREG_S(0) + 20;
|
||||
color.g = JREG_S(1) + 20;
|
||||
color.b = JREG_S(2) + 20;
|
||||
color.a = 0xFF;
|
||||
|
||||
i_this->mLineMat.update(10, color, &actor->tevStr);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_YG_Draw(e_yg_class* i_this) {
|
||||
if (i_this->mDispFlag) {
|
||||
return 1;
|
||||
@@ -190,22 +161,6 @@ static int daE_YG_Draw(e_yg_class* i_this) {
|
||||
i_this->mLineMat.update(10, color, &actor->tevStr);
|
||||
dComIfGd_set3DlineMatDark(&i_this->mLineMat);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mTentacleInterpCurrValid) {
|
||||
memcpy(i_this->mTentacleInterpPrev, i_this->mTentacleInterpCurr, sizeof(i_this->mTentacleInterpCurr));
|
||||
i_this->mTentacleInterpPrevValid = true;
|
||||
}
|
||||
for (int s = 0; s < e_yg_class::TENTACLE_STRAND_COUNT; s++) {
|
||||
cXyz* src = i_this->mLineMat.getPos(s);
|
||||
memcpy(&i_this->mTentacleInterpCurr[s * e_yg_class::TENTACLE_SEGMENT_COUNT], src,
|
||||
e_yg_class::TENTACLE_SEGMENT_COUNT * sizeof(cXyz));
|
||||
}
|
||||
i_this->mTentacleInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_YG_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
dComIfGd_setList();
|
||||
|
||||
return 1;
|
||||
@@ -1424,11 +1379,6 @@ static cPhs_Step daE_YG_Create(fopAc_ac_c* actor) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
i_this->mTentacleInterpPrevValid = false;
|
||||
i_this->mTentacleInterpCurrValid = false;
|
||||
#endif
|
||||
|
||||
if (!hio_set) {
|
||||
i_this->mIsFirstSpawn = 1;
|
||||
hio_set = true;
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
#include "f_op/f_op_actor_enemy.h"
|
||||
#include "f_op/f_op_kankyo_mng.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
class daE_YH_HIO_c : public JORReflexible {
|
||||
public:
|
||||
daE_YH_HIO_c();
|
||||
@@ -89,22 +85,6 @@ static BOOL leaf_anm_init(e_yh_class* i_this, int param_2, f32 param_3, u8 param
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void daE_YH_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
e_yh_class* i_this = (e_yh_class*)pUserWork;
|
||||
if (!i_this->mLineInterpPrevValid || !i_this->mLineInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
cXyz* dst = i_this->mLine.getPos(0);
|
||||
for (int i = 0; i < 12; i++) {
|
||||
const cXyz& p0 = i_this->mLineInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mLineInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int daE_YH_Draw(e_yh_class* i_this) {
|
||||
fopAc_ac_c* a_this = (fopAc_ac_c*)i_this;
|
||||
|
||||
@@ -134,17 +114,6 @@ static int daE_YH_Draw(e_yh_class* i_this) {
|
||||
|
||||
i_this->mLine.update(12, l_color, &a_this->tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->mLine);
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mLineInterpCurrValid) {
|
||||
memcpy(i_this->mLineInterpPrev, i_this->mLineInterpCurr, sizeof(i_this->mLineInterpCurr));
|
||||
i_this->mLineInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mLineInterpCurr, i_this->mLine.getPos(0), 12 * sizeof(cXyz));
|
||||
i_this->mLineInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&daE_YH_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 1; i < 11; i++) {
|
||||
if (i_this->mModels[i] != NULL) {
|
||||
|
||||
@@ -20,23 +20,6 @@
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/dusk.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
|
||||
namespace {
|
||||
// FRAME INTERP NOTE: Sim tick control point snapshots for interpolation
|
||||
constexpr int kHorseReinSimMax = 75;
|
||||
cXyz s_horseReinSimPrev[kHorseReinSimMax];
|
||||
cXyz s_horseReinSimCurr[kHorseReinSimMax];
|
||||
int s_horseReinSimNumPrev;
|
||||
int s_horseReinSimNumCurr;
|
||||
bool s_horseReinSimPrevValid;
|
||||
bool s_horseReinSimCurrValid;
|
||||
uint64_t s_horseReinSimRolledSeq;
|
||||
} // namespace
|
||||
#endif
|
||||
|
||||
#define ANM_HS_BACK_WALK 6
|
||||
#define ANM_HS_WALK_START 7
|
||||
#define ANM_HS_EXCITEMENT 8
|
||||
@@ -3033,24 +3016,6 @@ void daHorse_c::copyReinPos() {
|
||||
for (i = rein->field_0x8[0] - 1; i >= 0; i--, pos_p++) {
|
||||
*pos_p = rein->field_0x0[0][i];
|
||||
}
|
||||
#if TARGET_PC
|
||||
if (field_0x1204 > 0) {
|
||||
const uint64_t simSeq = dusk::frame_interp::sim_tick_seq();
|
||||
if (simSeq != s_horseReinSimRolledSeq) {
|
||||
s_horseReinSimRolledSeq = simSeq;
|
||||
if (s_horseReinSimCurrValid && s_horseReinSimNumCurr > 0) {
|
||||
memcpy(s_horseReinSimPrev, s_horseReinSimCurr, s_horseReinSimNumCurr * sizeof(cXyz));
|
||||
s_horseReinSimNumPrev = s_horseReinSimNumCurr;
|
||||
s_horseReinSimPrevValid = true;
|
||||
}
|
||||
}
|
||||
memcpy(s_horseReinSimCurr, m_reinLine.getPos(0), field_0x1204 * sizeof(cXyz));
|
||||
s_horseReinSimNumCurr = field_0x1204;
|
||||
s_horseReinSimCurrValid = true;
|
||||
} else {
|
||||
s_horseReinSimCurrValid = false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void daHorse_c::setReinPosHandSubstance(int param_0) {
|
||||
@@ -3162,30 +3127,6 @@ void daHorse_c::setReinPosNormalSubstance() {
|
||||
copyReinPos();
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
void daHorse_c::lerpControlPoints(f32 alpha) {
|
||||
// FRAME INTERP NOTE: Currently only lerping points for Epona's reins. Need a more global solution.
|
||||
if (!dusk::frame_interp::is_enabled() || !s_horseReinSimPrevValid || !s_horseReinSimCurrValid) {
|
||||
return;
|
||||
}
|
||||
const int nCurr = s_horseReinSimNumCurr;
|
||||
const int nPrev = s_horseReinSimNumPrev;
|
||||
if (nCurr <= 0) {
|
||||
return;
|
||||
}
|
||||
int n = nPrev < nCurr ? nPrev : nCurr;
|
||||
if (n <= 0 || n > kHorseReinSimMax) {
|
||||
return;
|
||||
}
|
||||
cXyz* dst = m_reinLine.getPos(0);
|
||||
for (int i = 0; i < n; i++) {
|
||||
const cXyz& p0 = s_horseReinSimPrev[i];
|
||||
const cXyz& p1 = s_horseReinSimCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void daHorse_c::bgCheck() {
|
||||
if (m_procID != PROC_LARGE_DAMAGE_e) {
|
||||
static DUSK_CONSTEXPR cXyz localCenterPos(0.0f, 100.0f, 0.0f);
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/dvd_asset.hpp"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
|
||||
#include <aurora/texture.hpp>
|
||||
|
||||
@@ -212,8 +212,8 @@ void daMant_packet_c::draw() {
|
||||
MtxP src25 = model->getAnmMtx(25);
|
||||
Mtx joint_34_scratch;
|
||||
Mtx joint_25_scratch;
|
||||
MtxP joint_34 = dusk::frame_interp::lookup_replacement(src34, joint_34_scratch) ? joint_34_scratch : src34;
|
||||
MtxP joint_25 = dusk::frame_interp::lookup_replacement(src25, joint_25_scratch) ? joint_25_scratch : src25;
|
||||
MtxP joint_34 = dusk::interp::lookup_replacement(src34, joint_34_scratch) ? joint_34_scratch : src34;
|
||||
MtxP joint_25 = dusk::interp::lookup_replacement(src25, joint_25_scratch) ? joint_25_scratch : src25;
|
||||
|
||||
cXyz presented_anchor_a;
|
||||
cXyz presented_anchor_b;
|
||||
@@ -232,7 +232,7 @@ void daMant_packet_c::draw() {
|
||||
}
|
||||
}
|
||||
|
||||
const f32 step = dusk::frame_interp::get_interpolation_step();
|
||||
const f32 step = dusk::interp::get_interpolation_step();
|
||||
for (int i = 0; i < 169; ++i) {
|
||||
cXyz curr_local;
|
||||
MTXMultVec(curr_frame_inverse, &curr_pos[i], &curr_local);
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/mods/item.hpp"
|
||||
#include "dusk/settings.h"
|
||||
#include "dusk/version.hpp"
|
||||
@@ -183,25 +182,6 @@ static int Worm_nodeCallBack(J3DJoint* i_joint, int param_1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
static void dmg_rod_interp_callback(bool isSimFrame, void* pUserWork) {
|
||||
dmg_rod_class* i_this = (dmg_rod_class*)pUserWork;
|
||||
if (!i_this->mLineInterpPrevValid || !i_this->mLineInterpCurrValid) {
|
||||
return;
|
||||
}
|
||||
const f32 alpha = dusk::frame_interp::get_interpolation_step();
|
||||
const int count = i_this->kind == MG_ROD_KIND_LURE ? MG_ROD_LURE_LINE_LEN : MG_ROD_UKI_LINE_LEN;
|
||||
cXyz* dst = i_this->linemat.getPos(0);
|
||||
for (int i = 0; i < count; i++) {
|
||||
const cXyz& p0 = i_this->mLineInterpPrev[i];
|
||||
const cXyz& p1 = i_this->mLineInterpCurr[i];
|
||||
dst[i] = p0 + (p1 - p0) * alpha;
|
||||
}
|
||||
static GXColor l_color = {0xFF, 0xFF, 0x96, 0xFF};
|
||||
i_this->linemat.update(count, l_color, &i_this->actor.tevStr);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dmg_rod_Draw(dmg_rod_class* i_this) {
|
||||
int unused;
|
||||
fopAc_ac_c* actor = &i_this->actor;
|
||||
@@ -242,18 +222,6 @@ static int dmg_rod_Draw(dmg_rod_class* i_this) {
|
||||
i_this->linemat.update(MG_ROD_LURE_LINE_LEN, l_color, &i_this->actor.tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->linemat);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mLineInterpCurrValid) {
|
||||
memcpy(i_this->mLineInterpPrev, i_this->mLineInterpCurr, MG_ROD_LURE_LINE_LEN * sizeof(cXyz));
|
||||
i_this->mLineInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mLineInterpCurr, i_this->linemat.getPos(0), MG_ROD_LURE_LINE_LEN * sizeof(cXyz));
|
||||
i_this->mLineInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&dmg_rod_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
model = i_this->rod_modelMorf->getModel();
|
||||
g_env_light.setLightTevColorType_MAJI(model, &i_this->actor.tevStr);
|
||||
i_this->rod_modelMorf->entryDL();
|
||||
@@ -278,18 +246,6 @@ static int dmg_rod_Draw(dmg_rod_class* i_this) {
|
||||
i_this->linemat.update(MG_ROD_UKI_LINE_LEN, l_color, &i_this->actor.tevStr);
|
||||
dComIfGd_set3DlineMat(&i_this->linemat);
|
||||
|
||||
#if TARGET_PC
|
||||
if (dusk::frame_interp::is_enabled()) {
|
||||
if (i_this->mLineInterpCurrValid) {
|
||||
memcpy(i_this->mLineInterpPrev, i_this->mLineInterpCurr, MG_ROD_UKI_LINE_LEN * sizeof(cXyz));
|
||||
i_this->mLineInterpPrevValid = true;
|
||||
}
|
||||
memcpy(i_this->mLineInterpCurr, i_this->linemat.getPos(0), MG_ROD_UKI_LINE_LEN * sizeof(cXyz));
|
||||
i_this->mLineInterpCurrValid = true;
|
||||
dusk::frame_interp::add_interpolation_callback(&dmg_rod_interp_callback, i_this);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < 15; i++) {
|
||||
g_env_light.setLightTevColorType_MAJI(i_this->rod_uki_model[i], &actor->tevStr);
|
||||
mDoExt_modelUpdateDL(i_this->rod_uki_model[i]);
|
||||
@@ -6481,11 +6437,6 @@ static int dmg_rod_Create(fopAc_ac_c* i_this) {
|
||||
return cPhs_ERROR_e;
|
||||
}
|
||||
|
||||
#if TARGET_PC
|
||||
rod->mLineInterpPrevValid = false;
|
||||
rod->mLineInterpCurrValid = false;
|
||||
#endif
|
||||
|
||||
OS_REPORT("//////////////MG_ROD SET 2 !!\n");
|
||||
if (!hio_set) {
|
||||
rod->HIOInit = TRUE;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "d/d_debug_viewer.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
static f32 dummy_lit_3777(int idx, u8 foo) {
|
||||
@@ -1110,10 +1110,10 @@ void daMidna_c::setBodyPartMatrix() {
|
||||
mpModel->setAnmMtx(i, mpShadowModel->getAnmMtx(i));
|
||||
}
|
||||
mpModel->calcWeightEnvelopeMtx();
|
||||
#ifdef TARGET_PC
|
||||
#if TARGET_PC
|
||||
// FRAME INTERP NOTE: Record weight envelopes for Midna here, as they are otherwise missed causing distortion
|
||||
for (u16 i = 0; i < mpModel->getModelData()->getWEvlpMtxNum(); i++) {
|
||||
dusk::frame_interp::record_final_mtx(mpModel->getWeightAnmMtx(i));
|
||||
dusk::interp::record_final_mtx(mpModel->getWeightAnmMtx(i));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -14,10 +14,6 @@
|
||||
#include <gf/GFLight.h>
|
||||
#include "m_Do/m_Do_lib.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
static BOOL daMirror_c_createHeap(fopAc_ac_c* i_this) {
|
||||
return ((daMirror_c*)i_this)->createHeap();
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include <cstring>
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/interp/frame_interpolation.h"
|
||||
#endif
|
||||
|
||||
static home_path_pnt home_path[38] = {
|
||||
@@ -2659,7 +2659,7 @@ static void demo_camera(npc_ne_class* i_this) {
|
||||
i_this->mCameraFovY = 55.0f;
|
||||
camera->mCamera.SetTrimSize(3);
|
||||
daPy_getPlayerActorClass()->changeOriginalDemo();
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
// fallthrough
|
||||
|
||||
case 2:
|
||||
@@ -2688,7 +2688,7 @@ static void demo_camera(npc_ne_class* i_this) {
|
||||
if (i_this->mDemoCounter == 0) {
|
||||
i_this->mCameraCenter1.set(387.0f, 133.0f, -866.0f);
|
||||
i_this->mCameraEye1.set(284.0f, 208.0f, -585.0f);
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
}
|
||||
|
||||
if (i_this->mDemoCounter == 12) {
|
||||
@@ -2725,7 +2725,7 @@ static void demo_camera(npc_ne_class* i_this) {
|
||||
i_this->mCameraFovY = 45.0f;
|
||||
camera->mCamera.SetTrimSize(3);
|
||||
daPy_getPlayerActorClass()->changeOriginalDemo();
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
// fallthrough
|
||||
|
||||
case 11:
|
||||
@@ -2806,10 +2806,10 @@ static void demo_camera(npc_ne_class* i_this) {
|
||||
MtxPosition(&vec, &i_this->mCameraEye2);
|
||||
i_this->mCameraEye2 += player->current.pos;
|
||||
player->changeDemoParam2(2);
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
} else if (i_this->mDemoCounter == 120) {
|
||||
player->changeDemoParam2(0);
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2862,7 +2862,7 @@ static void demo_camera(npc_ne_class* i_this) {
|
||||
i_this->mCameraCenter1 = _this->current.pos;
|
||||
i_this->mCameraCenter1.y += 20.0f;
|
||||
i_this->mCameraFovY = 55.0f;
|
||||
IF_DUSK(dusk::frame_interp::request_presentation_sync());
|
||||
IF_DUSK(dusk::interp::request_presentation_sync());
|
||||
}
|
||||
|
||||
camera->mCamera.Set(i_this->mCameraCenter1, i_this->mCameraEye1,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user