From 4671a99f684aba5f7928c82863212035d829f21c Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 1 Apr 2024 08:42:36 +1100 Subject: [PATCH] PS1: More broken texture support --- src/Graphics_PS1.c | 76 +++++++++++++++++++++++++++++++++++++++------- src/SelectionBox.c | 6 ++++ src/Window_PS2.c | 1 + 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/src/Graphics_PS1.c b/src/Graphics_PS1.c index 8579dc584..286949f9c 100644 --- a/src/Graphics_PS1.c +++ b/src/Graphics_PS1.c @@ -82,12 +82,20 @@ static void* new_primitive(int size) { return (void*)prim; } +static GfxResourceID white_square; void Gfx_RestoreState(void) { InitDefaultResources(); + + // 2x2 dummy white texture + struct Bitmap bmp; + BitmapCol pixels[4] = { BITMAPCOLOR_WHITE, BITMAPCOLOR_WHITE, BITMAPCOLOR_WHITE, BITMAPCOLOR_WHITE }; + Bitmap_Init(bmp, 2, 2, pixels); + white_square = Gfx_CreateTexture(&bmp, 0, false); } void Gfx_FreeState(void) { - FreeDefaultResources(); + FreeDefaultResources(); + Gfx_DeleteTexture(&white_square); } void Gfx_Create(void) { @@ -173,12 +181,13 @@ typedef struct GPUTexture { cc_uint16 line, tpage; } GPUTexture; static GPUTexture textures[TEXTURES_MAX_COUNT]; +static GPUTexture* active_tex; #define BGRA8_to_PS1(src) \ ((src[2] & 0xF8) >> 3) | ((src[1] & 0xF8) << 2) | ((src[0] & 0xF8) << 7) | 0x8000 static void* AllocTextureAt(int i, struct Bitmap* bmp) { - cc_uint16* tmp = Mem_TryAlloc(2, bmp->width * bmp->height); + cc_uint16* tmp = Mem_TryAlloc(bmp->width * bmp->height, 2); if (!tmp) return NULL; for (int y = 0; y < bmp->height; y++) @@ -237,7 +246,8 @@ static GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, cc_uint8 flags, cc_boo } void Gfx_BindTexture(GfxResourceID texId) { - // TODO + if (!texId) texId = white_square; + active_tex = (GPUTexture*)texId; } void Gfx_DeleteTexture(GfxResourceID* texId) { @@ -520,10 +530,11 @@ static void Transform(Vec3* result, struct VertexTextured* a, const struct Matri } cc_bool VERTEX_LOGGING; -static void DrawQuads(int verticesCount, int startVertex) { +static void DrawColouredQuads(int verticesCount, int startVertex) { + return; for (int i = 0; i < verticesCount; i += 4) { - struct VertexTextured* v = (struct VertexTextured*)gfx_vertices + startVertex + i; + struct VertexColoured* v = (struct VertexColoured*)gfx_vertices + startVertex + i; POLY_F4* poly = new_primitive(sizeof(POLY_F4)); setPolyF4(poly); @@ -555,6 +566,43 @@ static void DrawQuads(int verticesCount, int startVertex) { } } +static void DrawTexturedQuads(int verticesCount, int startVertex) { + for (int i = 0; i < verticesCount; i += 4) + { + struct VertexTextured* v = (struct VertexTextured*)gfx_vertices + startVertex + i; + + POLY_FT4* poly = new_primitive(sizeof(POLY_FT4)); + setPolyFT4(poly); + poly->tpage = active_tex->tpage; + poly->clut = 0; + + Vec3 coords[4]; + Transform(&coords[0], &v[0], &mvp); + Transform(&coords[1], &v[1], &mvp); + Transform(&coords[2], &v[2], &mvp); + Transform(&coords[3], &v[3], &mvp); + + poly->x0 = coords[1].x; poly->y0 = coords[1].y; poly->u0 = (int)(v[1].U * active_tex->width) % active_tex->width; poly->v0 = (int)(v[1].V * active_tex->height) % active_tex->height + active_tex->line; + poly->x1 = coords[0].x; poly->y1 = coords[0].y; poly->u1 = (int)(v[0].U * active_tex->width) % active_tex->width; poly->v1 = (int)(v[0].V * active_tex->height) % active_tex->height + active_tex->line; + poly->x2 = coords[2].x; poly->y2 = coords[2].y; poly->u2 = (int)(v[2].U * active_tex->width) % active_tex->width; poly->v2 = (int)(v[2].V * active_tex->height) % active_tex->height + active_tex->line; + poly->x3 = coords[3].x; poly->y3 = coords[3].y; poly->u3 = (int)(v[3].U * active_tex->width) % active_tex->width; poly->v3 = (int)(v[3].V * active_tex->height) % active_tex->height + active_tex->line; + + int p = (coords[0].z + coords[1].z + coords[2].z + coords[3].z) / 4; + if (p < 0 || p >= OT_LENGTH) continue; + + int X = v[0].x, Y = v[0].y, Z = v[0].z; + //if (VERTEX_LOGGING) Platform_Log3("IN: %i, %i, %i", &X, &Y, &Z); + X = poly->x1; Y = poly->y1, Z = coords[0].z; + + poly->r0 = PackedCol_R(v->Col); + poly->g0 = PackedCol_G(v->Col); + poly->b0 = PackedCol_B(v->Col); + //if (VERTEX_LOGGING) Platform_Log4("OUT: %i, %i, %i (%i)", &X, &Y, &Z, &p); + + addPrim(&buffer->ot[p >> 2], poly); + } +} + /*static void DrawQuads(int verticesCount, int startVertex) { for (int i = 0; i < verticesCount; i += 4) { @@ -624,17 +672,23 @@ static void DrawQuads(int verticesCount, int startVertex) { }*/ void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { - if (gfx_format == VERTEX_FORMAT_COLOURED) return; - DrawQuads(verticesCount, startVertex); + if (gfx_format == VERTEX_FORMAT_TEXTURED) { + DrawTexturedQuads(verticesCount, startVertex); + } else { + DrawColouredQuads(verticesCount, startVertex); + } } void Gfx_DrawVb_IndexedTris(int verticesCount) { - if (gfx_format == VERTEX_FORMAT_COLOURED) return; - DrawQuads(verticesCount, 0); + if (gfx_format == VERTEX_FORMAT_TEXTURED) { + DrawTexturedQuads(verticesCount, 0); + } else { + DrawColouredQuads(verticesCount, 0); + } } void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { - DrawQuads(verticesCount, startVertex); + DrawTexturedQuads(verticesCount, startVertex); } @@ -646,7 +700,7 @@ cc_result Gfx_TakeScreenshot(struct Stream* output) { } cc_bool Gfx_WarnIfNecessary(void) { - return true; + return false; } void Gfx_BeginFrame(void) { diff --git a/src/SelectionBox.c b/src/SelectionBox.c index 4f06cc3de..9ee62dd16 100644 --- a/src/SelectionBox.c +++ b/src/SelectionBox.c @@ -6,6 +6,7 @@ #include "Game.h" #include "Camera.h" +#ifdef CC_BUILD_NETWORKING /* Data for a selection box. */ struct SelectionBox { Vec3 p0, p1; @@ -206,6 +207,11 @@ void Selections_Render(void) { Gfx_SetDepthWrite(true); Gfx_SetAlphaBlending(false); } +#else +static int selections_count; +void Selections_Render(void) { } +static void Selections_ContextLost(void* obj) { } +#endif /*########################################################################################################################* diff --git a/src/Window_PS2.c b/src/Window_PS2.c index d15d93d8d..c8bbb574e 100644 --- a/src/Window_PS2.c +++ b/src/Window_PS2.c @@ -118,6 +118,7 @@ static void HandleJoystick_Left(int x, int y) { Input.JoystickMovement = true; Input.JoystickAngle = Math_Atan2(x, -y); } + static void HandleJoystick_Right(int x, int y, double delta) { //Platform_Log2("Right: %i, %i", &x, &y); float scale = (delta * 60.0) / 16.0f;