#780 fixed viewport size
This commit is contained in:
parent
de0b0865ca
commit
826a140cb8
|
@ -40,7 +40,7 @@ static void app_init(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sokol_gfx_init(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, 1, 1);
|
sokol_gfx_init(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, 1, 1, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static tic80_input tic_input;
|
static tic80_input tic_input;
|
||||||
|
|
|
@ -131,7 +131,7 @@ static System systemInterface =
|
||||||
|
|
||||||
static void app_init(void)
|
static void app_init(void)
|
||||||
{
|
{
|
||||||
sokol_gfx_init(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, 1, 1);
|
sokol_gfx_init(TIC80_FULLWIDTH, TIC80_FULLHEIGHT, 1, 1, false, true);
|
||||||
|
|
||||||
platform.audio.samples = calloc(sizeof platform.audio.samples[0], saudio_sample_rate() / TIC_FRAMERATE * TIC_STEREO_CHANNLES);
|
platform.audio.samples = calloc(sizeof platform.audio.samples[0], saudio_sample_rate() / TIC_FRAMERATE * TIC_STEREO_CHANNLES);
|
||||||
}
|
}
|
||||||
|
@ -306,38 +306,6 @@ static void handleKeydown(sapp_keycode keycode, bool down)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calcViewportSize(tic_rect* rect)
|
|
||||||
{
|
|
||||||
enum{Width = TIC80_WIDTH, Height = TIC80_HEIGHT};
|
|
||||||
|
|
||||||
if (rect->w * Height < rect->h * Width)
|
|
||||||
{
|
|
||||||
s32 discreteWidth = rect->w;// - rect->w % Width;
|
|
||||||
s32 discreteHeight = Height * discreteWidth / Width;
|
|
||||||
|
|
||||||
rect->x = (rect->w - discreteWidth) / 2;
|
|
||||||
|
|
||||||
rect->y = rect->w > rect->h
|
|
||||||
? (rect->h - discreteHeight) / 2
|
|
||||||
: OFFSET_TOP*discreteWidth/Width;
|
|
||||||
|
|
||||||
rect->w = discreteWidth;
|
|
||||||
rect->h = discreteHeight;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s32 discreteHeight = rect->h;// - rect->h % Height;
|
|
||||||
s32 discreteWidth = Width * discreteHeight / Height;
|
|
||||||
|
|
||||||
rect->x = (rect->w - discreteWidth) / 2;
|
|
||||||
rect->y = (rect->h - discreteHeight) / 2;
|
|
||||||
|
|
||||||
rect->w = discreteWidth;
|
|
||||||
rect->h = discreteHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
||||||
|
|
|
@ -7,5 +7,5 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void sokol_gfx_init(int w, int h, int sx, int sy);
|
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);
|
||||||
|
|
|
@ -2,13 +2,16 @@
|
||||||
|
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
sg_draw_state upscale_draw_state;
|
sg_draw_state upscale_draw_state;
|
||||||
sg_pass upscale_pass;
|
sg_pass upscale_pass;
|
||||||
sg_draw_state draw_state;
|
sg_draw_state draw_state;
|
||||||
int fb_width;
|
int fb_width;
|
||||||
int fb_height;
|
int fb_height;
|
||||||
int fb_aspect_scale_x;
|
int fb_aspect_scale_x;
|
||||||
int fb_aspect_scale_y;
|
int fb_aspect_scale_y;
|
||||||
|
|
||||||
|
bool integer_scale;
|
||||||
|
bool portrait_top_align;
|
||||||
} sokol_gfx;
|
} sokol_gfx;
|
||||||
|
|
||||||
#if defined(SOKOL_GLCORE33)
|
#if defined(SOKOL_GLCORE33)
|
||||||
|
@ -96,11 +99,14 @@ static const char* gfx_fs_src =
|
||||||
"}\n";
|
"}\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void sokol_gfx_init(int w, int h, int sx, int sy) {
|
void sokol_gfx_init(int w, int h, int sx, int sy, bool integer_scale, bool portrait_top_align) {
|
||||||
sokol_gfx.fb_width = w;
|
sokol_gfx.fb_width = w;
|
||||||
sokol_gfx.fb_height = h;
|
sokol_gfx.fb_height = h;
|
||||||
sokol_gfx.fb_aspect_scale_x = sx;
|
sokol_gfx.fb_aspect_scale_x = sx;
|
||||||
sokol_gfx.fb_aspect_scale_y = sy;
|
sokol_gfx.fb_aspect_scale_y = sy;
|
||||||
|
sokol_gfx.integer_scale = integer_scale;
|
||||||
|
sokol_gfx.portrait_top_align = portrait_top_align;
|
||||||
|
|
||||||
sg_setup(&(sg_desc){
|
sg_setup(&(sg_desc){
|
||||||
.mtl_device = sapp_metal_get_device(),
|
.mtl_device = sapp_metal_get_device(),
|
||||||
.mtl_renderpass_descriptor_cb = sapp_metal_get_renderpass_descriptor,
|
.mtl_renderpass_descriptor_cb = sapp_metal_get_renderpass_descriptor,
|
||||||
|
@ -193,28 +199,33 @@ static const sg_pass_action gfx_draw_pass_action = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void apply_viewport(void) {
|
static void apply_viewport(void) {
|
||||||
const int canvas_width = sapp_width();
|
int vp_x = 0, vp_y = 0, vp_w = sapp_width(), vp_h = sapp_height();
|
||||||
const int canvas_height = sapp_height();
|
|
||||||
const float canvas_aspect = (float)canvas_width / (float)canvas_height;
|
|
||||||
const float fb_aspect = (float)(sokol_gfx.fb_width*sokol_gfx.fb_aspect_scale_x) / (float)(sokol_gfx.fb_height*sokol_gfx.fb_aspect_scale_y);
|
|
||||||
int vp_x, vp_y, vp_w, vp_h;
|
|
||||||
if (fb_aspect < canvas_aspect) {
|
|
||||||
vp_y = 0;
|
|
||||||
vp_h = canvas_height;
|
|
||||||
vp_w = (int) (canvas_height * fb_aspect);
|
|
||||||
vp_x = (canvas_width - vp_w) / 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
vp_x = 0;
|
|
||||||
vp_w = canvas_width;
|
|
||||||
vp_h = (int) (canvas_width / fb_aspect);
|
|
||||||
|
|
||||||
// align top
|
if (vp_w * sokol_gfx.fb_height < vp_h * sokol_gfx.fb_width)
|
||||||
vp_y = 0;
|
{
|
||||||
|
int discreteWidth = vp_w - (sokol_gfx.integer_scale ? vp_w % sokol_gfx.fb_width : 0);
|
||||||
|
int discreteHeight = sokol_gfx.fb_height * discreteWidth / sokol_gfx.fb_width;
|
||||||
|
|
||||||
// align vcenter
|
vp_x = (vp_w - discreteWidth) / 2;
|
||||||
//vp_y = (canvas_height - vp_h) / 2;
|
vp_y = sokol_gfx.portrait_top_align && vp_w < vp_h
|
||||||
|
? 0
|
||||||
|
: (vp_h - discreteHeight) / 2;
|
||||||
|
|
||||||
|
vp_w = discreteWidth;
|
||||||
|
vp_h = discreteHeight;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int discreteHeight = vp_h - (sokol_gfx.integer_scale ? vp_h % sokol_gfx.fb_height : 0);
|
||||||
|
int discreteWidth = sokol_gfx.fb_width * discreteHeight / sokol_gfx.fb_height;
|
||||||
|
|
||||||
|
vp_x = (vp_w - discreteWidth) / 2;
|
||||||
|
vp_y = (vp_h - discreteHeight) / 2;
|
||||||
|
|
||||||
|
vp_w = discreteWidth;
|
||||||
|
vp_h = discreteHeight;
|
||||||
|
}
|
||||||
|
|
||||||
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