@needle-tools/engine 3.44.1 → 3.44.3

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 (28) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/components.needle.json +1 -1
  3. package/dist/needle-engine.js +3752 -3743
  4. package/dist/needle-engine.light.js +2891 -2882
  5. package/dist/needle-engine.light.min.js +93 -93
  6. package/dist/needle-engine.light.umd.cjs +131 -131
  7. package/dist/needle-engine.min.js +98 -98
  8. package/dist/needle-engine.umd.cjs +137 -137
  9. package/lib/engine-components/AnimatorController.js +5 -1
  10. package/lib/engine-components/AnimatorController.js.map +1 -1
  11. package/lib/engine-components/DragControls.js +4 -2
  12. package/lib/engine-components/DragControls.js.map +1 -1
  13. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +7 -6
  14. package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js.map +1 -1
  15. package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +2 -0
  16. package/lib/engine-components/postprocessing/Effects/Tonemapping.js +14 -3
  17. package/lib/engine-components/postprocessing/Effects/Tonemapping.js.map +1 -1
  18. package/lib/engine-components/postprocessing/PostProcessingEffect.js +1 -1
  19. package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
  20. package/lib/engine-components/postprocessing/VolumeParameter.js +4 -4
  21. package/lib/engine-components/postprocessing/VolumeParameter.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/engine-components/AnimatorController.ts +3 -1
  24. package/src/engine-components/DragControls.ts +4 -2
  25. package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +7 -6
  26. package/src/engine-components/postprocessing/Effects/Tonemapping.ts +18 -3
  27. package/src/engine-components/postprocessing/PostProcessingEffect.ts +1 -1
  28. package/src/engine-components/postprocessing/VolumeParameter.ts +3 -4
@@ -1 +1 @@
1
- {"version":3,"file":"VolumeParameter.js","sourceRoot":"","sources":["../../../src/engine-components/postprocessing/VolumeParameter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VolumeParameter.js","sourceRoot":"","sources":["../../../src/engine-components/postprocessing/VolumeParameter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "3.44.1",
3
+ "version": "3.44.3",
4
4
  "description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in",
5
5
  "main": "dist/needle-engine.umd.cjs",
6
6
  "type": "module",
@@ -413,7 +413,9 @@ export class AnimatorController {
413
413
 
414
414
  let makeTransition = false;
415
415
  if (transition.hasExitTime) {
416
- makeTransition = normalizedTime >= exitTime;
416
+ if (action.timeScale > 0) makeTransition = normalizedTime >= transition.exitTime;
417
+ // When the animation is playing backwards we need to check exit time inverted
418
+ else if (action.timeScale < 0) makeTransition = 1 - normalizedTime >= transition.exitTime;
417
419
  }
418
420
  else {
419
421
  makeTransition = true;
@@ -963,9 +963,11 @@ class DragPointerHandler implements IDragHandler {
963
963
  if (hit.face) {
964
964
  const dragTimeThreshold = 0.15;
965
965
  const dragTimeSatisfied = this._draggedOverObjectDuration >= dragTimeThreshold;
966
+ const dragDistance = 0.001;
967
+ const dragDistanceSatisfied = this._totalMovement.length() >= dragDistance;
966
968
  // Adjust drag plane if we're dragging over a different object (for a certain amount of time)
967
969
  // or if the surface normal changed
968
- if (dragTimeSatisfied &&
970
+ if ((dragTimeSatisfied || dragDistanceSatisfied) &&
969
971
  (this._draggedOverObjectLastSetUp !== this._draggedOverObject
970
972
  || this._draggedOverObjectLastNormal.dot(hit.face.normal) < 0.999999
971
973
  // if we're dragging on a flat surface with different levels (like the sandbox floor)
@@ -1004,7 +1006,7 @@ class DragPointerHandler implements IDragHandler {
1004
1006
  // we want to return here and wait until the drag has been going on for a bit
1005
1007
  // Otherwise the object will either immediately change it's position (when the user starts dragging)
1006
1008
  // Or interpolate to a wrong position for a short moment
1007
- else if (!dragTimeSatisfied) {
1009
+ else if (!(dragTimeSatisfied || dragDistanceSatisfied)) {
1008
1010
  return;
1009
1011
  }
1010
1012
  }
@@ -30,7 +30,6 @@ export class ColorAdjustments extends PostProcessingEffect {
30
30
  v = Math.pow(2.0, v);
31
31
  return v;
32
32
  }
33
- this.postExposure.defaultValue = 0;
34
33
 
35
34
  this.contrast.valueProcessor = (v: number) => {
36
35
  let divisor = 1;
@@ -62,16 +61,18 @@ export class ColorAdjustments extends PostProcessingEffect {
62
61
 
63
62
 
64
63
  // find the ToneMapping effect because we need it to apply post exposure
65
- const hasTonemapping = this.postprocessingContext?.components.find(c => c instanceof ToneMappingEffect) as ToneMappingEffect;
66
- if(!hasTonemapping){
67
- this.postprocessingContext?.components.push(new ToneMappingEffect());
64
+ let tonemappingEffect = this.postprocessingContext?.components.find(c => c instanceof ToneMappingEffect) as ToneMappingEffect;
65
+ if (!tonemappingEffect) {
66
+ tonemappingEffect = new ToneMappingEffect();
67
+ this.postprocessingContext?.components.push(tonemappingEffect);
68
68
  }
69
69
 
70
70
  // We need this effect if someone uses ACES or AgX tonemapping;
71
71
  // problem is that we CAN'T use this effect for the "Linear" case, the package expects that in this case you remove the effect
72
72
  this.postExposure!.onValueChanged = (v) => {
73
- if (this.postExposure.overrideState)
74
- this.context.renderer.toneMappingExposure = v;
73
+ if (this.postExposure.overrideState) {
74
+ tonemappingEffect.exposure.value = v;
75
+ }
75
76
  };
76
77
 
77
78
  const brightnesscontrast = new BrightnessContrastEffect();
@@ -73,6 +73,10 @@ export class ToneMappingEffect extends PostProcessingEffect {
73
73
  @serializable(VolumeParameter)
74
74
  readonly mode: VolumeParameter = new VolumeParameter(undefined);
75
75
 
76
+ @serializable(VolumeParameter)
77
+ readonly exposure: VolumeParameter = new VolumeParameter(1);
78
+
79
+ /** Set the tonemapping mode to e.g. "agx" */
76
80
  setMode(mode: NEToneMappingModeNames) {
77
81
  const enumValue = NEToneMappingMode[mode as NEToneMappingModeNames];
78
82
  if (enumValue === undefined) {
@@ -94,6 +98,7 @@ export class ToneMappingEffect extends PostProcessingEffect {
94
98
  }
95
99
 
96
100
  onCreateEffect(): EffectProviderResult | undefined {
101
+
97
102
  // TODO: this should be done in the PostProcessingHandler
98
103
  if (this.postprocessingContext) {
99
104
  for (const other of this.postprocessingContext.components) {
@@ -107,6 +112,7 @@ export class ToneMappingEffect extends PostProcessingEffect {
107
112
  }
108
113
  }
109
114
 
115
+
110
116
  // ensure the effect tonemapping value is initialized
111
117
  if (this.mode.isInitialized == false) {
112
118
  const init = threeToNeToneMapping(this.context.renderer.toneMapping);
@@ -120,15 +126,24 @@ export class ToneMappingEffect extends PostProcessingEffect {
120
126
  this.mode.onValueChanged = (newValue) => {
121
127
  const threeMode = toThreeToneMapping(newValue);
122
128
  tonemapping.mode = threeToneMappingToEffectMode(threeMode);
123
- if (debug) console.log("ToneMapping mode changed to", newValue, NEToneMappingMode[threeMode], ToneMappingMode[tonemapping.mode]);
129
+ if (debug) console.log("ToneMapping mode changed to", NEToneMappingMode[newValue], threeMode, tonemapping.mode);
124
130
  };
125
- if (debug) console.log("Use ToneMapping", this.context.renderer.toneMapping, this.mode.value, NEToneMappingMode[threeMode], ToneMappingMode[tonemapping.mode]);
131
+ if (debug) console.log("Use ToneMapping", NEToneMappingMode[this.mode.value], threeMode, tonemapping.mode, "renderer.tonemapping: " + this.context.renderer.toneMapping);
132
+
133
+
134
+ this.exposure.onValueChanged = (newValue) => {
135
+ this.context.renderer.toneMappingExposure = newValue;
136
+ };
137
+
126
138
  return tonemapping;
127
139
  }
128
140
 
129
141
 
130
142
  onBeforeRender(): void {
131
- this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
143
+ if (this.mode.overrideState)
144
+ this.context.renderer.toneMapping = toThreeToneMapping(this.mode.value);
145
+ if (this.exposure.overrideState)
146
+ this.context.renderer.toneMappingExposure = this.exposure.value;
132
147
  }
133
148
 
134
149
 
@@ -59,7 +59,7 @@ export abstract class PostProcessingEffect extends Component implements IEffectP
59
59
  const value = params[key];
60
60
  const param = this[key];
61
61
  if (param instanceof VolumeParameter) {
62
- param.value = value;
62
+ param.initialize(value);
63
63
  }
64
64
  // allow assigning values to properties that are not VolumeParameters
65
65
  // this is useful when effects are created in code
@@ -49,6 +49,8 @@ export class VolumeParameter {
49
49
  return this._valueRaw;
50
50
  }
51
51
  set value(val: any) {
52
+ // When a user creates an effect and then just sets a VolumeParameter via `effect.param.value` we want to use this value as the initial value
53
+ if (!this.isInitialized) this.initialize(val);
52
54
  this.processValue(val, false);
53
55
  }
54
56
  private _value: any;
@@ -108,9 +110,6 @@ export class VolumeParameter {
108
110
  if (this.onValueChanged) {
109
111
  this.onValueChanged(val, oldValue, this);
110
112
  }
111
- else if (debug) {
112
- console.log("VolumeParameter: onValueChanged not set");
113
- }
114
113
  }
115
114
 
116
115
  private testIfValueChanged(newValue: any): boolean {
@@ -147,7 +146,7 @@ class VolumeParameterSerializer extends TypeSerializer {
147
146
 
148
147
  if (typeof data === "object" && "value" in data) {
149
148
  const value = data.value;
150
- parameter.value = value;
149
+ parameter.initialize(value);
151
150
  parameter.overrideState = data.overrideState;
152
151
  }
153
152
  else {