Merge pull request #1952 from MoritzBrueckner/bump-node
Fix bump node when connected to vector output
This commit is contained in:
commit
f1a65df4d2
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue