Repe [T3DU] Update - 31f26d171bba0355ce2a77031e3aad4c64dbc7e9

This commit is contained in:
2026-09-04 10:46:13 -07:00
parent c915312901
commit 0460b9d587
482 changed files with 27797 additions and 3226 deletions

View File

@ -283,6 +283,11 @@ def parse_material_output(node: bpy.types.Node, custom_particle_node: bpy.types.
mat_state.emission_type = mat_state.EmissionType.NO_EMISSION
#for debugDraw color in deferred
if '_EmissionShaded' not in wrd.world_defs:
wrd.world_defs += '_EmissionShaded'
lnx.assets.add_khafile_def('rp_gbuffer_emission')
# Surface
if parse_surface or parse_opacity:
state.parents = []
@ -559,6 +564,8 @@ def parse_vector(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> str:
'TEX_SKY',
'TEX_VORONOI',
'TEX_WAVE',
'TEX_GABOR',
'TEX_WHITE_NOISE',
'VERTEX_COLOR',
'BRIGHTCONTRAST',
'GAMMA',
@ -591,6 +598,7 @@ def parse_vector(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> str:
'COMBXYZ',
'VECT_MATH',
'DISPLACEMENT',
'VECTOR_DISPLACEMENT',
'VECTOR_ROTATE',
)
@ -625,7 +633,7 @@ def get_value_input(node: bpy.types.Node, socket_names: Tuple[str, ...]) -> floa
return '1.0'
def parse_normal_map_color_input(inp, strength_input=None):
def parse_normal_map_color_input(inp, strength_input=None, space='TANGENT'):
frag = state.frag
if state.basecol_only or not inp.is_linked or state.normal_parsed:
@ -633,20 +641,40 @@ def parse_normal_map_color_input(inp, strength_input=None):
state.normal_parsed = True
frag.write_normal += 1
if not get_lnx_export_tangents() or mat_get_material().lnx_decal: # Compute TBN matrix
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
frag.write('texn.y = -texn.y;')
frag.add_include('std/normals.glsl')
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
frag.write('n = TBN * normalize(texn);')
else:
frag.write('n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
if strength_input is not None:
strength = parse_value_input(strength_input)
color_val = parse_vector_input(inp)
strength = parse_value_input(strength_input) if strength_input is not None else '1.0'
if space == 'TANGENT':
if not get_lnx_export_tangents() or mat_get_material().lnx_decal:
frag.write(f'vec3 texn = ({color_val}) * 2.0 - 1.0;')
frag.write('texn.y = -texn.y;')
frag.add_include('std/normals.glsl')
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
if strength != '1.0':
frag.write('n.xy *= {0};'.format(strength))
frag.write('n = normalize(TBN * n);')
state.con.add_elem('tang', 'short4norm')
frag.write(f'texn.xy *= {strength};')
frag.write('n = TBN * normalize(texn);')
else:
frag.write(f'vec3 texn = ({color_val}) * 2.0 - 1.0;')
if strength != '1.0':
frag.write(f'texn.xy *= {strength};')
frag.write('n = normalize(TBN * texn);')
state.con.add_elem('tang', 'short4norm')
elif space in ['OBJECT', 'BLENDER_OBJECT']:
frag.add_uniform('mat3 N', '_normalMatrix')
frag.write(f'vec3 objn = ({color_val}) * 2.0 - 1.0;')
if strength != '1.0':
frag.write(f'objn = mix(vec3(0.0, 0.0, 1.0), objn, {strength});')
frag.write('n = normalize(N * objn);')
elif space in ['WORLD', 'BLENDER_WORLD']:
frag.write(f'vec3 worldn = ({color_val}) * 2.0 - 1.0;')
if strength != '1.0':
frag.write(f'n = normalize(mix(n, worldn, {strength}));')
else:
frag.write('n = normalize(worldn);')
frag.write_normal -= 1
@ -700,6 +728,8 @@ def parse_value(node, socket):
'TEX_POINTDENSITY',
'TEX_VORONOI',
'TEX_WAVE',
'TEX_GABOR',
'TEX_WHITE_NOISE',
'LIGHT_FALLOFF',
'NORMAL',
'CLAMP',
@ -828,7 +858,6 @@ def write_result(link: bpy.types.NodeLink) -> Optional[str]:
def write_procedurals():
if state.curshader not in state.procedurals_written:
state.curshader.add_function(c_functions.str_tex_proc)
state.procedurals_written.add(state.curshader)
@ -869,14 +898,18 @@ def texture_store(node, tex, tex_name, to_linear=False, unpremultiply=False, tex
state.con.add_elem('tex', 'short2norm')
curshader.add_uniform('sampler2D {0}'.format(tex_name), link=tex_link, default_value=default_value, is_lnx_mat_param=is_lnx_mat_param)
triplanar = node.projection == 'BOX'
spherical = node.projection == 'SPHERE'
tube = node.projection == 'TUBE'
if node.inputs[0].is_linked:
uv_name = parse_vector_input(node.inputs[0])
if triplanar:
uv_name = 'vec3({0}.x, 1.0 - {0}.y, {0}.z)'.format(uv_name)
uv_name = 'vec3({0}.x, {0}.y, 1.0 - {0}.z)'.format(uv_name)
elif spherical or tube:
uv_name = 'vec3({0}.x, {0}.y, {0}.z)'.format(uv_name)
else:
uv_name = 'vec2({0}.x, 1.0 - {0}.y)'.format(uv_name)
else:
uv_name = 'vec3(texCoord.xy, 0.0)' if triplanar else 'texCoord'
uv_name = 'vec3(texCoord.xy, 0.0)' if triplanar or spherical or tube else 'texCoord'
if triplanar:
if not curshader.has_include('std/mapping.glsl'):
curshader.add_include('std/mapping.glsl')
@ -884,7 +917,16 @@ def texture_store(node, tex, tex_name, to_linear=False, unpremultiply=False, tex
nor = 'TBN[2]'
else:
nor = 'n'
curshader.write('vec4 {0} = vec4(triplanarMapping({1}, {2}, {3}), 0.0);'.format(tex_store, tex_name, nor, uv_name))
blend = getattr(node, 'projection_blend', 0.0)
curshader.write('vec4 {0} = boxProjection({1}, {2}, {3}, clamp({4}, 0.0, 1.0));'.format(tex_store, tex_name, nor, uv_name, blend))
elif spherical:
if not curshader.has_include('std/mapping.glsl'):
curshader.add_include('std/mapping.glsl')
curshader.write('vec4 {0} = texture({1}, sphericalMapping({2}));'.format(tex_store, tex_name, uv_name))
elif tube:
if not curshader.has_include('std/mapping.glsl'):
curshader.add_include('std/mapping.glsl')
curshader.write('vec4 {0} = texture({1}, tubeMapping({2}));'.format(tex_store, tex_name, uv_name))
else:
if mat_state.texture_grad:
curshader.write('vec4 {0} = textureGrad({1}, {2}.xy, g2.xy, g2.zw);'.format(tex_store, tex_name, uv_name))