From adb4f3b3c7e8ee28f7b4cd58e0d33c3a5e174c55 Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 5 Feb 2023 02:25:08 +0000 Subject: [PATCH] resolution fix --- vg.h | 40 +++++++++++++++++++++++++--------- vg_m.h | 68 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 70 insertions(+), 38 deletions(-) diff --git a/vg.h b/vg.h index 17bc6ee..25dc65e 100644 --- a/vg.h +++ b/vg.h @@ -677,24 +677,38 @@ VG_STATIC void _vg_init_window( const char *window_name ) exit(0); } + + + /* TODO: Allow chosing the modes at startup */ - vg_info( "Getting display mode\n" ); - SDL_DisplayMode mode = { SDL_PIXELFORMAT_UNKNOWN, 0, 0, 0, 0 }; - if( SDL_GetDisplayMode( display_index, mode_index, &mode ) != 0 ) + vg_info( "Getting default display mode\n" ); + SDL_DisplayMode vm_ideal = { 0, 0, 0, 0, 0 }; + if( SDL_GetDisplayMode( display_index, mode_index, &vm_ideal ) != 0 ) { vg_error( "SDL_GetDisplayMode failed: %s", SDL_GetError() ); exit(0); } - vg.refresh_rate = mode.refresh_rate; + if( vg.window_x ) + vm_ideal.w = vg.window_x; + + if( vg.window_y ) + vm_ideal.h = vg.window_y; + - if( !vg.window_x ) - vg.window_x = mode.w; + SDL_DisplayMode vm_best; + if( !SDL_GetClosestDisplayMode( display_index, &vm_ideal, &vm_best ) ) + { + vg_error( "SDL_GetClosestDisplayMode failed: %s", SDL_GetError() ); + exit(0); + } - if( !vg.window_y ) - vg.window_y = mode.h; + vg.refresh_rate = vm_best.refresh_rate; + vg.window_x = vm_best.w; + vg.window_y = vm_best.h; - vg_info( "CreateWindow( %d %d )\n", vg.window_x, vg.window_y ); + vg_info( "CreateWindow( %d %d @%.2fhz )\n", vg.window_x, vg.window_y, + vg.refresh_rate ); /* TODO: Allow selecting closest video mode from launch opts */ if((vg.window = SDL_CreateWindow( window_name, @@ -702,10 +716,16 @@ VG_STATIC void _vg_init_window( const char *window_name ) SDL_WINDOWPOS_UNDEFINED, vg.window_x, vg.window_y, - SDL_WINDOW_FULLSCREEN_DESKTOP | + SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL | SDL_WINDOW_INPUT_GRABBED ))) { + if( SDL_SetWindowDisplayMode( vg.window, &vm_best ) ) + { + vg_error( "SDL_SetWindowDisplayMode failed: %s", SDL_GetError() ); + SDL_Quit(); + exit(0); + } } else { diff --git a/vg_m.h b/vg_m.h index e70222e..4844eeb 100644 --- a/vg_m.h +++ b/vg_m.h @@ -1256,41 +1256,53 @@ static inline void tri_to_plane( double a[3], double b[3], p[2] = p[2] / l; } -static inline int plane_intersect( double a[4], double b[4], - double c[4], double p[4] ) +static int plane_intersect3( v4f a, v4f b, v4f c, v3f p ) { - double const epsilon = 1e-8f; + float const epsilon = 1e-6f; - double x[3]; - double d; + v3f x; + v3_cross( a, b, x ); + float d = v3_dot( x, c ); - x[0] = a[1] * b[2] - a[2] * b[1]; - x[1] = a[2] * b[0] - a[0] * b[2]; - x[2] = a[0] * b[1] - a[1] * b[0]; - - d = x[0] * c[0] + x[1] * c[1] + x[2] * c[2]; - - if( d < epsilon && d > -epsilon ) return 0; - - p[0] = (b[1] * c[2] - b[2] * c[1]) * -a[3]; - p[1] = (b[2] * c[0] - b[0] * c[2]) * -a[3]; - p[2] = (b[0] * c[1] - b[1] * c[0]) * -a[3]; - - p[0] += (c[1] * a[2] - c[2] * a[1]) * -b[3]; - p[1] += (c[2] * a[0] - c[0] * a[2]) * -b[3]; - p[2] += (c[0] * a[1] - c[1] * a[0]) * -b[3]; - - p[0] += (a[1] * b[2] - a[2] * b[1]) * -c[3]; - p[1] += (a[2] * b[0] - a[0] * b[2]) * -c[3]; - p[2] += (a[0] * b[1] - a[1] * b[0]) * -c[3]; - - p[0] = -p[0] / d; - p[1] = -p[1] / d; - p[2] = -p[2] / d; + if( (d < epsilon) && (d > -epsilon) ) return 0; + + v3f v0, v1, v2; + v3_cross( b, c, v0 ); + v3_cross( c, a, v1 ); + v3_cross( a, b, v2 ); + + v3_muls( v0, a[3], p ); + v3_muladds( p, v1, b[3], p ); + v3_muladds( p, v2, c[3], p ); + v3_divs( p, d, p ); return 1; } +int plane_intersect2( v4f a, v4f b, v3f p, v3f n ) +{ + float const epsilon = 1e-6f; + + v4f c; + v3_cross( a, b, c ); + float d = v3_length2( c ); + + if( (d < epsilon) && (d > -epsilon) ) + return 0; + + v3f v0, v1, vx; + v3_cross( c, b, v0 ); + v3_cross( a, c, v1 ); + + v3_muls( v0, a[3], vx ); + v3_muladds( vx, v1, b[3], vx ); + v3_divs( vx, d, p ); + v3_copy( c, n ); + + return 1; +} + + static inline double plane_polarity( double p[4], double a[3] ) { return -- 2.25.1