Tue, 28 Oct 2025 22:03:06 +0100
fix that dependencies for tools are always checked
| 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: 
163diff
changeset | 28 | #include "ascension/shader.h" | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 29 | |
| 86 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
83diff
changeset | 30 | #include "ascension/context.h" | 
| 106 
895f92cff6b8
bring back error.h to reduce compile dependencies
 Mike Becker <universe@uap-core.de> parents: 
95diff
changeset | 31 | #include "ascension/error.h" | 
| 86 
943bf9d7c6d6
make asset paths configurable
 Mike Becker <universe@uap-core.de> parents: 
83diff
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: 
95diff
changeset | 34 | #include <string.h> | 
| 
895f92cff6b8
bring back error.h to reduce compile dependencies
 Mike Becker <universe@uap-core.de> parents: 
95diff
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: 
77diff
changeset | 37 | #include <cx/buffer.h> | 
| 
9bc544f4ce8f
go back to reading shader code from files
 Mike Becker <universe@uap-core.de> parents: 
77diff
changeset | 38 | #include <cx/streams.h> | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 39 | |
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 40 | static char *asc_shader_load_code_file(const char *filename) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 41 | cxmutstr fpath = asc_filesystem_combine_paths(cx_strcast(asc_context.shader_path), cx_str(filename)); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 42 | asc_dprintf("Load shader code from %" CX_PRIstr, CX_SFMT(fpath)); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 43 | FILE *f = fopen(fpath.ptr, "r"); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 44 | cx_strfree(&fpath); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 45 | CxBuffer buffer; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 46 | if (f == NULL || cxBufferInit(&buffer, NULL, 1024, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND)) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 47 | return NULL; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 48 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 49 | cx_stream_copy(f, &buffer, (cx_read_func) fread, cxBufferWriteFunc); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 50 | cxBufferPut(&buffer, '\0'); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 51 | cxBufferShrink(&buffer, 0); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 52 | return buffer.space; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 53 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 54 | |
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 55 | /** | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 56 | * 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: 
50diff
changeset | 57 | * | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 58 | * 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: 
50diff
changeset | 59 | * | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 60 | * @param type the shader type (use the GL enum) | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 61 | * @param code the source code information | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 62 | * @return the compiled shader | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 63 | */ | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 64 | static unsigned asc_shader_compile(unsigned int type, struct asc_shader_code_s code) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 65 | // try to load the source code, first | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 66 | char *source_text = asc_shader_load_code_file(code.source_file); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 67 | if (source_text == NULL) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 68 | asc_error("Failed to load shader source code from %s", code.source_file); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 69 | return 0; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 70 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 71 | |
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 72 | // create the shader | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 73 | GLuint id = glCreateShader(type); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 74 | if (id == 0) { | 
| 92 | 75 | asc_error("glCreateShader failed: %s", glGetError()); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 76 | return 0; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 77 | } | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 78 | |
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 79 | const unsigned max_code_parts = 128+3; // version + preamble + line 1 + source text | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 80 | const char *code_array[max_code_parts]; | 
| 160 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 81 | GLsizei code_count = 0; | 
| 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 82 | code_array[code_count++] = "#version 400 core\n"; | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 83 | uint64_t test_flag = 1; | 
| 160 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 84 | unsigned select_index = 0; | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 85 | while (test_flag <= code.preamble_code_flags) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 86 | if (asc_test_flag(code.preamble_code_flags, test_flag)) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 87 | code_array[code_count++] = code.preamble_code[select_index]; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 88 | code_array[code_count++] = "\n"; | 
| 160 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 89 | } | 
| 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 90 | select_index++; | 
| 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 91 | test_flag <<= 1; | 
| 
80700db530ff
improve the combination of shader preprocessor flags
 Mike Becker <universe@uap-core.de> parents: 
158diff
changeset | 92 | } | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 93 | code_array[code_count++] = "#line 1\n"; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 94 | code_array[code_count++] = source_text; | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
122diff
changeset | 95 | |
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
122diff
changeset | 96 | // compile | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 97 | glShaderSource(id, code_count, code_array, NULL); | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 98 | glCompileShader(id); | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 99 | |
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 100 | // free the source text | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 101 | cxFreeDefault(source_text); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 102 | |
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 103 | // check the compilation result | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 104 | GLint success; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 105 | glGetShaderiv(id, GL_COMPILE_STATUS, &success); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 106 | if (success) { | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 107 | asc_dprintf("Shader %u compiled", id); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 108 | return id; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 109 | } else { | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 110 | char *log = cxMallocDefault(1024); | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 111 | glGetShaderInfoLog(id, 1024, NULL, log); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 112 | glDeleteShader(id); | 
| 92 | 113 | asc_error("Shader %u compilation failed.\n%s", id, log); | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 114 | cxFreeDefault(log); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 115 | return 0; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 116 | } | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 117 | } | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 118 | |
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 119 | /** | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 120 | * This function links shaders into a program. | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 121 | * | 
| 163 
3628cc3c0483
change NULL-safety for shaders s.t. errors are reported only once per shader
 Mike Becker <universe@uap-core.de> parents: 
162diff
changeset | 122 | * 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: 
50diff
changeset | 123 | * | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 124 | * @param shader the shader IDs to link | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 125 | * @param n the number of shaders | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 126 | * @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: 
50diff
changeset | 127 | */ | 
| 163 
3628cc3c0483
change NULL-safety for shaders s.t. errors are reported only once per shader
 Mike Becker <universe@uap-core.de> parents: 
162diff
changeset | 128 | 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: 
162diff
changeset | 129 | prog->gl_id = 0; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 130 | GLint success; | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 131 | GLint id = glCreateProgram(); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 132 | 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: 
162diff
changeset | 133 | 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: 
162diff
changeset | 134 | 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: 
162diff
changeset | 135 | 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: 
162diff
changeset | 136 | } | 
| 92 | 137 | 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: 
162diff
changeset | 138 | return; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 139 | } | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 140 | for (unsigned i = 0; i < n; i++) { | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 141 | glAttachShader(id, shader[i]); | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 142 | } | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 143 | glLinkProgram(id); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 144 | glGetProgramiv(id, GL_LINK_STATUS, &success); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 145 | 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: 
162diff
changeset | 146 | 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: 
50diff
changeset | 147 | glDeleteShader(shader[i]); | 
| 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 148 | } | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 149 | if (success) { | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 150 | asc_dprintf("Shader Program %u linked.", id); | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 151 | prog->gl_id = id; | 
| 83 
f7ce0db6f72b
implement view matrix in sprite shader
 Mike Becker <universe@uap-core.de> parents: 
80diff
changeset | 152 | // by convention every shader shall have MVP matrices | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 153 | prog->model = glGetUniformLocation(id, "model"); | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 154 | prog->view = glGetUniformLocation(id, "view"); | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 155 | prog->projection = glGetUniformLocation(id, "projection"); | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 156 | } else { | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 157 | char *log = malloc(1024); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 158 | glGetProgramInfoLog(id, 1024, NULL, log); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 159 | glDeleteProgram(id); | 
| 92 | 160 | 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 | 161 | free(log); | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 162 | } | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 163 | } | 
| 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 164 | |
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 165 | void asc_shader_free(AscShaderProgram *program) { | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 166 | if (program->gl_id > 0) { | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 167 | asc_dprintf("Delete Shader Program %u", program->gl_id); | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 168 | glDeleteProgram(program->gl_id); | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 169 | } | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 170 | if (program->destr_func) { | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 171 | program->destr_func(program); | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 172 | } | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 173 | cxFreeDefault(program); | 
| 80 | 174 | } | 
| 175 | ||
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 176 | static bool asc_shader_invalid(const AscShaderProgram *program) { | 
| 163 
3628cc3c0483
change NULL-safety for shaders s.t. errors are reported only once per shader
 Mike Becker <universe@uap-core.de> parents: 
162diff
changeset | 177 | 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: 
162diff
changeset | 178 | } | 
| 
3628cc3c0483
change NULL-safety for shaders s.t. errors are reported only once per shader
 Mike Becker <universe@uap-core.de> parents: 
162diff
changeset | 179 | |
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 180 | AscShaderProgram *asc_shader_create(AscShaderCodes code_info, size_t mem_size, asc_shader_init_func init_func, int flags) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 181 | unsigned shader[2]; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 182 | unsigned n = 0; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 183 | if (code_info.vtx.source_file != NULL) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 184 | shader[n++] = asc_shader_compile(GL_VERTEX_SHADER, code_info.vtx); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 185 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 186 | if (code_info.frag.source_file != NULL) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 187 | shader[n++] = asc_shader_compile(GL_FRAGMENT_SHADER, code_info.frag); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 188 | } | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 189 | #ifndef NDEBUG | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 190 | // in debug mode, exit early when a shader compilation failed | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 191 | for (unsigned i = 0 ; i < n ; i++) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 192 | if (shader[i] == 0) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 193 | for (unsigned j = 0; j < n; j++) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 194 | if (shader[j] > 0) { | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 195 | asc_dprintf("Delete shader: %u", shader[j]); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 196 | glDeleteShader(shader[j]); | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 197 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 198 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 199 | return NULL; | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 200 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 201 | } | 
| 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 202 | #endif | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 203 | AscShaderProgram *shader_program = cxZallocDefault(mem_size); | 
| 223 
4f32c7755138
clean up the messy shader code specification
 Mike Becker <universe@uap-core.de> parents: 
222diff
changeset | 204 | if (shader_program != NULL) { | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 205 | asc_shader_link(shader, n, shader_program); | 
| 77 
2187a732f4d7
prepare code for embedding shader sources with c23 #embed
 Mike Becker <universe@uap-core.de> parents: 
50diff
changeset | 206 | } | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 207 | if (asc_error_catch_gl("Compile and link shader") || asc_shader_invalid(shader_program)) { | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 208 | asc_shader_free(shader_program); | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 209 | return NULL; | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 210 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 211 | |
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 212 | init_func(shader_program, flags); | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 213 | |
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 214 | if (asc_error_catch_gl("Initializing shader")) { | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 215 | asc_shader_free(shader_program); | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 216 | return NULL; | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 217 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 218 | |
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 219 | return shader_program; | 
| 15 
362b7659dc76
add shader loading and unloading
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 220 | } | 
| 78 
9bc544f4ce8f
go back to reading shader code from files
 Mike Becker <universe@uap-core.de> parents: 
77diff
changeset | 221 | |
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 222 | |
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 223 | int asc_shader_use(const AscShaderProgram *shader, const AscCamera *camera) { | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 224 | if (asc_shader_invalid(shader)) { | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 225 | 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: 
140diff
changeset | 226 | glUseProgram(0); | 
| 224 
f72b80448413
fix broken nullptr handling in asc_shader_use() - fixes #696
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 227 | return -1; | 
| 
f72b80448413
fix broken nullptr handling in asc_shader_use() - fixes #696
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 228 | } | 
| 
f72b80448413
fix broken nullptr handling in asc_shader_use() - fixes #696
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 229 | if (asc_active_glctx->active_program == shader->gl_id) { | 
| 
f72b80448413
fix broken nullptr handling in asc_shader_use() - fixes #696
 Mike Becker <universe@uap-core.de> parents: 
223diff
changeset | 230 | // already using this shader - continue | 
| 169 
6e6717d9c776
improve "polymorphic" typing of shaders
 Mike Becker <universe@uap-core.de> parents: 
168diff
changeset | 231 | return 0; | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 232 | } | 
| 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 233 | asc_active_glctx->active_program = shader->gl_id; | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 234 | glUseProgram(shader->gl_id); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
122diff
changeset | 235 | 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: 
122diff
changeset | 236 | glUniformMatrix4fv(shader->view, 1, GL_FALSE, camera->view); | 
| 221 
14eddd43b3f7
slightly improve error handling
 Mike Becker <universe@uap-core.de> parents: 
169diff
changeset | 237 | return asc_error_catch_gl("Activating shader"); | 
| 137 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
122diff
changeset | 238 | } | 
| 
f8e6e0ae61a8
remove pre-defined dummy textures by introducing conditional compilation for shaders
 Mike Becker <universe@uap-core.de> parents: 
122diff
changeset | 239 | |
| 239 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 240 | const AscShaderProgram *asc_shader_lookup(unsigned int id, asc_shader_create_func create_func, int create_flags) { | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 241 | AscShaderProgram *prog = NULL; | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 242 | CxIterator iter = cxListIterator(asc_active_glctx->shaders); | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 243 | cx_foreach(AscShaderProgram *, p, iter) { | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 244 | if (p->id == id) { | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 245 | prog = p; | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 246 | break; | 
| 144 
43636d6a6e25
do not try to use one distinct render group for each different shader
 Mike Becker <universe@uap-core.de> parents: 
140diff
changeset | 247 | } | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 248 | } | 
| 225 
c42c7d1a3c34
prevent attempts to load a shader again that already failed before
 Mike Becker <universe@uap-core.de> parents: 
224diff
changeset | 249 | if (prog == NULL) { | 
| 239 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 250 | AscGLContext *glctx = asc_active_glctx; | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 251 | prog = create_func(create_flags); | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 252 | if (prog == NULL) { | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 253 | // create an empty program to prevent future loading attempts | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 254 | prog = cxZallocDefault(sizeof(AscShaderProgram)); | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 255 | } | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 256 | prog->id = id; | 
| 
3b78ad115ccd
remove the possibility of non-lazy-initializable shader programs
 Mike Becker <universe@uap-core.de> parents: 
225diff
changeset | 257 | cxListAdd(glctx->shaders, prog); | 
| 139 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 258 | } | 
| 
5d655459db85
refactor shader management - resolves #684
 Mike Becker <universe@uap-core.de> parents: 
137diff
changeset | 259 | return prog; | 
| 140 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
139diff
changeset | 260 | } | 
| 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
139diff
changeset | 261 | |
| 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
139diff
changeset | 262 | void asc_shader_clear_registry(void) { | 
| 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
139diff
changeset | 263 | 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: 
140diff
changeset | 264 | // 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: 
140diff
changeset | 265 | asc_shader_use(NULL, NULL); | 
| 271 
ddcf637587ce
move debug output regarding clearing the shader registry to the respective function
 Mike Becker <universe@uap-core.de> parents: 
270diff
changeset | 266 | asc_dprintf("Shader cache cleared."); | 
| 140 
d190fe5315bd
add dynamic reload of all shaders
 Mike Becker <universe@uap-core.de> parents: 
139diff
changeset | 267 | } | 
| 167 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 268 | |
| 168 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
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: 
167diff
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: 
167diff
changeset | 271 | } | 
| 
f70569c49c24
add abstractions that allow removing dependencies to glew.h
 Mike Becker <universe@uap-core.de> parents: 
167diff
changeset | 272 | |
| 270 
3031d1bb5957
further improve names and docu of the uniform location init functions
 Mike Becker <universe@uap-core.de> parents: 
269diff
changeset | 273 | void asc_shader_set_uniform_loc(AscShaderProgram *shader, off_t mem_offset, const char *name) { | 
| 222 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 274 | *((asc_uniform_loc*)((char *) shader + mem_offset)) = glGetUniformLocation(shader->gl_id, name); | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 275 | } | 
| 
2cb9a71df7a6
vastly deduplicate shader creation code
 Mike Becker <universe@uap-core.de> parents: 
221diff
changeset | 276 | |
| 167 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 277 | 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: 
163diff
changeset | 278 | glUniformMatrix4fv(shader->model, 1,GL_FALSE, node->world_transform); | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 279 | } | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 280 | |
| 256 
60014484121c
remove the asc_col4i datatype in favor of a unified asc_color type
 Mike Becker <universe@uap-core.de> parents: 
239diff
changeset | 281 | void asc_shader_upload_color(int uniform_id, asc_color color) { | 
| 167 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 282 | 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: 
163diff
changeset | 283 | } | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 284 | |
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 285 | void asc_shader_upload_float(int uniform_id, float value) { | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 286 | glUniform1f(uniform_id, value); | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 287 | } | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 288 | |
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 289 | 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: 
163diff
changeset | 290 | glUniform2f(uniform_id, value.x, value.y); | 
| 
8e6a661c87db
add functions to upload common uniforms
 Mike Becker <universe@uap-core.de> parents: 
163diff
changeset | 291 | } |