@3driseai/3drise-core 1.0.24 → 1.0.26

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.
@@ -286,6 +286,24 @@ export type WaterSettings = CreatedObjectSettings & {
286
286
  };
287
287
  export type SceneDataType = 'scene' | 'ui' | 'text' | 'project' | 'presets' | 'sky' | 'ocean' | 'mesh' | 'model' | 'clouds' | 'rain' | 'fog' | 'stars' | 'hdr';
288
288
  export type GeometryType = 'none' | 'heart' | 'box' | 'sphere' | 'cylinder' | 'cone' | 'torus' | 'plane' | 'ring' | 'arc' | 'bentPlane' | 'bentPlaneInverse' | 'icosahedron' | 'octahedron' | 'tetrahedron' | 'dodecahedron' | 'capsule' | 'text' | 'custom' | 'grid' | 'point' | 'heart';
289
+ /** What an animation (or, later, an effect) on a group or model reaches. See AnimationOptions.scope. */
290
+ export type TargetScope = 'self' | 'each' | 'targets';
291
+ /**
292
+ * One target inside a group or model.
293
+ * group `id` = a child object's id (any depth); `nodes` narrows a model child to its nodes (names)
294
+ * model `id` = a node name (ModelTree's selection key)
295
+ */
296
+ export interface PartTarget {
297
+ id: string;
298
+ nodes?: string[];
299
+ }
300
+ /** How each / targets reach their targets one after another. */
301
+ export interface TargetStagger {
302
+ /** Who goes first: tree order, along an axis of the object, centre → out, or random (seeded, the same every time). */
303
+ order?: 'tree' | 'x' | 'y' | 'z' | 'radial' | 'random';
304
+ /** Seconds from the first target to the last (a fixed total, however many targets). 0 / absent = together. */
305
+ total?: number;
306
+ }
289
307
  export interface AnimationOptions {
290
308
  triggerMode?: EffectTriggerMode;
291
309
  property: string;
@@ -305,8 +323,19 @@ export interface AnimationOptions {
305
323
  offset?: Vector3Array;
306
324
  /** Whether to preserve the object's original position/rotation relative to the path (default: false) */
307
325
  keepOriginalTransform?: boolean;
308
- /** IDs of child objects to animate (if empty/undefined, animates parent object) */
309
- objectIds?: string[];
326
+ /**
327
+ * Groups and models: what the animation moves.
328
+ * self the object as one piece (default) — `to` is the absolute value
329
+ * each every part on its own (group: every leaf child, full depth; model: every mesh)
330
+ * targets only `targets`, each on its own
331
+ * On each / targets a transform `to` is RELATIVE to each target's own rest value
332
+ * (position / rotation added, scale multiplied). Other object types ignore it.
333
+ */
334
+ scope?: TargetScope;
335
+ /** scope 'targets': group → child objects (any depth, a model child optionally narrowed to nodes); model → { id: nodeName }. */
336
+ targets?: PartTarget[];
337
+ /** each / targets: the targets start one after another. */
338
+ stagger?: TargetStagger;
310
339
  onStart?: () => void;
311
340
  onUpdate?: (progress: number) => void;
312
341
  onComplete?: () => void;
@@ -465,7 +494,8 @@ export interface CanvasConfig {
465
494
  /** A scene object the orbit controls follow: the object's id, optionally one of its model parts (node name). */
466
495
  export interface OrbitTargetObject {
467
496
  id: string;
468
- node?: string;
497
+ /** A model part's node name; null = the whole object (explicit, so an action patch replaces a part pick). */
498
+ node?: string | null;
469
499
  }
470
500
  export interface ControlsConfig {
471
501
  enabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"scene3d.d.ts","sourceRoot":"","sources":["../../src/types/scene3d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene3d.d.ts","sourceRoot":"","sources":["../../src/types/scene3d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { Object3D } from 'three';
2
+ import type { AnimationOptions, PartTarget, TargetScope, TargetStagger } from '../types/scene3d';
3
+ export type TransformKey = 'position' | 'rotation' | 'scale';
4
+ type Vec3 = [number, number, number];
5
+ /** What kind of root the scope works on; null = scope does not apply (self). */
6
+ export declare function targetRootKind(root: Object3D): 'group' | 'model' | null;
7
+ /** The scope a row really runs with on this root ('self' when it cannot apply). */
8
+ export declare function effectiveScope(root: Object3D, anim: Pick<AnimationOptions, 'scope' | 'targets'>): TargetScope;
9
+ /**
10
+ * The Object3Ds a row reaches on `root`, in tree order, without duplicates.
11
+ * 'self' (or a root that is neither a group nor a model) → [root].
12
+ */
13
+ export declare function resolveAnimationTargets(root: Object3D, scope: TargetScope | undefined, targets?: PartTarget[]): Object3D[];
14
+ /** Seconds each target waits, same order as `objs`. No stagger / total 0 / one target → all 0. */
15
+ export declare function staggerDelays(root: Object3D, objs: Object3D[], stagger: TargetStagger | undefined, seed: string): number[];
16
+ interface Resolved {
17
+ objs: Object3D[];
18
+ delays: number[];
19
+ frame: number;
20
+ }
21
+ export declare class AnimationTargetState {
22
+ private root;
23
+ private frame;
24
+ private resolved;
25
+ /** Transform rest snapshots of nodes (object roots use userData.baseTransform). */
26
+ private restT;
27
+ /** Material rest values per target and property. */
28
+ private restM;
29
+ /** Written this frame / last frame: `${uuid}|t|position` → target. */
30
+ private touched;
31
+ private last;
32
+ /** Material clones made per target node. */
33
+ private owned;
34
+ constructor(root: Object3D);
35
+ get object(): Object3D;
36
+ beginFrame(): void;
37
+ /** Targets + delays of a row, cached. */
38
+ targetsOf(anim: AnimationOptions, scope: TargetScope): Resolved;
39
+ /** Keep a target on what it has (a hover row while not hovered): not restored this frame. */
40
+ hold(obj: Object3D, domain: 't' | 'm', prop: string): void;
41
+ transformRest(obj: Object3D, prop: TransformKey): Vec3;
42
+ writeTransform(obj: Object3D, prop: TransformKey, v: Vec3): void;
43
+ /** Mark a transform as driven without writing (keyframe rows write themselves). */
44
+ touchTransform(obj: Object3D, prop: TransformKey): void;
45
+ /** The target's own value before the first write (what it goes back to). */
46
+ materialRest(obj: Object3D, prop: string): unknown;
47
+ writeMaterial(obj: Object3D, prop: string, value: unknown): void;
48
+ /** A model node: clone the materials it shares with meshes outside it (once). */
49
+ private ownMaterials;
50
+ private releaseMaterials;
51
+ /** Put back on their rest the targets driven last frame and not this frame. */
52
+ endFrame(): void;
53
+ /** Everything back on its rest (the object goes away / the hook stops). */
54
+ dispose(): void;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=animationTargets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animationTargets.d.ts","sourceRoot":"","sources":["../../src/utils/animationTargets.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjG,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAC7D,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAGvE;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC,GAAG,WAAW,CAK7G;AA2CD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAuB1H;AAgBD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B1H;AAMD,UAAU,QAAQ;IAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAMxE,qBAAa,oBAAoB;IAajB,OAAO,CAAC,IAAI;IAZxB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,mFAAmF;IACnF,OAAO,CAAC,KAAK,CAA4D;IACzE,oDAAoD;IACpD,OAAO,CAAC,KAAK,CAAgD;IAC7D,sEAAsE;IACtE,OAAO,CAAC,OAAO,CAAyE;IACxF,OAAO,CAAC,IAAI,CAAyE;IACrF,4CAA4C;IAC5C,OAAO,CAAC,KAAK,CAAiC;gBAE1B,IAAI,EAAE,QAAQ;IAElC,IAAI,MAAM,IAAI,QAAQ,CAAsB;IAE5C,UAAU,IAAI,IAAI;IAMlB,yCAAyC;IACzC,SAAS,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,GAAG,QAAQ;IAY/D,6FAA6F;IAC7F,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1D,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAYtD,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI;IAKhE,mFAAmF;IACnF,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAOvD,4EAA4E;IAC5E,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAOlD,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAMhE,iFAAiF;IACjF,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,gBAAgB;IAgBxB,+EAA+E;IAC/E,QAAQ,IAAI,IAAI;IAmBhB,2EAA2E;IAC3E,OAAO,IAAI,IAAI;CAQlB"}
@@ -0,0 +1,356 @@
1
+ // =============================================================================
2
+ // Animation targets — Self / Each / Targets on groups and models
3
+ // =============================================================================
4
+ //
5
+ // An Animation-tab row on a group or a model reaches (AnimationOptions.scope):
6
+ // self the object as one piece — the old path, `to` absolute (not handled here)
7
+ // each every part on its own: a group's leaf child objects (full depth, through
8
+ // nested groups), a model's meshes
9
+ // targets only the chosen ones (AnimationOptions.targets), each on its own:
10
+ // group → child objects by id (a model child optionally narrowed to nodes),
11
+ // model → nodes by name (every layout copy)
12
+ //
13
+ // Transform `to` on each / targets is RELATIVE to the target's own rest value:
14
+ // position / rotation are added, scale is multiplied. Material `to` stays absolute.
15
+ //
16
+ // Rest values:
17
+ // a scene object root (a group child) → `userData.baseTransform`, written by the
18
+ // viewer's AnimatedObject from the object's settings, so editing the child in the
19
+ // studio moves its rest too;
20
+ // a model node / mesh → snapshotted before the first write (it already carries any
21
+ // saved node override).
22
+ // A target the rows stop driving (row removed, switched off, scope changed) is put
23
+ // back on its rest at the end of the frame (`AnimationTargetState.endFrame`).
24
+ //
25
+ // Materials: a model node whose material is shared with a mesh outside the targets
26
+ // gets its own clone before the first write (otherwise the whole model changes);
27
+ // the original is put back when nothing drives that node's material any more.
28
+ //
29
+ // Stagger (AnimationOptions.stagger): each target starts `delay` seconds later, its
30
+ // delay = total · rank / (n − 1), rank by tree order / axis / centre-out / seeded random.
31
+ //
32
+ import { Box3, Vector3 } from 'three';
33
+ import { findNodesByName } from './nodeOverrides.js';
34
+ import { getMaterialPropertyValue, applyMaterialPropertyToObject } from './materialUtils.js';
35
+ /** What kind of root the scope works on; null = scope does not apply (self). */
36
+ export function targetRootKind(root) {
37
+ const t = root.userData?.objectType;
38
+ return t === 'group' || t === 'model' ? t : null;
39
+ }
40
+ /** The scope a row really runs with on this root ('self' when it cannot apply). */
41
+ export function effectiveScope(root, anim) {
42
+ const scope = anim.scope ?? 'self';
43
+ if (scope === 'self' || !targetRootKind(root))
44
+ return 'self';
45
+ if (scope === 'targets' && !anim.targets?.length)
46
+ return 'self';
47
+ return scope;
48
+ }
49
+ const isFxHelper = (o) => !!o.userData?.__opFxHelper;
50
+ /** Leaf object roots under a group (through nested groups), tree order. */
51
+ function groupLeaves(root) {
52
+ const out = [];
53
+ const walk = (n) => {
54
+ for (const c of n.children) {
55
+ if (isFxHelper(c))
56
+ continue;
57
+ if (c.userData?.id) {
58
+ if (c.userData.objectType === 'group')
59
+ walk(c);
60
+ else
61
+ out.push(c);
62
+ }
63
+ else
64
+ walk(c);
65
+ }
66
+ };
67
+ walk(root);
68
+ return out;
69
+ }
70
+ /** The object root with this id under `root` (any depth). */
71
+ function findObjectRoot(root, id) {
72
+ let hit = null;
73
+ root.traverse((c) => { if (!hit && c !== root && c.userData?.id === id)
74
+ hit = c; });
75
+ return hit;
76
+ }
77
+ /** A model's meshes, tree order (effect helpers left out). */
78
+ function meshesOf(root) {
79
+ const out = [];
80
+ const walk = (n) => {
81
+ for (const c of n.children) {
82
+ if (isFxHelper(c))
83
+ continue;
84
+ if (c.isMesh)
85
+ out.push(c);
86
+ walk(c);
87
+ }
88
+ };
89
+ walk(root);
90
+ return out;
91
+ }
92
+ const nodesNamed = (root, name) => findNodesByName(root, name).filter(n => n !== root);
93
+ /**
94
+ * The Object3Ds a row reaches on `root`, in tree order, without duplicates.
95
+ * 'self' (or a root that is neither a group nor a model) → [root].
96
+ */
97
+ export function resolveAnimationTargets(root, scope, targets) {
98
+ const kind = targetRootKind(root);
99
+ if (!kind || !scope || scope === 'self')
100
+ return [root];
101
+ let out;
102
+ if (kind === 'group') {
103
+ if (scope === 'each')
104
+ out = groupLeaves(root);
105
+ else {
106
+ out = [];
107
+ for (const t of targets ?? []) {
108
+ const child = findObjectRoot(root, t.id);
109
+ if (!child)
110
+ continue;
111
+ if (t.nodes?.length)
112
+ for (const n of t.nodes)
113
+ out.push(...nodesNamed(child, n));
114
+ else
115
+ out.push(child);
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ if (scope === 'each')
121
+ out = meshesOf(root);
122
+ else {
123
+ out = [];
124
+ for (const t of targets ?? [])
125
+ out.push(...nodesNamed(root, t.id));
126
+ }
127
+ }
128
+ return [...new Set(out)];
129
+ }
130
+ // -----------------------------------------------------------------------------
131
+ // Stagger
132
+ // -----------------------------------------------------------------------------
133
+ const hash = (s) => { let h = 2166136261; for (let i = 0; i < s.length; i++) {
134
+ h ^= s.charCodeAt(i);
135
+ h = Math.imul(h, 16777619);
136
+ } return h >>> 0; };
137
+ function mulberry32(seed) {
138
+ return () => {
139
+ seed |= 0;
140
+ seed = (seed + 0x6d2b79f5) | 0;
141
+ let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
142
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
143
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
144
+ };
145
+ }
146
+ /** Seconds each target waits, same order as `objs`. No stagger / total 0 / one target → all 0. */
147
+ export function staggerDelays(root, objs, stagger, seed) {
148
+ const n = objs.length;
149
+ const total = Math.max(0, Number(stagger?.total) || 0);
150
+ if (!total || n < 2)
151
+ return objs.map(() => 0);
152
+ const order = stagger?.order ?? 'tree';
153
+ let ranked; // indices into objs, first goes first
154
+ if (order === 'tree')
155
+ ranked = objs.map((_, i) => i);
156
+ else if (order === 'random') {
157
+ const rnd = mulberry32(hash(seed));
158
+ ranked = objs.map((_, i) => i);
159
+ for (let i = n - 1; i > 0; i--) {
160
+ const j = Math.floor(rnd() * (i + 1));
161
+ [ranked[i], ranked[j]] = [ranked[j], ranked[i]];
162
+ }
163
+ }
164
+ else {
165
+ root.updateWorldMatrix(true, true);
166
+ const box = new Box3();
167
+ const centres = objs.map((o) => {
168
+ const c = new Vector3();
169
+ box.setFromObject(o);
170
+ if (box.isEmpty())
171
+ o.getWorldPosition(c);
172
+ else
173
+ box.getCenter(c);
174
+ return root.worldToLocal(c);
175
+ });
176
+ let key;
177
+ if (order === 'radial') {
178
+ const mid = centres.reduce((a, c) => a.add(c), new Vector3()).divideScalar(n);
179
+ key = (c) => c.distanceTo(mid);
180
+ }
181
+ else
182
+ key = (c) => c[order];
183
+ ranked = objs.map((_, i) => i).sort((a, b) => key(centres[a]) - key(centres[b]) || a - b);
184
+ }
185
+ const delays = new Array(n).fill(0);
186
+ ranked.forEach((idx, rank) => { delays[idx] = (total * rank) / (n - 1); });
187
+ return delays;
188
+ }
189
+ /** Re-resolve a row's targets this often (frames) — children join / leave, models load. */
190
+ const RESOLVE_EVERY = 60;
191
+ export class AnimationTargetState {
192
+ root;
193
+ frame = 0;
194
+ resolved = new Map();
195
+ /** Transform rest snapshots of nodes (object roots use userData.baseTransform). */
196
+ restT = new Map();
197
+ /** Material rest values per target and property. */
198
+ restM = new Map();
199
+ /** Written this frame / last frame: `${uuid}|t|position` → target. */
200
+ touched = new Map();
201
+ last = new Map();
202
+ /** Material clones made per target node. */
203
+ owned = new Map();
204
+ constructor(root) {
205
+ this.root = root;
206
+ }
207
+ get object() { return this.root; }
208
+ beginFrame() {
209
+ this.frame++;
210
+ this.last = this.touched;
211
+ this.touched = new Map();
212
+ }
213
+ /** Targets + delays of a row, cached. */
214
+ targetsOf(anim, scope) {
215
+ const key = `${anim.property}|${scope}|${JSON.stringify(anim.targets ?? null)}|${JSON.stringify(anim.stagger ?? null)}`;
216
+ const hit = this.resolved.get(key);
217
+ if (hit && this.frame - hit.frame < RESOLVE_EVERY && hit.objs.every(o => o.parent))
218
+ return hit;
219
+ const objs = resolveAnimationTargets(this.root, scope, anim.targets);
220
+ const same = hit && hit.objs.length === objs.length && hit.objs.every((o, i) => o === objs[i]);
221
+ const delays = same ? hit.delays : staggerDelays(this.root, objs, anim.stagger, `${this.root.userData?.id ?? this.root.uuid}|${anim.property}`);
222
+ const next = { objs, delays, frame: this.frame };
223
+ this.resolved.set(key, next);
224
+ return next;
225
+ }
226
+ /** Keep a target on what it has (a hover row while not hovered): not restored this frame. */
227
+ hold(obj, domain, prop) {
228
+ const k = `${obj.uuid}|${domain}|${prop}`;
229
+ const prev = this.last.get(k);
230
+ if (prev)
231
+ this.touched.set(k, prev);
232
+ }
233
+ // ---- transform ----------------------------------------------------------
234
+ transformRest(obj, prop) {
235
+ const base = obj.userData?.baseTransform?.[prop];
236
+ if (Array.isArray(base) && base.length >= 3)
237
+ return [base[0], base[1], base[2]];
238
+ let snap = this.restT.get(obj);
239
+ if (!snap) {
240
+ snap = {};
241
+ this.restT.set(obj, snap);
242
+ }
243
+ if (!snap[prop]) {
244
+ const v = obj[prop];
245
+ snap[prop] = [v.x, v.y, v.z];
246
+ }
247
+ return snap[prop];
248
+ }
249
+ writeTransform(obj, prop, v) {
250
+ obj[prop].set(v[0], v[1], v[2]);
251
+ this.touched.set(`${obj.uuid}|t|${prop}`, { obj, domain: 't', prop });
252
+ }
253
+ /** Mark a transform as driven without writing (keyframe rows write themselves). */
254
+ touchTransform(obj, prop) {
255
+ this.transformRest(obj, prop);
256
+ this.touched.set(`${obj.uuid}|t|${prop}`, { obj, domain: 't', prop });
257
+ }
258
+ // ---- material -----------------------------------------------------------
259
+ /** The target's own value before the first write (what it goes back to). */
260
+ materialRest(obj, prop) {
261
+ let rec = this.restM.get(obj);
262
+ if (!rec) {
263
+ rec = {};
264
+ this.restM.set(obj, rec);
265
+ }
266
+ if (!(prop in rec))
267
+ rec[prop] = getMaterialPropertyValue(obj, prop);
268
+ return rec[prop];
269
+ }
270
+ writeMaterial(obj, prop, value) {
271
+ if (!obj.userData?.id)
272
+ this.ownMaterials(obj);
273
+ applyMaterialPropertyToObject(obj, prop, value);
274
+ this.touched.set(`${obj.uuid}|m|${prop}`, { obj, domain: 'm', prop });
275
+ }
276
+ /** A model node: clone the materials it shares with meshes outside it (once). */
277
+ ownMaterials(node) {
278
+ if (this.owned.has(node))
279
+ return;
280
+ const inside = new Set();
281
+ node.traverse(c => inside.add(c));
282
+ const sharedOutside = new Set();
283
+ this.root.traverse((c) => {
284
+ if (inside.has(c))
285
+ return;
286
+ const m = c.material;
287
+ if (!m)
288
+ return;
289
+ for (const x of Array.isArray(m) ? m : [m])
290
+ if (x)
291
+ sharedOutside.add(x);
292
+ });
293
+ const list = [];
294
+ node.traverse((c) => {
295
+ const m = c.material;
296
+ if (!m || isFxHelper(c))
297
+ return;
298
+ const arr = Array.isArray(m) ? m : [m];
299
+ if (!arr.some(x => sharedOutside.has(x)))
300
+ return;
301
+ list.push({ mesh: c, original: m });
302
+ c.material = Array.isArray(m) ? m.map(x => (sharedOutside.has(x) ? x.clone() : x)) : m.clone();
303
+ });
304
+ this.owned.set(node, list);
305
+ }
306
+ releaseMaterials(node) {
307
+ const list = this.owned.get(node);
308
+ if (!list)
309
+ return;
310
+ for (const { mesh, original } of list) {
311
+ const cur = mesh.material;
312
+ for (const x of Array.isArray(cur) ? cur : [cur]) {
313
+ if (x && !(Array.isArray(original) ? original.includes(x) : original === x))
314
+ x.dispose?.();
315
+ }
316
+ mesh.material = original;
317
+ }
318
+ this.owned.delete(node);
319
+ this.restM.delete(node);
320
+ }
321
+ // ---- end of frame -------------------------------------------------------
322
+ /** Put back on their rest the targets driven last frame and not this frame. */
323
+ endFrame() {
324
+ for (const [k, t] of this.last) {
325
+ if (this.touched.has(k))
326
+ continue;
327
+ if (t.domain === 't') {
328
+ const prop = t.prop;
329
+ const r = this.transformRest(t.obj, prop);
330
+ t.obj[prop].set(r[0], r[1], r[2]);
331
+ this.restT.get(t.obj) && delete this.restT.get(t.obj)[prop];
332
+ }
333
+ else {
334
+ const rec = this.restM.get(t.obj);
335
+ if (rec && t.prop in rec)
336
+ applyMaterialPropertyToObject(t.obj, t.prop, rec[t.prop]);
337
+ if (rec)
338
+ delete rec[t.prop];
339
+ const stillDriven = [...this.touched.values()].some(x => x.obj === t.obj && x.domain === 'm');
340
+ if (!stillDriven)
341
+ this.releaseMaterials(t.obj);
342
+ }
343
+ }
344
+ this.last = new Map();
345
+ }
346
+ /** Everything back on its rest (the object goes away / the hook stops). */
347
+ dispose() {
348
+ this.beginFrame();
349
+ this.endFrame();
350
+ for (const node of [...this.owned.keys()])
351
+ this.releaseMaterials(node);
352
+ this.resolved.clear();
353
+ this.restT.clear();
354
+ this.restM.clear();
355
+ }
356
+ }
@@ -1,10 +1,13 @@
1
1
  import { Object3D } from "three";
2
2
  import { AnimationOptions, ColorEffectV2, EffectState, MaterialSettings } from "../types";
3
+ import { type AnimationTargetState } from "./animationTargets";
3
4
  export interface MaterialAnimationContext {
4
5
  object: Object3D;
5
6
  materialSettings: MaterialSettings;
6
7
  /** Cache of start values for animations (property -> value) */
7
8
  startValuesCache: Record<string, any>;
9
+ /** Groups / models: rows scoped each / targets run through it (see animationTargets.ts). */
10
+ targets?: AnimationTargetState;
8
11
  }
9
12
  export declare const DEBUG_MATERIAL_EFFECTS = false;
10
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"handleMaterialEffects.d.ts","sourceRoot":"","sources":["../../src/utils/handleMaterialEffects.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC1F,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACzC;AAMD,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAmC5C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B/I;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAWnJ;AAID;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE;IACnH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B,EAAE,eAAe,GAAE,OAAe,GAAG,IAAI,CAcjD"}
1
+ {"version":3,"file":"handleMaterialEffects.d.ts","sourceRoot":"","sources":["../../src/utils/handleMaterialEffects.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC1F,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,4FAA4F;IAC5F,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAMD,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAmC5C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,wBAAwB,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B/I;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBnJ;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE;IACnH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B,EAAE,eAAe,GAAE,OAAe,GAAG,IAAI,CAcjD"}
@@ -10,6 +10,7 @@ import { calculateTimeProgress, getMaterialPropertyValue, interpolateValue, appl
10
10
  import { applyEasing, gsapEasingMap } from "./animationsUtils.js";
11
11
  import { createDefaultEffectState, } from "./utils.js";
12
12
  import { applyAllColorEffects } from "./frameAnimations.js";
13
+ import { effectiveScope } from "./animationTargets.js";
13
14
  // =============================================================================
14
15
  // DEBUG
15
16
  // =============================================================================
@@ -98,9 +99,37 @@ export function handleMaterialAnimations(ctx, animations, currentTime, hovered)
98
99
  if (property === "position" || property === "rotation" || property === "scale") {
99
100
  return;
100
101
  }
102
+ const scope = ctx.targets ? effectiveScope(ctx.object, animation) : 'self';
103
+ if (scope !== 'self') {
104
+ animateMaterialTargets(ctx.targets, animation, scope, currentTime, hovered);
105
+ return;
106
+ }
101
107
  animateMaterialProperty(ctx, animation, currentTime, hovered);
102
108
  });
103
109
  }
110
+ /** A row scoped each / targets: each target from its own value to `to` (absolute), `delay` later each (stagger). */
111
+ function animateMaterialTargets(state, animation, scope, currentTime, hovered) {
112
+ const { property, to, duration, ease, loop = false, yoyo = false } = animation;
113
+ if (to === undefined)
114
+ return;
115
+ const { objs, delays } = state.targetsOf(animation, scope);
116
+ if (animation.triggerMode === "hover" && !hovered) {
117
+ for (const o of objs)
118
+ state.hold(o, 'm', property);
119
+ return;
120
+ }
121
+ const easing = ease ? (gsapEasingMap[ease] || ease) : null;
122
+ objs.forEach((target, i) => {
123
+ const rest = state.materialRest(target, property);
124
+ const from = animation.from !== undefined ? animation.from : rest;
125
+ if (from === null || from === undefined)
126
+ return;
127
+ let t = calculateTimeProgress(currentTime - delays[i] * 1000, duration, yoyo, loop);
128
+ if (easing)
129
+ t = applyEasing(easing, t);
130
+ state.writeMaterial(target, property, interpolateValue(property, from, to, t));
131
+ });
132
+ }
104
133
  // =============================================================================
105
134
  // HANDLE MATERIAL EFFECTS (COLOR EFFECTS)
106
135
  // =============================================================================
@@ -2,21 +2,29 @@ import type { Object3D } from 'three';
2
2
  import type { AnimationOptions, Vector3Array } from "../types/scene3d";
3
3
  import type { TransformEffectV2 } from "../types/objectSettings";
4
4
  import type { EffectState } from "../types/effects";
5
+ import { type AnimationTargetState } from "./animationTargets";
5
6
  export interface TransformAnimationContext {
6
7
  object: Object3D;
7
8
  meshSettings: any;
8
9
  pathIsActive: boolean;
10
+ /** Groups / models: rows scoped each / targets run through it (see animationTargets.ts). Absent = every row on the object itself. */
11
+ targets?: AnimationTargetState;
12
+ /**
13
+ * A timeline clip driving a row's `to` (by its index in the list): laid over the authored value
14
+ * while the clip runs — live, never written to the settings. Absent / undefined = the row's own.
15
+ */
16
+ liveTo?: (index: number) => Vector3Array | undefined;
9
17
  }
10
18
  export declare const DEBUG_TRANSFORM_EFFECTS = false;
11
19
  /**
12
20
  * Animate a single transform property (position, rotation, scale).
13
21
  */
14
- export declare function animateTransformProperty(object: Object3D, property: "position" | "rotation" | "scale", start: Vector3Array, to: Vector3Array, timeProgress: number, animationType: string, animationSpeed: number): void;
22
+ export declare function animateTransformProperty(object: Object3D, property: "position" | "rotation" | "scale", start: Vector3Array, to: Vector3Array, timeProgress: number, animationType: string, animationSpeed: number, frames?: number): void;
15
23
  /**
16
24
  * Process all active transform animations for an object.
17
25
  * Handles position, rotation, and scale animations.
18
26
  */
19
- export declare function handleTransformAnimations(ctx: TransformAnimationContext, animations: AnimationOptions[], currentTime: number, hovered: boolean): void;
27
+ export declare function handleTransformAnimations(ctx: TransformAnimationContext, animations: AnimationOptions[], currentTime: number, hovered: boolean, delta?: number): void;
20
28
  /**
21
29
  * Apply continuous transform effect (wave, float, spin, etc.).
22
30
  * @param object - The 3D object to apply effects to
@@ -1 +1 @@
1
- {"version":3,"file":"handleTransformEffects.d.ts","sourceRoot":"","sources":["../../src/utils/handleTransformEffects.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAKtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,QAAQ,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACzB;AAMD,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAS7C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAmBxN;AAID;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,yBAAyB,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDrJ;AAID;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE;IACtJ,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBjC"}
1
+ {"version":3,"file":"handleTransformEffects.d.ts","sourceRoot":"","sources":["../../src/utils/handleTransformEffects.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAKtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,QAAQ,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,qIAAqI;IACrI,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;CACxD;AAMD,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAS7C;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI,CAwBpO;AAID;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,yBAAyB,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CA0CrK;AAuCD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE;IACtJ,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBjC"}
@@ -10,6 +10,7 @@ import { applyEasing, gsapEasingMap } from "./animationsUtils.js";
10
10
  import { applyTransformEffects } from "../utils/frameAnimations.js";
11
11
  import { calculateTimeProgress } from "./materialUtils.js";
12
12
  import { createDefaultEffectState } from "./utils.js";
13
+ import { effectiveScope } from "./animationTargets.js";
13
14
  // =============================================================================
14
15
  // DEBUG
15
16
  // =============================================================================
@@ -25,14 +26,19 @@ const log = (message, ...args) => {
25
26
  /**
26
27
  * Animate a single transform property (position, rotation, scale).
27
28
  */
28
- export function animateTransformProperty(object, property, start, to, timeProgress, animationType, animationSpeed) {
29
+ export function animateTransformProperty(object, property, start, to, timeProgress, animationType, animationSpeed, frames = 1) {
29
30
  if (animationType === "keyframe") {
30
- // Keyframe mode: add incremental change
31
+ // Keyframe (continuous) mode: add an incremental change. `frames` is the
32
+ // frame's duration in 60 Hz frames, so the speed is per SECOND — what a
33
+ // 60 fps screen always showed — instead of per rendered frame, which made
34
+ // a phone at 30-40 fps spin slower and stutter on every dropped frame, and
35
+ // a 120 Hz screen spin twice as fast.
31
36
  const currentValue = object[property].toArray();
37
+ const k = animationSpeed * 0.001 * frames;
32
38
  const newValue = [
33
- currentValue[0] + to[0] * animationSpeed * 0.001,
34
- currentValue[1] + to[1] * animationSpeed * 0.001,
35
- currentValue[2] + to[2] * animationSpeed * 0.001,
39
+ currentValue[0] + to[0] * k,
40
+ currentValue[1] + to[1] * k,
41
+ currentValue[2] + to[2] * k,
36
42
  ];
37
43
  object[property].set(...newValue);
38
44
  }
@@ -52,23 +58,32 @@ export function animateTransformProperty(object, property, start, to, timeProgre
52
58
  * Process all active transform animations for an object.
53
59
  * Handles position, rotation, and scale animations.
54
60
  */
55
- export function handleTransformAnimations(ctx, animations, currentTime, hovered) {
61
+ export function handleTransformAnimations(ctx, animations, currentTime, hovered, delta) {
56
62
  const { object, meshSettings, pathIsActive } = ctx;
63
+ // Frame duration in 60 Hz frames, for continuous (keyframe) animations. Capped
64
+ // at 0.1 s so a backgrounded tab does not jump a whole spin when it returns.
65
+ // Without a delta (older callers) one frame, the old per-frame behaviour.
66
+ const frames = delta === undefined ? 1 : Math.min(Math.max(delta, 0), 0.1) * 60;
57
67
  // console.log("handleTransformAnimations called with animations:", animations);
58
- animations.forEach((animation) => {
59
- const { property, ease, duration, loop = false, to, yoyo = false, active, type = "interpolation", objectIds, triggerMode = "always", } = animation;
68
+ animations.forEach((row, index) => {
69
+ const live = ctx.liveTo?.(index);
70
+ const animation = live ? { ...row, to: live } : row;
71
+ const { property, ease, duration, loop = false, to, yoyo = false, active, type = "interpolation", triggerMode = "always", } = animation;
60
72
  if (!active)
61
73
  return;
62
- if (triggerMode === "hover" && !hovered)
74
+ // Only handle transform properties
75
+ if (property !== "position" && property !== "rotation" && property !== "scale") {
63
76
  return;
64
- // Skip position/rotation if path animation is active (path controls these)
65
- if (pathIsActive &&
66
- (property === "position" || property === "rotation") &&
67
- (!objectIds || objectIds.length === 0)) {
77
+ }
78
+ const scope = ctx.targets ? effectiveScope(object, animation) : 'self';
79
+ if (scope !== 'self') {
80
+ animateTargets(ctx.targets, animation, property, scope, currentTime, hovered, frames);
68
81
  return;
69
82
  }
70
- // Only handle transform properties
71
- if (property !== "position" && property !== "rotation" && property !== "scale") {
83
+ if (triggerMode === "hover" && !hovered)
84
+ return;
85
+ // Skip position/rotation if path animation is active (path controls these)
86
+ if (pathIsActive && (property === "position" || property === "rotation")) {
72
87
  return;
73
88
  }
74
89
  // Calculate animation progress
@@ -79,32 +94,46 @@ export function handleTransformAnimations(ctx, animations, currentTime, hovered)
79
94
  timeProgress = applyEasing(easingFunctionName, timeProgress);
80
95
  }
81
96
  const animationSpeed = 1000 / duration;
82
- // Determine which objects to animate
83
- const targetsToAnimate = [];
84
- if (objectIds && objectIds.length > 0) {
85
- // Animate specific children by name
86
- // Every match, not getObjectByName's first: a model repeated by
87
- // meshSettings.layout has the same part name once per copy.
88
- const names = new Set(objectIds);
89
- object.traverse((child) => {
90
- if (child.name && names.has(child.name)) {
91
- targetsToAnimate.push(child);
92
- }
93
- });
94
- log("animating specific targets", { objectIds, found: targetsToAnimate.length });
95
- }
96
- else {
97
- // Animate the parent object
98
- targetsToAnimate.push(object);
99
- }
100
97
  // Get start value from meshSettings
101
98
  const start = meshSettings[property];
102
99
  if (!start || !to)
103
100
  return;
104
- // Apply animation to each target
105
- targetsToAnimate.forEach((target) => {
106
- animateTransformProperty(target, property, start, to, timeProgress, type, animationSpeed);
101
+ animateTransformProperty(object, property, start, to, timeProgress, type, animationSpeed, frames);
102
+ });
103
+ }
104
+ /**
105
+ * A row scoped each / targets: every target on its own, `to` relative to the target's rest
106
+ * (position / rotation added, scale multiplied), each target `delay` later (stagger).
107
+ */
108
+ function animateTargets(state, animation, property, scope, currentTime, hovered, frames) {
109
+ const { ease, duration, loop = false, to, yoyo = false, type = "interpolation", triggerMode = "always" } = animation;
110
+ const { objs, delays } = state.targetsOf(animation, scope);
111
+ if (triggerMode === "hover" && !hovered) {
112
+ for (const o of objs)
113
+ state.hold(o, 't', property);
114
+ return;
115
+ }
116
+ if (!Array.isArray(to) || to.length < 3)
117
+ return;
118
+ const isScale = property === "scale";
119
+ const animationSpeed = 1000 / duration;
120
+ const easing = ease ? (gsapEasingMap[ease] || ease) : null;
121
+ objs.forEach((target, i) => {
122
+ if (type === "keyframe") {
123
+ // Continuous: the same increment per frame on each target (a stagger has nothing to offset).
124
+ state.touchTransform(target, property);
125
+ animateTransformProperty(target, property, [0, 0, 0], to, 0, "keyframe", animationSpeed, frames);
126
+ return;
127
+ }
128
+ let t = calculateTimeProgress(currentTime - delays[i] * 1000, duration, yoyo, loop);
129
+ if (easing)
130
+ t = applyEasing(easing, t);
131
+ const rest = state.transformRest(target, property);
132
+ const v = rest.map((r, k) => {
133
+ const d = Number(to[k]) || 0;
134
+ return isScale ? r * MathUtils.lerp(1, d, t) : r + MathUtils.lerp(0, d, t);
107
135
  });
136
+ state.writeTransform(target, property, v);
108
137
  });
109
138
  }
110
139
  // =============================================================================
@@ -21,6 +21,7 @@ export * from './utils';
21
21
  export * from './edgeUtils';
22
22
  export * from './surfaceUtils';
23
23
  export * from './objectTreeUtils';
24
+ export * from './animationTargets';
24
25
  export * from './handleTransformEffects';
25
26
  export * from './handleEdgesAnimations';
26
27
  export * from './handleLightAnimations';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
@@ -21,6 +21,7 @@ export * from './utils.js';
21
21
  export * from './edgeUtils.js';
22
22
  export * from './surfaceUtils.js';
23
23
  export * from './objectTreeUtils.js';
24
+ export * from './animationTargets.js';
24
25
  export * from './handleTransformEffects.js';
25
26
  export * from './handleEdgesAnimations.js';
26
27
  export * from './handleLightAnimations.js';
@@ -17,8 +17,12 @@ export declare const SELF_OWNED_MATERIAL_KEY = "__ownsItsMaterial";
17
17
  * with EDGES_GROUP_KEY, GEREATIVE_EFFECTS_KEY or SELF_OWNED_MATERIAL_KEY — unless obj itself
18
18
  * carries that mark (so an edges group or generative effects group can still
19
19
  * apply its own material via useMaterialApplication).
20
+ * `stopAtObjects`: also stop at the roots of child scene objects — an object's material
21
+ * never reaches the objects parented under it (they apply their own).
20
22
  */
21
- export declare function traverseSkippingEdgesAndEffects(obj: Object3D, isRoot: boolean, callback: (node: Object3D) => void): void;
23
+ export declare function traverseSkippingEdgesAndEffects(obj: Object3D, isRoot: boolean, callback: (node: Object3D) => void, stopAtObjects?: boolean): void;
24
+ /** The root of a scene object (the viewer's AnimatedObject tags it with its id and type). */
25
+ export declare const isSceneObjectRoot: (obj: Object3D) => boolean;
22
26
  /**
23
27
  * Create a fresh material instance for a variant and apply settings to it.
24
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"materialApplicationUtils.d.ts","sourceRoot":"","sources":["../../src/utils/materialApplicationUtils.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChD,OAA4B,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAKrF,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAChD,eAAO,MAAM,qBAAqB,+BAA+B,CAAC;AAClE,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI,CAOxH;AAKD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAI/G;AACD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAQlH;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAsCrF;AACD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1F;AACD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGtD;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAElE;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAElE;AACD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,GAAG,CAAC,MAAM,CAGtC,CAAC;AACH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAC3D,OAAO,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;CACN,CA6BJ"}
1
+ {"version":3,"file":"materialApplicationUtils.d.ts","sourceRoot":"","sources":["../../src/utils/materialApplicationUtils.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChD,OAA4B,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAKrF,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAChD,eAAO,MAAM,qBAAqB,+BAA+B,CAAC;AAClE,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAC3D;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,EAAE,aAAa,UAAQ,GAAG,IAAI,CAU/I;AAED,6FAA6F;AAC7F,eAAO,MAAM,iBAAiB,GAAI,KAAK,QAAQ,KAAG,OAA2D,CAAC;AAK9G;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAI/G;AACD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAQlH;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAsCrF;AACD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1F;AACD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGtD;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAElE;AACD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAElE;AACD;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,GAAG,CAAC,MAAM,CAGtC,CAAC;AACH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAC3D,OAAO,EAAE,KAAK,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,CAAC;QACV,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;CACN,CA6BJ"}
@@ -32,15 +32,22 @@ export const SELF_OWNED_MATERIAL_KEY = '__ownsItsMaterial';
32
32
  * with EDGES_GROUP_KEY, GEREATIVE_EFFECTS_KEY or SELF_OWNED_MATERIAL_KEY — unless obj itself
33
33
  * carries that mark (so an edges group or generative effects group can still
34
34
  * apply its own material via useMaterialApplication).
35
+ * `stopAtObjects`: also stop at the roots of child scene objects — an object's material
36
+ * never reaches the objects parented under it (they apply their own).
35
37
  */
36
- export function traverseSkippingEdgesAndEffects(obj, isRoot, callback) {
38
+ export function traverseSkippingEdgesAndEffects(obj, isRoot, callback, stopAtObjects = false) {
37
39
  if (!isRoot && (obj.userData[EDGES_GROUP_KEY] || obj.userData[GEREATIVE_EFFECTS_KEY] || obj.userData[SELF_OWNED_MATERIAL_KEY] || obj.userData[IMAGE_KEY]))
38
40
  return;
41
+ // Another scene object (a child object of this one) owns its own material.
42
+ if (!isRoot && stopAtObjects && isSceneObjectRoot(obj))
43
+ return;
39
44
  callback(obj);
40
45
  for (const child of obj.children) {
41
- traverseSkippingEdgesAndEffects(child, false, callback);
46
+ traverseSkippingEdgesAndEffects(child, false, callback, stopAtObjects);
42
47
  }
43
48
  }
49
+ /** The root of a scene object (the viewer's AnimatedObject tags it with its id and type). */
50
+ export const isSceneObjectRoot = (obj) => !!obj.userData?.id && !!obj.userData?.objectType;
44
51
  // Known color property names on Three.js materials
45
52
  const COLOR_PROPERTIES = new Set([
46
53
  'color', 'emissive', 'specular', 'sheenColor', 'specularColor', 'attenuationColor'
@@ -9,6 +9,19 @@ export declare function objectTakesVisualEffects(o: {
9
9
  type?: string;
10
10
  config?: unknown;
11
11
  } | null | undefined): boolean;
12
+ /**
13
+ * A group's material goes to its children the way its visual effects do: a group has no surface,
14
+ * so applying a material to it applies it to every object inside it (any depth) that takes visual
15
+ * effects — meshes and models; objects drawing their own shaders (particles, grids, text, lights…)
16
+ * keep theirs. `targets` (child ids, any depth) narrows it: a chosen nested group stands for
17
+ * what is inside it. Each child keeps the material in its own settings.
18
+ */
19
+ export declare function groupMaterialTargets<T extends {
20
+ id: string;
21
+ type?: string;
22
+ parentId?: string | null;
23
+ config?: unknown;
24
+ }>(objects: readonly T[], groupId: string, targets?: readonly string[] | null): T[];
12
25
  /** A group's stagger when its clip sets none (see EffectSpread). */
13
26
  export declare const DEFAULT_EFFECT_SPREAD: Required<EffectSpread>;
14
27
  /** An object's effect clip (`effects`), or an empty one. The stored value itself — identity stays stable. */
@@ -1 +1 @@
1
- {"version":3,"file":"objectEffects.d.ts","sourceRoot":"","sources":["../../src/utils/objectEffects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEzG;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG3G;AAED,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,YAAY,CAAiD,CAAC;AAI3G,6GAA6G;AAC7G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAGvG;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,EAAE,CAGlG;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAEjG;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAEtH"}
1
+ {"version":3,"file":"objectEffects.d.ts","sourceRoot":"","sources":["../../src/utils/objectEffects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEzG;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG3G;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EACpH,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAC3E,CAAC,EAAE,CAwBL;AAED,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,YAAY,CAAiD,CAAC;AAI3G,6GAA6G;AAC7G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CAGvG;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,EAAE,CAGlG;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAEjG;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CAAC,CAAC,SAAS;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAEtH"}
@@ -8,6 +8,59 @@ export function objectTakesVisualEffects(o) {
8
8
  // a group never draws an effect itself: its visual effects go to each child that takes them
9
9
  return o?.type === 'mesh' || o?.type === 'model' || o?.type === 'group';
10
10
  }
11
+ /**
12
+ * A group's material goes to its children the way its visual effects do: a group has no surface,
13
+ * so applying a material to it applies it to every object inside it (any depth) that takes visual
14
+ * effects — meshes and models; objects drawing their own shaders (particles, grids, text, lights…)
15
+ * keep theirs. `targets` (child ids, any depth) narrows it: a chosen nested group stands for
16
+ * what is inside it. Each child keeps the material in its own settings.
17
+ */
18
+ export function groupMaterialTargets(objects, groupId, targets) {
19
+ const byParent = new Map();
20
+ for (const o of objects) {
21
+ if (!o.parentId)
22
+ continue;
23
+ const list = byParent.get(o.parentId);
24
+ if (list)
25
+ list.push(o);
26
+ else
27
+ byParent.set(o.parentId, [o]);
28
+ }
29
+ const out = [];
30
+ const seen = new Set();
31
+ const takes = (o) => o.type !== 'group' && objectTakesVisualEffects(o);
32
+ const add = (o) => { if (!seen.has(o.id) && takes(o)) {
33
+ seen.add(o.id);
34
+ out.push(o);
35
+ } };
36
+ const walk = (id) => { for (const c of byParent.get(id) ?? []) {
37
+ add(c);
38
+ walk(c.id);
39
+ } };
40
+ if (!targets?.length) {
41
+ walk(groupId);
42
+ return out;
43
+ }
44
+ // only targets inside this group
45
+ const inside = new Set();
46
+ const mark = (id) => { for (const c of byParent.get(id) ?? []) {
47
+ inside.add(c.id);
48
+ mark(c.id);
49
+ } };
50
+ mark(groupId);
51
+ for (const id of targets) {
52
+ if (!inside.has(id))
53
+ continue;
54
+ const o = objects.find(x => x.id === id);
55
+ if (!o)
56
+ continue;
57
+ if (o.type === 'group')
58
+ walk(o.id);
59
+ else
60
+ add(o);
61
+ }
62
+ return out;
63
+ }
11
64
  /** A group's stagger when its clip sets none (see EffectSpread). */
12
65
  export const DEFAULT_EFFECT_SPREAD = { order: 'tree', total: 0.6, out: 'reverse' };
13
66
  const EMPTY = Object.freeze({ effects: [] });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3driseai/3drise-core",
3
- "version": "1.0.24",
3
+ "version": "1.0.26",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",