def make_deferred(con_mesh): wrd = bpy.data.worlds['Arm'] make_base(con_mesh, parse_opacity=False) frag = con_mesh.frag vert = con_mesh.vert tese = con_mesh.tese if '_Veloc' in wrd.rp_defs: frag.add_out('vec4[3] fragColor') if tese == None: vert.add_uniform('mat4 prevWVP', link='_prevWorldViewProjectionMatrix') vert.add_out('vec4 wvpposition') vert.add_out('vec4 prevwvpposition') vert.write('wvpposition = gl_Position;') vert.write('prevwvpposition = prevWVP * spos;') else: vert.add_uniform('mat4 prevW', link='_prevWorldMatrix') vert.add_out('vec3 prevwposition') vert.write('prevwposition = vec4(prevW * spos).xyz;') tese.add_out('vec4 wvpposition') tese.add_out('vec4 prevwvpposition') tese.add_uniform('mat4 prevVP', '_prevViewProjectionMatrix') tese.write('wvpposition = gl_Position;') make_tess.interpolate(tese, 'prevwposition', 3) tese.write('prevwvpposition = prevVP * vec4(prevwposition, 1.0);') else: frag.add_out('vec4[2] fragColor') # Pack gbuffer frag.add_include('../../Shaders/std/gbuffer.glsl') frag.write('n /= (abs(n.x) + abs(n.y) + abs(n.z));') frag.write('n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);') # TODO: store_depth # frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);') frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), occlusion);') frag.write('fragColor[1] = vec4(basecol.rgb, 0.0);') if '_Veloc' in wrd.rp_defs: frag.write('vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;') frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;') frag.write('fragColor[2].rg = vec2(posa - posb);') return con_mesh
def make(context_id, rpasses): con_shadowmap = mat_state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' }) vert = con_shadowmap.make_vert() frag = con_shadowmap.make_frag() geom = None tesc = None tese = None frag.add_out('vec4 fragColor') vert.write('vec4 spos = vec4(pos, 1.0);') parse_opacity = 'translucent' in rpasses if parse_opacity: frag.write('float opacity;') if mat_state.data.is_elem('bone'): make_skin.skin_pos(vert) if mat_utils.disp_linked(mat_state.output_node) and mat_state.material.height_tess_shadows: tesc = con_shadowmap.make_tesc() tese = con_shadowmap.make_tese() tesc.ins = vert.outs tese.ins = tesc.outs frag.ins = tese.outs vert.add_out('vec3 wposition') vert.add_out('vec3 wnormal') vert.add_uniform('mat4 W', '_worldMatrix') vert.add_uniform('mat4 N', '_normalMatrix') vert.write('wnormal = normalize(mat3(N) * nor);') vert.write('wposition = vec4(W * spos).xyz;') const = {} const['name'] = 'innerLevel' const['float'] = mat_state.material.height_tess_shadows_inner mat_state.mat_context['bind_constants'].append(const) const = {} const['name'] = 'outerLevel' const['float'] = mat_state.material.height_tess_shadows_outer mat_state.mat_context['bind_constants'].append(const) tesc.add_uniform('float innerLevel') tesc.add_uniform('float outerLevel') make_tess.tesc_levels(tesc) make_tess.interpolate(tese, 'wposition', 3) make_tess.interpolate(tese, 'wnormal', 3, normalize=True) cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_surface=False, parse_opacity=parse_opacity) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') tese.write_pre = True make_tess.interpolate(tese, 'texCoord', 2, declare_out=frag.contains('texCoord')) tese.write_pre = False if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') tese.write_pre = True make_tess.interpolate(tese, 'texCoord1', 2, declare_out=frag.contains('texCoord1')) tese.write_pre = False if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') tese.write_pre = True make_tess.interpolate(tese, 'vcolor', 2, declare_out=frag.contains('vcolor')) tese.write_pre = False tese.add_uniform('mat4 LVP', '_lampViewProjectionMatrix') tese.write('wposition += wnormal * disp * 0.2;') tese.write('gl_Position = LVP * vec4(wposition, 1.0);') # No displacement else: frag.ins = vert.outs vert.add_uniform('mat4 LWVP', '_lampWorldViewProjectionMatrix') vert.write('gl_Position = LWVP * spos;') if parse_opacity: cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_surface=False, parse_opacity=True) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') if parse_opacity: frag.write('if (opacity < 0.5) discard;') frag.write('fragColor = vec4(0.0);') return con_shadowmap
def make_base(con_mesh, parse_opacity): vert = con_mesh.make_vert() frag = con_mesh.make_frag() geom = None tesc = None tese = None vert.add_out('vec3 wposition') vert.add_uniform('mat4 W', '_worldMatrix') vert.add_uniform('mat3 N', '_normalMatrix') vert.write_pre = True vert.write('vec4 spos = vec4(pos, 1.0);') vert.write_pre = False if mat_utils.disp_linked(mat_state.output_node): tesc = con_mesh.make_tesc() tese = con_mesh.make_tese() tesc.ins = vert.outs tese.ins = tesc.outs frag.ins = tese.outs const = {} const['name'] = 'innerLevel' const['float'] = mat_state.material.height_tess_inner mat_state.mat_context['bind_constants'].append(const) const = {} const['name'] = 'outerLevel' const['float'] = mat_state.material.height_tess_outer mat_state.mat_context['bind_constants'].append(const) tesc.add_uniform('float innerLevel') tesc.add_uniform('float outerLevel') make_tess.tesc_levels(tesc) tese.add_out('vec3 eyeDir') make_tess.interpolate(tese, 'wposition', 3, declare_out=True) make_tess.interpolate(tese, 'wnormal', 3, declare_out=True, normalize=True) # No displacement else: frag.ins = vert.outs vert.add_out('vec3 eyeDir') vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix') vert.add_uniform('vec3 eye', '_cameraPosition') vert.write('eyeDir = eye - wposition;') vert.write('gl_Position = WVP * spos;') frag.add_include('../../Shaders/compiled.glsl') frag.write('vec3 v = normalize(eyeDir);') frag.write('float dotNV = max(dot(n, v), 0.0);') # frag.write('float dotNV = dot(n, v);') frag.write('vec3 basecol;') frag.write('float roughness;') frag.write('float metallic;') frag.write('float occlusion;') if parse_opacity: frag.write('float opacity;') cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_opacity=parse_opacity) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') if tese != None: # TODO: also includes texCoord1 tese.write_pre = True make_tess.interpolate(tese, 'texCoord', 2, declare_out=frag.contains('texCoord')) tese.write_pre = False if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') if tese != None: tese.write_pre = True make_tess.interpolate(tese, 'texCoord1', 2, declare_out=frag.contains('texCoord1')) tese.write_pre = False if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') if tese != None: tese.write_pre = True make_tess.interpolate(tese, 'vcolor', 3, declare_out=frag.contains('vcolor')) tese.write_pre = False if mat_state.data.is_elem('tang'): if tese != None: vert.add_out('vec3 wnormal') vert.add_out('vec3 wtangent') write_norpos(vert) vert.write('wtangent = normalize(N * tang);') tese.add_out('mat3 TBN') make_tess.interpolate(tese, 'wtangent', 3, normalize=True) tese.write('vec3 wbitangent = normalize(cross(wnormal, wtangent));') tese.write('TBN = mat3(wtangent, wbitangent, wnormal);') else: vert.add_out('mat3 TBN') write_norpos(vert, declare=True) vert.write('vec3 tangent = normalize(N * tang);') vert.write('vec3 bitangent = normalize(cross(wnormal, tangent));') vert.write('TBN = mat3(tangent, bitangent, wnormal);') else: vert.add_out('vec3 wnormal') write_norpos(vert) frag.write_pre = True frag.write('vec3 n = normalize(wnormal);') frag.write_pre = False if tese != None: tese.add_uniform('mat4 VP', '_viewProjectionMatrix') # TODO: Sample disp at neightbour points to calc normal tese.write('wposition += wnormal * disp * 0.2;') tese.add_uniform('vec3 eye', '_cameraPosition') tese.write('eyeDir = eye - wposition;') tese.write('gl_Position = VP * vec4(wposition, 1.0);')
def make_base(con_mesh, parse_opacity): vert = con_mesh.make_vert() frag = con_mesh.make_frag() geom = None tesc = None tese = None vert.add_out('vec3 wposition') vert.add_uniform('mat4 W', '_worldMatrix') vert.add_uniform('mat4 N', '_normalMatrix') vert.write_pre = True vert.write('vec4 spos = vec4(pos, 1.0);') vert.write_pre = False if mat_utils.disp_linked(mat_state.output_node): tesc = con_mesh.make_tesc() tese = con_mesh.make_tese() tesc.ins = vert.outs tese.ins = tesc.outs frag.ins = tese.outs const = {} const['name'] = 'innerLevel' const['float'] = mat_state.material.height_tess_inner mat_state.mat_context['bind_constants'].append(const) const = {} const['name'] = 'outerLevel' const['float'] = mat_state.material.height_tess_outer mat_state.mat_context['bind_constants'].append(const) tesc.add_uniform('float innerLevel') tesc.add_uniform('float outerLevel') make_tess.tesc_levels(tesc) tese.add_out('vec3 eyeDir') make_tess.interpolate(tese, 'wposition', 3, declare_out=True) make_tess.interpolate(tese, 'wnormal', 3, declare_out=True, normalize=True) # No displacement else: frag.ins = vert.outs vert.add_out('vec3 eyeDir') vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix') vert.add_uniform('vec3 eye', '_cameraPosition') vert.write('eyeDir = eye - wposition;') vert.write('gl_Position = WVP * spos;') frag.add_include('../../Shaders/compiled.glsl') frag.write('vec3 v = normalize(eyeDir);') frag.write('float dotNV = max(dot(n, v), 0.0);') # frag.write('float dotNV = dot(n, v);') frag.write('vec3 basecol;') frag.write('float roughness;') frag.write('float metallic;') frag.write('float occlusion;') if parse_opacity: frag.write('float opacity;') cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_opacity=parse_opacity) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') if tese != None: # TODO: also includes texCoord1 tese.write_pre = True make_tess.interpolate(tese, 'texCoord', 2, declare_out=frag.contains('texCoord')) tese.write_pre = False if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') if tese != None: tese.write_pre = True make_tess.interpolate(tese, 'texCoord1', 2, declare_out=frag.contains('texCoord1')) tese.write_pre = False if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') if tese != None: tese.write_pre = True make_tess.interpolate(tese, 'vcolor', 3, declare_out=frag.contains('vcolor')) tese.write_pre = False if mat_state.data.is_elem('tan'): if tese != None: vert.add_out('vec3 wnormal') vert.add_out('vec3 wtangent') write_norpos(vert) vert.write('wtangent = normalize(mat3(N) * tan);') tese.add_out('mat3 TBN') make_tess.interpolate(tese, 'wtangent', 3, normalize=True) tese.write('vec3 wbitangent = normalize(cross(wnormal, wtangent));') tese.write('TBN = mat3(wtangent, wbitangent, wnormal);') else: vert.add_out('mat3 TBN') write_norpos(vert, declare=True) vert.write('vec3 tangent = normalize(mat3(N) * tan);') vert.write('vec3 bitangent = normalize(cross(wnormal, tangent));') vert.write('TBN = mat3(tangent, bitangent, wnormal);') else: vert.add_out('vec3 wnormal') write_norpos(vert) frag.write_pre = True frag.write('vec3 n = normalize(wnormal);') frag.write_pre = False if tese != None: tese.add_uniform('mat4 VP', '_viewProjectionMatrix') # TODO: Sample disp at neightbour points to calc normal tese.write('wposition += wnormal * disp * 0.2;') tese.add_uniform('vec3 eye', '_cameraPosition') tese.write('eyeDir = eye - wposition;') tese.write('gl_Position = VP * vec4(wposition, 1.0);')
def make(context_id, rpasses): con_shadowmap = mat_state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False }) vert = con_shadowmap.make_vert() frag = con_shadowmap.make_frag() geom = None tesc = None tese = None # frag.add_out('vec4 fragColor') vert.write('vec4 spos = vec4(pos, 1.0);') # TODO: pass vbuf with proper struct vert.write('vec3 t1 = nor; // TODO: Temp for d3d') if mat_state.data.is_elem('tex'): vert.write('vec2 t2 = tex; // TODO: Temp for d3d') parse_opacity = 'translucent' in rpasses if parse_opacity: frag.write('vec3 n;') # Discard at compile time frag.write('float dotNV;') frag.write('float opacity;') if mat_state.data.is_elem('bone'): make_skin.skin_pos(vert) if mat_state.data.is_elem('off'): vert.write('spos.xyz += off;') if mat_utils.disp_linked( mat_state.output_node) and mat_state.material.height_tess_shadows: tesc = con_shadowmap.make_tesc() tese = con_shadowmap.make_tese() tesc.ins = vert.outs tese.ins = tesc.outs frag.ins = tese.outs vert.add_out('vec3 wposition') vert.add_out('vec3 wnormal') vert.add_uniform('mat4 W', '_worldMatrix') vert.add_uniform('mat3 N', '_normalMatrix') vert.write('wnormal = normalize(N * nor);') vert.write('wposition = vec4(W * spos).xyz;') const = {} const['name'] = 'innerLevel' const['float'] = mat_state.material.height_tess_shadows_inner mat_state.mat_context['bind_constants'].append(const) const = {} const['name'] = 'outerLevel' const['float'] = mat_state.material.height_tess_shadows_outer mat_state.mat_context['bind_constants'].append(const) tesc.add_uniform('float innerLevel') tesc.add_uniform('float outerLevel') make_tess.tesc_levels(tesc) make_tess.interpolate(tese, 'wposition', 3) make_tess.interpolate(tese, 'wnormal', 3, normalize=True) cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_surface=False, parse_opacity=parse_opacity) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') tese.write_pre = True make_tess.interpolate(tese, 'texCoord', 2, declare_out=frag.contains('texCoord')) tese.write_pre = False if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') tese.write_pre = True make_tess.interpolate(tese, 'texCoord1', 2, declare_out=frag.contains('texCoord1')) tese.write_pre = False if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') tese.write_pre = True make_tess.interpolate(tese, 'vcolor', 3, declare_out=frag.contains('vcolor')) tese.write_pre = False tese.add_uniform('mat4 LVP', '_lampViewProjectionMatrix') tese.write('wposition += wnormal * disp * 0.2;') tese.write('gl_Position = LVP * vec4(wposition, 1.0);') # No displacement else: frag.ins = vert.outs vert.add_uniform('mat4 LWVP', '_lampWorldViewProjectionMatrix') vert.write('gl_Position = LWVP * spos;') if parse_opacity: cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_surface=False, parse_opacity=True) if mat_state.data.is_elem('tex'): vert.add_out('vec2 texCoord') vert.write('texCoord = tex;') if mat_state.data.is_elem('tex1'): vert.add_out('vec2 texCoord1') vert.write('texCoord1 = tex1;') if mat_state.data.is_elem('col'): vert.add_out('vec3 vcolor') vert.write('vcolor = col;') if parse_opacity: frag.write('if (opacity < 0.5) discard;') # frag.write('fragColor = vec4(0.0);') return con_shadowmap