@needle-tools/engine 4.8.8 → 4.8.9-next.5e888f7

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 (137) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +50 -45
  3. package/components.needle.json +1 -1
  4. package/dist/gltf-progressive-DWiyqrwB.umd.cjs +8 -0
  5. package/dist/gltf-progressive-DhE1A6hX.min.js +8 -0
  6. package/dist/{gltf-progressive-BcHT3Nyo.js → gltf-progressive-egsMzRdv.js} +384 -369
  7. package/dist/{needle-engine.bundle-CK8rTkFm.umd.cjs → needle-engine.bundle-B8QgMEWj.umd.cjs} +145 -145
  8. package/dist/{needle-engine.bundle-C071tpzX.js → needle-engine.bundle-CBk4h0tH.js} +8352 -8106
  9. package/dist/{needle-engine.bundle--H5L0liy.min.js → needle-engine.bundle-CF7LvCm4.min.js} +148 -148
  10. package/dist/needle-engine.d.ts +7 -0
  11. package/dist/needle-engine.js +305 -301
  12. package/dist/needle-engine.min.js +1 -1
  13. package/dist/needle-engine.umd.cjs +1 -1
  14. package/dist/{postprocessing-Ywv5oKkX.min.js → postprocessing-B_FzkwDz.min.js} +1 -1
  15. package/dist/{postprocessing-ORx-0eCx.js → postprocessing-DP1U_BpT.js} +2 -2
  16. package/dist/{postprocessing-CVb_x9YY.umd.cjs → postprocessing-DTX5VXrj.umd.cjs} +1 -1
  17. package/dist/{three-Dceyffus.umd.cjs → three-BK56xWDs.umd.cjs} +24 -24
  18. package/dist/{three-BRSLmpyi.js → three-CsHK73Zc.js} +1 -0
  19. package/dist/{three-CsmWHVn7.min.js → three-TNFQHSFa.min.js} +25 -25
  20. package/dist/{three-examples-BX_Sktc9.min.js → three-examples-Bph291U2.min.js} +1 -1
  21. package/dist/{three-examples-CNexix3E.js → three-examples-BvMpKSun.js} +1 -1
  22. package/dist/{three-examples-DWxXVnws.umd.cjs → three-examples-C9WfZu-X.umd.cjs} +1 -1
  23. package/dist/{three-mesh-ui-gqAXlGNB.js → three-mesh-ui-CN6aRT7i.js} +1 -1
  24. package/dist/{three-mesh-ui-Cdh2iW8b.umd.cjs → three-mesh-ui-DnxkZWNA.umd.cjs} +1 -1
  25. package/dist/{three-mesh-ui-Bwy12Qvg.min.js → three-mesh-ui-n_qS2BM-.min.js} +1 -1
  26. package/dist/{vendor-xfQ8tKF3.umd.cjs → vendor-8le8g4MS.umd.cjs} +1 -1
  27. package/dist/{vendor-Z4SPrTcP.js → vendor-Msb9AgYE.js} +1 -1
  28. package/dist/{vendor-C43vobGc.min.js → vendor-yDFiCnCw.min.js} +1 -1
  29. package/lib/engine/codegen/register_types.js +4 -0
  30. package/lib/engine/codegen/register_types.js.map +1 -1
  31. package/lib/engine/engine_addressables.js +2 -0
  32. package/lib/engine/engine_addressables.js.map +1 -1
  33. package/lib/engine/engine_animation.js +4 -4
  34. package/lib/engine/engine_animation.js.map +1 -1
  35. package/lib/engine/engine_assetdatabase.js +6 -6
  36. package/lib/engine/engine_assetdatabase.js.map +1 -1
  37. package/lib/engine/engine_camera.d.ts +15 -2
  38. package/lib/engine/engine_camera.js +9 -2
  39. package/lib/engine/engine_camera.js.map +1 -1
  40. package/lib/engine/engine_context.d.ts +8 -2
  41. package/lib/engine/engine_context.js +21 -3
  42. package/lib/engine/engine_context.js.map +1 -1
  43. package/lib/engine/engine_create_objects.d.ts +3 -3
  44. package/lib/engine/engine_create_objects.js +5 -4
  45. package/lib/engine/engine_create_objects.js.map +1 -1
  46. package/lib/engine/engine_gameobject.js +2 -2
  47. package/lib/engine/engine_gameobject.js.map +1 -1
  48. package/lib/engine/engine_gltf_builtin_components.js +11 -11
  49. package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
  50. package/lib/engine/engine_loaders.callbacks.d.ts +1 -0
  51. package/lib/engine/engine_loaders.callbacks.js +1 -0
  52. package/lib/engine/engine_loaders.callbacks.js.map +1 -1
  53. package/lib/engine/extensions/NEEDLE_lighting_settings.js +5 -2
  54. package/lib/engine/extensions/NEEDLE_lighting_settings.js.map +1 -1
  55. package/lib/engine/extensions/NEEDLE_lightmaps.js +1 -1
  56. package/lib/engine/extensions/NEEDLE_lightmaps.js.map +1 -1
  57. package/lib/engine/js-extensions/Object3D.d.ts +1 -1
  58. package/lib/engine/js-extensions/Vector.d.ts +5 -0
  59. package/lib/engine/js-extensions/Vector.js.map +1 -1
  60. package/lib/engine/js-extensions/index.d.ts +2 -1
  61. package/lib/engine/js-extensions/index.js +1 -1
  62. package/lib/engine/js-extensions/index.js.map +1 -1
  63. package/lib/engine/webcomponents/needle-engine.d.ts +2 -2
  64. package/lib/engine/webcomponents/needle-engine.js +11 -18
  65. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  66. package/lib/engine-components/Camera.d.ts +2 -0
  67. package/lib/engine-components/Camera.js +5 -1
  68. package/lib/engine-components/Camera.js.map +1 -1
  69. package/lib/engine-components/ContactShadows.d.ts +12 -2
  70. package/lib/engine-components/ContactShadows.js +24 -4
  71. package/lib/engine-components/ContactShadows.js.map +1 -1
  72. package/lib/engine-components/DropListener.d.ts +4 -3
  73. package/lib/engine-components/DropListener.js +4 -3
  74. package/lib/engine-components/DropListener.js.map +1 -1
  75. package/lib/engine-components/NestedGltf.d.ts +9 -4
  76. package/lib/engine-components/NestedGltf.js +32 -26
  77. package/lib/engine-components/NestedGltf.js.map +1 -1
  78. package/lib/engine-components/OrbitControls.d.ts +29 -6
  79. package/lib/engine-components/OrbitControls.js +45 -9
  80. package/lib/engine-components/OrbitControls.js.map +1 -1
  81. package/lib/engine-components/Renderer.js +2 -1
  82. package/lib/engine-components/Renderer.js.map +1 -1
  83. package/lib/engine-components/Skybox.js +8 -9
  84. package/lib/engine-components/Skybox.js.map +1 -1
  85. package/lib/engine-components/api.d.ts +2 -0
  86. package/lib/engine-components/api.js +1 -0
  87. package/lib/engine-components/api.js.map +1 -1
  88. package/lib/engine-components/codegen/components.d.ts +3 -0
  89. package/lib/engine-components/codegen/components.js +3 -0
  90. package/lib/engine-components/codegen/components.js.map +1 -1
  91. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +1 -1
  92. package/lib/engine-components/splines/Spline.d.ts +58 -0
  93. package/lib/engine-components/splines/Spline.js +270 -0
  94. package/lib/engine-components/splines/Spline.js.map +1 -0
  95. package/lib/engine-components/splines/SplineUtils.d.ts +12 -0
  96. package/lib/engine-components/splines/SplineUtils.js +33 -0
  97. package/lib/engine-components/splines/SplineUtils.js.map +1 -0
  98. package/lib/engine-components/splines/SplineWalker.d.ts +47 -0
  99. package/lib/engine-components/splines/SplineWalker.js +113 -0
  100. package/lib/engine-components/splines/SplineWalker.js.map +1 -0
  101. package/lib/engine-components/splines/index.d.ts +3 -0
  102. package/lib/engine-components/splines/index.js +4 -0
  103. package/lib/engine-components/splines/index.js.map +1 -0
  104. package/package.json +4 -4
  105. package/plugins/common/files.js +6 -3
  106. package/plugins/vite/alias.js +3 -2
  107. package/plugins/vite/editor-connection.js +4 -4
  108. package/src/engine/codegen/register_types.ts +4 -0
  109. package/src/engine/engine_addressables.ts +2 -0
  110. package/src/engine/engine_animation.ts +4 -4
  111. package/src/engine/engine_assetdatabase.ts +7 -7
  112. package/src/engine/engine_camera.ts +15 -3
  113. package/src/engine/engine_context.ts +22 -4
  114. package/src/engine/engine_create_objects.ts +8 -7
  115. package/src/engine/engine_gameobject.ts +2 -2
  116. package/src/engine/engine_gltf_builtin_components.ts +12 -11
  117. package/src/engine/engine_loaders.callbacks.ts +1 -0
  118. package/src/engine/extensions/NEEDLE_lighting_settings.ts +5 -2
  119. package/src/engine/extensions/NEEDLE_lightmaps.ts +1 -1
  120. package/src/engine/js-extensions/Vector.ts +6 -0
  121. package/src/engine/js-extensions/index.ts +3 -2
  122. package/src/engine/webcomponents/needle-engine.ts +10 -17
  123. package/src/engine-components/Camera.ts +7 -1
  124. package/src/engine-components/ContactShadows.ts +27 -6
  125. package/src/engine-components/DropListener.ts +4 -3
  126. package/src/engine-components/NestedGltf.ts +33 -24
  127. package/src/engine-components/OrbitControls.ts +67 -21
  128. package/src/engine-components/Renderer.ts +2 -1
  129. package/src/engine-components/Skybox.ts +9 -10
  130. package/src/engine-components/api.ts +3 -1
  131. package/src/engine-components/codegen/components.ts +3 -0
  132. package/src/engine-components/splines/Spline.ts +284 -0
  133. package/src/engine-components/splines/SplineUtils.ts +32 -0
  134. package/src/engine-components/splines/SplineWalker.ts +106 -0
  135. package/src/engine-components/splines/index.ts +3 -0
  136. package/dist/gltf-progressive-CH3Q4H06.umd.cjs +0 -8
  137. package/dist/gltf-progressive-DR6HqF_h.min.js +0 -8
@@ -0,0 +1,270 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BufferGeometry, CatmullRomCurve3, Line, LineBasicMaterial, LineCurve3, Quaternion, Vector3 } from "three";
8
+ import { Mathf } from "../../engine/engine_math.js";
9
+ import { serializeable } from "../../engine/engine_serialization.js";
10
+ import { getParam } from "../../engine/engine_utils.js";
11
+ import { Behaviour } from "../Component.js";
12
+ const debug = getParam("debugsplines");
13
+ export class SplineData {
14
+ position = new Vector3();
15
+ rotation = new Quaternion();
16
+ tangentIn = new Vector3();
17
+ tangentOut = new Vector3();
18
+ }
19
+ __decorate([
20
+ serializeable(Vector3)
21
+ ], SplineData.prototype, "position", void 0);
22
+ __decorate([
23
+ serializeable(Quaternion)
24
+ ], SplineData.prototype, "rotation", void 0);
25
+ __decorate([
26
+ serializeable(Vector3)
27
+ ], SplineData.prototype, "tangentIn", void 0);
28
+ __decorate([
29
+ serializeable(Vector3)
30
+ ], SplineData.prototype, "tangentOut", void 0);
31
+ // enum SplineTypeEnum {
32
+ // CatmullRom = 0,
33
+ // Bezier = 1,
34
+ // Linear = 2
35
+ // }
36
+ // type SplineType = "CatmullRom" | "Bezier" | "Linear";
37
+ //@dont-generate-component
38
+ /**
39
+ * Holds spline data and generates a spline curve. Use with SplineWalker to move objects along the spline or call getPointAt to sample points on the spline.
40
+ * The spline is defined by an array of knots (SplineData) which define position, rotation and tangents.
41
+ *
42
+ * You can create a SplineContainer from an array of points using the static method 'createFromPoints'.
43
+ */
44
+ export class SplineContainer extends Behaviour {
45
+ /**
46
+ * Adds a knot to the end of the spline.
47
+ */
48
+ addKnot(knot) {
49
+ if (knot instanceof SplineData) {
50
+ this.spline.push(knot);
51
+ this._isDirty = true;
52
+ }
53
+ else {
54
+ const k = new SplineData();
55
+ k.position.copy(knot.position);
56
+ this.spline.push(k);
57
+ this._isDirty = true;
58
+ }
59
+ return this;
60
+ }
61
+ /**
62
+ * Removes a knot by index or by reference.
63
+ */
64
+ removeKnot(index) {
65
+ if (typeof index === "number") {
66
+ this.spline.splice(index, 1);
67
+ this._isDirty = true;
68
+ }
69
+ else {
70
+ const i = this.spline.indexOf(index);
71
+ if (i !== -1) {
72
+ this.spline.splice(i, 1);
73
+ this._isDirty = true;
74
+ }
75
+ }
76
+ return this;
77
+ }
78
+ /**
79
+ * Gets a point on the spline in world space.
80
+ */
81
+ getPointAt(t, target) {
82
+ if (!this.curve)
83
+ return new Vector3();
84
+ const pos = this.curve.getPointAt(Mathf.clamp01(t), target);
85
+ const worldMatrix = this.gameObject.matrixWorld ?? undefined;
86
+ if (worldMatrix) {
87
+ pos.applyMatrix4(worldMatrix);
88
+ }
89
+ return pos;
90
+ }
91
+ /**
92
+ * Marks the spline as dirty, causing it to be rebuilt on the next update.
93
+ */
94
+ markDirty() {
95
+ this._isDirty = true;
96
+ }
97
+ /**
98
+ * Gets the tangent vector on the spline in world space.
99
+ */
100
+ getTangentAt(t, target) {
101
+ if (!this.curve)
102
+ return target ?? new Vector3();
103
+ const wr = this.gameObject.worldQuaternion;
104
+ return this.curve.getTangentAt(Mathf.clamp01(t), target).applyQuaternion(wr);
105
+ }
106
+ set closed(value) {
107
+ this._closed = value;
108
+ this._isDirty = true;
109
+ }
110
+ get closed() { return this._closed; }
111
+ _closed = false;
112
+ /** Spline data. Call 'markDirty' if modified */
113
+ spline = [];
114
+ /** Enable to render the spline curve for debugging */
115
+ set debug(debug) {
116
+ if (debug && !this._builtCurve)
117
+ this.buildCurve();
118
+ if (!this._debugLine)
119
+ return;
120
+ this._debugLine.visible = debug;
121
+ }
122
+ /** Gets the spline curve generated from the 'spline' data */
123
+ get curve() {
124
+ return this._curve;
125
+ }
126
+ get isDirty() { return this._isDirty; }
127
+ _isDirty = false;
128
+ _curve = null;
129
+ _builtCurve = false;
130
+ _debugLine = null;
131
+ /** @internal */
132
+ awake() {
133
+ if (debug) {
134
+ console.log(`[Spline] ${this.name}`, this);
135
+ this.buildCurve();
136
+ }
137
+ }
138
+ /** @internal */
139
+ update() {
140
+ if (this._isDirty) {
141
+ this.buildCurve(true);
142
+ }
143
+ if (this._debugLine && this._debugLine.parent !== this.gameObject)
144
+ this.gameObject.add(this._debugLine);
145
+ }
146
+ buildCurve(force = false) {
147
+ if (this._builtCurve && !force)
148
+ return;
149
+ this._builtCurve = true;
150
+ if (!this.spline) {
151
+ console.error("[Spline] Can not build curve, no spline data", this.name);
152
+ return;
153
+ }
154
+ this._isDirty = false;
155
+ this._curve = createCatmullRomCurve(this.spline, this.closed);
156
+ this.buildDebugCurve();
157
+ // TODO: Unity supports spline interpolation type per knot which we don't support right now. Additionally EditType is deprecated. For simplicity we're just supporting CatmullRom for now.
158
+ // switch (this.editType) {
159
+ // case SplineType.CatmullRom:
160
+ // this.createCatmullRomCurve();
161
+ // break;
162
+ // case SplineType.Bezier:
163
+ // console.warn("Bezier spline not implemented yet", this.name);
164
+ // this.createCatmullRomCurve();
165
+ // // this.createBezierCurve();
166
+ // break;
167
+ // case SplineType.Linear:
168
+ // this.createLinearCurve();
169
+ // break;
170
+ // }
171
+ }
172
+ buildDebugCurve() {
173
+ if (debug && this.spline && this._curve) {
174
+ this._debugLine?.removeFromParent();
175
+ this._debugLine = null;
176
+ const material = new LineBasicMaterial({
177
+ color: 0x6600ff,
178
+ });
179
+ const res = this.spline.length * 10;
180
+ const splinePoints = this._curve.getPoints(res);
181
+ const geometry = new BufferGeometry().setFromPoints(splinePoints);
182
+ this._debugLine = new Line(geometry, material);
183
+ this.gameObject?.add(this._debugLine);
184
+ }
185
+ }
186
+ }
187
+ __decorate([
188
+ serializeable()
189
+ ], SplineContainer.prototype, "closed", null);
190
+ __decorate([
191
+ serializeable(SplineData)
192
+ ], SplineContainer.prototype, "spline", void 0);
193
+ function createCatmullRomCurve(data, closed) {
194
+ const points = data.map(knot => new Vector3(-knot.position.x, knot.position.y, knot.position.z));
195
+ if (points.length === 1)
196
+ points.push(points[0]);
197
+ const averageTension = data.reduce((acc, knot) => acc + Math.abs(knot.tangentOut.x) + Math.abs(knot.tangentOut.y) + Math.abs(knot.tangentOut.z), 0) / data.length;
198
+ const tension = Mathf.remap(averageTension, 0, 0.3, 0, .5);
199
+ return new CatmullRomCurve3(points, closed, "catmullrom", tension);
200
+ }
201
+ function createLinearCurve(data, closed) {
202
+ if (!data || data.length < 2)
203
+ return null;
204
+ const points = data.map(knot => new Vector3(-knot.position.x, knot.position.y, knot.position.z));
205
+ if (closed)
206
+ points.push(points[0]);
207
+ return new LineCurve3(points.at(0), points.at(1));
208
+ }
209
+ // function createBezierCurve(data: SplineData[], closed: boolean): CubicBezierCurve3 | null {
210
+ // if (!data || data.length < 2) return null;
211
+ // for (let k = 0; k < data.length; k++) {
212
+ // const k0 = data[k];
213
+ // let nextIndex = k + 1;
214
+ // if (nextIndex >= data.length) {
215
+ // if (!closed) break;
216
+ // nextIndex = 0;
217
+ // }
218
+ // const k1 = data[nextIndex];
219
+ // // points
220
+ // const p0 = new Vector3(-k0.position.x, k0.position.y, k0.position.z);
221
+ // const p1 = new Vector3(-k1.position.x, k1.position.y, k1.position.z);
222
+ // // tangents
223
+ // const t0 = new Vector3(-k0.tangentOut.x, k0.tangentOut.y, k0.tangentOut.z);
224
+ // const t1 = new Vector3(-k1.tangentIn.x, k1.tangentIn.y, k1.tangentIn.z);
225
+ // // rotations
226
+ // // const q0 = k0.rotation;// new Quaternion(k0.rotation.value.x, k0.rotation.value.y, k0.rotation.value.z, k0.rotation.value.w);
227
+ // // const q1 = k1.rotation;// new Quaternion(k1.rotation.value.x, k1.rotation.value.y, k1.rotation.value.z, k1.rotation.value.w);
228
+ // // const a = new Vector3(0,1,0);
229
+ // // const angle = Math.PI*.5;
230
+ // // t0.sub(p0).applyQuaternion(q0).add(p0);
231
+ // // t1.sub(p1).applyQuaternion(q1).add(p1);
232
+ // t0.add(p0);
233
+ // // t0.applyQuaternion(q0);
234
+ // t1.add(p1);
235
+ // const curve = new CubicBezierCurve3(p0, t0, t1, p1);
236
+ // return curve;
237
+ // }
238
+ // return null;
239
+ // }
240
+ // class SplineCurve {
241
+ // private spline: Spline;
242
+ // constructor(spline: Spline) {
243
+ // this.spline = spline;
244
+ // }
245
+ // getPoints(num: number): Vector3[] {
246
+ // const points: Vector3[] = [];
247
+ // const samplePerKnot = num / this.spline.length;
248
+ // for (let k = 1; k < this.spline.length; k++) {
249
+ // const cur = this.spline[k];
250
+ // const prev = this.spline[k - 1];
251
+ // for (let i = 0; i < samplePerKnot; i++) {
252
+ // const t = i / (samplePerKnot - 1);
253
+ // console.log(CurveUtils);
254
+ // const x = this.interpolate(-prev.Position.x, -cur.Position.x, -prev.tangentOut.x, -cur.TangentIn.x, t);
255
+ // const y = this.interpolate(prev.Position.y, cur.Position.y, prev.tangentOut.y, cur.TangentIn.y, t);
256
+ // const z = this.interpolate(prev.Position.z, cur.Position.z, prev.tangentOut.z, cur.TangentIn.z, t);
257
+ // points.push(new Vector3(x, y, z));
258
+ // }
259
+ // }
260
+ // return points;
261
+ // }
262
+ // interpolate(p0, p1, p2, p3, t) {
263
+ // var v0 = (p2 - p0) * 0.5;
264
+ // var v1 = (p3 - p1) * 0.5;
265
+ // var t2 = t * t;
266
+ // var t3 = t * t2;
267
+ // return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (- 3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
268
+ // }
269
+ // }
270
+ //# sourceMappingURL=Spline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spline.js","sourceRoot":"","sources":["../../../src/engine-components/splines/Spline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Vector3 } from "three";
2
+ import { SplineContainer } from "./Spline.js";
3
+ export declare namespace SplineUtils {
4
+ /**
5
+ * Creates a SplineContainer from an array of points.
6
+ * @param positions The positions of the knots.
7
+ * @param closed Whether the spline is closed (the last knot connects to the first).
8
+ * @param tension The tension of the spline. 0 is no tension, 1 is high tension (straight lines between knots). Default is 0.75.
9
+ * @return The created SplineContainer component - add it to an Object3D to use it.
10
+ */
11
+ function createFromPoints(positions: Vector3[], closed?: boolean, tension?: number): SplineContainer;
12
+ }
@@ -0,0 +1,33 @@
1
+ import { Vector3 } from "three";
2
+ import { Mathf } from "../../engine/engine_math.js";
3
+ import { SplineContainer, SplineData } from "./Spline.js";
4
+ export var SplineUtils;
5
+ (function (SplineUtils) {
6
+ /**
7
+ * Creates a SplineContainer from an array of points.
8
+ * @param positions The positions of the knots.
9
+ * @param closed Whether the spline is closed (the last knot connects to the first).
10
+ * @param tension The tension of the spline. 0 is no tension, 1 is high tension (straight lines between knots). Default is 0.75.
11
+ * @return The created SplineContainer component - add it to an Object3D to use it.
12
+ */
13
+ function createFromPoints(positions, closed = false, tension = .75) {
14
+ const spline = new SplineContainer();
15
+ const tangentFactor = 1 - Mathf.clamp(tension, 0, 1);
16
+ positions.forEach((pos, index) => {
17
+ const tangent = new Vector3();
18
+ if (index < positions.length - 1)
19
+ tangent.subVectors(positions[index + 1], pos).normalize().multiplyScalar(tangentFactor);
20
+ else if (closed && positions.length > 1)
21
+ tangent.subVectors(positions[0], pos).normalize().multiplyScalar(tangentFactor);
22
+ const knot = new SplineData();
23
+ knot.position.copy(pos);
24
+ knot.tangentIn.copy(tangent);
25
+ knot.tangentOut.copy(tangent);
26
+ spline.addKnot(knot);
27
+ });
28
+ spline.closed = closed;
29
+ return spline;
30
+ }
31
+ SplineUtils.createFromPoints = createFromPoints;
32
+ })(SplineUtils || (SplineUtils = {}));
33
+ //# sourceMappingURL=SplineUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplineUtils.js","sourceRoot":"","sources":["../../../src/engine-components/splines/SplineUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,KAAW,WAAW,CAyB3B;AAzBD,WAAiB,WAAW;IAExB;;;;;;OAMG;IACH,SAAgB,gBAAgB,CAAC,SAAoB,EAAE,SAAkB,KAAK,EAAE,UAAkB,GAAG;QACjG,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;iBACrH,IAAI,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACzH,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;IAfe,4BAAgB,mBAe/B,CAAA;AACL,CAAC,EAzBgB,WAAW,KAAX,WAAW,QAyB3B"}
@@ -0,0 +1,47 @@
1
+ import { Object3D } from "three";
2
+ import { Behaviour } from "../Component.js";
3
+ import { SplineContainer } from "./Spline.js";
4
+ /**
5
+ * Moves an object along a spline. Use this with a SplineContainer component.
6
+ */
7
+ export declare class SplineWalker extends Behaviour {
8
+ /**
9
+ * The spline to use/walk along. Add a SplineContainer component to an object and assign it here.
10
+ */
11
+ spline: SplineContainer | null;
12
+ /** The object to move along the spline. If object is undefined then the spline walker will use the gameObject the component has been added to
13
+ * @default undefined
14
+ */
15
+ object?: Object3D | null;
16
+ /** The object to look at while moving along the spline
17
+ * @default null
18
+ */
19
+ lookAt: Object3D | null;
20
+ /**
21
+ * When clamp is set to true, the position01 value will be clamped between 0 and 1 and the object will not loop the spline.
22
+ * @default false
23
+ */
24
+ clamp: boolean;
25
+ /** The current position on the spline. The value ranges from 0 (start of the spline curve) to 1 (end of the spline curve)
26
+ * @default 0
27
+ */
28
+ get position01(): number;
29
+ set position01(v: number);
30
+ /** Resets the position to 0 */
31
+ reset(): void;
32
+ /**
33
+ * If true the SplineWalker will automatically move along the spline
34
+ * @default true
35
+ */
36
+ autoRun: boolean;
37
+ /**
38
+ * The duration in seconds it takes to complete the whole spline when autoWalk is enabled.
39
+ * @default 10
40
+ */
41
+ duration: number;
42
+ private _position01;
43
+ /** @internal */
44
+ start(): void;
45
+ update(): void;
46
+ private updateFromPosition;
47
+ }
@@ -0,0 +1,113 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Object3D } from "three";
8
+ import { Mathf } from "../../engine/engine_math.js";
9
+ import { serializeable } from "../../engine/engine_serialization_decorator.js";
10
+ import { Behaviour } from "../Component.js";
11
+ import { SplineContainer } from "./Spline.js";
12
+ /**
13
+ * Moves an object along a spline. Use this with a SplineContainer component.
14
+ */
15
+ export class SplineWalker extends Behaviour {
16
+ /**
17
+ * The spline to use/walk along. Add a SplineContainer component to an object and assign it here.
18
+ */
19
+ spline = null;
20
+ /** The object to move along the spline. If object is undefined then the spline walker will use the gameObject the component has been added to
21
+ * @default undefined
22
+ */
23
+ object = undefined;
24
+ /** The object to look at while moving along the spline
25
+ * @default null
26
+ */
27
+ lookAt = null;
28
+ /**
29
+ * When clamp is set to true, the position01 value will be clamped between 0 and 1 and the object will not loop the spline.
30
+ * @default false
31
+ */
32
+ clamp = false;
33
+ /** The current position on the spline. The value ranges from 0 (start of the spline curve) to 1 (end of the spline curve)
34
+ * @default 0
35
+ */
36
+ // @type float
37
+ get position01() {
38
+ return this._position01;
39
+ }
40
+ set position01(v) {
41
+ this._position01 = v;
42
+ this.updateFromPosition();
43
+ }
44
+ /** Resets the position to 0 */
45
+ reset() {
46
+ this._position01 = 0;
47
+ }
48
+ /**
49
+ * If true the SplineWalker will automatically move along the spline
50
+ * @default true
51
+ */
52
+ autoRun = true;
53
+ /**
54
+ * The duration in seconds it takes to complete the whole spline when autoWalk is enabled.
55
+ * @default 10
56
+ */
57
+ duration = 10;
58
+ // #region internal
59
+ _position01 = 0;
60
+ /** @internal */
61
+ start() {
62
+ if (this.object === undefined)
63
+ this.object = this.gameObject;
64
+ this.updateFromPosition();
65
+ }
66
+ update() {
67
+ if (this.autoRun) {
68
+ this._position01 += this.context.time.deltaTime / this.duration;
69
+ this.updateFromPosition();
70
+ }
71
+ }
72
+ updateFromPosition() {
73
+ if (!this.spline || !this.spline.curve)
74
+ return;
75
+ if (!this.object)
76
+ return;
77
+ if (this.clamp)
78
+ this._position01 = Mathf.clamp01(this._position01);
79
+ else
80
+ this._position01 = this._position01 % 1;
81
+ const t = this._position01 >= 1 ? 1 : this._position01 % 1;
82
+ const pt = this.spline.getPointAt(t);
83
+ this.object.worldPosition = pt;
84
+ if (!this.lookAt) {
85
+ const tan = this.spline.getTangentAt(t);
86
+ this.object.lookAt(pt.add(tan));
87
+ }
88
+ else
89
+ this.object.lookAt(this.lookAt.worldPosition);
90
+ }
91
+ }
92
+ __decorate([
93
+ serializeable(SplineContainer)
94
+ ], SplineWalker.prototype, "spline", void 0);
95
+ __decorate([
96
+ serializeable(Object3D)
97
+ ], SplineWalker.prototype, "object", void 0);
98
+ __decorate([
99
+ serializeable(Object3D)
100
+ ], SplineWalker.prototype, "lookAt", void 0);
101
+ __decorate([
102
+ serializeable()
103
+ ], SplineWalker.prototype, "clamp", void 0);
104
+ __decorate([
105
+ serializeable()
106
+ ], SplineWalker.prototype, "position01", null);
107
+ __decorate([
108
+ serializeable()
109
+ ], SplineWalker.prototype, "autoRun", void 0);
110
+ __decorate([
111
+ serializeable()
112
+ ], SplineWalker.prototype, "duration", void 0);
113
+ //# sourceMappingURL=SplineWalker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplineWalker.js","sourceRoot":"","sources":["../../../src/engine-components/splines/SplineWalker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { SplineContainer } from "./Spline.js";
2
+ export { SplineUtils } from "./SplineUtils.js";
3
+ export { SplineWalker } from "./SplineWalker.js";
@@ -0,0 +1,4 @@
1
+ export { SplineContainer } from "./Spline.js";
2
+ export { SplineUtils } from "./SplineUtils.js";
3
+ export { SplineWalker } from "./SplineWalker.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine-components/splines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "4.8.8",
3
+ "version": "4.8.9-next.5e888f7",
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": {
@@ -93,8 +93,8 @@
93
93
  ],
94
94
  "dependencies": {
95
95
  "@dimforge/rapier3d-compat": "^0.14.0",
96
- "@needle-tools/gltf-progressive": "3.3.2",
97
- "@needle-tools/three-animation-pointer": "1.0.1",
96
+ "@needle-tools/gltf-progressive": "3.3.3",
97
+ "@needle-tools/three-animation-pointer": "1.0.2",
98
98
  "@webxr-input-profiles/motion-controllers": "^1.0.0",
99
99
  "flatbuffers": "2.0.4",
100
100
  "md5": "^2.3.0",
@@ -168,4 +168,4 @@
168
168
  "module": "lib/needle-engine.js",
169
169
  "typings": "lib/needle-engine.d.ts",
170
170
  "types": "lib/needle-engine.d.ts"
171
- }
171
+ }
@@ -24,9 +24,12 @@ export function copyFilesSync(src, dest, override = true, ctx = undefined) {
24
24
  });
25
25
  }
26
26
  else if (override || !existsSync(dest)) {
27
- if (ctx) {
28
- ctx.count += 1;
27
+ if (exists) {
28
+ if (ctx) {
29
+ ctx.count += 1;
30
+ }
31
+ copyFileSync(src, dest);
29
32
  }
30
- copyFileSync(src, dest);
33
+ else console.warn(`[needle-copy] - File at ${src} does not exist`);
31
34
  }
32
35
  };
@@ -60,8 +60,9 @@ const packages_to_resolve = {
60
60
  'postprocessing': "auto-resolve",
61
61
  '@dimforge/rapier3d-compat': "auto-resolve",
62
62
 
63
- '@needle-tools/gltf-progressive': "auto-resolve",
64
- '@needle-tools/materialx': "auto-resolve",
63
+ // Note: this isnt necessary anymore since we exclude needle-engine from optimization when locally installed in the dev server
64
+ // '@needle-tools/gltf-progressive': "auto-resolve",
65
+ // '@needle-tools/materialx': "auto-resolve",
65
66
  }
66
67
 
67
68
  /**
@@ -63,16 +63,16 @@ function createPlugin(isInstalled) {
63
63
  name: "needle-editor-connection",
64
64
  // Setup HMR port for connecting to the editor
65
65
  config(config) {
66
- if (!isInstalled) {
66
+ if (isInstalled) {
67
67
  if (!config.server) config.server = {};
68
68
  if (!config.server.hmr) config.server.hmr = {};
69
69
  if (config.server.hmr === false) {
70
- setTimeout(() => console.log("HMR is disabled, not initializing Needle Editor"));
70
+ setTimeout(() => console.log("[needle-editor-sync] HMR is disabled, not initializing Needle Editor"));
71
71
  return;
72
72
  }
73
- if (config.server.hmr.port !== 1107) {
73
+ if (config.server.hmr.port === undefined) {
74
74
  config.server.hmr.port = 1107;
75
- setTimeout(() => console.log("Update HMR port to " + config.server.hmr.port));
75
+ setTimeout(() => console.log("[needle-editor-sync] Update HMR port to " + config.server.hmr.port));
76
76
  }
77
77
  }
78
78
 
@@ -95,6 +95,8 @@ import { SmoothFollow } from "../../engine-components/SmoothFollow.js";
95
95
  import { SpatialTriggerReceiver } from "../../engine-components/SpatialTrigger.js";
96
96
  import { SpatialTrigger } from "../../engine-components/SpatialTrigger.js";
97
97
  import { SpectatorCamera } from "../../engine-components/SpectatorCamera.js";
98
+ import { SplineContainer } from "../../engine-components/splines/Spline.js";
99
+ import { SplineWalker } from "../../engine-components/splines/SplineWalker.js";
98
100
  import { SpriteRenderer } from "../../engine-components/SpriteRenderer.js";
99
101
  import { SyncedCamera } from "../../engine-components/SyncedCamera.js";
100
102
  import { SyncedRoom } from "../../engine-components/SyncedRoom.js";
@@ -245,6 +247,8 @@ TypeStore.add("SmoothFollow", SmoothFollow);
245
247
  TypeStore.add("SpatialTriggerReceiver", SpatialTriggerReceiver);
246
248
  TypeStore.add("SpatialTrigger", SpatialTrigger);
247
249
  TypeStore.add("SpectatorCamera", SpectatorCamera);
250
+ TypeStore.add("SplineContainer", SplineContainer);
251
+ TypeStore.add("SplineWalker", SplineWalker);
248
252
  TypeStore.add("SpriteRenderer", SpriteRenderer);
249
253
  TypeStore.add("SyncedCamera", SyncedCamera);
250
254
  TypeStore.add("SyncedRoom", SyncedRoom);
@@ -440,6 +440,8 @@ export class AssetReference {
440
440
  const scene = asset.scene as Group;
441
441
  if (scene.isGroup && scene.children.length === 1 && scene.children[0].name + "glb" === scene.name) {
442
442
  const root = scene.children[0];
443
+ // HACK we want to keep the animations on the root object. Please keep in sync with engine_loader. This is so autoplay animations works (e.g. with AnimationUtils.autoplayAnimations where we get the animations from the root object). One case where an additioanl root exists is the SOC old mcdonald scene
444
+ root.animations = scene.animations;
443
445
  return root;
444
446
  }
445
447
  // ok the scene is the scene, just use that then
@@ -120,7 +120,7 @@ export class AnimationUtils {
120
120
  }
121
121
  }
122
122
 
123
- let animationComponent = findAnimationGameObjectInParent(obj) || findAnimationGameObjectInParent(scene);
123
+ let animationComponent = findAnimationComponentInParent(obj) || findAnimationComponentInParent(scene);
124
124
  if (!animationComponent) {
125
125
  const anim = TypeStore.get("Animation");
126
126
  animationComponent = scene.addComponent(anim);
@@ -137,18 +137,18 @@ export class AnimationUtils {
137
137
  }
138
138
  return animationComponents;
139
139
 
140
- function findAnimationGameObjectInParent(obj): IAnimationComponent | null {
140
+ function findAnimationComponentInParent(obj): IAnimationComponent | null {
141
141
  if (!obj) return null;
142
142
  const components = obj.userData?.components;
143
143
  if (components && components.length > 0) {
144
144
  for (let i = 0; i < components.length; i++) {
145
145
  const component = components[i] as IAnimationComponent;
146
146
  if (component.isAnimationComponent === true) {
147
- return obj;
147
+ return component;
148
148
  }
149
149
  }
150
150
  }
151
- return findAnimationGameObjectInParent(obj.parent);
151
+ return findAnimationComponentInParent(obj.parent);
152
152
  }
153
153
  }
154
154
  }