@needle-tools/engine 4.2.4 → 4.3.0-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 (69) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/components.needle.json +1 -1
  3. package/dist/needle-engine.bundle.js +3517 -3493
  4. package/dist/needle-engine.bundle.light.js +3520 -3496
  5. package/dist/needle-engine.bundle.light.min.js +109 -109
  6. package/dist/needle-engine.bundle.light.umd.cjs +112 -112
  7. package/dist/needle-engine.bundle.min.js +109 -109
  8. package/dist/needle-engine.bundle.umd.cjs +106 -106
  9. package/dist/needle-engine.d.ts +9 -9
  10. package/dist/needle-engine.js +471 -472
  11. package/dist/needle-engine.light.d.ts +9 -9
  12. package/dist/needle-engine.light.js +471 -472
  13. package/dist/needle-engine.light.min.js +1 -1
  14. package/dist/needle-engine.light.umd.cjs +1 -1
  15. package/dist/needle-engine.min.js +1 -1
  16. package/dist/needle-engine.umd.cjs +1 -1
  17. package/dist/three-examples.js +825 -794
  18. package/dist/three-examples.light.js +825 -794
  19. package/dist/three-examples.light.min.js +12 -12
  20. package/dist/three-examples.light.umd.cjs +10 -10
  21. package/dist/three-examples.min.js +12 -12
  22. package/dist/three-examples.umd.cjs +10 -10
  23. package/lib/engine/codegen/register_types.js +0 -2
  24. package/lib/engine/codegen/register_types.js.map +1 -1
  25. package/lib/engine/engine_addressables.d.ts +3 -0
  26. package/lib/engine/engine_addressables.js +18 -0
  27. package/lib/engine/engine_addressables.js.map +1 -1
  28. package/lib/engine/engine_input.d.ts +20 -1
  29. package/lib/engine/engine_input.js.map +1 -1
  30. package/lib/engine/engine_three_utils.d.ts +1 -1
  31. package/lib/engine/engine_three_utils.js +3 -0
  32. package/lib/engine/engine_three_utils.js.map +1 -1
  33. package/lib/engine-components/Collider.d.ts +6 -0
  34. package/lib/engine-components/Collider.js +34 -26
  35. package/lib/engine-components/Collider.js.map +1 -1
  36. package/lib/engine-components/ContactShadows.js +4 -2
  37. package/lib/engine-components/ContactShadows.js.map +1 -1
  38. package/lib/engine-components/DropListener.d.ts +4 -9
  39. package/lib/engine-components/DropListener.js +3 -3
  40. package/lib/engine-components/DropListener.js.map +1 -1
  41. package/lib/engine-components/OrbitControls.js +0 -1
  42. package/lib/engine-components/OrbitControls.js.map +1 -1
  43. package/lib/engine-components/SceneSwitcher.d.ts +8 -0
  44. package/lib/engine-components/SceneSwitcher.js +28 -8
  45. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  46. package/lib/engine-components/api.d.ts +1 -1
  47. package/lib/engine-components/codegen/components.d.ts +0 -1
  48. package/lib/engine-components/codegen/components.js +0 -1
  49. package/lib/engine-components/codegen/components.js.map +1 -1
  50. package/lib/engine-components/ui/EventSystem.d.ts +1 -0
  51. package/lib/engine-components/ui/EventSystem.js +8 -5
  52. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  53. package/lib/engine-components/ui/InputField.js +6 -5
  54. package/lib/engine-components/ui/InputField.js.map +1 -1
  55. package/package.json +1 -1
  56. package/plugins/vite/alias.js +6 -3
  57. package/src/engine/codegen/register_types.ts +0 -2
  58. package/src/engine/engine_addressables.ts +21 -0
  59. package/src/engine/engine_input.ts +20 -1
  60. package/src/engine/engine_three_utils.ts +6 -1
  61. package/src/engine-components/Collider.ts +37 -30
  62. package/src/engine-components/ContactShadows.ts +4 -2
  63. package/src/engine-components/DropListener.ts +5 -5
  64. package/src/engine-components/OrbitControls.ts +0 -1
  65. package/src/engine-components/SceneSwitcher.ts +30 -8
  66. package/src/engine-components/api.ts +1 -1
  67. package/src/engine-components/codegen/components.ts +0 -1
  68. package/src/engine-components/ui/EventSystem.ts +9 -7
  69. package/src/engine-components/ui/InputField.ts +7 -6
@@ -217,14 +217,15 @@ export class InputField extends Behaviour {
217
217
  }
218
218
  setTextFromInputField() {
219
219
  if (this.textComponent && InputField.htmlField) {
220
- if (this.textComponent.text !== InputField.htmlField.value) {
220
+ const oldValue = this.textComponent.text;
221
+ const newValue = InputField.htmlField.value;
222
+ const changed = this.textComponent.text !== InputField.htmlField.value;
223
+ this.textComponent.text = InputField.htmlField.value;
224
+ if (changed) {
221
225
  if (debug)
222
- console.log("VALUE CHANGED");
223
- const oldValue = this.textComponent.text;
224
- const newValue = InputField.htmlField.value;
226
+ console.log("[InputField] value changed:", newValue, oldValue);
225
227
  this.onValueChanged?.invoke(newValue, oldValue);
226
228
  }
227
- this.textComponent.text = InputField.htmlField.value;
228
229
  }
229
230
  }
230
231
  selectInputField() {
@@ -1 +1 @@
1
- {"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/engine-components/ui/InputField.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/engine-components/ui/InputField.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,KAAK,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,SAAS;IAErC,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,IAAI,CAAC,KAAa;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,KAAK,CAAC;YAChC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;;oBAC7D,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;aACnD;SACJ;IACL,CAAC;IAED,IAAI,SAAS;QACT,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC;IACtC,CAAC;IAGO,aAAa,CAAQ;IAGrB,WAAW,CAAQ;IAG3B,cAAc,CAAkB;IAGhC,SAAS,CAAkB;IAGnB,MAAM,CAAC,MAAM,GAAsB,IAAI,CAAC;IACxC,MAAM,CAAC,UAAU,GAAW,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,SAAS,GAA4B,IAAI,CAAC;IACjD,MAAM,CAAC,gBAAgB,GAAY,KAAK,CAAC;IAEzC,YAAY,CAAM;IAClB,WAAW,CAAM;IAEzB,KAAK;QACD,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;YACvB,UAAU,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvD,2EAA2E;YAC3E,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACzC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAC1C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;YAC3C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC3C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC;YACtD,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC5C,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,UAAU,CAAC,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,GAAG,IAAI,CAAC;YACxE,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC;YACxE,2DAA2D;YAC3D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC9C;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC/C;QACD,iFAAiF;QACjF,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,sEAAsE;QACtE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE;YACrD,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;SAC5D;QACD,IAAI,eAAe,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACtD;IACL,CAAC;IAED,SAAS;QACL,qFAAqF;QACrF,UAAU,CAAC,SAAS,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACtE,0EAA0E;QAC1E,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACzD;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,SAAS,EAAE;YACpD,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,qBAAqB,EAAE,CAAC;SAChC;aACI;YACD,IAAG,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC;YACpD,IAAG,IAAI,CAAC,WAAW;gBAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;SAChF;IACL,CAAC;IAED,sEAAsE;IACtE,MAAM;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,8DAA8D;IAC9D,QAAQ;QACJ,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,KAAuB;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAC/E,IAAG,YAAY;YAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,aAAa,CAAC,KAAuB;QACjC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,cAAc,CAAC,KAAK;QAChB,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1D,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;SACjE;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEO,CAAC,UAAU;QACf,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE;YAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;gBACzC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,GAAG,GAAG,EAAE;oBACtD,MAAM;iBACT;aACJ;YACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,KAAK,CAAC;SACT;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEO,UAAU;QACd,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACvC,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEnL,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;QAClC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;QAEzB,IAAI,IAAI,CAAC,WAAW;YAChB,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAE7D,IAAI,UAAU,CAAC,SAAS,EAAE;YAEtB,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC;YAC5D,IAAI,KAAK;gBACL,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAErE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;gBAC9C,IAAI,OAAO,EAAE;oBACT,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;iBACvC;aACJ;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;IACL,CAAC;IAEO,YAAY;QAChB,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACvC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;QAEzB,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,SAAS,EAAE;YACtB,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC9C;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAChF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE5D,IAAI,UAAU,CAAC,SAAS;YACpB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,2FAA2F;IAC3F,sEAAsE;IACtE,oCAAoC;IACpC,MAAM;QACF,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;SACnC;IACL,CAAC;IAEO,OAAO,CAAC,GAAkB;QAC9B,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACvC,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACtF,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;YAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;SACV;QACD,IAAI,UAAU,CAAC,SAAS,EAAE;YACtB,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,WAAW,EAAE;oBAClB,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;iBAC1F;aACJ;YACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;QACD,2BAA2B;QAC3B,oCAAoC;QACpC,4EAA4E;QAC5E,iBAAiB;QACjB,yBAAyB;QACzB,iCAAiC;QACjC,uCAAuC;QACvC,iBAAiB;QACjB,oCAAoC;QACpC,+BAA+B;QAC/B,iBAAiB;QACjB,IAAI;IACR,CAAC;IAEO,qBAAqB;QACzB,IAAI,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS,EAAE;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;YACvE,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;YAErD,IAAI,OAAO,EAAE;gBACT,IAAI,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC1E,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;aACnD;SACJ;IACL,CAAC;IAEO,gBAAgB;QACpB,IAAI,UAAU,CAAC,SAAS,EAAE;YACtB,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAA;YACvE,UAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7G,IAAI,eAAe,CAAC,KAAK,EAAE;gBACvB,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnD;gBACD,2GAA2G;gBAC3G,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;aACtD;SACJ;IACL,CAAC;IAEO,iBAAiB;QACrB,mFAAmF;QACnF,gDAAgD;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACvB,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,SAAS,EAAE,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU;YAC7F,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAChC,CAAC;;AAhPD;IADC,YAAY,CAAC,IAAI,CAAC;iDACU;AAG7B;IADC,YAAY,CAAC,IAAI,CAAC;+CACQ;AAG3B;IADC,YAAY,CAAC,SAAS,CAAC;kDACQ;AAGhC;IADC,YAAY,CAAC,SAAS,CAAC;6CACG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "4.2.4",
3
+ "version": "4.3.0-alpha",
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.min.js",
6
6
  "exports": {
@@ -57,6 +57,8 @@ export const needleViteAlias = (command, config, userSettings) => {
57
57
  }
58
58
  if (debug) {
59
59
  const outputFilePath = path.resolve(projectDir, 'node_modules/.vite/needle.alias.log');
60
+ const outputDirectory = path.dirname(outputFilePath);
61
+ if (!existsSync(outputDirectory)) mkdirSync(outputDirectory, { recursive: true });
60
62
  outputDebugFile = createWriteStream(outputFilePath, { flags: "a" });
61
63
  const timestamp = new Date().toISOString();
62
64
  outputDebugFile.write("\n\n\n--------------------------\n");
@@ -68,7 +70,7 @@ export const needleViteAlias = (command, config, userSettings) => {
68
70
  const aliasPlugin = {
69
71
  name: "needle-alias",
70
72
  config(config) {
71
- if (debug) console.log('[needle-alias] ProjectDirectory: ' + projectDir);
73
+ if (debug) console.log('[needle-alias] ProjectDirectory: ' + projectDir);
72
74
  if (!config.resolve) config.resolve = {};
73
75
  if (!config.resolve.alias) config.resolve.alias = {};
74
76
  const aliasDict = config.resolve.alias;
@@ -97,6 +99,7 @@ export const needleViteAlias = (command, config, userSettings) => {
97
99
  let lastImporter = "";
98
100
  /** This plugin logs all imports. This helps to find cases where incorrect folders are found/resolved. */
99
101
 
102
+ /** @type {import("vite").Plugin} */
100
103
  const debuggingPlugin = {
101
104
  name: "needle:alias-debug",
102
105
  // needs to run before regular resolver
@@ -115,9 +118,9 @@ export const needleViteAlias = (command, config, userSettings) => {
115
118
  // verbose logging for all imports
116
119
  if (lastImporter !== importer) {
117
120
  lastImporter = importer;
118
- log('[needle-alias] Resolving: ', importer, "(file)");
121
+ log(`[needle-alias] Resolving: ${importer} (file${options?.ssr ? ", SSR" : ""})`);
119
122
  }
120
- log('[needle-alias] ' + id);
123
+ log(`[needle-alias] ${id}`);
121
124
  return;
122
125
  },
123
126
  }
@@ -36,7 +36,6 @@ import { DeleteBox } from "../../engine-components/DeleteBox.js";
36
36
  import { Deletable } from "../../engine-components/DeleteBox.js";
37
37
  import { DeviceFlag } from "../../engine-components/DeviceFlag.js";
38
38
  import { DragControls } from "../../engine-components/DragControls.js";
39
- import { DropListenerAddedEvent } from "../../engine-components/DropListener.js";
40
39
  import { DropListener } from "../../engine-components/DropListener.js";
41
40
  import { Duplicatable } from "../../engine-components/Duplicatable.js";
42
41
  import { CallInfo } from "../../engine-components/EventList.js";
@@ -256,7 +255,6 @@ TypeStore.add("DeleteBox", DeleteBox);
256
255
  TypeStore.add("Deletable", Deletable);
257
256
  TypeStore.add("DeviceFlag", DeviceFlag);
258
257
  TypeStore.add("DragControls", DragControls);
259
- TypeStore.add("DropListenerAddedEvent", DropListenerAddedEvent);
260
258
  TypeStore.add("DropListener", DropListener);
261
259
  TypeStore.add("Duplicatable", Duplicatable);
262
260
  TypeStore.add("CallInfo", CallInfo);
@@ -164,6 +164,11 @@ export class AssetReference {
164
164
  return this._url;
165
165
  }
166
166
 
167
+ /** The name of the assigned url. This name is deduced from the url and might not reflect the actual name of the asset */
168
+ get urlName(): string {
169
+ return this._urlName;
170
+ };
171
+
167
172
  /**
168
173
  * @returns true if the uri is a valid URL (http, https, blob)
169
174
  */
@@ -180,6 +185,7 @@ export class AssetReference {
180
185
  private _asset: any;
181
186
  private _glbRoot?: Object3D | null;
182
187
  private _url: string;
188
+ private _urlName: string;
183
189
  private _progressListeners: ProgressCallback[] = [];
184
190
 
185
191
  private _hash?: string;
@@ -191,12 +197,27 @@ export class AssetReference {
191
197
  /** @internal */
192
198
  constructor(uri: string, hash?: string, asset: any = null) {
193
199
  this._url = uri;
200
+
201
+ const lastUriPart = uri.lastIndexOf("/");
202
+ if (lastUriPart >= 0) {
203
+ this._urlName = uri.substring(lastUriPart + 1);
204
+ // remove file extension
205
+ const lastDot = this._urlName.lastIndexOf(".");
206
+ if (lastDot >= 0) {
207
+ this._urlName = this._urlName.substring(0, lastDot);
208
+ }
209
+ }
210
+ else {
211
+ this._urlName = uri;
212
+ }
213
+
194
214
  this._hash = hash;
195
215
  if (uri.includes("?v="))
196
216
  this._hashedUri = uri;
197
217
  else
198
218
  this._hashedUri = hash ? uri + "?v=" + hash : uri;
199
219
  if (asset !== null) this.asset = asset;
220
+
200
221
  registerPrefabProvider(this._url, this.onResolvePrefab.bind(this));
201
222
  }
202
223
 
@@ -255,7 +255,26 @@ export class Input implements IInput {
255
255
  /** Adds an event listener for the specified event type. The callback will be called when the event is triggered.
256
256
  * @param type The event type to listen for
257
257
  * @param callback The callback to call when the event is triggered
258
- * @param options The options for adding the event listener
258
+ * @param options The options for adding the event listener.
259
+ * @example Basic usage:
260
+ * ```ts
261
+ * input.addEventListener("pointerdown", (evt) => {
262
+ * console.log("Pointer down", evt.pointerId, evt.pointerType);
263
+ * });
264
+ * ```
265
+ * @example Adding a listener that is called after all other listeners
266
+ * By using a higher value for the queue the listener will be called after other listeners (default queue is 0).
267
+ * ```ts
268
+ * input.addEventListener("pointerdown", (evt) => {
269
+ * console.log("Pointer down", evt.pointerId, evt.pointerType);
270
+ * }, { queue: 10 });
271
+ * ```
272
+ * @example Adding a listener that is only called once
273
+ * ```ts
274
+ * input.addEventListener("pointerdown", (evt) => {
275
+ * console.log("Pointer down", evt.pointerId, evt.pointerType);
276
+ * }, { once: true });
277
+ * ```
259
278
  */
260
279
  addEventListener(type: PointerEventNames, callback: PointerEventListener, options?: EventListenerOptions);
261
280
  addEventListener(type: KeyboardEventNames, callback: KeyboardEventListener, options?: EventListenerOptions);
@@ -554,7 +554,7 @@ export function getVisibleInCustomShadowRendering(obj: Object3D): boolean {
554
554
  * @param layers The layers to include. Typically the main camera's layers.
555
555
  * @param result The result box to store the bounding box in. Returns a new box if not passed in.
556
556
  */
557
- export function getBoundingBox(objects: Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
557
+ export function getBoundingBox(objects: Object3D | Object3D[], ignore: ((obj: Object3D) => void | boolean) | Array<Object3D | null | undefined> | undefined = undefined, layers: Layers | undefined | null = undefined, result: Box3 | undefined = undefined): Box3 {
558
558
  const box = result || new Box3();
559
559
  box.makeEmpty();
560
560
 
@@ -607,6 +607,10 @@ export function getBoundingBox(objects: Object3D[], ignore: ((obj: Object3D) =>
607
607
  }
608
608
  }
609
609
  let hasAnyObject = false;
610
+
611
+ if (!Array.isArray(objects))
612
+ objects = [objects];
613
+
610
614
  for (const object of objects) {
611
615
  if (!object) continue;
612
616
  hasAnyObject = true;
@@ -764,6 +768,7 @@ export function postprocessFBXMaterials(obj: Mesh, material: Material | Material
764
768
  newMaterial.envMap = oldMaterial.envMap;
765
769
  newMaterial.alphaMap = oldMaterial.alphaMap;
766
770
  newMaterial.metalness = oldMaterial.reflectivity;
771
+ newMaterial.vertexColors = oldMaterial.vertexColors;
767
772
  if (oldMaterial.shininess) {
768
773
  // from blender source code
769
774
  // https://github.com/blender/blender-addons/blob/5e66092bcbe0df6855b3fa814b4826add8b01360/io_scene_fbx/import_fbx.py#L1442
@@ -137,36 +137,8 @@ export class SphereCollider extends Collider implements ISphereCollider {
137
137
  export class BoxCollider extends Collider implements IBoxCollider {
138
138
 
139
139
  static add(obj: Mesh | Object3D, opts?: { rigidbody: boolean, debug?: boolean }) {
140
- const collider = new BoxCollider();
141
-
142
- // we need to transform the object into identity
143
- // because the physics collider will correctly apple the object's transform again
144
- // if we don't do it here we will have the transform applied twice
145
- const originalPosition = obj.position.clone();
146
- const originalQuaternion = obj.quaternion.clone();
147
- const originalScale = obj.scale.clone();
148
- obj.position.set(0, 0, 0);
149
- obj.quaternion.set(0, 0, 0, 1);
150
- obj.scale.set(1, 1, 1);
151
- const bb = getBoundingBox([obj]);
152
- obj.position.copy(originalPosition);
153
- obj.quaternion.copy(originalQuaternion);
154
- obj.scale.copy(originalScale);
155
-
156
- if(opts?.debug) Gizmos.DrawWireBox3(bb, 0xffdd00, 20);
157
-
158
- // if (!obj.geometry.boundingBox) obj.geometry.computeBoundingBox();
159
- // const bb = obj.geometry.boundingBox!;
160
- collider.size = bb!.getSize(new Vector3()) || new Vector3(1, 1, 1);
161
- collider.center = bb!.getCenter(new Vector3()) || new Vector3(0, 0, 0);
162
- if (collider.size.length() <= 0) {
163
- collider.size.set(0.01, 0.01, 0.01);
164
- }
165
-
166
- // collider.center.sub(obj.position);
167
- // collider.size.applyQuaternion(obj.worldQuaternion);
168
-
169
- addComponent(obj, collider);
140
+ const collider = addComponent(obj, BoxCollider);
141
+ collider.autoFit();
170
142
 
171
143
  if (opts?.rigidbody === true) {
172
144
  addComponent(obj, Rigidbody, { isKinematic: false });
@@ -181,20 +153,55 @@ export class BoxCollider extends Collider implements IBoxCollider {
181
153
  @serializable(Vector3)
182
154
  center: Vector3 = new Vector3(0, 0, 0);
183
155
 
156
+ /** @internal */
184
157
  onEnable() {
185
158
  super.onEnable();
186
159
  this.context.physics.engine?.addBoxCollider(this, this.size);
187
160
  watchWrite(this.gameObject.scale, this.updateProperties);
188
161
  }
189
162
 
163
+ /** @internal */
190
164
  onDisable(): void {
191
165
  super.onDisable();
192
166
  unwatchWrite(this.gameObject.scale, this.updateProperties);
193
167
  }
194
168
 
169
+ /** @internal */
195
170
  onValidate(): void {
196
171
  this.updateProperties();
197
172
  }
173
+
174
+ autoFit(opts?: { debug?: boolean }) {
175
+ const obj = this.gameObject;
176
+
177
+ // we need to transform the object into identity
178
+ // because the physics collider will correctly apple the object's transform again
179
+ // if we don't do it here we will have the transform applied twice
180
+ const originalPosition = obj.position.clone();
181
+ const originalQuaternion = obj.quaternion.clone();
182
+ const originalScale = obj.scale.clone();
183
+ const originalParent = obj.parent;
184
+ obj.position.set(0, 0, 0);
185
+ obj.quaternion.set(0, 0, 0, 1);
186
+ obj.scale.set(1, 1, 1);
187
+ obj.parent = null;
188
+ obj.updateMatrix();
189
+ const bb = getBoundingBox([obj]);
190
+ obj.position.copy(originalPosition);
191
+ obj.quaternion.copy(originalQuaternion);
192
+ obj.scale.copy(originalScale);
193
+ obj.parent = originalParent;
194
+
195
+ if (opts?.debug === true) Gizmos.DrawWireBox3(bb, 0xffdd00, 20);
196
+
197
+ // if (!obj.geometry.boundingBox) obj.geometry.computeBoundingBox();
198
+ // const bb = obj.geometry.boundingBox!;
199
+ this.size = bb!.getSize(new Vector3()) || new Vector3(1, 1, 1);
200
+ this.center = bb!.getCenter(new Vector3()) || new Vector3(0, 0, 0);
201
+ if (this.size.length() <= 0) {
202
+ this.size.set(0.01, 0.01, 0.01);
203
+ }
204
+ }
198
205
  }
199
206
 
200
207
  /**
@@ -371,9 +371,11 @@ export class ContactShadows extends Behaviour {
371
371
  // Ignore objects that don't render color
372
372
  let hide = entry.material.colorWrite == false || mat.wireframe === true || getVisibleInCustomShadowRendering(entry.object) === false;
373
373
  // Ignore line materials (e.g. GridHelper)
374
- if (!hide && (entry.material as any).linewidth != undefined) {
374
+ if (!hide && (entry.material["isLineMaterial"]))
375
+ hide = true;
376
+ // Ignore point materials
377
+ if (!hide && (entry.material["isPointsMaterial"]))
375
378
  hide = true;
376
- }
377
379
  if (hide) {
378
380
  objects_hidden.push(entry.object);
379
381
  entry.object["needle:visible"] = entry.object.visible;
@@ -53,7 +53,7 @@ export declare type DropListenerNetworkEventArguments = {
53
53
  contentMD5: string;
54
54
  }
55
55
 
56
- declare type AddedEventArguments = {
56
+ export declare type DropListenerOnDropArguments = {
57
57
  sender: DropListener,
58
58
  /** the root object added to the scene */
59
59
  object: Object3D,
@@ -64,7 +64,7 @@ declare type AddedEventArguments = {
64
64
  }
65
65
 
66
66
  /** Dispatched when an object is dropped/changed */
67
- export class DropListenerAddedEvent<T extends AddedEventArguments> extends CustomEvent<T> {
67
+ class DropListenerAddedEvent<T extends DropListenerOnDropArguments> extends CustomEvent<T> {
68
68
  constructor(detail: T) {
69
69
  super(DropListenerEvents.ObjectAdded, { detail });
70
70
  }
@@ -136,9 +136,9 @@ export class DropListener extends Behaviour {
136
136
 
137
137
  /**
138
138
  * Invoked after a file has been **added** to the scene.
139
- * Arguments are {@link AddedEventArguments}
139
+ * Arguments are {@link DropListenerOnDropArguments}
140
140
  * @event object-added
141
- * @param {AddedEventArguments} evt
141
+ * @param {DropListenerOnDropArguments} evt
142
142
  * @example
143
143
  * ```typescript
144
144
  * dropListener.onDropped.addEventListener((evt) => {
@@ -146,7 +146,7 @@ export class DropListener extends Behaviour {
146
146
  * });
147
147
  */
148
148
  @serializable(EventList)
149
- onDropped: EventList<AddedEventArguments> = new EventList();
149
+ onDropped: EventList<DropListenerOnDropArguments> = new EventList();
150
150
 
151
151
  /** @internal */
152
152
  onEnable(): void {
@@ -941,7 +941,6 @@ export class OrbitControls extends Behaviour implements ICameraController {
941
941
  lookAt.y -= size.y * verticalOffset;
942
942
  this.setLookTargetPosition(lookAt, immediate);
943
943
  this.setFieldOfView(options.fov, immediate);
944
- this.autoTarget = false;
945
944
 
946
945
  if (cameraNearFar == undefined || cameraNearFar == "auto") {
947
946
  // Check if the scene has a GroundProjectedEnv and include the scale to the far plane so that it doesnt cut off
@@ -46,6 +46,10 @@ export type LoadSceneEvent = {
46
46
  index: number;
47
47
  }
48
48
 
49
+ export type LoadSceneProgressEvent = LoadSceneEvent & {
50
+ progress: number,
51
+ }
52
+
49
53
  /**
50
54
  * The ISceneEventListener is called by the {@link SceneSwitcher} when a scene is loaded or unloaded.
51
55
  * It must be added to the root object of your scene (that is being loaded) or on the same object as the SceneSwitcher
@@ -225,6 +229,15 @@ export class SceneSwitcher extends Behaviour {
225
229
  */
226
230
  get currentlyLoadedScene() { return this._currentScene; }
227
231
 
232
+ /**
233
+ * Called when a scene starts loading
234
+ */
235
+ @serializable(EventList)
236
+ sceneLoadingStart: EventList<LoadSceneEvent> = new EventList();
237
+
238
+ @serializable(EventList)
239
+ sceneLoadingProgress: EventList<ProgressEvent> = new EventList();
240
+
228
241
  /**
229
242
  * The sceneLoaded event is called when a scene/glTF is loaded and added to the scene
230
243
  */
@@ -281,7 +294,7 @@ export class SceneSwitcher extends Behaviour {
281
294
  this._preloadScheduler.maxLoadAhead = this.preloadNext;
282
295
  this._preloadScheduler.maxLoadBehind = this.preloadPrevious;
283
296
  this._preloadScheduler.maxConcurrent = this.preloadConcurrent;
284
- this._preloadScheduler.begin();
297
+ this._preloadScheduler.begin(2000);
285
298
 
286
299
  // Begin loading the loading scene
287
300
  if (this.autoLoadFirstScene && this._currentIndex === -1 && !await this.tryLoadFromQueryParam()) {
@@ -602,11 +615,13 @@ export class SceneSwitcher extends Behaviour {
602
615
 
603
616
  const loadStartEvt = new CustomEvent<LoadSceneEvent>("loadscene-start", { detail: { scene: scene, switcher: this, index: index } })
604
617
  this.dispatchEvent(loadStartEvt);
618
+ this.sceneLoadingStart?.invoke(loadStartEvt.detail);
605
619
  await this.onStartLoading();
606
620
  // start loading and wait for the scene to be loaded
607
621
  await scene.loadAssetAsync((_, prog) => {
608
622
  this._currentLoadingProgress = prog;
609
623
  this.dispatchEvent(prog);
624
+ this.sceneLoadingProgress?.invoke(prog);
610
625
  }).catch(console.error);
611
626
  await this.onEndLoading();
612
627
  const finishedEvt = new CustomEvent<LoadSceneEvent>("loadscene-finished", { detail: { scene: scene, switcher: this, index: index } });
@@ -859,26 +874,30 @@ class PreLoadScheduler {
859
874
  this.maxConcurrent = maxConcurrent;
860
875
  }
861
876
 
862
- begin() {
877
+ begin(delay: number) {
863
878
  if (this._isRunning) return;
864
- if (debug) console.log("Preload begin")
879
+ if (debug) console.log("Preload begin", { delay })
865
880
  this._isRunning = true;
866
- let lastRoom: number = -1;
881
+ let lastRoom: number = -10;
867
882
  let searchDistance: number;
868
883
  let searchCall: number;
869
884
  const array = this._switcher.scenes;
885
+ const startTime = Date.now() + delay;
870
886
  const interval = setInterval(() => {
871
887
  if (this.allLoaded()) {
872
888
  if (debug)
873
- console.log("All scenes loaded");
889
+ console.log("All scenes (pre-)loaded");
874
890
  this.stop();
875
891
  }
876
892
  if (!this._isRunning) {
877
893
  clearInterval(interval);
878
894
  return;
879
895
  }
896
+
897
+ if (Date.now() < startTime) return;
898
+
880
899
  if (this.canLoadNewScene() === false) return;
881
- if (lastRoom !== this._switcher.currentIndex) {
900
+ if (lastRoom === -10 || lastRoom !== this._switcher.currentIndex) {
882
901
  lastRoom = this._switcher.currentIndex;
883
902
  searchCall = 0;
884
903
  searchDistance = 0;
@@ -892,8 +911,11 @@ class PreLoadScheduler {
892
911
  if (roomIndex < 0) return;
893
912
  // if (roomIndex < 0) roomIndex = array.length + roomIndex;
894
913
  if (roomIndex < 0 || roomIndex >= array.length) return;
895
- const scene = array[roomIndex];
896
- new LoadTask(roomIndex, scene, this._loadTasks);
914
+ if (!this._loadTasks.some(t => t.index === roomIndex)) {
915
+ const scene = array[roomIndex];
916
+ if (debug) console.log("Preload scene", { roomIndex, searchForward, lastRoom, currentIndex: this._switcher.currentIndex, tasks: this._loadTasks.length }, scene?.url);
917
+ new LoadTask(roomIndex, scene, this._loadTasks);
918
+ }
897
919
  }, 200);
898
920
  }
899
921
 
@@ -52,7 +52,7 @@ import "./AnimationUtils.js"
52
52
  import "./AnimationUtilsAutoplay.js"
53
53
 
54
54
  export { DragMode } from "./DragControls.js"
55
- export type { DropListenerNetworkEventArguments } from "./DropListener.js";
55
+ export type { DropListenerNetworkEventArguments, DropListenerOnDropArguments } from "./DropListener.js";
56
56
  export * from "./particlesystem/api.js"
57
57
 
58
58
  // for correct type resolution in JSDoc
@@ -34,7 +34,6 @@ export { DeleteBox } from "../DeleteBox.js";
34
34
  export { Deletable } from "../DeleteBox.js";
35
35
  export { DeviceFlag } from "../DeviceFlag.js";
36
36
  export { DragControls } from "../DragControls.js";
37
- export { DropListenerAddedEvent } from "../DropListener.js";
38
37
  export { DropListener } from "../DropListener.js";
39
38
  export { Duplicatable } from "../Duplicatable.js";
40
39
  export { CallInfo } from "../EventList.js";
@@ -59,6 +59,7 @@ export class EventSystem extends Behaviour {
59
59
  return ctx.scene.getComponent(EventSystem);
60
60
  }
61
61
 
62
+ /** Get the currently active event system */
62
63
  static get instance(): EventSystem | null {
63
64
  return this.get(Context.Current);
64
65
  }
@@ -75,7 +76,10 @@ export class EventSystem extends Behaviour {
75
76
  }
76
77
  }
77
78
 
78
- get hasActiveUI() { return this.currentActiveMeshUIComponents.length > 0; }
79
+ get hasActiveUI() {
80
+ return this.currentActiveMeshUIComponents.length > 0;
81
+ }
82
+
79
83
  get isHoveringObjects() { return this.hoveredByID.size > 0; }
80
84
 
81
85
  awake(): void {
@@ -424,7 +428,6 @@ export class EventSystem extends Behaviour {
424
428
  const res = UIRaycastUtils.isInteractable(actualGo, this.out);
425
429
  if (!res) return false;
426
430
  canvasGroup = this.out.canvasGroup ?? null;
427
-
428
431
  const handled = this.handleMeshUIIntersection(object, pressedOrClicked);
429
432
  if (!clicked && handled) {
430
433
  // return true;
@@ -753,7 +756,6 @@ export class EventSystem extends Behaviour {
753
756
  }
754
757
 
755
758
  private resetMeshUIStates() {
756
-
757
759
  if (this.context.input.getPointerPressedCount() > 0) {
758
760
  MeshUIHelper.resetLastSelected();
759
761
  }
@@ -816,7 +818,7 @@ class MeshUIHelper {
816
818
  let foundBlock: Object3D | null = null;
817
819
 
818
820
  if (intersect) {
819
- foundBlock = this.findBlockInParent(intersect);
821
+ foundBlock = this.findBlockOrTextInParent(intersect);
820
822
  // console.log(intersect, "-- found block:", foundBlock)
821
823
  if (foundBlock && foundBlock !== this.lastSelected) {
822
824
  const interactable = foundBlock["interactable"];
@@ -840,13 +842,13 @@ class MeshUIHelper {
840
842
  this.needsUpdate = true;
841
843
  }
842
844
 
843
- static findBlockInParent(elem: any): Object3D | null {
845
+ static findBlockOrTextInParent(elem: any): Object3D | null {
844
846
  if (!elem) return null;
845
- if (elem.isBlock) {
847
+ if (elem.isBlock || (elem.isText)) {
846
848
  // @TODO : Replace states managements
847
849
  // if (Object.keys(elem.states).length > 0)
848
850
  return elem;
849
851
  }
850
- return this.findBlockInParent(elem.parent);
852
+ return this.findBlockOrTextInParent(elem.parent);
851
853
  }
852
854
  }
@@ -238,14 +238,15 @@ export class InputField extends Behaviour implements IPointerEventHandler {
238
238
 
239
239
  private setTextFromInputField() {
240
240
  if (this.textComponent && InputField.htmlField) {
241
- if (this.textComponent.text !== InputField.htmlField.value) {
242
- if (debug)
243
- console.log("VALUE CHANGED");
244
- const oldValue = this.textComponent.text;
245
- const newValue = InputField.htmlField.value;
241
+ const oldValue = this.textComponent.text;
242
+ const newValue = InputField.htmlField.value;
243
+ const changed = this.textComponent.text !== InputField.htmlField.value;
244
+ this.textComponent.text = InputField.htmlField.value;
245
+
246
+ if (changed) {
247
+ if (debug) console.log("[InputField] value changed:", newValue, oldValue);
246
248
  this.onValueChanged?.invoke(newValue, oldValue);
247
249
  }
248
- this.textComponent.text = InputField.htmlField.value;
249
250
  }
250
251
  }
251
252