Material: Add -d:myouStoreGLSL and setOverrideXXCode() to live edit shaders.

This commit is contained in:
Alberto Torres 2024-12-16 21:21:18 +01:00
parent 8155c53314
commit 6d6c807ff2
2 changed files with 32 additions and 11 deletions

View file

@ -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")

View file

@ -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