replace VG_STATIC -> static
[vg.git] / vg_loader.h
index f62763d5ca63445115a206cb3fc5d296efefbac0..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 old background shader */
-#if 0
-   .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;"
-      "in vec2 aUv;"
-      
-      "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) );"
-
-         "FragColor = vec4(vec3(0.5,0.5,0.5)*grad*fmt1,1.0);"
-      "}"
-   }
-#else
-
    /* This is the new foreground shader */
-
    .vs = 
    {
       .orig_file = NULL,
@@ -78,6 +43,7 @@ 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 )"
@@ -95,7 +61,6 @@ static struct vg_shader _shader_loader =
       
       "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 );"
@@ -107,18 +72,15 @@ static struct vg_shader _shader_loader =
          "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);"
+         "FragColor = vec4(vec3(fmt1),uOpacity);"
       "}"
    }
-
-#endif
 };
 
 static struct vg_loader
 {
    /* Shutdown steps */
-   struct loader_free_step
-   {
+   struct loader_free_step{
       void (*fn_free)(void);
    }
    step_buffer[16];
@@ -128,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 };
@@ -148,7 +110,7 @@ VG_STATIC void _vg_loader_init(void)
       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 );
@@ -162,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 );
 
@@ -197,25 +158,11 @@ 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 );
-
-#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);
@@ -224,23 +171,33 @@ VG_STATIC void _vg_loader_render(void)
        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 );
-#endif
 }
 
+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_STATIC void vg_load_full(void);
+   _vg_render_log();
+   vg.loader_ring = 1.0f;
+}
 
-VG_STATIC int _vg_loader_thread(void *pfn)
-{
+
+static void vg_load_full(void);
+
+static int _vg_loader_thread( void *pfn ){
    if( setjmp( vg.env_loader_exit ) )
       return 0;
 
    /* Run client loader */
    vg_info( "Starting client loader thread @%p\n", pfn );
-   void (*call_func)(void) = pfn;
-   call_func();
+   void (*call_func)(void *data) = pfn;
+   call_func( vg.thread_data );
 
    SDL_SemPost( vg.sem_loader );
    vg.thread_id_loader = 0;
@@ -248,16 +205,27 @@ VG_STATIC int _vg_loader_thread(void *pfn)
    return 0;
 }
 
-VG_STATIC void vg_loader_start( void(*pfn)(void) )
+static int vg_loader_availible(void){
+   if( SDL_SemValue( vg.sem_loader ) ){
+      if( !(vg_async.start) )
+         return 1;
+   }
+
+   return 0;
+}
+
+static void vg_loader_start( void(*pfn)(void *data), void *data )
 {
    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();