From 522fc17f68aa7cc482203bcfa014893664231873 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 31 Jul 2023 21:57:44 +1000 Subject: [PATCH] 3DS: See if this helps with system freezes GameCube: Invert vertical joystick direction for bettera camera movement (Thanks GK6475) --- src/Graphics_3DS.c | 92 +++++++++++++++++++++++++++++++++++++++----- src/Window_GCWii.c | 4 +- src/_GraphicsBase.h | 4 +- src/interop_BeOS.cpp | 32 +++++++-------- 4 files changed, 104 insertions(+), 28 deletions(-) diff --git a/src/Graphics_3DS.c b/src/Graphics_3DS.c index 2909f24a4..5dca15948 100644 --- a/src/Graphics_3DS.c +++ b/src/Graphics_3DS.c @@ -14,6 +14,9 @@ extern const u32 _3DS_coloured_shbin_size; extern const u8 _3DS_textured_shbin[]; extern const u32 _3DS_textured_shbin_size; +extern const u8 _3DS_offset_shbin[]; +extern const u32 _3DS_offset_shbin_size; + #define DISPLAY_TRANSFER_FLAGS \ (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \ GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \ @@ -587,6 +590,8 @@ static void SetVertexBuffer(int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { SetVertexBuffer(startVertex); C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices); + // this doesn't work properly, because (index buffer + offset) must be aligned to 16 bytes + // C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices + startVertex); } void Gfx_DrawVb_IndexedTris(int verticesCount) { @@ -599,17 +604,86 @@ void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices); } - -// this doesn't work properly, because (index buffer + offset) must be aligned to 16 bytes -/*void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { - C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices + startVertex); +// TODO: Temp hack +void Gfx_Draw2DFlat(int x, int y, int width, int height, PackedCol color) { + struct VertexColoured v1, v2, v3, v4; + v1.X = (float)x; v1.Y = (float)y; + v2.X = (float)(x + width); v2.Y = (float)y; + v3.X = (float)(x + width); v3.Y = (float)(y + height); + v4.X = (float)x; v4.Y = (float)(y + height); + Gfx_SetVertexFormat(VERTEX_FORMAT_COLOURED); + + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(v1.X, v1.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v2.X, v2.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v3.X, v3.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v3.X, v3.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + + C3D_ImmSendAttrib(v4.X, v4.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + + C3D_ImmSendAttrib(v1.X, v1.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmDrawEnd(); } -void Gfx_DrawVb_IndexedTris(int verticesCount) { - C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices); +void Gfx_Draw2DGradient(int x, int y, int width, int height, PackedCol top, PackedCol bottom) { + struct VertexColoured v1, v2, v3, v4; + v1.X = (float)x; v1.Y = (float)y; + v2.X = (float)(x + width); v2.Y = (float)y; + v3.X = (float)(x + width); v3.Y = (float)(y + height); + v4.X = (float)x; v4.Y = (float)(y + height); + Gfx_SetVertexFormat(VERTEX_FORMAT_COLOURED); + + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(v1.X, v1.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(top), PackedCol_G(top), PackedCol_B(top), PackedCol_A(top)); + C3D_ImmSendAttrib(v2.X, v2.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(top), PackedCol_G(top), PackedCol_B(top), PackedCol_A(top)); + C3D_ImmSendAttrib(v3.X, v3.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(bottom), PackedCol_G(bottom), PackedCol_B(bottom), PackedCol_A(bottom)); + C3D_ImmSendAttrib(v3.X, v3.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(bottom), PackedCol_G(bottom), PackedCol_B(bottom), PackedCol_A(bottom)); + + C3D_ImmSendAttrib(v4.X, v4.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(bottom), PackedCol_G(bottom), PackedCol_B(bottom), PackedCol_A(bottom)); + + C3D_ImmSendAttrib(v1.X, v1.Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(top), PackedCol_G(top), PackedCol_B(top), PackedCol_A(top)); + C3D_ImmDrawEnd(); } -void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { - C3D_DrawElements(GPU_TRIANGLES, ICOUNT(verticesCount), C3D_UNSIGNED_SHORT, gfx_indices + startVertex); -}*/ +void Gfx_Draw2DTexture(const struct Texture* tex, PackedCol color) { + struct VertexTextured v[4]; + struct VertexTextured* ptr = v; + Gfx_Make2DQuad(tex, color, &ptr); + Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED); + + C3D_ImmDrawBegin(GPU_TRIANGLES); + C3D_ImmSendAttrib(v[0].X, v[0].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[0].U, v[0].V, 0.0f, 0.0f); + C3D_ImmSendAttrib(v[1].X, v[1].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[1].U, v[1].V, 0.0f, 0.0f); + C3D_ImmSendAttrib(v[2].X, v[2].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[2].U, v[2].V, 0.0f, 0.0f); + C3D_ImmSendAttrib(v[2].X, v[2].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[2].U, v[2].V, 0.0f, 0.0f); + + C3D_ImmSendAttrib(v[3].X, v[3].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[3].U, v[3].V, 0.0f, 0.0f); + + C3D_ImmSendAttrib(v[0].X, v[0].Y, 0.0f, 1.0f); + C3D_ImmSendAttrib(PackedCol_R(color), PackedCol_G(color), PackedCol_B(color), PackedCol_A(color)); + C3D_ImmSendAttrib(v[0].U, v[0].V, 0.0f, 0.0f); + C3D_ImmDrawEnd(); +} #endif \ No newline at end of file diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index 3d0129bbb..309581e86 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -106,7 +106,7 @@ static void ProcessPAD_Game(PADStatus* pad) { if (Math_AbsI(dx) <= 4) dx = 0; if (Math_AbsI(dy) <= 4) dy = 0; - Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 8.0f, dy / 8.0f); + Event_RaiseRawMove(&PointerEvents.RawMoved, dx / 8.0f, -dy / 8.0f); } Input_SetNonRepeatable(KeyBinds[KEYBIND_PLACE_BLOCK], mods & PAD_TRIGGER_L); @@ -463,4 +463,4 @@ cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) { cc_result Window_SaveFileDialog(const struct SaveFileDialogArgs* args) { return ERR_NOT_SUPPORTED; } -#endif +#endif \ No newline at end of file diff --git a/src/_GraphicsBase.h b/src/_GraphicsBase.h index 52f24372d..a39c26a05 100644 --- a/src/_GraphicsBase.h +++ b/src/_GraphicsBase.h @@ -147,6 +147,7 @@ void Gfx_UpdateDynamicVb_IndexedTris(GfxResourceID vb, void* vertices, int vCoun Gfx_DrawVb_IndexedTris(vCount); } +#ifndef CC_BUILD_3DS void Gfx_Draw2DFlat(int x, int y, int width, int height, PackedCol color) { struct VertexColoured verts[4]; struct VertexColoured* v = verts; @@ -180,6 +181,7 @@ void Gfx_Draw2DTexture(const struct Texture* tex, PackedCol color) { Gfx_SetVertexFormat(VERTEX_FORMAT_TEXTURED); Gfx_UpdateDynamicVb_IndexedTris(Gfx_texVb, texVerts, 4); } +#endif void Gfx_Make2DQuad(const struct Texture* tex, PackedCol color, struct VertexTextured** vertices) { float x1 = (float)tex->X, x2 = (float)(tex->X + tex->Width); @@ -363,4 +365,4 @@ struct IGameComponent Gfx_Component = { /* first component freed, even though it MUST be the last */ /* Instead, Game.c calls Gfx_Free after first freeing all */ /* the other game components. */ -}; +}; \ No newline at end of file diff --git a/src/interop_BeOS.cpp b/src/interop_BeOS.cpp index e44334338..00c8e7ceb 100644 --- a/src/interop_BeOS.cpp +++ b/src/interop_BeOS.cpp @@ -275,11 +275,11 @@ static void UpdateMouseButtons(int buttons) { // TODO move logic to UpdateMouseButton instead? if (changed & B_PRIMARY_MOUSE_BUTTON) - UpdateMouseButton(IPT_LMOUSE, buttons & B_PRIMARY_MOUSE_BUTTON); + UpdateMouseButton(CCMOUSE_L, buttons & B_PRIMARY_MOUSE_BUTTON); if (changed & B_SECONDARY_MOUSE_BUTTON) - UpdateMouseButton(IPT_RMOUSE, buttons & B_SECONDARY_MOUSE_BUTTON); + UpdateMouseButton(CCMOUSE_R, buttons & B_SECONDARY_MOUSE_BUTTON); if (changed & B_TERTIARY_MOUSE_BUTTON) - UpdateMouseButton(IPT_MMOUSE, buttons & B_TERTIARY_MOUSE_BUTTON); + UpdateMouseButton(CCMOUSE_M, buttons & B_TERTIARY_MOUSE_BUTTON); last_buttons = buttons; } @@ -516,20 +516,20 @@ void Window_Close(void) { } static const cc_uint8 key_map[] = { - /* 0x00 */ 0,IPT_ESCAPE,IPT_F1,IPT_F2, IPT_F3,IPT_F4,IPT_F5,IPT_F6, - /* 0x08 */ IPT_F7,IPT_F8,IPT_F9,IPT_F10, IPT_F11,IPT_F12,IPT_PRINTSCREEN,IPT_SCROLLLOCK, - /* 0x10 */ IPT_PAUSE,IPT_TILDE,'1','2', '3','4','5','6', - /* 0x18 */ '7','8','9','0', IPT_MINUS,IPT_EQUALS,IPT_BACKSPACE,IPT_INSERT, - /* 0x20 */ IPT_HOME,IPT_PAGEUP,IPT_NUMLOCK,IPT_KP_DIVIDE, IPT_KP_MULTIPLY,IPT_KP_MINUS,IPT_TAB,'Q', + /* 0x00 */ 0,CCKEY_ESCAPE,CCKEY_F1,CCKEY_F2, CCKEY_F3,CCKEY_F4,CCKEY_F5,CCKEY_F6, + /* 0x08 */ CCKEY_F7,CCKEY_F8,CCKEY_F9,CCKEY_F10, CCKEY_F11,CCKEY_F12,CCKEY_PRINTSCREEN,CCKEY_SCROLLLOCK, + /* 0x10 */ CCKEY_PAUSE,CCKEY_TILDE,'1','2', '3','4','5','6', + /* 0x18 */ '7','8','9','0', CCKEY_MINUS,CCKEY_EQUALS,CCKEY_BACKSPACE,CCKEY_INSERT, + /* 0x20 */ CCKEY_HOME,CCKEY_PAGEUP,CCKEY_NUMLOCK,CCKEY_KP_DIVIDE, CCKEY_KP_MULTIPLY,CCKEY_KP_MINUS,CCKEY_TAB,'Q', /* 0x28 */ 'W','E','R','T', 'Y','U','I','O', - /* 0x30 */ 'P',IPT_LBRACKET,IPT_RBRACKET,IPT_BACKSLASH, IPT_DELETE,IPT_END,IPT_PAGEDOWN,IPT_KP7, - /* 0x38 */ IPT_KP8,IPT_KP9,IPT_KP_PLUS,IPT_CAPSLOCK, 'A','S','D','F', - /* 0x40 */ 'G','H','J','K', 'L',IPT_SEMICOLON,IPT_QUOTE,IPT_ENTER, - /* 0x48 */ IPT_KP4,IPT_KP5,IPT_KP6,IPT_LSHIFT, 'Z','X','C','V', - /* 0x50 */ 'B','N','M',IPT_COMMA, IPT_PERIOD,IPT_SLASH,IPT_RSHIFT,IPT_UP, - /* 0x58 */ IPT_KP1,IPT_KP2,IPT_KP3,IPT_KP_ENTER, IPT_LCTRL,IPT_LALT,IPT_SPACE,IPT_RALT, - /* 0x60 */ IPT_RCTRL,IPT_LEFT,IPT_DOWN,IPT_RIGHT, IPT_KP0,IPT_KP_DECIMAL,IPT_LWIN,0, - /* 0x68 */ IPT_RWIN,0,0,0, 0,0,0,0, + /* 0x30 */ 'P',CCKEY_LBRACKET,CCKEY_RBRACKET,CCKEY_BACKSLASH, CCKEY_DELETE,CCKEY_END,CCKEY_PAGEDOWN,CCKEY_KP7, + /* 0x38 */ CCKEY_KP8,CCKEY_KP9,CCKEY_KP_PLUS,CCKEY_CAPSLOCK, 'A','S','D','F', + /* 0x40 */ 'G','H','J','K', 'L',CCKEY_SEMICOLON,CCKEY_QUOTE,CCKEY_ENTER, + /* 0x48 */ CCKEY_KP4,CCKEY_KP5,CCKEY_KP6,CCKEY_LSHIFT, 'Z','X','C','V', + /* 0x50 */ 'B','N','M',CCKEY_COMMA, CCKEY_PERIOD,CCKEY_SLASH,CCKEY_RSHIFT,CCKEY_UP, + /* 0x58 */ CCKEY_KP1,CCKEY_KP2,CCKEY_KP3,CCKEY_KP_ENTER, CCKEY_LCTRL,CCKEY_LALT,CCKEY_SPACE,CCKEY_RALT, + /* 0x60 */ CCKEY_RCTRL,CCKEY_LEFT,CCKEY_DOWN,CCKEY_RIGHT, CCKEY_KP0,CCKEY_KP_DECIMAL,CCKEY_LWIN,0, + /* 0x68 */ CCKEY_RWIN,0,0,0, 0,0,0,0, }; static int MapNativeKey(int raw) {