fixed cursor rendering

This commit is contained in:
BADIM-PC\Vadim 2018-02-13 19:25:39 +03:00
parent 9aab993fe4
commit a3126275b4
5 changed files with 126 additions and 72 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -93,14 +93,36 @@ static void readCursorTheme(Config* config, lua_State* lua)
if(lua_type(lua, -1) == LUA_TTABLE) if(lua_type(lua, -1) == LUA_TTABLE)
{ {
{ {
lua_getfield(lua, -1, "SPRITE"); lua_getfield(lua, -1, "ARROW");
if(lua_isinteger(lua, -1)) if(lua_isinteger(lua, -1))
{ {
config->data.theme.cursor.sprite = (s32)lua_tointeger(lua, -1); config->data.theme.cursor.arrow = (s32)lua_tointeger(lua, -1);
} }
lua_pop(lua, 1); lua_pop(lua, 1);
}
{
lua_getfield(lua, -1, "HAND");
if(lua_isinteger(lua, -1))
{
config->data.theme.cursor.hand = (s32)lua_tointeger(lua, -1);
}
lua_pop(lua, 1);
}
{
lua_getfield(lua, -1, "IBEAM");
if(lua_isinteger(lua, -1))
{
config->data.theme.cursor.ibeam = (s32)lua_tointeger(lua, -1);
}
lua_pop(lua, 1);
} }
{ {

View File

@ -48,6 +48,12 @@ static struct
} part; } part;
} gamepad; } gamepad;
struct
{
SDL_Texture* texture;
const u8* src;
} mouse;
bool missedFrame; bool missedFrame;
bool fullscreen; bool fullscreen;
} platform; } platform;
@ -244,9 +250,9 @@ static void calcTextureRect(SDL_Rect* rect)
// point.x /= Fingers; // point.x /= Fingers;
// point.y /= Fingers; // point.y /= Fingers;
// studioImpl.gesture.pos = point; // platform.gesture.pos = point;
// studioImpl.gesture.active = true; // platform.gesture.active = true;
// } // }
// } // }
@ -709,97 +715,120 @@ static void renderGamepad()
platform.gamepad.show = false; platform.gamepad.show = false;
} }
// static void blitCursor(const u8* in) static void blitCursor(const u8* in)
// { {
// if(!studioImpl.mouse.texture) if(!platform.mouse.texture)
// { {
// studioImpl.mouse.texture = SDL_CreateTexture(studioImpl.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC_SPRITESIZE, TIC_SPRITESIZE); platform.mouse.texture = SDL_CreateTexture(platform.renderer, STUDIO_PIXEL_FORMAT, SDL_TEXTUREACCESS_STREAMING, TIC_SPRITESIZE, TIC_SPRITESIZE);
// SDL_SetTextureBlendMode(studioImpl.mouse.texture, SDL_BLENDMODE_BLEND); SDL_SetTextureBlendMode(platform.mouse.texture, SDL_BLENDMODE_BLEND);
// } }
// if(studioImpl.mouse.src != in) if(platform.mouse.src != in)
// { {
// studioImpl.mouse.src = in; platform.mouse.src = in;
// void* pixels = NULL; void* pixels = NULL;
// s32 pitch = 0; s32 pitch = 0;
// SDL_LockTexture(studioImpl.mouse.texture, NULL, &pixels, &pitch); SDL_LockTexture(platform.mouse.texture, NULL, &pixels, &pitch);
// { {
// const u8* end = in + sizeof(tic_tile); const u8* end = in + sizeof(tic_tile);
// const u32* pal = tic_palette_blit(&studioImpl.studio.tic->ram.vram.palette); const u32* pal = tic_palette_blit(&platform.studio->tic->ram.vram.palette);
// u32* out = pixels; u32* out = pixels;
// while(in != end) while(in != end)
// { {
// u8 low = *in & 0x0f; u8 low = *in & 0x0f;
// u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP; u8 hi = (*in & 0xf0) >> TIC_PALETTE_BPP;
// *out++ = low ? (*(pal + low) | 0xff000000) : 0; *out++ = low ? (*(pal + low) | 0xff000000) : 0;
// *out++ = hi ? (*(pal + hi) | 0xff000000) : 0; *out++ = hi ? (*(pal + hi) | 0xff000000) : 0;
// in++; in++;
// } }
// } }
// SDL_UnlockTexture(studioImpl.mouse.texture); SDL_UnlockTexture(platform.mouse.texture);
// } }
// tic_rect rect = {0, 0, 0, 0}; SDL_Rect rect = {0, 0, 0, 0};
// calcTextureRect(&rect); calcTextureRect(&rect);
// s32 scale = rect.w / TIC80_WIDTH; s32 scale = rect.w / TIC80_WIDTH;
// tic_rect src = {0, 0, TIC_SPRITESIZE, TIC_SPRITESIZE}; SDL_Rect src = {0, 0, TIC_SPRITESIZE, TIC_SPRITESIZE};
// tic_rect dst = {0, 0, TIC_SPRITESIZE * scale, TIC_SPRITESIZE * scale}; SDL_Rect dst = {0, 0, TIC_SPRITESIZE * scale, TIC_SPRITESIZE * scale};
// SDL_GetMouseState(&dst.x, &dst.y); SDL_GetMouseState(&dst.x, &dst.y);
// if(getConfig()->theme.cursor.pixelPerfect) if(getConfig()->theme.cursor.pixelPerfect)
// { {
// dst.x -= (dst.x - rect.x) % scale; dst.x -= (dst.x - rect.x) % scale;
// dst.y -= (dst.y - rect.y) % scale; dst.y -= (dst.y - rect.y) % scale;
// } }
// if(SDL_GetWindowFlags(studioImpl.window) & SDL_WINDOW_MOUSE_FOCUS)
// SDL_RenderCopy(studioImpl.renderer, studioImpl.mouse.texture, &src, &dst);
// }
if(SDL_GetWindowFlags(platform.window) & SDL_WINDOW_MOUSE_FOCUS)
SDL_RenderCopy(platform.renderer, platform.mouse.texture, &src, &dst);
}
static void renderCursor() static void renderCursor()
{ {
if(platform.studio->tic->ram.vram.vars.cursor.system) if(platform.studio->tic->ram.vram.vars.cursor.system)
{ {
SDL_SystemCursor sdlCursor = SDL_SYSTEM_CURSOR_ARROW;
switch(platform.studio->tic->ram.vram.vars.cursor.sprite) switch(platform.studio->tic->ram.vram.vars.cursor.sprite)
{ {
case tic_cursor_hand: sdlCursor = SDL_SYSTEM_CURSOR_HAND; break; case tic_cursor_hand:
case tic_cursor_ibeam: sdlCursor = SDL_SYSTEM_CURSOR_IBEAM; break; {
default: sdlCursor = SDL_SYSTEM_CURSOR_ARROW; if(getConfig()->theme.cursor.hand >= 0)
{
SDL_ShowCursor(SDL_DISABLE);
blitCursor(platform.studio->tic->config.bank0.tiles.data[getConfig()->theme.cursor.hand].data);
}
else
{
SDL_ShowCursor(SDL_ENABLE);
SDL_SetCursor(SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND));
}
}
break;
case tic_cursor_ibeam:
{
if(getConfig()->theme.cursor.ibeam >= 0)
{
SDL_ShowCursor(SDL_DISABLE);
blitCursor(platform.studio->tic->config.bank0.tiles.data[getConfig()->theme.cursor.ibeam].data);
}
else
{
SDL_ShowCursor(SDL_ENABLE);
SDL_SetCursor(SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM));
}
}
break;
default:
{
if(getConfig()->theme.cursor.arrow >= 0)
{
SDL_ShowCursor(SDL_DISABLE);
blitCursor(platform.studio->tic->config.bank0.tiles.data[getConfig()->theme.cursor.arrow].data);
}
else
{
SDL_ShowCursor(SDL_ENABLE);
SDL_SetCursor(SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW));
}
}
} }
SDL_SetCursor(SDL_CreateSystemCursor(sdlCursor));
} }
else else
{ {
// render cursor here SDL_ShowCursor(SDL_DISABLE);
blitCursor(platform.studio->tic->ram.sprites.data[platform.studio->tic->ram.vram.vars.cursor.sprite].data);
} }
// if(studioImpl.mode == TIC_RUN_MODE && !studioImpl.studio.tic->input.mouse) // if(platform.mode == TIC_RUN_MODE && !platform.studio.tic->input.mouse)
// { // {
// SDL_ShowCursor(SDL_DISABLE); // SDL_ShowCursor(SDL_DISABLE);
// return; // return;
// } // }
// if(studioImpl.mode == TIC_RUN_MODE && studioImpl.studio.tic->ram.vram.vars.cursor)
// {
// SDL_ShowCursor(SDL_DISABLE);
// blitCursor(studioImpl.studio.tic->ram.sprites.data[studioImpl.studio.tic->ram.vram.vars.cursor].data);
// return;
// }
// SDL_ShowCursor(getConfig()->theme.cursor.sprite >= 0 ? SDL_DISABLE : SDL_ENABLE);
// if(getConfig()->theme.cursor.sprite >= 0)
// blitCursor(studioImpl.studio.tic->config.bank0.tiles.data[getConfig()->theme.cursor.sprite].data);
} }
static void tick() static void tick()
@ -1016,8 +1045,8 @@ s32 main(s32 argc, char **argv)
if(platform.audio.cvt.buf) if(platform.audio.cvt.buf)
SDL_free(platform.audio.cvt.buf); SDL_free(platform.audio.cvt.buf);
// if(platform.mouse.texture) if(platform.mouse.texture)
// SDL_DestroyTexture(platform.mouse.texture); SDL_DestroyTexture(platform.mouse.texture);
SDL_DestroyTexture(platform.gamepad.texture); SDL_DestroyTexture(platform.gamepad.texture);

View File

@ -74,7 +74,10 @@ typedef struct
{ {
struct struct
{ {
s32 sprite; s32 arrow;
s32 hand;
s32 ibeam;
bool pixelPerfect; bool pixelPerfect;
} cursor; } cursor;