From e79cc1ea49e2d7eb8513d2c5003cfe3e0bfc4574 Mon Sep 17 00:00:00 2001 From: Llennpie <44985633+Llennpie@users.noreply.github.com> Date: Wed, 1 Dec 2021 22:20:08 -0500 Subject: [PATCH] Some QOL fixes/updates --- Makefile | 8 +-- actors/n64/model.inc.c | 16 +++--- levels/intro/leveldata.c | 16 +++--- levels/n64logo/model.inc.c | 16 +++--- src/.vscode/settings.json | 3 +- src/moon/imgui/imgui_impl.cpp | 61 ++++++++++++++++++++- src/moon/saturn/saturn.cpp | 24 ++++---- src/moon/ui/screens/addons/addons-view.cpp | 4 +- src/moon/ui/screens/addons/addons-view.h | 7 +++ src/pc/configfile.c | 8 +-- src/pc/controller/controller_keyboard.c | 6 ++ src/pc/controller/controller_keyboard.h | 1 + textures/logo/saturn-logo.jpg | Bin 0 -> 12901 bytes 13 files changed, 121 insertions(+), 49 deletions(-) create mode 100644 textures/logo/saturn-logo.jpg diff --git a/Makefile b/Makefile index d9133f81..16dacd33 100644 --- a/Makefile +++ b/Makefile @@ -416,10 +416,10 @@ ifeq ($(TARGET_SWITCH),1) CXX := $(CROSS)g++ STRIP := $(CROSS)strip NXARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE - APP_TITLE := Moon64 - [$(GIT_BRANCH)] - APP_AUTHOR := Nintendo, n64decomp team, UnderVolt team - APP_VERSION := $(GIT_HASH) - APP_ICON := $(CURDIR)/textures/logo/moon64-logo.jpg + APP_TITLE := Saturn: Moon Edition + APP_AUTHOR := Llennpie + APP_VERSION := $(GIT_BRANCH) $(GIT_HASH) + APP_ICON := $(CURDIR)/textures/logo/saturn-logo.jpg INCLUDE_CFLAGS += -I$(LIBNX)/include -I$(PORTLIBS)/include OPT_FLAGS := -O2 LIBDIRS := $(PORTLIBS) $(LIBNX) diff --git a/actors/n64/model.inc.c b/actors/n64/model.inc.c index 29f00ede..1a6583bf 100755 --- a/actors/n64/model.inc.c +++ b/actors/n64/model.inc.c @@ -1,18 +1,18 @@ Lights1 n64_N64_Green_lights = gdSPDefLights1( - 0x3, 0x49, 0x18, - 0x6, 0x93, 0x30, 0x28, 0x28, 0x28); + 0x7f, 0x7f, 0x7f, + 0xff, 0xff, 0xff, 0x28, 0x28, 0x28); Lights1 n64_N64_Blue_lights = gdSPDefLights1( - 0x0, 0xE, 0x54, - 0x1, 0x1D, 0xA9, 0x28, 0x28, 0x28); + 0x67, 0x67, 0x67, + 0xce, 0xce, 0xce, 0x28, 0x28, 0x28); Lights1 n64_N64_Red_lights = gdSPDefLights1( - 0x7F, 0xF, 0xA, - 0xFE, 0x1F, 0x15, 0x28, 0x28, 0x28); + 0x60, 0x7f, 0x66, + 0xc0, 0xff, 0xee, 0x28, 0x28, 0x28); Lights1 n64_N64_Yellow_lights = gdSPDefLights1( - 0x7F, 0x60, 0x0, - 0xFE, 0xC1, 0x0, 0x28, 0x28, 0x28); + 0x60, 0x60, 0x60, + 0xc0, 0xc0, 0xc0, 0x28, 0x28, 0x28); Vtx n64_N_Logo_mesh_vtx_0[56] = { {{{106, 1, -107},0, {486, 496},{0x0, 0x4E, 0x9B, 0xFF}}}, diff --git a/levels/intro/leveldata.c b/levels/intro/leveldata.c index 93471e2f..1485ae7d 100644 --- a/levels/intro/leveldata.c +++ b/levels/intro/leveldata.c @@ -3394,20 +3394,20 @@ const f32 intro_seg7_table_0700C880[] = { }; Lights1 n64logo_N64_Green_lights = gdSPDefLights1( - 0x3, 0x49, 0x18, - 0x6, 0x93, 0x30, 0x28, 0x28, 0x28); + 0x60, 0x7f, 0x66, + 0xc0, 0xff, 0xee, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Blue_lights = gdSPDefLights1( - 0x0, 0xE, 0x54, - 0x1, 0x1D, 0xA9, 0x28, 0x28, 0x28); + 0x67, 0x67, 0x67, + 0xce, 0xce, 0xce, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Red_lights = gdSPDefLights1( - 0x7F, 0xF, 0xA, - 0xFE, 0x1F, 0x15, 0x28, 0x28, 0x28); + 0x60, 0x7f, 0x66, + 0xc0, 0xff, 0xee, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Yellow_lights = gdSPDefLights1( - 0x7F, 0x60, 0x0, - 0xFE, 0xC1, 0x0, 0x28, 0x28, 0x28); + 0x60, 0x60, 0x60, + 0xc0, 0xc0, 0xc0, 0x28, 0x28, 0x28); Vtx n64logo_N64_mesh_vtx_0[56] = { {{{106, 1, -107},0, {486, 496},{0x0, 0x4E, 0x9B, 0xFF}}}, diff --git a/levels/n64logo/model.inc.c b/levels/n64logo/model.inc.c index 3ee26250..67622797 100755 --- a/levels/n64logo/model.inc.c +++ b/levels/n64logo/model.inc.c @@ -1,18 +1,18 @@ Lights1 n64logo_N64_Green_lights = gdSPDefLights1( - 0x3, 0x49, 0x18, - 0x6, 0x93, 0x30, 0x28, 0x28, 0x28); + 0x7f, 0x7f, 0x7f, + 0xff, 0xff, 0xff, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Blue_lights = gdSPDefLights1( - 0x0, 0xE, 0x54, - 0x1, 0x1D, 0xA9, 0x28, 0x28, 0x28); + 0x67, 0x67, 0x67, + 0xce, 0xce, 0xce, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Red_lights = gdSPDefLights1( - 0x7F, 0xF, 0xA, - 0xFE, 0x1F, 0x15, 0x28, 0x28, 0x28); + 0x60, 0x7f, 0x66, + 0xc0, 0xff, 0xee, 0x28, 0x28, 0x28); Lights1 n64logo_N64_Yellow_lights = gdSPDefLights1( - 0x7F, 0x60, 0x0, - 0xFE, 0xC1, 0x0, 0x28, 0x28, 0x28); + 0x60, 0x60, 0x60, + 0xc0, 0xc0, 0xc0, 0x28, 0x28, 0x28); Vtx n64logo_N64_mesh_vtx_0[56] = { {{{106, 1, -107},0, {486, 496},{0x0, 0x4E, 0x9B, 0xFF}}}, diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json index 7cdca651..b4426a9d 100644 --- a/src/.vscode/settings.json +++ b/src/.vscode/settings.json @@ -69,6 +69,7 @@ "concepts": "cpp", "ranges": "cpp", "surface_collision.h": "c", - "math_util.h": "c" + "math_util.h": "c", + "controller_keyboard.h": "c" } } \ No newline at end of file diff --git a/src/moon/imgui/imgui_impl.cpp b/src/moon/imgui/imgui_impl.cpp index 5b59f958..bd6adfa6 100644 --- a/src/moon/imgui/imgui_impl.cpp +++ b/src/moon/imgui/imgui_impl.cpp @@ -20,6 +20,8 @@ #include "icons/IconsForkAwesome.h" #include "icons/IconsMaterialDesign.h" #include "moon/utils/moon-env.h" +#include "pc/controller/controller_keyboard.h" +#include "moon/ui/screens/addons/addons-view.h" #include @@ -765,6 +767,8 @@ namespace MoonInternal { ImGui::Begin("Appearance", NULL, ImGuiWindowFlags_None); ImGui::InputText(".gs", bufname, IM_ARRAYSIZE(bufname)); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; if (ImGui::Button("Save to File")) { apply_cc_from_editor(); @@ -790,22 +794,46 @@ namespace MoonInternal { if (ImGui::BeginTabItem("CC Editor")) { ImGui::Text("Shirt/Cap"); ImGui::ColorEdit4("Hat Main", (float*)&uiHatColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Hat Shade", (float*)&uiHatShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Text("Overalls"); ImGui::ColorEdit4("Overalls Main", (float*)&uiOverallsColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Overalls Shade", (float*)&uiOverallsShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Text("Gloves"); ImGui::ColorEdit4("Gloves Main", (float*)&uiGlovesColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Gloves Shade", (float*)&uiGlovesShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Text("Shoes"); ImGui::ColorEdit4("Shoes Main", (float*)&uiShoesColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Shoes Shade", (float*)&uiShoesShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Text("Skin"); ImGui::ColorEdit4("Skin Main", (float*)&uiSkinColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Skin Shade", (float*)&uiSkinShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Text("Hair"); ImGui::ColorEdit4("Hair Main", (float*)&uiHairColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::ColorEdit4("Hair Shade", (float*)&uiHairShadeColor, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_NoLabel); + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::EndTabItem(); ImGui::Dummy(ImVec2(0, 5)); @@ -817,7 +845,8 @@ namespace MoonInternal { } if (ImGui::BeginTabItem("GameShark")) { ImGui::InputTextMultiline("###gameshark_box", cc_gameshark, IM_ARRAYSIZE(cc_gameshark), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 25), ImGuiInputTextFlags_CharsUppercase); - + if (ImGui::IsItemActivated()) accept_input = false; + if (ImGui::IsItemDeactivated()) accept_input = true; ImGui::Dummy(ImVec2(0, 5)); if (ImGui::Button("Paste GS Code")) { @@ -928,6 +957,36 @@ namespace MoonInternal { ImGui::Checkbox("Skip Intro", &configSkipIntro); ImGui::Checkbox("Enable Yoshi", &enable_yoshi); } + if (ImGui::CollapsingHeader("Addons")) { + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_None; + ImGui::BeginChild("addon_child", ImVec2(ImGui::GetWindowContentRegionWidth(), 130), false, window_flags); + for (int n = 0; n < texturePackList.size(); n++) + { + currentPack = texturePackList[n]; + ImGui::Selectable(currentPack->name.c_str()); + + if (ImGui::IsItemHovered()) { + ImGui::SetMouseCursor(2); + } + + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) + { + int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1); + if (n_next >= 0 && n_next < texturePackList.size()) + { + texturePackList[n] = texturePackList[n_next]; + texturePackList[n_next] = currentPack; + ImGui::ResetMouseDragDelta(); + } + } + } + ImGui::EndChild(); + } + if (ImGui::Button("Reload Addons")) { + rebuildTextureCache(); + } + } ImGui::End(); ImGui::PopStyleColor(); diff --git a/src/moon/saturn/saturn.cpp b/src/moon/saturn/saturn.cpp index c8255fdb..afc3d5d3 100644 --- a/src/moon/saturn/saturn.cpp +++ b/src/moon/saturn/saturn.cpp @@ -3,7 +3,10 @@ #include "moon/utils/moon-env.h" #include "moon/fs/moonfs.h" +#include "moon/ui/screens/addons/addons-view.h" +#include "moon/mod-engine/engine.h" #include "pc/configfile.h" +#include "pc/controller/controller_keyboard.h" #include "saturn_colors.h" #include "saturn_textures.h" @@ -82,6 +85,13 @@ namespace MoonInternal { saturn_load_stache_array(); saturn_load_button_array(); saturn_load_sideburn_array(); + + if(texturePackList.empty()){ + texturePackList.clear(); + copy(Moon::addons.begin(), Moon::addons.end(), back_inserter(texturePackList)); + reverse(texturePackList.begin(), texturePackList.end()); + } + currentPack = NULL; }}); Moon::registerHookListener({.hookName = WINDOW_API_HANDLE_EVENTS, .callback = [&](HookCall call){ @@ -89,15 +99,9 @@ namespace MoonInternal { switch (ev->type){ case SDL_KEYDOWN: if(ev->key.keysym.sym == SDLK_f){ - if (!show_menu_bar) + if (accept_input) freeze_camera(); } - if(ev->key.keysym.sym == SDLK_x){ - //cycle_eye_state(1); - } - if(ev->key.keysym.sym == SDLK_z){ - //cycle_eye_state(-1); - } if(ev->key.keysym.sym == SDLK_F1){ show_menu_bar = !show_menu_bar; } @@ -105,12 +109,6 @@ namespace MoonInternal { if (ev->cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_UP) { freeze_camera(); } - if (ev->cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT) { - //cycle_eye_state(1); - } - if (ev->cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT) { - //cycle_eye_state(-1); - } if(ev->cbutton.button == SDL_CONTROLLER_BUTTON_BACK){ show_menu_bar = !show_menu_bar; } diff --git a/src/moon/ui/screens/addons/addons-view.cpp b/src/moon/ui/screens/addons/addons-view.cpp index fbeaa920..fd6171e5 100644 --- a/src/moon/ui/screens/addons/addons-view.cpp +++ b/src/moon/ui/screens/addons/addons-view.cpp @@ -56,8 +56,8 @@ void rebuildTextureCache(){ } reverse(order.begin(), order.end()); MoonInternal::buildTextureCache(order); - MoonInternal::buildAudioCache(order); - MoonInternal::resetSoundSystem(); + //MoonInternal::buildAudioCache(order); + //MoonInternal::resetSoundSystem(); } void MoonAddonsScreen::changeScroll(int idx){ diff --git a/src/moon/ui/screens/addons/addons-view.h b/src/moon/ui/screens/addons/addons-view.h index 0e0e549a..5272e726 100644 --- a/src/moon/ui/screens/addons/addons-view.h +++ b/src/moon/ui/screens/addons/addons-view.h @@ -13,5 +13,12 @@ private: void changeScroll(int idx); }; +#include +#include "moon/mod-engine/interfaces/bit-module.h" + +extern BitModule* currentPack; +extern std::vector texturePackList; + +extern void rebuildTextureCache(); #endif \ No newline at end of file diff --git a/src/pc/configfile.c b/src/pc/configfile.c index d445f539..0f2bb859 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -56,11 +56,11 @@ ConfigWindow configWindow = { }; ImGuiConfig configImGui = { - .s_stats = false, + .s_stats = true, .texture_debug = false, - .s_toggles = false, - .s_machinima = false, - .s_appearance = false, + .s_toggles = true, + .s_machinima = true, + .s_appearance = true, .s_options = false, .jaboMode = false }; diff --git a/src/pc/controller/controller_keyboard.c b/src/pc/controller/controller_keyboard.c index da597328..5c23c98c 100644 --- a/src/pc/controller/controller_keyboard.c +++ b/src/pc/controller/controller_keyboard.c @@ -10,6 +10,8 @@ #include "../configfile.h" #include "controller_keyboard.h" +bool accept_input = true; + static int keyboard_buttons_down; #define MAX_KEYBINDS 64 @@ -29,6 +31,8 @@ static int keyboard_map_scancode(int scancode) { } bool keyboard_on_key_down(int scancode) { + if (!accept_input) return false; + int mapped = keyboard_map_scancode(scancode); keyboard_buttons_down |= mapped; keyboard_lastkey = scancode; @@ -36,6 +40,8 @@ bool keyboard_on_key_down(int scancode) { } bool keyboard_on_key_up(int scancode) { + if (!accept_input) return false; + int mapped = keyboard_map_scancode(scancode); keyboard_buttons_down &= ~mapped; if (keyboard_lastkey == (u32) scancode) diff --git a/src/pc/controller/controller_keyboard.h b/src/pc/controller/controller_keyboard.h index 028d2e85..d0e97e3a 100644 --- a/src/pc/controller/controller_keyboard.h +++ b/src/pc/controller/controller_keyboard.h @@ -16,6 +16,7 @@ void keyboard_on_all_keys_up(void); } #endif +extern bool accept_input; extern struct ControllerAPI controller_keyboard; #endif diff --git a/textures/logo/saturn-logo.jpg b/textures/logo/saturn-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56dca52a3f1f3ba436b0777e735c45949ffb5ad1 GIT binary patch literal 12901 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 OHvO40`rp^_M*j~C!NG|D literal 0 HcmV?d00001