X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=vg_loader.h;h=87472b615bb6b08371c63e90f1d93a733a6496f9;hb=3d52e114a0f608e58bc99cfc6faaeb41cfcf84c7;hp=6d8be1b064f1fc3a2cb391ed8431c054a2c69780;hpb=4c48fe01a5d1983be89b7dce6f08e6b708cfbb05;p=vg.git diff --git a/vg_loader.h b/vg_loader.h index 6d8be1b..87472b6 100644 --- a/vg_loader.h +++ b/vg_loader.h @@ -12,10 +12,16 @@ #include "common.h" +VG_STATIC void vg_loader_start( void(*pfn)(void) ); +VG_STATIC void vg_loader_step( void( *fn_load )(void), void( *fn_free )(void) ); + static struct vg_shader _shader_loader = { .name = "[vg] loader", .link = NULL, + + /* This is the old background shader */ +#if 0 .vs = { .orig_file = NULL, @@ -40,14 +46,72 @@ static struct vg_shader _shader_loader = "void main()" "{" "float dither=fract(dot(vec2(171.0,231.0),gl_FragCoord.xy)/71.0)-0.5;" - "float grad = 1.0-(aUv.y*0.5+0.5);" + "float grad = 1.0-(aUv.y*0.5+0.5)*0.5;" "float fmt1 = step( 0.5, grad+dither );" "vec3 col = 0.5+0.5*sin( uTime + aUv.xyx + vec3(0.0,2.0,4.0) );" - "FragColor = vec4(col*grad*fmt1,1.0);" + "FragColor = vec4(vec3(0.5,0.5,0.5)*grad*fmt1,1.0);" + "}" + } +#else + + /* This is the new foreground shader */ + + .vs = + { + .orig_file = NULL, + .static_src = "" + "layout (location=0) in vec2 a_co;" + "out vec2 aUv;" + "void main()" + "{" + "gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);" + "aUv = a_co;" + "}" + }, + .fs = + { + .orig_file = NULL, + .static_src = + + "out vec4 FragColor;" + "uniform float uTime;" + "uniform float uRatio;" + "in vec2 aUv;" + + "float eval_zero( vec2 uv )" + "{" + "vec4 vsines = sin( (uTime+uv.y*80.0) * vec4(1.1,2.0234,3.73,2.444) );" + "float gradient = min( uv.y, 0.0 );" + "float offset = vsines.x*vsines.y*vsines.z*vsines.w*gradient;" + + "vec2 vpos = uv + vec2( offset, 0.0 );" + "float dist = dot( vpos, vpos );" + + "float fring = step(0.1*0.1,dist) * step(dist,0.15*0.15);" + "return max( 0.0, fring * 1.0+gradient*6.0 );" + "}" + + "void main()" + "{" + + "vec3 col = 0.5+0.5*sin( uTime + aUv.xyx + vec3(0.0,2.0,4.0) );" + + "vec2 uvx = aUv - vec2( 0.5 );" + "uvx.x *= uRatio;" + "uvx.y *= 0.75;" + + "float zero = eval_zero( uvx );" + + "float dither=fract(dot(vec2(171.0,231.0),gl_FragCoord.xy)/71.0)-0.5;" + "float fmt1 = step( 0.5, zero*zero + dither )*0.8+0.2;" + + "FragColor = vec4(vec3(fmt1),0.8);" "}" } + +#endif }; static struct vg_loader @@ -55,8 +119,7 @@ static struct vg_loader /* Shutdown steps */ struct loader_free_step { - void (*fn_free)(void *); - void *data; + void (*fn_free)(void); } step_buffer[16]; u32 step_count, step_action; @@ -65,7 +128,7 @@ static struct vg_loader } vg_loader; -VG_STATIC void vg_loader_init(void) +VG_STATIC void _vg_loader_init(void) { float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f }; @@ -85,7 +148,7 @@ VG_STATIC void vg_loader_init(void) vg_fatal_exit_loop( "failed to compile shader" ); } -VG_STATIC void vg_loader_free(void) +VG_STATIC void _vg_loader_free(void) { vg_info( "vg_loader_free\n" ); glDeleteVertexArrays( 1, &vg_loader.vao ); @@ -97,23 +160,13 @@ VG_STATIC void vg_loader_free(void) &vg_loader.step_buffer[vg_loader.step_count -1 -i]; vg_info( " -> %p\n", step->fn_free ); - step->fn_free( step->data ); + step->fn_free(); } vg_info( "done\n" ); } -VG_STATIC float hue_to_rgb( float p, float q, float t ) -{ - if(t < 0.0f) t += 1.0f; - if(t > 1.0f) t -= 1.0f; - if(t < 1.0f/6.0f) return p + (q - p) * 6.0f * t; - if(t < 1.0f/2.0f) return q; - if(t < 2.0f/3.0f) return p + (q - p) * (2.0f/3.0f - t) * 6.0f; - return p; -} - -VG_STATIC void vg_render_log(void) +VG_STATIC void _vg_render_log(void) { ui_begin( vg.window_x, vg.window_y ); SDL_AtomicLock( &log_print_sl ); @@ -147,65 +200,71 @@ VG_STATIC void vg_render_log(void) ui_draw( NULL ); } -VG_STATIC void vg_loader_render(void) +VG_STATIC void _vg_loader_render(void) { glViewport( 0,0, vg.window_x, vg.window_y ); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); +#if 0 glUseProgram( _shader_loader.id ); glUniform1f( glGetUniformLocation( _shader_loader.id, "uTime" ), vg.time ); - glBindVertexArray( vg_loader.vao ); glDrawArrays( GL_TRIANGLES, 0, 6 ); +#endif + + _vg_render_log(); + +#if 1 + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); - vg_render_log(); + glUseProgram( _shader_loader.id ); + glUniform1f( glGetUniformLocation( _shader_loader.id, "uTime" ), vg.time ); + float ratio = (float)vg.window_x / (float)vg.window_y; + glUniform1f( glGetUniformLocation( _shader_loader.id, "uRatio"), ratio ); + glBindVertexArray( vg_loader.vao ); + glDrawArrays( GL_TRIANGLES, 0, 6 ); +#endif } VG_STATIC void vg_load_full(void); -VG_STATIC int vg_loader_thread(void * nothing) +VG_STATIC int _vg_loader_thread(void *pfn) { SDL_AtomicLock( &vg.sl_context ); vg.thread_id_loader = SDL_GetThreadID(NULL); + VG_SYNC_LOG( "[%d] Loader thread begins\n" ); SDL_AtomicUnlock( &vg.sl_context ); /* Run client loader */ - vg_load_full(); + void (*call_func)(void) = pfn; + call_func(); SDL_SemPost( vg.sem_loader ); vg.thread_id_loader = 0; + vg_acquire_thread_sync(); + vg.is_loaded = 1; + vg_release_thread_sync(); + return 0; } -VG_STATIC void vg_loader_start(void) +VG_STATIC void vg_loader_start( void(*pfn)(void) ) { + vg.is_loaded = 0; SDL_SemWait( vg.sem_loader ); - SDL_CreateThread( vg_loader_thread, "Loader thread", NULL ); -} - -/* this is maybe probably unused now */ -VG_STATIC void vg_free_libc_malloced( void *data ) -{ - free( data ); -} - -VG_STATIC void vg_loader_push_free_step( struct loader_free_step step ) -{ - if( vg_loader.step_count == vg_list_size(vg_loader.step_buffer) ) - vg_fatal_exit_loop( "Too many free steps" ); - - vg_loader.step_buffer[ vg_loader.step_count ++ ] = step; + SDL_CreateThread( _vg_loader_thread, "Loader thread", pfn ); } /* * Schedule something to be ran now, freed later. Checks in with engine status */ -VG_STATIC void vg_loader_highwater( void( *fn_load )(void), - void( *fn_free )(void *), void *data ) +VG_STATIC void vg_loader_step( void( *fn_load )(void), void( *fn_free )(void) ) { if( fn_load ) fn_load(); @@ -213,24 +272,15 @@ VG_STATIC void vg_loader_highwater( void( *fn_load )(void), if( fn_free ) { struct loader_free_step step; - step.data = data; step.fn_free = fn_free; - vg_loader_push_free_step( step ); - } - else - { - if( data ) - { - struct loader_free_step step; - step.data = data; - step.fn_free = vg_free_libc_malloced; - - vg_loader_push_free_step( step ); - } + if( vg_loader.step_count == vg_list_size(vg_loader.step_buffer) ) + vg_fatal_exit_loop( "Too many free steps" ); + + vg_loader.step_buffer[ vg_loader.step_count ++ ] = step; } - vg_ensure_engine_running(); + _vg_ensure_engine_running(); } #endif /* VG_LOADER_H */