forked from LeenkxTeam/LNXSDK
Group Nodes, Shaders, Textures, Displacement
This commit is contained in:
@ -136,7 +136,7 @@ def parse_tex_image(node: bpy.types.ShaderNodeTexImage, out_socket: bpy.types.No
|
||||
else:
|
||||
return f'{tex_store}.a'
|
||||
|
||||
tex_name = c.node_name(node.name)
|
||||
tex_name = c.node_uid(node)
|
||||
tex = c.make_texture_from_image_node(node, tex_name)
|
||||
tex_link = None
|
||||
tex_default_file = None
|
||||
@ -259,7 +259,7 @@ def parse_tex_magic(node: bpy.types.ShaderNodeTexMagic, out_socket: bpy.types.No
|
||||
|
||||
return res
|
||||
|
||||
if bpy.app.version < (4, 1, 0):
|
||||
if bpy.app.version < (4, 2, 0):
|
||||
def parse_tex_musgrave(node: bpy.types.ShaderNodeTexMusgrave, out_socket: bpy.types.NodeSocket, state: ParserState) -> Union[floatstr, vec3str]:
|
||||
state.curshader.add_function(c_functions.str_tex_musgrave)
|
||||
|
||||
@ -297,52 +297,65 @@ def parse_tex_noise(node: bpy.types.ShaderNodeTexNoise, out_socket: bpy.types.No
|
||||
gain = c.parse_value_input(node.inputs['Gain']) if 'Gain' in node.inputs else '1.0'
|
||||
distortion = c.parse_value_input(node.inputs['Distortion']) if 'Distortion' in node.inputs else '0.0'
|
||||
|
||||
dimensions = getattr(node, 'noise_dimensions', '3D')
|
||||
noise_type = getattr(node, 'noise_type', 'FBM')
|
||||
normalize = 'true' if getattr(node, 'normalize', True) else 'false'
|
||||
dimensions = node.noise_dimensions
|
||||
noise_type = node.noise_type if bpy.app.version >= (4, 1, 0) else 'FBM'
|
||||
normalize = 'true' if bpy.app.version < (4, 0, 0) or node.normalize else 'false'
|
||||
|
||||
type_map = {
|
||||
'FBM': 'noise_fbm',
|
||||
'MULTIFRACTAL': 'noise_multi_fractal',
|
||||
'RIDGED_MULTIFRACTAL': 'noise_ridged_multi_fractal',
|
||||
'HYBRID_MULTIFRACTAL': 'noise_hybrid_multi_fractal',
|
||||
'HETERO_TERRAIN': 'noise_hetero_terrain'
|
||||
}
|
||||
func_name = type_map.get(noise_type, 'noise_fbm')
|
||||
if noise_type == 'MULTIFRACTAL':
|
||||
func_name = 'noise_multi_fractal'
|
||||
fractal_src = c_functions.str_tex_noise_multi_fractal
|
||||
elif noise_type == 'RIDGED_MULTIFRACTAL':
|
||||
func_name = 'noise_ridged_multi_fractal'
|
||||
fractal_src = c_functions.str_tex_noise_ridged_multi_fractal
|
||||
elif noise_type == 'HYBRID_MULTIFRACTAL':
|
||||
func_name = 'noise_hybrid_multi_fractal'
|
||||
fractal_src = c_functions.str_tex_noise_hybrid_multi_fractal
|
||||
elif noise_type == 'HETERO_TERRAIN':
|
||||
func_name = 'noise_hetero_terrain'
|
||||
fractal_src = c_functions.str_tex_noise_hetero_terrain
|
||||
else:
|
||||
func_name = 'noise_fbm'
|
||||
fractal_src = c_functions.str_tex_noise_fbm
|
||||
|
||||
is_color = (out_socket == node.outputs[1]) or (getattr(out_socket, 'name', '') == 'Color')
|
||||
is_color = (out_socket == node.outputs[1]) or (out_socket.name == 'Color')
|
||||
|
||||
if dimensions == '1D':
|
||||
coord_type = 'float'
|
||||
p_expr = f"({w}) * ({scale})"
|
||||
dist_expr = f"({p_expr}) + snoise(({p_expr}) + random_float_offset(0.0)) * ({distortion})" if distortion != '0.0' else p_expr
|
||||
if is_color:
|
||||
res = f"vec3({func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_float_offset(1.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_float_offset(2.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}))"
|
||||
else:
|
||||
res = f"{func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize})"
|
||||
|
||||
off_a = 'random_float_offset(1.0)'
|
||||
off_b = 'random_float_offset(2.0)'
|
||||
elif dimensions == '2D':
|
||||
coord_type = 'vec2'
|
||||
p_expr = f"({co}).xy * ({scale})"
|
||||
dist_expr = f"({p_expr}) + vec2(snoise(({p_expr}) + random_vec2_offset(0.0)) * ({distortion}), snoise(({p_expr}) + random_vec2_offset(1.0)) * ({distortion}))" if distortion != '0.0' else p_expr
|
||||
if is_color:
|
||||
res = f"vec3({func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec2_offset(2.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec2_offset(3.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}))"
|
||||
else:
|
||||
res = f"{func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize})"
|
||||
|
||||
off_a = 'random_vec2_offset(2.0)'
|
||||
off_b = 'random_vec2_offset(3.0)'
|
||||
elif dimensions == '4D':
|
||||
coord_type = 'vec4'
|
||||
p_expr = f"vec4({co}, {w}) * ({scale})"
|
||||
dist_expr = f"({p_expr}) + vec4(snoise(({p_expr}) + random_vec4_offset(0.0)) * ({distortion}), snoise(({p_expr}) + random_vec4_offset(1.0)) * ({distortion}), snoise(({p_expr}) + random_vec4_offset(2.0)) * ({distortion}), snoise(({p_expr}) + random_vec4_offset(3.0)) * ({distortion}))" if distortion != '0.0' else p_expr
|
||||
if is_color:
|
||||
res = f"vec3({func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec4_offset(4.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec4_offset(5.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}))"
|
||||
else:
|
||||
res = f"{func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize})"
|
||||
|
||||
off_a = 'random_vec4_offset(4.0)'
|
||||
off_b = 'random_vec4_offset(5.0)'
|
||||
else:
|
||||
coord_type = 'vec3'
|
||||
p_expr = f"({co}) * ({scale})"
|
||||
dist_expr = f"({p_expr}) + vec3(snoise(({p_expr}) + random_vec3_offset(0.0)) * ({distortion}), snoise(({p_expr}) + random_vec3_offset(1.0)) * ({distortion}), snoise(({p_expr}) + random_vec3_offset(2.0)) * ({distortion}))" if distortion != '0.0' else p_expr
|
||||
if is_color:
|
||||
res = f"vec3({func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec3_offset(3.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}), {func_name}(({dist_expr}) + random_vec3_offset(4.0), clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}))"
|
||||
else:
|
||||
res = f"{func_name}({dist_expr}, clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize})"
|
||||
off_a = 'random_vec3_offset(3.0)'
|
||||
off_b = 'random_vec3_offset(4.0)'
|
||||
|
||||
state.curshader.add_function('// ' + func_name + ' ' + coord_type + '\n' + fractal_src.replace('@T@', coord_type))
|
||||
|
||||
co_var = c.node_uid(node) + '_co' + state.get_parser_pass_suffix()
|
||||
if not c.is_parsed(co_var):
|
||||
state.parsed.add(co_var)
|
||||
state.curshader.write(f'{coord_type} {co_var} = {dist_expr};')
|
||||
|
||||
fbm_args = f"clamp({detail}, 0.0, 15.0), max({roughness}, 0.0), {lacunarity}, {offset}, {gain}, {normalize}"
|
||||
if is_color:
|
||||
res = f"vec3({func_name}({co_var}, {fbm_args}), {func_name}(({co_var}) + {off_a}, {fbm_args}), {func_name}(({co_var}) + {off_b}, {fbm_args}))"
|
||||
else:
|
||||
res = f"{func_name}({co_var}, {fbm_args})"
|
||||
|
||||
return res
|
||||
|
||||
@ -513,7 +526,7 @@ def parse_tex_environment(node: bpy.types.ShaderNodeTexEnvironment, out_socket:
|
||||
|
||||
state.parsed.add(tex_store)
|
||||
|
||||
tex_name = c.node_name(node.name)
|
||||
tex_name = c.node_uid(node)
|
||||
tex_link = None
|
||||
tex_default_file = None
|
||||
is_lnx_mat_param = None
|
||||
@ -525,8 +538,8 @@ def parse_tex_environment(node: bpy.types.ShaderNodeTexEnvironment, out_socket:
|
||||
image,
|
||||
tex_name,
|
||||
c.mat_get_material(),
|
||||
getattr(node, 'interpolation', 'Smart'),
|
||||
getattr(node, 'extension', 'REPEAT')
|
||||
node.interpolation,
|
||||
node.extension if bpy.app.version >= (3, 1, 0) else 'REPEAT'
|
||||
)
|
||||
if tex is None:
|
||||
log.warn(f'Object "{state.tree_name}": missing environment texture image "{node.name}"')
|
||||
@ -670,6 +683,7 @@ def parse_tex_voronoi(node: bpy.types.ShaderNodeTexVoronoi, out_socket: bpy.type
|
||||
outp = 3
|
||||
|
||||
m = 0
|
||||
exp = '0.0'
|
||||
if node.distance == 'MANHATTAN':
|
||||
m = 1
|
||||
elif node.distance == 'CHEBYCHEV':
|
||||
@ -689,10 +703,13 @@ def parse_tex_voronoi(node: bpy.types.ShaderNodeTexVoronoi, out_socket: bpy.type
|
||||
f = 4
|
||||
|
||||
dim = node.voronoi_dimensions
|
||||
normalize = 1 if node.normalize else 0
|
||||
normalize = 1 if bpy.app.version >= (4, 0, 0) and node.normalize else 0
|
||||
|
||||
c.write_procedurals()
|
||||
state.curshader.add_function(getattr(c_functions, f'str_tex_voronoi_{bpy.app.version[0]}'))
|
||||
if bpy.app.version >= (5, 0, 0):
|
||||
state.curshader.add_function(c_functions.str_tex_voronoi_5)
|
||||
else:
|
||||
state.curshader.add_function(c_functions.str_tex_voronoi_4)
|
||||
|
||||
if node.inputs['Vector'].is_linked:
|
||||
co = c.get_vector_input(node, ['Vector'])
|
||||
@ -718,6 +735,7 @@ def parse_tex_voronoi(node: bpy.types.ShaderNodeTexVoronoi, out_socket: bpy.type
|
||||
def parse_tex_wave(node: bpy.types.ShaderNodeTexWave, out_socket: bpy.types.NodeSocket, state: ParserState) -> Union[floatstr, vec3str]:
|
||||
c.write_procedurals()
|
||||
state.curshader.add_function(c_functions.str_tex_noise)
|
||||
state.curshader.add_function('// noise_fbm vec3\n' + c_functions.str_tex_noise_fbm.replace('@T@', 'vec3'))
|
||||
state.curshader.add_function(c_functions.str_tex_wave)
|
||||
|
||||
if node.inputs['Vector'].is_linked:
|
||||
@ -735,9 +753,7 @@ def parse_tex_wave(node: bpy.types.ShaderNodeTexWave, out_socket: bpy.types.Node
|
||||
|
||||
dir_map = {'X': 0, 'Y': 1, 'Z': 2, 'DIAGONAL': 3}
|
||||
|
||||
if hasattr(node, 'wave_direction'):
|
||||
wave_dir = dir_map.get(node.wave_direction, 0)
|
||||
elif wave_type == 0:
|
||||
if wave_type == 0:
|
||||
wave_dir = dir_map.get(node.bands_direction, 0)
|
||||
else:
|
||||
wave_dir = dir_map.get(node.rings_direction, 0)
|
||||
@ -804,8 +820,8 @@ def parse_tex_white_noise(node: bpy.types.ShaderNodeTexWhiteNoise, out_socket: b
|
||||
|
||||
w = c.parse_value_input(node.inputs['W']) if 'W' in node.inputs else '0.0'
|
||||
|
||||
dimensions = getattr(node, 'noise_dimensions', '3D')
|
||||
is_color = (out_socket == node.outputs[1]) or (getattr(out_socket, 'name', '') == 'Color')
|
||||
dimensions = node.noise_dimensions
|
||||
is_color = (out_socket == node.outputs[1]) or (out_socket.name == 'Color')
|
||||
|
||||
if dimensions == '1D':
|
||||
if is_color:
|
||||
|
||||
Reference in New Issue
Block a user