3cad2356b1d35077027c1d983f87bda576ae5b4c
1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
6 #define STB_INCLUDE_IMPLEMENTATION
7 #define STB_INCLUDE_LINE_GLSL
8 #include "stb/stb_include.h"
10 const char *vg_shader_gl_ver
= "#version 330 core\n";
19 const char *orig_file
,
27 ** vg_shaders_active
= NULL
;
29 static GLuint
vg_shader_subshader( const char *src
, GLint gliShaderType
)
31 GLint shader
= glCreateShader( gliShaderType
);
33 if( shader
== GL_NONE
)
35 vg_error( "Could not 'glCreateShader()'\n" );
39 glShaderSource( shader
, 2, (const char*[2]){ vg_shader_gl_ver
, src
}, NULL
);
40 glCompileShader( shader
);
43 glGetShaderiv( shader
, GL_COMPILE_STATUS
, &status
);
45 if( status
!= GL_TRUE
)
50 glGetShaderInfoLog( shader
, sizeof(info
), &len
, info
);
51 vg_error( "Error info:\n%s\n", info
);
58 static int vg_shader_compile( struct vg_shader
*shader
)
60 vg_info( "Compile shader '%s'\n", shader
->name
);
62 GLuint program
, vert
, frag
;
63 const char *svs
, *sfs
;
68 /* If we are compiling this again, we obviously need to try to take the src
69 * from the disk instead.
71 * Only do this if we have filenames set on the shader, so engine shaders
72 * dont have to do it (text.. etc).
74 if( shader
->compiled
)
76 if( shader
->vs
.orig_file
&& shader
->fs
.orig_file
)
83 svs
= shader
->vs
.static_src
;
84 sfs
= shader
->fs
.static_src
;
90 strcpy( path
, shader
->vs
.orig_file
);
91 avs
= stb_include_file( path
, "", "../../shaders", error
);
93 strcpy( path
, shader
->fs
.orig_file
);
94 afs
= stb_include_file( path
, "", "../../shaders", error
);
98 vg_error( "Could not find shader source files (%s)\n",
99 shader
->vs
.orig_file
);
110 vert
= vg_shader_subshader( svs
, GL_VERTEX_SHADER
);
111 frag
= vg_shader_subshader( sfs
, GL_FRAGMENT_SHADER
);
122 program
= glCreateProgram();
124 glAttachShader( program
, vert
);
125 glAttachShader( program
, frag
);
126 glLinkProgram( program
);
128 glDeleteShader( vert
);
129 glDeleteShader( frag
);
131 /* Check for link errors */
133 int success_link
= 1;
135 glGetProgramiv( program
, GL_LINK_STATUS
, &success_link
);
138 glGetProgramInfoLog( program
, 512, NULL
, infoLog
);
139 vg_error( "Link failed: %s\n", infoLog
);
140 glDeleteProgram( program
);
144 if( shader
->compiled
)
145 glDeleteProgram( shader
->id
);
147 shader
->id
= program
;
148 shader
->compiled
= 1;
154 static void vg_shaders_free(void)
156 for( int i
= 0; i
< arrlen( vg_shaders_active
); i
++ )
158 struct vg_shader
*shader
= vg_shaders_active
[i
];
160 if( shader
->compiled
)
161 glDeleteProgram( shader
->id
);
164 arrfree( vg_shaders_active
);
167 static int vg_shaders_recompile(int argc
, const char *argv
[])
169 vg_info( "Compiling shaders\n" );
170 for( int i
= 0; i
< arrlen( vg_shaders_active
); i
++ )
172 struct vg_shader
*shader
= vg_shaders_active
[i
];
173 vg_shader_compile( shader
);
179 static void vg_shader_register( struct vg_shader
*shader
)
181 shader
->compiled
= 0;
182 shader
->id
= 0; /* TODO: make this an error shader */
183 arrpush( vg_shaders_active
, shader
);
186 #endif /* VG_SHADER_H */