Proposal: DisplayXR for CLO Virtual Fashion (garment design in a dedicated 3D window via the DisplayXR Browser, Leia SR tested) #2434
joehillthunder
started this conversation in
Ideas
Replies: 1 comment
Hosting-readiness check: pass (2026-10-27)Installed runtime v2.55.0 with the Leia SR plug-in; no dev settings.
Not tested: CLO's side and top camera views; the USD export opened in USD Composer. 🤖 Generated with Claude Code |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Summary
A thin CLO plug-in shows the garment being designed in CLO (CLO Virtual Fashion) in
glasses-free 3D, in its own window beside CLO, following CLO's 3D-window camera. CLO's
public API (SDK 2026.1) can export the scene and read the 3D window's camera, but has no
draw hook into that window. So the integration uses the dedicated 3D window class from
the architecture direction
(#2331 (comment)),
not the app's own viewport: a windowed DisplayXR Browser app window running an inline-3D
page. It needs no native code and no runtime changes, and it was checked seated on the tested
display (Leia SR, 34.4 × 21.5 cm, 300 % scale) in CLO 2026.1.336.
Code: private repo
joehillthunder/displayxr-clo(Apache-2.0), access on request.What it does
the view as a Custom View and reads that back.
couplingmodule,each marked "not a contract".
bind pose, some parented under joints, and in millimetres (its SDK says metres). The
plug-in rewrites only the GLB's JSON: it drops the skins, moves those meshes to the scene
root and scales the scene to metres. Garment pieces come out as real draped geometry
(Modular Library shorts: five pieces, 9–14 cm deep each), not a flat cloth with a normal
map, so the folds read in stereo.
with no server and nothing on the network. It polls a live folder (
state.json, then thenewest
scene-<n>.glb). A first version served the page from a127.0.0.1server inCLO's embedded Python. That doesn't work: the embedded interpreter only runs while a
menu or button callback runs, so the server accepted connections and never answered.
again returns to the window. The status line says "3D active" while the display weaves
the page.
each sync. A drag turns the garment all the way round, and the wheel zooms.
Depth and comfort (measured)
(0.14 % of panel width in front of the glass, 0.42 % behind) is a named constant until
Display info: publish the comfort budget (front/behind disparity limits), e.g. layout.comfort {front_frac, behind_frac} #2388 publishes it.
times the budget in front. That doubles the usable depth compared with a glass through
the middle.
Parallax is linear in strength, so the readout holds at the budget at any zoom or angle.
100 %, 0.18 / 0.51 % at 125 %, 0.21 / 0.59 % at 150 %.
transparent black. Woven, those pixels showed stale content (a bright ring, earlier
"Loading…" text) instead of the page. The page now clears every camera to an opaque
mid-grey. Mid-grey rather than black, because light skin or fabric on black makes
crosstalk more visible.
What a shared host library would need
For apps like CLO (scripting and export, but no draw hook), a page plus a plug-in is enough
today. Five things would make it a supported path instead of a workaround:
access to one live folder. Today the plug-in starts
chrome.exe --app=file:///… --allow-file-access-from-filesin a dedicated profile. A launch option or manifest thatgrants one folder would remove the flag and the per-app profile.
rig's eye cameras. Every embedding page otherwise has to patch the cameras.
the budget while the user zooms and turns: glass placement and continuous strength
refit, as above. Every object viewer needs it, and the current per-pose fit doesn't
follow the wheel zoom.
orbitStyleinaddSplat(turntable). Object viewers need a fullturn, and the default is a 15° tilt that springs back. The page sets it on the viewer
directly today.
Open items
of the panel's resolution at 300 % scale. Full resolution (
renderScale1.5) dropped to15 fps with the GPU shared with two other 3D apps. Next: try about 1.25×, and measure on
an idle GPU.
cameraMatrixtranslationlooks like a world-to-camera matrix (front view: t = (0, −934, −9167) mm). The front view
is right either way. Side and top views need a check in CLO before the plug-in can follow
them reliably.
on Update 3D and Sync camera only.
🤖 Generated with Claude Code
All reactions