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) =
|
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 =
|
func add_line_numbers(s: string, first: int=1):string =
|
||||||
var lines = s.strip(false, true, {'\n'}).split("\n")
|
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} float;",
|
||||||
&"precision {precision} int;",
|
&"precision {precision} int;",
|
||||||
|
&"precision {precision} sampler2DArray;",
|
||||||
&"precision {precision} sampler2DArrayShadow;",
|
&"precision {precision} sampler2DArrayShadow;",
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
|
@ -389,8 +406,9 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material,
|
||||||
).join("\n ")
|
).join("\n ")
|
||||||
vs = (version_line & extension_lines & vs_head & varyings_uniform_decl &
|
vs = (version_line & extension_lines & vs_head & varyings_uniform_decl &
|
||||||
attribute_lines & vertex_shader_library & modifiers_uniforms & varyings_decl & vs_body).join("\n")
|
attribute_lines & vertex_shader_library & modifiers_uniforms & varyings_decl & vs_body).join("\n")
|
||||||
when not defined(release):
|
when defined(myouStoreGLSL):
|
||||||
self.vs_code = vs
|
self.vs_code = vs
|
||||||
|
vs = override_vs_code.getOrDefault(vs, vs)
|
||||||
let vertex_shader = glCreateShader(GL_VERTEX_SHADER)
|
let vertex_shader = glCreateShader(GL_VERTEX_SHADER)
|
||||||
defer: glDeleteShader(vertex_shader)
|
defer: glDeleteShader(vertex_shader)
|
||||||
# TODO: make a pointer array from the unjoined strings, interleaved with "\n"
|
# 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)
|
glCompileShader(vertex_shader)
|
||||||
var fragment_shader: GLuint = 0
|
var fragment_shader: GLuint = 0
|
||||||
defer: glDeleteShader(fragment_shader)
|
defer: glDeleteShader(fragment_shader)
|
||||||
template fragment:string = fragment_lines.join("\n")
|
var fragment = fragment_lines.join("\n")
|
||||||
if has_fragment_shader:
|
if has_fragment_shader:
|
||||||
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER)
|
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER)
|
||||||
when not defined(release):
|
when defined(myouStoreGLSL):
|
||||||
self.fs_code = fragment
|
self.fs_code = fragment
|
||||||
var fragment2 = fragment.cstring
|
fragment = override_fs_code.getOrDefault(fragment, fragment)
|
||||||
glShaderSource(fragment_shader, 1, cast[cstringArray](addr fragment2), nil)
|
var fragmentc = fragment.cstring
|
||||||
|
glShaderSource(fragment_shader, 1, cast[cstringArray](addr fragmentc), nil)
|
||||||
glCompileShader(fragment_shader)
|
glCompileShader(fragment_shader)
|
||||||
let prog = glCreateProgram()
|
let prog = glCreateProgram()
|
||||||
defer:
|
defer:
|
||||||
|
@ -462,15 +481,17 @@ proc initShader*(self: Shader, engine: MyouEngine, material: Material,
|
||||||
return
|
return
|
||||||
glGetProgramiv(prog, GL_LINK_STATUS, addr success)
|
glGetProgramiv(prog, GL_LINK_STATUS, addr success)
|
||||||
if success == 0:
|
if success == 0:
|
||||||
|
console_error("================")
|
||||||
let error_msg = dedent &"""Error linking shader of material {material.name}
|
let error_msg = dedent &"""Error linking shader of material {material.name}
|
||||||
{material.varyings}
|
{material.varyings}
|
||||||
{get_program_info_log(prog)}"""
|
{get_program_info_log(prog)}"""
|
||||||
console_error("VS =============")
|
# console_error("VS =============")
|
||||||
console_error(vs)
|
# console_error(vs)
|
||||||
# console_error 'FS ============='
|
# console_error "FS ============="
|
||||||
# console_error fragment
|
# console_error fragment
|
||||||
console_error("================")
|
# console_error("================")
|
||||||
console_error error_msg
|
console_error error_msg
|
||||||
|
console_error("================")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.camera_render_ubo_index = glGetUniformBlockIndex(prog, "CameraRenderUniform")
|
self.camera_render_ubo_index = glGetUniformBlockIndex(prog, "CameraRenderUniform")
|
||||||
|
|
|
@ -584,7 +584,7 @@ type
|
||||||
shadowmap_location*: GLint
|
shadowmap_location*: GLint
|
||||||
cubemap_locations*: seq[GLint]
|
cubemap_locations*: seq[GLint]
|
||||||
|
|
||||||
when not defined(release):
|
when defined(myouStoreGLSL):
|
||||||
vs_code*, fs_code*: string
|
vs_code*, fs_code*: string
|
||||||
|
|
||||||
# texture.nim
|
# texture.nim
|
||||||
|
|
Loading…
Reference in a new issue