@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.
Files changed (64) hide show
  1. package/dist/animationsV2/ClipsRuntime.d.ts +9 -0
  2. package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
  3. package/dist/animationsV2/ClipsRuntime.js +42 -1
  4. package/dist/animationsV2/animationLive.d.ts +7 -0
  5. package/dist/animationsV2/animationLive.d.ts.map +1 -0
  6. package/dist/animationsV2/animationLive.js +26 -0
  7. package/dist/animationsV2/appliers.d.ts +8 -0
  8. package/dist/animationsV2/appliers.d.ts.map +1 -1
  9. package/dist/animationsV2/appliers.js +61 -0
  10. package/dist/animationsV2/index.d.ts +1 -0
  11. package/dist/animationsV2/index.d.ts.map +1 -1
  12. package/dist/animationsV2/index.js +1 -0
  13. package/dist/animationsV2/sequenceUtils.d.ts +1 -0
  14. package/dist/animationsV2/sequenceUtils.d.ts.map +1 -1
  15. package/dist/animationsV2/sequenceUtils.js +7 -4
  16. package/dist/animationsV2/types.d.ts +4 -0
  17. package/dist/animationsV2/types.d.ts.map +1 -1
  18. package/dist/components/AnimatedObject.d.ts.map +1 -1
  19. package/dist/components/AnimatedObject.js +2 -0
  20. package/dist/components/CreatedObject.d.ts.map +1 -1
  21. package/dist/components/CreatedObject.js +4 -1
  22. package/dist/components/GroupMaterialContext.d.ts +25 -0
  23. package/dist/components/GroupMaterialContext.d.ts.map +1 -0
  24. package/dist/components/GroupMaterialContext.js +21 -0
  25. package/dist/components/LightObject.js +3 -3
  26. package/dist/components/ObjectNode.d.ts.map +1 -1
  27. package/dist/components/ObjectNode.js +13 -2
  28. package/dist/components/ProjectLoader.d.ts.map +1 -1
  29. package/dist/components/ProjectLoader.js +2 -0
  30. package/dist/components/candle/Candle.js +1 -1
  31. package/dist/components/effects/HarmonicShellEffect.d.ts.map +1 -1
  32. package/dist/components/effects/HarmonicShellEffect.js +6 -0
  33. package/dist/components/fluorescentTube/FluorescentTube.js +1 -1
  34. package/dist/components/ledArray/LedArray.js +1 -1
  35. package/dist/components/lightBulb/LightBulb.js +1 -1
  36. package/dist/components/spotBeam/SpotBeam.js +1 -1
  37. package/dist/hooks/useContinuousEffects.d.ts.map +1 -1
  38. package/dist/hooks/useContinuousEffects.js +34 -2
  39. package/dist/hooks/useLightShadow.d.ts +1 -1
  40. package/dist/hooks/useLightShadow.d.ts.map +1 -1
  41. package/dist/hooks/useLightShadow.js +10 -6
  42. package/dist/hooks/useMaterialApplication.d.ts.map +1 -1
  43. package/dist/hooks/useMaterialApplication.js +2 -1
  44. package/dist/hooks/useMaterialUniforms.d.ts +2 -8
  45. package/dist/hooks/useMaterialUniforms.d.ts.map +1 -1
  46. package/dist/hooks/useMaterialUniforms.js +18 -6
  47. package/dist/operations/catalogue/physicalHeld.d.ts.map +1 -1
  48. package/dist/operations/catalogue/physicalHeld.js +6 -0
  49. package/dist/operations/index.d.ts +1 -1
  50. package/dist/operations/index.d.ts.map +1 -1
  51. package/dist/operations/index.js +1 -1
  52. package/dist/operations/objectEffects.d.ts +15 -1
  53. package/dist/operations/objectEffects.d.ts.map +1 -1
  54. package/dist/operations/objectEffects.js +49 -1
  55. package/dist/operations/runtime.d.ts +9 -3
  56. package/dist/operations/runtime.d.ts.map +1 -1
  57. package/dist/operations/runtime.js +67 -19
  58. package/dist/operations/types.d.ts +5 -0
  59. package/dist/operations/types.d.ts.map +1 -1
  60. package/dist/triggers/readiness.js +1 -1
  61. package/dist/utils/cdnUrls.d.ts +10 -0
  62. package/dist/utils/cdnUrls.d.ts.map +1 -0
  63. package/dist/utils/cdnUrls.js +18 -0
  64. package/package.json +2 -2
@@ -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":"AAGA,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,0BA0HxH,CAAC;AACF,eAAe,oBAAoB,CAAC"}
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,6 +1,8 @@
1
1
  import { useRef, useEffect } from "react";
2
+ import { animationLiveReader } from "../animationsV2/animationLive.js";
3
+ import ClipsRuntime from "../animationsV2/ClipsRuntime.js";
2
4
  import { useFrame } from "@react-three/fiber";
3
- import { animateUniforms, cacheChildrenWithMaterials, handleEdgesAnimations, handleMaterialAnimations, handleMaterialEffects, handleTransformAnimations } from "@3driseai/3drise-core";
5
+ import { AnimationTargetState, animateUniforms, cacheChildrenWithMaterials, handleEdgesAnimations, handleMaterialAnimations, handleMaterialEffects, handleTransformAnimations, targetRootKind } from "@3driseai/3drise-core";
4
6
  import usePathAnimation from "./usePathAnimation.js";
5
7
  import { resolveObject3D } from "../utils/resolveObject3D.js";
6
8
  export const useContinuousEffects = (
@@ -19,6 +21,9 @@ objectSettings, options = {}, objectSource) => {
19
21
  const startValuesRef = useRef({});
20
22
  // Cache start values for edges animations
21
23
  const edgesStartValuesRef = useRef({});
24
+ // Groups / models: rows scoped each / targets (core animationTargets.ts) — one state per object.
25
+ const targetsRef = useRef(null);
26
+ useEffect(() => () => { targetsRef.current?.dispose(); targetsRef.current = null; }, []);
22
27
  // Transform keyframes. Effects that move the object (float, sway, spin…) are object
23
28
  // effects now (CreatedObject.effects, the operations catalogue) and ride on top of these.
24
29
  const transformAnimations = objectSettings?.animations?.transform?.animations || [];
@@ -74,8 +79,15 @@ objectSettings, options = {}, objectSource) => {
74
79
  }, [enabled, objectSettings?.animations?.transform?.animations, objectSource, startPathAnimation, stopPathAnimation]);
75
80
  useFrame((state, delta) => {
76
81
  const object = resolveObject3D(objectSource);
77
- if (!enabled || !object || !objectSettings)
82
+ if (!enabled || !object || !objectSettings) {
83
+ // Off: the parts the rows moved go back to their rest.
84
+ if (targetsRef.current) {
85
+ targetsRef.current.dispose();
86
+ targetsRef.current = null;
87
+ lastObjectRef.current = null;
88
+ }
78
89
  return;
90
+ }
79
91
  // Cache the object's materials the first frame we actually see it, and
80
92
  // again if the caller swaps the object underneath us.
81
93
  if (object !== lastObjectRef.current) {
@@ -83,7 +95,11 @@ objectSettings, options = {}, objectSource) => {
83
95
  childrenWithMaterialsRef.current = cacheChildrenWithMaterials(object);
84
96
  startValuesRef.current = {};
85
97
  edgesStartValuesRef.current = {};
98
+ targetsRef.current?.dispose();
99
+ targetsRef.current = targetRootKind(object) ? new AnimationTargetState(object) : null;
86
100
  }
101
+ const targets = targetsRef.current;
102
+ targets?.beginFrame();
87
103
  const time = state.clock.getElapsedTime();
88
104
  const mouse = state.pointer;
89
105
  const currentTime = Date.now();
@@ -97,6 +113,19 @@ objectSettings, options = {}, objectSource) => {
97
113
  object,
98
114
  meshSettings: objectSettings.meshSettings || {},
99
115
  pathIsActive,
116
+ targets: targets ?? undefined,
117
+ // a timeline clip driving a row's value (live, while it runs)
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
+ },
100
129
  }, activeTransformAnimations, currentTime, hovered, delta);
101
130
  }
102
131
  if (hasEdgesAnimations) {
@@ -109,6 +138,7 @@ objectSettings, options = {}, objectSource) => {
109
138
  object,
110
139
  materialSettings: objectSettings.materialSettings || {},
111
140
  startValuesCache: startValuesRef.current,
141
+ targets: targets ?? undefined,
112
142
  }, activeMaterialAnimations, currentTime, hovered);
113
143
  }
114
144
  // Handle material effects (color effects)
@@ -116,6 +146,8 @@ objectSettings, options = {}, objectSource) => {
116
146
  handleMaterialEffects(object, enabledMaterialEffects, time, delta, effectStateRef, applyToChildren);
117
147
  }
118
148
  }
149
+ // Targets the rows stopped driving go back to their rest.
150
+ targets?.endFrame();
119
151
  animateUniforms(childrenWithMaterialsRef.current, time * speed, mouse, state.camera.position);
120
152
  });
121
153
  return {
@@ -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>, shadow: Record<string, any> | undefined, enabledFallback?: boolean) => void;
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":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrE,KAAK,WAAW,GAAG,gBAAgB,GAAG,SAAS,GAAG,UAAU,CAAC;AAG7D,eAAO,MAAM,cAAc,GAAI,UAAU,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,kBAAiB,OAAc,KAAG,IA6ClJ,CAAC"}
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 passed shadow object. Fields irrelevant to the actual light type
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
- export const useLightShadow = (lightRef, shadow, enabledFallback = true) => {
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
- light.castShadow = shadow?.enabled ?? enabledFallback;
24
- if (!shadow)
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, shadow]);
66
+ }, [lightRef, saved, lightType]);
63
67
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useMaterialApplication.d.ts","sourceRoot":"","sources":["../../src/hooks/useMaterialApplication.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,sBAAsB,GAAI,QAAQ,cAAc,EAAE,kBAAkB,gBAAgB,EAAE,4BAA4B,OAAO,EAAE,YAAY,MAAM,IAAI,KAAG,IAwIhK,CAAC"}
1
+ {"version":3,"file":"useMaterialApplication.d.ts","sourceRoot":"","sources":["../../src/hooks/useMaterialApplication.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,sBAAsB,GAAI,QAAQ,cAAc,EAAE,kBAAkB,gBAAgB,EAAE,4BAA4B,OAAO,EAAE,YAAY,MAAM,IAAI,KAAG,IAyIhK,CAAC"}
@@ -96,11 +96,12 @@ export const useMaterialApplication = (source, materialSettings, shouldApply3dri
96
96
  onApplied?.();
97
97
  return;
98
98
  }
99
+ // Stops at child scene objects: they apply their own material.
99
100
  traverseSkippingEdgesAndEffects(obj, true, (child) => {
100
101
  if (child && child.material) {
101
102
  applyMaterialToChild(child, variant, resolvedSettings);
102
103
  }
103
- });
104
+ }, true);
104
105
  }
105
106
  // traverseSkippingEdges(originObject!, true, (child: any) => {
106
107
  // if (child && child.material) {
@@ -1,14 +1,8 @@
1
1
  import type { Material, Object3D } from "three";
2
2
  /**
3
- * Hook for direct material manipulation on a scene object ref.
4
- *
5
- * Usage pattern (like SkyControllerUi):
6
- * - On slider drag → updateProperty(key, value) — instant visual feedback, no Redux
7
- * - On slider end → updateProperty(key, value) + dispatch to Redux
8
- * - On color change → updateColor(key, hex) + dispatch to Redux
9
- * - On variant change → changeMaterial(variant, settings) + dispatch to Redux
3
+ * `object` may be several objects (a group's Material tab edits the children it applies to).
10
4
  */
11
- export declare function useMaterialUniforms(object: Object3D | null | undefined): {
5
+ export declare function useMaterialUniforms(object: Object3D | Object3D[] | null | undefined): {
12
6
  getMaterial: () => Material | null;
13
7
  updateProperty: (key: string, value: any) => void;
14
8
  updateColor: (key: string, hexValue: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useMaterialUniforms.d.ts","sourceRoot":"","sources":["../../src/hooks/useMaterialUniforms.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEhD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG;IAClE,WAAW,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAC5E,CAoFJ"}
1
+ {"version":3,"file":"useMaterialUniforms.d.ts","sourceRoot":"","sources":["../../src/hooks/useMaterialUniforms.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAmBhD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG;IAC/E,WAAW,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAC5E,CAoFJ"}
@@ -9,6 +9,18 @@ import { applySingleProperty, applyColorProperty, createAndApplyMaterial, MATERI
9
9
  * - On color change → updateColor(key, hex) + dispatch to Redux
10
10
  * - On variant change → changeMaterial(variant, settings) + dispatch to Redux
11
11
  */
12
+ /** Every material-bearing node of the object(s) — never inside child scene objects (they have their own material). */
13
+ function eachNode(object, cb) {
14
+ if (!object)
15
+ return;
16
+ for (const root of Array.isArray(object) ? object : [object]) {
17
+ if (root)
18
+ traverseSkippingEdgesAndEffects(root, true, cb, true);
19
+ }
20
+ }
21
+ /**
22
+ * `object` may be several objects (a group's Material tab edits the children it applies to).
23
+ */
12
24
  export function useMaterialUniforms(object) {
13
25
  /**
14
26
  * Get the material from the first non-edges child mesh that has one.
@@ -16,10 +28,10 @@ export function useMaterialUniforms(object) {
16
28
  const getMaterial = useCallback(() => {
17
29
  if (!object)
18
30
  return null;
19
- if (object.material)
31
+ if (!Array.isArray(object) && object.material)
20
32
  return object.material;
21
33
  let found = null;
22
- traverseSkippingEdgesAndEffects(object, true, (child) => {
34
+ eachNode(object, (child) => {
23
35
  if (!found && child.material) {
24
36
  found = child.material;
25
37
  }
@@ -33,7 +45,7 @@ export function useMaterialUniforms(object) {
33
45
  const updateProperty = useCallback((key, value) => {
34
46
  if (!object)
35
47
  return;
36
- traverseSkippingEdgesAndEffects(object, true, (child) => {
48
+ eachNode(object, (child) => {
37
49
  if (child.material) {
38
50
  applySingleProperty(child.material, key, value);
39
51
  }
@@ -45,7 +57,7 @@ export function useMaterialUniforms(object) {
45
57
  const updateColor = useCallback((key, hexValue) => {
46
58
  if (!object)
47
59
  return;
48
- traverseSkippingEdgesAndEffects(object, true, (child) => {
60
+ eachNode(object, (child) => {
49
61
  if (child.material) {
50
62
  applyColorProperty(child.material, key, hexValue);
51
63
  }
@@ -58,7 +70,7 @@ export function useMaterialUniforms(object) {
58
70
  const applyAllSettings = useCallback((settings) => {
59
71
  if (!object)
60
72
  return;
61
- traverseSkippingEdgesAndEffects(object, true, (child) => {
73
+ eachNode(object, (child) => {
62
74
  if (child.material) {
63
75
  MaterialRegistryAPI.applySettings(child.material, settings);
64
76
  }
@@ -71,7 +83,7 @@ export function useMaterialUniforms(object) {
71
83
  const changeMaterial = useCallback((variant, settings) => {
72
84
  if (!object)
73
85
  return;
74
- traverseSkippingEdgesAndEffects(object, true, (child) => {
86
+ eachNode(object, (child) => {
75
87
  if (child.material) {
76
88
  const oldInstance = child.userData[MATERIAL_INSTANCE_KEY];
77
89
  if (oldInstance) {
@@ -1 +1 @@
1
- {"version":3,"file":"physicalHeld.d.ts","sourceRoot":"","sources":["../../../src/operations/catalogue/physicalHeld.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAqB,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,6CAA6C;IAC7C,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnB,gEAAgE;IAChE,CAAC,EAAE,eAAe,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,GAAG,EAAE,CAAC,CAAC;IACP,oCAAoC;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,kFAAkF;IAClF,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC;IACjD,oHAAoH;IACpH,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,qDAAqD;IACrD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACtC;AAED,gCAAgC;AAChC,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAgL,CAAC;AAEtP,gGAAgG;AAChG,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,WAAgD,CAAC;AAE9F,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAmD9E"}
1
+ {"version":3,"file":"physicalHeld.d.ts","sourceRoot":"","sources":["../../../src/operations/catalogue/physicalHeld.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAqB,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,6CAA6C;IAC7C,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnB,gEAAgE;IAChE,CAAC,EAAE,eAAe,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,GAAG,EAAE,CAAC,CAAC;IACP,oCAAoC;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,kFAAkF;IAClF,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC3C,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC;IACjD,oHAAoH;IACpH,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,qDAAqD;IACrD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;CACtC;AAED,gCAAgC;AAChC,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,kBAAkB,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAgL,CAAC;AAEtP,gGAAgG;AAChG,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,WAAgD,CAAC;AAE9F,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAwD9E"}
@@ -62,6 +62,12 @@ export function heldPhysical(spec) {
62
62
  st.out = false;
63
63
  return run(target, st, 1, easeTime(p));
64
64
  },
65
+ // a motion reads its params every frame: a new speed / height just takes over
66
+ live(target, p) {
67
+ const st = target.userData[KEY];
68
+ if (st)
69
+ st.p = { ...p, __backward: st.p.__backward };
70
+ },
65
71
  revert(target, p) {
66
72
  const st = target.userData[KEY];
67
73
  if (!st)
@@ -5,7 +5,7 @@ export { bakeProject, collectBakeJobs, setBakeSource, type BakeSource, type Bake
5
5
  export { installStallLog, stallLogEnabled } from '../utils/stallLog';
6
6
  export { runEffect, runEffectClip, setEffectClipTemplates, getEffectClipTemplate, effectClipFromAsset, EFFECT_CLIP_ASSET, applyOperation, revertOperation, runOf, isOperationOn, resolveEffectTargets, runActionEffects, previewEffect, previewEffects, isPreviewing, prewarmEffect, areActionEffectsOn, subscribeActionEffects, registerOperationTools, } from './runtime';
7
7
  export { useOperationsRuntime } from './useOperationsRuntime';
8
- export { ObjectEffectsController, runningObjectEffects, objectEffectParams, isObjectOperation, surfaceSignature, playObjectEffect, playbackOf, clipFollowsVisibility, setObjectEffectsVisible, currentEffectStep } from './objectEffects';
8
+ export { ObjectEffectsController, runningObjectEffects, objectEffectParams, isObjectOperation, surfaceSignature, playObjectEffect, setObjectEffectParam, playbackOf, clipFollowsVisibility, setObjectEffectsVisible, currentEffectStep } from './objectEffects';
9
9
  export { useObjectEffectLayers } from './useObjectEffectLayers';
10
10
  export { usePresentedVisibility } from './usePresentedVisibility';
11
11
  export { captureFrameImage } from './clipPreview';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EACH,SAAS,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAC5L,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,GACnJ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1O,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EACH,SAAS,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAC5L,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,GACnJ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChQ,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -5,7 +5,7 @@ export { bakeProject, collectBakeJobs, setBakeSource } from './bake.js';
5
5
  export { installStallLog, stallLogEnabled } from '../utils/stallLog.js';
6
6
  export { runEffect, runEffectClip, setEffectClipTemplates, getEffectClipTemplate, effectClipFromAsset, EFFECT_CLIP_ASSET, applyOperation, revertOperation, runOf, isOperationOn, resolveEffectTargets, runActionEffects, previewEffect, previewEffects, isPreviewing, prewarmEffect, areActionEffectsOn, subscribeActionEffects, registerOperationTools, } from './runtime.js';
7
7
  export { useOperationsRuntime } from './useOperationsRuntime.js';
8
- export { ObjectEffectsController, runningObjectEffects, objectEffectParams, isObjectOperation, surfaceSignature, playObjectEffect, playbackOf, clipFollowsVisibility, setObjectEffectsVisible, currentEffectStep } from './objectEffects.js';
8
+ export { ObjectEffectsController, runningObjectEffects, objectEffectParams, isObjectOperation, surfaceSignature, playObjectEffect, setObjectEffectParam, playbackOf, clipFollowsVisibility, setObjectEffectsVisible, currentEffectStep } from './objectEffects.js';
9
9
  export { useObjectEffectLayers } from './useObjectEffectLayers.js';
10
10
  export { usePresentedVisibility } from './usePresentedVisibility.js';
11
11
  export { captureFrameImage } from './clipPreview.js';
@@ -1,5 +1,5 @@
1
1
  import type { Object3D } from 'three';
2
- import type { EffectPlayback, EffectSpread, EffectStep, EffectSteps, ObjectEffect } from '@3driseai/3drise-core';
2
+ import type { EffectPlayback, EffectSpread, EffectStep, EffectSteps, ObjectEffect, OperationParamValue } from '@3driseai/3drise-core';
3
3
  import type { OperationDefinition, OperationParams } from './types';
4
4
  /** An operation can be an object effect (one-shots too: they have no way back, and play with loop). */
5
5
  export declare const isObjectOperation: (def: OperationDefinition | undefined) => def is OperationDefinition;
@@ -17,6 +17,12 @@ export declare const objectEffectParams: (def: OperationDefinition, effect: Pick
17
17
  export declare const playbackOf: (effect: Pick<ObjectEffect, "playback">) => Required<EffectPlayback>;
18
18
  /** An object's effects controller; `create` makes one for an object that has no effects of its own yet. */
19
19
  export declare function objectEffectsControllerFor(root: Object3D, create?: boolean): ObjectEffectsController | undefined;
20
+ /**
21
+ * A timeline track on one of an object's effects' params (`effects.<effectId>.<param>`): set it on
22
+ * the running effect (undefined = back to the effect's own). False when the object has no controller
23
+ * or no such effect yet (a model still loading).
24
+ */
25
+ export declare function setObjectEffectParam(root: Object3D | null | undefined, effectId: string, key: string, value: OperationParamValue | undefined): boolean;
20
26
  /** The step of an object's effect steps that is on now (-1: none) — for the editor. */
21
27
  export declare function currentEffectStep(root: Object3D | null | undefined): number;
22
28
  /** An object's own effect clip follows its visibility (`visible`) and has an effect that is on. */
@@ -76,6 +82,8 @@ export declare class ObjectEffectsController {
76
82
  private spread;
77
83
  /** Added effects that follow visibility: a group's effects on this child, when the group's follow it. */
78
84
  private addedFollows;
85
+ /** Timeline-driven params (effect id → param → value), laid over the row's own while a clip drives them. */
86
+ private liveParams;
79
87
  constructor(root: Object3D);
80
88
  /** The object's targets for an effect: the object, or its named nodes. */
81
89
  private targetsOf;
@@ -176,6 +184,12 @@ export declare class ObjectEffectsController {
176
184
  /** Loop / yoyo / reverse, sequenced from apply (forward) and revert (backward). Reads r.params each pass. */
177
185
  private cycle;
178
186
  /** Play an effect out and leave it waiting (it stays in the list, ready to play again). */
187
+ /**
188
+ * A timeline track drives one of the effect's params: lay it over the row's own (undefined puts
189
+ * the row's own back). A running motion takes it at once (its `live` hook); anything else picks
190
+ * it up on its next pass — nothing replays.
191
+ */
192
+ setLiveParam(effectId: string, key: string, value: OperationParamValue | undefined): boolean;
179
193
  stop(effectId: string): boolean;
180
194
  /** Play an effect from its start (see playObjectEffect). */
181
195
  play(effectId: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"objectEffects.d.ts","sourceRoot":"","sources":["../../src/operations/objectEffects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objectEffects.d.ts","sourceRoot":"","sources":["../../src/operations/objectEffects.ts"],"names":[],"mappings":"AAqGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAiB,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKrJ,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGpE,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,GAAI,KAAK,mBAAmB,GAAG,SAAS,KAAG,GAAG,IAAI,mBACpC,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG,YAAY,EAAE,CAgBxF;AAED,2FAA2F;AAC3F,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE7D,wBAAgB,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAQ,GAAG,cAAc,CAW/I;AAED,yGAAyG;AACzG,eAAO,MAAM,kBAAkB,GAAI,KAAK,mBAAmB,EAAE,QAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,iBAAe,EAAE,gBAAc,KAAG,eAMnI,CAAC;AAEH,wDAAwD;AACxD,eAAO,MAAM,UAAU,GAAI,QAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,KAAG,QAAQ,CAAC,cAAc,CAKzF,CAAC;AAMH,2GAA2G;AAC3G,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,UAAQ,GAAG,uBAAuB,GAAG,SAAS,CAE9G;AAYD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAEtJ;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE3E;AAED,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,GAAI,MAAM;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,KAAG,OACG,CAAC;AAE3I;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAEpH;AAoCD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE7F;AAKD,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,eAAO,MAAM,SAAS,IAAI,CAAC;AAiB3B,4HAA4H;AAC5H,MAAM,WAAW,cAAc;IAAG,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;AAsBlH,qBAAa,uBAAuB;IA8BpB,OAAO,CAAC,IAAI;IA7BxB,OAAO,CAAC,OAAO,CAA8B;IAC7C,mFAAmF;IACnF,OAAO,CAAC,OAAO,CAAoF;IACnG,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAQ;IACrB,qHAAqH;IACrH,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,sGAAsG;IACtG,OAAO,CAAC,GAAG,CAAoG;IAC/G,8EAA8E;IAC9E,OAAO,CAAC,KAAK,CAA8B;IAC3C,mEAAmE;IACnE,OAAO,CAAC,SAAS,CAAS;IAC1B,wFAAwF;IACxF,OAAO,CAAC,KAAK,CAAmC;IAChD,oFAAoF;IACpF,OAAO,CAAC,OAAO,CAA8B;IAC7C,yGAAyG;IACzG,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAAoB;IAClC,yGAAyG;IACzG,OAAO,CAAC,YAAY,CAAqB;IACzC,4GAA4G;IAC5G,OAAO,CAAC,UAAU,CAA0D;gBAExD,IAAI,EAAE,QAAQ;IAMlC,0EAA0E;IAC1E,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,GAAG;IAeX;;;;;;;OAOG;IACH,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,UAAQ,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAsBxK,wGAAwG;IACxG,OAAO,CAAC,MAAM;IAiBd,kGAAkG;IAClG,OAAO,CAAC,KAAK;IAOb;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAaf;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IA6BzK,qFAAqF;IACrF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAalC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAE/B,+GAA+G;IAC/G,OAAO,CAAC,YAAY;IAUpB;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO;IAkCvE,6FAA6F;IAC7F,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAchC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAE7B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,QAAQ;IAoBhB,qGAAqG;IACrG,IAAI,IAAI,IAAI,MAAM,CAAkE;IAEpF,OAAO,CAAC,QAAQ;IAiGhB,8HAA8H;IAC9H,OAAO,CAAC,OAAO;IAQf;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAuCZ,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,OAAO;IAEvB,mCAAmC;IACnC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IA0DrD,OAAO,CAAC,SAAS;IAKjB,oGAAoG;IACpG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1C,oHAAoH;IACpH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE;IAStB,2GAA2G;IAC3G,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAM1C,OAAO,CAAC,WAAW;IAInB,4DAA4D;IAC5D,OAAO,CAAC,KAAK;IAOb,oGAAoG;YACtF,QAAQ;IActB,iFAAiF;IACjF,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,KAAK;IA6Bb,qGAAqG;IACrG,OAAO,CAAC,QAAQ;IAShB,+GAA+G;IAC/G,OAAO,CAAC,QAAQ;IAOhB,yEAAyE;IACzE,oGAAoG;IACpG,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,KAAK;IAwBb,kEAAkE;IAClE,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,IAAI;IAEZ;;;OAGG;YACW,QAAQ;IA6BtB,6GAA6G;YAC/F,KAAK;IAmCnB,2FAA2F;IAC3F;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO;IAqB5F,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmB/B,4DAA4D;IAC5D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAiB/B;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxB,8DAA8D;IAC9D,mFAAmF;IACnF,WAAW;IAEX,mEAAmE;IACnE,IAAI,WAAW,IAAI,MAAM,EAAE,CAAqC;IAEhE,OAAO;IAaP,uDAAuD;IACvD,IAAI,UAAU,IAAI,MAAM,EAAE,CAAqC;CAClE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAUvD"}
@@ -75,6 +75,14 @@ registerAddedEffects({
75
75
  removeClip: (root, key) => !!controllers.get(root)?.removeClip(key),
76
76
  hasClip: (root, key) => !!controllers.get(root)?.hasClip(key),
77
77
  });
78
+ /**
79
+ * A timeline track on one of an object's effects' params (`effects.<effectId>.<param>`): set it on
80
+ * the running effect (undefined = back to the effect's own). False when the object has no controller
81
+ * or no such effect yet (a model still loading).
82
+ */
83
+ export function setObjectEffectParam(root, effectId, key, value) {
84
+ return !!root && !!controllers.get(root)?.setLiveParam(effectId, key, value);
85
+ }
78
86
  /** The step of an object's effect steps that is on now (-1: none) — for the editor. */
79
87
  export function currentEffectStep(root) {
80
88
  return (root && controllers.get(root)?.step) ?? -1;
@@ -150,6 +158,8 @@ export class ObjectEffectsController {
150
158
  spread = {};
151
159
  /** Added effects that follow visibility: a group's effects on this child, when the group's follow it. */
152
160
  addedFollows = new Set();
161
+ /** Timeline-driven params (effect id → param → value), laid over the row's own while a clip drives them. */
162
+ liveParams = new Map();
153
163
  constructor(root) {
154
164
  this.root = root;
155
165
  controllers.set(root, this);
@@ -562,7 +572,7 @@ export class ObjectEffectsController {
562
572
  for (const e of next) {
563
573
  const def = getOperation(e.operation);
564
574
  const [follows, inStep] = this.visOf(e.id);
565
- const params = objectEffectParams(def, e, follows, inStep);
575
+ const params = { ...objectEffectParams(def, e, follows, inStep), ...(this.liveParams.get(e.id) ?? {}) };
566
576
  const paramsKey = JSON.stringify(params);
567
577
  const r = this.running.get(e.id);
568
578
  if (r && r.paramsKey === paramsKey)
@@ -1104,6 +1114,44 @@ export class ObjectEffectsController {
1104
1114
  r.cycle = undefined;
1105
1115
  }
1106
1116
  /** Play an effect out and leave it waiting (it stays in the list, ready to play again). */
1117
+ /**
1118
+ * A timeline track drives one of the effect's params: lay it over the row's own (undefined puts
1119
+ * the row's own back). A running motion takes it at once (its `live` hook); anything else picks
1120
+ * it up on its next pass — nothing replays.
1121
+ */
1122
+ setLiveParam(effectId, key, value) {
1123
+ if (this.disposed)
1124
+ return false;
1125
+ const cur = { ...(this.liveParams.get(effectId) ?? {}) };
1126
+ if (value === undefined)
1127
+ delete cur[key];
1128
+ else
1129
+ cur[key] = value;
1130
+ if (Object.keys(cur).length)
1131
+ this.liveParams.set(effectId, cur);
1132
+ else
1133
+ this.liveParams.delete(effectId);
1134
+ const e = this.effects.find(x => x?.id === effectId);
1135
+ const r = this.running.get(effectId);
1136
+ if (!e)
1137
+ return false;
1138
+ if (!r)
1139
+ return true;
1140
+ const def = getOperation(r.op);
1141
+ if (!def)
1142
+ return true;
1143
+ const [follows, inStep] = this.visOf(effectId);
1144
+ const params = { ...objectEffectParams(def, e, follows, inStep), ...cur };
1145
+ const paramsKey = JSON.stringify(params);
1146
+ if (paramsKey === r.paramsKey)
1147
+ return true;
1148
+ r.params = params;
1149
+ r.paramsKey = paramsKey;
1150
+ if (r.started && def.live)
1151
+ for (const t of r.targets)
1152
+ def.live(t, { ...params, __backward: !!r.cycle?.back });
1153
+ return true;
1154
+ }
1107
1155
  stop(effectId) {
1108
1156
  const r = this.running.get(effectId);
1109
1157
  const def = r && getOperation(r.op);
@@ -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, target, its meshes, parameters) once. Targets with no meshes yet (a model
98
- * still loading) are skipped and warmed when it has landed.
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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"}