From 87d4d84107ceb11c1a7145f09fca2ddb6e64f883 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 17 Nov 2023 08:52:58 +1100 Subject: [PATCH] Nintendo 64 port somewhat works --- misc/n64/Makefile | 9 ++++++--- misc/n64/default.zip | Bin 0 -> 12022 bytes readme.md | 12 ++++++++++++ src/ClassiCube.vcxproj | 1 + src/ClassiCube.vcxproj.filters | 3 +++ src/Core.h | 2 +- src/Graphics_N64.c | 5 +++-- src/Platform_N64.c | 18 ++++++++++++------ src/TexturePack.c | 16 +++++++++++----- 9 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 misc/n64/default.zip diff --git a/misc/n64/Makefile b/misc/n64/Makefile index d1ebca610..598ca4304 100644 --- a/misc/n64/Makefile +++ b/misc/n64/Makefile @@ -5,14 +5,17 @@ SOURCE_DIR = src N64_ROM_TITLE = "ClassiCube" N64_ROM_RTC = true -include $(N64_INST)/include/n64.mk - CFILES := $(notdir $(wildcard src/*.c)) OFILES := $(CFILES:.c=.o) OBJS := $(addprefix $(BUILD_DIR)/,$(OFILES)) -CFLAGS := "-DNINTENDO64 -Wno-error=missing-braces" +CFLAGS := "-Wno-error=missing-braces -Wno-error=maybe-uninitialized" + +include $(N64_INST)/include/n64.mk ClassiCube-n64.z64: N64_ROM_TITLE = "ClassiCube" +ClassiCube-n64.z64: $(BUILD_DIR)/filesystem.dfs + +$(BUILD_DIR)/filesystem.dfs: misc/n64/default.zip $(BUILD_DIR)/ClassiCube-n64.elf: $(OBJS) diff --git a/misc/n64/default.zip b/misc/n64/default.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca55af9bab9611e4c3cf033a31b38f68a2678497 GIT binary patch literal 12022 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 z z&)-jO@2;+waX(R%xplvX2d01W9b-w=l(4k)w!tGdG>7&k6w;9fgm3BC2A`1^WCp>& zhd*K@GE_AEnjbP+-x}Mu`K*TH5E5O|L`Io!s3O2~&zVm- z#=;^VDBK`D98Tsw^V>+MI zY*dZm+-JLR?l-&IawJHC2&s zb@T!Gqp+c2Dw;-nW*PP5Gl^Vmf4d%P4eFZwuR+#EhxRV=Pgk24^1N^25+H@oFq7JBw2L04(;5K0}5HxToq~^0Cu-IWzs}SK!IEoWq+^UNJDP4T?so7$9F# zE^y*zRHlLA;nbSj}2d-h&!eLb_n)2tcDVu!A zgeZob!m=pVY{qNf*;^-kmCj#a?Wt^*-<#~1)ktmYvC>zP>zmeX=uxJD5z?si*`aFT zD*clc^z_tLLb$>@lFMmJugjLBM{D}qhZBuy@13!ZJvsBo#OM8Cm1q&CieDg|kxMn# zQ+_XeJ*GKZB5=ho44LUkK-XATD0)0%3(Md^K%4R|?g{_}P7d0^T(V^V*cW7q5*Q`)83W1@yyr8Zx7`X3&>M{ zHO+5-M&3HyZ2DJ3*8KG#@jAcA%{>pl*C=|s3-0;ICL1YipN&%-2=q{vEJwy?K;;9! z+W~*dl2%00*wHwjsY_hwt)?f)s^e12YIa19JIo`;9)w2T2z?t?|izFDpMr8 zV(_ia@ld!faQ`r3!KEMuYr%EV^xbzgZ=d_qx$STt8!%2JKvLy$oH|GlCl`H6V2xsH zJUQeI&ZnD<$p=gYkLr4%l(D{AR{u1N5NQ@rHx`HYWLLN6<1rDokRyS^MPMld`lZfZ zfx!--lhQJZW2@q;BJCWUhqBJ`+W|eejcihBIu4j}T`zmmE8;^!4%nPb^X}@*4o0fk zI<=T8r_Ew+esi4m`jf+C6?YWYEyCJqU|?dr-+s5@)DtiJv;VdZ{uH&1`TL95F#5%N zPdwEIG~l`C94l^k^8;(q88ZHWKl^6yfk#aSe@$HuE>eSXL0fV%7D#Mjn09(gEIu_= zAKP~#=wOU3|7Ub!nF1HeKyU!+eZDfEI(gwGJdok+q;A@a6(ZO){Z~axvI>2Aa4_Lz zKPXOtOWE4hKhhu3sK5v9NVbX%(xr4>0b+5mAx_t_bJC}_D;&-gJWv=XY@3qrzLH># zvh(=+piPpr_MQdJuQP-zXQM=4ml;=B%IGz*d-*1ukEA39?l>uJew-A83BeY&_0T_P zx8>u0$g6#FSfkwSXzDa`Zxf~MzB=>ZulwURo3+hKD-q0c$zTI&9g

IC^7YVz<*lgl#{tT9Z9OA3%?fYcCjD9*-Y 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 bS^uxr)gb4g4gmiL?lnK* literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 1315bc9a1..b731cb6f4 100644 --- a/readme.md +++ b/readme.md @@ -83,6 +83,7 @@ And also runs on: * PS Vita - unfinished, rendering issues (if you have a GitHub account, can [download from here](https://github.com/UnknownShadow200/ClassiCube/actions/workflows/build_vita.yml)) * Xbox - unfinished, major rendering issues (if you have a GitHub account, can [download from here](https://github.com/UnknownShadow200/ClassiCube/actions/workflows/build_xbox.yml)) * PS3 - unfinished, rendering issues +* Nintendo 64 - unfinished, major rendering issues # Compiling @@ -293,6 +294,14 @@ Run `make dreamcast`. You'll need [KallistiOS](https://github.com/KallistiOS/Kal The Dreamcast port needs assistance from someone experienced with Dreamcast homebrew development - if you're interested, please get in contact with me. (`unknownshadow200` on Discord) +#### Nintendo 64 + +Run `make n64`. You'll need the opengl branch of [libdragon](https://github.com/DragonMinded/libdragon/tree/opengl) + +The Nintendo 64 port needs assistance from someone experienced with Nintendo 64 homebrew development - if you're interested, please get in contact with me. (`unknownshadow200` on Discord) + +You'll also need to stub out `WorkerLoop` function in `Http_Worker.c` for now + ##### Other You'll have to write the necessary code. You should read portability.md in doc folder. @@ -347,6 +356,9 @@ Further information (e.g. style) for ClassiCube's source code can be found in th * [nxdk](https://github.com/XboxDev/nxdk) - Backend for Xbox * [xemu](https://github.com/xemu-project/xemu) - Emulator used to test Xbox port * [cxbx-reloaded](https://github.com/Cxbx-Reloaded/Cxbx-Reloaded) - Emulator used to test Xbox port +* [libdragon](https://github.com/DragonMinded/libdragon) - Backend for Nintendo 64 +* [cen64](https://github.com/n64dev/cen64) - Emulator used to test Nintendo 64 port +* [ares](https://github.com/ares-emulator/ares) - Emulator used to test Nintendo 64 port ## Sound Credits diff --git a/src/ClassiCube.vcxproj b/src/ClassiCube.vcxproj index d306ed5fb..c0ed83da6 100644 --- a/src/ClassiCube.vcxproj +++ b/src/ClassiCube.vcxproj @@ -475,6 +475,7 @@ + diff --git a/src/ClassiCube.vcxproj.filters b/src/ClassiCube.vcxproj.filters index 7434b907a..48c76b48e 100644 --- a/src/ClassiCube.vcxproj.filters +++ b/src/ClassiCube.vcxproj.filters @@ -686,6 +686,9 @@ Source Files\Window + + Source Files\Graphics + diff --git a/src/Core.h b/src/Core.h index 4193ca3f7..8cf07f44b 100644 --- a/src/Core.h +++ b/src/Core.h @@ -304,7 +304,7 @@ typedef cc_uint8 cc_bool; #define CC_BUILD_LOWMEM #define CC_BUILD_BEARSSL #undef CC_BUILD_FREETYPE -#elif defined NINTENDO64 +#elif defined N64 #define CC_BUILD_HTTPCLIENT #define CC_BUILD_OPENAL #define CC_BUILD_N64 diff --git a/src/Graphics_N64.c b/src/Graphics_N64.c index 4506a0cdd..14ab3ce99 100644 --- a/src/Graphics_N64.c +++ b/src/Graphics_N64.c @@ -127,6 +127,7 @@ static GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, cc_uint8 flags, cc_boo glGenTextures(1, &tex->textureID); glBindTexture(GL_TEXTURE_2D, tex->textureID); + // NOTE: Enabling these fixes textures, but seems to break on cen64 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -207,8 +208,8 @@ void Gfx_SetColWriteMask(cc_bool r, cc_bool g, cc_bool b, cc_bool a) { //glColorMask(r, g, b, a); TODO } -void Gfx_SetDepthWrite(cc_bool enabled) { } -void Gfx_SetDepthTest(cc_bool enabled) { } +void Gfx_SetDepthWrite(cc_bool enabled) { glDepthMask(enabled); } +void Gfx_SetDepthTest(cc_bool enabled) { gl_Toggle(GL_DEPTH_TEST); } static void Gfx_FreeState(void) { FreeDefaultResources(); } static void Gfx_RestoreState(void) { diff --git a/src/Platform_N64.c b/src/Platform_N64.c index 9ae45b1ac..f01585cfd 100644 --- a/src/Platform_N64.c +++ b/src/Platform_N64.c @@ -42,8 +42,8 @@ cc_uint64 Stopwatch_Measure(void) { } void Platform_Log(const char* msg, int len) { - write(STDOUT_FILENO, msg, len); - write(STDOUT_FILENO, "\n", 1); + write(STDERR_FILENO, msg, len); + write(STDERR_FILENO, "\n", 1); } #define UnixTime_TotalMS(time) ((cc_uint64)time.tv_sec * 1000 + UNIX_EPOCH + (time.tv_usec / 1000)) @@ -69,12 +69,17 @@ void DateTime_CurrentLocal(struct DateTime* t) { /*########################################################################################################################* *-----------------------------------------------------Directory/File------------------------------------------------------* *#########################################################################################################################*/ -static const cc_string root_path = String_FromConst(""); +static const cc_string root_path = String_FromConst("/"); static void GetNativePath(char* str, const cc_string* path) { + // TODO temp hack + cc_string path_ = *path; + int idx = String_IndexOf(path, '/'); + if (idx >= 0) path_ = String_UNSAFE_SubstringAt(&path_, idx + 1); + Mem_Copy(str, root_path.buffer, root_path.length); str += root_path.length; - String_EncodeUtf8(str, path); + String_EncodeUtf8(str, &path_); } cc_result Directory_Create(const cc_string* path) { @@ -93,11 +98,12 @@ static cc_result File_Do(cc_file* file, const cc_string* path) { char str[NATIVE_STR_LEN]; GetNativePath(str, path); - *file = -1; - return ReturnCode_FileNotFound; + //*file = -1; + //return ReturnCode_FileNotFound; // TODO: Why does trying this code break everything int ret = dfs_open(str); + Platform_Log2("Opened %c = %i", str, &ret); if (ret < 0) { *file = -1; return ret; } *file = ret; diff --git a/src/TexturePack.c b/src/TexturePack.c index 7925cdd97..f31329812 100644 --- a/src/TexturePack.c +++ b/src/TexturePack.c @@ -134,16 +134,16 @@ cc_bool Atlas_TryChange(struct Bitmap* atlas) { if (!Game_ValidateBitmapPow2(&terrain, atlas)) return false; tileSize = atlas->width / ATLAS2D_TILES_PER_ROW; - if (atlas->height < atlas->width) { - Chat_AddRaw("&cUnable to use terrain.png from the texture pack."); - Chat_AddRaw("&c Its height is less than its width."); - return false; - } if (tileSize <= 0) { Chat_AddRaw("&cUnable to use terrain.png from the texture pack."); Chat_AddRaw("&c It must be 16 or more pixels wide."); return false; } + if (atlas->height < tileSize) { + Chat_AddRaw("&cUnable to use terrain.png from the texture pack."); + Chat_AddRaw("&c It must have at least one row in it."); + return false; + } if (tileSize > Gfx.MaxTexWidth) { Chat_AddRaw("&cUnable to use terrain.png from the texture pack."); @@ -151,6 +151,12 @@ cc_bool Atlas_TryChange(struct Bitmap* atlas) { &tileSize, &tileSize, &Gfx.MaxTexWidth, &Gfx.MaxTexHeight); return false; } + + if (atlas->height < atlas->width) { + /* Probably wouldn't want to use these, but you still can technically */ + Chat_AddRaw("&cHeight of terrain.png is less than its width."); + Chat_AddRaw("&c Some tiles will therefore appear completely white."); + } if (atlas->width > Gfx.MaxTexWidth) { /* Super HD textures probably won't work great on this GPU */ Chat_AddRaw("&cYou may experience significantly reduced performance.");