@needle-tools/engine 2.51.0-pre → 2.53.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 (128) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/needle-engine.d.ts +243 -56
  3. package/dist/needle-engine.js +380 -381
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +41 -42
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/engine_components.js +2 -2
  8. package/lib/engine/engine_components.js.map +1 -1
  9. package/lib/engine/engine_networking_instantiate.d.ts +1 -1
  10. package/lib/engine/engine_networking_instantiate.js +3 -0
  11. package/lib/engine/engine_networking_instantiate.js.map +1 -1
  12. package/lib/engine/engine_serialization_builtin_serializer.d.ts +6 -0
  13. package/lib/engine/engine_serialization_builtin_serializer.js +31 -6
  14. package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
  15. package/lib/engine/engine_serialization_core.d.ts +1 -0
  16. package/lib/engine/engine_serialization_core.js +6 -0
  17. package/lib/engine/engine_serialization_core.js.map +1 -1
  18. package/lib/engine/engine_setup.js +2 -2
  19. package/lib/engine/engine_setup.js.map +1 -1
  20. package/lib/engine/engine_texture.d.ts +3 -0
  21. package/lib/engine/engine_texture.js +4 -0
  22. package/lib/engine/engine_texture.js.map +1 -0
  23. package/lib/engine/engine_utils.d.ts +2 -0
  24. package/lib/engine/engine_utils.js +9 -0
  25. package/lib/engine/engine_utils.js.map +1 -1
  26. package/lib/engine/extensions/{NEEDLE_deferred_texture.d.ts → NEEDLE_progressive.d.ts} +2 -2
  27. package/lib/engine/extensions/{NEEDLE_deferred_texture.js → NEEDLE_progressive.js} +10 -9
  28. package/lib/engine/extensions/NEEDLE_progressive.js.map +1 -0
  29. package/lib/engine/extensions/extensions.js +2 -2
  30. package/lib/engine/extensions/extensions.js.map +1 -1
  31. package/lib/engine-components/Camera.d.ts +8 -2
  32. package/lib/engine-components/Camera.js +56 -4
  33. package/lib/engine-components/Camera.js.map +1 -1
  34. package/lib/engine-components/EventTrigger.d.ts +10 -1
  35. package/lib/engine-components/EventTrigger.js +47 -0
  36. package/lib/engine-components/EventTrigger.js.map +1 -1
  37. package/lib/engine-components/Light.js +6 -2
  38. package/lib/engine-components/Light.js.map +1 -1
  39. package/lib/engine-components/OrbitControls.js +6 -2
  40. package/lib/engine-components/OrbitControls.js.map +1 -1
  41. package/lib/engine-components/ParticleSystemModules.js +0 -1
  42. package/lib/engine-components/ParticleSystemModules.js.map +1 -1
  43. package/lib/engine-components/Renderer.d.ts +1 -0
  44. package/lib/engine-components/Renderer.js +13 -6
  45. package/lib/engine-components/Renderer.js.map +1 -1
  46. package/lib/engine-components/ShadowCatcher.js +5 -6
  47. package/lib/engine-components/ShadowCatcher.js.map +1 -1
  48. package/lib/engine-components/Skybox.d.ts +1 -0
  49. package/lib/engine-components/Skybox.js +5 -0
  50. package/lib/engine-components/Skybox.js.map +1 -1
  51. package/lib/engine-components/SpriteRenderer.d.ts +19 -3
  52. package/lib/engine-components/SpriteRenderer.js +154 -41
  53. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  54. package/lib/engine-components/Voip.js +13 -4
  55. package/lib/engine-components/Voip.js.map +1 -1
  56. package/lib/engine-components/WebXRRig.js +12 -0
  57. package/lib/engine-components/WebXRRig.js.map +1 -1
  58. package/lib/engine-components/codegen/components.d.ts +7 -2
  59. package/lib/engine-components/codegen/components.js +7 -2
  60. package/lib/engine-components/codegen/components.js.map +1 -1
  61. package/lib/engine-components/export/{GltfExport.d.ts → gltf/GltfExport.d.ts} +2 -2
  62. package/lib/engine-components/export/{GltfExport.js → gltf/GltfExport.js} +7 -7
  63. package/lib/engine-components/export/gltf/GltfExport.js.map +1 -0
  64. package/lib/engine-components/export/usdz/Extension.d.ts +9 -0
  65. package/lib/engine-components/export/usdz/Extension.js +2 -0
  66. package/lib/engine-components/export/usdz/Extension.js.map +1 -0
  67. package/lib/engine-components/export/usdz/USDZExporter.d.ts +25 -0
  68. package/lib/engine-components/export/usdz/USDZExporter.js +193 -0
  69. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -0
  70. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +44 -0
  71. package/lib/engine-components/export/usdz/extensions/Animation.js +264 -0
  72. package/lib/engine-components/export/usdz/extensions/Animation.js.map +1 -0
  73. package/lib/engine-components/export/usdz/types.d.ts +34 -0
  74. package/lib/engine-components/export/usdz/types.js +2 -0
  75. package/lib/engine-components/export/usdz/types.js.map +1 -0
  76. package/lib/engine-components/export/usdz/utils/animationutils.d.ts +3 -0
  77. package/lib/engine-components/export/usdz/utils/animationutils.js +46 -0
  78. package/lib/engine-components/export/usdz/utils/animationutils.js.map +1 -0
  79. package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -0
  80. package/lib/engine-components/export/usdz/utils/quicklook.js +36 -0
  81. package/lib/engine-components/export/usdz/utils/quicklook.js.map +1 -0
  82. package/lib/engine-components/export/usdz/utils/timeutils.d.ts +1 -0
  83. package/lib/engine-components/export/usdz/utils/timeutils.js +15 -0
  84. package/lib/engine-components/export/usdz/utils/timeutils.js.map +1 -0
  85. package/lib/engine-components/timeline/PlayableDirector.js +6 -0
  86. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  87. package/lib/engine-components/ui/Graphic.d.ts +2 -0
  88. package/lib/engine-components/ui/Graphic.js +15 -0
  89. package/lib/engine-components/ui/Graphic.js.map +1 -1
  90. package/lib/engine-components/ui/Utils.d.ts +2 -1
  91. package/lib/engine-components/ui/Utils.js +5 -3
  92. package/lib/engine-components/ui/Utils.js.map +1 -1
  93. package/package.json +2 -2
  94. package/src/engine/codegen/register_types.js +16 -6
  95. package/src/engine/engine_components.ts +2 -2
  96. package/src/engine/engine_networking_instantiate.ts +4 -1
  97. package/src/engine/engine_serialization_builtin_serializer.ts +35 -7
  98. package/src/engine/engine_serialization_core.ts +7 -1
  99. package/src/engine/engine_setup.ts +2 -2
  100. package/src/engine/engine_texture.ts +6 -0
  101. package/src/engine/engine_utils.ts +13 -2
  102. package/src/engine/extensions/{NEEDLE_deferred_texture.ts → NEEDLE_progressive.ts} +18 -17
  103. package/src/engine/extensions/extensions.ts +2 -2
  104. package/src/engine-components/Camera.ts +53 -5
  105. package/src/engine-components/EventTrigger.ts +39 -19
  106. package/src/engine-components/Light.ts +6 -2
  107. package/src/engine-components/OrbitControls.ts +7 -3
  108. package/src/engine-components/ParticleSystemModules.ts +0 -3
  109. package/src/engine-components/Renderer.ts +13 -7
  110. package/src/engine-components/ShadowCatcher.ts +5 -6
  111. package/src/engine-components/Skybox.ts +4 -0
  112. package/src/engine-components/SpriteRenderer.ts +140 -44
  113. package/src/engine-components/Voip.ts +14 -4
  114. package/src/engine-components/WebXRRig.ts +14 -1
  115. package/src/engine-components/codegen/components.ts +7 -2
  116. package/src/engine-components/export/{GltfExport.ts → gltf/GltfExport.ts} +7 -7
  117. package/src/engine-components/export/usdz/Extension.ts +12 -0
  118. package/src/engine-components/export/usdz/USDZExporter.ts +216 -0
  119. package/src/engine-components/export/usdz/extensions/Animation.ts +306 -0
  120. package/src/engine-components/export/usdz/types.ts +39 -0
  121. package/src/engine-components/export/usdz/utils/animationutils.ts +60 -0
  122. package/src/engine-components/export/usdz/utils/quicklook.ts +43 -0
  123. package/src/engine-components/export/usdz/utils/timeutils.ts +20 -0
  124. package/src/engine-components/timeline/PlayableDirector.ts +5 -0
  125. package/src/engine-components/ui/Graphic.ts +15 -1
  126. package/src/engine-components/ui/Utils.ts +5 -3
  127. package/lib/engine/extensions/NEEDLE_deferred_texture.js.map +0 -1
  128. package/lib/engine-components/export/GltfExport.js.map +0 -1
@@ -5,14 +5,13 @@ import { Context } from "../engine_setup";
5
5
  import { addDracoAndKTX2Loaders } from "../engine_loaders";
6
6
  import { getParam, getPath } from "../engine_utils";
7
7
 
8
- export const EXTENSION_NAME = "NEEDLE_deferred_texture";
8
+ export const EXTENSION_NAME = "NEEDLE_progressive";
9
9
 
10
10
  const debug = getParam("debugprogressive");
11
11
 
12
- declare type DeferredTextureModel = {
12
+ declare type ProgressiveTextureSchema = {
13
13
  uri: string;
14
14
  guid: string;
15
- usage?: string,
16
15
  }
17
16
 
18
17
  const debug_toggle_maps: Map<Material, { [key: string]: { original: Texture, lod0: Texture } }> = new Map();
@@ -35,22 +34,23 @@ if (debug) {
35
34
  });
36
35
  }
37
36
 
38
- export class NEEDLE_deferred_texture implements GLTFLoaderPlugin {
39
-
37
+ export class NEEDLE_progressive implements GLTFLoaderPlugin {
40
38
 
41
39
  static assignTextureLOD(context: Context, source: SourceIdentifier | undefined, material: Material, level: number = 0) {
42
40
  if (!material) return;
43
- for (const slot of Object.keys(material)) {
41
+ for (let slot of Object.keys(material)) {
44
42
  const val = material[slot];
45
43
  if (val?.isTexture === true) {
46
- if (debug)
47
- console.log("-----------\n", "FIND", material.name, slot, val?.name, val?.userData, val);
48
- NEEDLE_deferred_texture.getOrLoadTexture(context, source, material, slot, val, level).then(t => {
44
+
45
+ if (debug) console.log("-----------\n", "FIND", material.name, slot, val?.name, val?.userData, val, material);
46
+
47
+ NEEDLE_progressive.getOrLoadTexture(context, source, material, slot, val, level).then(t => {
49
48
  if (t?.isTexture === true) {
50
- t.needsUpdate = true;
51
- if (debug)
52
- console.log("Assign LOD", material.name, slot, t.name, t["guid"], material, "Prev:", val, "Now:", t, "\n--------------");
49
+
50
+ if (debug) console.log("Assign LOD", material.name, slot, t.name, t["guid"], material, "Prev:", val, "Now:", t, "\n--------------");
51
+
53
52
  material[slot] = t;
53
+ t.needsUpdate = true;
54
54
  material.needsUpdate = true;
55
55
 
56
56
  if (debug) {
@@ -107,14 +107,14 @@ export class NEEDLE_deferred_texture implements GLTFLoaderPlugin {
107
107
  console.log("AFTER", this.sourceId, gltf);
108
108
  this.parser.json.textures?.forEach((textureInfo, index) => {
109
109
  if (textureInfo?.extensions) {
110
- const ext: DeferredTextureModel = textureInfo?.extensions[EXTENSION_NAME];
110
+ const ext: ProgressiveTextureSchema = textureInfo?.extensions[EXTENSION_NAME];
111
111
  if (ext) {
112
112
  const prom = this.parser.getDependency("texture", index);
113
113
  this._loading.splice(this._loading.indexOf(index), 1);
114
114
  prom.then(t => {
115
115
  if (debug) console.log("register texture", t.name, t.uuid, ext);
116
116
  t.userData.deferred = ext;
117
- NEEDLE_deferred_texture.cache.set(t.uuid, ext);
117
+ NEEDLE_progressive.cache.set(t.uuid, ext);
118
118
  });
119
119
  }
120
120
  }
@@ -123,13 +123,13 @@ export class NEEDLE_deferred_texture implements GLTFLoaderPlugin {
123
123
  return null;
124
124
  }
125
125
 
126
- private static cache = new Map<string, DeferredTextureModel>();
126
+ private static cache = new Map<string, ProgressiveTextureSchema>();
127
127
  private static resolved: { [key: string]: Texture } = {};
128
128
 
129
129
  private static async getOrLoadTexture(context: Context, source: SourceIdentifier | undefined, material: Material, slot: string, current: Texture, _level: number): Promise<Texture | null> {
130
130
 
131
131
  const key = current.uuid;
132
- const ext: DeferredTextureModel | undefined = NEEDLE_deferred_texture.cache.get(key);// || current.userData.deferred;
132
+ const ext: ProgressiveTextureSchema | undefined = NEEDLE_progressive.cache.get(key);// || current.userData.deferred;
133
133
  if (ext) {
134
134
  if (debug)
135
135
  console.log(key, ext.uri, ext.guid);
@@ -156,7 +156,7 @@ export class NEEDLE_deferred_texture implements GLTFLoaderPlugin {
156
156
  for (const tex of gltf.parser.json.textures) {
157
157
  index++;
158
158
  if (tex?.extensions) {
159
- const other: DeferredTextureModel = tex?.extensions[EXTENSION_NAME];
159
+ const other: ProgressiveTextureSchema = tex?.extensions[EXTENSION_NAME];
160
160
  if (other?.guid) {
161
161
  if (other.guid === ext.guid) {
162
162
  found = true;
@@ -174,6 +174,7 @@ export class NEEDLE_deferred_texture implements GLTFLoaderPlugin {
174
174
 
175
175
  // const index = Number.parseInt(ext.pointer.substring("textures/".length));
176
176
  const tex = await parser.getDependency("texture", index);
177
+ tex.encoding = current.encoding;
177
178
  if (tex) {
178
179
  tex.guid = ext.guid;
179
180
  }
@@ -12,7 +12,7 @@ import { SourceIdentifier } from "../engine_types";
12
12
  import { Context } from "../engine_setup";
13
13
  import { NEEDLE_lighting_settings } from "./NEEDLE_lighting_settings";
14
14
  import { NEEDLE_render_objects } from "./NEEDLE_render_objects";
15
- import { NEEDLE_deferred_texture } from "./NEEDLE_deferred_texture";
15
+ import { NEEDLE_progressive } from "./NEEDLE_progressive";
16
16
 
17
17
  export function registerComponentExtension(loader: GLTFLoader): NEEDLE_components {
18
18
  const ext = new NEEDLE_components();
@@ -40,7 +40,7 @@ export function registerExtensions(loader: GLTFLoader, context: Context, sourceI
40
40
  loader.register(p => new NEEDLE_lighting_settings(p, sourceId, context));
41
41
  loader.register(p => new NEEDLE_techniques_webgl(p, sourceId));
42
42
  loader.register(p => new NEEDLE_render_objects(p, sourceId));
43
- loader.register(p => new NEEDLE_deferred_texture(p, sourceId, context));
43
+ loader.register(p => new NEEDLE_progressive(p, sourceId, context));
44
44
  loader.register(p => new EXT_texture_exr(p));
45
45
 
46
46
  const setPointerResolverFunction = loader["setAnimationPointerResolver"];
@@ -9,6 +9,7 @@ import { XRSessionMode } from "../engine/engine_setup";
9
9
  import { ICamera } from "../engine/engine_types"
10
10
  import { showBalloonMessage } from "../engine/debug/debug";
11
11
  import { getWorldPosition } from "../engine/engine_three_utils";
12
+ import { Gizmos } from "../engine/engine_gizmos";
12
13
 
13
14
  export enum ClearFlags {
14
15
  Skybox = 1,
@@ -17,6 +18,7 @@ export enum ClearFlags {
17
18
  }
18
19
 
19
20
  const debug = getParam("debugcam");
21
+ const debugscreenpointtoray = getParam("debugscreenpointtoray");
20
22
 
21
23
  export class Camera extends Behaviour implements ICamera {
22
24
 
@@ -52,6 +54,7 @@ export class Camera extends Behaviour implements ICamera {
52
54
  this._cam.updateProjectionMatrix();
53
55
  }
54
56
  }
57
+ private _nearClipPlane: number = 0.1;
55
58
 
56
59
  get farClipPlane(): number { return this._farClipPlane; }
57
60
  @serializable()
@@ -63,6 +66,7 @@ export class Camera extends Behaviour implements ICamera {
63
66
  this._cam.updateProjectionMatrix();
64
67
  }
65
68
  }
69
+ private _farClipPlane: number = 1000;
66
70
 
67
71
  @serializable()
68
72
  public get clearFlags(): ClearFlags {
@@ -94,8 +98,33 @@ export class Camera extends Behaviour implements ICamera {
94
98
  }
95
99
  private _cullingMask: number = 0xffffffff;
96
100
 
97
- private _nearClipPlane: number = 0.1;
98
- private _farClipPlane: number = 1000;
101
+ @serializable()
102
+ public set backgroundBlurriness(val: number | undefined) {
103
+ if(val === this._backgroundBlurriness) return;
104
+ if (val === undefined)
105
+ this._backgroundBlurriness = undefined;
106
+ else
107
+ this._backgroundBlurriness = Math.min(Math.max(val, 0), 1);
108
+ this.applyClearFlagsIfIsActiveCamera();
109
+ }
110
+ public get backgroundBlurriness() : number | undefined {
111
+ return this._backgroundBlurriness;
112
+ }
113
+ private _backgroundBlurriness?: number;
114
+
115
+ @serializable()
116
+ public set backgroundIntensity(val: number | undefined) {
117
+ if(val === this._backgroundIntensity) return;
118
+ if (val === undefined)
119
+ this._backgroundIntensity = undefined;
120
+ else
121
+ this._backgroundIntensity = Math.min(Math.max(val, 0), 10);
122
+ this.applyClearFlagsIfIsActiveCamera();
123
+ }
124
+ public get backgroundIntensity() : number | undefined {
125
+ return this._backgroundIntensity;
126
+ }
127
+ private _backgroundIntensity?: number;
99
128
 
100
129
  @serializable(RGBAColor)
101
130
  public get backgroundColor(): RGBAColor | null {
@@ -130,14 +159,15 @@ export class Camera extends Behaviour implements ICamera {
130
159
  private static _origin: THREE.Vector3 = new THREE.Vector3();
131
160
  private static _direction: THREE.Vector3 = new THREE.Vector3();
132
161
  public screenPointToRay(x: number, y: number, ray?: Ray): Ray {
162
+ let cam = this.cam;
133
163
  const origin = Camera._origin;
134
164
  origin.set(x, y, -1);
135
165
  this.context.input.convertScreenspaceToRaycastSpace(origin);
166
+ if(debugscreenpointtoray) console.log("screenPointToRay", x.toFixed(2), y.toFixed(2), "now:", origin.x.toFixed(2), origin.y.toFixed(2), "isInXR:" + this.context.isInXR);
136
167
  origin.z = -1;
137
- origin.unproject(this.cam);
138
-
168
+ origin.unproject(cam);
139
169
  const dir = Camera._direction.set(origin.x, origin.y, origin.z);
140
- const camPosition = getWorldPosition(this.cam);
170
+ const camPosition = getWorldPosition(cam);
141
171
  dir.sub(camPosition);
142
172
  dir.normalize();
143
173
  if (ray) {
@@ -153,6 +183,17 @@ export class Camera extends Behaviour implements ICamera {
153
183
  if (!this.sourceId) {
154
184
  console.warn("Camera has no source - the camera should be exported inside a gltf", this.name);
155
185
  }
186
+
187
+ if(debugscreenpointtoray){
188
+ window.addEventListener("pointerdown", evt => {
189
+ const px = evt.clientX;
190
+ const py = evt.clientY;
191
+ console.log("touch", px.toFixed(2), py.toFixed(2))
192
+ const ray = this.screenPointToRay(px, py);
193
+ const randomHex = "#" + Math.floor(Math.random()*16777215).toString(16);
194
+ Gizmos.DrawRay(ray.origin, ray.direction, randomHex, 10);
195
+ });
196
+ }
156
197
  }
157
198
 
158
199
  onEnable(): void {
@@ -220,6 +261,13 @@ export class Camera extends Behaviour implements ICamera {
220
261
  }
221
262
  }
222
263
  this.enableSkybox();
264
+
265
+ if (this._backgroundBlurriness !== undefined)
266
+ this.context.scene.backgroundBlurriness = this._backgroundBlurriness;
267
+ if (this._backgroundIntensity !== undefined)
268
+ //@ts-ignore
269
+ this.context.scene.backgroundIntensity = this._backgroundIntensity;
270
+
223
271
  break;
224
272
  case ClearFlags.SolidColor:
225
273
  if (this._backgroundColor) {
@@ -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 {
@@ -292,6 +292,7 @@ export class Light extends Behaviour implements ILight {
292
292
 
293
293
  if (lightAlreadyCreated && !this.light) {
294
294
  this.light = this.gameObject as unknown as THREE.Light;
295
+ this._intensity = this.light.intensity;
295
296
 
296
297
  switch (this.type) {
297
298
  case LightType.Directional:
@@ -344,7 +345,10 @@ export class Light extends Behaviour implements ILight {
344
345
 
345
346
 
346
347
  if (this.light) {
347
- this._intensity = this.light.intensity;
348
+ if (this._intensity >= 0)
349
+ this.light.intensity = this._intensity;
350
+ else
351
+ this._intensity = this.light.intensity;
348
352
 
349
353
  if (this.shadows !== LightShadows.None) {
350
354
  this.light.castShadow = true;
@@ -11,6 +11,9 @@ import { getParam, isMobileDevice } from "../engine/engine_utils";
11
11
 
12
12
  const freeCam = getParam("freecam");
13
13
 
14
+ const disabledKeys = { LEFT: "", UP: "", RIGHT: "", BOTTOM: "" };
15
+ let defaultKeys: any = undefined;
16
+
14
17
  export class OrbitControls extends Behaviour {
15
18
  public get controls() {
16
19
  return this._controls;
@@ -73,6 +76,7 @@ export class OrbitControls extends Behaviour {
73
76
  if (cam)
74
77
  this._cameraObject = cam;
75
78
  this._controls = new ThreeOrbitControls(cam!, this.context.renderer.domElement);
79
+ if (defaultKeys === undefined) defaultKeys = { ...this._controls.keys };
76
80
  }
77
81
 
78
82
  if (this._controls) {
@@ -80,12 +84,11 @@ export class OrbitControls extends Behaviour {
80
84
  this.enablePan = true;
81
85
  this.enableZoom = true;
82
86
  this.middleClickToFocus = true;
83
- if(isMobileDevice()) this.doubleClickToFocus = true;
87
+ if (isMobileDevice()) this.doubleClickToFocus = true;
84
88
  }
85
89
 
86
90
  this._controls.enableDamping = this.enableDamping;
87
- //@ts-ignore (not in types)
88
- this._controls.enableKeys = this.enableKeys;
91
+ this._controls.keys = this.enableKeys ? defaultKeys : disabledKeys;
89
92
  this._controls.autoRotate = this.autoRotate;
90
93
  this._controls.autoRotateSpeed = this.autoRotateSpeed;
91
94
  this._controls.enableZoom = this.enableZoom;
@@ -164,6 +167,7 @@ export class OrbitControls extends Behaviour {
164
167
  this._inputs += 1;
165
168
  }
166
169
  if (this._inputs > 0) {
170
+ this.autoRotate = false;
167
171
  this._controls.autoRotate = false;
168
172
  this._lerpCameraToTarget = false;
169
173
  this._lerpToTargetPosition = false;
@@ -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,12 +2,12 @@ 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";
9
9
  import { NEEDLE_render_objects } from "../engine/extensions/NEEDLE_render_objects";
10
- import { NEEDLE_deferred_texture } from "../engine/extensions/NEEDLE_deferred_texture";
10
+ import { NEEDLE_progressive } from "../engine/extensions/NEEDLE_progressive";
11
11
  import { NEED_UPDATE_INSTANCE_KEY } from "../engine/engine_instancing";
12
12
  import { IRenderer, ISharedMaterials } from "../engine/engine_types";
13
13
  import { debug, ReflectionProbe } from "./ReflectionProbe";
@@ -465,11 +465,11 @@ export class Renderer extends Behaviour implements IRenderer {
465
465
  if (debugProgressiveLoading) {
466
466
  console.log("Load material LOD (with delay)", material.name);
467
467
  setTimeout(() => {
468
- NEEDLE_deferred_texture.assignTextureLOD(this.context, this.sourceId, material);
468
+ NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
469
469
  }, 2000);
470
470
  }
471
471
  else {
472
- NEEDLE_deferred_texture.assignTextureLOD(this.context, this.sourceId, material);
472
+ NEEDLE_progressive.assignTextureLOD(this.context, this.sourceId, material);
473
473
  }
474
474
  }
475
475
 
@@ -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