diff --git a/src/graphics/material.nim b/src/graphics/material.nim index 2f5db52..44e7f7b 100644 --- a/src/graphics/material.nim +++ b/src/graphics/material.nim @@ -97,8 +97,24 @@ const VERTEX_SHADER_LIBRARY = dedent """ } """ +when defined(myouStoreGLSL): + var override_vs_code: Table[string, string] + var override_fs_code: Table[string, string] + proc setOverrideVSCode*(original, modified: string) = + if original == modified: + override_vs_code.del original + else: + override_vs_code[original] = modified + proc setOverrideFSCode*(original, modified: string) = + if original == modified: + override_fs_code.del original + else: + override_fs_code[original] = modified + + proc console_error(msg: string) = - echo msg + for l in msg.split '\n': + echo l func add_line_numbers(s: string, first: int=1):string = var lines = s.strip(false, true, {'\n'}).split("\n") @@ -208,6 +224,7 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material, @[ &"precision {precision} float;", &"precision {precision} int;", + &"precision {precision} sampler2DArray;", &"precision {precision} sampler2DArrayShadow;", ] else: @@ -389,8 +406,9 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material, ).join("\n ") vs = (version_line & extension_lines & vs_head & varyings_uniform_decl & attribute_lines & vertex_shader_library & modifiers_uniforms & varyings_decl & vs_body).join("\n") - when not defined(release): + when defined(myouStoreGLSL): self.vs_code = vs + vs = override_vs_code.getOrDefault(vs, vs) let vertex_shader = glCreateShader(GL_VERTEX_SHADER) defer: glDeleteShader(vertex_shader) # TODO: make a pointer array from the unjoined strings, interleaved with "\n" @@ -400,13 +418,14 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material, glCompileShader(vertex_shader) var fragment_shader: GLuint = 0 defer: glDeleteShader(fragment_shader) - template fragment:string = fragment_lines.join("\n") + var fragment = fragment_lines.join("\n") if has_fragment_shader: fragment_shader = glCreateShader(GL_FRAGMENT_SHADER) - when not defined(release): + when defined(myouStoreGLSL): self.fs_code = fragment - var fragment2 = fragment.cstring - glShaderSource(fragment_shader, 1, cast[cstringArray](addr fragment2), nil) + fragment = override_fs_code.getOrDefault(fragment, fragment) + var fragmentc = fragment.cstring + glShaderSource(fragment_shader, 1, cast[cstringArray](addr fragmentc), nil) glCompileShader(fragment_shader) let prog = glCreateProgram() defer: @@ -462,15 +481,17 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material, return glGetProgramiv(prog, GL_LINK_STATUS, addr success) if success == 0: + console_error("================") let error_msg = dedent &"""Error linking shader of material {material.name} {material.varyings} {get_program_info_log(prog)}""" - console_error("VS =============") - console_error(vs) - # console_error 'FS =============' + # console_error("VS =============") + # console_error(vs) + # console_error "FS =============" # console_error fragment - console_error("================") + # console_error("================") console_error error_msg + console_error("================") return self.camera_render_ubo_index = glGetUniformBlockIndex(prog, "CameraRenderUniform") diff --git a/src/types.nim b/src/types.nim index 85bd97d..e8eb8e8 100644 --- a/src/types.nim +++ b/src/types.nim @@ -584,7 +584,7 @@ type shadowmap_location*: GLint cubemap_locations*: seq[GLint] - when not defined(release): + when defined(myouStoreGLSL): vs_code*, fs_code*: string # texture.nim