@needle-tools/engine 3.2.5-alpha.1 → 3.2.7-alpha

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 (68) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/needle-engine.js +6145 -6019
  3. package/dist/needle-engine.min.js +275 -275
  4. package/dist/needle-engine.umd.cjs +273 -273
  5. package/lib/engine/api.d.ts +3 -1
  6. package/lib/engine/api.js +2 -1
  7. package/lib/engine/api.js.map +1 -1
  8. package/lib/engine/engine_context.d.ts +4 -2
  9. package/lib/engine/engine_context.js +5 -3
  10. package/lib/engine/engine_context.js.map +1 -1
  11. package/lib/engine/engine_element_loading.js +0 -1
  12. package/lib/engine/engine_element_loading.js.map +1 -1
  13. package/lib/engine/engine_mainloop_utils.js +4 -2
  14. package/lib/engine/engine_mainloop_utils.js.map +1 -1
  15. package/lib/engine/engine_physics.js +24 -1
  16. package/lib/engine/engine_physics.js.map +1 -1
  17. package/lib/engine/engine_scenelighting.d.ts +68 -0
  18. package/lib/engine/{engine_rendererdata.js → engine_scenelighting.js} +94 -24
  19. package/lib/engine/engine_scenelighting.js.map +1 -0
  20. package/lib/engine/engine_serialization_core.d.ts +5 -8
  21. package/lib/engine/engine_serialization_core.js.map +1 -1
  22. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +4 -1
  23. package/lib/engine/extensions/NEEDLE_lighting_settings.js +45 -21
  24. package/lib/engine/extensions/NEEDLE_lighting_settings.js.map +1 -1
  25. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +3 -3
  26. package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
  27. package/lib/engine/extensions/index.d.ts +5 -0
  28. package/lib/engine/extensions/index.js +6 -0
  29. package/lib/engine/extensions/index.js.map +1 -0
  30. package/lib/engine-components/Component.js +28 -3
  31. package/lib/engine-components/Component.js.map +1 -1
  32. package/lib/engine-components/Renderer.js +1 -1
  33. package/lib/engine-components/Renderer.js.map +1 -1
  34. package/lib/engine-components/SceneSwitcher.d.ts +2 -0
  35. package/lib/engine-components/SceneSwitcher.js +16 -4
  36. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  37. package/lib/engine-components/api.d.ts +1 -0
  38. package/lib/engine-components/api.js +1 -0
  39. package/lib/engine-components/api.js.map +1 -1
  40. package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +1 -1
  41. package/lib/engine-components/postprocessing/VolumeParameter.d.ts +1 -1
  42. package/lib/engine-components/postprocessing/VolumeParameter.js +7 -6
  43. package/lib/engine-components/postprocessing/VolumeParameter.js.map +1 -1
  44. package/lib/engine-components/webxr/index.d.ts +1 -0
  45. package/lib/engine-components/webxr/index.js +1 -0
  46. package/lib/engine-components/webxr/index.js.map +1 -1
  47. package/lib/tsconfig.tsbuildinfo +1 -1
  48. package/package.json +1 -1
  49. package/src/engine/api.ts +3 -1
  50. package/src/engine/codegen/register_types.js +2 -2
  51. package/src/engine/engine_context.ts +5 -3
  52. package/src/engine/engine_element_loading.ts +0 -1
  53. package/src/engine/engine_mainloop_utils.ts +4 -2
  54. package/src/engine/engine_physics.ts +20 -1
  55. package/src/engine/{engine_rendererdata.ts → engine_scenelighting.ts} +95 -24
  56. package/src/engine/engine_serialization_core.ts +7 -8
  57. package/src/engine/extensions/NEEDLE_lighting_settings.ts +53 -26
  58. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +3 -3
  59. package/src/engine/extensions/index.ts +5 -0
  60. package/src/engine-components/Component.ts +28 -3
  61. package/src/engine-components/Renderer.ts +1 -1
  62. package/src/engine-components/SceneSwitcher.ts +14 -4
  63. package/src/engine-components/api.ts +1 -0
  64. package/src/engine-components/postprocessing/PostProcessingHandler.ts +1 -1
  65. package/src/engine-components/postprocessing/VolumeParameter.ts +7 -6
  66. package/src/engine-components/webxr/index.ts +1 -0
  67. package/lib/engine/engine_rendererdata.d.ts +0 -49
  68. package/lib/engine/engine_rendererdata.js.map +0 -1
@@ -9,6 +9,7 @@ import { addNewComponent, destroyComponentInstance, findObjectOfType, findObject
9
9
  import { findByGuid, destroy, InstantiateOptions, instantiate, HideFlags, foreachComponent, markAsInstancedRendered, isActiveInHierarchy, isActiveSelf, isUsingInstancing, setActive, isDestroyed } from "../engine/engine_gameobject";
10
10
 
11
11
  import { Euler, Object3D, Quaternion, Scene, Vector3 } from "three";
12
+ import { showBalloonWarning, isDevEnvironment } from "../engine/debug";
12
13
 
13
14
  // export interface ISerializationCallbackReceiver {
14
15
  // onBeforeSerialize?(): object | void;
@@ -470,7 +471,19 @@ export class Component implements IComponent, EventTarget {
470
471
 
471
472
  /** @internal */
472
473
  __internalEnable(): boolean {
473
- if (this.__didEnable) return false;
474
+ if (this.__destroyed) {
475
+ if (isDevEnvironment()) {
476
+ console.warn("[Needle Engine Dev] Trying to enable destroyed component");
477
+ }
478
+ return false;
479
+ }
480
+ // Don't change enable before awake
481
+ // But a user can change enable during awake
482
+ if (!this.__didAwake) return false;
483
+ if (this.__didEnable) {
484
+ this.__isEnabled = true;
485
+ return false;
486
+ }
474
487
  // console.trace("INTERNAL ENABLE");
475
488
  this.__didEnable = true;
476
489
  this.onEnable();
@@ -480,7 +493,13 @@ export class Component implements IComponent, EventTarget {
480
493
 
481
494
  /** @internal */
482
495
  __internalDisable() {
483
- if (!this.__didEnable) return;
496
+ // Don't change enable before awake
497
+ // But a user can change enable during awake
498
+ if (!this.__didAwake) return;
499
+ if (!this.__didEnable) {
500
+ this.__isEnabled = false;
501
+ return;
502
+ }
484
503
  this.__didEnable = false;
485
504
  this.onDisable();
486
505
  this.__isEnabled = false;
@@ -496,9 +515,15 @@ export class Component implements IComponent, EventTarget {
496
515
 
497
516
 
498
517
  get enabled(): boolean {
499
- return this.__isEnabled ?? true; // if it has no enabled field it is always enabled
518
+ return typeof this.__isEnabled === "boolean" ? this.__isEnabled : true; // if it has no enabled field it is always enabled
500
519
  }
501
520
  set enabled(val: boolean) {
521
+ if (this.__destroyed) {
522
+ if (isDevEnvironment()) {
523
+ console.warn(`[Needle Engine Dev] Trying to ${val ? "enable" : "disable"} destroyed component`);
524
+ }
525
+ return;
526
+ }
502
527
  // when called from animationclip we receive numbers
503
528
  // due to interpolation they can be anything between 0 and 1
504
529
  if (typeof val === "number") {
@@ -617,7 +617,7 @@ export class Renderer extends Behaviour implements IRenderer {
617
617
 
618
618
  if (material.envMapIntensity !== undefined) {
619
619
  const factor = this.hasLightmap ? Math.PI : 1;
620
- material.envMapIntensity = Math.max(0, this.context.rendererData.environmentIntensity / factor);
620
+ material.envMapIntensity = Math.max(0, this.context.sceneLighting.environmentIntensity / factor);
621
621
  }
622
622
  // if (this._reflectionProbe?.texture) {
623
623
  // material.envMap = this._reflectionProbe.texture;
@@ -1,5 +1,4 @@
1
1
  import { AssetReference } from "../engine/engine_addressables";
2
- import { NeedleEngineHTMLElement } from "../engine/engine_element";
3
2
  import { InputEvents } from "../engine/engine_input";
4
3
  import { isLocalNetwork } from "../engine/engine_networking_utils";
5
4
  import { ContextEvent, ContextRegistry } from "../engine/engine_context_registry";
@@ -11,9 +10,14 @@ const debug = getParam("debugsceneswitcher");
11
10
 
12
11
  const ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME = "scene";
13
12
 
14
- ContextRegistry.registerCallback(ContextEvent.ContextRegistered, _ => {
15
- if (!NeedleEngineHTMLElement.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
16
- NeedleEngineHTMLElement.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
13
+ ContextRegistry.registerCallback(ContextEvent.ContextRegistered, async _ => {
14
+ // We need to defer import to not get issues with circular dependencies
15
+ import("../engine/engine_element").then(res => {
16
+ const webcomponent = res.NeedleEngineHTMLElement;
17
+ if(debug) console.log("SceneSwitcher: registering scene attribute", webcomponent.observedAttributes);
18
+ if (!webcomponent.observedAttributes.includes(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME))
19
+ webcomponent.observedAttributes.push(ENGINE_ELEMENT_SCENE_ATTRIBUTE_NAME);
20
+ });
17
21
  });
18
22
 
19
23
  const couldNotLoadScenePromise = Promise.resolve(false);
@@ -42,6 +46,10 @@ export class SceneSwitcher extends Behaviour {
42
46
  @serializable()
43
47
  useSwipe: boolean = true;
44
48
 
49
+ /** when enabled will automatically apply the environment scene lights */
50
+ @serializable()
51
+ useSceneLighting: boolean = true;
52
+
45
53
 
46
54
  private _currentIndex: number = -1;
47
55
  private _currentScene: AssetReference | undefined = undefined;
@@ -191,6 +199,8 @@ export class SceneSwitcher extends Behaviour {
191
199
  }
192
200
  if (this._currentIndex === index) {
193
201
  GameObject.add(scene.asset, this.gameObject);
202
+ if (this.useSceneLighting)
203
+ this.context.sceneLighting.enable(scene)
194
204
  // save the loaded scene as an url parameter
195
205
  if (this.queryParameterName?.length)
196
206
  setParamWithoutReload(this.queryParameterName, index.toString(), this.useHistory);
@@ -4,6 +4,7 @@ export * from "./codegen/components";
4
4
  // We dont want to export everything in the extensions
5
5
  export * from "./js-extensions/RGBAColor";
6
6
  export * from "./js-extensions/Object3D";
7
+ export * from "./XRFlag"
7
8
 
8
9
  export * from "./export"
9
10
  export * from "./postprocessing"
@@ -5,7 +5,7 @@ import { BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, Depth
5
5
  import { showBalloonWarning } from "../../engine/debug/debug";
6
6
  import { Camera } from "../Camera";
7
7
  import { PostProcessingEffect } from "./PostProcessingEffect";
8
- import { Constructor } from "../../engine/engine_serialization_core";
8
+ import { Constructor } from "../../engine/engine_types";
9
9
 
10
10
  const debug = getParam("debugpost");
11
11
 
@@ -17,7 +17,7 @@ export class VolumeParameter {
17
17
  set overrideState(val: boolean) {
18
18
  if (this._active === val) return;
19
19
  this._active = val;
20
- const value = val ? this._lastActiveSetValue : this._defaultValue;
20
+ const value = val ? this._valueRaw : this._defaultValue;
21
21
  this.processValue(value, true);
22
22
  }
23
23
  private _active: boolean = true;
@@ -26,13 +26,13 @@ export class VolumeParameter {
26
26
 
27
27
  @serializable()
28
28
  get value() {
29
- return this._value;
29
+ return this._valueRaw;
30
30
  }
31
31
  set value(val: any) {
32
32
  this.processValue(val, false);
33
33
  }
34
34
  private _value: any;
35
- private _lastActiveSetValue?: any;
35
+ private _valueRaw?: any;
36
36
 
37
37
 
38
38
  set defaultValue(val: any) {
@@ -43,7 +43,7 @@ export class VolumeParameter {
43
43
 
44
44
  /** enforce the value to be set and onValueChanged to be called if assigned */
45
45
  __init() {
46
- this.processValue(this._lastActiveSetValue, true);
46
+ this.processValue(this._valueRaw, true);
47
47
  }
48
48
 
49
49
  /** called to modify a changing value before it is saved */
@@ -65,9 +65,10 @@ export class VolumeParameter {
65
65
  // with the value that is expected to received when the parameter is disabled)
66
66
  this._value = this._defaultValue;
67
67
  val = this._defaultValue;
68
+ this._valueRaw = val;
68
69
  }
69
70
  else {
70
- this._lastActiveSetValue = val;
71
+ this._valueRaw = val;
71
72
  if (this._active && this.valueProcessor)
72
73
  val = this.valueProcessor(val);
73
74
  this._value = val;
@@ -80,7 +81,7 @@ export class VolumeParameter {
80
81
 
81
82
  private testIfValueChanged(newValue: any): boolean {
82
83
 
83
- if (this._lastActiveSetValue === newValue)
84
+ if (this._valueRaw === newValue)
84
85
  return false;
85
86
 
86
87
  // TODO: may need checks for colors or vectors (check by xyz,rgb because they might come in as anonymous objects via editor modifications)
@@ -1,3 +1,4 @@
1
1
  export * from "./WebXR";
2
2
  export * from "./WebXRPlaneTracking";
3
+ export * from "./WebXRImageTracking";
3
4
  export * from "./WebXRController";
@@ -1,49 +0,0 @@
1
- import { Vector4, WebGLCubeRenderTarget, Texture, LightProbe } from "three";
2
- import { Context } from "./engine_setup";
3
- import { SceneLightSettings } from "./extensions/NEEDLE_lighting_settings";
4
- import { SourceIdentifier } from "./engine_types";
5
- export declare type SphericalHarmonicsData = {
6
- array: number[];
7
- texture: WebGLCubeRenderTarget | Texture;
8
- lightProbe?: LightProbe;
9
- };
10
- export declare enum AmbientMode {
11
- Skybox = 0,
12
- Trilight = 1,
13
- Flat = 3,
14
- Custom = 4
15
- }
16
- export declare enum DefaultReflectionMode {
17
- Skybox = 0,
18
- Custom = 1
19
- }
20
- export declare class RendererData {
21
- private context;
22
- constructor(context: Context);
23
- private _currentReflectionId?;
24
- private sceneLightSettings?;
25
- private preUpdate;
26
- private _timevec4;
27
- get timeVec4(): Vector4;
28
- get environmentIntensity(): number;
29
- registerSceneLightSettings(sceneLightSettings: SceneLightSettings): void;
30
- registerReflection(sourceId: SourceIdentifier, reflectionTexture: Texture): void;
31
- getReflection(sourceId: SourceIdentifier): LightData | null | undefined;
32
- enableReflection(sourceId: SourceIdentifier): void;
33
- disableReflection(sourceId?: SourceIdentifier): void;
34
- getSceneLightingData(sourceId: SourceIdentifier): Promise<SphericalHarmonicsData>;
35
- private _waitPromise?;
36
- private _lighting;
37
- }
38
- export declare class LightData {
39
- get Source(): Texture;
40
- get Array(): number[] | undefined;
41
- private _context;
42
- private _source;
43
- private _sphericalHarmonics;
44
- private _sphericalHarmonicsArray?;
45
- private _ambientScale;
46
- private _lightProbe?;
47
- constructor(context: Context, tex: Texture, ambientScale?: number);
48
- getSphericalHarmonicsArray(intensityFactor?: number): SphericalHarmonicsData | null;
49
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine_rendererdata.js","sourceRoot":"","sources":["../../src/engine/engine_rendererdata.ts"],"names":[],"mappings":"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"}