/* * Copyright (C) 2018-2020 - Vito Caputo - * * 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 . */ #include #include #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 pattern 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", } ); }