Merge main

This commit is contained in:
Pieter-Jan Briers
2026-09-11 08:59:43 +02:00
239 changed files with 12257 additions and 4616 deletions
+18 -3
View File
@@ -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 ()
+3
View File
@@ -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
View File
@@ -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 ()
+35 -1
View File
@@ -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
-23
View File
@@ -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
-6
View File
@@ -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
};
-6
View File
@@ -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);
-6
View File
@@ -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);
-6
View File
@@ -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);
-9
View File
@@ -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);
-6
View File
@@ -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
};
-6
View File
@@ -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);
-9
View File
@@ -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);
-6
View File
@@ -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);
-3
View File
@@ -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();
-7
View File
@@ -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 */
+3
View File
@@ -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];
-12
View File
@@ -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);
-9
View File
@@ -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:
+1 -8
View File
@@ -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);
+1 -1
View File
@@ -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); }
+1 -1
View File
@@ -441,7 +441,7 @@ public:
}
#if TARGET_PC
void refresh3DlineMats(const cXyz& eye);
void refresh3DlineMats();
#endif
void peekZdata() { mPeekZ.peekData(); }
+15 -12
View File
@@ -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 */
+34 -24
View File
@@ -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);
}
}
+2 -2
View File
@@ -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);
-4
View File
@@ -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;
+12
View File
@@ -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() {
+4 -4
View File
@@ -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;
+9 -9
View File
@@ -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;
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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);
+4 -3
View File
@@ -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;
+32
View File
@@ -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;
+16 -18
View File
@@ -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
View File
@@ -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);
}
+922
View File
@@ -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
View File
@@ -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("&#xe2c0;" center center);
}
mod-entry.installs mod-icon {
color: var(--color-accent);
decorator: text("&#xe2c4;" 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("&#xe87b;" 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
View File
@@ -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("&#xe87b;" 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("&#xe002;" center center);
}
icon.download-done {
width: 1.2em;
height: 1.2em;
font-size: 1.2em;
decorator: text("&#xf091;" 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
View File
@@ -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
View File
@@ -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
View File
@@ -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("&#xe5c8;" 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
View File
@@ -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("&#xe5cd;" 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%);
}
+80
View File
@@ -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
View File
@@ -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%);
}
+31 -17
View File
@@ -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
View File
@@ -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
View File
@@ -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("&#xe5cc;" 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("&#xe8b5;" center center);
}
icon.download {
decorator: text("&#xe2c4;" center center);
}
icon.celebration {
decorator: text("&#xea65;" center center);
}
@@ -418,73 +423,74 @@ icon.question-mark {
decorator: text("&#xeb8b;" 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("&#xe87b;" 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;
}
+2
View File
@@ -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 {
+4
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+13 -3
View File
@@ -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
View File
@@ -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 -34
View File
@@ -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()) {
+13
View File
@@ -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();
+3 -42
View File
@@ -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
+11 -14
View File
@@ -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;
+26
View File
@@ -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;
-31
View File
@@ -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) {
-31
View File
@@ -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) {
-29
View File
@@ -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;
}
-49
View File
@@ -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) {
+3 -3
View File
@@ -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);
+7 -44
View File
@@ -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
-31
View File
@@ -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);
-50
View File
@@ -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;
-31
View File
@@ -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) {
-59
View File
@@ -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);
+4 -4
View File
@@ -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);
-49
View File
@@ -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;
+3 -3
View File
@@ -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
}
-4
View File
@@ -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();
}
+7 -7
View File
@@ -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