Merge pull request #1952 from MoritzBrueckner/bump-node

Fix bump node when connected to vector output
This commit is contained in:
Lubos Lenco 2020-10-26 09:19:04 +01:00 committed by GitHub
commit f1a65df4d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 18 deletions

View file

@ -387,7 +387,7 @@ def parse_value_input(inp: bpy.types.NodeSocket) -> floatstr:
socket_type = link.from_socket.type
if socket_type in ('RGB', 'RGBA', 'VECTOR'):
# RGB to BW
return f'((({res_var}.r * 0.3 + {res_var}.g * 0.59 + {res_var}.b * 0.11) / 3.0) * 2.5)'
return rgb_to_bw(res_var)
# VALUE
else:
return res_var
@ -541,8 +541,9 @@ def write_procedurals():
state.procedurals_written = True
return
def glsl_type(typestr: str):
if typestr in ('RGB', 'RGBA', 'VECTOR'):
def glsl_type(socket_type: str):
"""Socket to glsl type."""
if socket_type in ('RGB', 'RGBA', 'VECTOR'):
return 'vec3'
else:
return 'float'
@ -598,8 +599,12 @@ def texture_store(node, tex, tex_name, to_linear=False, tex_link=None):
curshader.write('{0}.rgb = pow({0}.rgb, vec3(2.2));'.format(tex_store))
return tex_store
def write_bump(node, res, scl=0.001):
def write_bump(node: bpy.types.Node, out_socket: bpy.types.NodeSocket, res: str, scl=0.001):
"""Sample texture values around the current texture coordinate for bump mapping. The result of the sampling is
stored in 4 variables named after state.sample_bump_res with _[0-3] appended."""
state.sample_bump_res = store_var_name(node) + '_bump'
# Testing.. get function parts..
ar = res.split('(', 1)
pre = ar[0] + '('
@ -611,19 +616,38 @@ def write_bump(node, res, scl=0.001):
co = ar[1][:-1]
post = ')'
coordinate_offsets = (
f'vec3(-{scl}, 0.0, 0.0)',
f'vec3({scl}, 0.0, {scl})',
f'vec3(0.0, -{scl}, 0.0)',
f'vec3(0.0, {scl}, -{scl})'
)
needs_conversion_bw = glsl_type(out_socket.type) == "vec3"
curshader = state.curshader
curshader.write('float {0}_1 = {1}{2} + vec3(-{4}, 0.0, 0.0){3};'.format(state.sample_bump_res, pre, co, post, scl))
curshader.write('float {0}_2 = {1}{2} + vec3({4}, 0.0, {4}){3};'.format(state.sample_bump_res, pre, co, post, scl))
curshader.write('float {0}_3 = {1}{2} + vec3(0.0, -{4}, 0.0){3};'.format(state.sample_bump_res, pre, co, post, scl))
curshader.write('float {0}_4 = {1}{2} + vec3(0.0, {4}, -{4}){3};'.format(state.sample_bump_res, pre, co, post, scl))
for i in range(1, 5):
if needs_conversion_bw:
vec_var = f'{state.sample_bump_res}_vec{i}'
curshader.write(f'vec3 {vec_var} = {pre}{co} + {coordinate_offsets[i - 1]}{post};')
curshader.write(f'float {state.sample_bump_res}_{i} = {rgb_to_bw(vec_var)};')
else:
curshader.write(f'float {state.sample_bump_res}_{i} = {pre}{co} + {coordinate_offsets[i - 1]}{post};')
state.sample_bump = False
def to_vec1(v):
return str(v)
def to_vec3(v):
return 'vec3({0}, {1}, {2})'.format(v[0], v[1], v[2])
def rgb_to_bw(res_var: vec3str) -> floatstr:
return f'((({res_var}.r * 0.3 + {res_var}.g * 0.59 + {res_var}.b * 0.11) / 3.0) * 2.5)'
def node_by_type(nodes, ntype: str) -> bpy.types.Node:
for n in nodes:
if n.type == ntype:

View file

@ -312,8 +312,7 @@ def parse_math(node: bpy.types.ShaderNodeMath, out_socket: bpy.types.NodeSocket,
def parse_rgbtobw(node: bpy.types.ShaderNodeRGBToBW, out_socket: bpy.types.NodeSocket, state: ParserState) -> floatstr:
col = c.parse_vector_input(node.inputs[0])
return '((({0}.r * 0.3 + {0}.g * 0.59 + {0}.b * 0.11) / 3.0) * 2.5)'.format(col)
return c.rgb_to_bw(c.parse_vector_input(node.inputs[0]))
def parse_sephsv(node: bpy.types.ShaderNodeSeparateHSV, out_socket: bpy.types.NodeSocket, state: ParserState) -> floatstr:

View file

@ -34,7 +34,7 @@ def parse_tex_brick(node: bpy.types.ShaderNodeTexBrick, out_socket: bpy.types.No
res = 'tex_brick_f({0} * {1})'.format(co, scale)
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res
@ -59,7 +59,7 @@ def parse_tex_checker(node: bpy.types.ShaderNodeTexChecker, out_socket: bpy.type
res = 'tex_checker_f({0}, {1})'.format(co, scale)
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res
@ -94,7 +94,7 @@ def parse_tex_gradient(node: bpy.types.ShaderNodeTexGradient, out_socket: bpy.ty
res = f'(clamp({f}, 0.0, 1.0))'
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res
@ -222,7 +222,7 @@ def parse_tex_magic(node: bpy.types.ShaderNodeTexMagic, out_socket: bpy.types.No
res = f'tex_magic_f({co} * {scale} * 4.0)'
if state.sample_bump:
c.write_bump(node, res, 0.1)
c.write_bump(node, out_socket, res, 0.1)
return res
@ -247,7 +247,7 @@ def parse_tex_musgrave(node: bpy.types.ShaderNodeTexMusgrave, out_socket: bpy.ty
res = 'tex_musgrave_f({0} * {1} * 0.5)'.format(co, scale)
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res
@ -277,7 +277,7 @@ def parse_tex_noise(node: bpy.types.ShaderNodeTexNoise, out_socket: bpy.types.No
res = 'tex_noise({0} * {1},{2},{3})'.format(co, scale, detail, distortion)
if state.sample_bump:
c.write_bump(node, res, 0.1)
c.write_bump(node, out_socket, res, 0.1)
return res
@ -494,7 +494,7 @@ def parse_tex_voronoi(node: bpy.types.ShaderNodeTexVoronoi, out_socket: bpy.type
res = 'tex_voronoi({0}, {1}, {2}, {3}, {4}, {5}).x'.format(co, randomness, m, outp, scale, exp)
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res
@ -527,6 +527,6 @@ def parse_tex_wave(node: bpy.types.ShaderNodeTexWave, out_socket: bpy.types.Node
res = 'tex_wave_f({0} * {1},{2},{3},{4},{5},{6})'.format(co, scale, wave_type, wave_profile, distortion, detail, detail_scale)
if state.sample_bump:
c.write_bump(node, res)
c.write_bump(node, out_socket, res)
return res