diff --git a/assets/avatars/hair_waterbuffalo_01.glb b/assets/avatars/hair_waterbuffalo_01.glb index 869370e..4d9c028 100644 Binary files a/assets/avatars/hair_waterbuffalo_01.glb and b/assets/avatars/hair_waterbuffalo_01.glb differ diff --git a/scripts/tools/gen_placeholder_avatars.gd b/scripts/tools/gen_placeholder_avatars.gd index 746e23c..4cac37d 100644 --- a/scripts/tools/gen_placeholder_avatars.gd +++ b/scripts/tools/gen_placeholder_avatars.gd @@ -304,21 +304,33 @@ func _gen_water_buffalo_hat() -> void: var root := Node3D.new() root.name = "AttachmentRoot" - # 1. Hat Cap (royal blue felt lodge hat, sitting on head crown) - var cap := MeshInstance3D.new() - cap.name = "HatCap" - var cap_mesh := CylinderMesh.new() - cap_mesh.top_radius = 0.28 - cap_mesh.bottom_radius = 0.32 - cap_mesh.height = 0.26 - cap.mesh = cap_mesh - cap.position = Vector3(0.0, 0.12, 0.0) var cap_mat := StandardMaterial3D.new() cap_mat.albedo_color = Color(0.13, 0.20, 0.58) # Flintstones Water Buffalo blue cap_mat.roughness = 0.95 + + # 1. Hat Cap Base (taller cylindrical body) + var cap := MeshInstance3D.new() + cap.name = "HatCap" + var cap_mesh := CylinderMesh.new() + cap_mesh.top_radius = 0.30 + cap_mesh.bottom_radius = 0.32 + cap_mesh.height = 0.30 + cap.mesh = cap_mesh + cap.position = Vector3(0.0, 0.15, 0.0) cap.material_override = cap_mat root.add_child(cap) + # 1b. Rounded Dome Top (makes the hat taller and rounded, less flat) + var dome := MeshInstance3D.new() + dome.name = "HatDome" + var dome_mesh := SphereMesh.new() + dome_mesh.radius = 0.30 + dome_mesh.height = 0.28 + dome.mesh = dome_mesh + dome.position = Vector3(0.0, 0.26, 0.0) + dome.material_override = cap_mat + root.add_child(dome) + # 2. Fur Brim / Rim at bottom edge of cap var brim := MeshInstance3D.new() brim.name = "FurBrim" @@ -339,7 +351,7 @@ func _gen_water_buffalo_hat() -> void: var medal_mesh := BoxMesh.new() medal_mesh.size = Vector3(0.12, 0.10, 0.04) medal.mesh = medal_mesh - medal.position = Vector3(0.0, 0.12, -0.32) + medal.position = Vector3(0.0, 0.16, -0.32) var medal_mat := StandardMaterial3D.new() medal_mat.albedo_color = Color(0.96, 0.82, 0.18) # Gold lodge crest medal_mat.metallic = 0.7 @@ -347,55 +359,42 @@ func _gen_water_buffalo_hat() -> void: medal.material_override = medal_mat root.add_child(medal) - # Horn material: ivory/bone + # Horn material: first part is ivory/white, tip is brown (no middle piece) var horn_mat := StandardMaterial3D.new() - horn_mat.albedo_color = Color(0.92, 0.89, 0.82) # Bone/ivory - horn_mat.roughness = 0.5 + horn_mat.albedo_color = Color(0.93, 0.90, 0.82) # Bone/ivory white + horn_mat.roughness = 0.45 var tip_mat := StandardMaterial3D.new() - tip_mat.albedo_color = Color(0.20, 0.17, 0.14) # Dark horn tip - tip_mat.roughness = 0.6 + tip_mat.albedo_color = Color(0.28, 0.18, 0.12) # Buffalo horn brown + tip_mat.roughness = 0.55 - # 4. Sweeping Curved Water Buffalo Horns (curving outward and up) + # 4. Short Water Buffalo Horns: white base + brown tip only for side in [-1.0, 1.0]: var side_name := "Right" if side < 0.0 else "Left" - # Base segment (projecting horizontally outwards from side of hat) + # First part: white base segment projecting outward from side of hat var h_base := MeshInstance3D.new() h_base.name = "Horn_%s_Base" % side_name var base_mesh := CylinderMesh.new() base_mesh.bottom_radius = 0.08 - base_mesh.top_radius = 0.065 - base_mesh.height = 0.20 + base_mesh.top_radius = 0.055 + base_mesh.height = 0.17 h_base.mesh = base_mesh - h_base.position = Vector3(side * 0.36, 0.12, 0.02) - h_base.rotation_degrees = Vector3(10.0, side * -15.0, side * -70.0) + h_base.position = Vector3(side * 0.34, 0.18, 0.01) + h_base.rotation_degrees = Vector3(5.0, side * -10.0, side * -60.0) h_base.material_override = horn_mat root.add_child(h_base) - # Mid segment (sweeping upward and outward) - var h_mid := MeshInstance3D.new() - h_mid.name = "Horn_%s_Mid" % side_name - var mid_mesh := CylinderMesh.new() - mid_mesh.bottom_radius = 0.065 - mid_mesh.top_radius = 0.045 - mid_mesh.height = 0.22 - h_mid.mesh = mid_mesh - h_mid.position = Vector3(side * 0.52, 0.24, 0.0) - h_mid.rotation_degrees = Vector3(15.0, side * -10.0, side * -25.0) - h_mid.material_override = horn_mat - root.add_child(h_mid) - - # Tip segment (curving upward and inward to sharp tip) + # Second part: brown tip segment curving upward (middle piece removed) var h_tip := MeshInstance3D.new() h_tip.name = "Horn_%s_Tip" % side_name var tip_mesh := CylinderMesh.new() - tip_mesh.bottom_radius = 0.045 + tip_mesh.bottom_radius = 0.055 tip_mesh.top_radius = 0.005 - tip_mesh.height = 0.18 + tip_mesh.height = 0.15 h_tip.mesh = tip_mesh - h_tip.position = Vector3(side * 0.56, 0.40, -0.04) - h_tip.rotation_degrees = Vector3(20.0, 0.0, side * 20.0) + h_tip.position = Vector3(side * 0.46, 0.28, -0.01) + h_tip.rotation_degrees = Vector3(12.0, 0.0, side * 10.0) h_tip.material_override = tip_mat root.add_child(h_tip)