#780 added mouse
This commit is contained in:
		@@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    		s32 mx = -1, my = -1;
 | 
				
			||||||
 | 
								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;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
				// 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;
 | 
					 | 
				
			||||||
		input->mouse.y = event->mouse_y >= 0 && event->mouse_y < 0xff ? event->mouse_y : 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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user