cozyclay 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +17 -2
- package/THIRD_PARTY_NOTICES.md +8 -0
- package/bin/agent/agent-routes.mjs +211 -36
- package/bin/agent/agent-runner.mjs +98 -4
- package/bin/agent/codex-client.mjs +2 -1
- package/bin/agent/fal-contract.mjs +0 -17
- package/bin/agent/h3-preservation.mjs +6 -8
- package/bin/agent/provider-keys.mjs +1 -1
- package/bin/agent/providers.mjs +124 -3
- package/bin/agent/script-tool.mjs +74 -0
- package/bin/agent/session-store.mjs +5 -5
- package/bin/agent/studio-prompt.mjs +2 -1
- package/bin/agent/studio-rebase.mjs +314 -0
- package/bin/agent/studio-tools.mjs +21 -14
- package/bin/agent/supervisor.mjs +311 -0
- package/bin/agent/video-adapters.mjs +0 -7
- package/bin/codex-auth.mjs +4 -4
- package/bin/live/cli.mjs +2 -3
- package/bin/live/client.mjs +1 -1
- package/bin/live/studio.mjs +5 -2
- package/bin/mcp-runtime.mjs +2 -2
- package/bin/telemetry-state.mjs +3 -3
- package/dist/app/index.html +6 -6
- package/dist/assets/analytics-B41FmPYI.js +1 -0
- package/dist/assets/app-Do-Og5Pu.css +1 -0
- package/dist/assets/app-DwP-tl2x.js +4920 -0
- package/dist/assets/{demo-ByeYp-dY.js → demo-Dt0qZfS7.js} +1 -1
- package/dist/assets/{first-shot-handoff-DgT28ZiV.js → first-shot-handoff-BlT33CGf.js} +1 -1
- package/dist/assets/{landing-BaXkpFip.js → landing-BSesrCpL.js} +1 -1
- package/dist/assets/scene-asset-sync-BCWDJB1d.js +19 -0
- package/dist/assets/{shot-prompt-CbqWcWYi.css → scene-asset-sync-DjJ_cJ2R.css} +1 -1
- package/dist/assets/{ticket-BcmsnHn5.js → ticket-jqMhqL88.js} +1 -1
- package/dist/assets/workflow-Br-K7Srs.js +179 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/index.html +328 -222
- package/dist/sitemap.xml +1 -1
- package/dist/workflow/index.html +4 -4
- package/mcp/LIVE-PROTOCOL.md +23 -2
- package/mcp/README.md +37 -2
- package/mcp/ardy-prompts.mjs +1 -1
- package/mcp/image-file.mjs +132 -0
- package/mcp/live-hub.mjs +2 -2
- package/mcp/package.json +1 -0
- package/mcp/runtime/package-lock.json +7 -0
- package/mcp/runtime/package.json +1 -0
- package/mcp/server.mjs +0 -6
- package/mcp/tool-handlers.mjs +289 -87
- package/package.json +11 -2
- package/src/App.jsx +789 -263
- package/src/agent-image-client.js +94 -0
- package/src/analytics.js +47 -3
- package/src/app-stage.jsx +129 -2745
- package/src/ardy/auto-physics.js +6 -16
- package/src/ardy/collision-blockers.js +3 -7
- package/src/ardy/fix-collisions.js +5 -35
- package/src/ardy/ik-drag.js +86 -5
- package/src/ardy/ik-key-json.js +3 -1
- package/src/ardy/ik.js +15 -13
- package/src/ardy/motion-calibration.js +1 -1
- package/src/ardy/npz.js +0 -8
- package/src/ardy/physics-panel.jsx +3 -2
- package/src/ardy/physics-review.js +3 -2
- package/src/ardy/physics-support.js +1 -1
- package/src/ardy/physics-surface.js +1 -1
- package/src/ardy/platform-fit-panel.jsx +2 -1
- package/src/ardy/playback.js +1 -5
- package/src/ardy/range-pin.js +2 -2
- package/src/ardy/root-drop.js +0 -1
- package/src/ardy/timeline.css +184 -6
- package/src/ardy/timeline.jsx +113 -28
- package/src/ardy/to-cskel27.js +0 -2
- package/src/ardy/waypoints.js +0 -3
- package/src/ardy-bridge-contract.js +281 -0
- package/src/asset-pane.jsx +19 -9
- package/src/auto-color.js +1 -1
- package/src/burn-in.js +1 -1
- package/src/camera-block.js +1 -1
- package/src/camera-follow.js +75 -32
- package/src/camera-move.js +0 -6
- package/src/camera-tutorial.jsx +6 -7
- package/src/character-kind.js +79 -0
- package/src/command-bus.js +76 -17
- package/src/commands/cast.js +31 -7
- package/src/commands/elements/object.js +1 -1
- package/src/commands/elements/shot.js +1 -1
- package/src/commands/elements.js +1 -1
- package/src/commands/export.js +3 -3
- package/src/commands/motion.js +2 -2
- package/src/commands/objects.js +105 -10
- package/src/commands/project.js +15 -2
- package/src/commands/sculpt-images.js +53 -0
- package/src/commands/shot.js +88 -10
- package/src/commands/view.js +10 -4
- package/src/coplanar-depth.js +216 -0
- package/src/cuts.js +7 -6
- package/src/domains/cast.js +60 -43
- package/src/domains/motion/motion-intent-codec.js +50 -0
- package/src/domains/motion/motion-range-pin-rules.js +23 -0
- package/src/domains/motion/motion-video-capture.js +664 -0
- package/src/domains/motion.js +253 -742
- package/src/domains/objects.js +106 -5
- package/src/domains/scenes.js +79 -28
- package/src/domains/shots.js +33 -7
- package/src/error-boundary.jsx +1 -1
- package/src/execution-telemetry.js +5 -5
- package/src/facing-marks.js +14 -1
- package/src/first-success-guide.jsx +35 -4
- package/src/gizmo-claim.js +3 -1
- package/src/grid-floor.jsx +1 -4
- package/src/hierarchy-model.js +48 -35
- package/src/hierarchy-panel.css +1 -0
- package/src/hierarchy-panel.jsx +54 -102
- package/src/history.js +0 -2
- package/src/i2v-motion-client.js +1 -4
- package/src/ime.js +6 -0
- package/src/keyframe-pack.js +15 -6
- package/src/line-edit.js +4 -4
- package/src/live-control.js +6 -6
- package/src/matte-editor.js +2 -8
- package/src/matte.js +0 -19
- package/src/mesh-graph-clone.js +16 -2
- package/src/mesh-sniff.js +0 -1
- package/src/monotone-cubic.js +40 -0
- package/src/motion-store.js +4 -4
- package/src/motion-trail.js +5 -11
- package/src/multimodel-ingest.js +1 -3
- package/src/object-catalog.jsx +7 -5
- package/src/object-gizmo.jsx +45 -31
- package/src/object-path.js +310 -67
- package/src/object-travel.js +224 -0
- package/src/otio.js +8 -3
- package/src/panels/CharacterTransformPanel.jsx +24 -6
- package/src/panels/ObjectTransformPanel.jsx +4 -3
- package/src/panels/PoseImagePanel.jsx +205 -0
- package/src/panels/PromptBlocksPanel.jsx +3 -1
- package/src/panels/ProxyFigurePanel.jsx +56 -0
- package/src/panels/ReferenceImageField.jsx +1 -1
- package/src/panels/RigControlPanel.jsx +24 -3
- package/src/panels/RigPanel.jsx +2 -1
- package/src/panels/SculptPanel.jsx +405 -0
- package/src/panels/SubjectBox.jsx +1 -1
- package/src/panels/SubjectsPanel.jsx +0 -2
- package/src/panels/VideoCapturePanel.jsx +2 -1
- package/src/panels/pose-image.css +42 -0
- package/src/panels/pose.css +3 -0
- package/src/panels/sculpt.css +162 -0
- package/src/plan-diagram.js +184 -0
- package/src/planview.jsx +127 -80
- package/src/playground.js +3 -5
- package/src/pose-fade.js +77 -0
- package/src/pose-gizmo.css +23 -0
- package/src/pose-gizmo.js +96 -0
- package/src/posestudio.jsx +134 -83
- package/src/project-browser.css +53 -0
- package/src/project-browser.jsx +49 -4
- package/src/project.js +55 -24
- package/src/props.jsx +177 -36
- package/src/proxy-figure.jsx +69 -0
- package/src/range-pin-panel.jsx +0 -1
- package/src/receipt-findings.js +20 -0
- package/src/render-passes.js +0 -1
- package/src/resource-status.jsx +1 -1
- package/src/root-path.js +48 -0
- package/src/route-owner.js +52 -0
- package/src/scene-asset-cache.js +1 -2
- package/src/scene-assets.js +12 -4
- package/src/scene-fbx.js +1 -1
- package/src/scene-mesh-cache.js +0 -1
- package/src/scene-objects.js +319 -19
- package/src/scenes.js +58 -9
- package/src/sculpt-blueprint.js +65 -0
- package/src/sculpt-compare.js +384 -0
- package/src/sculpt-geometry.js +141 -0
- package/src/sculpt-mode.js +168 -0
- package/src/sculpt-recipe.js +385 -0
- package/src/sculpt-run.js +351 -0
- package/src/sculpt-stage.jsx +221 -0
- package/src/settings-menu.jsx +1 -1
- package/src/shell/BoardSlot.jsx +341 -0
- package/src/shell/BottomDock.jsx +58 -14
- package/src/shell/DetailsSlot.jsx +26 -6
- package/src/shell/MenuBar.jsx +78 -6
- package/src/shell/OutlinerSlot.jsx +3 -1
- package/src/shell/TopBar.jsx +17 -3
- package/src/shell/ViewportToolbar.jsx +18 -3
- package/src/shell/dock.css +239 -0
- package/src/shell/glass-regions.css +3 -2
- package/src/shell/log-store.js +4 -4
- package/src/shell/mode.css +20 -0
- package/src/shell/studio-shell-context.js +4 -1
- package/src/shot-authoring.js +69 -6
- package/src/stable-items.js +1 -1
- package/src/stage-attach-frames.js +169 -0
- package/src/stage-canvas-rigs.jsx +402 -0
- package/src/stage-capture.jsx +216 -0
- package/src/stage-characters.jsx +302 -0
- package/src/stage-editor-gizmos.jsx +1229 -0
- package/src/stage-labels-ko.js +204 -0
- package/src/stage-startup-defaults.js +182 -0
- package/src/starter-scenes.js +1 -1
- package/src/storyboard.js +24 -5
- package/src/studio-actions.js +42 -9
- package/src/studio-agent-commands.js +186 -23
- package/src/studio-agent-context.js +11 -9
- package/src/studio-agent-motion.js +2 -1
- package/src/studio-agent-protocol.js +56 -23
- package/src/studio-app-binding.js +52 -23
- package/src/studio-contact-sheet.js +3 -3
- package/src/studio-elements.js +11 -2
- package/src/studio-geometry-facts.js +114 -0
- package/src/styles.css +92 -9
- package/src/ui-scrub.js +4 -4
- package/src/ui.jsx +6 -4
- package/src/use-asset-shelf.js +60 -0
- package/src/use-camera-tutorial.js +50 -0
- package/src/use-embed-bridge.js +12 -0
- package/src/use-first-success-prompt.js +7 -0
- package/src/use-i2v-capture-modal.js +15 -0
- package/src/use-sculpt-mode.js +95 -0
- package/src/workflow/AgentPanel.jsx +106 -18
- package/src/workflow/WorkflowBuilder.jsx +1 -1
- package/src/workflow/agent-client.js +113 -45
- package/src/workflow/agent-panel.css +35 -0
- package/src/workflow/attachment-image.js +1 -1
- package/src/workflow/canvas-commands.js +3 -3
- package/src/workflow/cozy-scene-node.js +3 -3
- package/src/workflow/local-workflow.js +2 -2
- package/src/workflow/motion-input.js +3 -3
- package/src/workflow/node-schema.js +1 -1
- package/src/workflow/scene-asset-sync.js +2 -9
- package/src/workflow/shot-prompt-node.js +1 -1
- package/src/workflow/video-contract.js +1 -1
- package/src/workflow/workflow-resources.js +0 -8
- package/src/workflow-send.js +87 -0
- package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
- package/tools/check-eslint.mjs +57 -0
- package/tools/check-knip.mjs +60 -0
- package/tools/check-loc.mjs +54 -0
- package/tools/demo-worker/api-client.mjs +7 -13
- package/tools/demo-worker/generate.mjs +2 -4
- package/tools/eslint-baseline.json +23 -0
- package/tools/kimodo/effector-constraints.mjs +4 -4
- package/tools/kimodo/generate.mjs +1 -1
- package/tools/knip-baseline.json +331 -0
- package/tools/loc-baseline.json +126 -0
- package/tools/process-supervisor.mjs +1 -1
- package/tools/projflow/replay.mjs +4 -4
- package/tools/projflow/runner.mjs +3 -3
- package/tools/qa/studio-control-count.mjs +2 -0
- package/tools/run-tests.mjs +94 -7
- package/dist/assets/analytics-MVZOEW8O.js +0 -1
- package/dist/assets/app-BxBLC6GT.js +0 -4876
- package/dist/assets/app-CJdxvnrl.css +0 -1
- package/dist/assets/shot-prompt-hN0j_O-p.js +0 -17
- package/dist/assets/workflow-B5XZwVfe.js +0 -179
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Findings an edit receipt reports beside its readback: a value the domain
|
|
2
|
+
// moved to stay inside its limits, so a request that did not land as asked is
|
|
3
|
+
// never silent.
|
|
4
|
+
const round = value => Number(value.toFixed(4));
|
|
5
|
+
|
|
6
|
+
/** One CLAMPED warning for an entity when any requested number differs from
|
|
7
|
+
* the number the domain kept, or null. `requested` and `applied` are keyed by
|
|
8
|
+
* the same channel names (x, y, z, scaleX, scale, ...). */
|
|
9
|
+
export function clampWarning(id, requested, applied) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
for (const [key, asked] of Object.entries(requested)) {
|
|
12
|
+
const kept = applied?.[key];
|
|
13
|
+
if (!Number.isFinite(asked) || !Number.isFinite(kept) || Math.abs(asked - kept) < 1e-9) continue;
|
|
14
|
+
const limit = asked < kept ? 'minimum' : 'maximum';
|
|
15
|
+
parts.push(`${key} ${round(asked)}→${round(kept)} (${limit} ${round(kept)}${/^(x|y|z)$/.test(key) ? ' m' : ''})`);
|
|
16
|
+
}
|
|
17
|
+
if (!parts.length) return null;
|
|
18
|
+
const message = [...`Clamped: ${parts.join('; ')}`];
|
|
19
|
+
return { code: 'CLAMPED', id, message: message.length > 120 ? `${message.slice(0, 119).join('')}…` : message.join('') };
|
|
20
|
+
}
|
package/src/render-passes.js
CHANGED
package/src/resource-status.jsx
CHANGED
package/src/root-path.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isProxyFigure } from "./scenes.js";
|
|
2
|
+
|
|
3
|
+
// Frame-addressed scene placement. No renderer or waypoint authoring state.
|
|
4
|
+
export function sampleRootPath(character, frame, { fps = 24 } = {}) {
|
|
5
|
+
const waypoints = character.layer?.waypoints ?? [];
|
|
6
|
+
if (!waypoints.length) return null;
|
|
7
|
+
const base = { x: character.x, z: character.z, heading: character.rot };
|
|
8
|
+
if (frame <= 0) return base;
|
|
9
|
+
let previous = { frame: 0, ...base };
|
|
10
|
+
let sampled = base;
|
|
11
|
+
for (const pin of waypoints) {
|
|
12
|
+
const dx = pin.x - previous.x;
|
|
13
|
+
const dz = pin.z - previous.z;
|
|
14
|
+
const heading = pin.heading ?? (dx || dz ? Math.atan2(dx, dz) * 180 / Math.PI : sampled.heading);
|
|
15
|
+
const weight = Math.min(1, (frame / fps - previous.frame / fps) / (pin.frame / fps - previous.frame / fps));
|
|
16
|
+
sampled = {
|
|
17
|
+
x: previous.x + dx * weight,
|
|
18
|
+
z: previous.z + dz * weight,
|
|
19
|
+
heading,
|
|
20
|
+
};
|
|
21
|
+
if (frame <= pin.frame) return sampled;
|
|
22
|
+
previous = pin;
|
|
23
|
+
}
|
|
24
|
+
return sampled;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// takeRoot is an already sampled world-space { x, z, rot? } supplied by the
|
|
28
|
+
// take owner. Shot lookup is injected so this module does not own a timeline.
|
|
29
|
+
export function resolveCharacterPlacement(character, frame, { shotAt = () => null, takeRoot = null } = {}) {
|
|
30
|
+
const base = { x: character.x, z: character.z, rot: character.rot, posture: character.posture, pose: character.pose };
|
|
31
|
+
if (takeRoot) return { ...base, ...takeRoot };
|
|
32
|
+
const root = sampleRootPath(character, frame);
|
|
33
|
+
if (root) return { ...base, x: root.x, z: root.z, rot: root.heading };
|
|
34
|
+
return { ...base, ...shotAt(frame)?.cast?.[character.id] };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Rendering and export share the same placement policy. A rigged character's
|
|
38
|
+
// authored waypoints belong to its take, not its world transform; only proxy
|
|
39
|
+
// figures use the root-path sampler without a take. Still cast overrides are
|
|
40
|
+
// editorial placement and apply to either kind while the playhead is inside a
|
|
41
|
+
// still.
|
|
42
|
+
export function placementAt(character, frame, { shotAt = () => null, takeRoot = null } = {}) {
|
|
43
|
+
if (takeRoot) return resolveCharacterPlacement(character, frame, { takeRoot });
|
|
44
|
+
const shot = shotAt(frame);
|
|
45
|
+
if (isProxyFigure(character)) return resolveCharacterPlacement(character, frame, { shotAt: () => shot });
|
|
46
|
+
if (shot?.kind === "still") return { ...character, ...shot.cast?.[character.id] };
|
|
47
|
+
return character;
|
|
48
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whose route the studio shows for a selection.
|
|
3
|
+
*
|
|
4
|
+
* A route belongs to one record, but a car is a group: "Vintage Car" (an
|
|
5
|
+
* Empty) → "Chassis" (owns the route) → parts. The operator selects the group,
|
|
6
|
+
* so the rail, its dots and the route strip follow the group to the record
|
|
7
|
+
* that actually owns the travel. Pure and flat-record based, like
|
|
8
|
+
* object-travel.js: `parent` is grouping only.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const hasRoute = (object) => !!object && !!object.path;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The record whose route a selection stands for: the selected record when it
|
|
15
|
+
* owns a path, else its nearest routed descendant (breadth-first; ties at one
|
|
16
|
+
* depth go to the first in record order), else null. A descendant carried by a
|
|
17
|
+
* character (`attach`) is skipped: its route never plays.
|
|
18
|
+
*
|
|
19
|
+
* @param {object[]|Map<string, object>} objects scene records
|
|
20
|
+
* @param {string|null} selectedId
|
|
21
|
+
*/
|
|
22
|
+
export function routeOwnerFor(objects, selectedId) {
|
|
23
|
+
if (!selectedId) return null;
|
|
24
|
+
const list = objects instanceof Map ? [...objects.values()] : Array.isArray(objects) ? objects : [];
|
|
25
|
+
const selected = list.find((object) => object && object.id === selectedId);
|
|
26
|
+
if (!selected) return null;
|
|
27
|
+
if (hasRoute(selected)) return selected;
|
|
28
|
+
const childrenOf = new Map();
|
|
29
|
+
for (const object of list) {
|
|
30
|
+
if (!object || typeof object.parent !== "string") continue;
|
|
31
|
+
if (!childrenOf.has(object.parent)) childrenOf.set(object.parent, []);
|
|
32
|
+
childrenOf.get(object.parent).push(object);
|
|
33
|
+
}
|
|
34
|
+
const order = new Map(list.map((object, index) => [object, index]));
|
|
35
|
+
const seen = new Set([selected.id]);
|
|
36
|
+
let level = [selected];
|
|
37
|
+
while (level.length) {
|
|
38
|
+
const next = [];
|
|
39
|
+
let best = null;
|
|
40
|
+
for (const node of level) {
|
|
41
|
+
for (const child of childrenOf.get(node.id) ?? []) {
|
|
42
|
+
if (seen.has(child.id)) continue;
|
|
43
|
+
seen.add(child.id);
|
|
44
|
+
if (!child.attach && hasRoute(child) && (!best || order.get(child) < order.get(best))) best = child;
|
|
45
|
+
next.push(child);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (best) return best;
|
|
49
|
+
level = next;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
package/src/scene-asset-cache.js
CHANGED
|
@@ -128,7 +128,7 @@ export function createAssetTextureCache({
|
|
|
128
128
|
entry.promise = null;
|
|
129
129
|
// A GLB in this function would always hit createImageBitmap. Mesh import
|
|
130
130
|
// stores bytes with putAsset and leaves textures alone.
|
|
131
|
-
if (isMeshRecord(stored)
|
|
131
|
+
if (isMeshRecord(stored)) return stored;
|
|
132
132
|
const texture = await textureFromAsset(stored);
|
|
133
133
|
if (!texture || entry.generation !== generation) {
|
|
134
134
|
dispose(texture);
|
|
@@ -183,4 +183,3 @@ export const assetRecord = cache.assetRecord;
|
|
|
183
183
|
export const rememberAsset = cache.rememberAsset;
|
|
184
184
|
export const evictAssetTexture = cache.evictAssetTexture;
|
|
185
185
|
export const subscribeToAssetTexture = cache.subscribeToAssetTexture;
|
|
186
|
-
export const clearAssetTextures = cache.clearAssetTextures;
|
package/src/scene-assets.js
CHANGED
|
@@ -29,9 +29,9 @@ export const MESH_ID_PREFIX = "mesh-";
|
|
|
29
29
|
* pictures, and short enough to read in a scene file. */
|
|
30
30
|
const ASSET_ID_HEX = 32;
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
const ASSET_DB_NAME = "cozyclay.assets";
|
|
33
|
+
const ASSET_DB_VERSION = 1;
|
|
34
|
+
const ASSET_STORE_NAME = "images";
|
|
35
35
|
|
|
36
36
|
/** What an import will accept. SVG is excluded on purpose: it is a document
|
|
37
37
|
* that can carry script, and a set piece is not worth that. */
|
|
@@ -308,7 +308,15 @@ export async function importImageFile(file, {
|
|
|
308
308
|
* going away. This is the reachable set; `unreachableAssetIds` is the sweep.
|
|
309
309
|
*/
|
|
310
310
|
export function referencedAssetIds(scenes) {
|
|
311
|
-
|
|
311
|
+
const ids = new Set(assetUsageCounts(scenes).keys());
|
|
312
|
+
// A storyboard panel's stylized picture is held by its shot, not by an object.
|
|
313
|
+
for (const scene of Array.isArray(scenes) ? scenes : []) {
|
|
314
|
+
const shots = scene?.shotDocument?.shots;
|
|
315
|
+
for (const shot of Array.isArray(shots) ? shots : []) {
|
|
316
|
+
if (isImageAssetId(shot?.stylizedAssetId)) ids.add(shot.stylizedAssetId);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return ids;
|
|
312
320
|
}
|
|
313
321
|
|
|
314
322
|
/**
|
package/src/scene-fbx.js
CHANGED
|
@@ -46,7 +46,7 @@ export function readFbxVersion(bytes) {
|
|
|
46
46
|
return Number.isFinite(version) ? version : null;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
function parseFbxGroup(bytes) {
|
|
50
50
|
const buffer = arrayBufferOf(bytes);
|
|
51
51
|
if (!buffer || !buffer.byteLength) return null;
|
|
52
52
|
return new FBXLoader().parse(buffer, "");
|
package/src/scene-mesh-cache.js
CHANGED
|
@@ -132,4 +132,3 @@ const cache = createMeshSceneCache();
|
|
|
132
132
|
export const loadMeshScene = cache.loadMeshScene;
|
|
133
133
|
export const subscribeToMeshScene = cache.subscribeToMeshScene;
|
|
134
134
|
export const evictMeshScene = cache.evictMeshScene;
|
|
135
|
-
export const clearMeshScenes = cache.clearMeshScenes;
|