@3driseai/3drise-viewer 0.1.34 → 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 +31 -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/LightObject.js +3 -3
- 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 +11 -0
- 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/operations/runtime.d.ts +9 -3
- package/dist/operations/runtime.d.ts.map +1 -1
- package/dist/operations/runtime.js +67 -19
- 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,EAA8E,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3H,OAAO,EAEL,KAAK,UAAU,EAAE,KAAK,aAAa,EAEpC,MAAM,iBAAiB,CAAC;AAkDzB,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC9C,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AACxD,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAC/F,iDAAiD;AACjD,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC;AAwBrC;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,IAAI,EAAE;IACvF,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,CAAC;CACzH,KAAK,OAAO,CAAC;AAEd,cAAM,YAAY;IAChB,OAAO,CAAC,SAAS,CAA0B;IAC3C,qDAAqD;IACrD,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAExC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAyB;IAC1C,wFAAwF;IACxF,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,cAAc,CAAwC;IAC9D,wEAAwE;IACxE,OAAO,CAAC,cAAc,CAAe;IACrC,0DAA0D;IAC1D,OAAO,CAAC,OAAO,CAA6B;IAC5C,0FAA0F;IAC1F,OAAO,CAAC,IAAI,CAA6B;IACzC,4FAA4F;IAC5F,OAAO,CAAC,OAAO,CAA6B;IAC5C,8EAA8E;IAC9E,OAAO,CAAC,IAAI,CAA+B;IAO3C,KAAK,UAAS;IACd,OAAO,CAAC,KAAK,CAA6B;IAC1C,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAG9B,qCAAqC;IACrC,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,MAAM;IAMd,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAU1C;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAUlF,kGAAkG;IAClG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAQ9E,sEAAsE;IACtE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3C,UAAU,IAAI,MAAM;IACpB,+FAA+F;IAC/F,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAIhD,eAAe,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"ClipsRuntime.d.ts","sourceRoot":"","sources":["../../src/animationsV2/ClipsRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -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);
|
|
@@ -618,6 +647,8 @@ class ClipsRuntime {
|
|
|
618
647
|
: c?.kind === 'effectClip' ? c.use?.targets ?? []
|
|
619
648
|
: c?.kind === 'change' ? (c.targets ?? []).map((t) => t?.state).filter((s) => s && !ENV.includes(s)) : []);
|
|
620
649
|
for (const sc of inst.schedule.cues) {
|
|
650
|
+
if (sc.cue.muted)
|
|
651
|
+
continue;
|
|
621
652
|
const cmd = cueCommand(sc.cue);
|
|
622
653
|
for (const id of idsOf(cmd))
|
|
623
654
|
if (id !== 'self' && !isTargetMounted(ctx, id))
|
|
@@ -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":"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,8FAA8F;IAC9F,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,CA2C3F;AAID,0BAA0B;AAC1B,eAAO,MAAM,UAAU,GAAI,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,KAAG,YAAY,GAAG,IACjB,CAAC;AAEzE,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,MAAM,CAM7D;AACD,eAAO,MAAM,UAAU,GAAI,KAAK,OAAO,CAAC,WAAW,CAAC,WAAoC,CAAC;AAEzF,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAS3I;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAMxI;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAK/G;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM7H;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAU/K;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAC;IACjB,mEAAmE;IACnE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK;IAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,SAAS,GACxF,WAAW,EAAE,CAqBf;AAED,kDAAkD;AAClD,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,MAAM,CAAW,GAAG,WAAW,CAE1H;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,CAAC,MAAM,CAAW,GAAG,WAAW,CAE9G;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtE;AAID,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,MAAM,EAAE,QAAQ,CAAC;IACjB,+BAA+B;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAuC/F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAIrF;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAMxE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAEpD;AAED,4CAA4C;AAC5C,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAkBlG"}
|
|
@@ -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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"}
|
|
@@ -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":"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"}
|
|
@@ -126,6 +126,7 @@ const frag = /* glsl */ `
|
|
|
126
126
|
uniform float uIntensity;
|
|
127
127
|
uniform float uFilmThickness;
|
|
128
128
|
uniform float uNodalLines;
|
|
129
|
+
uniform float uTint;
|
|
129
130
|
varying vec3 vNormal;
|
|
130
131
|
varying vec3 vViewDir;
|
|
131
132
|
varying float vField;
|
|
@@ -145,6 +146,9 @@ const frag = /* glsl */ `
|
|
|
145
146
|
float cosT = sqrt(max(1.0 - (1.0 - ndv * ndv) / (1.33 * 1.33), 0.0));
|
|
146
147
|
float opd = 2.0 * 1.33 * uFilmThickness * (1.0 + 0.35 * vField) * cosT;
|
|
147
148
|
vec3 film = 0.5 + 0.5 * cos(TAU * opd / vec3(650.0, 532.0, 450.0));
|
|
149
|
+
// tint: keep the film's light and dark bands, carry them in the base colour
|
|
150
|
+
float lum = dot(film, vec3(0.299, 0.587, 0.114));
|
|
151
|
+
film = mix(film, lum * uColor * 1.7 + film * 0.12, uTint);
|
|
148
152
|
|
|
149
153
|
float fres = pow(1.0 - ndv, 3.0);
|
|
150
154
|
vec3 col = uColor * 0.25 + film * (0.2 + 0.8 * fres);
|
|
@@ -177,6 +181,7 @@ function applyConfig(u, c, bound) {
|
|
|
177
181
|
u.uFilmThickness.value = c.filmThickness;
|
|
178
182
|
u.uNodalLines.value = c.nodalLines;
|
|
179
183
|
u.uDegree.value = c.degree;
|
|
184
|
+
u.uTint.value = c.tint ?? 0;
|
|
180
185
|
}
|
|
181
186
|
const HarmonicShellEffect = ({ boundingRadius, config, id, keyframes, mouseMove, onObjectReady, onObjectDispose }) => {
|
|
182
187
|
const cfg = useMemo(() => withConfigDefaults(DEFAULT_GENERATIVE_EFFECTS.harmonicShell, config), [config]);
|
|
@@ -196,6 +201,7 @@ const HarmonicShellEffect = ({ boundingRadius, config, id, keyframes, mouseMove,
|
|
|
196
201
|
uFilmThickness: { value: 380 },
|
|
197
202
|
uNodalLines: { value: 0.6 },
|
|
198
203
|
uDegree: { value: 3 },
|
|
204
|
+
uTint: { value: 0 },
|
|
199
205
|
uW: { value: new Float32Array(24) },
|
|
200
206
|
}), []);
|
|
201
207
|
const material = useMemo(() => new THREE.ShaderMaterial({ vertexShader: vert, fragmentShader: frag, uniforms, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending }), [uniforms]);
|
|
@@ -73,7 +73,7 @@ const FluorescentTube = ({ id, config, animations, mouseMove, settings, onObject
|
|
|
73
73
|
useEffect(() => { RectAreaLightUniformsLib.init(); }, []);
|
|
74
74
|
useObjectReady(groupRef, settings, onObjectReady, onObjectDispose);
|
|
75
75
|
// The shadow settings belong to the point light — the area light has no shadow.
|
|
76
|
-
useLightShadow(shadowLightRef, config.shadow);
|
|
76
|
+
useLightShadow(shadowLightRef, config.shadow, config.type);
|
|
77
77
|
const { merged } = useLightConfig(groupRef, lightRef, id, config, animations, mouseMove);
|
|
78
78
|
const tubeCount = clampInt(config.tubes, 1, 4, 1);
|
|
79
79
|
const tubeSpacing = Math.max(num(config.tubeSpacing, 0.14), 0.02);
|
|
@@ -47,7 +47,7 @@ const LedArray = ({ id, config, animations, mouseMove, settings, onObjectReady,
|
|
|
47
47
|
const glowRef = useRef(null);
|
|
48
48
|
const diffuserRef = useRef(null);
|
|
49
49
|
useObjectReady(groupRef, settings, onObjectReady, onObjectDispose);
|
|
50
|
-
useLightShadow(lightRef, config.shadow);
|
|
50
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
51
51
|
const { merged } = useLightConfig(groupRef, lightRef, id, config, animations, mouseMove);
|
|
52
52
|
const layout = (config.layout ?? 'panel');
|
|
53
53
|
const spacing = Math.max(num(config.spacing, 0.06), 0.005);
|
|
@@ -51,7 +51,7 @@ const LightBulb = ({ id, config, animations, mouseMove, settings, onObjectReady,
|
|
|
51
51
|
const groupRef = useRef(null);
|
|
52
52
|
const lightRef = useRef(null);
|
|
53
53
|
useObjectReady(groupRef, settings, onObjectReady, onObjectDispose);
|
|
54
|
-
useLightShadow(lightRef, config.shadow);
|
|
54
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
55
55
|
// Keyframes, pointer bindings and slider drags: the light's own knobs land on
|
|
56
56
|
// the light, and the merged config is what the filament, glow and halo read.
|
|
57
57
|
const { merged } = useLightConfig(groupRef, lightRef, id, config, animations, mouseMove);
|
|
@@ -53,7 +53,7 @@ const SpotBeam = ({ id, config, animations, mouseMove, settings, onObjectReady,
|
|
|
53
53
|
const beamRef = useRef(null);
|
|
54
54
|
const soloRef = useRef(null);
|
|
55
55
|
useObjectReady(groupRef, settings, onObjectReady, onObjectDispose);
|
|
56
|
-
useLightShadow(lightRef, config.shadow);
|
|
56
|
+
useLightShadow(lightRef, config.shadow, config.type);
|
|
57
57
|
const { merged } = useLightConfig(groupRef, lightRef, id, config, animations, mouseMove);
|
|
58
58
|
// --- geometry: a unit cone for the beam, a small emitter ---
|
|
59
59
|
const geometry = useMemo(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContinuousEffects.d.ts","sourceRoot":"","sources":["../../src/hooks/useContinuousEffects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useContinuousEffects.d.ts","sourceRoot":"","sources":["../../src/hooks/useContinuousEffects.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,MAAM,WAAW,2BAA2B;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACvC,eAAe,EAAE,MAAM,OAAO,CAAC;IAC/B,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC9D;AAGD,eAAO,MAAM,oBAAoB,GAEjC,gBAAgB,qBAAqB,GAAG,IAAI,EAAE,UAAS,2BAAgC,EAAE,eAAe,cAAc,KAAG,0BAkJxH,CAAC;AACF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useRef, useEffect } from "react";
|
|
2
2
|
import { animationLiveReader } from "../animationsV2/animationLive.js";
|
|
3
|
+
import ClipsRuntime from "../animationsV2/ClipsRuntime.js";
|
|
3
4
|
import { useFrame } from "@react-three/fiber";
|
|
4
5
|
import { AnimationTargetState, animateUniforms, cacheChildrenWithMaterials, handleEdgesAnimations, handleMaterialAnimations, handleMaterialEffects, handleTransformAnimations, targetRootKind } from "@3driseai/3drise-core";
|
|
5
6
|
import usePathAnimation from "./usePathAnimation.js";
|
|
@@ -115,6 +116,16 @@ objectSettings, options = {}, objectSource) => {
|
|
|
115
116
|
targets: targets ?? undefined,
|
|
116
117
|
// a timeline clip driving a row's value (live, while it runs)
|
|
117
118
|
liveTo: animationLiveReader(objectSettings.id),
|
|
119
|
+
// a clip driving this transform (the object, a child, a model's part) has full control
|
|
120
|
+
takenOver: (target, property) => {
|
|
121
|
+
const ownId = objectSettings.id;
|
|
122
|
+
if (!target)
|
|
123
|
+
return !!ownId && ClipsRuntime.takesOver(ownId, property);
|
|
124
|
+
const childId = target.userData?.id;
|
|
125
|
+
if (childId && ClipsRuntime.takesOver(childId, property))
|
|
126
|
+
return true;
|
|
127
|
+
return !!ownId && objectSettings.type === 'model' && !!target.name && ClipsRuntime.takesOver(ownId, property, target.name);
|
|
128
|
+
},
|
|
118
129
|
}, activeTransformAnimations, currentTime, hovered, delta);
|
|
119
130
|
}
|
|
120
131
|
if (hasEdgesAnimations) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RefObject } from 'react';
|
|
2
2
|
import type { DirectionalLight, PointLight, SpotLight } from "three";
|
|
3
3
|
type ShadowLight = DirectionalLight | SpotLight | PointLight;
|
|
4
|
-
export declare const useLightShadow: (lightRef: RefObject<ShadowLight | null>,
|
|
4
|
+
export declare const useLightShadow: (lightRef: RefObject<ShadowLight | null>, saved: Record<string, any> | undefined, lightType: string | undefined) => void;
|
|
5
5
|
export {};
|
|
6
6
|
//# sourceMappingURL=useLightShadow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLightShadow.d.ts","sourceRoot":"","sources":["../../src/hooks/useLightShadow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useLightShadow.d.ts","sourceRoot":"","sources":["../../src/hooks/useLightShadow.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,KAAK,WAAW,GAAG,gBAAgB,GAAG,SAAS,GAAG,UAAU,CAAC;AAG7D,eAAO,MAAM,cAAc,GAAI,UAAU,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,OAAO,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,MAAM,GAAG,SAAS,KAAG,IA4C/I,CAAC"}
|
|
@@ -9,20 +9,24 @@
|
|
|
9
9
|
// texture is created, the existing texture must be disposed and `light.shadow.map`
|
|
10
10
|
// set to null so the renderer recreates it at the new resolution.
|
|
11
11
|
//
|
|
12
|
+
// The saved shadow is laid over the light type's defaults (core resolveLightShadow),
|
|
13
|
+
// the same table the studio's Shadow tab shows: an unset `enabled` is the type's
|
|
14
|
+
// default (point-type lights: off), never a blanket "on".
|
|
15
|
+
//
|
|
12
16
|
// All known fields across the three shadow-camera kinds are applied if defined
|
|
13
|
-
// on the
|
|
17
|
+
// on the resolved shadow. Fields irrelevant to the actual light type
|
|
14
18
|
// (e.g. cameraLeft on a SpotLight's perspective camera) are simply ignored by
|
|
15
19
|
// Three.js, so it's safe to apply them defensively.
|
|
16
20
|
//
|
|
17
21
|
import { useEffect } from 'react';
|
|
18
|
-
|
|
22
|
+
import { resolveLightShadow } from '@3driseai/3drise-core';
|
|
23
|
+
export const useLightShadow = (lightRef, saved, lightType) => {
|
|
19
24
|
useEffect(() => {
|
|
20
25
|
const light = lightRef.current;
|
|
21
26
|
if (!light)
|
|
22
27
|
return;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return;
|
|
28
|
+
const shadow = resolveLightShadow(lightType, saved);
|
|
29
|
+
light.castShadow = shadow.enabled === true;
|
|
26
30
|
if (shadow.mapSize !== undefined) {
|
|
27
31
|
const previous = light.shadow.mapSize.x;
|
|
28
32
|
light.shadow.mapSize.set(shadow.mapSize, shadow.mapSize);
|
|
@@ -59,5 +63,5 @@ export const useLightShadow = (lightRef, shadow, enabledFallback = true) => {
|
|
|
59
63
|
if (shadow.focus !== undefined)
|
|
60
64
|
light.shadow.focus = shadow.focus;
|
|
61
65
|
cam.updateProjectionMatrix();
|
|
62
|
-
}, [lightRef,
|
|
66
|
+
}, [lightRef, saved, lightType]);
|
|
63
67
|
};
|
|
@@ -93,9 +93,15 @@ export declare const isWarmable: (def: OperationDefinition | undefined) => def i
|
|
|
93
93
|
/**
|
|
94
94
|
* Warm an operation on these targets: build and compile everything its first real play
|
|
95
95
|
* needs — shaders (in the background), and the CPU work it caches (surface samples,
|
|
96
|
-
* geometry) — showing nothing, then take it off again. Queued, one at a time; each
|
|
97
|
-
* (operation,
|
|
98
|
-
*
|
|
96
|
+
* geometry) — showing nothing, then take it off again. Queued, one job at a time; each
|
|
97
|
+
* (operation, its shaders, parameters) once. Targets with no meshes yet (a model still
|
|
98
|
+
* loading) are skipped and warmed when it has landed.
|
|
99
|
+
*
|
|
100
|
+
* A group's members are warmed one per programKey: members that would build the same
|
|
101
|
+
* shaders share one warm. The others do their own CPU prep (surface samples) at their first
|
|
102
|
+
* play — a few ms each for a primitive — instead of all of it under the loading cover.
|
|
103
|
+
* Within a job the chosen roots are applied together and taken off together (one wait,
|
|
104
|
+
* not one per root): it is the same operation on different objects.
|
|
99
105
|
*/
|
|
100
106
|
export declare function warmEffectOn(def: OperationDefinition, targets: Object3D[], params: OperationParams, self?: Object3D | null): Promise<void>;
|
|
101
107
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/operations/runtime.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/operations/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -387,12 +387,54 @@ function warmRoots(t) {
|
|
|
387
387
|
});
|
|
388
388
|
return out;
|
|
389
389
|
}
|
|
390
|
+
// Material properties that pick a different shader program (three's program cache key, roughly).
|
|
391
|
+
const PROGRAM_TEXTURES = [
|
|
392
|
+
'map', 'normalMap', 'roughnessMap', 'metalnessMap', 'emissiveMap', 'aoMap', 'envMap', 'alphaMap', 'bumpMap',
|
|
393
|
+
'displacementMap', 'lightMap', 'specularMap', 'clearcoatMap', 'clearcoatNormalMap', 'clearcoatRoughnessMap',
|
|
394
|
+
'transmissionMap', 'thicknessMap', 'sheenColorMap', 'sheenRoughnessMap', 'iridescenceMap', 'iridescenceThicknessMap',
|
|
395
|
+
'anisotropyMap', 'specularIntensityMap', 'specularColorMap', 'gradientMap', 'matcap',
|
|
396
|
+
];
|
|
397
|
+
const PROGRAM_FLAGS = ['vertexColors', 'flatShading', 'wireframe', 'transparent', 'fog', 'toneMapped', 'dithering', 'premultipliedAlpha'];
|
|
398
|
+
const PROGRAM_AMOUNTS = ['clearcoat', 'transmission', 'sheen', 'iridescence', 'anisotropy', 'dispersion', 'alphaTest', 'alphaHash'];
|
|
399
|
+
/**
|
|
400
|
+
* What decides the shaders an effect builds on a primitive object: its meshes' materials and
|
|
401
|
+
* geometry layout. Two primitives with the same key get the same programs from the same effect,
|
|
402
|
+
* so a group's 90 boxes and cylinders are warmed once per key, not once each. Anything that
|
|
403
|
+
* isn't a primitive (a model, text, …) is its own key: warmed on its own, as before.
|
|
404
|
+
*/
|
|
405
|
+
function programKey(t) {
|
|
406
|
+
if (t.userData?.objectType !== 'mesh')
|
|
407
|
+
return `own:${t.uuid}`;
|
|
408
|
+
const parts = [];
|
|
409
|
+
t.traverse((c) => {
|
|
410
|
+
if (!c.isMesh || c.userData?.__opFxHelper)
|
|
411
|
+
return;
|
|
412
|
+
const g = c.geometry;
|
|
413
|
+
const geo = g ? `${Object.keys(g.attributes ?? {}).sort().join('+')}${g.index ? '|i' : ''}${Object.keys(g.morphAttributes ?? {}).length ? '|m' : ''}` : '';
|
|
414
|
+
const mesh = `${c.isSkinnedMesh ? 's' : ''}${c.isInstancedMesh ? 'n' : ''}${c.receiveShadow ? 'r' : ''}${c.castShadow ? 'c' : ''}`;
|
|
415
|
+
const mats = Array.isArray(c.material) ? c.material : c.material ? [c.material] : [];
|
|
416
|
+
for (const m of mats) {
|
|
417
|
+
const tex = PROGRAM_TEXTURES.filter(k => m[k]).join(',');
|
|
418
|
+
const flags = PROGRAM_FLAGS.filter(k => m[k]).join(',');
|
|
419
|
+
const amounts = PROGRAM_AMOUNTS.filter(k => Number(m[k]) > 0).join(',');
|
|
420
|
+
const custom = typeof m.customProgramCacheKey === 'function' ? m.customProgramCacheKey() : '';
|
|
421
|
+
parts.push([m.type, m.side, tex, flags, amounts, JSON.stringify(m.defines ?? null), custom, geo, mesh].join(';'));
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
return parts.sort().join('/');
|
|
425
|
+
}
|
|
390
426
|
/**
|
|
391
427
|
* Warm an operation on these targets: build and compile everything its first real play
|
|
392
428
|
* needs — shaders (in the background), and the CPU work it caches (surface samples,
|
|
393
|
-
* geometry) — showing nothing, then take it off again. Queued, one at a time; each
|
|
394
|
-
* (operation,
|
|
395
|
-
*
|
|
429
|
+
* geometry) — showing nothing, then take it off again. Queued, one job at a time; each
|
|
430
|
+
* (operation, its shaders, parameters) once. Targets with no meshes yet (a model still
|
|
431
|
+
* loading) are skipped and warmed when it has landed.
|
|
432
|
+
*
|
|
433
|
+
* A group's members are warmed one per programKey: members that would build the same
|
|
434
|
+
* shaders share one warm. The others do their own CPU prep (surface samples) at their first
|
|
435
|
+
* play — a few ms each for a primitive — instead of all of it under the loading cover.
|
|
436
|
+
* Within a job the chosen roots are applied together and taken off together (one wait,
|
|
437
|
+
* not one per root): it is the same operation on different objects.
|
|
396
438
|
*/
|
|
397
439
|
export function warmEffectOn(def, targets, params, self) {
|
|
398
440
|
if (!isWarmable(def))
|
|
@@ -403,32 +445,38 @@ export function warmEffectOn(def, targets, params, self) {
|
|
|
403
445
|
if (!ctx)
|
|
404
446
|
return;
|
|
405
447
|
const roots = targets.flatMap(warmRoots);
|
|
448
|
+
const picked = [];
|
|
406
449
|
for (const t of def.multi ? roots : roots.slice(0, 1)) {
|
|
407
450
|
if (!t.parent)
|
|
408
451
|
continue; // left the scene meanwhile
|
|
409
452
|
const { count, sig } = meshSignature(t);
|
|
410
453
|
if (!count)
|
|
411
454
|
continue; // nothing to warm yet (a model still loading)
|
|
412
|
-
const
|
|
455
|
+
const pk = programKey(t);
|
|
456
|
+
const k = `${def.value}:${pk.startsWith('own:') ? `${pk}:${sig}` : pk}:${paramsKey}`;
|
|
413
457
|
if (warmed.has(k) || isOperationOn(def.value, t))
|
|
414
458
|
continue;
|
|
415
459
|
warmed.add(k);
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
await finished(def.revert(t, { ...params, duration: 0.001 }, ctx), { duration: 0 });
|
|
460
|
+
picked.push(t);
|
|
461
|
+
}
|
|
462
|
+
if (!picked.length)
|
|
463
|
+
return;
|
|
464
|
+
const t0 = performance.now();
|
|
465
|
+
// a warm-only run: stages and compiles everything, animates nothing…
|
|
466
|
+
const runs = [];
|
|
467
|
+
warmMode.on = true;
|
|
468
|
+
try {
|
|
469
|
+
for (const t of picked)
|
|
470
|
+
runs.push(def.apply(t, params, ctx));
|
|
471
|
+
}
|
|
472
|
+
finally {
|
|
473
|
+
warmMode.on = false;
|
|
431
474
|
}
|
|
475
|
+
noteWork(`warm ${def.value}`, performance.now() - t0);
|
|
476
|
+
await Promise.all(runs.map(r => finished(r, { duration: 0 })));
|
|
477
|
+
// …then quietly take it off again, unless something started it meanwhile
|
|
478
|
+
await Promise.all(picked.filter(t => !isOperationOn(def.value, t))
|
|
479
|
+
.map(t => finished(def.revert(t, { ...params, duration: 0.001 }, ctx), { duration: 0 })));
|
|
432
480
|
};
|
|
433
481
|
warmQueue = warmQueue.then(job, job);
|
|
434
482
|
return warmQueue;
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
import { useSyncExternalStore } from 'react';
|
|
25
25
|
const TIMEOUT_MS = 15000;
|
|
26
26
|
const COMPILE_TIMEOUT_MS = 5000;
|
|
27
|
-
const BAKE_TIMEOUT_MS =
|
|
27
|
+
const BAKE_TIMEOUT_MS = 5000;
|
|
28
28
|
const log = (...a) => console.info('[3drise] scene', ...a);
|
|
29
29
|
class SceneReadiness {
|
|
30
30
|
status = 'idle';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { toCdn } from '@3driseai/3drise-core';
|
|
2
|
+
export { toCdn };
|
|
3
|
+
/**
|
|
4
|
+
* Route three.js asset loads through the CDN. DefaultLoadingManager covers every loader
|
|
5
|
+
* created without its own manager (viewer, useLoader/useTexture); core's manager covers
|
|
6
|
+
* loadAssets/loadGLTF. Idempotent. Called from ProjectLoader rather than at module load
|
|
7
|
+
* so bundlers can't tree-shake it away.
|
|
8
|
+
*/
|
|
9
|
+
export declare const installCdnUrls: () => void;
|
|
10
|
+
//# sourceMappingURL=cdnUrls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdnUrls.d.ts","sourceRoot":"","sources":["../../src/utils/cdnUrls.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGpF,OAAO,EAAE,KAAK,EAAE,CAAC;AAIjB;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAO,IAKjC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DefaultLoadingManager } from 'three';
|
|
2
|
+
import { loadingManager as coreLoadingManager, toCdn } from '@3driseai/3drise-core';
|
|
3
|
+
// toCdn lives in core (utils/cdnUrls.ts) — the one place the origin/CDN hosts are defined.
|
|
4
|
+
export { toCdn };
|
|
5
|
+
let installed = false;
|
|
6
|
+
/**
|
|
7
|
+
* Route three.js asset loads through the CDN. DefaultLoadingManager covers every loader
|
|
8
|
+
* created without its own manager (viewer, useLoader/useTexture); core's manager covers
|
|
9
|
+
* loadAssets/loadGLTF. Idempotent. Called from ProjectLoader rather than at module load
|
|
10
|
+
* so bundlers can't tree-shake it away.
|
|
11
|
+
*/
|
|
12
|
+
export const installCdnUrls = () => {
|
|
13
|
+
if (installed)
|
|
14
|
+
return;
|
|
15
|
+
installed = true;
|
|
16
|
+
DefaultLoadingManager.setURLModifier(toCdn);
|
|
17
|
+
coreLoadingManager.setURLModifier(toCdn);
|
|
18
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@3driseai/3drise-viewer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.35",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,6 +39,6 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@3driseai/3drise-common": "^1.0.1",
|
|
42
|
-
"@3driseai/3drise-core": "^1.0.
|
|
42
|
+
"@3driseai/3drise-core": "^1.0.27"
|
|
43
43
|
}
|
|
44
44
|
}
|