Gamecube/Wii: Fix textures not being animated (sorta), fix see-through blocks being drawn opaquely, fix backfaces of blocks (e.g. leaves) not being culled, fix sockets not connecting

This commit is contained in:
UnknownShadow200 2023-06-10 12:23:09 +10:00
parent fd6301a840
commit e87b3fe1dc
3 changed files with 30 additions and 12 deletions

View File

@ -22,6 +22,12 @@ Copyright 2014-2022 ClassiCube | Licensed under BSD-3
#elif defined CC_BUILD_3DS #elif defined CC_BUILD_3DS
#define GAME_APP_NAME "ClassiCube 1.3.5 3DS" #define GAME_APP_NAME "ClassiCube 1.3.5 3DS"
#define GAME_APP_TITLE "ClassiCube 1.3.5 3DS" #define GAME_APP_TITLE "ClassiCube 1.3.5 3DS"
#elif defined CC_BUILD_PSP
#define GAME_APP_NAME "ClassiCube 1.3.5 PSP"
#define GAME_APP_TITLE "ClassiCube 1.3.5 PSP"
#elif defined CC_BUILD_GCWII
#define GAME_APP_NAME "ClassiCube 1.3.5 GC/Wii"
#define GAME_APP_TITLE "ClassiCube 1.3.5 GC/Wii"
#else #else
#define GAME_APP_NAME "ClassiCube 1.3.5" #define GAME_APP_NAME "ClassiCube 1.3.5"
#define GAME_APP_TITLE "ClassiCube 1.3.5" #define GAME_APP_TITLE "ClassiCube 1.3.5"

View File

@ -93,19 +93,23 @@ typedef struct CCTexture_ {
// GX RGBA8 textures // GX RGBA8 textures
// - store pixels in 4x4 tiles // - store pixels in 4x4 tiles
// - store all of the AR values of the tile's pixels, then store all of the GB values // - store all of the AR values of the tile's pixels, then store all of the GB values
static void ReorderPixels(cc_uint32* pixels, struct Bitmap* bmp, static void ReorderPixels(CCTexture* tex, struct Bitmap* bmp,
int originX, int originY, int rowWidth) { int originX, int originY, int rowWidth) {
int size = bmp->width * bmp->height * 4; int stride = GX_GetTexObjWidth(&tex->obj) * 4;
// TODO not really right
// TODO originX ignored
originX &= ~0x03;
originY &= ~0x03;
// http://hitmen.c02.at/files/yagcd/yagcd/chap15.html // http://hitmen.c02.at/files/yagcd/yagcd/chap15.html
// section 15.35 TPL (Texture Palette) // section 15.35 TPL (Texture Palette)
// "RGBA8 (4x4 tiles in two cache lines - first is AR and second is GB" // "RGBA8 (4x4 tiles in two cache lines - first is AR and second is GB"
uint8_t *src = (uint8_t*)bmp->scan0; uint8_t *src = (uint8_t*)bmp->scan0;
uint8_t *dst = (uint8_t*)pixels; uint8_t *dst = (uint8_t*)tex->pixels + stride * originY;
int srcWidth = bmp->width, srcHeight = bmp->height; int srcWidth = bmp->width, srcHeight = bmp->height;
for (int tileY = originY; tileY < originY + srcHeight; tileY += 4) for (int tileY = 0; tileY < srcHeight; tileY += 4)
for (int tileX = originX; tileX < originX + srcWidth; tileX += 4) for (int tileX = 0; tileX < srcWidth; tileX += 4)
{ {
for (int y = 0; y < 4; y++) { for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) { for (int x = 0; x < 4; x++) {
@ -140,7 +144,7 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, cc_uint8 flags, cc_bool mipm
GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE); GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE);
GX_InitTexObjFilterMode(&tex->obj, GX_NEAR, GX_NEAR); GX_InitTexObjFilterMode(&tex->obj, GX_NEAR, GX_NEAR);
ReorderPixels(tex->pixels, bmp, 0, 0, bmp->width); ReorderPixels(tex, bmp, 0, 0, bmp->width);
DCFlushRange(tex->pixels, size); DCFlushRange(tex->pixels, size);
return tex; return tex;
} }
@ -148,7 +152,7 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, cc_uint8 flags, cc_bool mipm
void Gfx_UpdateTexture(GfxResourceID texId, int x, int y, struct Bitmap* part, int rowWidth, cc_bool mipmaps) { void Gfx_UpdateTexture(GfxResourceID texId, int x, int y, struct Bitmap* part, int rowWidth, cc_bool mipmaps) {
CCTexture* tex = (CCTexture*)texId; CCTexture* tex = (CCTexture*)texId;
// TODO: wrong behaviour if x/y/part isn't multiple of 4 pixels // TODO: wrong behaviour if x/y/part isn't multiple of 4 pixels
//ReorderPixels(tex->pixels, part, x, y, rowWidth); ReorderPixels(tex, part, x, y, rowWidth);
GX_InvalidateTexAll(); GX_InvalidateTexAll();
} }
@ -179,6 +183,8 @@ void Gfx_BindTexture(GfxResourceID texId) {
static GXColor gfx_clearColor = { 0, 0, 0, 255 }; static GXColor gfx_clearColor = { 0, 0, 0, 255 };
void Gfx_SetFaceCulling(cc_bool enabled) { void Gfx_SetFaceCulling(cc_bool enabled) {
// NOTE: seems like ClassiCube's triangle ordering is opposite of what GX considers front facing
GX_SetCullMode(enabled ? GX_CULL_FRONT : GX_CULL_NONE);
} }
void Gfx_SetAlphaBlending(cc_bool enabled) { void Gfx_SetAlphaBlending(cc_bool enabled) {
@ -370,10 +376,16 @@ void Gfx_SetFogMode(FogFunc func) {
void Gfx_SetAlphaTest(cc_bool enabled) { void Gfx_SetAlphaTest(cc_bool enabled) {
if (enabled) { if (enabled) {
GX_SetAlphaCompare(GX_GREATER,127,GX_AOP_AND,GX_ALWAYS,0); GX_SetAlphaCompare(GX_GREATER, 127, GX_AOP_AND, GX_ALWAYS, 0);
} else { } else {
GX_SetAlphaCompare(GX_ALWAYS,0,GX_AOP_AND,GX_ALWAYS,0); GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
} }
// See explanation from libGX headers
// Normally, Z buffering should happen before texturing, as this enables better performance by not texturing pixels that are not visible;
// however, when alpha compare is used, Z buffering must be done after texturing
// Parameter[0] = Enables Z-buffering before texturing when set to GX_TRUE; otherwise, Z-buffering takes place after texturing.
GX_SetZCompLoc(!enabled);
} }
void Gfx_DepthOnlyRendering(cc_bool depthOnly) { void Gfx_DepthOnlyRendering(cc_bool depthOnly) {

View File

@ -416,7 +416,7 @@ cc_result Socket_Connect(cc_socket* s, const cc_string* address, int port, cc_bo
*s = -1; *s = -1;
if (!ParseAddress(&addr, address)) return ERR_INVALID_ARGUMENT; if (!ParseAddress(&addr, address)) return ERR_INVALID_ARGUMENT;
*s = net_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); *s = net_socket(AF_INET, SOCK_STREAM, 0);
if (*s < 0) return *s; if (*s < 0) return *s;
if (nonblocking) { if (nonblocking) {
@ -506,10 +506,10 @@ static void InitSockets(void) {
#else #else
// https://github.com/devkitPro/wii-examples/blob/master/devices/network/sockettest/source/sockettest.c // https://github.com/devkitPro/wii-examples/blob/master/devices/network/sockettest/source/sockettest.c
char localip[16] = {0}; char localip[16] = {0};
char gateway[16] = {0};
char netmask[16] = {0}; char netmask[16] = {0};
char gateway[16] = {0};
int ret = if_config(localip, gateway, netmask, TRUE, 20); int ret = if_config(localip, netmask, gateway, TRUE, 20);
if (ret >= 0) { if (ret >= 0) {
Platform_Log3("Network ip: %c, gw: %c, mask %c", localip, gateway, netmask); Platform_Log3("Network ip: %c, gw: %c, mask %c", localip, gateway, netmask);
} else { } else {