simplify gitignore
[vg.git] / src / vg / vg_shader.h
index 6007a42dbd25bce96a97d0b2ced1586ef7b1a3af..516d1a84c67587c7e44d56fe2853c870de252138 100644 (file)
@@ -1,28 +1,47 @@
-/* TODO: TUrn off in release */
+/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
+
+#ifndef VG_SHADER_H
+#define VG_SHADER_H
+
+#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 );
 
@@ -51,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 );
        
@@ -81,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 );
@@ -94,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;
@@ -147,34 +172,48 @@ static int vg_shader_compile( struct vg_shader *shader )
        return 1;
 }
 
-static void vg_shaders_free(void)
+VG_STATIC void vg_free_shader( struct vg_shader *shader )
 {
-       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 );
+   if( shader->compiled )
+   {
+      glDeleteProgram( shader->id );
+      shader->compiled = 0;
+   }
 }
 
-static int vg_shaders_recompile(int argc, const char *argv[])
+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_compile( shader );
+               vg_shader *shader = vg_shaders.shaders[i];
+
+               if( !vg_shader_compile( shader ) )
+         vg_fatal_exit_loop( "Failed to compile shader" );
        }
+}
+
+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 */