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,
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
{
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