Material: Add -d:myouStoreGLSL
and setOverrideXXCode()
to live edit shaders.
This commit is contained in:
parent
8155c53314
commit
6d6c807ff2
2 changed files with 32 additions and 11 deletions
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue