feat: implement modular character skinning system with procedural and imported model support

This commit is contained in:
DottsGit
2026-06-11 23:05:36 -04:00
parent 3bdf8f413b
commit 523fcc5226
14 changed files with 587 additions and 15 deletions
+25 -2
View File
@@ -253,8 +253,13 @@ func _add_procedural_arms(weapon: Node3D) -> void:
# Attach to weapon instead of model_root to avoid arms spinning on reload
var mat = StandardMaterial3D.new()
mat.albedo_color = Color(0.2, 0.4, 0.8) # Player color
mat.roughness = 0.8
var skin_mgr = get_node_or_null("/root/SkinManager")
if skin_mgr and is_instance_valid(player) and "synced_skin_id" in player:
var skin = skin_mgr.get_skin(player.synced_skin_id)
mat = skin.create_material()
else:
mat.albedo_color = Color(0.2, 0.4, 0.8) # Fallback
mat.roughness = 0.8
# Right Arm (Main Grip)
var r_arm = MeshInstance3D.new()
@@ -264,6 +269,7 @@ func _add_procedural_arms(weapon: Node3D) -> void:
r_arm.mesh = r_mesh
var r_pivot = Node3D.new()
r_pivot.name = "ProceduralArmPivotR"
var r_shoulder = Vector3(0.25, -0.3, 0.5)
var r_hand = Vector3(0.04, -0.05, 0.05)
r_pivot.position = r_shoulder
@@ -283,6 +289,7 @@ func _add_procedural_arms(weapon: Node3D) -> void:
l_arm.mesh = l_mesh
var l_pivot = Node3D.new()
l_pivot.name = "ProceduralArmPivotL"
var l_shoulder = Vector3(-0.25, -0.3, 0.4)
var l_hand = Vector3(-0.02, -0.02, -0.3)
l_pivot.position = l_shoulder
@@ -341,3 +348,19 @@ func _input(event: InputEvent) -> void:
if weapons.has(4):
if weapons[4].has_method("do_quick_melee"):
weapons[4].do_quick_melee(prev)
## Re-equips the current weapon to refresh arm colors after a skin change.
func refresh_arm_colors() -> void:
var skin_mgr = get_node_or_null("/root/SkinManager")
if not skin_mgr or not is_instance_valid(player) or not "synced_skin_id" in player:
return
var skin = skin_mgr.get_skin(player.synced_skin_id)
var mat = skin.create_material()
for w in weapons.values():
if not is_instance_valid(w): continue
for child in w.get_children():
if child.name.begins_with("ProceduralArmPivot"):
for grand_child in child.get_children():
if grand_child is MeshInstance3D and grand_child.mesh:
grand_child.set_surface_override_material(0, mat)