@3driseai/3drise-viewer 0.1.33 → 0.1.35
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/dist/animationsV2/ClipsRuntime.d.ts +9 -0
- package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
- package/dist/animationsV2/ClipsRuntime.js +42 -1
- package/dist/animationsV2/animationLive.d.ts +7 -0
- package/dist/animationsV2/animationLive.d.ts.map +1 -0
- package/dist/animationsV2/animationLive.js +26 -0
- package/dist/animationsV2/appliers.d.ts +8 -0
- package/dist/animationsV2/appliers.d.ts.map +1 -1
- package/dist/animationsV2/appliers.js +61 -0
- package/dist/animationsV2/index.d.ts +1 -0
- package/dist/animationsV2/index.d.ts.map +1 -1
- package/dist/animationsV2/index.js +1 -0
- package/dist/animationsV2/sequenceUtils.d.ts +1 -0
- package/dist/animationsV2/sequenceUtils.d.ts.map +1 -1
- package/dist/animationsV2/sequenceUtils.js +7 -4
- package/dist/animationsV2/types.d.ts +4 -0
- package/dist/animationsV2/types.d.ts.map +1 -1
- package/dist/components/AnimatedObject.d.ts.map +1 -1
- package/dist/components/AnimatedObject.js +2 -0
- package/dist/components/CreatedObject.d.ts.map +1 -1
- package/dist/components/CreatedObject.js +4 -1
- package/dist/components/GroupMaterialContext.d.ts +25 -0
- package/dist/components/GroupMaterialContext.d.ts.map +1 -0
- package/dist/components/GroupMaterialContext.js +21 -0
- package/dist/components/LightObject.js +3 -3
- package/dist/components/ObjectNode.d.ts.map +1 -1
- package/dist/components/ObjectNode.js +13 -2
- package/dist/components/ProjectLoader.d.ts.map +1 -1
- package/dist/components/ProjectLoader.js +2 -0
- package/dist/components/candle/Candle.js +1 -1
- package/dist/components/effects/HarmonicShellEffect.d.ts.map +1 -1
- package/dist/components/effects/HarmonicShellEffect.js +6 -0
- package/dist/components/fluorescentTube/FluorescentTube.js +1 -1
- package/dist/components/ledArray/LedArray.js +1 -1
- package/dist/components/lightBulb/LightBulb.js +1 -1
- package/dist/components/spotBeam/SpotBeam.js +1 -1
- package/dist/hooks/useContinuousEffects.d.ts.map +1 -1
- package/dist/hooks/useContinuousEffects.js +34 -2
- package/dist/hooks/useLightShadow.d.ts +1 -1
- package/dist/hooks/useLightShadow.d.ts.map +1 -1
- package/dist/hooks/useLightShadow.js +10 -6
- package/dist/hooks/useMaterialApplication.d.ts.map +1 -1
- package/dist/hooks/useMaterialApplication.js +2 -1
- package/dist/hooks/useMaterialUniforms.d.ts +2 -8
- package/dist/hooks/useMaterialUniforms.d.ts.map +1 -1
- package/dist/hooks/useMaterialUniforms.js +18 -6
- package/dist/operations/catalogue/physicalHeld.d.ts.map +1 -1
- package/dist/operations/catalogue/physicalHeld.js +6 -0
- package/dist/operations/index.d.ts +1 -1
- package/dist/operations/index.d.ts.map +1 -1
- package/dist/operations/index.js +1 -1
- package/dist/operations/objectEffects.d.ts +15 -1
- package/dist/operations/objectEffects.d.ts.map +1 -1
- package/dist/operations/objectEffects.js +49 -1
- package/dist/operations/runtime.d.ts +9 -3
- package/dist/operations/runtime.d.ts.map +1 -1
- package/dist/operations/runtime.js +67 -19
- package/dist/operations/types.d.ts +5 -0
- package/dist/operations/types.d.ts.map +1 -1
- package/dist/triggers/readiness.js +1 -1
- package/dist/utils/cdnUrls.d.ts +10 -0
- package/dist/utils/cdnUrls.d.ts.map +1 -0
- package/dist/utils/cdnUrls.js +18 -0
- package/package.json +2 -2
|
@@ -82,6 +82,15 @@ declare class ClipsRuntime {
|
|
|
82
82
|
/** State changes only (play / pause / stop / start / end / reset / edits) — safe for React. */
|
|
83
83
|
subscribeState(listener: () => void): () => void;
|
|
84
84
|
getStateVersion(): number;
|
|
85
|
+
/**
|
|
86
|
+
* Whether an active clip / sequence (playing or posed) has a track on this object's transform
|
|
87
|
+
* property ('position' | 'rotation' | 'scale'; `node` = a model part) — then it has full control:
|
|
88
|
+
* the object's constant animations stop on it until the clip ends (useContinuousEffects).
|
|
89
|
+
* Rebuilt only when what is active changes (start / stop / edits), not per frame.
|
|
90
|
+
*/
|
|
91
|
+
takesOver(state: string, property: string, node?: string): boolean;
|
|
92
|
+
private taken;
|
|
93
|
+
private takenVersion;
|
|
85
94
|
on(listener: (e: RuntimeEvent) => void): () => void;
|
|
86
95
|
/**
|
|
87
96
|
* Forget every instance without writing anything back — a new scene is loading
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClipsRuntime.d.ts","sourceRoot":"","sources":["../../src/animationsV2/ClipsRuntime.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,
|
|
1
|
+
{"version":3,"file":"ClipsRuntime.d.ts","sourceRoot":"","sources":["../../src/animationsV2/ClipsRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
import { SceneActions, expandMaterialVariant } from '@3driseai/3drise-core';
|
|
43
43
|
import { logTrigger } from '../triggers/log.js';
|
|
44
44
|
import { getAtPath, sampleTrack } from './clipUtils.js';
|
|
45
|
-
import { applyValue, clearApplierCaches, isApplicable, isTargetMounted } from './appliers.js';
|
|
45
|
+
import { applyValue, clearApplierCaches, isApplicable, isTargetMounted, releaseLive } from './appliers.js';
|
|
46
46
|
import { readNodeValue, restoreNodeTrack } from './nodeTracks.js';
|
|
47
47
|
import { cueStatesAt, entryLocalTime, isEntryActive, resolveSequence, cueCommand, clipCueSchedule, firedBetween, } from './sequenceUtils.js';
|
|
48
48
|
/** Longest an autoplaying sequence waits for its targets. */
|
|
@@ -170,6 +170,35 @@ class ClipsRuntime {
|
|
|
170
170
|
return () => this.stateListeners.delete(listener);
|
|
171
171
|
}
|
|
172
172
|
getStateVersion() { return this.stateVersion; }
|
|
173
|
+
/**
|
|
174
|
+
* Whether an active clip / sequence (playing or posed) has a track on this object's transform
|
|
175
|
+
* property ('position' | 'rotation' | 'scale'; `node` = a model part) — then it has full control:
|
|
176
|
+
* the object's constant animations stop on it until the clip ends (useContinuousEffects).
|
|
177
|
+
* Rebuilt only when what is active changes (start / stop / edits), not per frame.
|
|
178
|
+
*/
|
|
179
|
+
takesOver(state, property, node) {
|
|
180
|
+
if (this.takenVersion !== this.stateVersion) {
|
|
181
|
+
this.takenVersion = this.stateVersion;
|
|
182
|
+
this.taken.clear();
|
|
183
|
+
const add = (tracks) => {
|
|
184
|
+
for (const t of tracks) {
|
|
185
|
+
if (t.muted || !t.keys.length)
|
|
186
|
+
continue;
|
|
187
|
+
const prop = t.node ? t.path : t.path.startsWith('meshSettings.') ? t.path.slice('meshSettings.'.length) : null;
|
|
188
|
+
if (prop === 'position' || prop === 'rotation' || prop === 'scale')
|
|
189
|
+
this.taken.add(`${t.state}|${t.node ?? ''}|${prop}`);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
for (const inst of this.clips.values())
|
|
193
|
+
add(inst.clip.tracks);
|
|
194
|
+
for (const inst of this.sequences.values())
|
|
195
|
+
for (const e of inst.schedule.entries)
|
|
196
|
+
add(e.clip.tracks);
|
|
197
|
+
}
|
|
198
|
+
return this.taken.has(`${state}|${node ?? ''}|${property}`);
|
|
199
|
+
}
|
|
200
|
+
taken = new Set();
|
|
201
|
+
takenVersion = -1;
|
|
173
202
|
on(listener) {
|
|
174
203
|
this.eventListeners.add(listener);
|
|
175
204
|
return () => this.eventListeners.delete(listener);
|
|
@@ -181,6 +210,12 @@ class ClipsRuntime {
|
|
|
181
210
|
*/
|
|
182
211
|
reset() {
|
|
183
212
|
this.dlog('reset', { clips: this.clips.size, sequences: [...this.sequences.values()].map(i => i.seq.name) }, this.caller());
|
|
213
|
+
// effect params a clip was driving live on the effects' controllers, not in settings: hand them back
|
|
214
|
+
const driven = [...this.clips.values()].flatMap(i => i.clip.tracks)
|
|
215
|
+
.concat([...this.sequences.values()].flatMap(i => i.schedule.entries.flatMap(e => e.clip.tracks)));
|
|
216
|
+
for (const t of driven)
|
|
217
|
+
if (!t.node)
|
|
218
|
+
releaseLive(t.state, t.path);
|
|
184
219
|
this.clips.clear();
|
|
185
220
|
this.sequences.clear();
|
|
186
221
|
this.pendingRestore = [];
|
|
@@ -612,6 +647,8 @@ class ClipsRuntime {
|
|
|
612
647
|
: c?.kind === 'effectClip' ? c.use?.targets ?? []
|
|
613
648
|
: c?.kind === 'change' ? (c.targets ?? []).map((t) => t?.state).filter((s) => s && !ENV.includes(s)) : []);
|
|
614
649
|
for (const sc of inst.schedule.cues) {
|
|
650
|
+
if (sc.cue.muted)
|
|
651
|
+
continue;
|
|
615
652
|
const cmd = cueCommand(sc.cue);
|
|
616
653
|
for (const id of idsOf(cmd))
|
|
617
654
|
if (id !== 'self' && !isTargetMounted(ctx, id))
|
|
@@ -780,6 +817,10 @@ class ClipsRuntime {
|
|
|
780
817
|
restoreNodeTrack(track.state, node, track.path, (path) => this.isDriven(track.state, node, path));
|
|
781
818
|
continue;
|
|
782
819
|
}
|
|
820
|
+
// Live-only values (an effect's param, an animation row's value): the object's own comes back
|
|
821
|
+
// (another driver re-writes it this frame).
|
|
822
|
+
if (releaseLive(track.state, track.path))
|
|
823
|
+
continue;
|
|
783
824
|
// Another driver may still own this property; it re-writes this frame.
|
|
784
825
|
const authored = getAtPath(ctx.getSettings(track.state), track.path);
|
|
785
826
|
if (authored !== undefined)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Vector3Array } from '@3driseai/3drise-core';
|
|
2
|
+
/** `animations.transform.animations.<n>.to` → n (null for any other path). */
|
|
3
|
+
export declare function transformAnimationIndex(path: string): number | null;
|
|
4
|
+
export declare function setAnimationLive(objectId: string, index: number, value: Vector3Array | undefined): void;
|
|
5
|
+
/** The transform runner's reader for one object (undefined = no live values on it). */
|
|
6
|
+
export declare function animationLiveReader(objectId: string | undefined): ((index: number) => Vector3Array | undefined) | undefined;
|
|
7
|
+
//# sourceMappingURL=animationLive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationLive.d.ts","sourceRoot":"","sources":["../../src/animationsV2/animationLive.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,8EAA8E;AAC9E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CASvG;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC,GAAG,SAAS,CAG3H"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const live = new Map();
|
|
2
|
+
/** `animations.transform.animations.<n>.to` → n (null for any other path). */
|
|
3
|
+
export function transformAnimationIndex(path) {
|
|
4
|
+
const m = /^animations\.transform\.animations\.(\d+)\.to$/.exec(path);
|
|
5
|
+
return m ? Number(m[1]) : null;
|
|
6
|
+
}
|
|
7
|
+
export function setAnimationLive(objectId, index, value) {
|
|
8
|
+
let rows = live.get(objectId);
|
|
9
|
+
if (value === undefined) {
|
|
10
|
+
rows?.delete(index);
|
|
11
|
+
if (rows && !rows.size)
|
|
12
|
+
live.delete(objectId);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (!rows) {
|
|
16
|
+
rows = new Map();
|
|
17
|
+
live.set(objectId, rows);
|
|
18
|
+
}
|
|
19
|
+
rows.set(index, value);
|
|
20
|
+
}
|
|
21
|
+
/** The transform runner's reader for one object (undefined = no live values on it). */
|
|
22
|
+
export function animationLiveReader(objectId) {
|
|
23
|
+
if (!objectId)
|
|
24
|
+
return undefined;
|
|
25
|
+
return (index) => live.get(objectId)?.get(index);
|
|
26
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { ActionSequence } from '@3driseai/3drise-core';
|
|
2
2
|
import type { PerspectiveCamera } from 'three';
|
|
3
3
|
import type { KeyValue } from './types';
|
|
4
|
+
/** `effects.<effectId>.<param>` → [effectId, param] (null for any other path). */
|
|
5
|
+
export declare function effectParamPath(path: string): [string, string] | null;
|
|
4
6
|
export interface ApplyContext {
|
|
5
7
|
camera: PerspectiveCamera | null;
|
|
6
8
|
/** drei OrbitControls (makeDefault), when present */
|
|
@@ -11,6 +13,12 @@ export interface ApplyContext {
|
|
|
11
13
|
getAction?: (id: string) => ActionSequence | undefined;
|
|
12
14
|
}
|
|
13
15
|
export declare function clearApplierCaches(): void;
|
|
16
|
+
/**
|
|
17
|
+
* A live-only track stops (an object's effect param, an animation row's value — values laid over
|
|
18
|
+
* what the object runs, never in its settings): the object's own value comes back. False for any
|
|
19
|
+
* other path (those restore from the authored settings).
|
|
20
|
+
*/
|
|
21
|
+
export declare function releaseLive(state: string, path: string): boolean;
|
|
14
22
|
/** Write one value. Unknown paths are ignored (the track picker never offers them). */
|
|
15
23
|
/** Write one value to the live scene. False when its target is not mounted yet. */
|
|
16
24
|
export declare function applyValue(ctx: ApplyContext, state: string, path: string, value: KeyValue, node?: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appliers.d.ts","sourceRoot":"","sources":["../../src/animationsV2/appliers.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAiB/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"appliers.d.ts","sourceRoot":"","sources":["../../src/animationsV2/appliers.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAiB/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKrE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,qDAAqD;IACrD,QAAQ,EAAE,GAAG,CAAC;IACd,yFAAyF;IACzF,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;IACpC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;CACxD;AAWD,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC;AAsOD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,uFAAuF;AACvF,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAIlH;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAKxF;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE"}
|
|
@@ -8,6 +8,16 @@ import { sunAnglesFromDirection, skySystemManager } from '@3driseai/3drise-core'
|
|
|
8
8
|
import { sunSystemLive, SUN_SYSTEM_LIVE_PATHS, TIME_PATHS } from './sunSystemLive.js';
|
|
9
9
|
import { publishRenderedSky, sceneOf } from '../utils/renderedSky.js';
|
|
10
10
|
import { applyNodeValue, clearNodeCaches, nodesFor } from './nodeTracks.js';
|
|
11
|
+
import { setObjectEffectParam } from '../operations/objectEffects.js';
|
|
12
|
+
import { setAnimationLive, transformAnimationIndex } from './animationLive.js';
|
|
13
|
+
/** `effects.<effectId>.<param>` → [effectId, param] (null for any other path). */
|
|
14
|
+
export function effectParamPath(path) {
|
|
15
|
+
if (!path.startsWith('effects.'))
|
|
16
|
+
return null;
|
|
17
|
+
const rest = path.slice('effects.'.length);
|
|
18
|
+
const dot = rest.lastIndexOf('.');
|
|
19
|
+
return dot > 0 ? [rest.slice(0, dot), rest.slice(dot + 1)] : null;
|
|
20
|
+
}
|
|
11
21
|
// --- live-target caches (cleared when the scene changes under us) -------------
|
|
12
22
|
const objectCache = new Map();
|
|
13
23
|
const handleCache = new Map();
|
|
@@ -193,6 +203,37 @@ const applyOcean = (ctx, _state, path, value) => {
|
|
|
193
203
|
return false;
|
|
194
204
|
handle.config(path.slice('config.'.length), value);
|
|
195
205
|
};
|
|
206
|
+
/**
|
|
207
|
+
* One of an object's effects (its Effects tab): a param of a running effect — the rotation's speed,
|
|
208
|
+
* a float's height. Only effects the object already has; the effect is not replayed.
|
|
209
|
+
*/
|
|
210
|
+
const applyEffectParam = (_ctx, state, path, value) => {
|
|
211
|
+
const at = effectParamPath(path);
|
|
212
|
+
if (!at || (typeof value !== 'number' && typeof value !== 'boolean' && typeof value !== 'string'))
|
|
213
|
+
return;
|
|
214
|
+
return setObjectEffectParam(objectFor(state), at[0], at[1], value);
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* One of an object's own animations (its Animation tab): a transform row's `to`, live over its
|
|
218
|
+
* authored value. Only rows the object has — a track whose row is gone (removed, reordered into
|
|
219
|
+
* something else) does nothing and is reported once.
|
|
220
|
+
*/
|
|
221
|
+
const warnedRows = new Set();
|
|
222
|
+
const applyAnimationTo = (ctx, state, path, value) => {
|
|
223
|
+
const i = transformAnimationIndex(path);
|
|
224
|
+
if (i === null || !Array.isArray(value) || value.length !== 3)
|
|
225
|
+
return;
|
|
226
|
+
const row = ctx.getSettings(state)?.animations?.transform?.animations?.[i];
|
|
227
|
+
if (!row || !['position', 'rotation', 'scale'].includes(row.property)) {
|
|
228
|
+
const k = `${state}|${i}`;
|
|
229
|
+
if (!warnedRows.has(k)) {
|
|
230
|
+
warnedRows.add(k);
|
|
231
|
+
console.warn(`[3drise] timeline: a track drives transform animation #${i + 1} of ${state}, which is not there any more — it does nothing.`);
|
|
232
|
+
}
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
setAnimationLive(state, i, [Number(value[0]), Number(value[1]), Number(value[2])]);
|
|
236
|
+
};
|
|
196
237
|
/** Procedural terrain: its live handle — `config.*`. */
|
|
197
238
|
const applyTerrain = (ctx, _state, path, value) => {
|
|
198
239
|
if (typeof value !== 'number' && typeof value !== 'boolean' && typeof value !== 'string')
|
|
@@ -232,7 +273,27 @@ const APPLIERS = [
|
|
|
232
273
|
{ match: (_s, p) => p.startsWith('materialSettings.'), apply: applyMaterial },
|
|
233
274
|
{ match: (_s, p) => p.startsWith('edgesSettings.materialSettings.'), apply: applyEdgesMaterial },
|
|
234
275
|
{ match: (_s, p) => p.startsWith('config.'), apply: applyConfig },
|
|
276
|
+
{ match: (_s, p) => p.startsWith('effects.'), apply: applyEffectParam },
|
|
277
|
+
{ match: (_s, p) => transformAnimationIndex(p) !== null, apply: applyAnimationTo },
|
|
235
278
|
];
|
|
279
|
+
/**
|
|
280
|
+
* A live-only track stops (an object's effect param, an animation row's value — values laid over
|
|
281
|
+
* what the object runs, never in its settings): the object's own value comes back. False for any
|
|
282
|
+
* other path (those restore from the authored settings).
|
|
283
|
+
*/
|
|
284
|
+
export function releaseLive(state, path) {
|
|
285
|
+
const at = effectParamPath(path);
|
|
286
|
+
if (at) {
|
|
287
|
+
setObjectEffectParam(objectFor(state), at[0], at[1], undefined);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
const i = transformAnimationIndex(path);
|
|
291
|
+
if (i !== null) {
|
|
292
|
+
setAnimationLive(state, i, undefined);
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
236
297
|
/** Write one value. Unknown paths are ignored (the track picker never offers them). */
|
|
237
298
|
/** Write one value to the live scene. False when its target is not mounted yet. */
|
|
238
299
|
export function applyValue(ctx, state, path, value, node) {
|
|
@@ -13,4 +13,5 @@ export type { ElementSources } from './elementSettings';
|
|
|
13
13
|
export type { AnimationClip, Track as ClipTrack, Keyframe as ClipKeyframe, KeyValue as ClipKeyValue, EaseName as ClipEaseName, SequenceStep, StepClip, SequenceCue, TimelineCue, AnimationSequence as ClipSequence, SequenceDriver, SequenceDriverSettings, } from './types';
|
|
14
14
|
export { DEFAULT_DRIVER_SETTINGS } from './types';
|
|
15
15
|
export { DEFAULT_EASE as CLIP_DEFAULT_EASE, FPS_PRESETS as CLIP_FPS_PRESETS } from './types';
|
|
16
|
+
export { setAnimationLive, transformAnimationIndex } from './animationLive';
|
|
16
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/animationsV2/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC9H,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EACR,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,YAAY,EAC/G,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,IAAI,YAAY,EAAE,cAAc,EAAE,sBAAsB,GAC9H,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/animationsV2/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC5D,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC9H,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EACR,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,QAAQ,IAAI,YAAY,EAC/G,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,IAAI,YAAY,EAAE,cAAc,EAAE,sBAAsB,GAC9H,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -10,3 +10,4 @@ export { readNodeValue, NODE_TRANSFORM_PATHS, NODE_MATERIAL_KEYS } from './nodeT
|
|
|
10
10
|
export { resolveElementSettings, isEnvironmentState, ENVIRONMENT_STATES as CLIP_ENVIRONMENT_STATES } from './elementSettings.js';
|
|
11
11
|
export { DEFAULT_DRIVER_SETTINGS } from './types.js';
|
|
12
12
|
export { DEFAULT_EASE as CLIP_DEFAULT_EASE, FPS_PRESETS as CLIP_FPS_PRESETS } from './types.js';
|
|
13
|
+
export { setAnimationLive, transformAnimationIndex } from './animationLive.js';
|
|
@@ -7,6 +7,7 @@ export interface ScheduledClip {
|
|
|
7
7
|
/** Row within the step. */
|
|
8
8
|
row: number;
|
|
9
9
|
stepClip: StepClip;
|
|
10
|
+
/** The clip as it plays here — a muted step clip plays an empty copy (no tracks, no cues). */
|
|
10
11
|
clip: AnimationClip;
|
|
11
12
|
/** Sequence seconds. */
|
|
12
13
|
start: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequenceUtils.d.ts","sourceRoot":"","sources":["../../src/animationsV2/sequenceUtils.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxC,uFAAuF;IACvF,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC,CAAC;AAK1G,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,aAAa,EAAE,KAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAC/C,CAAC;AAKrC,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"sequenceUtils.d.ts","sourceRoot":"","sources":["../../src/animationsV2/sequenceUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,9 @@ export function resolveSequence(seq, clips) {
|
|
|
18
18
|
return;
|
|
19
19
|
const start = stepStart + safeDelay(stepClip.delay);
|
|
20
20
|
const end = start + Math.max(0, clip.duration) / safeSpeed(stepClip.speed);
|
|
21
|
-
|
|
21
|
+
// muted: same place and length (the step's timing is unchanged), nothing written, no cues
|
|
22
|
+
const plays = stepClip.muted ? { ...clip, tracks: [], cues: [] } : clip;
|
|
23
|
+
entries.push({ id: stepClip.id, stepIndex, row, stepClip, clip: plays, start, end });
|
|
22
24
|
stepEnd = Math.max(stepEnd, end);
|
|
23
25
|
});
|
|
24
26
|
steps.push({ start: stepStart, end: stepEnd });
|
|
@@ -66,7 +68,8 @@ export const cueSubject = (cue) => commandSubject(cueCommand(cue));
|
|
|
66
68
|
export function cueStatesAt(schedule, T) {
|
|
67
69
|
const out = new Map();
|
|
68
70
|
for (const c of schedule.cues) {
|
|
69
|
-
|
|
71
|
+
// muted: not a lane at all — a lane that was on counts as removed, so it switches off
|
|
72
|
+
if (c.cue.mode === 'fire' || c.cue.muted)
|
|
70
73
|
continue;
|
|
71
74
|
if (!out.has(c.subject))
|
|
72
75
|
out.set(c.subject, false);
|
|
@@ -80,7 +83,7 @@ export function cueStatesAt(schedule, T) {
|
|
|
80
83
|
* `wrap`: a forward loop wrapped past the end (prev → total, then 0 → now).
|
|
81
84
|
*/
|
|
82
85
|
export function firedBetween(cues, prev, now, wrapTotal) {
|
|
83
|
-
const fire = cues.filter(c => c.cue.mode === 'fire');
|
|
86
|
+
const fire = cues.filter(c => c.cue.mode === 'fire' && !c.cue.muted);
|
|
84
87
|
if (!fire.length)
|
|
85
88
|
return [];
|
|
86
89
|
if (wrapTotal !== undefined)
|
|
@@ -142,7 +145,7 @@ export function findCueConflicts(seq, clips, getAction) {
|
|
|
142
145
|
const schedule = resolveSequence(seq, clips);
|
|
143
146
|
const out = [];
|
|
144
147
|
for (const sc of schedule.cues) {
|
|
145
|
-
if (sc.cue.mode !== 'apply')
|
|
148
|
+
if (sc.cue.mode !== 'apply' || sc.cue.muted)
|
|
146
149
|
continue;
|
|
147
150
|
const cmd = cueCommand(sc.cue);
|
|
148
151
|
// an action's patches, or a Change cue's own
|
|
@@ -62,6 +62,8 @@ export interface StepClip {
|
|
|
62
62
|
delay: number;
|
|
63
63
|
/** 1 = authored speed. */
|
|
64
64
|
speed: number;
|
|
65
|
+
/** Muted: keeps its place and length in the step, but drives nothing and fires none of its cues. */
|
|
66
|
+
muted?: boolean;
|
|
65
67
|
}
|
|
66
68
|
/** Clips that start together. The step ends when its longest clip ends; then the next step starts. */
|
|
67
69
|
export interface SequenceStep {
|
|
@@ -87,6 +89,8 @@ export interface TimelineCue {
|
|
|
87
89
|
mode: 'apply' | 'revert' | 'fire';
|
|
88
90
|
/** Seconds: from the clip start, or into its step (sequences). */
|
|
89
91
|
at: number;
|
|
92
|
+
/** Muted: stays on the timeline but does nothing (a muted lane is off). The editor mutes a whole lane. */
|
|
93
|
+
muted?: boolean;
|
|
90
94
|
}
|
|
91
95
|
/** A cue anchored to a step, so retiming clips or reordering steps keeps it on its moment. */
|
|
92
96
|
export interface SequenceCue extends TimelineCue {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/animationsV2/types.ts"],"names":[],"mappings":"AAMA,wFAAwF;AACxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,QAAQ,GAChB,QAAQ,GAAG,MAAM,GACjB,YAAY,GAAG,aAAa,GAAG,eAAe,GAC9C,aAAa,GAAG,cAAc,GAAG,gBAAgB,GACjD,aAAa,GAAG,cAAc,GAAG,gBAAgB,GACjD,YAAY,GAAG,aAAa,GAAG,eAAe,GAC9C,YAAY,GAAG,aAAa,GAAG,eAAe,GAC9C,YAAY,GAAG,aAAa,GAAG,eAAe,GAC9C,gBAAgB,GAAG,eAAe,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,QAAQ,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qJAAqJ;IACrJ,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,qFAAqF;IACrF,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,uFAAuF;IACvF,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD,8FAA8F;AAC9F,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/animationsV2/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimatedObject.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedObject.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAO7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtG,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"AnimatedObject.d.ts","sourceRoot":"","sources":["../../src/components/AnimatedObject.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAO7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACtG,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,aAAa,EAAE,qBAAqB,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IACjH,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAyFvD,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -52,6 +52,8 @@ visible = true, children, parentRef, handleObjectClick, onPointerEnter, onPointe
|
|
|
52
52
|
if (!obj)
|
|
53
53
|
return;
|
|
54
54
|
baseRef.current = { position: [...position], scale: [...scale], rotation: [...rotation] };
|
|
55
|
+
// The object's authored transform: the rest a parent group's each / targets animation moves it from.
|
|
56
|
+
obj.userData.baseTransform = { position: [...position], scale: [...scale], rotation: [...rotation] };
|
|
55
57
|
targetRef.current = {
|
|
56
58
|
position: targetPosition ? [...targetPosition] : [...position],
|
|
57
59
|
scale: targetScale ? [...targetScale] : [...scale],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreatedObject.d.ts","sourceRoot":"","sources":["../../src/components/CreatedObject.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CreatedObject.d.ts","sourceRoot":"","sources":["../../src/components/CreatedObject.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAWnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,UAAU,kBAAmB,SAAQ,gBAAgB;IACjD,aAAa,EAAE,qBAAqB,CAAC;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,iBAAiB,CAAC,EAAE,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CACpH;AAKD,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAwG9C,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { useRef, useEffect, useState, useReducer, memo, useContext } from "react";
|
|
3
3
|
import { ObjectHoverContext } from "../interactions/runner.js";
|
|
4
4
|
import { ModelMaterialPassContext } from "./ModelMaterialPassContext.js";
|
|
5
|
+
import { GroupMaterialContext, coveredBy } from "./GroupMaterialContext.js";
|
|
5
6
|
import { DEFAULT_EDGES_SETTINGS } from "@3driseai/3drise-core";
|
|
6
7
|
import { useMaterialApplication } from "../hooks/useMaterialApplication.js";
|
|
7
8
|
import { useShadowApplication } from "../hooks/useShadowApplication.js";
|
|
@@ -40,7 +41,9 @@ const CreatedObject = memo(({ createdObject, children, shouldApply3driseMaterial
|
|
|
40
41
|
// Bumped when the model-level material pass lands, so per-mesh overrides
|
|
41
42
|
// (useNodeOverrides in ModelPrimitive) re-apply on top of it.
|
|
42
43
|
const [materialPass, bumpMaterialPass] = useReducer((n) => n + 1, 0);
|
|
43
|
-
|
|
44
|
+
// Inside a group whose material is on, the group's material wins; off, the object's own comes back.
|
|
45
|
+
const groupMaterial = coveredBy(createdObject, useContext(GroupMaterialContext));
|
|
46
|
+
useMaterialApplication(meshRef, groupMaterial ?? createdObject.materialSettings, shouldApply3driseMaterial, bumpMaterialPass);
|
|
44
47
|
// An object with no explicit flags takes its type's defaults (core's
|
|
45
48
|
// resolveShadowFlags): saved objects carry none, and reading them as false
|
|
46
49
|
// switched every shadow in every project off.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CreatedObjectSettings, MaterialSettings } from '@3driseai/3drise-core';
|
|
2
|
+
/**
|
|
3
|
+
* A group's material, handed down to the objects inside it.
|
|
4
|
+
*
|
|
5
|
+
* A group has no surface: like its visual effects, its material goes to the objects inside it that
|
|
6
|
+
* take one — meshes and models, any depth (core groupMaterialTargets is the same rule). It is a
|
|
7
|
+
* layer, like the model's "Apply material": while the group's `materialSettings.apply` is on, a
|
|
8
|
+
* covered child renders with the group's material instead of its own; switched off, every child
|
|
9
|
+
* goes back to its own material (its settings were never touched).
|
|
10
|
+
*
|
|
11
|
+
* targets the group's `materialSettings.objectIds` — child object ids (any depth); a chosen
|
|
12
|
+
* nested group stands for everything inside it. None = every child.
|
|
13
|
+
* nearest an inner group whose own material is on wins inside it.
|
|
14
|
+
*/
|
|
15
|
+
export interface GroupMaterial {
|
|
16
|
+
settings: MaterialSettings;
|
|
17
|
+
/** null = every object inside. */
|
|
18
|
+
targets: ReadonlySet<string> | null;
|
|
19
|
+
}
|
|
20
|
+
export declare const GroupMaterialContext: import("react").Context<GroupMaterial>;
|
|
21
|
+
/** What a group (or a parent object) hands to the objects inside it. */
|
|
22
|
+
export declare function groupMaterialFor(obj: CreatedObjectSettings, parent: GroupMaterial | null): GroupMaterial | null;
|
|
23
|
+
/** The group material this object renders with, or null (it keeps its own). */
|
|
24
|
+
export declare function coveredBy(obj: CreatedObjectSettings, ctx: GroupMaterial | null): MaterialSettings | null;
|
|
25
|
+
//# sourceMappingURL=GroupMaterialContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupMaterialContext.d.ts","sourceRoot":"","sources":["../../src/components/GroupMaterialContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErF;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,kCAAkC;IAClC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,oBAAoB,wCAA4C,CAAC;AAE9E,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAS/G;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAGxG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
import { objectTakesVisualEffects } from '@3driseai/3drise-core';
|
|
3
|
+
export const GroupMaterialContext = createContext(null);
|
|
4
|
+
/** What a group (or a parent object) hands to the objects inside it. */
|
|
5
|
+
export function groupMaterialFor(obj, parent) {
|
|
6
|
+
const own = obj.materialSettings;
|
|
7
|
+
if (obj.type === 'group' && own?.apply === true && own.materialType) {
|
|
8
|
+
const { objectIds, ...settings } = own;
|
|
9
|
+
return { settings: settings, targets: objectIds?.length ? new Set(objectIds) : null };
|
|
10
|
+
}
|
|
11
|
+
// a chosen nested group (or object) stands for everything inside it
|
|
12
|
+
if (obj.type === 'group' && parent?.targets?.has(obj.id))
|
|
13
|
+
return { settings: parent.settings, targets: null };
|
|
14
|
+
return parent;
|
|
15
|
+
}
|
|
16
|
+
/** The group material this object renders with, or null (it keeps its own). */
|
|
17
|
+
export function coveredBy(obj, ctx) {
|
|
18
|
+
if (!ctx || obj.type === 'group' || !objectTakesVisualEffects(obj))
|
|
19
|
+
return null;
|
|
20
|
+
return !ctx.targets || ctx.targets.has(obj.id) ? ctx.settings : null;
|
|
21
|
+
}
|
|
@@ -12,7 +12,7 @@ import Candle from './candle/Candle.js';
|
|
|
12
12
|
const DirectionalLightR3F = ({ config, animations, mouseMove, settings, onObjectReady, onObjectDispose }) => {
|
|
13
13
|
const lightRef = useRef(null);
|
|
14
14
|
useObjectReady(lightRef, settings, onObjectReady, onObjectDispose);
|
|
15
|
-
useLightShadow(lightRef, config.shadow);
|
|
15
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
16
16
|
// Keyframes, pointer bindings and live drags, merged onto the light.
|
|
17
17
|
useLightConfig(lightRef, lightRef, settings?.id, config, animations, mouseMove);
|
|
18
18
|
return (_jsx("directionalLight", { ref: lightRef, color: config.color || '#ffffff', intensity: config.intensity ?? 1 }));
|
|
@@ -40,7 +40,7 @@ const SpotLightR3F = ({ config, animations, mouseMove, settings, onObjectReady,
|
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
}, [scene, tx, ty, tz]);
|
|
43
|
-
useLightShadow(lightRef, config.shadow);
|
|
43
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
44
44
|
// Keyframes, pointer bindings and live drags, merged onto the light.
|
|
45
45
|
useLightConfig(lightRef, lightRef, settings?.id, config, animations, mouseMove);
|
|
46
46
|
return (_jsx("spotLight", { ref: lightRef, position: [0, 0, 0], color: config.color || '#ffffff', intensity: config.intensity ?? 1, angle: config.angle ?? Math.PI / 4, penumbra: config.penumbra ?? 0.1, decay: config.decay ?? 1, distance: config.distance ?? 0 }));
|
|
@@ -48,7 +48,7 @@ const SpotLightR3F = ({ config, animations, mouseMove, settings, onObjectReady,
|
|
|
48
48
|
const PointLightR3F = ({ config, animations, mouseMove, settings, onObjectReady, onObjectDispose }) => {
|
|
49
49
|
const lightRef = useRef(null);
|
|
50
50
|
useObjectReady(lightRef, settings, onObjectReady, onObjectDispose);
|
|
51
|
-
useLightShadow(lightRef, config.shadow);
|
|
51
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
52
52
|
// Keyframes, pointer bindings and live drags, merged onto the light.
|
|
53
53
|
useLightConfig(lightRef, lightRef, settings?.id, config, animations, mouseMove);
|
|
54
54
|
return (_jsx("pointLight", { ref: lightRef, color: config.color || '#ffffff', intensity: config.intensity ?? 1, decay: config.decay ?? 1, distance: config.distance ?? 0 }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectNode.d.ts","sourceRoot":"","sources":["../../src/components/ObjectNode.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ObjectNode.d.ts","sourceRoot":"","sources":["../../src/components/ObjectNode.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAe,qBAAqB,EAA2C,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACzI,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAiBrD,KAAK,eAAe,GAAG,gBAAgB,GAAG;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC7G,CAAC;AA4BF,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA8IzC,CAAC;AACF,eAAe,UAAU,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useMemo } from "react";
|
|
2
|
+
import { useCallback, useContext, useMemo } from "react";
|
|
3
|
+
import { GroupMaterialContext, groupMaterialFor } from "./GroupMaterialContext.js";
|
|
3
4
|
import CustomPrimitive from "./CustomPrimitive.js";
|
|
4
5
|
import CreatedObject from "./CreatedObject.js";
|
|
5
6
|
import PathRenderer from './PathRenderer.js';
|
|
@@ -46,7 +47,17 @@ const GroupWithChildren = ({ createdObject, children, onObjectReady, onObjectDis
|
|
|
46
47
|
// Generative particle objects own their shaders, like effects do.
|
|
47
48
|
const selfManagedMaterial = SELF_MANAGED_MATERIAL.has(createdObject.type)
|
|
48
49
|
|| (createdObject.type === 'particles' && isGenerativeParticlesConfig(createdObject.config));
|
|
49
|
-
|
|
50
|
+
// A group's material (Apply on) goes to the objects inside it — see GroupMaterialContext.
|
|
51
|
+
const parentMaterial = useContext(GroupMaterialContext);
|
|
52
|
+
const ms = createdObject.materialSettings;
|
|
53
|
+
const handed = useMemo(() => groupMaterialFor(createdObject, parentMaterial),
|
|
54
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
|
+
[createdObject.id, createdObject.type, ms, parentMaterial]);
|
|
56
|
+
const body = (_jsxs(CreatedObject, { createdObject: createdObject, onObjectReady: onObjectReady, onObjectDispose: onObjectDispose, handleObjectClick: handleObjectClick, shouldApply3driseMaterial: !isGroup && !selfManagedMaterial, children: [!isGroup && renderObject(createdObject, handleObjectClick), children.map(childNode => (_jsx(ObjectNode, { node: childNode, handleObjectClick: handleObjectClick, onObjectReady: onObjectReady, onObjectDispose: onObjectDispose }, childNode.objectId)))] }, createdObject.id));
|
|
57
|
+
// Always the Provider (even when it hands the parent's value on): wrapping only when a material is
|
|
58
|
+
// on would change the element type here and remount the whole subtree whenever Apply is toggled —
|
|
59
|
+
// new Object3Ds for every child (the studio's live preview kept writing to the old ones).
|
|
60
|
+
return _jsx(GroupMaterialContext.Provider, { value: handed, children: body });
|
|
50
61
|
};
|
|
51
62
|
const ObjectNode = ({ node, onObjectReady, onObjectDispose, handleObjectClick }) => {
|
|
52
63
|
const { children } = node;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectLoader.d.ts","sourceRoot":"","sources":["../../src/components/ProjectLoader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAInE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProjectLoader.d.ts","sourceRoot":"","sources":["../../src/components/ProjectLoader.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAInE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAqB7D,QAAA,MAAM,aAAa;eAlBJ,MAAM;uBACE,KAAK,CAAC,SAAS;oBAClB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI;oBACrF,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,QAAQ,KAAK,IAAI;IACtE,oHAAoH;SAC/G,OAAO;IACZ,mHAAmH;eACxG,MAAM;yBACI,MAAM,IAAI;IAC/B;;;;OAIG;mBACY,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;qCA6D7C,CAAC;AAEH,eAAe,aAAa,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { loadAssets, } from "@3driseai/3drise-core";
|
|
|
6
6
|
import { migrateObject } from '@3driseai/3drise-core';
|
|
7
7
|
import LoadingIndicator from "./LoadingIndicator.js";
|
|
8
8
|
import { useMeshController } from "../hooks/useMeshController.js";
|
|
9
|
+
import { installCdnUrls } from "../utils/cdnUrls.js";
|
|
9
10
|
const ProjectLoader = forwardRef(({ projectId, onObjectClick, onObjectHover, ui = true, uiStyles, onSceneInitialized, onSceneReady, onObjectReady, onObjectDispose, loadingIndicator = _jsx(LoadingIndicator, { text: "Loading project...", fullScreen: true, animate: true }) }, ref) => {
|
|
10
11
|
const [project, setProject] = useState(null);
|
|
11
12
|
const meshController = useMeshController();
|
|
@@ -15,6 +16,7 @@ const ProjectLoader = forwardRef(({ projectId, onObjectClick, onObjectHover, ui
|
|
|
15
16
|
}
|
|
16
17
|
}, [projectId]);
|
|
17
18
|
const loadProject = async (projectId) => {
|
|
19
|
+
installCdnUrls();
|
|
18
20
|
try {
|
|
19
21
|
const url = `${dataCenterServer}projects/${projectId}/view`;
|
|
20
22
|
const response = await fetch(url, {
|
|
@@ -45,7 +45,7 @@ const Candle = ({ id, config, animations, mouseMove, settings, onObjectReady, on
|
|
|
45
45
|
const haloRef = useRef(null);
|
|
46
46
|
const emberRef = useRef(null);
|
|
47
47
|
useObjectReady(groupRef, settings, onObjectReady, onObjectDispose);
|
|
48
|
-
useLightShadow(lightRef, config.shadow);
|
|
48
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
49
49
|
const { merged } = useLightConfig(groupRef, lightRef, id, config, animations, mouseMove);
|
|
50
50
|
const body = (config.body ?? 'pillar');
|
|
51
51
|
const bodyHeight = num(config.height, 0.14);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HarmonicShellEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/HarmonicShellEffect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mFAAmF;IACnF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,yEAAyE;IACzE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"HarmonicShellEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/HarmonicShellEffect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mFAAmF;IACnF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,yEAAyE;IACzE,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAoMD,QAAA,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA6C3D,CAAC;AACF,eAAe,mBAAmB,CAAC"}
|