diff --git a/src/Graphics_Saturn.c b/src/Graphics_Saturn.c index 0924a7355..e91937d68 100644 --- a/src/Graphics_Saturn.c +++ b/src/Graphics_Saturn.c @@ -3,8 +3,6 @@ #include "_GraphicsBase.h" #include "Errors.h" #include "Window.h" -#include -#include #include #include @@ -22,9 +20,7 @@ #define PRIMITIVE_DRAW_MODE_GOURAUD_HALF_TRANS (7) #define PRIMITIVE_DRAW_MODE_COUNT (8) -#define PRIMITIVE_COLOR RGB1555(1, 31, 0, 31) - -#define CMDS_COUNT 400 +#define CMDS_COUNT 400 static PackedCol clear_color; static vdp1_cmdt_t cmdts_all[CMDS_COUNT]; @@ -36,14 +32,13 @@ static vdp1_cmdt_t* NextPrimitive(void) { return &cmdts_all[cmdts_count++]; } -static vdp1_cmdt_draw_mode_t _primitive_draw_mode = { +static const vdp1_cmdt_draw_mode_t color_draw_mode = { .raw = 0x0000 }; +static const vdp1_cmdt_draw_mode_t texture_draw_mode = { + .cc_mode = PRIMITIVE_DRAW_MODE_GOURAUD_SHADING +}; -static int16_vec2_t clear_points[4]; - - -// TODO: how to use VDP1 erase ?? static void UpdateVDP1Env(void) { vdp1_env_t env; vdp1_env_default_init(&env); @@ -56,19 +51,21 @@ static void UpdateVDP1Env(void) { vdp1_env_set(&env); } -// TODO: should be SCREEN_WIDTH/2 instead ? -static void _primitive_init(void) { - clear_points[0].x = 0; - clear_points[0].y = SCREEN_WIDTH - 1; - - clear_points[1].x = SCREEN_WIDTH - 1; - clear_points[1].y = SCREEN_HEIGHT - 1; - - clear_points[2].x = SCREEN_HEIGHT - 1; - clear_points[2].y = 0; - - clear_points[3].x = 0; - clear_points[3].y = 0; +static void CalcGouraudColours(void) { + for (int i = 0; i < 1024; i++) + { + // 1024 = 10 bits, divided into RRR GGGG BBB + int r_idx = (i & 0x007) >> 0, R = r_idx << (5 - 3); + int g_idx = (i & 0x078) >> 3, G = g_idx << (5 - 4); + int b_idx = (i & 0x380) >> 7, B = b_idx << (5 - 3); + rgb1555_t gouraud = RGB1555(1, R, G, B); + + vdp1_gouraud_table_t* cur = &_vdp1_vram_partitions.gouraud_base[i]; + cur->colors[0] = gouraud; + cur->colors[1] = gouraud; + cur->colors[2] = gouraud; + cur->colors[3] = gouraud; + } } static GfxResourceID white_square; @@ -96,7 +93,7 @@ void Gfx_Create(void) { vdp2_sprite_priority_set(0, 6); UpdateVDP1Env(); - _primitive_init(); + CalcGouraudColours(); } Gfx.MinTexWidth = 8; @@ -130,6 +127,7 @@ static GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 { cc_uint8* color = (cc_uint8*)&src[x]; dst[x] = BGRA8_to_SATURN(color); + dst[x] = 0xFEEE; } } @@ -335,7 +333,32 @@ static void Transform(Vec3* result, struct VertexTextured* a, const struct Matri result->z = (z/w) * 1024; } -#define IsPointCulled(vec) vec.x < -10000 || vec.x > 10000 || vec.y < -10000 || vec.y > 10000 || vec.z < 0 || vec.z > 1024 +#define IsPointCulled(vec) vec.x < -2048 || vec.x > 2048 || vec.y < -2048 || vec.y > 2048 || vec.z < 0 || vec.z > 1024 + +static void DrawColouredQuads2D(int verticesCount, int startVertex) { + for (int i = 0; i < verticesCount; i += 4) + { + struct VertexColoured* v = (struct VertexColoured*)gfx_vertices + startVertex + i; + + int16_vec2_t points[4]; + points[0].x = (int)v[0].x - SCREEN_WIDTH / 2; points[0].y = (int)v[0].y - SCREEN_HEIGHT / 2; + points[1].x = (int)v[1].x - SCREEN_WIDTH / 2; points[1].y = (int)v[1].y - SCREEN_HEIGHT / 2; + points[2].x = (int)v[2].x - SCREEN_WIDTH / 2; points[2].y = (int)v[2].y - SCREEN_HEIGHT / 2; + points[3].x = (int)v[3].x - SCREEN_WIDTH / 2; points[3].y = (int)v[3].y - SCREEN_HEIGHT / 2; + + int R = PackedCol_R(v->Col); + int G = PackedCol_G(v->Col); + int B = PackedCol_B(v->Col); + + vdp1_cmdt_t* cmd; + + cmd = NextPrimitive(); + vdp1_cmdt_polygon_set(cmd); + vdp1_cmdt_color_set(cmd, RGB1555(1, R >> 3, G >> 3, B >> 3)); + vdp1_cmdt_draw_mode_set(cmd, color_draw_mode); + vdp1_cmdt_vtx_set(cmd, points); + } +} static void DrawTexturedQuads2D(int verticesCount, int startVertex) { for (int i = 0; i < verticesCount; i += 4) @@ -357,7 +380,50 @@ static void DrawTexturedQuads2D(int verticesCount, int startVertex) { cmd = NextPrimitive(); vdp1_cmdt_polygon_set(cmd); vdp1_cmdt_color_set(cmd, RGB1555(1, R >> 3, G >> 3, B >> 3)); - vdp1_cmdt_draw_mode_set(cmd, _primitive_draw_mode); + vdp1_cmdt_draw_mode_set(cmd, color_draw_mode); + vdp1_cmdt_vtx_set(cmd, points); + + /*cmd = NextPrimitive(); + vdp1_cmdt_distorted_sprite_set(cmd); + vdp1_cmdt_char_size_set(cmd, 8, 8); + vdp1_cmdt_char_base_set(cmd, (vdp1_vram_t)_vdp1_vram_partitions.texture_base); + vdp1_cmdt_draw_mode_set(cmd, texture_draw_mode); + vdp1_cmdt_vtx_set(cmd, points);*/ + } +} + +static void DrawColouredQuads3D(int verticesCount, int startVertex) { + for (int i = 0; i < verticesCount; i += 4) + { + struct VertexColoured* v = (struct VertexColoured*)gfx_vertices + startVertex + i; + + 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); + + int16_vec2_t points[4]; + points[0].x = coords[0].x; points[0].y = coords[0].y; + points[1].x = coords[1].x; points[1].y = coords[1].y; + points[2].x = coords[2].x; points[2].y = coords[2].y; + points[3].x = coords[3].x; points[3].y = coords[3].y; + + if (IsPointCulled(coords[0])) continue; + if (IsPointCulled(coords[1])) continue; + if (IsPointCulled(coords[2])) continue; + if (IsPointCulled(coords[3])) continue; + + int R = PackedCol_R(v->Col); + int G = PackedCol_G(v->Col); + int B = PackedCol_B(v->Col); + + vdp1_cmdt_t* cmd; + + cmd = NextPrimitive(); + vdp1_cmdt_polygon_set(cmd); + vdp1_cmdt_color_set(cmd, RGB1555(1, R >> 3, G >> 3, B >> 3)); + vdp1_cmdt_draw_mode_set(cmd, color_draw_mode); vdp1_cmdt_vtx_set(cmd, points); } } @@ -393,25 +459,36 @@ static void DrawTexturedQuads3D(int verticesCount, int startVertex) { cmd = NextPrimitive(); vdp1_cmdt_polygon_set(cmd); vdp1_cmdt_color_set(cmd, RGB1555(1, R >> 3, G >> 3, B >> 3)); - vdp1_cmdt_draw_mode_set(cmd, _primitive_draw_mode); + vdp1_cmdt_draw_mode_set(cmd, color_draw_mode); vdp1_cmdt_vtx_set(cmd, points); + + /*cmd = NextPrimitive(); + vdp1_cmdt_distorted_sprite_set(cmd); + vdp1_cmdt_char_size_set(cmd, 8, 8); + vdp1_cmdt_char_base_set(cmd, (vdp1_vram_t)_vdp1_vram_partitions.texture_base); + vdp1_cmdt_draw_mode_set(cmd, texture_draw_mode); + vdp1_cmdt_vtx_set(cmd, points);*/ } } void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { - if (gfx_rendering2D && gfx_format == VERTEX_FORMAT_TEXTURED) { - DrawTexturedQuads2D(verticesCount, startVertex); - } else if (gfx_format == VERTEX_FORMAT_TEXTURED) { - DrawTexturedQuads3D(verticesCount, startVertex); + if (gfx_rendering2D) { + if (gfx_format == VERTEX_FORMAT_TEXTURED) { + DrawTexturedQuads2D(verticesCount, startVertex); + } else { + DrawColouredQuads2D(verticesCount, startVertex); + } + } else { + if (gfx_format == VERTEX_FORMAT_TEXTURED) { + DrawTexturedQuads3D(verticesCount, startVertex); + } else { + DrawColouredQuads3D(verticesCount, startVertex); + } } } void Gfx_DrawVb_IndexedTris(int verticesCount) { - if (gfx_rendering2D && gfx_format == VERTEX_FORMAT_TEXTURED) { - DrawTexturedQuads2D(verticesCount, 0); - } else if (gfx_format == VERTEX_FORMAT_TEXTURED) { - DrawTexturedQuads3D(verticesCount, 0); - } + Gfx_DrawVb_IndexedTris_Range(verticesCount, 0); } void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { @@ -446,16 +523,6 @@ void Gfx_BeginFrame(void) { cmd = NextPrimitive(); vdp1_cmdt_local_coord_set(cmd); vdp1_cmdt_vtx_local_coord_set(cmd, local_coord_center); - - int R = PackedCol_R(clear_color); - int G = PackedCol_G(clear_color); - int B = PackedCol_B(clear_color); - - cmd = NextPrimitive(); - vdp1_cmdt_polygon_set(cmd); - vdp1_cmdt_color_set(cmd, RGB1555(1, R >> 3, G >> 3, B >> 3)); // TODO VDP1 erase - vdp1_cmdt_draw_mode_set(cmd, _primitive_draw_mode); - vdp1_cmdt_vtx_set(cmd, clear_points); } void Gfx_EndFrame(void) { diff --git a/src/Window_Win.c b/src/Window_Win.c index be7a581b5..30da7696d 100644 --- a/src/Window_Win.c +++ b/src/Window_Win.c @@ -83,9 +83,13 @@ static const cc_uint8 key_map[] = { /* D8 */ 0, 0, 0, CCKEY_LBRACKET, CCKEY_BACKSLASH, CCKEY_RBRACKET, CCKEY_QUOTE, 0, }; -static int MapNativeKey(WPARAM key, LPARAM meta) { - LPARAM ext = meta & (1UL << 24); - switch (key) +static int MapNativeKey(WPARAM vk_key, LPARAM meta) { + LPARAM ext = meta & (1UL << 24); + LPARAM scancode = (meta >> 16) & 0xFF; + int key; + if (ext) scancode |= 0xE000; + + switch (vk_key) { case VK_CONTROL: return ext ? CCKEY_RCTRL : CCKEY_LCTRL; @@ -93,9 +97,11 @@ static int MapNativeKey(WPARAM key, LPARAM meta) { return ext ? CCKEY_RALT : CCKEY_LALT; case VK_RETURN: return ext ? CCKEY_KP_ENTER : CCKEY_ENTER; - default: - return key < Array_Elems(key_map) ? key_map[key] : 0; } + + key = vk_key < Array_Elems(key_map) ? key_map[vk_key] : 0; + if (!key) Platform_Log2("Unknown key: %x, %x", &vk_key, &scancode); + return key; } static void RefreshWindowBounds(void) { @@ -256,7 +262,6 @@ static LRESULT CALLBACK Window_Procedure(HWND handle, UINT message, WPARAM wPara } else { key = MapNativeKey(wParam, lParam); if (key) Input_Set(key, pressed); - else Platform_Log1("Unknown key: %x", &wParam); } return 0; } break; diff --git a/src/Window_X11.c b/src/Window_X11.c index ffd1d63aa..3a04cbf9d 100644 --- a/src/Window_X11.c +++ b/src/Window_X11.c @@ -183,21 +183,31 @@ static int MapNativeKey(KeySym key, unsigned int state) { case XK_KP_Page_Up: return CCKEY_KP9; case XK_KP_Delete: return CCKEY_KP_DECIMAL; case XK_KP_Enter: return CCKEY_KP_ENTER; + + case XK_ISO_Level3_Shift: return CCKEY_RALT; /* AltGr mode switch on some European keyboard layouts */ } return INPUT_NONE; } /* NOTE: This may not be entirely accurate, because user can configure keycode mappings */ static const cc_uint8 keycodeMap[136] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, CCKEY_ESCAPE, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', CCKEY_MINUS, CCKEY_EQUALS, CCKEY_BACKSPACE, CCKEY_TAB, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', CCKEY_LBRACKET, CCKEY_RBRACKET, CCKEY_ENTER, CCKEY_LCTRL, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', CCKEY_SEMICOLON, - CCKEY_QUOTE, CCKEY_TILDE, CCKEY_LSHIFT, CCKEY_BACKSLASH, 'Z', 'X', 'C', 'V', 'B', 'N', 'M', CCKEY_PERIOD, CCKEY_COMMA, CCKEY_SLASH, CCKEY_RSHIFT, CCKEY_KP_MULTIPLY, - CCKEY_LALT, CCKEY_SPACE, CCKEY_CAPSLOCK, CCKEY_F1, CCKEY_F2, CCKEY_F3, CCKEY_F4, CCKEY_F5, CCKEY_F6, CCKEY_F7, CCKEY_F8, CCKEY_F9, CCKEY_F10, CCKEY_NUMLOCK, CCKEY_SCROLLLOCK, CCKEY_KP7, - CCKEY_KP8, CCKEY_KP9, CCKEY_KP_MINUS, CCKEY_KP4, CCKEY_KP5, CCKEY_KP6, CCKEY_KP_PLUS, CCKEY_KP1, CCKEY_KP2, CCKEY_KP3, CCKEY_KP0, CCKEY_KP_DECIMAL, 0, 0, 0, CCKEY_F11, - CCKEY_F12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - CCKEY_RALT, CCKEY_RCTRL, CCKEY_HOME, CCKEY_UP, CCKEY_PAGEUP, CCKEY_LEFT, CCKEY_RIGHT, CCKEY_END, CCKEY_DOWN, CCKEY_PAGEDOWN, CCKEY_INSERT, CCKEY_DELETE, 0, 0, 0, 0, - 0, 0, 0, CCKEY_PAUSE, 0, 0, 0, 0, 0, CCKEY_LWIN, 0, CCKEY_RWIN +/* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* 08 */ 0, CCKEY_ESCAPE, '1', '2', '3', '4', '5', '6', +/* 10 */ '7', '8', '9', '0', CCKEY_MINUS, CCKEY_EQUALS, CCKEY_BACKSPACE, CCKEY_TAB, +/* 18 */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', +/* 20 */ 'O', 'P', CCKEY_LBRACKET, CCKEY_RBRACKET, CCKEY_ENTER, CCKEY_LCTRL, 'A', 'S', +/* 28 */ 'D', 'F', 'G', 'H', 'J', 'K', 'L', CCKEY_SEMICOLON, +/* 30 */ CCKEY_QUOTE, CCKEY_TILDE, CCKEY_LSHIFT, CCKEY_BACKSLASH, 'Z', 'X', 'C', 'V', +/* 38 */ 'B', 'N', 'M', CCKEY_PERIOD, CCKEY_COMMA, CCKEY_SLASH, CCKEY_RSHIFT, CCKEY_KP_MULTIPLY, +/* 40 */ CCKEY_LALT, CCKEY_SPACE, CCKEY_CAPSLOCK, CCKEY_F1, CCKEY_F2, CCKEY_F3, CCKEY_F4, CCKEY_F5, +/* 48 */ CCKEY_F6, CCKEY_F7, CCKEY_F8, CCKEY_F9, CCKEY_F10, CCKEY_NUMLOCK, CCKEY_SCROLLLOCK, CCKEY_KP7, +/* 50 */ CCKEY_KP8, CCKEY_KP9, CCKEY_KP_MINUS, CCKEY_KP4, CCKEY_KP5, CCKEY_KP6, CCKEY_KP_PLUS, CCKEY_KP1, +/* 58 */ CCKEY_KP2, CCKEY_KP3, CCKEY_KP0, CCKEY_KP_DECIMAL, 0, 0, 0, CCKEY_F11, +/* 60 */ CCKEY_F12, 0, 0, 0, 0, 0, 0, 0, +/* 68 */ 0, 0, 0, 0, CCKEY_RALT, CCKEY_RCTRL, CCKEY_HOME, CCKEY_UP, +/* 70 */ CCKEY_PAGEUP, CCKEY_LEFT, CCKEY_RIGHT, CCKEY_END, CCKEY_DOWN, CCKEY_PAGEDOWN, CCKEY_INSERT, CCKEY_DELETE, +/* 78 */ 0, 0, 0, 0, 0, 0, 0, CCKEY_PAUSE, +/* 80 */ 0, 0, 0, 0, 0, CCKEY_LWIN, 0, CCKEY_RWIN }; static int MapNativeKeycode(unsigned int keycode) {