Wed, 02 Jul 2025 23:21:17 +0200
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 | 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 | 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 | 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 | 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 | 155 | } |
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 | } |