diff options
Diffstat (limited to 'src/checker-node.c')
-rw-r--r-- | src/checker-node.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/checker-node.c b/src/checker-node.c new file mode 100644 index 0000000..a17d3f3 --- /dev/null +++ b/src/checker-node.c @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2018-2020 - Vito Caputo - <vcaputo@pengaru.com> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3 as published + * by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <SDL.h> + +#include <stage.h> + +#include "glad.h" +#include "m4f.h" +#include "checker-node.h" +#include "shader-node.h" +#include "v3f.h" + + +static const char *checker_vs = "" + "#version 120\n" + + "uniform mat4 model_x;" + + "attribute vec3 i_vertex;" + "attribute vec2 i_texcoord;" + + "void main()" + "{" + " gl_TexCoord[0].xy = i_texcoord;" + " gl_Position = model_x * vec4(i_vertex, 1.f);" + "}" +""; + + +static const char *checker_fs = "" + "#version 120\n" + + "uniform float alpha;" + "uniform vec3 color;" + + "void main()" + "{" + " int x = int(mod(gl_TexCoord[0].x * 20, 2));" + " int y = int(mod(gl_TexCoord[0].y * 20, 2));" + + " if (x == y) {" + " gl_FragColor = vec4(1.f - color, alpha);" + " } else {" + " gl_FragColor = vec4(.25f * color, alpha);" + " }" + "}" +""; + + +static void checker_uniforms(shader_t *shader, void *uniforms_ctxt, void *render_ctxt, unsigned n_uniforms, const int *uniforms, const m4f_t *model_x, float alpha) +{ + v3f_t *color = uniforms_ctxt; + + glUniform1f(uniforms[0], alpha); + glUniformMatrix4fv(uniforms[1], 1, GL_FALSE, &model_x->m[0][0]); + glUniform3f(uniforms[2], color->x, color->y, color->z); +} + + +/* create checker icon rendering stage */ +stage_t * checker_node_new(const stage_conf_t *conf, const m4f_t *model_x, const v3f_t *color) +{ + assert(model_x); + assert(color); + + return shader_node_new_src(conf, checker_vs, checker_fs, model_x, checker_uniforms, (void *)color, 3, + (const char *[]){ + "alpha", + "model_x", + "color", + } + ); +} |