Twelve garments, per-body on all 11 bodies, chromakey-gated (worst clips: parka 3px, boots 54, sweater/tank 83, sneakers 100 final-geometry, slides 123, swim trunks 132, cargo 138 — all under the 150px gate), previewed: tank top, sweater (crew-neck via per-body ring-valley probe — first draft read mock-neck, fixed by measured rim circularization), track jacket (recolorable sleeve-stripe region), joggers (side-stripe region), cargo pants, swim trunks, one-piece swimsuit, sneakers (prism-sole), formal shoes, ankle boots (calf shaft), slides (open strap + sole), and the hip-length thrds parka — the first canon-branded garment (Braemar cold-weather cooperative), quilted, logo-capable. Tops now hem into real hip geometry (the natural seg_torso bottom is a 9-14cm tooth ring — the sweater established the hem-into-hips practice). Manifest merged by the lead: 24 clothing entries with region/default-tint metadata. Full modern catalogue: 21 garments across tops/bottoms/feet/ full-body x casual/formal/sport/swim/outerwear. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
50 lines
1.4 KiB
GDScript
50 lines
1.4 KiB
GDScript
extends SceneTree
|
|
## Headless load check: verify garment GLB scenes load and their albedo
|
|
## texture resolves. Usage:
|
|
## godot4 --path client --headless --script res://tools/garment_preview/load_check.gd
|
|
## Temporary tool script — safe to delete after wave-2 integration.
|
|
|
|
const ITEMS := [
|
|
"res://assets/characters/clothing/jeans_modern/average_m.glb",
|
|
"res://assets/characters/clothing/swim_trunks/average_m.glb",
|
|
"res://assets/characters/clothing/swim_trunks/heavy_m.glb",
|
|
]
|
|
|
|
|
|
func _init() -> void:
|
|
for path in ITEMS:
|
|
_check(path)
|
|
quit(0)
|
|
|
|
|
|
func _check(path: String) -> void:
|
|
if not ResourceLoader.exists(path):
|
|
print("loadcheck: MISSING ", path)
|
|
return
|
|
var ps := load(path) as PackedScene
|
|
if ps == null:
|
|
print("loadcheck: LOAD FAILED ", path)
|
|
return
|
|
var inst := ps.instantiate()
|
|
var found := false
|
|
var stack: Array[Node] = [inst]
|
|
while not stack.is_empty():
|
|
var n: Node = stack.pop_back()
|
|
for c in n.get_children():
|
|
stack.append(c)
|
|
if n is MeshInstance3D:
|
|
var mi := n as MeshInstance3D
|
|
if mi.mesh == null:
|
|
continue
|
|
for surf in range(mi.mesh.get_surface_count()):
|
|
var m := mi.mesh.surface_get_material(surf)
|
|
if m is BaseMaterial3D:
|
|
var tex := (m as BaseMaterial3D).albedo_texture
|
|
if tex != null:
|
|
print("loadcheck: OK ", path, " albedo=", tex.get_class(),
|
|
" ", tex.get_width(), "x", tex.get_height())
|
|
found = true
|
|
if not found:
|
|
print("loadcheck: NO ALBEDO ", path)
|
|
inst.free()
|