diff options
| author | Vito Caputo <vcaputo@pengaru.com> | 2020-07-31 16:54:31 -0700 |
|---|---|---|
| committer | Vito Caputo <vcaputo@pengaru.com> | 2020-07-31 16:54:31 -0700 |
| commit | 94de2291e005f1c646fd779e8d32b2820e22e071 (patch) | |
| tree | 988bb9fde53a73edf948dd14fec07802a2f42406 /src/checker-node.c | |
| parent | cd7e9ebd9675461f59d5f7a9c7c0a9a1a0536d12 (diff) | |
*: initial implementation of pig
This is nothing to write home about, but it provides a little sandbox for
developing shader-generated textures in the spirit of shadertoy or the
demoscene tool bonzomatic.
It's more oriented towards developing shaders for use with libstage in
the small games I've been hacking on.
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", + } + ); +} |
