simplify gitignore
[vg.git] / src / vg / vg_shader.h
index a6c7a0b13ff4723e86927dd3d15e04513225fb4c..516d1a84c67587c7e44d56fe2853c870de252138 100644 (file)
@@ -6,30 +6,42 @@
 #include "vg/vg.h"
 #include "vg/vg_platform.h"
 
+#if 0
 #define STB_INCLUDE_IMPLEMENTATION
 #define STB_INCLUDE_LINE_GLSL
+#define STB_MALLOC  vg_alloc
+#define STB_FREE    vg_free
+#define STB_REALLOC vg_realloc
 #include "stb/stb_include.h"
+#endif
 
 const char *vg_shader_gl_ver = "#version 330 core\n";
 
-struct vg_shader
-{
-       GLuint id;
-   const char *name;
+typedef struct vg_shader vg_shader;
 
-   struct vg_subshader
+struct
+{
+   struct vg_shader
    {
-      const char *orig_file,
-                 *static_src;
-   }
-   vs, fs;
+      GLuint id;
+      const char *name;
+
+      struct vg_subshader
+      {
+         const char *orig_file,
+                    *static_src;
+      }
+      vs, fs;
 
-   void (*link)(void);
-   int compiled;
+      void (*link)(void);
+      int compiled;
+   }
+   * shaders[32];
+   u32 count;
 }
-** vg_shaders_active = NULL;
+static vg_shaders;
 
-static GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
+VG_STATIC GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
 {
        GLint shader = glCreateShader( gliShaderType );
 
@@ -58,7 +70,7 @@ static GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
        return shader;
 }
 
-static int vg_shader_compile( struct vg_shader *shader )
+VG_STATIC int vg_shader_compile( struct vg_shader *shader )
 {
        vg_info( "Compile shader '%s'\n", shader->name );
        
@@ -88,6 +100,9 @@ static int vg_shader_compile( struct vg_shader *shader )
    }
    else
    {
+      vg_fatal_exit_loop( "Unimplemented" );
+
+#if 0
       char error[260];
       char path[260];
       strcpy( path, shader->vs.orig_file );
@@ -101,23 +116,26 @@ static int vg_shader_compile( struct vg_shader *shader )
          vg_error( "Could not find shader source files (%s)\n",
                shader->vs.orig_file );
 
-         free( avs );
-         free( afs );
+         vg_free( avs );
+         vg_free( afs );
          return 0;
       }
 
       svs = avs;
       sfs = afs;
+#endif
    }
        
        vert = vg_shader_subshader( svs, GL_VERTEX_SHADER );
        frag = vg_shader_subshader( sfs, GL_FRAGMENT_SHADER );
        
+#if 0
    if( !static_src )
    {
       free( avs );
       free( afs );
    }
+#endif
 
        if( !vert || !frag )
                return 0;
@@ -154,7 +172,7 @@ static int vg_shader_compile( struct vg_shader *shader )
        return 1;
 }
 
-static void vg_free_shader( struct vg_shader *shader )
+VG_STATIC void vg_free_shader( struct vg_shader *shader )
 {
    if( shader->compiled )
    {
@@ -163,39 +181,39 @@ static void vg_free_shader( struct vg_shader *shader )
    }
 }
 
-static void vg_shaders_free(void *nothing)
-{
-       for( int i = 0; i < arrlen( vg_shaders_active ); i ++ )
-       {
-               struct vg_shader *shader = vg_shaders_active[i];
-               
-               if( shader->compiled )
-                       glDeleteProgram( shader->id );
-       }
-       
-       arrfree( vg_shaders_active );
-}
-
-static int vg_shaders_recompile(void)
+VG_STATIC void vg_shaders_compile(void)
 {
        vg_info( "Compiling shaders\n" );
 
-       for( int i=0; i<arrlen( vg_shaders_active ); i ++ )
+       for( int i=0; i<vg_shaders.count; i ++ )
        {
-               struct vg_shader *shader = vg_shaders_active[i];
+               vg_shader *shader = vg_shaders.shaders[i];
 
                if( !vg_shader_compile( shader ) )
-         return 0;
+         vg_fatal_exit_loop( "Failed to compile shader" );
        }
+}
 
-   return 1;
+VG_STATIC int vg_shaders_live_recompile(int argc, const char *argv[])
+{
+   vg_info( "Recompiling shaders\n" );
+   for( int i=0; i<vg_shaders.count; i ++ )
+   {
+      struct vg_shader *shader = vg_shaders.shaders[i];
+      vg_shader_compile( shader );
+   }
+
+   return 0;
 }
 
-static void vg_shader_register( struct vg_shader *shader )
+VG_STATIC void vg_shader_register( struct vg_shader *shader )
 {
+   if( vg_shaders.count == vg_list_size(vg_shaders.shaders) )
+      vg_fatal_exit_loop( "Too many shaders" );
+
    shader->compiled = 0;
    shader->id = 0;         /* TODO: make this an error shader */
-   arrpush( vg_shaders_active, shader );
+   vg_shaders.shaders[ vg_shaders.count ++ ] = shader;
 }
 
 #endif /* VG_SHADER_H */