fixed icon, gamepad, mouse cursor
This commit is contained in:
		| @@ -1,19 +0,0 @@ | |||||||
| SHADER(#version 100\n |  | ||||||
|  |  | ||||||
| precision highp float; |  | ||||||
| precision mediump int; |  | ||||||
|  |  | ||||||
| attribute vec2 gpu_Vertex; |  | ||||||
| attribute vec2 gpu_TexCoord; |  | ||||||
| attribute mediump vec4 gpu_Color; |  | ||||||
| uniform mat4 gpu_ModelViewProjectionMatrix; |  | ||||||
|  |  | ||||||
| varying mediump vec4 color; |  | ||||||
| varying vec2 texCoord; |  | ||||||
|  |  | ||||||
| void main(void) |  | ||||||
| { |  | ||||||
| 	color = gpu_Color; |  | ||||||
| 	texCoord = vec2(gpu_TexCoord); |  | ||||||
| 	gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0); |  | ||||||
| }) |  | ||||||
							
								
								
									
										405
									
								
								src/system.c
									
									
									
									
									
								
							
							
						
						
									
										405
									
								
								src/system.c
									
									
									
									
									
								
							| @@ -13,7 +13,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define STUDIO_UI_SCALE 4 | #define STUDIO_UI_SCALE 4 | ||||||
| #define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 | #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_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2) | ||||||
| #define OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2) | #define OFFSET_TOP ((TIC80_FULLHEIGHT-TIC80_HEIGHT)/2) | ||||||
| @@ -28,7 +28,8 @@ static struct | |||||||
| 	{ | 	{ | ||||||
| 		GPU_Target* screen; | 		GPU_Target* screen; | ||||||
| 		GPU_Image* texture; | 		GPU_Image* texture; | ||||||
| 		u32 crt_shader; | 		u32 shader; | ||||||
|  | 		GPU_ShaderBlock block; | ||||||
| 		bool useShader; | 		bool useShader; | ||||||
| 	} gpu; | 	} gpu; | ||||||
|  |  | ||||||
| @@ -123,7 +124,7 @@ static void setWindowIcon() | |||||||
|  |  | ||||||
| 	SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(pixels, Size, Size, | 	SDL_Surface* surface = SDL_CreateRGBSurfaceFrom(pixels, Size, Size, | ||||||
| 		sizeof(s32) * BITS_IN_BYTE, Size * sizeof(s32), | 		sizeof(s32) * BITS_IN_BYTE, Size * sizeof(s32), | ||||||
| 		0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); | 		0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); | ||||||
|  |  | ||||||
| 	SDL_SetWindowIcon(platform.window, surface); | 	SDL_SetWindowIcon(platform.window, surface); | ||||||
| 	SDL_FreeSurface(surface); | 	SDL_FreeSurface(surface); | ||||||
| @@ -158,56 +159,53 @@ static void updateGamepadParts() | |||||||
| 	platform.gamepad.part.y = (SDL_Point){rect.w - 2*tileSize, 0*tileSize + offset}; | 	platform.gamepad.part.y = (SDL_Point){rect.w - 2*tileSize, 0*tileSize + offset}; | ||||||
| } | } | ||||||
|  |  | ||||||
| // static void transparentBlit(u32* out, s32 pitch) |  | ||||||
| // { |  | ||||||
| // 	const u8* in = platform.studio->tic->ram.vram.screen.data; |  | ||||||
| // 	const u8* end = in + sizeof(platform.studio->tic->ram.vram.screen); |  | ||||||
| // 	const u32* pal = tic_palette_blit(&platform.studio->tic->config.palette); |  | ||||||
| // 	const u32 Delta = (pitch/sizeof *out - TIC80_WIDTH); |  | ||||||
|  |  | ||||||
| // 	s32 col = 0; |  | ||||||
|  |  | ||||||
| // 	while(in != end) |  | ||||||
| // 	{ |  | ||||||
| // 		u8 low = *in & 0x0f; |  | ||||||
| // 		u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; |  | ||||||
| // 		*out++ = low ? (*(pal + low) | 0xff000000) : 0; |  | ||||||
| // 		*out++ = hi ? (*(pal + hi) | 0xff000000) : 0; |  | ||||||
| // 		in++; |  | ||||||
|  |  | ||||||
| // 		col += BITS_IN_BYTE / TIC_PALETTE_BPP; |  | ||||||
|  |  | ||||||
| // 		if (col == TIC80_WIDTH) |  | ||||||
| // 		{ |  | ||||||
| // 			col = 0; |  | ||||||
| // 			out += Delta; |  | ||||||
| // 		} |  | ||||||
| // 	} |  | ||||||
| // } |  | ||||||
|  |  | ||||||
| static void initTouchGamepad() | static void initTouchGamepad() | ||||||
| { | { | ||||||
| 	if (!platform.gpu.screen) | 	platform.studio->tic->api.map(platform.studio->tic, &platform.studio->tic->config.bank0.map, &platform.studio->tic->config.bank0.tiles, 0, 0, TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, -1, 1); | ||||||
| 		return; |  | ||||||
|  |  | ||||||
| 	// platform.studio->tic->api.map(platform.studio->tic, &platform.studio->tic->config.bank0.map, &platform.studio->tic->config.bank0.tiles, 0, 0, TIC_MAP_SCREEN_WIDTH, TIC_MAP_SCREEN_HEIGHT, 0, 0, -1, 1); | 	if(!platform.gamepad.texture) | ||||||
|  | 	{		 | ||||||
|  | 		platform.gamepad.texture = GPU_CreateImage(TEXTURE_SIZE, TEXTURE_SIZE, STUDIO_PIXEL_FORMAT); | ||||||
|  | 		GPU_SetAnchor(platform.gamepad.texture, 0, 0); | ||||||
|  | 		GPU_SetImageFilter(platform.gamepad.texture, GPU_FILTER_NEAREST); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// if(!platform.gamepad.texture) | 	u32* data = SDL_malloc(TEXTURE_SIZE * TEXTURE_SIZE * sizeof(u32)); | ||||||
| 	// { |  | ||||||
| 	// 	platform.gamepad.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TEXTURE_SIZE, TEXTURE_SIZE); |  | ||||||
| 	// 	SDL_SetTextureBlendMode(platform.gamepad.texture, SDL_BLENDMODE_BLEND); |  | ||||||
| 	// } |  | ||||||
|  |  | ||||||
| 	// { | 	if(data) | ||||||
| 	// 	void* pixels = NULL; | 	{ | ||||||
| 	// 	s32 pitch = 0; | 		u32* out = data; | ||||||
|  |  | ||||||
| 	// 	SDL_LockTexture(platform.gamepad.texture, NULL, &pixels, &pitch); | 		const u8* in = platform.studio->tic->ram.vram.screen.data; | ||||||
| 	// 	transparentBlit(pixels, pitch); | 		const u8* end = in + sizeof(platform.studio->tic->ram.vram.screen); | ||||||
| 	// 	SDL_UnlockTexture(platform.gamepad.texture); | 		const u32* pal = tic_palette_blit(&platform.studio->tic->config.palette); | ||||||
| 	// } | 		const u32 Delta = ((TIC80_FULLWIDTH*sizeof(u32))/sizeof *out - TIC80_WIDTH); | ||||||
|  |  | ||||||
| 	// updateGamepadParts(); | 		s32 col = 0; | ||||||
|  |  | ||||||
|  | 		while(in != end) | ||||||
|  | 		{ | ||||||
|  | 			u8 low = *in & 0x0f; | ||||||
|  | 			u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; | ||||||
|  | 			*out++ = low ? *(pal + low) : 0; | ||||||
|  | 			*out++ = hi ? *(pal + hi) : 0; | ||||||
|  | 			in++; | ||||||
|  |  | ||||||
|  | 			col += BITS_IN_BYTE / TIC_PALETTE_BPP; | ||||||
|  |  | ||||||
|  | 			if (col == TIC80_WIDTH) | ||||||
|  | 			{ | ||||||
|  | 				col = 0; | ||||||
|  | 				out += Delta; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		GPU_UpdateImageBytes(platform.gamepad.texture, NULL, (const u8*)data, TEXTURE_SIZE * sizeof(u32)); | ||||||
|  |  | ||||||
|  | 		SDL_free(data); | ||||||
|  |  | ||||||
|  | 		updateGamepadParts(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| static void calcTextureRect(SDL_Rect* rect) | static void calcTextureRect(SDL_Rect* rect) | ||||||
| @@ -321,49 +319,49 @@ static void processKeyboard() | |||||||
|  |  | ||||||
| static bool checkTouch(const SDL_Rect* rect, s32* x, s32* y) | static bool checkTouch(const SDL_Rect* rect, s32* x, s32* y) | ||||||
| { | { | ||||||
| 	// s32 devices = SDL_GetNumTouchDevices(); | 	s32 devices = SDL_GetNumTouchDevices(); | ||||||
| 	// s32 width = 0, height = 0; | 	s32 width = 0, height = 0; | ||||||
| 	// SDL_GetWindowSize(platform.window, &width, &height); | 	SDL_GetWindowSize(platform.window, &width, &height); | ||||||
|  |  | ||||||
| 	// for (s32 i = 0; i < devices; i++) | 	for (s32 i = 0; i < devices; i++) | ||||||
| 	// { | 	{ | ||||||
| 	// 	SDL_TouchID id = SDL_GetTouchDevice(i); | 		SDL_TouchID id = SDL_GetTouchDevice(i); | ||||||
|  |  | ||||||
| 	// 	// very strange, but on Android id always == 0 | 		// very strange, but on Android id always == 0 | ||||||
| 	// 	//if (id) | 		//if (id) | ||||||
| 	// 	{ | 		{ | ||||||
| 	// 		s32 fingers = SDL_GetNumTouchFingers(id); | 			s32 fingers = SDL_GetNumTouchFingers(id); | ||||||
|  |  | ||||||
| 	// 		if(fingers) | 			if(fingers) | ||||||
| 	// 		{ | 			{ | ||||||
| 	// 			platform.gamepad.counter = 0; | 				platform.gamepad.counter = 0; | ||||||
|  |  | ||||||
| 	// 			if (!platform.gamepad.show) | 				if (!platform.gamepad.show) | ||||||
| 	// 			{ | 				{ | ||||||
| 	// 				platform.gamepad.alpha = platform.studio->config()->theme.gamepad.touch.alpha; | 					platform.gamepad.alpha = platform.studio->config()->theme.gamepad.touch.alpha; | ||||||
| 	// 				SDL_SetTextureAlphaMod(platform.gamepad.texture, platform.gamepad.alpha); | 					GPU_SetRGBA(platform.gamepad.texture, 0xff, 0xff, 0xff, platform.gamepad.alpha); | ||||||
| 	// 				platform.gamepad.show = true; | 					platform.gamepad.show = true; | ||||||
| 	// 				return false; | 					return false; | ||||||
| 	// 			} | 				} | ||||||
| 	// 		} | 			} | ||||||
|  |  | ||||||
| 	// 		for (s32 f = 0; f < fingers; f++) | 			for (s32 f = 0; f < fingers; f++) | ||||||
| 	// 		{ | 			{ | ||||||
| 	// 			SDL_Finger* finger = SDL_GetTouchFinger(id, f); | 				SDL_Finger* finger = SDL_GetTouchFinger(id, f); | ||||||
|  |  | ||||||
| 	// 			if (finger && finger->pressure > 0.0f) | 				if (finger && finger->pressure > 0.0f) | ||||||
| 	// 			{ | 				{ | ||||||
| 	// 				SDL_Point point = { (s32)(finger->x * width), (s32)(finger->y * height) }; | 					SDL_Point point = { (s32)(finger->x * width), (s32)(finger->y * height) }; | ||||||
| 	// 				if (SDL_PointInRect(&point, rect)) | 					if (SDL_PointInRect(&point, rect)) | ||||||
| 	// 				{ | 					{ | ||||||
| 	// 					*x = point.x; | 						*x = point.x; | ||||||
| 	// 					*y = point.y; | 						*y = point.y; | ||||||
| 	// 					return true; | 						return true; | ||||||
| 	// 				} | 					} | ||||||
| 	// 			} | 				} | ||||||
| 	// 		} | 			} | ||||||
| 	// 	} | 		} | ||||||
| 	// } | 	} | ||||||
|  |  | ||||||
| 	return false; | 	return false; | ||||||
| } | } | ||||||
| @@ -675,104 +673,99 @@ static void blitSound() | |||||||
|  |  | ||||||
| static void renderGamepad() | static void renderGamepad() | ||||||
| { | { | ||||||
| 	// if(platform.gamepad.show || platform.gamepad.alpha); else return; | 	if(platform.gamepad.show || platform.gamepad.alpha); else return; | ||||||
|  |  | ||||||
| 	// const s32 tileSize = platform.gamepad.part.size; | 	const s32 tileSize = platform.gamepad.part.size; | ||||||
| 	// const SDL_Point axis = platform.gamepad.part.axis; | 	const SDL_Point axis = platform.gamepad.part.axis; | ||||||
| 	// typedef struct { bool press; s32 x; s32 y;} Tile; | 	typedef struct { bool press; s32 x; s32 y;} Tile; | ||||||
| 	// const Tile Tiles[] = | 	const Tile Tiles[] = | ||||||
| 	// { | 	{ | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.up, 	axis.x + 1*tileSize, axis.y + 0*tileSize}, | 		{platform.studio->tic->ram.input.gamepads.first.up, 	axis.x + 1*tileSize, axis.y + 0*tileSize}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.down, 	axis.x + 1*tileSize, axis.y + 2*tileSize}, | 		{platform.studio->tic->ram.input.gamepads.first.down, 	axis.x + 1*tileSize, axis.y + 2*tileSize}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.left, 	axis.x + 0*tileSize, axis.y + 1*tileSize}, | 		{platform.studio->tic->ram.input.gamepads.first.left, 	axis.x + 0*tileSize, axis.y + 1*tileSize}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.right, 	axis.x + 2*tileSize, axis.y + 1*tileSize}, | 		{platform.studio->tic->ram.input.gamepads.first.right, 	axis.x + 2*tileSize, axis.y + 1*tileSize}, | ||||||
|  |  | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.a, 		platform.gamepad.part.a.x, platform.gamepad.part.a.y}, | 		{platform.studio->tic->ram.input.gamepads.first.a, 		platform.gamepad.part.a.x, platform.gamepad.part.a.y}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.b, 		platform.gamepad.part.b.x, platform.gamepad.part.b.y}, | 		{platform.studio->tic->ram.input.gamepads.first.b, 		platform.gamepad.part.b.x, platform.gamepad.part.b.y}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.x, 		platform.gamepad.part.x.x, platform.gamepad.part.x.y}, | 		{platform.studio->tic->ram.input.gamepads.first.x, 		platform.gamepad.part.x.x, platform.gamepad.part.x.y}, | ||||||
| 	// 	{platform.studio->tic->ram.input.gamepads.first.y, 		platform.gamepad.part.y.x, platform.gamepad.part.y.y}, | 		{platform.studio->tic->ram.input.gamepads.first.y, 		platform.gamepad.part.y.x, platform.gamepad.part.y.y}, | ||||||
| 	// }; | 	}; | ||||||
|  |  | ||||||
| 	// enum {ButtonsCount = 8}; | 	enum {ButtonsCount = 8}; | ||||||
|  |  | ||||||
| 	// for(s32 i = 0; i < COUNT_OF(Tiles); i++) | 	for(s32 i = 0; i < COUNT_OF(Tiles); i++) | ||||||
| 	// { | 	{ | ||||||
| 	// 	const Tile* tile = Tiles + i; | 		const Tile* tile = Tiles + i; | ||||||
| 	// 	SDL_Rect src = {(tile->press ? ButtonsCount + i : i) * TIC_SPRITESIZE, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; | 		GPU_Rect src = {(tile->press ? ButtonsCount + i : i) * TIC_SPRITESIZE, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; | ||||||
| 	// 	SDL_Rect dest = {tile->x, tile->y, tileSize, tileSize}; | 		GPU_Rect dest = {tile->x, tile->y, tileSize, tileSize}; | ||||||
|  |  | ||||||
| 	// 	SDL_RenderCopy(platform.renderer, platform.gamepad.texture, &src, &dest); | 		GPU_BlitScale(platform.gamepad.texture, &src, platform.gpu.screen, dest.x, dest.y, | ||||||
| 	// } | 			(float)dest.w / TIC_SPRITESIZE, (float)dest.h / TIC_SPRITESIZE); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// if(!platform.gamepad.show && platform.gamepad.alpha) | 	if(!platform.gamepad.show && platform.gamepad.alpha) | ||||||
| 	// { | 	{ | ||||||
| 	// 	enum {Step = 3}; | 		enum {Step = 3}; | ||||||
|  |  | ||||||
| 	// 	if(platform.gamepad.alpha - Step >= 0) platform.gamepad.alpha -= Step; | 		if(platform.gamepad.alpha - Step >= 0) platform.gamepad.alpha -= Step; | ||||||
| 	// 	else platform.gamepad.alpha = 0; | 		else platform.gamepad.alpha = 0; | ||||||
|  |  | ||||||
| 	// 	SDL_SetTextureAlphaMod(platform.gamepad.texture, platform.gamepad.alpha); | 		GPU_SetRGBA(platform.gamepad.texture, 0xff, 0xff, 0xff, platform.gamepad.alpha); | ||||||
| 	// } | 	} | ||||||
|  |  | ||||||
| 	// platform.gamepad.counter = platform.gamepad.touch.data ? 0 : platform.gamepad.counter+1; | 	platform.gamepad.counter = platform.gamepad.touch.data ? 0 : platform.gamepad.counter+1; | ||||||
|  |  | ||||||
| 	// // wait 5 seconds and hide touch gamepad | 	// wait 5 seconds and hide touch gamepad | ||||||
| 	// if(platform.gamepad.counter >= 5 * TIC_FRAMERATE) | 	if(platform.gamepad.counter >= 5 * TIC_FRAMERATE) | ||||||
| 	// 	platform.gamepad.show = false; | 		platform.gamepad.show = false; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void blitCursor(const u8* in) | static void blitCursor(const u8* in) | ||||||
| { | { | ||||||
| 	// if(!platform.mouse.texture) | 	if(!platform.mouse.texture) | ||||||
| 	// { | 	{ | ||||||
| 	// 	platform.mouse.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC_SPRITESIZE, TIC_SPRITESIZE); | 		platform.mouse.texture = GPU_CreateImage(TIC_SPRITESIZE, TIC_SPRITESIZE, STUDIO_PIXEL_FORMAT); | ||||||
| 	// 	SDL_SetTextureBlendMode(platform.mouse.texture, SDL_BLENDMODE_BLEND); | 		GPU_SetAnchor(platform.mouse.texture, 0, 0); | ||||||
| 	// } | 		GPU_SetImageFilter(platform.mouse.texture, GPU_FILTER_NEAREST); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// if(platform.mouse.src != in) | 	if(platform.mouse.src != in) | ||||||
| 	// { | 	{ | ||||||
| 	// 	platform.mouse.src = in; | 		platform.mouse.src = in; | ||||||
|  |  | ||||||
| 	// 	void* pixels = NULL; | 		const u8* end = in + sizeof(tic_tile); | ||||||
| 	// 	s32 pitch = 0; | 		const u32* pal = tic_palette_blit(&platform.studio->tic->ram.vram.palette); | ||||||
| 	// 	SDL_LockTexture(platform.mouse.texture, NULL, &pixels, &pitch); | 		static u32 data[TIC_SPRITESIZE*TIC_SPRITESIZE]; | ||||||
|  | 		u32* out = data; | ||||||
|  |  | ||||||
| 	// 	{ | 		while(in != end) | ||||||
| 	// 		const u8* end = in + sizeof(tic_tile); | 		{ | ||||||
| 	// 		const u32* pal = tic_palette_blit(&platform.studio->tic->ram.vram.palette); | 			u8 low = *in & 0x0f; | ||||||
| 	// 		u32* out = pixels; | 			u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; | ||||||
|  | 			*out++ = low ? *(pal + low) : 0; | ||||||
|  | 			*out++ = hi ? *(pal + hi) : 0; | ||||||
|  |  | ||||||
| 	// 		while(in != end) | 			in++; | ||||||
| 	// 		{ | 		} | ||||||
| 	// 			u8 low = *in & 0x0f; |  | ||||||
| 	// 			u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; |  | ||||||
| 	// 			*out++ = low ? (*(pal + low) | 0xff000000) : 0; |  | ||||||
| 	// 			*out++ = hi ? (*(pal + hi) | 0xff000000) : 0; |  | ||||||
|  |  | ||||||
| 	// 			in++; | 		GPU_UpdateImageBytes(platform.mouse.texture, NULL, (const u8*)data, TIC_SPRITESIZE * sizeof(u32)); | ||||||
| 	// 		} | 	} | ||||||
| 	// 	} |  | ||||||
|  |  | ||||||
| 	// 	SDL_UnlockTexture(platform.mouse.texture); | 	SDL_Rect rect = {0, 0, 0, 0}; | ||||||
| 	// } | 	calcTextureRect(&rect); | ||||||
|  | 	s32 scale = rect.w / TIC80_WIDTH; | ||||||
|  |  | ||||||
| 	// SDL_Rect rect = {0, 0, 0, 0}; | 	s32 mx, my; | ||||||
| 	// calcTextureRect(&rect); | 	SDL_GetMouseState(&mx, &my); | ||||||
| 	// s32 scale = rect.w / TIC80_WIDTH; |  | ||||||
|  |  | ||||||
| 	// SDL_Rect src = {0, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; | 	if(platform.studio->config()->theme.cursor.pixelPerfect) | ||||||
| 	// SDL_Rect dst = {0, 0, TIC_SPRITESIZE * scale, TIC_SPRITESIZE * scale}; | 	{ | ||||||
|  | 		mx -= (mx - rect.x) % scale; | ||||||
|  | 		my -= (my - rect.y) % scale; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// SDL_GetMouseState(&dst.x, &dst.y); | 	if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS) | ||||||
|  | 		GPU_BlitScale(platform.mouse.texture, NULL, platform.gpu.screen, mx, my, (float)scale, (float)scale); | ||||||
| 	// if(platform.studio->config()->theme.cursor.pixelPerfect) |  | ||||||
| 	// { |  | ||||||
| 	// 	dst.x -= (dst.x - rect.x) % scale; |  | ||||||
| 	// 	dst.y -= (dst.y - rect.y) % scale; |  | ||||||
| 	// } |  | ||||||
|  |  | ||||||
| 	// if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS) |  | ||||||
| 	// 	SDL_RenderCopy(platform.renderer, platform.mouse.texture, &src, &dst); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void renderCursor() | static void renderCursor() | ||||||
| @@ -891,7 +884,6 @@ static u64 getPerformanceFrequency() | |||||||
| static void goFullscreen() | static void goFullscreen() | ||||||
| { | { | ||||||
| 	GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); | 	GPU_SetFullscreen(GPU_GetFullscreen() ? false : true, true); | ||||||
| 	// SDL_SetWindowFullscreen(platform.window, SDL_GetWindowFlags(platform.window) & SDL_WINDOW_FULLSCREEN_DESKTOP ? 0 : SDL_WINDOW_FULLSCREEN_DESKTOP); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void showMessageBox(const char* title, const char* message) | static void showMessageBox(const char* title, const char* message) | ||||||
| @@ -994,38 +986,42 @@ static void gpuTick() | |||||||
|  |  | ||||||
| 	{ | 	{ | ||||||
| 		platform.studio->tick(); | 		platform.studio->tick(); | ||||||
| 		renderCursor(); |  | ||||||
| 		renderGamepad(); |  | ||||||
|  |  | ||||||
| 		GPU_UpdateImageBytes(platform.gpu.texture, NULL, (const u8*)tic->screen, TIC80_FULLWIDTH * sizeof(u32)); | 		GPU_UpdateImageBytes(platform.gpu.texture, NULL, (const u8*)tic->screen, TIC80_FULLWIDTH * sizeof(u32)); | ||||||
|  |  | ||||||
| 		{ | 		{ | ||||||
|  |  | ||||||
| 			if(platform.gpu.useShader) | 			if(platform.gpu.useShader) | ||||||
| 			{ | 			{ | ||||||
| 				SDL_Rect rect = {0, 0, 0, 0}; | 				SDL_Rect rect = {0, 0, 0, 0}; | ||||||
| 				calcTextureRect(&rect); | 				calcTextureRect(&rect); | ||||||
|  |  | ||||||
| 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_x"), rect.x); | 				GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); | ||||||
| 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_y"), rect.y); |  | ||||||
| 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_w"), rect.w); | 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_x"), rect.x); | ||||||
| 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "trg_h"), rect.h); | 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_y"), rect.y); | ||||||
|  | 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_w"), rect.w); | ||||||
|  | 				GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "trg_h"), rect.h); | ||||||
|  |  | ||||||
| 				{ | 				{ | ||||||
| 					s32 w, h; | 					s32 w, h; | ||||||
| 					SDL_GetWindowSize(platform.window, &w, &h); | 					SDL_GetWindowSize(platform.window, &w, &h); | ||||||
| 					GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "scr_w"), w); | 					GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_w"), w); | ||||||
| 					GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.crt_shader, "scr_h"), h); | 					GPU_SetUniformf(GPU_GetUniformLocation(platform.gpu.shader, "scr_h"), h); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				GPU_BlitScale(platform.gpu.texture, NULL, platform.gpu.screen, rect.x, rect.y, (float)rect.w / TIC80_FULLWIDTH, (float)rect.h / TIC80_FULLHEIGHT); | 				GPU_BlitScale(platform.gpu.texture, NULL, platform.gpu.screen, rect.x, rect.y,  | ||||||
|  | 					(float)rect.w / TIC80_FULLWIDTH, (float)rect.h / TIC80_FULLHEIGHT); | ||||||
|  |  | ||||||
|  | 				GPU_ActivateShaderProgram(0, NULL); | ||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
| 				blitGpuTexture(platform.gpu.screen, platform.gpu.texture); | 				blitGpuTexture(platform.gpu.screen, platform.gpu.texture); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		renderCursor(); | ||||||
|  | 		renderGamepad(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	GPU_Flip(platform.gpu.screen); | 	GPU_Flip(platform.gpu.screen); | ||||||
| @@ -1083,40 +1079,53 @@ static void emsGpuTick() | |||||||
|  |  | ||||||
| #define SHADER(...) #__VA_ARGS__ | #define SHADER(...) #__VA_ARGS__ | ||||||
|  |  | ||||||
| u32 load_shader_program() | static void loadCrtShader() | ||||||
| { | { | ||||||
| 	static const char* VertexShader =  | 	static const char* VertexShader = "#version 100\n\ | ||||||
| 		#include "ext/shader/common.vert" | 		precision highp float;\n\ | ||||||
| 	; | 		precision mediump int;\n\ | ||||||
|  | 		attribute vec2 gpu_Vertex;\n\ | ||||||
|  | 		attribute vec2 gpu_TexCoord;\n\ | ||||||
|  | 		attribute mediump vec4 gpu_Color;\n\ | ||||||
|  | 		uniform mat4 gpu_ModelViewProjectionMatrix;\n\ | ||||||
|  | 		varying mediump vec4 color;\n\ | ||||||
|  | 		varying vec2 texCoord;\n\ | ||||||
|  | 		void main(void)\n\ | ||||||
|  | 		{\n\ | ||||||
|  | 			color = gpu_Color;\n\ | ||||||
|  | 			texCoord = vec2(gpu_TexCoord);\n\ | ||||||
|  | 			gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\ | ||||||
|  | 		}"; | ||||||
|  |  | ||||||
| 	u32 v = GPU_CompileShader(GPU_VERTEX_SHADER, VertexShader); | 	u32 vertex = GPU_CompileShader(GPU_VERTEX_SHADER, VertexShader); | ||||||
| 	 | 	 | ||||||
| 	if(!v) | 	if(!vertex) | ||||||
|  | 	{ | ||||||
| 		GPU_LogError("Failed to load vertex shader: %s\n", GPU_GetShaderMessage()); | 		GPU_LogError("Failed to load vertex shader: %s\n", GPU_GetShaderMessage()); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	static const char* PixelShader =  | 	static const char* PixelShader =  | ||||||
| 		#include "ext/shader/crt-lottes.frag" | 		#include "ext/shader/crt-lottes.frag" | ||||||
| 	; | 	; | ||||||
|  |  | ||||||
| 	u32 f = GPU_CompileShader(GPU_PIXEL_SHADER, PixelShader); | 	u32 fragment = GPU_CompileShader(GPU_PIXEL_SHADER, PixelShader); | ||||||
| 	 | 	 | ||||||
| 	if(!f) | 	if(!fragment) | ||||||
|  | 	{ | ||||||
| 		GPU_LogError("Failed to load fragment shader: %s\n", GPU_GetShaderMessage()); | 		GPU_LogError("Failed to load fragment shader: %s\n", GPU_GetShaderMessage()); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
| 	 | 	 | ||||||
| 	u32 p = GPU_LinkShaders(v, f); | 	platform.gpu.shader = GPU_LinkShaders(vertex, fragment); | ||||||
| 	 | 	 | ||||||
| 	if(!p) | 	if(platform.gpu.shader) | ||||||
| 	{ | 	{ | ||||||
|  | 		platform.gpu.block = GPU_LoadShaderBlock(platform.gpu.shader, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); | ||||||
|  | 		GPU_ActivateShaderProgram(platform.gpu.shader, &platform.gpu.block); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
| 		GPU_LogError("Failed to link shader program: %s\n", GPU_GetShaderMessage()); | 		GPU_LogError("Failed to link shader program: %s\n", GPU_GetShaderMessage()); | ||||||
| 		return p; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	{ |  | ||||||
| 		GPU_ShaderBlock block = GPU_LoadShaderBlock(p, "gpu_Vertex", "gpu_TexCoord", "gpu_Color", "gpu_ModelViewProjectionMatrix"); |  | ||||||
| 		GPU_ActivateShaderProgram(p, &block); |  | ||||||
|  |  | ||||||
| 		return p; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static s32 start(s32 argc, char **argv, const char* folder) | static s32 start(s32 argc, char **argv, const char* folder) | ||||||
| @@ -1129,8 +1138,6 @@ static s32 start(s32 argc, char **argv, const char* folder) | |||||||
|  |  | ||||||
| 	platform.studio = studioInit(argc, argv, platform.audio.spec.freq, folder, &systemInterface); | 	platform.studio = studioInit(argc, argv, platform.audio.spec.freq, folder, &systemInterface); | ||||||
|  |  | ||||||
| 	initTouchGamepad(); |  | ||||||
|  |  | ||||||
| 	enum{Width = TIC80_FULLWIDTH * STUDIO_UI_SCALE, Height = TIC80_FULLHEIGHT * STUDIO_UI_SCALE}; | 	enum{Width = TIC80_FULLWIDTH * STUDIO_UI_SCALE, Height = TIC80_FULLHEIGHT * STUDIO_UI_SCALE}; | ||||||
|  |  | ||||||
| 	platform.window = SDL_CreateWindow( TIC_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, | 	platform.window = SDL_CreateWindow( TIC_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, | ||||||
| @@ -1142,14 +1149,16 @@ static s32 start(s32 argc, char **argv, const char* folder) | |||||||
|  |  | ||||||
| 	platform.gpu.screen = GPU_Init(Width, Height, GPU_INIT_DISABLE_VSYNC); | 	platform.gpu.screen = GPU_Init(Width, Height, GPU_INIT_DISABLE_VSYNC); | ||||||
|  |  | ||||||
| 	platform.gpu.texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, GPU_FORMAT_RGBA); | 	initTouchGamepad(); | ||||||
|  |  | ||||||
|  | 	platform.gpu.texture = GPU_CreateImage(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, STUDIO_PIXEL_FORMAT); | ||||||
| 	GPU_SetAnchor(platform.gpu.texture, 0, 0); | 	GPU_SetAnchor(platform.gpu.texture, 0, 0); | ||||||
| 	GPU_SetImageFilter(platform.gpu.texture, GPU_FILTER_NEAREST); | 	GPU_SetImageFilter(platform.gpu.texture, GPU_FILTER_NEAREST); | ||||||
|  |  | ||||||
| 	platform.gpu.useShader = true; | 	platform.gpu.useShader = true; | ||||||
|  |  | ||||||
| 	if(platform.gpu.useShader) | 	if(platform.gpu.useShader) | ||||||
| 		platform.gpu.crt_shader = load_shader_program(); | 		loadCrtShader(); | ||||||
|  |  | ||||||
| #if defined(__EMSCRIPTEN__) | #if defined(__EMSCRIPTEN__) | ||||||
|  |  | ||||||
| @@ -1187,9 +1196,12 @@ static s32 start(s32 argc, char **argv, const char* folder) | |||||||
|  |  | ||||||
| 	closeNet(platform.net); | 	closeNet(platform.net); | ||||||
|  |  | ||||||
| 	SDL_CloseAudioDevice(platform.audio.device); | 	if(platform.audio.cvt.buf) | ||||||
|  | 		SDL_free(platform.audio.cvt.buf); | ||||||
|  |  | ||||||
|  | 	if(platform.gpu.shader) | ||||||
|  | 		GPU_FreeShaderProgram(platform.gpu.shader); | ||||||
|  |  | ||||||
| 	GPU_FreeShaderProgram(platform.gpu.crt_shader); |  | ||||||
| 	GPU_FreeImage(platform.gpu.texture); | 	GPU_FreeImage(platform.gpu.texture); | ||||||
|  |  | ||||||
| 	if(platform.gamepad.texture) | 	if(platform.gamepad.texture) | ||||||
| @@ -1198,6 +1210,9 @@ static s32 start(s32 argc, char **argv, const char* folder) | |||||||
| 	if(platform.mouse.texture) | 	if(platform.mouse.texture) | ||||||
| 		GPU_FreeImage(platform.mouse.texture); | 		GPU_FreeImage(platform.mouse.texture); | ||||||
|  |  | ||||||
|  | 	SDL_DestroyWindow(platform.window); | ||||||
|  | 	SDL_CloseAudioDevice(platform.audio.device); | ||||||
|  |  | ||||||
| 	GPU_Quit(); | 	GPU_Quit(); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| #include <time.h> | #include <time.h> | ||||||
| #include <SDL.h> | #include <SDL.h> | ||||||
|  |  | ||||||
| #define STUDIO_UI_SCALE 3 | #define STUDIO_UI_SCALE 2 | ||||||
| #define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 | #define STUDIO_PIXEL_FORMAT SDL_PIXELFORMAT_ABGR8888 | ||||||
| #define TEXTURE_SIZE (TIC80_FULLWIDTH) | #define TEXTURE_SIZE (TIC80_FULLWIDTH) | ||||||
| #define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2) | #define OFFSET_LEFT ((TIC80_FULLWIDTH-TIC80_WIDTH)/2) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 BADIM-PC\Vadim
					BADIM-PC\Vadim