feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC. Content: - characters/ Lena/male body lanes, bakes, texture work, run logs - clothing/ garment pipeline, configs, gates, contract docs - garments/ MD-authored garment sources (.zprj/.zpac) - UAL-Lib/ Universal Animation Library 2 source (.blend/.fbx/.glb) - tools/ blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent - docs/, plans/, dev/, .agents/plans/ Repo hygiene: - .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out on purpose — ~250 are already tracked raw and converting them would rewrite every one without shrinking history. - .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies dropped by a `>/dev/null` redirect on Windows). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
import bpy
|
||||
import numpy as np
|
||||
|
||||
bpy.ops.wm.open_mainfile(filepath="characters/female/lena_nude/hires_work/01_imported.blend")
|
||||
obj = bpy.context.selected_objects[0]
|
||||
print(f"Working on {obj.name}")
|
||||
|
||||
mesh = obj.data
|
||||
bpy.context.view_layer.objects.active = obj
|
||||
bpy.ops.object.mode_set(mode="OBJECT")
|
||||
|
||||
import bmesh
|
||||
bm = bmesh.new()
|
||||
bm.from_mesh(mesh)
|
||||
bm.edges.ensure_lookup_table()
|
||||
|
||||
boundary_edges = [e for e in bm.edges if e.is_boundary]
|
||||
print(f"Total boundary edges: {len(boundary_edges)}")
|
||||
|
||||
hems = [
|
||||
{"name": "bra_band", "z": 0.637, "width": 0.005},
|
||||
{"name": "armholes", "z": 0.685, "width": 0.005},
|
||||
{"name": "neckline", "z": 0.734, "width": 0.005},
|
||||
{"name": "briefs_waist", "z": 0.588, "width": 0.005},
|
||||
{"name": "leg_openings", "z": 0.490, "width": 0.005}
|
||||
]
|
||||
|
||||
for hem in hems:
|
||||
z_min = hem["z"] - hem["width"]
|
||||
z_max = hem["z"] + hem["width"]
|
||||
count = 0
|
||||
for e in boundary_edges:
|
||||
v1 = e.verts[0].co.z
|
||||
v2 = e.verts[1].co.z
|
||||
if z_min <= v1 <= z_max or z_min <= v2 <= z_max:
|
||||
count += 1
|
||||
print(f"{hem["name"]} ({hem["z"]:.3f}): {count} boundary edges")
|
||||
|
||||
z_thigh_min, z_thigh_max = 0.28, 0.34
|
||||
thigh_count = 0
|
||||
for e in boundary_edges:
|
||||
v1 = e.verts[0].co.z
|
||||
v2 = e.verts[1].co.z
|
||||
if z_thigh_min <= v1 <= z_thigh_max or z_thigh_min <= v2 <= z_thigh_max:
|
||||
thigh_count += 1
|
||||
print(f"Control band (thigh 0.28-0.34): {thigh_count} boundary edges")
|
||||
|
||||
bm.free()
|
||||
Reference in New Issue
Block a user