replace VG_STATIC -> static
[vg.git] / vg_loader.h
index b47d759ec60a1fb676f3fd94ca333b3c90727767..cdd29ebc302d80266e6041865d706571b296b68f 100644 (file)
 #ifndef VG_LOADER_H
 #define VG_LOADER_H
 
-#include "common.h"
+#define VG_GAME
+#include "vg/vg.h"
+#include "vg/vg_shader.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 void vg_loader_start( void(*pfn)(void *data), void *data );
+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 new foreground shader */
    .vs = 
    {
       .orig_file = NULL,
@@ -38,17 +42,37 @@ static struct vg_shader _shader_loader =
       
       "out vec4 FragColor;"
       "uniform float uTime;"
+      "uniform float uRatio;"
+      "uniform float uOpacity;"
       "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()"
       "{"
-         "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)*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) );"
+         
+         "vec2 uvx = aUv - vec2( 0.5 );"
+         "uvx.x *= uRatio;"
+         "uvx.y *= 0.75;"
+
+         "float zero = eval_zero( uvx );"
 
-         "FragColor = vec4(vec3(0.5,0.5,0.5)*grad*fmt1,1.0);"
+         "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),uOpacity);"
       "}"
    }
 };
@@ -56,8 +80,7 @@ static struct vg_shader _shader_loader =
 static struct vg_loader
 {
    /* Shutdown steps */
-   struct loader_free_step
-   {
+   struct loader_free_step{
       void (*fn_free)(void);
    }
    step_buffer[16];
@@ -67,7 +90,7 @@ static struct vg_loader
 }
 vg_loader;
 
-VG_STATIC void _vg_loader_init(void)
+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 };
@@ -84,10 +107,10 @@ VG_STATIC void _vg_loader_init(void)
    VG_CHECK_GL_ERR();
 
    if( !vg_shader_compile( &_shader_loader ) )
-      vg_fatal_exit_loop( "failed to compile shader" );
+      vg_fatal_error( "failed to compile shader" );
 }
 
-VG_STATIC void _vg_loader_free(void)
+static void _vg_loader_free(void)
 {
    vg_info( "vg_loader_free\n" );
    glDeleteVertexArrays( 1, &vg_loader.vao );
@@ -101,12 +124,11 @@ VG_STATIC void _vg_loader_free(void)
       vg_info( " -> %p\n", step->fn_free );
       step->fn_free();
    }
-
-   vg_info( "done\n" );
 }
 
-VG_STATIC void _vg_render_log(void)
+static void _vg_render_log(void)
 {
+#if 0
    ui_begin( vg.window_x, vg.window_y );
    SDL_AtomicLock( &log_print_sl );
 
@@ -122,8 +144,7 @@ VG_STATIC void _vg_render_log(void)
    vg_uictx.cursor[3] = fh;
        ui_fill_x();
 
-   for( int i=0; i<lines_to_draw; i ++ )
-   {
+   for( int i=0; i<lines_to_draw; i ++ ){
       ptr --;
 
       if( ptr < 0 )
@@ -137,75 +158,89 @@ VG_STATIC void _vg_render_log(void)
 
    ui_resolve();
    ui_draw( NULL );
+#endif
 }
 
-VG_STATIC void _vg_loader_render(void)
+static void _vg_loader_render_ring( float opacity )
 {
-   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 );
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+   glBlendEquation(GL_FUNC_ADD);
 
    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 );
+   glUniform1f( glGetUniformLocation( _shader_loader.id, "uOpacity"), opacity );
    glBindVertexArray( vg_loader.vao );
    glDrawArrays( GL_TRIANGLES, 0, 6 );
+}
+
+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 );
 
    _vg_render_log();
+   vg.loader_ring = 1.0f;
 }
 
 
-VG_STATIC void vg_load_full(void);
+static void vg_load_full(void);
 
-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 );
+static int _vg_loader_thread( void *pfn ){
+   if( setjmp( vg.env_loader_exit ) )
+      return 0;
 
    /* Run client loader */
-   void (*call_func)(void) = pfn;
-   call_func();
+   vg_info( "Starting client loader thread @%p\n", pfn );
+   void (*call_func)(void *data) = pfn;
+   call_func( vg.thread_data );
 
    SDL_SemPost( vg.sem_loader );
    vg.thread_id_loader = 0;
 
-   vg_acquire_thread_sync();
-   vg.is_loaded = 1;
-   vg_release_thread_sync();
+   return 0;
+}
+
+static int vg_loader_availible(void){
+   if( SDL_SemValue( vg.sem_loader ) ){
+      if( !(vg_async.start) )
+         return 1;
+   }
 
    return 0;
 }
 
-VG_STATIC void vg_loader_start( void(*pfn)(void) )
+static void vg_loader_start( void(*pfn)(void *data), void *data )
 {
-   vg.is_loaded = 0;
    SDL_SemWait( vg.sem_loader );
+
+   vg.thread_data = data;
    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_step( void( *fn_load )(void), void( *fn_free )(void) )
+static void vg_loader_step( void( *fn_load )(void), void( *fn_free )(void) )
 {
    if( fn_load )
       fn_load();
 
-   if( fn_free )
-   {
+   if( fn_free ){
       struct loader_free_step step;
       step.fn_free = fn_free;
 
       if( vg_loader.step_count == vg_list_size(vg_loader.step_buffer) )
-         vg_fatal_exit_loop( "Too many free steps" );
+         vg_fatal_error( "Too many free steps" );
 
       vg_loader.step_buffer[ vg_loader.step_count ++ ] = step;
    }
 
-   _vg_ensure_engine_running();
+   /* TODO: There was a quit checker here, re-add this? */
 }
 
 #endif /* VG_LOADER_H */