From 1668edf45aeefc81cedf91342d751bdef41f17c5 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 11 Jun 2024 22:54:59 +1000 Subject: [PATCH] Terminal: Try to fix colours on mac, fix launcher and in-game windows overlapping each other --- misc/dreamcast/ViewportTransform.S | 14 +++--- src/Platform_Android.c | 23 ++-------- src/Platform_Posix.c | 9 ++-- src/Platform_Windows.c | 5 ++- src/Window_Terminal.c | 72 +++++++++++++++++------------- src/_PlatformBase.h | 31 +++++++++++++ src/_PlatformConsole.h | 25 +---------- src/interop_ios.m | 21 +-------- 8 files changed, 96 insertions(+), 104 deletions(-) diff --git a/misc/dreamcast/ViewportTransform.S b/misc/dreamcast/ViewportTransform.S index 81f2cf19a..ce4cc23d3 100644 --- a/misc/dreamcast/ViewportTransform.S +++ b/misc/dreamcast/ViewportTransform.S @@ -107,7 +107,7 @@ fmov.s fr3,@-r5 ! LS, dst->c = C fneg fr7 ! LS, W = -W fmov.s fr2,@-r5 ! LS, dst->v = V - fcmp/gt fr7,fr6 ! CO, T = Z > W (i.e. Z > -W) + fcmp/gt fr7,fr6 ! FE, T = Z > W (i.e. Z > -W) fmov.s fr1,@-r5 ! LS, dst->u = U movt r0 ! EX, CLIPFLAGS = T fmov.s fr6,@-r5 ! LS, dst->z = Z @@ -121,7 +121,7 @@ fmov.s fr3,@-r5 ! LS, dst->c = C fneg fr7 ! LS, W = -W fmov.s fr2,@-r5 ! LS, dst->v = V - fcmp/gt fr7,fr6 ! CO, T = Z > W (i.e. Z > -W) + fcmp/gt fr7,fr6 ! FE, T = Z > W (i.e. Z > -W) fmov.s fr1,@-r5 ! LS, dst->u = U movt r2 ! EX, tmp = T fmov.s fr6,@-r5 ! LS, dst->z = Z @@ -137,7 +137,7 @@ fmov.s fr3,@-r5 ! LS, dst->c = C fneg fr7 ! LS, W = -W fmov.s fr2,@-r5 ! LS, dst->v = V - fcmp/gt fr7,fr6 ! CO, T = Z > W (i.e. Z > -W) + fcmp/gt fr7,fr6 ! FE, T = Z > W (i.e. Z > -W) fmov.s fr1,@-r5 ! LS, dst->u = U movt r2 ! EX, tmp = T fmov.s fr6,@-r5 ! LS, dst->z = Z @@ -153,7 +153,7 @@ fmov.s fr3,@-r5 ! LS, dst->c = C fneg fr7 ! LS, W = -W fmov.s fr2,@-r5 ! LS, dst->v = V - fcmp/gt fr7,fr6 ! CO, T = Z > W (i.e. Z > -W) + fcmp/gt fr7,fr6 ! FE, T = Z > W (i.e. Z > -W) fmov.s fr1,@-r5 ! LS, dst->u = U movt r2 ! EX, tmp = T fmov.s fr6,@-r5 ! LS, dst->z = Z @@ -184,13 +184,13 @@ !fr10 = VIEWPORT_X_PLUS_HWIDTH !fr11 = VIEWPORT_Y_PLUS_HHEIGHT -.macro ViewportTransformSetup viewport_addr - mova \viewport_addr, r0 ! EX, r0 = &VIEWPORT +.macro ViewportTransformSetup vp_addr + mova \vp_addr, r0 ! EX, r0 = &VIEWPORT fmov.s @r0+,fr8 ! LS, fr8 = VIEWPORT_HWIDTH fmov.s @r0+,fr9 ! LS, fr9 = VIEWPORT_HHEIGHT fmov.s @r0+,fr10 ! LS, fr10 = VIEWPORT_X_PLUS_HWIDTH fmov.s @r0+,fr11 ! LS, fr11 = VIEWPORT_Y_PLUS_HHEIGHT - nop ! MT, align to even instructions + nop ! MT (align to even instructions boundary) .endm .macro ViewportTransformVertex diff --git a/src/Platform_Android.c b/src/Platform_Android.c index e09918dea..38a3c0934 100644 --- a/src/Platform_Android.c +++ b/src/Platform_Android.c @@ -27,16 +27,12 @@ void Platform_Log(const char* msg, int len) { /*########################################################################################################################* *-----------------------------------------------------Process/Module------------------------------------------------------* *#########################################################################################################################*/ -static char gameArgs[GAME_MAX_CMDARGS][STRING_SIZE]; -static int gameNumArgs; - cc_result Process_StartGame2(const cc_string* args, int numArgs) { - for (int i = 0; i < numArgs; i++) { - String_CopyToRawArray(gameArgs[i], &args[i]); - } + return SetGameArgs(args, numArgs); +} - gameNumArgs = numArgs; - return 0; +int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) { + return GetGameArgs(args); } cc_result Process_StartOpen(const cc_string* args) { @@ -102,17 +98,6 @@ void Directory_GetCachePath(cc_string* path) { /*########################################################################################################################* *-----------------------------------------------------Configuration-------------------------------------------------------* *#########################################################################################################################*/ -int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) { - int count = gameNumArgs; - for (int i = 0; i < count; i++) { - args[i] = String_FromRawArray(gameArgs[i]); - } - - // clear arguments so after game is closed, launcher is started - gameNumArgs = 0; - return count; -} - #include "Window.h" cc_result Platform_SetDefaultCurrentDirectory(int argc, char **argv) { cc_string dir; char dirBuffer[FILENAME_SIZE + 1]; diff --git a/src/Platform_Posix.c b/src/Platform_Posix.c index bef209141..48957b73e 100644 --- a/src/Platform_Posix.c +++ b/src/Platform_Posix.c @@ -756,13 +756,16 @@ cc_result Process_StartGame2(const cc_string* args, int numArgs) { char path[NATIVE_STR_LEN]; int i, j, len = 0; char* argv[15]; + cc_result res; + if (Platform_SingleProcess) return SetGameArgs(args, numArgs); - cc_result res = Process_RawGetExePath(path, &len); + res = Process_RawGetExePath(path, &len); if (res) return res; path[len] = '\0'; argv[0] = path; - for (i = 0, j = 1; i < numArgs; i++, j++) { + for (i = 0, j = 1; i < numArgs; i++, j++) + { String_EncodeUtf8(raw[i], &args[i]); argv[j] = raw[i]; } @@ -1490,7 +1493,7 @@ cc_result Platform_Decrypt(const void* data, int len, cc_string* dst) { int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) { int i, count; argc--; argv++; /* skip executable path argument */ - + if (Platform_SingleProcess) return GetGameArgs(args); #if defined CC_BUILD_MACOS /* Sometimes a "-psn_0_[number]" argument is added before actual args */ diff --git a/src/Platform_Windows.c b/src/Platform_Windows.c index 20c22e456..bc29e5a8a 100644 --- a/src/Platform_Windows.c +++ b/src/Platform_Windows.c @@ -707,6 +707,7 @@ cc_result Process_StartGame2(const cc_string* args, int numArgs) { cc_result res; int len, i; + if (Platform_SingleProcess) return SetGameArgs(args, numArgs); if ((res = Process_RawGetExePath(&path, &len))) return res; si.wide.cb = sizeof(STARTUPINFOW); @@ -1079,8 +1080,10 @@ int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* arg cc_string cmdArgs = String_FromReadonly(GetCommandLineA()); int i; Platform_NextArg(&cmdArgs); /* skip exe path */ + if (Platform_SingleProcess) return GetGameArgs(args); - for (i = 0; i < GAME_MAX_CMDARGS; i++) { + for (i = 0; i < GAME_MAX_CMDARGS; i++) + { args[i] = Platform_NextArg(&cmdArgs); if (!args[i].length) break; diff --git a/src/Window_Terminal.c b/src/Window_Terminal.c index 62567eaa5..4d8836e91 100644 --- a/src/Window_Terminal.c +++ b/src/Window_Terminal.c @@ -25,9 +25,6 @@ #include #include #endif -#ifdef CC_BUILD_MACOS -#define ONLY_256 -#endif /*########################################################################################################################* @@ -41,8 +38,18 @@ #define BOX_CHAR "\xE2\x96\x84" #endif -#define CHARS_PER_CELL 2 +#ifdef CC_BUILD_MACOS + // iTerm only displays trucolour properly with : + #define SEP_STR ":" + #define SEP_CHAR ':' +#else + #define SEP_STR ";" + #define SEP_CHAR ';' +#endif + static cc_bool pendingResize, pendingClose; +static int supportsTruecolor; +#define CHARS_PER_CELL 2 #define CSI "\x1B[" #define ERASE_CMD(cmd) CSI cmd "J" @@ -89,6 +96,7 @@ static void HookTerminal(void) { // https://stackoverflow.com/questions/37069599/cant-read-mouse-event-use-readconsoleinput-in-c SetConsoleMode(hStdin, ENABLE_EXTENDED_FLAGS | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_PROCESSED_INPUT); SetConsoleMode(hStdout, ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_PROCESSED_OUTPUT); + supportsTruecolor = true; } static void UnhookTerminal(void) { @@ -144,6 +152,8 @@ static void HookTerminal(void) { OutputConst(DEC_PM_SET("1015")); // Ps = 1 0 1 5 ⇒ Enable urxvt Mouse Mode. OutputConst(DEC_PM_SET("1006")); // Ps = 1 0 0 6 ⇒ Enable SGR Mouse Mode, xterm. OutputConst(DEC_PM_RESET("25")); // Ps = 2 5 ⇒ Show cursor (DECTCEM), VT220. + + supportsTruecolor = true; } static void UnhookTerminal(void) { @@ -212,8 +222,7 @@ static int MapNativeKey(DWORD vk_key) { return key; } -static void KeyEventProc(KEY_EVENT_RECORD ker) -{ +static void KeyEventProc(KEY_EVENT_RECORD ker) { int key = MapNativeKey(ker.wVirtualKeyCode); int uni = ker.uChar.UnicodeChar; @@ -394,6 +403,7 @@ void Window_Init(void) { HookTerminal(); UpdateDimensions(); HookSignals(); + Platform_SingleProcess = true; } void Window_Free(void) { @@ -582,31 +592,31 @@ void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) { // https://en.wikipedia.org/wiki/ANSI_escape_code#Colors str.length = 0; -#ifndef ONLY_256 - String_AppendConst(&str, CSI "48;2;"); - String_AppendInt( &str, BitmapCol_R(top)); - String_Append( &str, ';'); - String_AppendInt( &str, BitmapCol_G(top)); - String_Append( &str, ';'); - String_AppendInt( &str, BitmapCol_B(top)); - String_Append( &str, 'm'); - - String_AppendConst(&str, CSI "38;2;"); - String_AppendInt( &str, BitmapCol_R(bot)); - String_Append( &str, ';'); - String_AppendInt( &str, BitmapCol_G(bot)); - String_Append( &str, ';'); - String_AppendInt( &str, BitmapCol_B(bot)); - String_Append( &str, 'm'); -#else - String_AppendConst(&str, CSI "48;5;"); - String_AppendInt( &str, CalcIndex(top)); - String_Append( &str, 'm'); - - String_AppendConst(&str, CSI "38;5;"); - String_AppendInt( &str, CalcIndex(bot)); - String_Append( &str, 'm'); -#endif + if (supportsTruecolor) { + String_AppendConst(&str, CSI "48" SEP_STR "2" SEP_STR); + String_AppendInt( &str, BitmapCol_R(top)); + String_Append( &str, SEP_CHAR); + String_AppendInt( &str, BitmapCol_G(top)); + String_Append( &str, SEP_CHAR); + String_AppendInt( &str, BitmapCol_B(top)); + String_Append( &str, 'm'); + + String_AppendConst(&str, CSI "38" SEP_STR "2" SEP_STR); + String_AppendInt( &str, BitmapCol_R(bot)); + String_Append( &str, SEP_CHAR); + String_AppendInt( &str, BitmapCol_G(bot)); + String_Append( &str, SEP_CHAR); + String_AppendInt( &str, BitmapCol_B(bot)); + String_Append( &str, 'm'); + } else { + String_AppendConst(&str, CSI "48" SEP_STR "5" SEP_STR); + String_AppendInt( &str, CalcIndex(top)); + String_Append( &str, 'm'); + + String_AppendConst(&str, CSI "38" SEP_STR "5" SEP_STR); + String_AppendInt( &str, CalcIndex(bot)); + String_Append( &str, 'm'); + } String_AppendConst(&str, BOX_CHAR); OutputConsole(buf, str.length); diff --git a/src/_PlatformBase.h b/src/_PlatformBase.h index da1939b2b..0d22684f9 100644 --- a/src/_PlatformBase.h +++ b/src/_PlatformBase.h @@ -80,6 +80,37 @@ void Platform_LogConst(const char* message) { Platform_Log(message, String_Length(message)); } +/*########################################################################################################################* +*-----------------------------------------------------Process/Module------------------------------------------------------* +*#########################################################################################################################*/ +static char gameArgs[GAME_MAX_CMDARGS][STRING_SIZE]; +static int gameNumArgs; +static cc_bool gameHasArgs; + +static cc_result SetGameArgs(const cc_string* args, int numArgs) { + int i; + for (i = 0; i < numArgs; i++) + { + String_CopyToRawArray(gameArgs[i], &args[i]); + } + + gameHasArgs = true; + gameNumArgs = numArgs; + return 0; +} + +static int GetGameArgs(cc_string* args) { + int i, count = gameNumArgs; + for (i = 0; i < count; i++) + { + args[i] = String_FromRawArray(gameArgs[i]); + } + + /* clear arguments so after game is closed, launcher is started */ + gameNumArgs = 0; + return count; +} + /*########################################################################################################################* *----------------------------------------------------------Misc-----------------------------------------------------------* diff --git a/src/_PlatformConsole.h b/src/_PlatformConsole.h index 53e90003d..fcf2f92a8 100644 --- a/src/_PlatformConsole.h +++ b/src/_PlatformConsole.h @@ -36,32 +36,9 @@ void Directory_GetCachePath(cc_string* path) { } /*########################################################################################################################* *-----------------------------------------------------Process/Module------------------------------------------------------* *#########################################################################################################################*/ -static char gameArgs[GAME_MAX_CMDARGS][STRING_SIZE]; -static int gameNumArgs; -static cc_bool gameHasArgs; - cc_result Process_StartGame2(const cc_string* args, int numArgs) { - for (int i = 0; i < numArgs; i++) - { - String_CopyToRawArray(gameArgs[i], &args[i]); - } - Platform_LogConst("START CLASSICUBE"); - gameHasArgs = true; - gameNumArgs = numArgs; - return 0; -} - -static int GetGameArgs(cc_string* args) { - int count = gameNumArgs; - for (int i = 0; i < count; i++) - { - args[i] = String_FromRawArray(gameArgs[i]); - } - - // clear arguments so after game is closed, launcher is started - gameNumArgs = 0; - return count; + return SetGameArgs(args, numArgs); } int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) { diff --git a/src/interop_ios.m b/src/interop_ios.m index 473af70a2..472945d48 100644 --- a/src/interop_ios.m +++ b/src/interop_ios.m @@ -871,9 +871,6 @@ cc_result Updater_SetNewBuildTime(cc_uint64 t) { return ERR_NOT_SUPPORTED; } /*########################################################################################################################* *--------------------------------------------------------Platform--------------------------------------------------------* *#########################################################################################################################*/ -static char gameArgs[GAME_MAX_CMDARGS][STRING_SIZE]; -static int gameNumArgs; - cc_result Process_StartOpen(const cc_string* args) { // openURL - iOS 2.0 (deprecated) NSString* str = ToNSString(args); @@ -884,25 +881,11 @@ cc_result Process_StartOpen(const cc_string* args) { } cc_result Process_StartGame2(const cc_string* args, int numArgs) { - for (int i = 0; i < numArgs; i++) - { - String_CopyToRawArray(gameArgs[i], &args[i]); - } - - gameNumArgs = numArgs; - return 0; + return SetGameArgs(args, numArgs); } int Platform_GetCommandLineArgs(int argc, STRING_REF char** argv, cc_string* args) { - int count = gameNumArgs; - for (int i = 0; i < count; i++) - { - args[i] = String_FromRawArray(gameArgs[i]); - } - - // clear arguments so after game is closed, launcher is started - gameNumArgs = 0; - return count; + return GetGameArgs(args); } cc_result Platform_SetDefaultCurrentDirectory(int argc, char **argv) {