Spaces:
Running
Running
Deep links from dataset cards: ?class= / &item=, thumbs, class-aware note
Browse files- ?class=<class>[&item=<id>] opens a tab (and item) directly; the URL is kept in sync as tabs change so any view is shareable.
- thumbs/<dataset>.jpg: one hero screenshot per dataset, referenced by the dataset cards' 'Open in Lab' banners.
- The static-class 'Take it home' note was scene-only copy; it now describes USD physics vs GLB preview for non-scene static classes.
- README: table of which dataset backs each tab, plus the deep-link syntax.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- .gitattributes +3 -0
- README.md +12 -0
- index.html +18 -2
- thumbs/articulated-storage-and-appliances.jpg +3 -0
- thumbs/industrial-parts-and-packaging.jpg +3 -0
- thumbs/scenes-and-worlds.jpg +0 -0
- thumbs/warehouse-manipulation-and-states.jpg +3 -0
.gitattributes
CHANGED
|
@@ -1 +1,4 @@
|
|
| 1 |
*.glb filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
*.glb filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
thumbs/warehouse-manipulation-and-states.jpg filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
thumbs/articulated-storage-and-appliances.jpg filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
thumbs/industrial-parts-and-packaging.jpg filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -25,3 +25,15 @@ come from each class's public dataset (`assets/<class>/<vid>/<vid>.glb`); the
|
|
| 25 |
joint metadata is served alongside as `viewer/<class>.json`. three.js from
|
| 26 |
CDN — no build step, no backend.
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
joint metadata is served alongside as `viewer/<class>.json`. three.js from
|
| 26 |
CDN — no build step, no backend.
|
| 27 |
|
| 28 |
+
## Datasets behind each tab
|
| 29 |
+
|
| 30 |
+
| Tab(s) | Dataset |
|
| 31 |
+
| --- | --- |
|
| 32 |
+
| Boxes · Cages · Pallet Boxes | [warehouse-manipulation-and-states](https://huggingface.co/datasets/projectsim/warehouse-manipulation-and-states) |
|
| 33 |
+
| Desks · Ovens · Wardrobes | [articulated-storage-and-appliances](https://huggingface.co/datasets/projectsim/articulated-storage-and-appliances) |
|
| 34 |
+
| Gas Cylinders · Pallet Racking | [industrial-parts-and-packaging](https://huggingface.co/datasets/projectsim/industrial-parts-and-packaging) |
|
| 35 |
+
| Scenes | [scenes-and-worlds](https://huggingface.co/datasets/projectsim/scenes-and-worlds) |
|
| 36 |
+
|
| 37 |
+
Deep links: `?class=<class>` opens a tab (e.g. `?class=logistics_cage`),
|
| 38 |
+
`&item=<id>` selects an item. The header's **Dataset** button always points at
|
| 39 |
+
the active class's folder in its dataset.
|
index.html
CHANGED
|
@@ -220,7 +220,7 @@ body:not(.class-static) #scene-links { display: none; }
|
|
| 220 |
<a id="scene-usd-link" href="#" target="_blank" rel="noopener">Full USD (with Gaussian splat) on Hugging Face →</a>
|
| 221 |
<a id="scene-glb-link" href="#" target="_blank" rel="noopener">This scene as GLB →</a>
|
| 222 |
<a id="scene-dataset-link" href="https://huggingface.co/datasets/projectsim/scenes-and-worlds" target="_blank" rel="noopener">Browse the scenes-and-worlds dataset →</a>
|
| 223 |
-
<div class="note">USD ships the full room including the Gaussian splat backdrop; the GLB is a lightweight preview (splat dropped, textures baked).</div>
|
| 224 |
</div>
|
| 225 |
</aside>
|
| 226 |
</main>
|
|
@@ -603,6 +603,9 @@ async function loadItem(cls, item) {
|
|
| 603 |
? "Full USD (with Gaussian splat) on Hugging Face \u2192"
|
| 604 |
: "Full USD on Hugging Face \u2192";
|
| 605 |
document.getElementById("scene-glb-link").textContent = "This " + (isScene ? "scene" : "asset") + " as GLB \u2192";
|
|
|
|
|
|
|
|
|
|
| 606 |
document.getElementById("scene-dataset-link").href = `${HFDS}/${cls.dataset}/tree/main/${cls.items_dir || ("assets/" + cls.class)}`;
|
| 607 |
document.getElementById("scene-dataset-link").textContent = `Browse ${cls.class} in the ${cls.dataset} dataset \u2192`;
|
| 608 |
}
|
|
@@ -746,6 +749,11 @@ fetch("classes.json")
|
|
| 746 |
dslink.href = `${HFDS}/${cls.dataset}/tree/main/${dsDir}`;
|
| 747 |
dslink.textContent = `Dataset \u00b7 ${cls.class}`;
|
| 748 |
dslink.title = `projectsim/${cls.dataset} \u2192 ${dsDir}`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 749 |
document.body.classList.toggle("class-static", !!cls.static);
|
| 750 |
list.innerHTML = "";
|
| 751 |
cls.items.forEach((item, i) => {
|
|
@@ -773,7 +781,15 @@ fetch("classes.json")
|
|
| 773 |
t.onclick = () => selectClass(cls);
|
| 774 |
tabs.appendChild(t);
|
| 775 |
}
|
| 776 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 777 |
resize();
|
| 778 |
tick();
|
| 779 |
});
|
|
|
|
| 220 |
<a id="scene-usd-link" href="#" target="_blank" rel="noopener">Full USD (with Gaussian splat) on Hugging Face →</a>
|
| 221 |
<a id="scene-glb-link" href="#" target="_blank" rel="noopener">This scene as GLB →</a>
|
| 222 |
<a id="scene-dataset-link" href="https://huggingface.co/datasets/projectsim/scenes-and-worlds" target="_blank" rel="noopener">Browse the scenes-and-worlds dataset →</a>
|
| 223 |
+
<div class="note" id="scene-note">USD ships the full room including the Gaussian splat backdrop; the GLB is a lightweight preview (splat dropped, textures baked).</div>
|
| 224 |
</div>
|
| 225 |
</aside>
|
| 226 |
</main>
|
|
|
|
| 603 |
? "Full USD (with Gaussian splat) on Hugging Face \u2192"
|
| 604 |
: "Full USD on Hugging Face \u2192";
|
| 605 |
document.getElementById("scene-glb-link").textContent = "This " + (isScene ? "scene" : "asset") + " as GLB \u2192";
|
| 606 |
+
document.getElementById("scene-note").textContent = isScene
|
| 607 |
+
? "USD ships the full room including the Gaussian splat backdrop; the GLB is a lightweight preview (splat dropped, textures baked)."
|
| 608 |
+
: "USD carries the sim physics (mass, inertia, colliders) and per-zone PBR maps; the GLB is a static textured preview.";
|
| 609 |
document.getElementById("scene-dataset-link").href = `${HFDS}/${cls.dataset}/tree/main/${cls.items_dir || ("assets/" + cls.class)}`;
|
| 610 |
document.getElementById("scene-dataset-link").textContent = `Browse ${cls.class} in the ${cls.dataset} dataset \u2192`;
|
| 611 |
}
|
|
|
|
| 749 |
dslink.href = `${HFDS}/${cls.dataset}/tree/main/${dsDir}`;
|
| 750 |
dslink.textContent = `Dataset \u00b7 ${cls.class}`;
|
| 751 |
dslink.title = `projectsim/${cls.dataset} \u2192 ${dsDir}`;
|
| 752 |
+
if (!LOCAL_BASE) {
|
| 753 |
+
const q = new URLSearchParams(location.search);
|
| 754 |
+
q.set("class", cls.class); q.delete("item");
|
| 755 |
+
history.replaceState(null, "", `?${q}`);
|
| 756 |
+
}
|
| 757 |
document.body.classList.toggle("class-static", !!cls.static);
|
| 758 |
list.innerHTML = "";
|
| 759 |
cls.items.forEach((item, i) => {
|
|
|
|
| 781 |
t.onclick = () => selectClass(cls);
|
| 782 |
tabs.appendChild(t);
|
| 783 |
}
|
| 784 |
+
// ?class=<class>[&item=<id>] deep-links into a tab (used by the dataset
|
| 785 |
+
// cards' "Open in Lab" links). The URL is kept in sync on tab change.
|
| 786 |
+
const want = new URLSearchParams(location.search);
|
| 787 |
+
const startCls = catalog.find(c => c.class === want.get("class")) || catalog[0];
|
| 788 |
+
selectClass(startCls);
|
| 789 |
+
if (want.get("item")) {
|
| 790 |
+
const idx = startCls.items.findIndex(it => it.id === want.get("item"));
|
| 791 |
+
if (idx > 0) list.children[idx]?.click();
|
| 792 |
+
}
|
| 793 |
resize();
|
| 794 |
tick();
|
| 795 |
});
|
thumbs/articulated-storage-and-appliances.jpg
ADDED
|
|
Git LFS Details
|
thumbs/industrial-parts-and-packaging.jpg
ADDED
|
|
Git LFS Details
|
thumbs/scenes-and-worlds.jpg
ADDED
|
|
thumbs/warehouse-manipulation-and-states.jpg
ADDED
|
|
Git LFS Details
|