Repe [T3DU] and Moises Jpelaez updates

This commit is contained in:
2026-05-12 23:54:06 -07:00
parent 6b404f9da6
commit 39091e8db3
147 changed files with 5539 additions and 1750 deletions

View File

@ -321,29 +321,18 @@ def parse_shader(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> Tuple[st
'MIX_SHADER',
'ADD_SHADER',
'BSDF_PRINCIPLED',
'PRINCIPLED_BSDF',
'BSDF_DIFFUSE',
'DIFFUSE_BSDF',
'BSDF_GLOSSY',
'GLOSSY_BSDF',
'BSDF_SHEEN',
'SHEEN_BSDF',
'AMBIENT_OCCLUSION',
'BSDF_ANISOTROPIC',
'ANISOTROPIC_BSDF',
'EMISSION',
'BSDF_GLASS',
'GLASS_BSDF',
'BSDF_REFRACTION',
'REFRACTION_BSDF',
'HOLDOUT',
'SUBSURFACE_SCATTERING',
'BSDF_TRANSLUCENT',
'TRANSLUCENT_BSDF',
'BSDF_TRANSPARENT',
'TRANSPARENT_BSDF',
'BSDF_VELVET',
'VELVET_BSDF',
)
state.reset_outs()
@ -377,7 +366,7 @@ def parse_shader(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> Tuple[st
mat_state.emission_type = mat_state.EmissionType.SHADED
if state.parse_opacity:
state.out_opacity = parse_value_input(node.inputs[1])
state.out_ior = 1.450;
state.out_ior = 1.450
else:
return parse_group(node, socket)
@ -394,6 +383,21 @@ def parse_shader(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> Tuple[st
return state.get_outs()
# Use an array of socket names for compatibility across Blender versions
def get_vector_input(node: bpy.types.Node, socket_names: Tuple[str, ...]) -> vec3str:
for name in socket_names:
if name in node.inputs:
try:
return parse_vector_input(node.inputs[name])
except Exception:
log.warn(f'Failed to parse input "{name}" on node "{node.name}"')
else:
# FIXME: Fallback to default value if the node isn't found
log.warn(f'Input "{name}" not found on node "{node.name}", returning default None')
return None
def parse_displacement_input(inp):
if inp.is_linked:
l = inp.links[0]
@ -504,6 +508,20 @@ def parse_vector(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> str:
return "vec3(0, 0, 0)"
# Use an array of socket names for compatibility across Blender versions
def get_value_input(node: bpy.types.Node, socket_names: Tuple[str, ...]) -> floatstr:
for name in socket_names:
if name in node.inputs:
try:
return parse_value_input(node.inputs[name])
except Exception:
log.warn(f'Failed to parse input "{name}" on node "{node.name}"')
else:
# FIXME: Fallback to default value if the node isn't found
log.warn(f'Input "{name}" not found on node "{node.name}", returning default 1.0')
return '1.0'
def parse_normal_map_color_input(inp, strength_input=None):
frag = state.frag
@ -731,7 +749,7 @@ def store_var_name(node: bpy.types.Node) -> str:
return name + '_store'
def texture_store(node, tex, tex_name, to_linear=False, tex_link=None, default_value=None, is_lnx_mat_param=None):
def texture_store(node, tex, tex_name, to_linear=False, unpremultiply=False, tex_link=None, default_value=None, is_lnx_mat_param=None):
curshader = state.curshader
tex_store = store_var_name(node)
@ -770,6 +788,9 @@ def texture_store(node, tex, tex_name, to_linear=False, tex_link=None, default_v
else:
curshader.write('vec4 {0} = texture({1}, {2}.xy);'.format(tex_store, tex_name, uv_name))
if unpremultiply:
curshader.write('if ({0}.a > 0.0) {0}.rgb /= {0}.a;'.format(tex_store))
if to_linear:
curshader.write('{0}.rgb = pow({0}.rgb, vec3(2.2));'.format(tex_store))