Deferred for new mat builder
This commit is contained in:
parent
002ded75c8
commit
b22b0cfd36
|
@ -3,6 +3,7 @@ import os
|
|||
import exporter
|
||||
from material.shader_data import ShaderData
|
||||
import material.make_forward as make_forward
|
||||
import material.make_deferred as make_deferred
|
||||
import material.state as state
|
||||
|
||||
def parse(self, material, mat_context, defs):
|
||||
|
@ -23,7 +24,7 @@ def parse(self, material, mat_context, defs):
|
|||
if rid == 'forward':
|
||||
parse_forward()
|
||||
elif rid == 'deferred':
|
||||
parse_deferred
|
||||
parse_deferred()
|
||||
|
||||
# TODO: Merge finalize shader here..
|
||||
armutils.write_arm(state.path + '/' + material.name + '_data.arm', state.data.get())
|
||||
|
|
|
@ -147,6 +147,9 @@ def node_name(s):
|
|||
s = armutils.safe_source_name(parents[-1].name) + '_' + s
|
||||
return s
|
||||
|
||||
def socket_name(s):
|
||||
return armutils.safe_source_name(s)
|
||||
|
||||
def parse(nodes, vert, frag):
|
||||
output_node = node_by_type(nodes, 'OUTPUT_MATERIAL')
|
||||
if output_node != None:
|
||||
|
@ -313,6 +316,22 @@ def parse_shader(node, socket):
|
|||
|
||||
return out_basecol, out_roughness, out_metallic, out_occlusion
|
||||
|
||||
def write_result(l):
|
||||
res_var = node_name(l.from_node.name) + '_' + socket_name(l.from_socket.name) + '_res'
|
||||
st = l.from_socket.type
|
||||
if res_var not in parsed:
|
||||
parsed.append(res_var)
|
||||
if st == 'RGB' or st == 'RGBA':
|
||||
res = parse_rgb(l.from_node, l.from_socket)
|
||||
frag.write('vec3 {0} = {1};'.format(res_var, res))
|
||||
elif st == 'VECTOR':
|
||||
res = parse_vector(l.from_node, l.from_socket)
|
||||
frag.write('vec3 {0} = {1};'.format(res_var, res))
|
||||
elif st == 'VALUE':
|
||||
res = parse_value(l.from_node, l.from_socket)
|
||||
frag.write('float {0} = {1};'.format(res_var, res))
|
||||
return res_var
|
||||
|
||||
def parse_vector_input(inp):
|
||||
if inp.is_linked:
|
||||
l = inp.links[0]
|
||||
|
@ -320,17 +339,12 @@ def parse_vector_input(inp):
|
|||
if l.from_node.type == 'REROUTE':
|
||||
return parse_vector_input(l.from_node.inputs[0])
|
||||
|
||||
res_var = node_name(l.from_node.name) + '_res'
|
||||
if res_var not in parsed:
|
||||
parsed.append(res_var)
|
||||
if l.from_socket.type == 'RGB' or l.from_socket.type == 'RGBA':
|
||||
res = parse_rgb(l.from_node, l.from_socket)
|
||||
elif l.from_socket.type == 'VECTOR':
|
||||
res = parse_vector(l.from_node, l.from_socket)
|
||||
elif l.from_socket.type == 'VALUE':
|
||||
res = 'vec3({0})'.format(parse_value(l.from_node, l.from_socket))
|
||||
frag.write('vec3 {0} = {1};'.format(res_var, res))
|
||||
res_var = write_result(l)
|
||||
st = l.from_socket.type
|
||||
if st == 'RGB' or st == 'RGBA' or st == 'VECTOR':
|
||||
return res_var
|
||||
else: # VALUE
|
||||
return 'vec3({0})'.format(res_var)
|
||||
else:
|
||||
if inp.type == 'VALUE': # Unlinked reroute
|
||||
return tovec3([0.0, 0.0, 0.0])
|
||||
|
@ -549,11 +563,11 @@ def parse_rgb(node, socket):
|
|||
return tovec3(elems[0].color)
|
||||
if interp == 'CONSTANT':
|
||||
fac_var = node_name(node.name) + '_fac'
|
||||
frag.write('float {0} = 1.0 - {1};'.format(fac_var, fac))
|
||||
frag.write('float {0} = {1};'.format(fac_var, fac))
|
||||
# Get index
|
||||
out_i = '0'
|
||||
for i in range(1, len(elems)):
|
||||
out_i += ' + ({0} > {1} ? 0 : 1)'.format(fac_var, elems[i].position)
|
||||
out_i += ' + ({0} > {1} ? 1 : 0)'.format(fac_var, elems[i].position)
|
||||
# Write cols array
|
||||
cols_var = node_name(node.name) + '_cols'
|
||||
frag.write('vec3 {0}[{1}];'.format(cols_var, len(elems)))
|
||||
|
@ -618,7 +632,6 @@ def parse_vector(node, socket):
|
|||
elif socket == node.outputs[3]: # True Normal
|
||||
return 'n'
|
||||
elif socket == node.outputs[4]: # Incoming
|
||||
trace('asdasdasd')
|
||||
return 'v'
|
||||
elif socket == node.outputs[5]: # Parametric
|
||||
return 'wposition'
|
||||
|
@ -731,16 +744,11 @@ def parse_value_input(inp):
|
|||
if l.from_node.type == 'REROUTE':
|
||||
return parse_value_input(l.from_node.inputs[0])
|
||||
|
||||
res_var = node_name(l.from_node.name) + '_res'
|
||||
if res_var not in parsed:
|
||||
parsed.append(res_var)
|
||||
if l.from_socket.type == 'VALUE':
|
||||
res = parse_value(l.from_node, l.from_socket)
|
||||
elif l.from_socket.type == 'RGB' or l.from_socket.type == 'RGBA':
|
||||
res = '{0}.x'.format(parse_rgb(l.from_node, l.from_socket))
|
||||
elif l.from_socket.type == 'VECTOR':
|
||||
res = '{0}.x'.format(parse_vector(l.from_node, l.from_socket))
|
||||
frag.write('float {0} = {1};'.format(res_var, res))
|
||||
res_var = write_result(l)
|
||||
st = l.from_socket.type
|
||||
if st == 'RGB' or st == 'RGBA' or st == 'VECTOR':
|
||||
return '{0}.x'.format(res_var)
|
||||
else: # VALUE
|
||||
return res_var
|
||||
else:
|
||||
return tovec1(inp.default_value)
|
||||
|
@ -853,7 +861,7 @@ def parse_value(node, socket):
|
|||
col1 = parse_vector_input(node.inputs[1])
|
||||
col2 = parse_vector_input(node.inputs[2])
|
||||
scale = parse_value_input(node.inputs[3])
|
||||
return 'tex_checker({0}, {0}, {1}, {2}).r'.format(co, col1, col2, scale)
|
||||
return 'tex_checker({0}, {1}, {2}, {3}).r'.format(co, col1, col2, scale)
|
||||
|
||||
elif node.type == 'TEX_GRADIENT':
|
||||
return '0.0'
|
||||
|
|
|
@ -5,7 +5,7 @@ def mesh(context_id):
|
|||
con_mesh = state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
|
||||
|
||||
vert = con_mesh.make_vert()
|
||||
frag = con_mesh.make_frag()
|
||||
frag = con_mesh.make_frag(mrt=2)
|
||||
|
||||
vert.add_out('vec3 wnormal')
|
||||
vert.add_out('vec3 wposition')
|
||||
|
@ -20,7 +20,27 @@ def mesh(context_id):
|
|||
vert.write('eyeDir = eye - wposition;')
|
||||
vert.write('gl_Position = WVP * spos;')
|
||||
|
||||
# make_cycles.parse(state.nodes, vert, frag)
|
||||
frag.add_include('../../Shaders/compiled.glsl')
|
||||
frag.add_include('../../Shaders/std/gbuffer.glsl')
|
||||
frag.add_uniform('sampler2D snoise', link='_noise64')
|
||||
frag.add_uniform('int lightType', '_lampType')
|
||||
frag.write('vec3 n = normalize(wnormal);')
|
||||
frag.write('vec3 v = normalize(eyeDir);')
|
||||
# frag.write('float dotNV = dot(n, v);')
|
||||
frag.write('float dotNV = max(dot(n, v), 0.0);')
|
||||
|
||||
frag.write('vec3 basecol;')
|
||||
frag.write('float roughness;')
|
||||
frag.write('float metallic;')
|
||||
frag.write('float occlusion;')
|
||||
|
||||
make_cycles.parse(state.nodes, vert, frag)
|
||||
|
||||
# Pack normal
|
||||
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);')
|
||||
frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);')
|
||||
frag.write('fragColor[1] = vec4(basecol.rgb, occlusion);')
|
||||
|
||||
return con_mesh
|
||||
|
||||
|
|
|
@ -83,10 +83,13 @@ class ShaderContext:
|
|||
self.vert.add_in('vec' + str(e['size']) + ' ' + e['name'])
|
||||
return self.vert
|
||||
|
||||
def make_frag(self):
|
||||
def make_frag(self, mrt=1):
|
||||
self.data['fragment_shader'] = self.material.name + '_' + self.data['name'] + '.frag'
|
||||
self.frag = Shader(self)
|
||||
self.frag.ins = self.vert.outs
|
||||
if mrt > 1:
|
||||
self.frag.add_out('vec4[{0}] fragColor'.format(mrt))
|
||||
else:
|
||||
self.frag.add_out('vec4 fragColor')
|
||||
return self.frag
|
||||
|
||||
|
|
Loading…
Reference in a new issue