Extend BRDF
This commit is contained in:
@ -188,6 +188,64 @@ def parse(nodes, con: ShaderContext,
|
||||
|
||||
# Make sure that individual functions in this module aren't called with an incorrect/old parser state, set it to
|
||||
# None so that it will raise exceptions when not set
|
||||
# store extended BRDF feature flags before destroying parser state
|
||||
import re as _re
|
||||
|
||||
def _extract_vec3(s):
|
||||
m = _re.match(r'vec3\s*\(\s*([^,\s\)]+)\s*\)', s)
|
||||
if m and ',' not in m.group(1):
|
||||
v = m.group(1)
|
||||
return v, v, v
|
||||
m = _re.match(r'vec3\s*\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s\)]+)', s)
|
||||
if m:
|
||||
return m.group(1), m.group(2), m.group(3)
|
||||
return '1.0', '1.0', '1.0'
|
||||
|
||||
def _try_float(val_str, default=0.0):
|
||||
try:
|
||||
return float(val_str)
|
||||
except (ValueError, TypeError):
|
||||
return default
|
||||
|
||||
_sss_r, _sss_g, _sss_b = _extract_vec3(state.out_subsurface_radius)
|
||||
_sss_scale = state.out_subsurface_scale
|
||||
_sss_scale_f = _try_float(_sss_scale, 0.05)
|
||||
if _sss_scale_f != 1.0:
|
||||
_sss_r = str(_try_float(_sss_r, 1.0) * _sss_scale_f)
|
||||
_sss_g = str(_try_float(_sss_g, 0.2) * _sss_scale_f)
|
||||
_sss_b = str(_try_float(_sss_b, 0.1) * _sss_scale_f)
|
||||
|
||||
_sheen_tint_r, _sheen_tint_g, _sheen_tint_b = _extract_vec3(state.out_sheen_tint)
|
||||
_coat_tint_r, _coat_tint_g, _coat_tint_b = _extract_vec3(state.out_coat_tint)
|
||||
_sss_color_r, _sss_color_g, _sss_color_b = _extract_vec3(state.out_subsurface_color)
|
||||
|
||||
mat_state.features = {
|
||||
'clearcoat': state.out_clearcoat,
|
||||
'clearcoatRough': state.out_clearcoat_rough,
|
||||
'coatIOR': state.out_coat_ior,
|
||||
'coatTintR': _coat_tint_r,
|
||||
'coatTintG': _coat_tint_g,
|
||||
'coatTintB': _coat_tint_b,
|
||||
'sheen': state.out_sheen,
|
||||
'sheenRough': state.out_sheen_rough,
|
||||
'sheenTintR': _sheen_tint_r,
|
||||
'sheenTintG': _sheen_tint_g,
|
||||
'sheenTintB': _sheen_tint_b,
|
||||
'subsurface': state.out_subsurface,
|
||||
'subsurfaceAnisotropy': state.out_subsurface_anisotropy,
|
||||
'subsurfaceRadiusR': _sss_r,
|
||||
'subsurfaceRadiusG': _sss_g,
|
||||
'subsurfaceRadiusB': _sss_b,
|
||||
'subsurfaceColorR': _sss_color_r,
|
||||
'subsurfaceColorG': _sss_color_g,
|
||||
'subsurfaceColorB': _sss_color_b,
|
||||
'anisotropy': state.out_anisotropy,
|
||||
'anisoRot': state.out_aniso_rot,
|
||||
'transmission': state.out_transmission,
|
||||
'transmissionRough': state.out_transmission_rough,
|
||||
'ior': state.out_ior,
|
||||
'thinWall': state.out_thin_wall,
|
||||
}
|
||||
state = None
|
||||
|
||||
|
||||
@ -250,6 +308,10 @@ def parse_material_output(node: bpy.types.Node, custom_particle_node: bpy.types.
|
||||
curshader.write(f'transmissionRough = {outs[20]};')
|
||||
curshader.write(f'thinWall = {outs[21]};')
|
||||
curshader.write(f'tangent = {outs[22]};')
|
||||
curshader.write(f'subsurfaceScale = {outs[23]};')
|
||||
curshader.write(f'subsurfaceAnisotropy = {outs[24]};')
|
||||
curshader.write(f'coatIOR = {outs[25]};')
|
||||
curshader.write(f'coatTint = {outs[26]};')
|
||||
|
||||
if mat_state.emission_type == mat_state.EmissionType.SHADELESS:
|
||||
if '_EmissionShadeless' not in wrd.world_defs:
|
||||
|
||||
Reference in New Issue
Block a user