freeform-modeling-mcp 1.0.26

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 (81) hide show
  1. package/README.md +61 -0
  2. package/index.cjs +21 -0
  3. package/package.json +48 -0
  4. package/src/cli.ts +47 -0
  5. package/src/commands/start.ts +88 -0
  6. package/src/commands/status.ts +81 -0
  7. package/src/dev.ts +24 -0
  8. package/src/lib/fileproxy/index.ts +505 -0
  9. package/src/lib/fileproxy/proxy-server.js +347 -0
  10. package/src/lib/gltf2obj/compress.js +33 -0
  11. package/src/lib/gltf2obj/engine/core/core.js +34 -0
  12. package/src/lib/gltf2obj/engine/core/eventnotifier.js +39 -0
  13. package/src/lib/gltf2obj/engine/core/taskrunner.js +88 -0
  14. package/src/lib/gltf2obj/engine/export/exporter.js +38 -0
  15. package/src/lib/gltf2obj/engine/export/exporterbase.js +86 -0
  16. package/src/lib/gltf2obj/engine/export/exportermodel.js +117 -0
  17. package/src/lib/gltf2obj/engine/export/exporterobj.js +147 -0
  18. package/src/lib/gltf2obj/engine/geometry/box3d.js +60 -0
  19. package/src/lib/gltf2obj/engine/geometry/coord2d.js +35 -0
  20. package/src/lib/gltf2obj/engine/geometry/coord3d.js +126 -0
  21. package/src/lib/gltf2obj/engine/geometry/coord4d.js +15 -0
  22. package/src/lib/gltf2obj/engine/geometry/geometry.js +56 -0
  23. package/src/lib/gltf2obj/engine/geometry/matrix.js +440 -0
  24. package/src/lib/gltf2obj/engine/geometry/octree.js +160 -0
  25. package/src/lib/gltf2obj/engine/geometry/quaternion.js +83 -0
  26. package/src/lib/gltf2obj/engine/geometry/transformation.js +63 -0
  27. package/src/lib/gltf2obj/engine/geometry/tween.js +31 -0
  28. package/src/lib/gltf2obj/engine/import/importer.js +270 -0
  29. package/src/lib/gltf2obj/engine/import/importerbase.js +115 -0
  30. package/src/lib/gltf2obj/engine/import/importerfiles.js +139 -0
  31. package/src/lib/gltf2obj/engine/import/importergltf.js +1045 -0
  32. package/src/lib/gltf2obj/engine/import/importerutils.js +102 -0
  33. package/src/lib/gltf2obj/engine/io/binaryreader.js +93 -0
  34. package/src/lib/gltf2obj/engine/io/binarywriter.js +92 -0
  35. package/src/lib/gltf2obj/engine/io/bufferutils.js +85 -0
  36. package/src/lib/gltf2obj/engine/io/externallibs.js +42 -0
  37. package/src/lib/gltf2obj/engine/io/fileutils.js +120 -0
  38. package/src/lib/gltf2obj/engine/io/textwriter.js +41 -0
  39. package/src/lib/gltf2obj/engine/main.js +19 -0
  40. package/src/lib/gltf2obj/engine/model/color.js +130 -0
  41. package/src/lib/gltf2obj/engine/model/generator.js +433 -0
  42. package/src/lib/gltf2obj/engine/model/material.js +243 -0
  43. package/src/lib/gltf2obj/engine/model/mesh.js +173 -0
  44. package/src/lib/gltf2obj/engine/model/meshbuffer.js +233 -0
  45. package/src/lib/gltf2obj/engine/model/meshinstance.js +128 -0
  46. package/src/lib/gltf2obj/engine/model/meshutils.js +64 -0
  47. package/src/lib/gltf2obj/engine/model/model.js +195 -0
  48. package/src/lib/gltf2obj/engine/model/modelfinalization.js +377 -0
  49. package/src/lib/gltf2obj/engine/model/modelutils.js +117 -0
  50. package/src/lib/gltf2obj/engine/model/node.js +178 -0
  51. package/src/lib/gltf2obj/engine/model/object.js +90 -0
  52. package/src/lib/gltf2obj/engine/model/property.js +86 -0
  53. package/src/lib/gltf2obj/engine/model/quantities.js +46 -0
  54. package/src/lib/gltf2obj/engine/model/topology.js +139 -0
  55. package/src/lib/gltf2obj/engine/model/triangle.js +99 -0
  56. package/src/lib/gltf2obj/engine/threejs/threemodelloader.js +85 -0
  57. package/src/lib/gltf2obj/handler.js +63 -0
  58. package/src/lib/gltf2obj/index.js +47 -0
  59. package/src/lib/logger.ts +304 -0
  60. package/src/lib/print.ts +37 -0
  61. package/src/lib/utils.ts +34 -0
  62. package/src/lib/wsbridge/bridge.ts +639 -0
  63. package/src/lib/wsbridge/lock.ts +258 -0
  64. package/src/llmClient.ts +245 -0
  65. package/src/prompt.ts +187 -0
  66. package/src/server.ts +125 -0
  67. package/src/tools/assets-tool.ts +314 -0
  68. package/src/tools/basic-tools.ts +531 -0
  69. package/src/tools/index.ts +2 -0
  70. package/src/tools/material-tools.ts +88 -0
  71. package/src/tools/modeling/auxiliary-curve-tool.ts +44 -0
  72. package/src/tools/modeling/find-face.ts +38 -0
  73. package/src/tools/modeling/sweep-tool.ts +60 -0
  74. package/src/tools/modeling/utils.ts +181 -0
  75. package/src/tools/modeling-tools.ts +135 -0
  76. package/src/tools/screenshot-tools.ts +107 -0
  77. package/src/tools/tools-info.ts +107 -0
  78. package/src/tools/tripo3d-tools.ts +496 -0
  79. package/src/types/index.ts +25 -0
  80. package/src/types/tripo3d.ts +38 -0
  81. package/tsconfig.json +22 -0
@@ -0,0 +1,440 @@
1
+ import { Quaternion } from './quaternion.js';
2
+ import { Coord3D, VectorLength3D } from './coord3d.js';
3
+ import { Coord4D } from './coord4d.js';
4
+ import { IsEqual, IsNegative } from './geometry.js';
5
+ import { QuaternionFromAxisAngle } from './quaternion.js';
6
+
7
+ export class Matrix
8
+ {
9
+ constructor (matrix)
10
+ {
11
+ this.matrix = null;
12
+ if (matrix !== undefined && matrix !== null) {
13
+ this.matrix = matrix;
14
+ }
15
+ }
16
+
17
+ IsValid ()
18
+ {
19
+ return this.matrix !== null;
20
+ }
21
+
22
+ Set (matrix)
23
+ {
24
+ this.matrix = matrix;
25
+ return this;
26
+ }
27
+
28
+ Get ()
29
+ {
30
+ return this.matrix;
31
+ }
32
+
33
+ Clone ()
34
+ {
35
+ let result = [
36
+ this.matrix[0], this.matrix[1], this.matrix[2], this.matrix[3],
37
+ this.matrix[4], this.matrix[5], this.matrix[6], this.matrix[7],
38
+ this.matrix[8], this.matrix[9], this.matrix[10], this.matrix[11],
39
+ this.matrix[12], this.matrix[13], this.matrix[14], this.matrix[15]
40
+ ];
41
+ return new Matrix (result);
42
+ }
43
+
44
+ CreateIdentity ()
45
+ {
46
+ this.matrix = [
47
+ 1.0, 0.0, 0.0, 0.0,
48
+ 0.0, 1.0, 0.0, 0.0,
49
+ 0.0, 0.0, 1.0, 0.0,
50
+ 0.0, 0.0, 0.0, 1.0
51
+ ];
52
+ return this;
53
+ }
54
+
55
+ IsIdentity ()
56
+ {
57
+ let identity = new Matrix ().CreateIdentity ().Get ();
58
+ for (let i = 0; i < 16; i++) {
59
+ if (!IsEqual (this.matrix[i], identity[i])) {
60
+ return false;
61
+ }
62
+ }
63
+ return true;
64
+ }
65
+
66
+ CreateTranslation (x, y, z)
67
+ {
68
+ this.matrix = [
69
+ 1.0, 0.0, 0.0, 0.0,
70
+ 0.0, 1.0, 0.0, 0.0,
71
+ 0.0, 0.0, 1.0, 0.0,
72
+ x, y, z, 1.0
73
+ ];
74
+ return this;
75
+ }
76
+
77
+ CreateRotation (x, y, z, w)
78
+ {
79
+ let x2 = x + x;
80
+ let y2 = y + y;
81
+ let z2 = z + z;
82
+ let xx = x * x2;
83
+ let xy = x * y2;
84
+ let xz = x * z2;
85
+ let yy = y * y2;
86
+ let yz = y * z2;
87
+ let zz = z * z2;
88
+ let wx = w * x2;
89
+ let wy = w * y2;
90
+ let wz = w * z2;
91
+ this.matrix = [
92
+ 1.0 - (yy + zz), xy + wz, xz - wy, 0.0,
93
+ xy - wz, 1.0 - (xx + zz), yz + wx, 0.0,
94
+ xz + wy, yz - wx, 1.0 - (xx + yy), 0.0,
95
+ 0.0, 0.0, 0.0, 1.0
96
+ ];
97
+ return this;
98
+ }
99
+
100
+ CreateRotationAxisAngle (axis, angle)
101
+ {
102
+ let quaternion = QuaternionFromAxisAngle (axis, angle);
103
+ return this.CreateRotation (quaternion.x, quaternion.y, quaternion.z, quaternion.w);
104
+ }
105
+
106
+ CreateScale (x, y, z)
107
+ {
108
+ this.matrix = [
109
+ x, 0.0, 0.0, 0.0,
110
+ 0.0, y, 0.0, 0.0,
111
+ 0.0, 0.0, z, 0.0,
112
+ 0.0, 0.0, 0.0, 1.0
113
+ ];
114
+ return this;
115
+ }
116
+
117
+ ComposeTRS (translation, rotation, scale)
118
+ {
119
+ let tx = translation.x;
120
+ let ty = translation.y;
121
+ let tz = translation.z;
122
+ let qx = rotation.x;
123
+ let qy = rotation.y;
124
+ let qz = rotation.z;
125
+ let qw = rotation.w;
126
+ let sx = scale.x;
127
+ let sy = scale.y;
128
+ let sz = scale.z;
129
+
130
+ let x2 = qx + qx;
131
+ let y2 = qy + qy;
132
+ let z2 = qz + qz;
133
+ let xx = qx * x2;
134
+ let xy = qx * y2;
135
+ let xz = qx * z2;
136
+ let yy = qy * y2;
137
+ let yz = qy * z2;
138
+ let zz = qz * z2;
139
+ let wx = qw * x2;
140
+ let wy = qw * y2;
141
+ let wz = qw * z2;
142
+
143
+ this.matrix = [
144
+ (1.0 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0.0,
145
+ (xy - wz) * sy, (1.0 - (xx + zz)) * sy, (yz + wx) * sy, 0.0,
146
+ (xz + wy) * sz, (yz - wx) * sz, (1.0 - (xx + yy)) * sz, 0.0,
147
+ tx, ty, tz, 1.0
148
+ ];
149
+ return this;
150
+ }
151
+
152
+ DecomposeTRS ()
153
+ {
154
+ let translation = new Coord3D (
155
+ this.matrix[12],
156
+ this.matrix[13],
157
+ this.matrix[14]
158
+ );
159
+
160
+ let sx = VectorLength3D (this.matrix[0], this.matrix[1], this.matrix[2]);
161
+ let sy = VectorLength3D (this.matrix[4], this.matrix[5], this.matrix[6]);
162
+ let sz = VectorLength3D (this.matrix[8], this.matrix[9], this.matrix[10]);
163
+ let determinant = this.Determinant ();
164
+ if (IsNegative (determinant)) {
165
+ sx *= -1.0;
166
+ }
167
+ let scale = new Coord3D (sx, sy, sz);
168
+
169
+ let m00 = this.matrix[0] / sx;
170
+ let m01 = this.matrix[4] / sy;
171
+ let m02 = this.matrix[8] / sz;
172
+ let m10 = this.matrix[1] / sx;
173
+ let m11 = this.matrix[5] / sy;
174
+ let m12 = this.matrix[9] / sz;
175
+ let m20 = this.matrix[2] / sx;
176
+ let m21 = this.matrix[6] / sy;
177
+ let m22 = this.matrix[10] / sz;
178
+
179
+ // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
180
+ let rotation = null;
181
+ let tr = m00 + m11 + m22;
182
+ if (tr > 0.0) {
183
+ let s = Math.sqrt (tr + 1.0) * 2.0;
184
+ rotation = new Quaternion (
185
+ (m21 - m12) / s,
186
+ (m02 - m20) / s,
187
+ (m10 - m01) / s,
188
+ 0.25 * s
189
+ );
190
+ } else if ((m00 > m11) && (m00 > m22)) {
191
+ let s = Math.sqrt (1.0 + m00 - m11 - m22) * 2.0;
192
+ rotation = new Quaternion (
193
+ 0.25 * s,
194
+ (m01 + m10) / s,
195
+ (m02 + m20) / s,
196
+ (m21 - m12) / s
197
+ );
198
+ } else if (m11 > m22) {
199
+ let s = Math.sqrt (1.0 + m11 - m00 - m22) * 2.0;
200
+ rotation = new Quaternion (
201
+ (m01 + m10) / s,
202
+ 0.25 * s,
203
+ (m12 + m21) / s,
204
+ (m02 - m20) / s
205
+ );
206
+ } else {
207
+ let s = Math.sqrt (1.0 + m22 - m00 - m11) * 2.0;
208
+ rotation = new Quaternion (
209
+ (m02 + m20) / s,
210
+ (m12 + m21) / s,
211
+ 0.25 * s,
212
+ (m10 - m01) / s
213
+ );
214
+ }
215
+
216
+ return {
217
+ translation : translation,
218
+ rotation : rotation,
219
+ scale : scale
220
+ };
221
+ }
222
+
223
+ Determinant ()
224
+ {
225
+ let a00 = this.matrix[0];
226
+ let a01 = this.matrix[1];
227
+ let a02 = this.matrix[2];
228
+ let a03 = this.matrix[3];
229
+ let a10 = this.matrix[4];
230
+ let a11 = this.matrix[5];
231
+ let a12 = this.matrix[6];
232
+ let a13 = this.matrix[7];
233
+ let a20 = this.matrix[8];
234
+ let a21 = this.matrix[9];
235
+ let a22 = this.matrix[10];
236
+ let a23 = this.matrix[11];
237
+ let a30 = this.matrix[12];
238
+ let a31 = this.matrix[13];
239
+ let a32 = this.matrix[14];
240
+ let a33 = this.matrix[15];
241
+
242
+ let b00 = a00 * a11 - a01 * a10;
243
+ let b01 = a00 * a12 - a02 * a10;
244
+ let b02 = a00 * a13 - a03 * a10;
245
+ let b03 = a01 * a12 - a02 * a11;
246
+ let b04 = a01 * a13 - a03 * a11;
247
+ let b05 = a02 * a13 - a03 * a12;
248
+ let b06 = a20 * a31 - a21 * a30;
249
+ let b07 = a20 * a32 - a22 * a30;
250
+ let b08 = a20 * a33 - a23 * a30;
251
+ let b09 = a21 * a32 - a22 * a31;
252
+ let b10 = a21 * a33 - a23 * a31;
253
+ let b11 = a22 * a33 - a23 * a32;
254
+
255
+ let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
256
+ return determinant;
257
+ }
258
+
259
+ Invert ()
260
+ {
261
+ let a00 = this.matrix[0];
262
+ let a01 = this.matrix[1];
263
+ let a02 = this.matrix[2];
264
+ let a03 = this.matrix[3];
265
+ let a10 = this.matrix[4];
266
+ let a11 = this.matrix[5];
267
+ let a12 = this.matrix[6];
268
+ let a13 = this.matrix[7];
269
+ let a20 = this.matrix[8];
270
+ let a21 = this.matrix[9];
271
+ let a22 = this.matrix[10];
272
+ let a23 = this.matrix[11];
273
+ let a30 = this.matrix[12];
274
+ let a31 = this.matrix[13];
275
+ let a32 = this.matrix[14];
276
+ let a33 = this.matrix[15];
277
+
278
+ let b00 = a00 * a11 - a01 * a10;
279
+ let b01 = a00 * a12 - a02 * a10;
280
+ let b02 = a00 * a13 - a03 * a10;
281
+ let b03 = a01 * a12 - a02 * a11;
282
+ let b04 = a01 * a13 - a03 * a11;
283
+ let b05 = a02 * a13 - a03 * a12;
284
+ let b06 = a20 * a31 - a21 * a30;
285
+ let b07 = a20 * a32 - a22 * a30;
286
+ let b08 = a20 * a33 - a23 * a30;
287
+ let b09 = a21 * a32 - a22 * a31;
288
+ let b10 = a21 * a33 - a23 * a31;
289
+ let b11 = a22 * a33 - a23 * a32;
290
+
291
+ let determinant = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
292
+ if (IsEqual (determinant, 0.0)) {
293
+ return null;
294
+ }
295
+
296
+ let result = [
297
+ (a11 * b11 - a12 * b10 + a13 * b09) / determinant,
298
+ (a02 * b10 - a01 * b11 - a03 * b09) / determinant,
299
+ (a31 * b05 - a32 * b04 + a33 * b03) / determinant,
300
+ (a22 * b04 - a21 * b05 - a23 * b03) / determinant,
301
+ (a12 * b08 - a10 * b11 - a13 * b07) / determinant,
302
+ (a00 * b11 - a02 * b08 + a03 * b07) / determinant,
303
+ (a32 * b02 - a30 * b05 - a33 * b01) / determinant,
304
+ (a20 * b05 - a22 * b02 + a23 * b01) / determinant,
305
+ (a10 * b10 - a11 * b08 + a13 * b06) / determinant,
306
+ (a01 * b08 - a00 * b10 - a03 * b06) / determinant,
307
+ (a30 * b04 - a31 * b02 + a33 * b00) / determinant,
308
+ (a21 * b02 - a20 * b04 - a23 * b00) / determinant,
309
+ (a11 * b07 - a10 * b09 - a12 * b06) / determinant,
310
+ (a00 * b09 - a01 * b07 + a02 * b06) / determinant,
311
+ (a31 * b01 - a30 * b03 - a32 * b00) / determinant,
312
+ (a20 * b03 - a21 * b01 + a22 * b00) / determinant
313
+ ];
314
+
315
+ return new Matrix (result);
316
+ }
317
+
318
+ Transpose ()
319
+ {
320
+ let result = [
321
+ this.matrix[0], this.matrix[4], this.matrix[8], this.matrix[12],
322
+ this.matrix[1], this.matrix[5], this.matrix[9], this.matrix[13],
323
+ this.matrix[2], this.matrix[6], this.matrix[10], this.matrix[14],
324
+ this.matrix[3], this.matrix[7], this.matrix[11], this.matrix[15]
325
+ ];
326
+ return new Matrix (result);
327
+ }
328
+
329
+ InvertTranspose ()
330
+ {
331
+ let result = this.Invert ();
332
+ if (result === null) {
333
+ return null;
334
+ }
335
+ return result.Transpose ();
336
+ }
337
+
338
+ MultiplyVector (vector)
339
+ {
340
+ let a00 = vector.x;
341
+ let a01 = vector.y;
342
+ let a02 = vector.z;
343
+ let a03 = vector.w;
344
+
345
+ let b00 = this.matrix[0];
346
+ let b01 = this.matrix[1];
347
+ let b02 = this.matrix[2];
348
+ let b03 = this.matrix[3];
349
+ let b10 = this.matrix[4];
350
+ let b11 = this.matrix[5];
351
+ let b12 = this.matrix[6];
352
+ let b13 = this.matrix[7];
353
+ let b20 = this.matrix[8];
354
+ let b21 = this.matrix[9];
355
+ let b22 = this.matrix[10];
356
+ let b23 = this.matrix[11];
357
+ let b30 = this.matrix[12];
358
+ let b31 = this.matrix[13];
359
+ let b32 = this.matrix[14];
360
+ let b33 = this.matrix[15];
361
+
362
+ let result = new Coord4D (
363
+ a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30,
364
+ a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31,
365
+ a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32,
366
+ a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33
367
+ );
368
+ return result;
369
+ }
370
+
371
+ MultiplyMatrix (matrix)
372
+ {
373
+ let a00 = this.matrix[0];
374
+ let a01 = this.matrix[1];
375
+ let a02 = this.matrix[2];
376
+ let a03 = this.matrix[3];
377
+ let a10 = this.matrix[4];
378
+ let a11 = this.matrix[5];
379
+ let a12 = this.matrix[6];
380
+ let a13 = this.matrix[7];
381
+ let a20 = this.matrix[8];
382
+ let a21 = this.matrix[9];
383
+ let a22 = this.matrix[10];
384
+ let a23 = this.matrix[11];
385
+ let a30 = this.matrix[12];
386
+ let a31 = this.matrix[13];
387
+ let a32 = this.matrix[14];
388
+ let a33 = this.matrix[15];
389
+
390
+ let b00 = matrix.matrix[0];
391
+ let b01 = matrix.matrix[1];
392
+ let b02 = matrix.matrix[2];
393
+ let b03 = matrix.matrix[3];
394
+ let b10 = matrix.matrix[4];
395
+ let b11 = matrix.matrix[5];
396
+ let b12 = matrix.matrix[6];
397
+ let b13 = matrix.matrix[7];
398
+ let b20 = matrix.matrix[8];
399
+ let b21 = matrix.matrix[9];
400
+ let b22 = matrix.matrix[10];
401
+ let b23 = matrix.matrix[11];
402
+ let b30 = matrix.matrix[12];
403
+ let b31 = matrix.matrix[13];
404
+ let b32 = matrix.matrix[14];
405
+ let b33 = matrix.matrix[15];
406
+
407
+ let result = [
408
+ a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30,
409
+ a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31,
410
+ a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32,
411
+ a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33,
412
+ a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30,
413
+ a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31,
414
+ a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32,
415
+ a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33,
416
+ a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30,
417
+ a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31,
418
+ a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32,
419
+ a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33,
420
+ a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30,
421
+ a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31,
422
+ a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32,
423
+ a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33
424
+ ];
425
+
426
+ return new Matrix (result);
427
+ }
428
+ }
429
+
430
+ export function MatrixIsEqual (a, b)
431
+ {
432
+ const aMatrix = a.Get ();
433
+ const bMatrix = b.Get ();
434
+ for (let i = 0; i < 16; i++) {
435
+ if (!IsEqual (aMatrix[i], bMatrix[i])) {
436
+ return false;
437
+ }
438
+ }
439
+ return true;
440
+ }
@@ -0,0 +1,160 @@
1
+ import { Box3D } from './box3d.js';
2
+ import { Coord3D, CoordIsEqual3D } from './coord3d.js';
3
+ import { IsGreaterOrEqual, IsLowerOrEqual } from './geometry.js';
4
+
5
+ export class OctreeNode
6
+ {
7
+ constructor (boundingBox, level)
8
+ {
9
+ this.boundingBox = boundingBox;
10
+ this.level = level;
11
+ this.pointItems = [];
12
+ this.childNodes = [];
13
+ }
14
+
15
+ AddPoint (point, data, options)
16
+ {
17
+ let node = this.FindNodeForPoint (point);
18
+ if (node === null) {
19
+ return false;
20
+ }
21
+
22
+ if (node.FindPointDirectly (point) !== null) {
23
+ return false;
24
+ }
25
+
26
+ if (node.pointItems.length < options.maxPointsPerNode || node.level >= options.maxTreeDepth) {
27
+ node.AddPointDirectly (point, data);
28
+ return true;
29
+ } else {
30
+ node.CreateChildNodes ();
31
+ let oldPointItems = node.pointItems;
32
+ node.pointItems = [];
33
+ for (let i = 0; i < oldPointItems.length; i++) {
34
+ let pointItem = oldPointItems[i];
35
+ if (!node.AddPoint (pointItem.point, pointItem.data, options)) {
36
+ return false;
37
+ }
38
+ }
39
+ return node.AddPoint (point, data, options);
40
+ }
41
+ }
42
+
43
+ FindPoint (point)
44
+ {
45
+ let node = this.FindNodeForPoint (point);
46
+ if (node === null) {
47
+ return null;
48
+ }
49
+ return node.FindPointDirectly (point);
50
+ }
51
+
52
+ AddPointDirectly (point, data)
53
+ {
54
+ this.pointItems.push ({
55
+ point : point,
56
+ data : data
57
+ });
58
+ }
59
+
60
+ FindPointDirectly (point)
61
+ {
62
+ for (let i = 0; i < this.pointItems.length; i++) {
63
+ let pointItem = this.pointItems[i];
64
+ if (CoordIsEqual3D (point, pointItem.point)) {
65
+ return pointItem.data;
66
+ }
67
+ }
68
+ return null;
69
+ }
70
+
71
+ FindNodeForPoint (point)
72
+ {
73
+ if (!this.IsPointInBounds (point)) {
74
+ return null;
75
+ }
76
+
77
+ if (this.childNodes.length === 0) {
78
+ return this;
79
+ }
80
+
81
+ for (let i = 0; i < this.childNodes.length; i++) {
82
+ let childNode = this.childNodes[i];
83
+ let foundNode = childNode.FindNodeForPoint (point);
84
+ if (foundNode !== null) {
85
+ return foundNode;
86
+ }
87
+ }
88
+
89
+ return null;
90
+ }
91
+
92
+ CreateChildNodes ()
93
+ {
94
+ function AddChildNode (node, minX, minY, minZ, sizeX, sizeY, sizeZ)
95
+ {
96
+ let box = new Box3D (
97
+ new Coord3D (minX, minY, minZ),
98
+ new Coord3D (minX + sizeX, minY + sizeY, minZ + sizeZ)
99
+ );
100
+ node.childNodes.push (new OctreeNode (box, node.level + 1));
101
+ }
102
+
103
+ let min = this.boundingBox.min;
104
+ let center = this.boundingBox.GetCenter ();
105
+ let sizeX = (this.boundingBox.max.x - this.boundingBox.min.x) / 2.0;
106
+ let sizeY = (this.boundingBox.max.y - this.boundingBox.min.y) / 2.0;
107
+ let sizeZ = (this.boundingBox.max.z - this.boundingBox.min.z) / 2.0;
108
+
109
+ AddChildNode (this, min.x, min.y, min.z, sizeX, sizeY, sizeZ);
110
+ AddChildNode (this, center.x, min.y, min.z, sizeX, sizeY, sizeZ);
111
+ AddChildNode (this, min.x, center.y, min.z, sizeX, sizeY, sizeZ);
112
+ AddChildNode (this, center.x, center.y, min.z, sizeX, sizeY, sizeZ);
113
+ AddChildNode (this, min.x, min.y, center.z, sizeX, sizeY, sizeZ);
114
+ AddChildNode (this, center.x, min.y, center.z, sizeX, sizeY, sizeZ);
115
+ AddChildNode (this, min.x, center.y, center.z, sizeX, sizeY, sizeZ);
116
+ AddChildNode (this, center.x, center.y, center.z, sizeX, sizeY, sizeZ);
117
+ }
118
+
119
+ IsPointInBounds (point)
120
+ {
121
+ let isEqual =
122
+ IsGreaterOrEqual (point.x, this.boundingBox.min.x) &&
123
+ IsGreaterOrEqual (point.y, this.boundingBox.min.y) &&
124
+ IsGreaterOrEqual (point.z, this.boundingBox.min.z) &&
125
+ IsLowerOrEqual (point.x, this.boundingBox.max.x) &&
126
+ IsLowerOrEqual (point.y, this.boundingBox.max.y) &&
127
+ IsLowerOrEqual (point.z, this.boundingBox.max.z);
128
+ return isEqual;
129
+ }
130
+ }
131
+
132
+ export class Octree
133
+ {
134
+ constructor (boundingBox, options)
135
+ {
136
+ this.options = {
137
+ maxPointsPerNode : 10,
138
+ maxTreeDepth : 10
139
+ };
140
+ if (options !== undefined) {
141
+ if (options.maxPointsPerNode !== undefined) {
142
+ this.options.maxPointsPerNode = options.maxPointsPerNode;
143
+ }
144
+ if (options.maxTreeDepth !== undefined) {
145
+ this.options.maxTreeDepth = options.maxTreeDepth;
146
+ }
147
+ }
148
+ this.rootNode = new OctreeNode (boundingBox, 0);
149
+ }
150
+
151
+ AddPoint (point, data)
152
+ {
153
+ return this.rootNode.AddPoint (point, data, this.options);
154
+ }
155
+
156
+ FindPoint (point)
157
+ {
158
+ return this.rootNode.FindPoint (point);
159
+ }
160
+ }
@@ -0,0 +1,83 @@
1
+ import { IsEqual } from './geometry.js';
2
+
3
+ export class Quaternion
4
+ {
5
+ constructor (x, y, z, w)
6
+ {
7
+ this.x = x;
8
+ this.y = y;
9
+ this.z = z;
10
+ this.w = w;
11
+ }
12
+ }
13
+
14
+ export function QuaternionIsEqual (a, b)
15
+ {
16
+ return IsEqual (a.x, b.x) && IsEqual (a.y, b.y) && IsEqual (a.z, b.z) && IsEqual (a.w, b.w);
17
+ }
18
+
19
+ export function ArrayToQuaternion (arr)
20
+ {
21
+ return new Quaternion (arr[0], arr[1], arr[2], arr[3]);
22
+ }
23
+
24
+ export function QuaternionFromAxisAngle (axis, angle)
25
+ {
26
+ const a = angle / 2.0;
27
+ const s = Math.sin (a);
28
+
29
+ return new Quaternion (
30
+ axis.x * s,
31
+ axis.y * s,
32
+ axis.z * s,
33
+ Math.cos (a)
34
+ );
35
+ }
36
+
37
+ export function QuaternionFromXYZ (x, y, z, mode) {
38
+
39
+ const c1 = Math.cos (x / 2.0);
40
+ const c2 = Math.cos (y / 2.0);
41
+ const c3 = Math.cos (z / 2.0);
42
+
43
+ const s1 = Math.sin (x / 2.0);
44
+ const s2 = Math.sin (y / 2.0);
45
+ const s3 = Math.sin (z / 2.0);
46
+
47
+ let quaternion = new Quaternion (0.0, 0.0, 0.0, 1.0);
48
+ if (mode === 'XYZ') {
49
+ quaternion.x = s1 * c2 * c3 + c1 * s2 * s3;
50
+ quaternion.y = c1 * s2 * c3 - s1 * c2 * s3;
51
+ quaternion.z = c1 * c2 * s3 + s1 * s2 * c3;
52
+ quaternion.w = c1 * c2 * c3 - s1 * s2 * s3;
53
+ } else if (mode === 'YXZ') {
54
+ quaternion.x = s1 * c2 * c3 + c1 * s2 * s3;
55
+ quaternion.y = c1 * s2 * c3 - s1 * c2 * s3;
56
+ quaternion.z = c1 * c2 * s3 - s1 * s2 * c3;
57
+ quaternion.w = c1 * c2 * c3 + s1 * s2 * s3;
58
+ } else if (mode === 'ZXY') {
59
+ quaternion.x = s1 * c2 * c3 - c1 * s2 * s3;
60
+ quaternion.y = c1 * s2 * c3 + s1 * c2 * s3;
61
+ quaternion.z = c1 * c2 * s3 + s1 * s2 * c3;
62
+ quaternion.w = c1 * c2 * c3 - s1 * s2 * s3;
63
+ } else if (mode === 'ZYX') {
64
+ quaternion.x = s1 * c2 * c3 - c1 * s2 * s3;
65
+ quaternion.y = c1 * s2 * c3 + s1 * c2 * s3;
66
+ quaternion.z = c1 * c2 * s3 - s1 * s2 * c3;
67
+ quaternion.w = c1 * c2 * c3 + s1 * s2 * s3;
68
+ } else if (mode === 'YZX') {
69
+ quaternion.x = s1 * c2 * c3 + c1 * s2 * s3;
70
+ quaternion.y = c1 * s2 * c3 + s1 * c2 * s3;
71
+ quaternion.z = c1 * c2 * s3 - s1 * s2 * c3;
72
+ quaternion.w = c1 * c2 * c3 - s1 * s2 * s3;
73
+ } else if (mode === 'XZY') {
74
+ quaternion.x = s1 * c2 * c3 - c1 * s2 * s3;
75
+ quaternion.y = c1 * s2 * c3 - s1 * c2 * s3;
76
+ quaternion.z = c1 * c2 * s3 + s1 * s2 * c3;
77
+ quaternion.w = c1 * c2 * c3 + s1 * s2 * s3;
78
+ } else {
79
+ return null;
80
+ }
81
+
82
+ return quaternion;
83
+ }