k_debug_light_complexity = 0,
k_light_preview = 0;
-VG_STATIC int g_render_x = 1,
- g_render_y = 1;
-
VG_STATIC int freecam = 0;
VG_STATIC int walk_grid_iterations = 1;
VG_STATIC float fc_speed = 10.0f;
VG_STATIC void menu_btn_invert_y( int event );
VG_STATIC mdl_mesh *menu_mesh_fov_slider,
- *menu_mesh_vol_slider;
+ *menu_mesh_vol_slider,
+ *menu_mesh_res_slider;
VG_STATIC ent_marker
*menu_mark_fov_min,
*menu_mark_fov_max,
*menu_mark_vol_min,
- *menu_mark_vol_max;
+ *menu_mark_vol_max,
+ *menu_mark_res_min,
+ *menu_mark_res_max;
struct{
/* state */
{
"vol_slider", menu_vis, {k_menu_page_settings},
- .lu="text_blur"
+ .lu="res_slider"
},
{ "vol_info", menu_vis, {k_menu_page_settings} },
{
"text_blur", menu_vis, {k_menu_page_settings},
.fn_press = menu_btn_blur,
- .lu="text_invert_y", .ld="vol_slider"
+ .lu="text_invert_y", .ld="res_slider"
},
{
"text_blur_check", menu_settings_if, {.ptr_generic=&cl_blur}
},
-
+{
+ "res_slider", menu_vis, {k_menu_page_settings},
+ .ld = "vol_slider", .lu = "text_blur"
+},
+{
+ "res_info", menu_vis, {k_menu_page_settings},
+},
{ "ctr_xbox", menu_controller_inf, {k_menu_controller_type_xbox}},
{ "ctr_xbox_text", menu_controller_inf, {k_menu_controller_type_xbox}},
{ "ctr_steam", menu_controller_inf, {k_menu_controller_type_steam}},
ent_find_marker( &menu_model, &menu_markers, "vol_slider_max" );
menu_mark_vol_min =
ent_find_marker( &menu_model, &menu_markers, "vol_slider_min" );
+ menu_mark_res_max =
+ ent_find_marker( &menu_model, &menu_markers, "res_slider_max" );
+ menu_mark_res_min =
+ ent_find_marker( &menu_model, &menu_markers, "res_slider_min" );
menu_mesh_fov_slider = mdl_find_mesh( &menu_model, "fov_slider" );
menu_mesh_vol_slider = mdl_find_mesh( &menu_model, "vol_slider" );
+ menu_mesh_res_slider = mdl_find_mesh( &menu_model, "res_slider" );
shader_model_menu_register();
menu_mesh_vol_slider, menu_mark_vol_min->transform.co,
menu_mark_vol_max->transform.co );
+ menu_slider( &gpipeline.view_render_scale,
+ (game_menu.loc == menu_get_loc( "res_slider" )),
+ menu_mesh_res_slider, menu_mark_res_min->transform.co,
+ menu_mark_res_max->transform.co );
+
if( menu_page_should_backout() ){
game_menu.page = k_menu_page_main;
game_menu.loc = menu_get_loc( "text_settings" );
typedef struct framebuffer framebuffer;
-
/*
* All standard buffers used in rendering
*/
framebuffer *fb_main,
*fb_water_reflection,
*fb_water_beneath;
-
- struct light_widget
- {
- int enabled;
- v2f dir;
- v3f colour;
- }
- widgets[3];
-
- float shadow_spread, shadow_length;
-
int ready;
+
+ float view_render_scale,
+ water_render_scale;
}
-gpipeline =
-{
- .widgets =
- {
- {
- .enabled = 1,
- .colour = { 1.36f, 1.35f, 1.01f },
- .dir = { 0.63f, -0.08f }
- },
- {
- .enabled = 1,
- .colour = { 0.33f, 0.56f, 0.64f },
- .dir = { -2.60f, -0.13f }
- },
- {
- .enabled = 1,
- .colour = { 0.05f, 0.05f, 0.23f },
- .dir = { 2.60f, -0.84f }
- }
- },
- .shadow_spread = 0.65f,
- .shadow_length = 9.50f,
-};
+gpipeline = { .view_render_scale = 1.0f };
struct framebuffer
{
const char *display_name;
- int resolution_div,
+ int resolution_div, /* definition */
fixed_w,
- fixed_h;
+ fixed_h,
+
+ render_w, /* runtime */
+ render_h;
struct framebuffer_attachment
{
VG_STATIC void render_fb_get_current_res( struct framebuffer *fb,
int *x, int *y )
{
- if( fb->resolution_div )
- {
+ if( fb->resolution_div ){
*x = vg.window_x / fb->resolution_div;
*y = vg.window_y / fb->resolution_div;
}
- else
- {
+ else{
*x = fb->fixed_w;
*y = fb->fixed_h;
}
}
+VG_STATIC void render_fb_inverse_ratio( framebuffer *fb, v2f inverse )
+{
+ int x, y;
+ render_fb_get_current_res( fb, &x, &y );
+
+ v2f render = { fb->render_w, fb->render_h },
+ original = { x, y };
+
+ v2_div( render, original, inverse );
+}
+
/*
* Bind framebuffer for drawing to
*/
-VG_STATIC void render_fb_bind( framebuffer *fb )
+VG_STATIC void render_fb_bind( framebuffer *fb, int use_scaling )
{
int x, y;
render_fb_get_current_res( fb, &x, &y );
+
+ if( use_scaling ){
+ x = gpipeline.view_render_scale*(float)x;
+ y = gpipeline.view_render_scale*(float)y;
+
+ x = VG_MAX( 16, x );
+ y = VG_MAX( 16, y );
+
+ fb->render_w = x;
+ fb->render_h = y;
+ }
+
glBindFramebuffer( GL_FRAMEBUFFER, fb->fb );
glViewport( 0, 0, x, y );
}
glBindVertexArray( gpipeline.fsquad.vao );
shader_blit_use();
shader_blit_uTexMain( 0 );
+
+ v2f identity = { 1.0f, 1.0f };
+ shader_blit_uInverseRatio( identity );
- for( int i=0; i<vg_list_size(framebuffers); i++ )
- {
+ for( int i=0; i<vg_list_size(framebuffers); i++ ){
struct framebuffer *fb = &framebuffers[i];
- for( int j=0; j<vg_list_size(fb->attachments); j++ )
- {
+ for( int j=0; j<vg_list_size(fb->attachments); j++ ){
struct framebuffer_attachment *at = &fb->attachments[j];
if( !at->debug_view )
ui_text( (ui_rect){ corner[0], corner[1] + 32, 0.0f, 0.0f, },
at->display_name, 1, k_text_align_left );
- if( at->purpose == k_framebuffer_attachment_type_renderbuffer )
- {
+ if( at->purpose == k_framebuffer_attachment_type_renderbuffer ){
v2f center;
v2_muladds( corner, window, 0.15f, center );
ui_text( (ui_rect){ center[0], center[1], 0.0f, 0.0f },
"<hardware texture>", 1, k_text_align_center );
}
- else
- {
+ else{
render_fb_bind_texture( fb, j, 0 );
int start = (viewing_count+2) * 6,
"layout (location=0) in vec2 a_co;\n"
"out vec2 aUv;\n"
"\n"
+"uniform vec2 uInverseRatio;\n"
+"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
-" aUv = a_co;\n"
+" aUv = a_co * uInverseRatio;\n"
"}\n"
""},
.fs =
""},
};
+static GLuint _uniform_blit_uInverseRatio;
static GLuint _uniform_blit_uTexMain;
+static void shader_blit_uInverseRatio(v2f v){
+ glUniform2fv(_uniform_blit_uInverseRatio,1,v);
+}
static void shader_blit_uTexMain(int i){
glUniform1i(_uniform_blit_uTexMain,i);
}
}
static void shader_blit_use(void){ glUseProgram(_shader_blit.id); }
static void shader_blit_link(void){
+ _uniform_blit_uInverseRatio = glGetUniformLocation( _shader_blit.id, "uInverseRatio" );
_uniform_blit_uTexMain = glGetUniformLocation( _shader_blit.id, "uTexMain" );
}
#endif /* SHADER_blit_H */
layout (location=0) in vec2 a_co;
out vec2 aUv;
+uniform vec2 uInverseRatio;
+
void main()
{
gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);
- aUv = a_co;
+ aUv = a_co * uInverseRatio;
}
"layout (location=0) in vec2 a_co;\n"
"out vec2 aUv;\n"
"\n"
+"uniform vec2 uInverseRatio;\n"
+"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
-" aUv = a_co;\n"
+" aUv = a_co * uInverseRatio;\n"
"}\n"
""},
.fs =
""},
};
+static GLuint _uniform_blitblur_uInverseRatio;
static GLuint _uniform_blitblur_uTexMain;
static GLuint _uniform_blitblur_uTexMotion;
static GLuint _uniform_blitblur_uBlurStrength;
static GLuint _uniform_blitblur_uOverrideDir;
+static void shader_blitblur_uInverseRatio(v2f v){
+ glUniform2fv(_uniform_blitblur_uInverseRatio,1,v);
+}
static void shader_blitblur_uTexMain(int i){
glUniform1i(_uniform_blitblur_uTexMain,i);
}
}
static void shader_blitblur_use(void){ glUseProgram(_shader_blitblur.id); }
static void shader_blitblur_link(void){
+ _uniform_blitblur_uInverseRatio = glGetUniformLocation( _shader_blitblur.id, "uInverseRatio" );
_uniform_blitblur_uTexMain = glGetUniformLocation( _shader_blitblur.id, "uTexMain" );
_uniform_blitblur_uTexMotion = glGetUniformLocation( _shader_blitblur.id, "uTexMotion" );
_uniform_blitblur_uBlurStrength = glGetUniformLocation( _shader_blitblur.id, "uBlurStrength" );
"layout (location=0) in vec2 a_co;\n"
"out vec2 aUv;\n"
"\n"
+"uniform vec2 uInverseRatio;\n"
+"\n"
"void main()\n"
"{\n"
" gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);\n"
-" aUv = a_co;\n"
+" aUv = a_co * uInverseRatio;\n"
"}\n"
""},
.fs =
""},
};
+static GLuint _uniform_blitcolour_uInverseRatio;
static GLuint _uniform_blitcolour_uColour;
+static void shader_blitcolour_uInverseRatio(v2f v){
+ glUniform2fv(_uniform_blitcolour_uInverseRatio,1,v);
+}
static void shader_blitcolour_uColour(v4f v){
glUniform4fv(_uniform_blitcolour_uColour,1,v);
}
}
static void shader_blitcolour_use(void){ glUseProgram(_shader_blitcolour.id); }
static void shader_blitcolour_link(void){
+ _uniform_blitcolour_uInverseRatio = glGetUniformLocation( _shader_blitcolour.id, "uInverseRatio" );
_uniform_blitcolour_uColour = glGetUniformLocation( _shader_blitcolour.id, "uColour" );
}
#endif /* SHADER_blitcolour_H */
#include "vehicle.h"
static int cl_ui = 1,
- cl_view_id = 0,
cl_light_edit = 0;
int main( int argc, char *argv[] )
.persistent = 0
});
- vg_var_push( (struct vg_var){
- .name = "cl_view_id",
- .data = &cl_view_id,
- .data_type = k_var_dtype_i32,
- .opt_i32 = { .min=0, .max=1, .clamp=1 },
- .persistent = 0
- });
-
vg_var_push( (struct vg_var){
.name = "ledit",
.data = &cl_light_edit,
VG_STATIC void present_view_with_post_processing(void)
{
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glViewport( 0,0, vg.window_x, vg.window_y );
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
glBlendEquation(GL_FUNC_ADD);
+ v2f inverse;
+ render_fb_inverse_ratio( gpipeline.fb_main, inverse );
+
if( cl_blur ){
shader_blitblur_use();
shader_blitblur_uTexMain( 0 );
shader_blitblur_uTexMotion( 1 );
shader_blitblur_uBlurStrength(cl_blur_strength / (vg.frame_delta*60.0f));
+ shader_blitblur_uInverseRatio( inverse );
v2f menu_blurring;
v2_muls( (v2f){ 0.04f, 0.001f }, menu_opacity, menu_blurring );
shader_blitblur_uOverrideDir( menu_blurring );
- if( cl_view_id == 0 )
- render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
- else if( cl_view_id == 1 )
- render_fb_bind_texture( gpipeline.fb_main, 1, 0 );
- else
- render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
-
+ render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
render_fb_bind_texture( gpipeline.fb_main, 1, 1 );
}
else{
shader_blit_use();
shader_blit_uTexMain( 0 );
+ shader_blit_uInverseRatio( inverse );
render_fb_bind_texture( gpipeline.fb_main, 0, 0 );
}
/* Draw player to window buffer and blend background ontop */
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glViewport( 0,0, vg.window_x, vg.window_y );
player__render( &small_cam, &localplayer );
}
VG_STATIC void render_scene(void)
{
- render_fb_bind( gpipeline.fb_main );
- glViewport( 0,0, g_render_x, g_render_y );
+ render_fb_bind( gpipeline.fb_main, 1 );
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT );
render_world( view_world, &main_camera, 0 );
-
render_water_texture( view_world, &main_camera, 0 );
- render_fb_bind( gpipeline.fb_main );
- glViewport( 0,0, g_render_x, g_render_y );
+ render_fb_bind( gpipeline.fb_main, 1 );
render_water_surface( view_world, &main_camera );
int depth = 1;
{
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
- float scale = (sin(vg.time)*0.5f+0.5f)*0.75f+0.25f;
- g_render_x = VG_MAX((float)vg.window_x * scale,64),
- g_render_y = VG_MAX((float)vg.window_y * scale,64);
-
- glViewport( 0,0, g_render_x, g_render_y );
+ glViewport( 0,0, vg.window_x, vg.window_y );
glDisable( GL_DEPTH_TEST );
glClearColor( 1.0f, 0.0f, 0.0f, 0.0f );
glViewport( 0,0, vg.window_x, vg.window_y );
}
-VG_STATIC void run_light_widget( struct light_widget *lw );
VG_STATIC void vg_ui(void)
{
#if 0
#endif
world_instance *world = get_active_world();
menu_crap_ui();
-
-#if 0
- if( cl_light_edit )
- {
- vg_uictx.cursor[0] = 10;
- vg_uictx.cursor[1] = 10;
- vg_uictx.cursor[2] = 200;
- vg_uictx.cursor[3] = 20;
-
- struct ub_world_lighting *wl = &gpipeline.ub_world_lighting;
- struct ui_slider_vector
- s5 = { .min=0.0f, .max=2.0f, .len=3, .data=wl->g_ambient_colour };
-
- struct ui_slider
- s8 = { .min=0.0f, .max=2.0f, .data = &gpipeline.shadow_spread },
- s9 = { .min=0.0f, .max=25.0f, .data = &gpipeline.shadow_length };
-
- for( int i=0; i<3; i++ )
- run_light_widget( &gpipeline.widgets[i] );
-
- ui_text( vg_uictx.cursor, "Ambient", 1, 0 );
- vg_uictx.cursor[1] += 16;
- ui_slider_vector( &s5 );
-
- ui_text( vg_uictx.cursor, "Shadows", 1, 0 );
- vg_uictx.cursor[1] += 16;
- ui_slider( &s8 );
- ui_slider( &s9 );
-
- ui_text( vg_uictx.cursor, "Misc", 1, 0 );
- vg_uictx.cursor[1] += 16;
- struct ui_checkbox c1 = {.data = &wl->g_light_preview};
- ui_checkbox( &c1 );
-
- render_update_lighting_ub();
- }
-#endif
audio_debug_soundscapes();
render_view_framebuffer_ui();
#endif
}
-VG_STATIC void run_light_widget( struct light_widget *lw )
-{
- struct ui_checkbox c1 = { .data=&lw->enabled };
-
- ui_checkbox( &c1 );
-
- if( lw->enabled )
- {
- struct ui_slider_vector
- colour = { .min=0.0f, .max=2.0f, .len=3, .data=lw->colour },
- dir = { .min=-VG_PIf, .max=VG_PIf, .len=2, .data=lw->dir };
-
- ui_slider_vector( &colour );
- vg_uictx.cursor[1] += 4;
- ui_slider_vector( &dir );
- }
-}
-
VG_STATIC void run_debug_info(void)
{
#if 0
glDisable( GL_STENCIL_TEST );
render_water_texture( world_inside, &gate_camera, layer_depth );
- render_fb_bind( gpipeline.fb_main );
+ render_fb_bind( gpipeline.fb_main, 1 );
glEnable( GL_STENCIL_TEST );
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
- render_fb_bind( &world->heightmap );
+ render_fb_bind( &world->heightmap, 0 );
shader_blitcolour_use();
shader_blitcolour_uColour( (v4f){-9999.0f,-9999.0f,-9999.0f,-9999.0f} );
render_fsquad();
return;
/* Draw reflection buffa */
- render_fb_bind( gpipeline.fb_water_reflection );
+ render_fb_bind( gpipeline.fb_water_reflection, 1 );
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
/*
* Create beneath view matrix
*/
camera beneath_cam;
- render_fb_bind( gpipeline.fb_water_beneath );
+ render_fb_bind( gpipeline.fb_water_beneath, 1 );
glClearColor( 1.0f, 0.0f, 0.0f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
glEnable( GL_DEPTH_TEST );
glDisable( GL_BLEND );
render_world_depth( world, &beneath_cam );
- glViewport( 0,0, g_render_x, g_render_y );
+ //glViewport( 0,0, g_render_x, g_render_y );
}
VG_STATIC void render_water_surface( world_instance *world, camera *cam )