@triscope/core 0.4.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/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/compose.d.ts +11 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +152 -0
- package/dist/compose.js.map +1 -0
- package/dist/editor.d.ts +14 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +131 -0
- package/dist/editor.js.map +1 -0
- package/dist/harness.d.ts +199 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +1027 -0
- package/dist/harness.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +94 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +434 -0
- package/dist/inspect.js.map +1 -0
- package/dist/knob-utils.d.ts +22 -0
- package/dist/knob-utils.d.ts.map +1 -0
- package/dist/knob-utils.js +51 -0
- package/dist/knob-utils.js.map +1 -0
- package/dist/lab/css.d.ts +11 -0
- package/dist/lab/css.d.ts.map +1 -0
- package/dist/lab/css.js +57 -0
- package/dist/lab/css.js.map +1 -0
- package/dist/lab/dom.d.ts +13 -0
- package/dist/lab/dom.d.ts.map +1 -0
- package/dist/lab/dom.js +76 -0
- package/dist/lab/dom.js.map +1 -0
- package/dist/motion-probe.d.ts +47 -0
- package/dist/motion-probe.d.ts.map +1 -0
- package/dist/motion-probe.js +122 -0
- package/dist/motion-probe.js.map +1 -0
- package/dist/probe-utils.d.ts +14 -0
- package/dist/probe-utils.d.ts.map +1 -0
- package/dist/probe-utils.js +18 -0
- package/dist/probe-utils.js.map +1 -0
- package/dist/scene-cameras.d.ts +6 -0
- package/dist/scene-cameras.d.ts.map +1 -0
- package/dist/scene-cameras.js +20 -0
- package/dist/scene-cameras.js.map +1 -0
- package/dist/scene-delta.d.ts +21 -0
- package/dist/scene-delta.d.ts.map +1 -0
- package/dist/scene-delta.js +57 -0
- package/dist/scene-delta.js.map +1 -0
- package/dist/scene-introspect.d.ts +78 -0
- package/dist/scene-introspect.d.ts.map +1 -0
- package/dist/scene-introspect.js +164 -0
- package/dist/scene-introspect.js.map +1 -0
- package/dist/scene-registry.d.ts +36 -0
- package/dist/scene-registry.d.ts.map +1 -0
- package/dist/scene-registry.js +64 -0
- package/dist/scene-registry.js.map +1 -0
- package/dist/scene-view.d.ts +52 -0
- package/dist/scene-view.d.ts.map +1 -0
- package/dist/scene-view.js +171 -0
- package/dist/scene-view.js.map +1 -0
- package/dist/source-tag.d.ts +34 -0
- package/dist/source-tag.d.ts.map +1 -0
- package/dist/source-tag.js +120 -0
- package/dist/source-tag.js.map +1 -0
- package/dist/telemetry.d.ts +53 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +302 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +142 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/uniform-access.d.ts +32 -0
- package/dist/uniform-access.d.ts.map +1 -0
- package/dist/uniform-access.js +144 -0
- package/dist/uniform-access.js.map +1 -0
- package/dist/validate.d.ts +2 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +81 -0
- package/dist/validate.js.map +1 -0
- package/dist/vite.d.ts +3 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +4 -0
- package/dist/vite.js.map +1 -0
- package/dist/warnings.d.ts +24 -0
- package/dist/warnings.d.ts.map +1 -0
- package/dist/warnings.js +26 -0
- package/dist/warnings.js.map +1 -0
- package/package.json +60 -0
- package/src/compose.ts +164 -0
- package/src/editor.ts +138 -0
- package/src/harness.ts +1263 -0
- package/src/index.ts +58 -0
- package/src/inspect.ts +498 -0
- package/src/knob-utils.ts +60 -0
- package/src/lab/css.ts +56 -0
- package/src/lab/dom.ts +88 -0
- package/src/motion-probe.ts +135 -0
- package/src/probe-utils.ts +17 -0
- package/src/scene-cameras.ts +33 -0
- package/src/scene-delta.ts +69 -0
- package/src/scene-introspect.ts +230 -0
- package/src/scene-registry.ts +103 -0
- package/src/scene-view.ts +204 -0
- package/src/source-tag.ts +139 -0
- package/src/telemetry.ts +337 -0
- package/src/three-webgpu-shim.d.ts +130 -0
- package/src/types.ts +121 -0
- package/src/uniform-access.ts +152 -0
- package/src/validate.ts +82 -0
- package/src/vite.ts +5 -0
- package/src/warnings.ts +41 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
export function serializeScene(root, opts = {}) {
|
|
2
|
+
const maxNodes = opts.maxNodes ?? 120;
|
|
3
|
+
const getWP = opts.getWorldPosition ?? localPosition;
|
|
4
|
+
const all = [];
|
|
5
|
+
collectObjects(root, all);
|
|
6
|
+
const nodes = [];
|
|
7
|
+
const lights = [];
|
|
8
|
+
const MAX_LIGHTS = 64;
|
|
9
|
+
for (const o of all) {
|
|
10
|
+
if (o === root)
|
|
11
|
+
continue; // the scene root itself isn't interesting
|
|
12
|
+
// Lights go into their own array BEFORE the triangle sort/truncate so they
|
|
13
|
+
// are never dropped (they have 0 triangles). Duck-typed `isLight` flag —
|
|
14
|
+
// three sets it on every Light subclass; fakes can set it in tests.
|
|
15
|
+
if (o?.isLight === true && lights.length < MAX_LIGHTS) {
|
|
16
|
+
lights.push(describeLight(o, getWP, root));
|
|
17
|
+
}
|
|
18
|
+
nodes.push(describeNode(o, getWP, root));
|
|
19
|
+
}
|
|
20
|
+
nodes.sort((a, b) => b.triangleCount - a.triangleCount);
|
|
21
|
+
const total = nodes.length;
|
|
22
|
+
const truncated = total > maxNodes;
|
|
23
|
+
return { nodes: truncated ? nodes.slice(0, maxNodes) : nodes, lights, total, truncated };
|
|
24
|
+
}
|
|
25
|
+
function collectObjects(root, out) {
|
|
26
|
+
if (!root)
|
|
27
|
+
return;
|
|
28
|
+
// Real three exposes traverse(self + descendants); fakes use children DFS.
|
|
29
|
+
if (typeof root.traverse === 'function') {
|
|
30
|
+
root.traverse((o) => out.push(o));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const stack = [root];
|
|
34
|
+
let guard = 0;
|
|
35
|
+
while (stack.length && guard++ < 100000) {
|
|
36
|
+
const o = stack.pop();
|
|
37
|
+
out.push(o);
|
|
38
|
+
const kids = o?.children;
|
|
39
|
+
if (Array.isArray(kids))
|
|
40
|
+
for (let i = kids.length - 1; i >= 0; i--)
|
|
41
|
+
stack.push(kids[i]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function describeNode(o, getWP, root) {
|
|
45
|
+
const tag = o?.userData?.__tris;
|
|
46
|
+
const node = {
|
|
47
|
+
uuid: String(o?.uuid ?? ''),
|
|
48
|
+
name: o?.name ?? '',
|
|
49
|
+
type: o?.type ?? o?.constructor?.name ?? 'Object3D',
|
|
50
|
+
visible: o?.visible !== false,
|
|
51
|
+
worldPosition: round3(getWP(o)),
|
|
52
|
+
triangleCount: triangleCount(o),
|
|
53
|
+
parentChain: parentChain(o, root),
|
|
54
|
+
};
|
|
55
|
+
const mat = Array.isArray(o?.material) ? o.material[0] : o?.material;
|
|
56
|
+
if (mat) {
|
|
57
|
+
node.materialKind = mat.type ?? mat.constructor?.name;
|
|
58
|
+
const color = materialColor(mat);
|
|
59
|
+
if (color)
|
|
60
|
+
node.materialColor = color;
|
|
61
|
+
const names = uniformNames(mat);
|
|
62
|
+
if (names.length)
|
|
63
|
+
node.uniformNames = names;
|
|
64
|
+
}
|
|
65
|
+
if (tag?.source)
|
|
66
|
+
node.source = tag.source;
|
|
67
|
+
return node;
|
|
68
|
+
}
|
|
69
|
+
function describeLight(o, getWP, root) {
|
|
70
|
+
const tag = o?.userData?.__tris;
|
|
71
|
+
const klass = o?.type ?? o?.constructor?.name ?? 'Light';
|
|
72
|
+
const light = {
|
|
73
|
+
uuid: String(o?.uuid ?? ''),
|
|
74
|
+
name: o?.name ?? '',
|
|
75
|
+
type: klass,
|
|
76
|
+
lightType: klass,
|
|
77
|
+
visible: o?.visible !== false,
|
|
78
|
+
worldPosition: round3(getWP(o)),
|
|
79
|
+
parentChain: parentChain(o, root),
|
|
80
|
+
};
|
|
81
|
+
if (typeof o?.intensity === 'number')
|
|
82
|
+
light.intensity = +o.intensity.toFixed(3);
|
|
83
|
+
const color = hexColor(o?.color);
|
|
84
|
+
if (color)
|
|
85
|
+
light.color = color;
|
|
86
|
+
const ground = hexColor(o?.groundColor); // HemisphereLight
|
|
87
|
+
if (ground)
|
|
88
|
+
light.groundColor = ground;
|
|
89
|
+
if (typeof o?.distance === 'number')
|
|
90
|
+
light.distance = o.distance;
|
|
91
|
+
if (typeof o?.decay === 'number')
|
|
92
|
+
light.decay = o.decay;
|
|
93
|
+
if (typeof o?.angle === 'number')
|
|
94
|
+
light.angle = +o.angle.toFixed(4); // SpotLight cone
|
|
95
|
+
if (tag?.source)
|
|
96
|
+
light.source = tag.source;
|
|
97
|
+
return light;
|
|
98
|
+
}
|
|
99
|
+
export function triangleCount(o) {
|
|
100
|
+
const geo = o?.geometry;
|
|
101
|
+
if (!geo)
|
|
102
|
+
return 0;
|
|
103
|
+
try {
|
|
104
|
+
if (geo.index?.count)
|
|
105
|
+
return Math.floor(geo.index.count / 3);
|
|
106
|
+
const pos = geo.attributes?.position;
|
|
107
|
+
if (pos?.count)
|
|
108
|
+
return Math.floor(pos.count / 3);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
/* exotic geometry — report 0 rather than throw */
|
|
112
|
+
}
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
function materialColor(mat) {
|
|
116
|
+
return hexColor(mat?.color);
|
|
117
|
+
}
|
|
118
|
+
/** A THREE.Color → "#rrggbb", guarded (color access can throw on node materials). */
|
|
119
|
+
function hexColor(c) {
|
|
120
|
+
try {
|
|
121
|
+
if (typeof c?.getHexString === 'function')
|
|
122
|
+
return `#${c.getHexString()}`;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* never throw out of introspection */
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
function uniformNames(mat) {
|
|
130
|
+
// Legacy materials expose `.uniforms`; TSL node materials keep params in a
|
|
131
|
+
// private node graph (no stable public surface) — return nothing rather than
|
|
132
|
+
// reach into internals that change across three versions. Skip textures.
|
|
133
|
+
try {
|
|
134
|
+
if (mat?.uniforms && typeof mat.uniforms === 'object') {
|
|
135
|
+
return Object.keys(mat.uniforms).filter((k) => !mat.uniforms[k]?.value?.isTexture);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* never throw out of introspection */
|
|
140
|
+
}
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
function parentChain(o, root) {
|
|
144
|
+
const chain = [];
|
|
145
|
+
let p = o?.parent;
|
|
146
|
+
let guard = 0;
|
|
147
|
+
while (p && p !== root && guard++ < 64) {
|
|
148
|
+
chain.push(p.name || p.type || p.constructor?.name || 'Object3D');
|
|
149
|
+
p = p.parent;
|
|
150
|
+
}
|
|
151
|
+
return chain.reverse();
|
|
152
|
+
}
|
|
153
|
+
function localPosition(o) {
|
|
154
|
+
const p = o?.position;
|
|
155
|
+
if (Array.isArray(p))
|
|
156
|
+
return [p[0] ?? 0, p[1] ?? 0, p[2] ?? 0];
|
|
157
|
+
if (p && typeof p === 'object')
|
|
158
|
+
return [+(p.x ?? 0), +(p.y ?? 0), +(p.z ?? 0)];
|
|
159
|
+
return [0, 0, 0];
|
|
160
|
+
}
|
|
161
|
+
function round3(v) {
|
|
162
|
+
return [+v[0].toFixed(3), +v[1].toFixed(3), +v[2].toFixed(3)];
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=scene-introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-introspect.js","sourceRoot":"","sources":["../src/scene-introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CameraSpec, Element, Knob } from './types.js';
|
|
2
|
+
export interface RegistryEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
element: Element;
|
|
5
|
+
}
|
|
6
|
+
export declare function nsKey(elementName: string, key: string, namespaced: boolean): string;
|
|
7
|
+
export declare function splitNs(key: string, namespaced: boolean): {
|
|
8
|
+
element: string | null;
|
|
9
|
+
local: string;
|
|
10
|
+
};
|
|
11
|
+
export interface CameraBinding {
|
|
12
|
+
spec: CameraSpec;
|
|
13
|
+
element: string;
|
|
14
|
+
local: string;
|
|
15
|
+
}
|
|
16
|
+
export interface KnobBinding {
|
|
17
|
+
spec: Knob;
|
|
18
|
+
element: string;
|
|
19
|
+
local: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function buildCameraMap(active: RegistryEntry[], namespaced: boolean): Record<string, CameraBinding>;
|
|
22
|
+
export declare function buildKnobMap(active: RegistryEntry[], namespaced: boolean): Record<string, KnobBinding>;
|
|
23
|
+
export interface SceneRegistry {
|
|
24
|
+
available: () => string[];
|
|
25
|
+
mounted: () => string[];
|
|
26
|
+
isMounted: (name: string) => boolean;
|
|
27
|
+
/** Mark a registered element mounted; returns its entry, or null if unknown/already mounted. */
|
|
28
|
+
mount: (name: string) => RegistryEntry | null;
|
|
29
|
+
/** Mark a mounted element unmounted; returns false if it wasn't mounted. */
|
|
30
|
+
unmount: (name: string) => boolean;
|
|
31
|
+
/** Mounted entries, in registry declaration order. */
|
|
32
|
+
activeEntries: () => RegistryEntry[];
|
|
33
|
+
entry: (name: string) => RegistryEntry | undefined;
|
|
34
|
+
}
|
|
35
|
+
export declare function createSceneRegistry(entries: RegistryEntry[], initial?: string[]): SceneRegistry;
|
|
36
|
+
//# sourceMappingURL=scene-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-registry.d.ts","sourceRoot":"","sources":["../src/scene-registry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAEnF;AAED,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,OAAO,GAClB;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK3C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,OAAO,GAClB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAU/B;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EAAE,EACvB,UAAU,EAAE,OAAO,GAClB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAQ7B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,gGAAgG;IAChG,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,IAAI,CAAC;IAC9C,4EAA4E;IAC5E,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,sDAAsD;IACtD,aAAa,EAAE,MAAM,aAAa,EAAE,CAAC;IACrC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;CACpD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,CAsB/F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Pure bookkeeping for a multi-element scene with runtime mount/unmount — the
|
|
2
|
+
// data layer behind runSceneLab + add_element/remove_element. No `three` or DOM
|
|
3
|
+
// here; the harness drives the actual mount/dispose and grid rebuild. Camera +
|
|
4
|
+
// knob keys are namespaced as `<element>.<key>` for multi-element scenes (so two
|
|
5
|
+
// elements declaring `top` don't collide) and left bare for a single
|
|
6
|
+
// non-namespaced lab (backward-compatible with runLab).
|
|
7
|
+
import { autoCameras } from './scene-cameras.js';
|
|
8
|
+
export function nsKey(elementName, key, namespaced) {
|
|
9
|
+
return namespaced ? `${elementName}.${key}` : key;
|
|
10
|
+
}
|
|
11
|
+
export function splitNs(key, namespaced) {
|
|
12
|
+
if (!namespaced)
|
|
13
|
+
return { element: null, local: key };
|
|
14
|
+
const i = key.indexOf('.');
|
|
15
|
+
if (i < 0)
|
|
16
|
+
return { element: null, local: key };
|
|
17
|
+
return { element: key.slice(0, i), local: key.slice(i + 1) };
|
|
18
|
+
}
|
|
19
|
+
export function buildCameraMap(active, namespaced) {
|
|
20
|
+
const out = {};
|
|
21
|
+
for (const { name, element } of active) {
|
|
22
|
+
const specs = element.cameras === 'auto' ? autoCameras(element.bounds) : (element.cameras ?? {});
|
|
23
|
+
for (const [local, spec] of Object.entries(specs)) {
|
|
24
|
+
out[nsKey(name, local, namespaced)] = { spec, element: name, local };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
export function buildKnobMap(active, namespaced) {
|
|
30
|
+
const out = {};
|
|
31
|
+
for (const { name, element } of active) {
|
|
32
|
+
for (const [local, spec] of Object.entries(element.knobs ?? {})) {
|
|
33
|
+
out[nsKey(name, local, namespaced)] = { spec, element: name, local };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
export function createSceneRegistry(entries, initial) {
|
|
39
|
+
const byName = new Map();
|
|
40
|
+
for (const e of entries)
|
|
41
|
+
byName.set(e.name, e);
|
|
42
|
+
const order = entries.map((e) => e.name);
|
|
43
|
+
const mountedSet = new Set((initial ?? order).filter((n) => byName.has(n)));
|
|
44
|
+
return {
|
|
45
|
+
available: () => [...byName.keys()],
|
|
46
|
+
mounted: () => order.filter((n) => mountedSet.has(n)),
|
|
47
|
+
isMounted: (name) => mountedSet.has(name),
|
|
48
|
+
mount: (name) => {
|
|
49
|
+
if (!byName.has(name) || mountedSet.has(name))
|
|
50
|
+
return null;
|
|
51
|
+
mountedSet.add(name);
|
|
52
|
+
return byName.get(name) ?? null;
|
|
53
|
+
},
|
|
54
|
+
unmount: (name) => {
|
|
55
|
+
if (!mountedSet.has(name))
|
|
56
|
+
return false;
|
|
57
|
+
mountedSet.delete(name);
|
|
58
|
+
return true;
|
|
59
|
+
},
|
|
60
|
+
activeEntries: () => order.filter((n) => mountedSet.has(n)).map((n) => byName.get(n)),
|
|
61
|
+
entry: (name) => byName.get(name),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=scene-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-registry.js","sourceRoot":"","sources":["../src/scene-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as THREE from 'three/webgpu';
|
|
2
|
+
import { type CommonLabOptions, type LabHandle } from './harness.js';
|
|
3
|
+
import { type Bounds } from './scene-cameras.js';
|
|
4
|
+
import type { CameraSpec, Element, Knob, MountHandle } from './types.js';
|
|
5
|
+
/** A target the harness can render: an object, a builder, or a mounted handle. */
|
|
6
|
+
export type SceneViewTarget = THREE.Object3D | (() => THREE.Object3D | {
|
|
7
|
+
root: THREE.Object3D;
|
|
8
|
+
dispose?: () => void;
|
|
9
|
+
}) | {
|
|
10
|
+
root: THREE.Object3D;
|
|
11
|
+
dispose?: () => void;
|
|
12
|
+
};
|
|
13
|
+
export interface SceneViewOptions extends Partial<CommonLabOptions> {
|
|
14
|
+
/** Element name (telemetry `project`). Defaults to the object's `.name` or "scene". */
|
|
15
|
+
name?: string;
|
|
16
|
+
/** Camera presets, or 'auto' (default) to fit 4 presets from the object's bounds. */
|
|
17
|
+
cameras?: Record<string, CameraSpec> | 'auto';
|
|
18
|
+
/** Explicit knobs (merged over autoKnobs when both are present). */
|
|
19
|
+
knobs?: Record<string, Knob>;
|
|
20
|
+
/** Knob handler. Defaults to the autoKnobs router when autoKnobs is on. */
|
|
21
|
+
onKnob?: Element['onKnob'];
|
|
22
|
+
/**
|
|
23
|
+
* Reflect named meshes' material props (roughness/metalness/opacity/color/
|
|
24
|
+
* emissive) and named lights' intensity/color into knobs, routed live via the
|
|
25
|
+
* same path as set_uniform. NOTE: only NAMED objects; TSL node-material params
|
|
26
|
+
* aren't reflectable (use set_uniform for those). Off by default.
|
|
27
|
+
*/
|
|
28
|
+
autoKnobs?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* World-space AABB of an object tree → {min,max}; unit box if empty/non-finite.
|
|
32
|
+
* Computed manually (8 corners of each child geometry's bounding box × its world
|
|
33
|
+
* matrix) to avoid depending on Box3, which three/webgpu's .d.ts doesn't surface.
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeObjectBounds(obj: THREE.Object3D): Bounds;
|
|
36
|
+
/**
|
|
37
|
+
* Derive knobs by reflecting an object tree's NAMED materials + lights. Returns
|
|
38
|
+
* the knob specs + an onKnob that applies them live via writeUniformValue (the
|
|
39
|
+
* exact path set_uniform uses, so "name.prop" addressing matches).
|
|
40
|
+
* NOTE: an `opacity` knob has no visible effect on a material without
|
|
41
|
+
* `transparent: true` (Three.js ignores opacity on opaque materials).
|
|
42
|
+
*/
|
|
43
|
+
export declare function autoKnobsFromObject(root: THREE.Object3D): {
|
|
44
|
+
knobs: Record<string, Knob>;
|
|
45
|
+
onKnob: (handle: MountHandle, key: string, value: number | string | boolean) => void;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Boot a triscope lab around an existing object with (near) zero boilerplate.
|
|
49
|
+
* Returns the same LabHandle as runLab.
|
|
50
|
+
*/
|
|
51
|
+
export declare function runSceneView(target: SceneViewTarget, opts?: SceneViewOptions): Promise<LabHandle>;
|
|
52
|
+
//# sourceMappingURL=scene-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-view.d.ts","sourceRoot":"","sources":["../src/scene-view.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAU,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAe,KAAK,MAAM,EAAe,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzE,kFAAkF;AAClF,MAAM,MAAM,eAAe,GACvB,KAAK,CAAC,QAAQ,GACd,CAAC,MAAM,KAAK,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,GACvE;IAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,gBAAiB,SAAQ,OAAO,CAAC,gBAAgB,CAAC;IACjE,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC;IAC9C,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,CAsC/D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CACtF,CA0CA;AAgBD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,SAAS,CAAC,CA2CpB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// runSceneView — the near-zero-boilerplate adoption entry. Wrap ANY existing
|
|
2
|
+
// THREE.Object3D (or a builder, or a {root,dispose} handle) into the triscope
|
|
3
|
+
// harness so the MCP tools (capture_views/inspect_scene/read_uniform/set_uniform
|
|
4
|
+
// + knobs) work, WITHOUT hand-authoring an Element. Cameras auto-fit from the
|
|
5
|
+
// object's bounds; optionally auto-derive knobs from its materials/lights.
|
|
6
|
+
//
|
|
7
|
+
// import { runSceneView } from '@triscope/core';
|
|
8
|
+
// runSceneView(myGroup); // read-only observability, ~1 line
|
|
9
|
+
// runSceneView(buildScene, { autoKnobs: true });
|
|
10
|
+
import * as THREE from 'three/webgpu';
|
|
11
|
+
import { runLab } from './harness.js';
|
|
12
|
+
import { mountLabDom } from './lab/dom.js';
|
|
13
|
+
import { UNIT_BOUNDS } from './scene-cameras.js';
|
|
14
|
+
import { writeUniformValue } from './uniform-access.js';
|
|
15
|
+
/**
|
|
16
|
+
* World-space AABB of an object tree → {min,max}; unit box if empty/non-finite.
|
|
17
|
+
* Computed manually (8 corners of each child geometry's bounding box × its world
|
|
18
|
+
* matrix) to avoid depending on Box3, which three/webgpu's .d.ts doesn't surface.
|
|
19
|
+
*/
|
|
20
|
+
export function computeObjectBounds(obj) {
|
|
21
|
+
try {
|
|
22
|
+
obj.updateWorldMatrix(true, true);
|
|
23
|
+
const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];
|
|
24
|
+
const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];
|
|
25
|
+
let found = false;
|
|
26
|
+
const v = new THREE.Vector3();
|
|
27
|
+
obj.traverse((o) => {
|
|
28
|
+
const geo = o?.geometry;
|
|
29
|
+
if (!geo)
|
|
30
|
+
return;
|
|
31
|
+
if (!geo.boundingBox && typeof geo.computeBoundingBox === 'function')
|
|
32
|
+
geo.computeBoundingBox();
|
|
33
|
+
const bb = geo.boundingBox;
|
|
34
|
+
if (!bb)
|
|
35
|
+
return;
|
|
36
|
+
for (let i = 0; i < 8; i++) {
|
|
37
|
+
v.set(i & 1 ? bb.max.x : bb.min.x, i & 2 ? bb.max.y : bb.min.y, i & 4 ? bb.max.z : bb.min.z);
|
|
38
|
+
// applyMatrix4 is missing from three/webgpu's partial .d.ts (runtime ok).
|
|
39
|
+
// biome-ignore lint/suspicious/noExplicitAny: three/webgpu .d.ts gap
|
|
40
|
+
v.applyMatrix4(o.matrixWorld);
|
|
41
|
+
if (!Number.isFinite(v.x) || !Number.isFinite(v.y) || !Number.isFinite(v.z))
|
|
42
|
+
continue;
|
|
43
|
+
min[0] = Math.min(min[0], v.x);
|
|
44
|
+
min[1] = Math.min(min[1], v.y);
|
|
45
|
+
min[2] = Math.min(min[2], v.z);
|
|
46
|
+
max[0] = Math.max(max[0], v.x);
|
|
47
|
+
max[1] = Math.max(max[1], v.y);
|
|
48
|
+
max[2] = Math.max(max[2], v.z);
|
|
49
|
+
found = true;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
if (!found)
|
|
53
|
+
return UNIT_BOUNDS;
|
|
54
|
+
return { min: [min[0], min[1], min[2]], max: [max[0], max[1], max[2]] };
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return UNIT_BOUNDS;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Derive knobs by reflecting an object tree's NAMED materials + lights. Returns
|
|
62
|
+
* the knob specs + an onKnob that applies them live via writeUniformValue (the
|
|
63
|
+
* exact path set_uniform uses, so "name.prop" addressing matches).
|
|
64
|
+
* NOTE: an `opacity` knob has no visible effect on a material without
|
|
65
|
+
* `transparent: true` (Three.js ignores opacity on opaque materials).
|
|
66
|
+
*/
|
|
67
|
+
export function autoKnobsFromObject(root) {
|
|
68
|
+
const knobs = {};
|
|
69
|
+
const hex = (c) => {
|
|
70
|
+
try {
|
|
71
|
+
return typeof c?.getHexString === 'function' ? `#${c.getHexString()}` : undefined;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
root.traverse((o) => {
|
|
78
|
+
const name = o?.name;
|
|
79
|
+
if (!name || typeof name !== 'string')
|
|
80
|
+
return; // only addressable (named) objects
|
|
81
|
+
if (o.isLight) {
|
|
82
|
+
if (typeof o.intensity === 'number') {
|
|
83
|
+
knobs[`${name}.intensity`] = {
|
|
84
|
+
type: 'number',
|
|
85
|
+
min: 0,
|
|
86
|
+
max: Math.max(o.intensity * 3, 5),
|
|
87
|
+
step: 0.01,
|
|
88
|
+
default: o.intensity,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const lc = hex(o.color);
|
|
92
|
+
if (lc)
|
|
93
|
+
knobs[`${name}.color`] = { type: 'color', default: lc };
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const mat = Array.isArray(o.material) ? o.material[0] : o.material;
|
|
97
|
+
if (!mat)
|
|
98
|
+
return;
|
|
99
|
+
for (const p of ['roughness', 'metalness', 'opacity']) {
|
|
100
|
+
if (typeof mat[p] === 'number') {
|
|
101
|
+
knobs[`${name}.${p}`] = { type: 'number', min: 0, max: 1, step: 0.01, default: mat[p] };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const p of ['color', 'emissive']) {
|
|
105
|
+
const mc = hex(mat[p]);
|
|
106
|
+
if (mc)
|
|
107
|
+
knobs[`${name}.${p}`] = { type: 'color', default: mc };
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const onKnob = (handle, key, value) => {
|
|
111
|
+
if (handle?.root)
|
|
112
|
+
writeUniformValue(handle.root, key, value);
|
|
113
|
+
};
|
|
114
|
+
return { knobs, onKnob };
|
|
115
|
+
}
|
|
116
|
+
function resolveTarget(target) {
|
|
117
|
+
const t = typeof target === 'function' ? target() : target;
|
|
118
|
+
if (t && t.isObject3D)
|
|
119
|
+
return { obj: t };
|
|
120
|
+
if (t && t.root?.isObject3D) {
|
|
121
|
+
return { obj: t.root, dispose: t.dispose };
|
|
122
|
+
}
|
|
123
|
+
throw new Error('runSceneView: target must be a THREE.Object3D, a () => Object3D, or a { root, dispose } handle');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Boot a triscope lab around an existing object with (near) zero boilerplate.
|
|
127
|
+
* Returns the same LabHandle as runLab.
|
|
128
|
+
*/
|
|
129
|
+
export async function runSceneView(target, opts = {}) {
|
|
130
|
+
const { obj, dispose: targetDispose } = resolveTarget(target);
|
|
131
|
+
// Build the DOM if no canvas was supplied (a bare <body> + script is enough).
|
|
132
|
+
const dom = opts.canvas ? null : mountLabDom();
|
|
133
|
+
const canvas = opts.canvas ?? dom?.canvas;
|
|
134
|
+
if (!canvas)
|
|
135
|
+
throw new Error('runSceneView: no canvas (and DOM creation unavailable)');
|
|
136
|
+
const auto = opts.autoKnobs
|
|
137
|
+
? autoKnobsFromObject(obj)
|
|
138
|
+
: { knobs: {}, onKnob: undefined };
|
|
139
|
+
const knobs = { ...auto.knobs, ...(opts.knobs ?? {}) };
|
|
140
|
+
const element = {
|
|
141
|
+
name: opts.name ?? obj.name ?? 'scene',
|
|
142
|
+
bounds: computeObjectBounds(obj),
|
|
143
|
+
cameras: opts.cameras ?? 'auto',
|
|
144
|
+
knobs: Object.keys(knobs).length ? knobs : undefined,
|
|
145
|
+
onKnob: opts.onKnob ?? auto.onKnob,
|
|
146
|
+
mount: ({ parent }) => {
|
|
147
|
+
parent.add(obj);
|
|
148
|
+
return {
|
|
149
|
+
root: obj,
|
|
150
|
+
dispose: () => {
|
|
151
|
+
parent.remove(obj);
|
|
152
|
+
targetDispose?.();
|
|
153
|
+
},
|
|
154
|
+
userData: {},
|
|
155
|
+
};
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
return runLab({
|
|
159
|
+
element,
|
|
160
|
+
canvas,
|
|
161
|
+
hud: dom?.hud ?? opts.hud ?? null,
|
|
162
|
+
labelContainer: dom?.labelContainer ?? opts.labelContainer ?? null,
|
|
163
|
+
editorContainer: dom?.editorContainer ?? opts.editorContainer ?? null,
|
|
164
|
+
bootOverlay: dom?.boot ?? opts.bootOverlay ?? null,
|
|
165
|
+
clearColor: opts.clearColor,
|
|
166
|
+
captureSize: opts.captureSize,
|
|
167
|
+
telemetryIntervalMs: opts.telemetryIntervalMs,
|
|
168
|
+
knobPollMs: opts.knobPollMs,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=scene-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-view.js","sourceRoot":"","sources":["../src/scene-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface SourceFrame {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
col: number;
|
|
5
|
+
fn?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface SourceTag {
|
|
8
|
+
source: SourceFrame | null;
|
|
9
|
+
stack: SourceFrame[];
|
|
10
|
+
type: string;
|
|
11
|
+
geometry?: string;
|
|
12
|
+
material?: {
|
|
13
|
+
color?: string;
|
|
14
|
+
map?: string | null;
|
|
15
|
+
};
|
|
16
|
+
name?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Names of ancestor objects in the scene tree, root-first. Populated
|
|
19
|
+
* lazily when the picker reads the tag (parents may change after
|
|
20
|
+
* .add() if the user re-parents). Useful as a tie-breaker when the
|
|
21
|
+
* source-line attribution drifts (see note below).
|
|
22
|
+
*/
|
|
23
|
+
parentChain?: string[];
|
|
24
|
+
}
|
|
25
|
+
export declare function installSourceTagPatch(): boolean;
|
|
26
|
+
export declare const FRAME_RE: RegExp;
|
|
27
|
+
export declare const SKIP_PATTERNS: RegExp[];
|
|
28
|
+
export declare function parseUserStack(raw: string, max?: number): SourceFrame[];
|
|
29
|
+
export declare function stripUrl(u: string): string;
|
|
30
|
+
export declare function extractMaterialHint(material: unknown): {
|
|
31
|
+
color?: string;
|
|
32
|
+
map?: string | null;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=source-tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-tag.d.ts","sourceRoot":"","sources":["../src/source-tag.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAeD,wBAAgB,qBAAqB,IAAI,OAAO,CAgC/C;AAED,eAAO,MAAM,QAAQ,QAAyE,CAAC;AAE/F,eAAO,MAAM,aAAa,UAQzB,CAAC;AAEF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,WAAW,EAAE,CAgBlE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAc9F"}
|