#780 added mouse
This commit is contained in:
parent
826a140cb8
commit
79cc5160a4
|
@ -496,7 +496,12 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS})
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(TIC80_SRC ${TIC80_SRC} build/windows/tic80.rc)
|
set(TIC80_SRC ${TIC80_SRC} build/windows/tic80.rc)
|
||||||
add_executable(${TIC80_OUTPUT} WIN32 ${TIC80_SRC})
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
else()
|
||||||
|
set(SYSTEM_TYPE WIN32)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(${TIC80_OUTPUT} ${SYSTEM_TYPE} ${TIC80_SRC})
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
add_executable(${TIC80_OUTPUT} MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns)
|
add_executable(${TIC80_OUTPUT} MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns)
|
||||||
set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES)
|
set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES)
|
||||||
|
@ -555,7 +560,12 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS})
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(TIC80_SRC ${TIC80_SRC} build/windows/tic80.rc)
|
set(TIC80_SRC ${TIC80_SRC} build/windows/tic80.rc)
|
||||||
add_executable(${TIC80_OUTPUT}-sokol WIN32 ${TIC80_SRC})
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
|
else()
|
||||||
|
set(SYSTEM_TYPE WIN32)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(${TIC80_OUTPUT}-sokol ${SYSTEM_TYPE} ${TIC80_SRC})
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
add_executable(${TIC80_OUTPUT}-sokol MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns)
|
add_executable(${TIC80_OUTPUT}-sokol MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns)
|
||||||
set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES)
|
set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES)
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
#include "ticapi.h"
|
#include "ticapi.h"
|
||||||
#include "ext/file_dialog.h"
|
#include "ext/file_dialog.h"
|
||||||
|
|
||||||
|
#define TIC80_OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2)
|
||||||
|
#define TIC80_OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
void (*setClipboardText)(const char* text);
|
void (*setClipboardText)(const char* text);
|
||||||
|
|
|
@ -14,8 +14,6 @@
|
||||||
|
|
||||||
#define STUDIO_PIXEL_FORMAT GPU_FORMAT_RGBA
|
#define STUDIO_PIXEL_FORMAT GPU_FORMAT_RGBA
|
||||||
#define TEXTURE_SIZE (TIC80_FULLWIDTH)
|
#define TEXTURE_SIZE (TIC80_FULLWIDTH)
|
||||||
#define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2)
|
|
||||||
#define OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2)
|
|
||||||
|
|
||||||
#define KBD_COLS 22
|
#define KBD_COLS 22
|
||||||
#define KBD_ROWS 17
|
#define KBD_ROWS 17
|
||||||
|
@ -345,7 +343,7 @@ static void calcTextureRect(SDL_Rect* rect)
|
||||||
|
|
||||||
rect->y = rect->w > rect->h
|
rect->y = rect->w > rect->h
|
||||||
? (rect->h - discreteHeight) / 2
|
? (rect->h - discreteHeight) / 2
|
||||||
: OFFSET_TOP*discreteWidth/Width;
|
: TIC80_OFFSET_TOP*discreteWidth/Width;
|
||||||
|
|
||||||
rect->w = discreteWidth;
|
rect->w = discreteWidth;
|
||||||
rect->h = discreteHeight;
|
rect->h = discreteHeight;
|
||||||
|
@ -381,8 +379,8 @@ static void processMouse()
|
||||||
s32 x = -1, y = -1;
|
s32 x = -1, y = -1;
|
||||||
if(crtMonitorEnabled())
|
if(crtMonitorEnabled())
|
||||||
{
|
{
|
||||||
if(rect.w) x = (mx - rect.x) * TIC80_FULLWIDTH / rect.w - OFFSET_LEFT;
|
if(rect.w) x = (mx - rect.x) * TIC80_FULLWIDTH / rect.w - TIC80_OFFSET_LEFT;
|
||||||
if(rect.h) y = (my - rect.y) * TIC80_FULLHEIGHT / rect.h - OFFSET_TOP;
|
if(rect.h) y = (my - rect.y) * TIC80_FULLHEIGHT / rect.h - TIC80_OFFSET_TOP;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -833,7 +831,7 @@ static void blitGpuTexture(GPU_Target* screen, GPU_Image* texture)
|
||||||
SDL_Rect rect = {0, 0, 0, 0};
|
SDL_Rect rect = {0, 0, 0, 0};
|
||||||
calcTextureRect(&rect);
|
calcTextureRect(&rect);
|
||||||
|
|
||||||
enum {Header = OFFSET_TOP, Top = OFFSET_TOP, Left = OFFSET_LEFT};
|
enum {Header = TIC80_OFFSET_TOP, Top = TIC80_OFFSET_TOP, Left = TIC80_OFFSET_LEFT};
|
||||||
|
|
||||||
s32 width = 0;
|
s32 width = 0;
|
||||||
SDL_GetWindowSize(platform.window, &width, NULL);
|
SDL_GetWindowSize(platform.window, &width, NULL);
|
||||||
|
@ -887,7 +885,7 @@ static void renderKeyboard()
|
||||||
SDL_Rect rect;
|
SDL_Rect rect;
|
||||||
SDL_GetWindowSize(platform.window, &rect.w, &rect.h);
|
SDL_GetWindowSize(platform.window, &rect.w, &rect.h);
|
||||||
|
|
||||||
GPU_Rect src = {OFFSET_LEFT, OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE};
|
GPU_Rect src = {TIC80_OFFSET_LEFT, TIC80_OFFSET_TOP, KBD_COLS*TIC_SPRITESIZE, KBD_ROWS*TIC_SPRITESIZE};
|
||||||
float scale = rect.w/src.w;
|
float scale = rect.w/src.w;
|
||||||
GPU_Rect dst = (GPU_Rect){0, rect.h - KBD_ROWS*TIC_SPRITESIZE*scale, scale, scale};
|
GPU_Rect dst = (GPU_Rect){0, rect.h - KBD_ROWS*TIC_SPRITESIZE*scale, scale, scale};
|
||||||
|
|
||||||
|
@ -911,11 +909,11 @@ static void renderKeyboard()
|
||||||
{
|
{
|
||||||
if(key == KbdLayout[k])
|
if(key == KbdLayout[k])
|
||||||
{
|
{
|
||||||
GPU_Rect src = {(k % Cols)*TIC_SPRITESIZE + OFFSET_LEFT, (k / Cols)*TIC_SPRITESIZE + OFFSET_TOP,
|
GPU_Rect src = {(k % Cols)*TIC_SPRITESIZE + TIC80_OFFSET_LEFT, (k / Cols)*TIC_SPRITESIZE + TIC80_OFFSET_TOP,
|
||||||
TIC_SPRITESIZE, TIC_SPRITESIZE};
|
TIC_SPRITESIZE, TIC_SPRITESIZE};
|
||||||
|
|
||||||
GPU_BlitScale(platform.keyboard.texture.down, &src, platform.gpu.screen,
|
GPU_BlitScale(platform.keyboard.texture.down, &src, platform.gpu.screen,
|
||||||
(src.x - OFFSET_LEFT) * dst.w, (src.y - OFFSET_TOP) * dst.h + dst.y, dst.w, dst.h);
|
(src.x - TIC80_OFFSET_LEFT) * dst.w, (src.y - TIC80_OFFSET_TOP) * dst.h + dst.y, dst.w, dst.h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,9 @@ static void app_frame(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tic->ram.input.gamepads.data = 0;
|
tic80_input* input = &tic->ram.input;
|
||||||
|
|
||||||
|
input->gamepads.data = 0;
|
||||||
handleKeyboard();
|
handleKeyboard();
|
||||||
platform.studio->tick();
|
platform.studio->tick();
|
||||||
|
|
||||||
|
@ -170,6 +172,8 @@ static void app_frame(void)
|
||||||
platform.audio.samples[i] = (float)tic->samples.buffer[i] / SHRT_MAX;
|
platform.audio.samples[i] = (float)tic->samples.buffer[i] / SHRT_MAX;
|
||||||
|
|
||||||
saudio_push(platform.audio.samples, count / 2);
|
saudio_push(platform.audio.samples, count / 2);
|
||||||
|
|
||||||
|
input->mouse.scrollx = input->mouse.scrolly = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handleKeydown(sapp_keycode keycode, bool down)
|
static void handleKeydown(sapp_keycode keycode, bool down)
|
||||||
|
@ -289,11 +293,11 @@ static void handleKeydown(sapp_keycode keycode, bool down)
|
||||||
[SAPP_KEYCODE_KP_ENTER] = tic_key_return,
|
[SAPP_KEYCODE_KP_ENTER] = tic_key_return,
|
||||||
[SAPP_KEYCODE_KP_EQUAL] = tic_key_equals,
|
[SAPP_KEYCODE_KP_EQUAL] = tic_key_equals,
|
||||||
[SAPP_KEYCODE_LEFT_SHIFT] = tic_key_shift,
|
[SAPP_KEYCODE_LEFT_SHIFT] = tic_key_shift,
|
||||||
[SAPP_KEYCODE_LEFT_CONTROL] = tic_key_unknown,
|
[SAPP_KEYCODE_LEFT_CONTROL] = tic_key_ctrl,
|
||||||
[SAPP_KEYCODE_LEFT_ALT] = tic_key_alt,
|
[SAPP_KEYCODE_LEFT_ALT] = tic_key_alt,
|
||||||
[SAPP_KEYCODE_LEFT_SUPER] = tic_key_unknown,
|
[SAPP_KEYCODE_LEFT_SUPER] = tic_key_unknown,
|
||||||
[SAPP_KEYCODE_RIGHT_SHIFT] = tic_key_shift,
|
[SAPP_KEYCODE_RIGHT_SHIFT] = tic_key_shift,
|
||||||
[SAPP_KEYCODE_RIGHT_CONTROL] = tic_key_unknown,
|
[SAPP_KEYCODE_RIGHT_CONTROL] = tic_key_ctrl,
|
||||||
[SAPP_KEYCODE_RIGHT_ALT] = tic_key_alt,
|
[SAPP_KEYCODE_RIGHT_ALT] = tic_key_alt,
|
||||||
[SAPP_KEYCODE_RIGHT_SUPER] = tic_key_unknown,
|
[SAPP_KEYCODE_RIGHT_SUPER] = tic_key_unknown,
|
||||||
[SAPP_KEYCODE_MENU] = tic_key_unknown,
|
[SAPP_KEYCODE_MENU] = tic_key_unknown,
|
||||||
|
@ -306,6 +310,18 @@ static void handleKeydown(sapp_keycode keycode, bool down)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void processMouse(sapp_mousebutton btn, s32 down)
|
||||||
|
{
|
||||||
|
tic80_input* input = &platform.studio->tic->ram.input;
|
||||||
|
|
||||||
|
switch(btn)
|
||||||
|
{
|
||||||
|
case SAPP_MOUSEBUTTON_LEFT: input->mouse.left = down; break;
|
||||||
|
case SAPP_MOUSEBUTTON_MIDDLE: input->mouse.middle = down; break;
|
||||||
|
case SAPP_MOUSEBUTTON_RIGHT: input->mouse.right = down; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void app_input(const sapp_event* event)
|
static void app_input(const sapp_event* event)
|
||||||
{
|
{
|
||||||
tic80_input* input = &platform.studio->tic->ram.input;
|
tic80_input* input = &platform.studio->tic->ram.input;
|
||||||
|
@ -319,19 +335,27 @@ static void app_input(const sapp_event* event)
|
||||||
handleKeydown(event->key_code, false);
|
handleKeydown(event->key_code, false);
|
||||||
break;
|
break;
|
||||||
case SAPP_EVENTTYPE_MOUSE_MOVE:
|
case SAPP_EVENTTYPE_MOUSE_MOVE:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
struct {s32 x, y, w, h;}rect;
|
||||||
}
|
sokol_calc_viewport(&rect.x, &rect.y, &rect.w, &rect.h);
|
||||||
// if(rect.w) x = (mx - rect.x) * TIC80_WIDTH / rect.w;
|
|
||||||
// if(rect.h) y = (my - rect.y) * TIC80_HEIGHT / rect.h;
|
|
||||||
|
|
||||||
input->mouse.x = event->mouse_x >= 0 && event->mouse_x < 0xff ? event->mouse_x : 0xff;
|
s32 mx = -1, my = -1;
|
||||||
input->mouse.y = event->mouse_y >= 0 && event->mouse_y < 0xff ? event->mouse_y : 0xff;
|
if(rect.w) mx = ((s32)event->mouse_x - rect.x) * TIC80_FULLWIDTH / rect.w - TIC80_OFFSET_LEFT;
|
||||||
|
if(rect.h) my = ((s32)event->mouse_y - rect.y) * TIC80_FULLHEIGHT / rect.h - TIC80_OFFSET_TOP;
|
||||||
|
|
||||||
|
input->mouse.x = mx >= 0 && mx < 0xff ? mx : 0xff;
|
||||||
|
input->mouse.y = my >= 0 && my < 0xff ? my : 0xff;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SAPP_EVENTTYPE_MOUSE_DOWN:
|
case SAPP_EVENTTYPE_MOUSE_DOWN:
|
||||||
|
processMouse(event->mouse_button, 1); break;
|
||||||
break;
|
break;
|
||||||
case SAPP_EVENTTYPE_MOUSE_UP:
|
case SAPP_EVENTTYPE_MOUSE_UP:
|
||||||
|
processMouse(event->mouse_button, 0); break;
|
||||||
|
break;
|
||||||
|
case SAPP_EVENTTYPE_MOUSE_SCROLL:
|
||||||
|
input->mouse.scrollx = event->scroll_x;
|
||||||
|
input->mouse.scrolly = event->scroll_y;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -7,5 +7,6 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void sokol_calc_viewport(int* x, int* y, int* w, int* h);
|
||||||
void sokol_gfx_init(int w, int h, int sx, int sy, bool integer_scale, bool portrait_top_align);
|
void sokol_gfx_init(int w, int h, int sx, int sy, bool integer_scale, bool portrait_top_align);
|
||||||
void sokol_gfx_draw(const uint32_t* ptr);
|
void sokol_gfx_draw(const uint32_t* ptr);
|
||||||
|
|
|
@ -198,7 +198,8 @@ static const sg_pass_action gfx_draw_pass_action = {
|
||||||
.colors[0] = { .action = SG_ACTION_CLEAR, .val = { 0.05f, 0.05f, 0.05f, 1.0f } }
|
.colors[0] = { .action = SG_ACTION_CLEAR, .val = { 0.05f, 0.05f, 0.05f, 1.0f } }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void apply_viewport(void) {
|
void sokol_calc_viewport(int* x, int* y, int* w, int* h)
|
||||||
|
{
|
||||||
int vp_x = 0, vp_y = 0, vp_w = sapp_width(), vp_h = sapp_height();
|
int vp_x = 0, vp_y = 0, vp_w = sapp_width(), vp_h = sapp_height();
|
||||||
|
|
||||||
if (vp_w * sokol_gfx.fb_height < vp_h * sokol_gfx.fb_width)
|
if (vp_w * sokol_gfx.fb_height < vp_h * sokol_gfx.fb_width)
|
||||||
|
@ -226,6 +227,18 @@ static void apply_viewport(void) {
|
||||||
vp_h = discreteHeight;
|
vp_h = discreteHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*x = vp_x;
|
||||||
|
*y = vp_y;
|
||||||
|
*w = vp_w;
|
||||||
|
*h = vp_h;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void apply_viewport(void) {
|
||||||
|
|
||||||
|
int vp_x, vp_y, vp_w, vp_h;
|
||||||
|
sokol_calc_viewport(&vp_x, &vp_y, &vp_w, &vp_h);
|
||||||
|
|
||||||
sg_apply_viewport(vp_x, vp_y, vp_w, vp_h, true);
|
sg_apply_viewport(vp_x, vp_y, vp_w, vp_h, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue