1 /* TODO: TUrn off in release */
2 #define STB_INCLUDE_IMPLEMENTATION
3 #define STB_INCLUDE_LINE_GLSL
4 #include "stb/stb_include.h"
6 const char *vg_shader_gl_ver
= "#version 330 core\n";
15 const char *orig_file
,
23 ** vg_shaders_active
= NULL
;
25 static GLuint
vg_shader_subshader( const char *src
, GLint gliShaderType
)
27 GLint shader
= glCreateShader( gliShaderType
);
29 if( shader
== GL_NONE
)
31 vg_error( "Could not 'glCreateShader()'\n" );
35 glShaderSource( shader
, 2, (const char*[2]){ vg_shader_gl_ver
, src
}, NULL
);
36 glCompileShader( shader
);
39 glGetShaderiv( shader
, GL_COMPILE_STATUS
, &status
);
41 if( status
!= GL_TRUE
)
46 glGetShaderInfoLog( shader
, sizeof(info
), &len
, info
);
47 vg_error( "Error info:\n%s\n", info
);
54 static int vg_shader_compile( struct vg_shader
*shader
)
56 vg_info( "Compile shader '%s'\n", shader
->name
);
58 GLuint program
, vert
, frag
;
59 const char *svs
, *sfs
;
64 /* If we are compiling this again, we obviously need to try to take the src
65 * from the disk instead.
67 * Only do this if we have filenames set on the shader, so engine shaders
68 * dont have to do it (text.. etc).
70 if( shader
->compiled
)
72 if( shader
->vs
.orig_file
&& shader
->fs
.orig_file
)
79 svs
= shader
->vs
.static_src
;
80 sfs
= shader
->fs
.static_src
;
86 strcpy( path
, shader
->vs
.orig_file
);
87 avs
= stb_include_file( path
, "", "../shaders", error
);
89 strcpy( path
, shader
->fs
.orig_file
);
90 afs
= stb_include_file( path
, "", "../shaders", error
);
103 vert
= vg_shader_subshader( svs
, GL_VERTEX_SHADER
);
104 frag
= vg_shader_subshader( sfs
, GL_FRAGMENT_SHADER
);
115 program
= glCreateProgram();
117 glAttachShader( program
, vert
);
118 glAttachShader( program
, frag
);
119 glLinkProgram( program
);
121 glDeleteShader( vert
);
122 glDeleteShader( frag
);
124 /* Check for link errors */
126 int success_link
= 1;
128 glGetProgramiv( program
, GL_LINK_STATUS
, &success_link
);
131 glGetProgramInfoLog( program
, 512, NULL
, infoLog
);
132 vg_error( "Link failed: %s\n", infoLog
);
133 glDeleteProgram( program
);
137 if( shader
->compiled
)
138 glDeleteProgram( shader
->id
);
140 shader
->id
= program
;
141 shader
->compiled
= 1;
147 static void vg_shaders_free(void)
149 for( int i
= 0; i
< arrlen( vg_shaders_active
); i
++ )
151 struct vg_shader
*shader
= vg_shaders_active
[i
];
153 if( shader
->compiled
)
154 glDeleteProgram( shader
->id
);
157 arrfree( vg_shaders_active
);
160 static int vg_shaders_recompile(int argc
, const char *argv
[])
162 vg_info( "Compiling shaders\n" );
163 for( int i
= 0; i
< arrlen( vg_shaders_active
); i
++ )
165 struct vg_shader
*shader
= vg_shaders_active
[i
];
166 vg_shader_compile( shader
);
172 static void vg_shader_register( struct vg_shader
*shader
)
174 shader
->compiled
= 0;
175 shader
->id
= 0; /* TODO: make this an error shader */
176 arrpush( vg_shaders_active
, shader
);