feat: implement modular character skinning system with procedural and imported model support
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user