@needle-tools/engine 2.51.0-pre → 2.52.0-pre

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 (54) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/needle-engine.d.ts +56 -20
  3. package/dist/needle-engine.js +376 -377
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +26 -27
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/engine_utils.d.ts +2 -0
  8. package/lib/engine/engine_utils.js +9 -0
  9. package/lib/engine/engine_utils.js.map +1 -1
  10. package/lib/engine/extensions/NEEDLE_deferred_texture.js +4 -3
  11. package/lib/engine/extensions/NEEDLE_deferred_texture.js.map +1 -1
  12. package/lib/engine-components/Camera.d.ts +8 -2
  13. package/lib/engine-components/Camera.js +39 -2
  14. package/lib/engine-components/Camera.js.map +1 -1
  15. package/lib/engine-components/EventTrigger.d.ts +10 -1
  16. package/lib/engine-components/EventTrigger.js +47 -0
  17. package/lib/engine-components/EventTrigger.js.map +1 -1
  18. package/lib/engine-components/Light.js +5 -2
  19. package/lib/engine-components/Light.js.map +1 -1
  20. package/lib/engine-components/ParticleSystemModules.js +0 -1
  21. package/lib/engine-components/ParticleSystemModules.js.map +1 -1
  22. package/lib/engine-components/Renderer.d.ts +1 -0
  23. package/lib/engine-components/Renderer.js +10 -3
  24. package/lib/engine-components/Renderer.js.map +1 -1
  25. package/lib/engine-components/ShadowCatcher.js +5 -6
  26. package/lib/engine-components/ShadowCatcher.js.map +1 -1
  27. package/lib/engine-components/Skybox.d.ts +1 -0
  28. package/lib/engine-components/Skybox.js +5 -0
  29. package/lib/engine-components/Skybox.js.map +1 -1
  30. package/lib/engine-components/SpriteRenderer.d.ts +19 -3
  31. package/lib/engine-components/SpriteRenderer.js +154 -41
  32. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  33. package/lib/engine-components/WebXRRig.js +12 -0
  34. package/lib/engine-components/WebXRRig.js.map +1 -1
  35. package/lib/engine-components/codegen/components.d.ts +1 -0
  36. package/lib/engine-components/codegen/components.js +1 -0
  37. package/lib/engine-components/codegen/components.js.map +1 -1
  38. package/lib/engine-components/timeline/PlayableDirector.js +6 -0
  39. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/engine/codegen/register_types.js +2 -0
  42. package/src/engine/engine_utils.ts +13 -2
  43. package/src/engine/extensions/NEEDLE_deferred_texture.ts +9 -6
  44. package/src/engine-components/Camera.ts +36 -2
  45. package/src/engine-components/EventTrigger.ts +39 -19
  46. package/src/engine-components/Light.ts +4 -2
  47. package/src/engine-components/ParticleSystemModules.ts +0 -3
  48. package/src/engine-components/Renderer.ts +10 -4
  49. package/src/engine-components/ShadowCatcher.ts +5 -6
  50. package/src/engine-components/Skybox.ts +4 -0
  51. package/src/engine-components/SpriteRenderer.ts +140 -44
  52. package/src/engine-components/WebXRRig.ts +14 -1
  53. package/src/engine-components/codegen/components.ts +1 -0
  54. package/src/engine-components/timeline/PlayableDirector.ts +5 -0
@@ -1,28 +1,48 @@
1
+ import { serializable } from "../engine/engine_serialization";
2
+ import { EventList } from "./EventList";
3
+ import { IPointerEventHandler, PointerEventData } from "./ui/PointerEvents"
1
4
  import { Behaviour } from "./Component"
2
5
  import { EventType } from "./EventType"
3
6
 
4
- export class EventTrigger extends Behaviour {
5
- /*
6
- private triggers: Array<{ key: EventType, callbacks: Array<Function> }> = [];
7
- private events: Map<EventType, Array<Function>> = new Map();
7
+ class TriggerEvent {
8
+ @serializable()
9
+ eventID!: EventType;
10
+ @serializable(EventList)
11
+ callback!: EventList;
12
+ }
8
13
 
9
- awake() {
10
- for (const i in this.triggers) {
11
- const evt = this.triggers[i];
12
- const key = EventType[evt.key];
13
- this.events.set(key, evt.callbacks);
14
+ export class EventTrigger extends Behaviour implements IPointerEventHandler {
15
+
16
+ @serializable(TriggerEvent)
17
+ private triggers?: Array<TriggerEvent>;
18
+
19
+ invoke(type: EventType) {
20
+ if(!this.triggers) return;
21
+ for(const trigger of this.triggers){
22
+ if(trigger.eventID === type){
23
+ trigger.callback.invoke();
24
+ }
14
25
  }
15
- console.log(this);
16
- // console.log(this.events);
17
26
  }
18
27
 
19
- public invoke(type: EventType) {
20
- const evt = this.events.get(type);
21
- if (evt) {
22
- evt.forEach(callback => {
23
- callback();
24
- });
25
- }
28
+ onPointerClick(_: PointerEventData) {
29
+ this.invoke(EventType.PointerClick);
30
+ }
31
+
32
+ onPointerEnter(_: PointerEventData) {
33
+ this.invoke(EventType.PointerEnter);
34
+ }
35
+
36
+ onPointerExit(_: PointerEventData) {
37
+ this.invoke(EventType.PointerExit);
26
38
  }
27
- */
39
+
40
+ onPointerDown(_: PointerEventData) {
41
+ this.invoke(EventType.PointerDown);
42
+ }
43
+
44
+ onPointerUp(_: PointerEventData) {
45
+ this.invoke(EventType.PointerUp);
46
+ }
47
+
28
48
  }
@@ -165,7 +165,7 @@ export class Light extends Behaviour implements ILight {
165
165
  }
166
166
  }
167
167
  get intensity(): number { return this._intensity; }
168
- private _intensity: number = 1;
168
+ private _intensity: number = -1;
169
169
 
170
170
  @serializable()
171
171
  get shadowDistance(): number {
@@ -344,7 +344,9 @@ export class Light extends Behaviour implements ILight {
344
344
 
345
345
 
346
346
  if (this.light) {
347
- this._intensity = this.light.intensity;
347
+ if (this._intensity >= 0)
348
+ this.light.intensity = this._intensity;
349
+ else this._intensity = this.light.intensity;
348
350
 
349
351
  if (this.shadows !== LightShadows.None) {
350
352
  this.light.castShadow = true;
@@ -656,8 +656,6 @@ export class ShapeModule implements EmitterShape {
656
656
 
657
657
  private randomizeDirection(direction: Vector3, amount: number) {
658
658
  if (amount === 0) return;
659
- console.log('randomizeDirection', amount);
660
-
661
659
  const randomQuat = ShapeModule._randomQuat;
662
660
  const tempVec = ShapeModule._tempVec;
663
661
  tempVec.set(Math.random() - .5, Math.random() - .5, Math.random() - .5).normalize();
@@ -674,7 +672,6 @@ export class ShapeModule implements EmitterShape {
674
672
  const z = Math.cos(phi);
675
673
  const v = new Vector3(x, y, z);
676
674
  dir.lerp(v, amount);
677
-
678
675
  }
679
676
 
680
677
  private randomSpherePoint(pos: Vec3, radius: number, thickness: number, arc: number, vec: Vec3) {
@@ -2,7 +2,7 @@ import { Behaviour, GameObject } from "./Component";
2
2
  import * as THREE from "three";
3
3
  // import { RendererCustomShader } from "./RendererCustomShader";
4
4
  import { RendererLightmap } from "./RendererLightmap";
5
- import { Context } from "../engine/engine_setup";
5
+ import { Context, FrameEvent } from "../engine/engine_setup";
6
6
  import { getParam } from "../engine/engine_utils";
7
7
  import { serializable } from "../engine/engine_serialization_decorator";
8
8
  import { AxesHelper, Material, Mesh, Object3D, SkinnedMesh, Texture, Vector4 } from "three";
@@ -546,11 +546,17 @@ export class Renderer extends Behaviour implements IRenderer {
546
546
  this._reflectionProbe = null;
547
547
  if (this.reflectionProbeUsage !== ReflectionProbeUsage.Off) {
548
548
  if (!this.probeAnchor) return;
549
- const obj = this.probeAnchor || this.gameObject;
550
- const isAnchor = this.probeAnchor ? true : false;
551
- this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor);
549
+ // update the reflection probe right before rendering
550
+ // if we do it immediately the reflection probe might not be enabled yet
551
+ // (since this method is called from onEnable)
552
+ this.startCoroutine(this._updateReflectionProbe(), FrameEvent.OnBeforeRender);
552
553
  }
553
554
  }
555
+ private *_updateReflectionProbe(){
556
+ const obj = this.probeAnchor || this.gameObject;
557
+ const isAnchor = this.probeAnchor ? true : false;
558
+ this._reflectionProbe = ReflectionProbe.get(obj, this.context, isAnchor);
559
+ }
554
560
 
555
561
  private setVisibility(visible: boolean) {
556
562
 
@@ -40,7 +40,7 @@ export class ShadowCatcher extends Behaviour {
40
40
  applyLightBlendMaterial() {
41
41
  const renderer = GameObject.getComponent(this.gameObject, Renderer);
42
42
  if (renderer) {
43
- const material = renderer.material;
43
+ const material = renderer.sharedMaterial;
44
44
  material.blending = AdditiveBlending;
45
45
  this.applyMaterialOptions(material);
46
46
  material.onBeforeCompile = (shader) => {
@@ -50,9 +50,8 @@ export class ShadowCatcher extends Behaviour {
50
50
  // see https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js#L2
51
51
  // see https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js#L281
52
52
 
53
- shader.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",
53
+ shader.fragmentShader = shader.fragmentShader.replace("vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;",
54
54
  `vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
55
-
56
55
  // diffuse-only lighting with overdrive to somewhat compensate
57
56
  // for the loss of indirect lighting and to make it more visible.
58
57
  vec3 direct = reflectedLight.directDiffuse * 3.;
@@ -73,15 +72,15 @@ export class ShadowCatcher extends Behaviour {
73
72
  applyShadowMaterial() {
74
73
  const renderer = GameObject.getComponent(this.gameObject, Renderer);
75
74
  if (renderer) {
76
- if (renderer.material?.type !== "ShadowMaterial") {
75
+ if (renderer.sharedMaterial?.type !== "ShadowMaterial") {
77
76
  const material = new ShadowMaterial();
78
77
  material.color = this.shadowColor;
79
78
  material.opacity = this.shadowColor.alpha;
80
79
  this.applyMaterialOptions(material);
81
- renderer.material = material;
80
+ renderer.sharedMaterial = material;
82
81
  }
83
82
  else {
84
- const material = renderer.material as ShadowMaterial;
83
+ const material = renderer.sharedMaterial as ShadowMaterial;
85
84
  material.color = this.shadowColor;
86
85
  material.opacity = this.shadowColor.alpha;
87
86
  this.applyMaterialOptions(material);
@@ -18,6 +18,9 @@ export class RemoteSkybox extends Behaviour {
18
18
  @serializable()
19
19
  background: boolean = true;
20
20
 
21
+ @serializable()
22
+ backgroundBlurriness: number = 0;
23
+
21
24
  @serializable()
22
25
  environment: boolean = true;
23
26
 
@@ -79,6 +82,7 @@ export class RemoteSkybox extends Behaviour {
79
82
  this._prevLoadedEnvironment = envMap;
80
83
  const nameIndex = url.lastIndexOf("/");
81
84
  envMap.name = url.substring(nameIndex >= 0 ? nameIndex + 1 : 0);
85
+ this.context.scene.backgroundBlurriness = this.backgroundBlurriness;
82
86
  }
83
87
 
84
88
 
@@ -1,9 +1,48 @@
1
1
  import { Behaviour } from "./Component";
2
2
  import * as THREE from "three";
3
- import { serializable } from "../engine/engine_serialization_decorator";
4
- import { Color, Material, Texture } from "three";
3
+ import { serializable, serializeable } from "../engine/engine_serialization_decorator";
4
+ import { Color, Material, NearestFilter, Texture, Vector2, TextureFilter } from "three";
5
5
  import { RGBAColor } from "./js-extensions/RGBAColor";
6
+ import { getParam } from "../engine/engine_utils";
6
7
 
8
+ const debug = getParam("debugspriterenderer")
9
+
10
+ class SpriteUtils {
11
+
12
+ static cache: { [key: string]: THREE.BufferGeometry } = {};
13
+
14
+ static getOrCreateGeometry(sprite: Sprite): THREE.BufferGeometry {
15
+ if (sprite._geometry) return sprite._geometry;
16
+ if (sprite.guid) {
17
+ if (SpriteUtils.cache[sprite.guid]) {
18
+ if (debug) console.log("Take cached geometry for sprite", sprite.guid);
19
+ return SpriteUtils.cache[sprite.guid];
20
+ }
21
+ }
22
+ const geo = new THREE.BufferGeometry();
23
+ sprite._geometry = geo;
24
+ const vertices = new Float32Array(sprite.triangles.length * 3);
25
+ const uvs = new Float32Array(sprite.triangles.length * 2);
26
+ for (let i = 0; i < sprite.triangles.length; i += 1) {
27
+ const index = sprite.triangles[i];
28
+
29
+ vertices[i * 3] = -sprite.vertices[index].x;
30
+ vertices[i * 3 + 1] = sprite.vertices[index].y;
31
+
32
+ vertices[i * 3 + 2] = 0;
33
+ const uv = sprite.uv[index];
34
+ uvs[i * 2] = uv.x;
35
+ uvs[i * 2 + 1] = 1 - uv.y;
36
+ }
37
+ geo.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
38
+ geo.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
39
+ if (sprite.guid)
40
+ this.cache[sprite.guid] = geo;
41
+ if (debug)
42
+ console.log("Built sprite geometry", sprite, geo);
43
+ return geo;
44
+ }
45
+ }
7
46
 
8
47
  /// <summary>
9
48
  /// <para>SpriteRenderer draw mode.</para>
@@ -30,42 +69,59 @@ class Vec2 {
30
69
 
31
70
  export class Sprite {
32
71
 
72
+ @serializable()
73
+ guid?: string;
33
74
  @serializable(Texture)
34
75
  texture?: THREE.Texture;
35
-
76
+ @serializeable()
36
77
  triangles!: Array<number>;
78
+ @serializeable()
37
79
  uv!: Array<Vec2>;
80
+ @serializeable()
38
81
  vertices!: Array<Vec2>;
39
82
 
40
83
  _geometry?: THREE.BufferGeometry;
41
84
  }
42
85
 
43
- class SpriteUtils {
44
86
 
45
- static getOrCreateGeometry(sprite: Sprite): THREE.BufferGeometry {
46
- if (sprite._geometry) return sprite._geometry;
47
- const geo = new THREE.BufferGeometry();
48
- sprite._geometry = geo;
49
- const vertices = new Float32Array(sprite.triangles.length * 3);
50
- const uvs = new Float32Array(sprite.triangles.length * 2);
51
- for (let i = 0; i < sprite.triangles.length; i += 1) {
52
- const index = sprite.triangles[i];
87
+ class Slice {
88
+ @serializable()
89
+ name!: string;
90
+ @serializable(Vector2)
91
+ offset!: Vector2;
92
+ @serializable(Vector2)
93
+ size!: Vector2;
94
+ }
53
95
 
54
- vertices[i * 3] = -sprite.vertices[index].x;
55
- vertices[i * 3 + 1] = sprite.vertices[index].y;
96
+ const $spriteTexOwner = Symbol("spriteOwner");
56
97
 
57
- vertices[i * 3 + 2] = 0;
58
- const uv = sprite.uv[index];
59
- uvs[i * 2] = uv.x;
60
- uvs[i * 2 + 1] = 1 - uv.y;
61
- }
62
- // console.log(vertices);
63
- geo.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
64
- geo.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
65
- return geo;
98
+ export class SpriteSheet {
99
+
100
+ @serializable(Sprite)
101
+ sprite?: Sprite;
102
+ @serializable()
103
+ index: number = 0;
104
+ @serializable(Slice)
105
+ slices!: Slice[];
106
+
107
+ update() {
108
+ const index = this.index;
109
+ if (index < 0 || index >= this.slices.length)
110
+ return;
111
+ const slice = this.slices[index];
112
+ let tex = this.sprite?.texture;
113
+ if (!tex) return;
114
+ tex.encoding = THREE.sRGBEncoding;
115
+ tex.offset.set(slice.offset.x, slice.offset.y);
116
+ // aniso > 1 makes the texture blurry
117
+ if (tex.minFilter == NearestFilter && tex.magFilter == NearestFilter)
118
+ tex.anisotropy = 1;
119
+ // tex.repeat.set(slice.size.x, -slice.size.y);
120
+ tex.needsUpdate = true;
66
121
  }
67
122
  }
68
123
 
124
+
69
125
  export class SpriteRenderer extends Behaviour {
70
126
 
71
127
  @serializable()
@@ -79,37 +135,69 @@ export class SpriteRenderer extends Behaviour {
79
135
  @serializable(Material)
80
136
  sharedMaterial?: THREE.Material;
81
137
 
82
- get sprite(): Sprite | undefined {
83
- return this._sprite;
138
+ @serializable(SpriteSheet)
139
+ get sprite(): SpriteSheet | undefined {
140
+ return this._spriteSheet;
84
141
  }
85
- set sprite(value: Sprite | undefined) {
86
- if(value === this._sprite) return;
87
- this._sprite = value;
88
- this.updateSprite();
142
+ set sprite(value: SpriteSheet | undefined | number) {
143
+ if (value === this._spriteSheet) return;
144
+ if (typeof value === "number") {
145
+ const index = Math.floor(value);;
146
+ if (index === value)
147
+ this.spriteIndex = index;
148
+ return;
149
+ }
150
+ else {
151
+ this._spriteSheet = value;
152
+ this.updateSprite();
153
+ }
89
154
  }
90
155
 
91
- private _sprite?: Sprite;
156
+ set spriteIndex(value: number) {
157
+ if (!this._spriteSheet) return;
158
+ this._spriteSheet.index = value;
159
+ this._spriteSheet.update();
160
+ }
161
+ get spriteIndex(): number {
162
+ return this._spriteSheet?.index ?? 0;
163
+ }
164
+ get spriteFrames(): number {
165
+ return this._spriteSheet?.slices.length ?? 0;
166
+ }
167
+
168
+ private _spriteSheet?: SpriteSheet;
92
169
  private _currentSprite?: THREE.Mesh;
93
170
 
94
171
  awake(): void {
95
172
  this._currentSprite = undefined;
173
+ if(debug) {
174
+ console.log("Awake", this.name, this, this.sprite?.sprite?.texture);
175
+ if(this.sprite?.sprite?.texture)
176
+ console.log(this.sprite.sprite.texture.minFilter.toString(), this.sprite.sprite.texture.magFilter.toString());
177
+ }
96
178
  }
97
179
 
98
180
  start() {
99
- if (this.drawMode === SpriteDrawMode.Tiled) {
100
- console.warn("Tiled draw mode is not supported yet", this);
101
- }
102
181
  if (!this._currentSprite)
103
182
  this.updateSprite();
104
183
  else if (this.gameObject)
105
184
  this.gameObject.add(this._currentSprite);
106
185
  }
107
186
 
187
+ // frame : number = 0;
188
+ // update(){
189
+ // // const frameRate = 12;
190
+ // // this.frame += frameRate * this.context.time.deltaTime;
191
+ // // if(this.frame >= this.spriteFrames)
192
+ // // this.frame = 0;
193
+ // // this.spriteIndex = Math.floor(this.frame);
194
+ // // console.log(this.spriteIndex);
195
+ // }
196
+
108
197
  private updateSprite() {
109
198
  if (!this.__didAwake) return;
110
- if (!this.sprite) return;
111
- if (!this.sharedMaterial) return;
112
-
199
+ if (!this.sprite?.sprite) return;
200
+ const sprite = this.sprite.sprite;
113
201
  if (!this._currentSprite) {
114
202
  const mat = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide });
115
203
  if (!mat) return;
@@ -120,17 +208,23 @@ export class SpriteRenderer extends Behaviour {
120
208
  }
121
209
  mat.alphaTest = 0.5;
122
210
 
123
- if (this.sprite.texture && !mat.wireframe) {
124
- const t = this.sprite.texture;
125
- // t.wrapS = THREE.RepeatWrapping;
126
- mat["map"] = t;
211
+ if (sprite.texture && !mat.wireframe) {
212
+ let tex = sprite.texture;
213
+ // the sprite renderer modifies the textue offset
214
+ // so we need to clone the texture
215
+ // if the same texture is used multiple times
216
+ if (tex[$spriteTexOwner] !== undefined && tex[$spriteTexOwner] !== this && this.spriteFrames > 1) {
217
+ tex = sprite!.texture = tex.clone();
218
+ }
219
+ tex[$spriteTexOwner] = this;
220
+ mat["map"] = tex;
127
221
  }
128
-
129
- this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(this.sprite), mat);
222
+ this.sharedMaterial = mat;
223
+ this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(sprite), mat);
130
224
  }
131
225
  else {
132
- this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(this.sprite);
133
- this._currentSprite.material["map"] = this.sprite.texture;
226
+ this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(sprite);
227
+ this._currentSprite.material["map"] = sprite.texture;
134
228
  }
135
229
 
136
230
  if (this._currentSprite.parent !== this.gameObject) {
@@ -139,5 +233,7 @@ export class SpriteRenderer extends Behaviour {
139
233
  if (this.gameObject)
140
234
  this.gameObject.add(this._currentSprite);
141
235
  }
236
+
237
+ this._spriteSheet?.update();
142
238
  }
143
239
  }
@@ -1,9 +1,22 @@
1
- import { Behaviour } from "./Component";
1
+ import { Object3D } from "three";
2
+ import { IGameObject } from "../engine/engine_types";
3
+ import { getParam } from "../engine/engine_utils";
4
+ import { Behaviour, GameObject } from "./Component";
5
+ import { BoxGizmo } from "./Gizmos";
2
6
 
7
+ const debug = getParam("debugrig");
3
8
 
4
9
  export class XRRig extends Behaviour {
5
10
  awake(): void {
6
11
  // const helper = new AxesHelper(.1);
7
12
  // this.gameObject.add(helper);
13
+ if (debug) {
14
+ const gizmoObj = new Object3D() as IGameObject;
15
+ gizmoObj.position.y += .5;
16
+ this.gameObject.add(gizmoObj);
17
+ const gizmo = gizmoObj.addNewComponent(BoxGizmo);
18
+ if (gizmo)
19
+ gizmo.isGizmo = false;
20
+ }
8
21
  }
9
22
  }
@@ -85,6 +85,7 @@ export { SpatialTriggerReceiver } from "../SpatialTrigger";
85
85
  export { SpatialTrigger } from "../SpatialTrigger";
86
86
  export { SpectatorCamera } from "../SpectatorCamera";
87
87
  export { Sprite } from "../SpriteRenderer";
88
+ export { SpriteSheet } from "../SpriteRenderer";
88
89
  export { SpriteRenderer } from "../SpriteRenderer";
89
90
  export { SyncedCamera } from "../SyncedCamera";
90
91
  export { SyncedRoom } from "../SyncedRoom";
@@ -309,6 +309,11 @@ export class PlayableDirector extends Behaviour {
309
309
  if (debug)
310
310
  console.log("Resolved binding", binding, "to", obj);
311
311
  track.outputs[i] = obj;
312
+ if(obj instanceof Animator) {
313
+ // TODO: should disable? animator but this is not the animator that is currently on the object? needs investigation
314
+ // console.log("DISABLE ANIMATOR", obj, obj.name, binding, this._guidsMap);
315
+ // obj.enabled = false;
316
+ }
312
317
  }
313
318
  }
314
319
  else if (binding === null) {