Skip to content

Commit cbf9b58

Browse files
Skin shader updates
- Refactors all skin shaders into single material - Adds support for hrothgar skin, previously not working correctly - Removes support for face tattoo (decal) - may be added at a later time but was not utilized by meddle anyways
1 parent 1bc6816 commit cbf9b58

File tree

4 files changed

+79
-25
lines changed

4 files changed

+79
-25
lines changed

MeddleTools/node_groups.py

Lines changed: 66 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,38 @@ def apply(self, groupNode, properties):
112112
if len(value_arr) == 3:
113113
value_arr.append(1.0)
114114

115-
groupNode.inputs[self.color_dest].default_value = value_arr
115+
groupNode.inputs[self.color_dest].default_value = value_arr
116+
117+
class FloatRgbaAlphaMapping:
118+
def __init__(self, property_name: str, color_dest: str):
119+
self.property_name = property_name
120+
self.color_dest = color_dest
121+
122+
def __repr__(self):
123+
return f"FloatRgbAlphaMapping({self.property_name}, {self.color_dest})"
124+
125+
def apply(self, groupNode, properties):
126+
value_arr = [0.5, 0.5, 0.5, 1.0]
127+
if self.property_name in properties:
128+
value_arr = properties[self.property_name].to_list()
129+
else:
130+
print(f"Property {self.property_name} not found in material")
131+
132+
if len(value_arr) == 3:
133+
value_arr.append(1.0)
134+
135+
groupNode.inputs[self.color_dest].default_value = value_arr[3]
136+
137+
class FloatValueMapping:
138+
def __init__(self, value: float, property_dest: str):
139+
self.value = value
140+
self.property_dest = property_dest
141+
142+
def __repr__(self):
143+
return f"FloatValueMappping({self.value}, {self.property_dest})"
144+
145+
def apply(self, groupNode):
146+
groupNode.inputs[self.property_dest].default_value = self.value
116147

117148
class ColorSetMapping:
118149
# ColorSetMapping('ColorTable', 'g_SamplerIndex_PngCachePath', 'DiffuseTableA', 'DiffuseTableB', 'SpecularTableA', 'SpecularTableB', 'color_a', 'color_b', 'specular_a', 'specular_b', 'id_mix'),
@@ -396,6 +427,20 @@ def apply(self, groupNode, properties):
396427
]
397428
)
398429

430+
meddle_skin2 = NodeGroup(
431+
'meddle skin2.shpk',
432+
[
433+
PngMapping('g_SamplerDiffuse_PngCachePath', 'g_SamplerDiffuse', 'g_SamplerDiffuse_alpha', 'sRGB'),
434+
PngMapping('g_SamplerNormal_PngCachePath', 'g_SamplerNormal', 'g_SamplerNormal_alpha', 'Non-Color'),
435+
PngMapping('g_SamplerMask_PngCachePath', 'g_SamplerMask', 'g_SamplerMask_alpha', 'Non-Color'),
436+
FloatRgbMapping('SkinColor', 'Skin Color'),
437+
FloatRgbMapping('LipColor', 'Lip Color'),
438+
FloatRgbaAlphaMapping('LipColor', 'Lip Color Strength'),
439+
FloatRgbMapping('MainColor', 'Hair Color'),
440+
FloatRgbMapping('MeshColor', 'Highlights Color'),
441+
]
442+
)
443+
399444
nodegroups: list[NodeGroup] = [
400445
meddle_skin,
401446
meddle_face_skin,
@@ -408,66 +453,68 @@ def apply(self, groupNode, properties):
408453
meddle_bg,
409454
meddle_bg_colorchange,
410455
meddle_character_compatibility,
411-
meddle_bg_prop
456+
meddle_bg_prop,
457+
meddle_skin2
412458
]
413-
459+
414460
def matchShader(mat):
415461
if mat is None:
416-
return None
462+
return (None, [])
417463

418464
properties = mat
419465
shaderPackage = properties["ShaderPackage"]
420466

421467
print(f"Matching shader {shaderPackage} on material {mat.name}")
422468

423469
if shaderPackage is None:
424-
return None
470+
return (None, [])
425471

426472
if shaderPackage == 'skin.shpk':
427-
output = meddle_face_skin
473+
output = (meddle_face_skin, [FloatValueMapping(1.0, 'IS_FACE')])
428474
if 'CategorySkinType' in properties:
429475
if properties["CategorySkinType"] == 'Body':
430-
output = meddle_skin
476+
output = (meddle_skin2, [])
431477
elif properties["CategorySkinType"] == 'Face':
432-
output = meddle_face_skin
478+
output = (meddle_skin2, [FloatValueMapping(1.0, 'IS_FACE')])
433479
elif properties["CategorySkinType"] == 'Hrothgar':
434480
print("Hrothgar, not implemented")
481+
output = (meddle_skin2, [FloatValueMapping(1.0, 'IS_HROTHGAR')])
435482

436483
return output
437484

438485
if shaderPackage == 'hair.shpk':
439-
output = meddle_hair
486+
output = (meddle_hair, [])
440487
if 'CategoryHairType' in properties:
441488
if properties["CategoryHairType"] == 'Face':
442-
output = meddle_face_hair
489+
output = (meddle_face_hair, [])
443490

444491
return output
445492

446493
if shaderPackage == 'iris.shpk':
447-
return meddle_iris
494+
return (meddle_iris, [])
448495

449496
if shaderPackage == 'charactertattoo.shpk':
450-
return meddle_character_tattoo
497+
return (meddle_character_tattoo, [])
451498

452499
if shaderPackage == 'characterocclusion.shpk':
453-
return meddle_character_occlusion
500+
return (meddle_character_occlusion, [])
454501

455502
if shaderPackage == 'character.shpk' or shaderPackage == 'characterlegacy.shpk' or shaderPackage == 'characterscroll.shpk':
456503
# check if GetValuesTextureType is 'Compatibility'
457504
if 'GetValuesTextureType' in properties:
458505
if properties['GetValuesTextureType'] == 'Compatibility':
459-
return meddle_character_compatibility
506+
return (meddle_character_compatibility, [])
460507

461-
return meddle_character
508+
return (meddle_character, [])
462509

463510
if shaderPackage == 'bg.shpk':
464-
return meddle_bg
511+
return (meddle_bg, [])
465512

466513
if shaderPackage == 'bgcolorchange.shpk':
467-
return meddle_bg_colorchange
514+
return (meddle_bg_colorchange, [])
468515

469516
if shaderPackage == 'bgprop.shpk':
470-
return meddle_bg_prop
517+
return (meddle_bg_prop, [])
471518

472519
print("No suitable shader found for " + shaderPackage + " on material " + mat.name)
473-
return None
520+
return (None, [])

MeddleTools/shader_fix.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ def shpkMtrlFixer(object: bpy.types.Object, mat: bpy.types.Material, directory:
8282
return {'CANCELLED'}
8383

8484
groupData = node_groups.matchShader(mat)
85-
if groupData is None:
85+
node_group = groupData[0]
86+
additional_mappings = groupData[1]
87+
if node_group is None:
8688
return {'CANCELLED'}
8789
material = mat.node_tree
8890
if material is None:
@@ -103,13 +105,13 @@ def shpkMtrlFixer(object: bpy.types.Object, mat: bpy.types.Material, directory:
103105
print(f"Node {groupNode.name} is not a ShaderNodeGroup")
104106
return {'CANCELLED'}
105107

106-
if groupData.name not in bpy.data.node_groups:
107-
print(f"Node group {groupData.name} not found")
108+
if node_group.name not in bpy.data.node_groups:
109+
print(f"Node group {node_group.name} not found")
108110
return {'CANCELLED'}
109111

110-
nodeGroupData = bpy.data.node_groups[groupData.name]
112+
nodeGroupData = bpy.data.node_groups[node_group.name]
111113
if not isinstance(nodeGroupData, bpy.types.ShaderNodeTree):
112-
print(f"Node group {groupData.name} is not a ShaderNodeTree")
114+
print(f"Node group {node_group.name} is not a ShaderNodeTree")
113115
return {'CANCELLED'}
114116

115117
groupNode.node_tree = nodeGroupData
@@ -142,7 +144,8 @@ def shpkMtrlFixer(object: bpy.types.Object, mat: bpy.types.Material, directory:
142144
material.links.new(bsdfOutput, surfaceInput)
143145

144146
node_height = 300
145-
for mapping in groupData.mapping_definitions:
147+
all_mappings = node_group.mapping_definitions + additional_mappings
148+
for mapping in all_mappings:
146149
if isinstance(mapping, node_groups.PngMapping):
147150
node_height = mapping.apply(material, groupNode, properties, directory, node_height)
148151
elif isinstance(mapping, node_groups.FloatRgbMapping):
@@ -153,6 +156,10 @@ def shpkMtrlFixer(object: bpy.types.Object, mat: bpy.types.Material, directory:
153156
node_height = mapping.apply(material, mesh, groupNode, node_height)
154157
elif isinstance(mapping, node_groups.ColorSetMapping):
155158
node_height = mapping.apply(material, groupNode, properties, directory, node_height)
159+
elif isinstance(mapping, node_groups.FloatValueMapping):
160+
mapping.apply(groupNode)
161+
elif isinstance(mapping, node_groups.FloatRgbaAlphaMapping):
162+
mapping.apply(groupNode, properties)
156163

157164
return {'FINISHED'}
158165

MeddleTools/shaders.blend

-758 Bytes
Binary file not shown.

MeddleTools/shaders.blend1

4.02 KB
Binary file not shown.

0 commit comments

Comments
 (0)