src/shader.c

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 169
6e6717d9c776
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
167
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
28 #include "ascension/shader.h"
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
29
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
30 #include "ascension/context.h"
106
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
31 #include "ascension/error.h"
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
32 #include "ascension/filesystem.h"
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33
106
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
34 #include <string.h>
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
35 #include <stdio.h>
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 #include <GL/glew.h>
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
37 #include <cx/buffer.h>
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
38 #include <cx/streams.h>
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
40 /**
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
41 * Compiles a shader from the given source code.
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
42 *
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
43 * The ID of the returned shader will be zero when something went wrong.
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
44 *
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
45 * @param type the shader type (use the GL enum)
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
46 * @param code the source code
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
47 * @param code_pp the optional preprocessor code
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
48 * @param code_pp_list list of optional preprocessor code
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
49 * @param code_pp_list_select selection flags for the preprocessor code list
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
50 * @return the compiled shader
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
51 */
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
52 static unsigned asc_shader_compile(unsigned int type, const char *code, const char *code_pp,
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
53 const char * const *code_pp_list, unsigned short code_pp_list_select) {
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 GLuint id = glCreateShader(type);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 if (id == 0) {
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
56 asc_error("glCreateShader failed: %s", glGetError());
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
57 return 0;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 }
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
60 GLint success;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
61 const char *code_array[20];
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
62 GLsizei code_count = 0;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
63 code_array[code_count++] = "#version 400 core\n";
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
64 if (code_pp != NULL) code_array[code_count++] = code_pp;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
65 unsigned test_flag = 1;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
66 unsigned select_index = 0;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
67 while (test_flag <= code_pp_list_select) {
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
68 if (asc_test_flag(code_pp_list_select, test_flag)) {
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
69 code_array[code_count++] = code_pp_list[select_index];
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
70 }
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
71 select_index++;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
72 test_flag <<= 1;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
73 }
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
74 code_array[code_count++] = "\n#line 1\n";
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
75 code_array[code_count++] = code;
152
c3ae2b2e8ff6 fix that some drivers fail to compile a shader when a code line is NULL with length zero
Mike Becker <universe@uap-core.de>
parents: 144
diff changeset
76
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
77 // compute the lengths
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
78 GLint length_array[20];
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
79 for (int i = 0; i < code_count ; i++) {
153
4116e2bd501b since we cannot pass NULL strings anyway, we do not need cxstring
Mike Becker <universe@uap-core.de>
parents: 152
diff changeset
80 length_array[i] = (GLint) strlen(code_array[i]);
4116e2bd501b since we cannot pass NULL strings anyway, we do not need cxstring
Mike Becker <universe@uap-core.de>
parents: 152
diff changeset
81 }
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
82
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
83 // compile
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
84 glShaderSource(id, code_count, code_array, length_array);
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 glCompileShader(id);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 glGetShaderiv(id, GL_COMPILE_STATUS, &success);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 if (success) {
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 asc_dprintf("Shader %u compiled", id);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
89 return id;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 } else {
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 char *log = malloc(1024);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 glGetShaderInfoLog(id, 1024, NULL, log);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 glDeleteShader(id);
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
94 asc_error("Shader %u compilation failed.\n%s", id, log);
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 free(log);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
96 return 0;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 }
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 }
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
100 /**
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
101 * This function links shaders into a program.
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
102 *
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
103 * The OpenGL ID of the program will be zero when something went wrong.
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
104 *
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
105 * @param shader the shader IDs to link
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
106 * @param n the number of shaders
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
107 * @param prog the struct where to store the result
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
108 */
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
109 static void asc_shader_link(unsigned shader[], unsigned n, AscShaderProgram *prog) {
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
110 prog->gl_id = 0;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 GLint success;
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 GLint id = glCreateProgram();
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 if (id <= 0) {
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
114 for (unsigned i = 0; i < n; i++) {
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
115 asc_dprintf("Delete shader: %u", shader[i]);
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
116 glDeleteShader(shader[i]);
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
117 }
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
118 asc_error("glCreateProgram failed: %s", glGetError());
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
119 return;
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 }
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
121 for (unsigned i = 0; i < n; i++) {
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
122 glAttachShader(id, shader[i]);
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
123 }
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 glLinkProgram(id);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 glGetProgramiv(id, GL_LINK_STATUS, &success);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
126 for (unsigned i = 0; i < n; i++) {
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
127 asc_dprintf("Delete shader: %u", shader[i]);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
128 glDeleteShader(shader[i]);
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
129 }
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 if (success) {
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
131 asc_dprintf("Shader Program %u linked.", id);
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
132 prog->gl_id = id;
83
f7ce0db6f72b implement view matrix in sprite shader
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
133 // by convention every shader shall have MVP matrices
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
134 prog->model = glGetUniformLocation(id, "model");
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
135 prog->view = glGetUniformLocation(id, "view");
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
136 prog->projection = glGetUniformLocation(id, "projection");
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 } else {
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 char *log = malloc(1024);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 glGetProgramInfoLog(id, 1024, NULL, log);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
140 glDeleteProgram(id);
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
141 asc_error("Linking shader program %u failed.\n%s", id, log);
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 free(log);
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143 }
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 }
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
146 void asc_shader_free(AscShaderProgram *program) {
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
147 if (program->gl_id > 0) {
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
148 asc_dprintf("Delete Shader Program %u", program->gl_id);
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
149 glDeleteProgram(program->gl_id);
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150 }
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
151 if (program->destr_func) {
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
152 program->destr_func(program);
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
153 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
154 cxFreeDefault(program);
80
9f7bfc0a1dc3 some minor improvements
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
155 }
9f7bfc0a1dc3 some minor improvements
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
156
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
157 bool asc_shader_invalid(const AscShaderProgram *program) {
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
158 return program == NULL || program->gl_id == 0;
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
159 }
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
160
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
161 AscShaderProgram *asc_shader_create(AscShaderCodes codes, size_t mem_size) {
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
162 AscShaderProgram *prog = cxZallocDefault(mem_size);
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
163 unsigned shader[2];
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
164 unsigned n = 0;
162
d3598c834f9b improve NULL-safety - fixes #690
Mike Becker <universe@uap-core.de>
parents: 161
diff changeset
165 // TODO: clean up this pp mess by introducing proper nested structs
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
166 if (codes.vtx) {
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
167 shader[n++] = asc_shader_compile(GL_VERTEX_SHADER, codes.vtx, codes.vtx_pp, codes.vtx_pp_list, codes.vtx_pp_list_select);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
168 }
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
169 if (codes.frag) {
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
170 shader[n++] = asc_shader_compile(GL_FRAGMENT_SHADER, codes.frag, codes.frag_pp, codes.frag_pp_list, codes.frag_pp_list_select);
77
2187a732f4d7 prepare code for embedding shader sources with c23 #embed
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
171 }
163
3628cc3c0483 change NULL-safety for shaders s.t. errors are reported only once per shader
Mike Becker <universe@uap-core.de>
parents: 162
diff changeset
172 asc_shader_link(shader, n, prog);
15
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
173 return prog;
362b7659dc76 add shader loading and unloading
Mike Becker <universe@uap-core.de>
parents:
diff changeset
174 }
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
175
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
176 int asc_shader_use(const AscShaderProgram *shader, const AscCamera *camera) {
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
177 if (shader == NULL) {
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
178 asc_active_glctx->active_program = 0;
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
179 glUseProgram(0);
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
180 return 0;
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
181 }
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
182 if (asc_active_glctx->active_program == shader->gl_id) return 0;
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
183 if (asc_shader_invalid(shader)) return -1;
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
184 asc_active_glctx->active_program = shader->gl_id;
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
185 glUseProgram(shader->gl_id);
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
186 glUniformMatrix4fv(shader->projection, 1, GL_FALSE, camera->projection);
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
187 glUniformMatrix4fv(shader->view, 1, GL_FALSE, camera->view);
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
188 return asc_error_catch_all_gl();
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
189 }
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
190
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
191 static int asc_shader_load_code_file(const char *filename, char **code) {
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
192 if (filename == NULL) {
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
193 *code = NULL;
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
194 return 0;
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
195 }
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
196 cxmutstr fpath = asc_filesystem_combine_paths(cx_strcast(asc_context.shader_path), cx_str(filename));
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
197 asc_dprintf("Load shader code from %" CX_PRIstr, CX_SFMT(fpath));
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
198 FILE *f = fopen(fpath.ptr, "r");
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
199 cx_strfree(&fpath);
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
200 if (f == NULL) return -1;
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
201 CxBuffer buffer;
79
ed46a265b679 auto-extend buffer when loading shader code
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
202 cxBufferInit(&buffer, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND);
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
203 cx_stream_copy(f, &buffer, (cx_read_func) fread, cxBufferWriteFunc);
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
204 cxBufferPut(&buffer, '\0');
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
205 cxBufferShrink(&buffer, 0);
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
206 *code = buffer.space;
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
207 return *code == NULL ? -1 : 0;
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
208 }
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
209
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
210 int asc_shader_load_code_files(AscShaderCodeInfo info, AscShaderCodes *codes) {
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
211 int ret = 0;
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
212 ret |= asc_shader_load_code_file(info.files.vtx, &codes->vtx);
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
213 codes->vtx_pp = info.defines.vtx;
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
214 codes->vtx_pp_list = info.defines.vtx_list;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
215 codes->vtx_pp_list_select = info.defines.vtx_list_select;
137
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
216 ret |= asc_shader_load_code_file(info.files.frag, &codes->frag);
f8e6e0ae61a8 remove pre-defined dummy textures by introducing conditional compilation for shaders
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
217 codes->frag_pp = info.defines.frag;
160
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
218 codes->frag_pp_list = info.defines.frag_list;
80700db530ff improve the combination of shader preprocessor flags
Mike Becker <universe@uap-core.de>
parents: 158
diff changeset
219 codes->frag_pp_list_select = info.defines.frag_list_select;
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
220 return ret;
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
221 }
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
222
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
223 void asc_shader_free_codes(AscShaderCodes codes) {
122
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
224 cxFreeDefault(codes.vtx);
1b118cd3e369 replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
225 cxFreeDefault(codes.frag);
78
9bc544f4ce8f go back to reading shader code from files
Mike Becker <universe@uap-core.de>
parents: 77
diff changeset
226 }
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
227
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
228 const AscShaderProgram *asc_shader_register(unsigned int id, asc_shader_create_func create_func, int create_flags) {
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
229 AscGLContext *glctx = asc_active_glctx;
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
230 #ifndef NDEBUG
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
231 {
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
232 const AscShaderProgram *prog = asc_shader_lookup(id);
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
233 if (prog != NULL) {
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
234 asc_error("Shader program %u already exists. This is a bug!", id);
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
235 // still return it, so that the caller does not die immediately
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
236 return prog;
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
237 }
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
238 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
239 #endif
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 153
diff changeset
240 AscShaderProgram *prog = create_func(create_flags);
161
4c8b9c6d241f fix segfault when a shader does not compile
Mike Becker <universe@uap-core.de>
parents: 160
diff changeset
241 if (prog == NULL) return NULL;
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
242 prog->id = id;
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
243 cxListAdd(glctx->shaders, prog);
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
244 return prog;
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
245 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
246
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
247 const AscShaderProgram *asc_shader_lookup(unsigned int id) {
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
248 CxIterator iter = cxListIterator(asc_active_glctx->shaders);
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
249 cx_foreach(const AscShaderProgram *, prog, iter) {
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
250 if (prog->id == id) return prog;
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
251 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
252 return NULL;
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
253 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
254
169
6e6717d9c776 improve "polymorphic" typing of shaders
Mike Becker <universe@uap-core.de>
parents: 168
diff changeset
255 const AscShaderProgram *asc_shader_lookup_or_create(unsigned int id, asc_shader_create_func create_func, int create_flags) {
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
256 const AscShaderProgram *prog = asc_shader_lookup(id);
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
257 if (prog == NULL) {
158
f650994ec543 implement rounded corners
Mike Becker <universe@uap-core.de>
parents: 153
diff changeset
258 return asc_shader_register(id, create_func, create_flags);
139
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
259 }
5d655459db85 refactor shader management - resolves #684
Mike Becker <universe@uap-core.de>
parents: 137
diff changeset
260 return prog;
140
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 139
diff changeset
261 }
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 139
diff changeset
262
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 139
diff changeset
263 void asc_shader_clear_registry(void) {
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 139
diff changeset
264 cxListClear(asc_active_glctx->shaders);
144
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
265 // also clear the active program to avoid accidental matches with newly created shaders
43636d6a6e25 do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents: 140
diff changeset
266 asc_shader_use(NULL, NULL);
140
d190fe5315bd add dynamic reload of all shaders
Mike Becker <universe@uap-core.de>
parents: 139
diff changeset
267 }
167
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
268
168
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
269 asc_uniform_loc asc_shader_get_uniform_loc(const AscShaderProgram *shader, const char *name) {
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
270 return glGetUniformLocation(shader->gl_id, name);
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
271 }
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 167
diff changeset
272
167
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
273 void asc_shader_upload_model_matrix(const AscShaderProgram *shader, const AscSceneNode *node) {
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
274 glUniformMatrix4fv(shader->model, 1,GL_FALSE, node->world_transform);
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
275 }
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
276
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
277 void asc_shader_upload_col4f(int uniform_id, asc_col4f color) {
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
278 glUniform4f(uniform_id, color.red, color.green, color.blue, color.alpha);
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
279 }
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
280
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
281 void asc_shader_upload_float(int uniform_id, float value) {
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
282 glUniform1f(uniform_id, value);
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
283 }
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
284
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
285 void asc_shader_upload_vec2f(int uniform_id, asc_vec2f value) {
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
286 glUniform2f(uniform_id, value.x, value.y);
8e6a661c87db add functions to upload common uniforms
Mike Becker <universe@uap-core.de>
parents: 163
diff changeset
287 }

mercurial