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,377 @@
1
+ import { CopyObjectAttributes } from '../core/core.js';
2
+ import { AddCoord3D, Coord3D, CoordIsEqual3D } from '../geometry/coord3d.js';
3
+ import { RGBColor } from './color.js';
4
+ import { PhongMaterial } from './material.js';
5
+ import { CalculateTriangleNormal, GetMeshType, MeshType } from './meshutils.js';
6
+
7
+ class ModelFinalizer
8
+ {
9
+ constructor (params)
10
+ {
11
+ this.params = {
12
+ getDefaultMaterialColor : () => {
13
+ return new RGBColor (0, 0, 0);
14
+ }
15
+ };
16
+ CopyObjectAttributes (params, this.params);
17
+ this.defaultMaterialIndex = null;
18
+ }
19
+
20
+ Finalize (model)
21
+ {
22
+ this.Reset ();
23
+
24
+ this.FinalizeMeshes (model);
25
+ this.FinalizeMaterials (model);
26
+ this.FinalizeNodes (model);
27
+ }
28
+
29
+ FinalizeMaterials (model)
30
+ {
31
+ if (model.VertexColorCount () === 0) {
32
+ return;
33
+ }
34
+
35
+ let materialHasVertexColors = new Map ();
36
+ for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {
37
+ let mesh = model.GetMesh (meshIndex);
38
+ for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
39
+ let triangle = mesh.GetTriangle (triangleIndex);
40
+ let hasVertexColors = triangle.HasVertexColors ();
41
+ if (!materialHasVertexColors.has (triangle.mat)) {
42
+ materialHasVertexColors.set (triangle.mat, hasVertexColors);
43
+ } else if (!hasVertexColors) {
44
+ materialHasVertexColors.set (triangle.mat, false);
45
+ }
46
+ }
47
+ }
48
+
49
+ for (let [materialIndex, hasVertexColors] of materialHasVertexColors) {
50
+ let material = model.GetMaterial (materialIndex);
51
+ material.vertexColors = hasVertexColors;
52
+ }
53
+ }
54
+
55
+ FinalizeMeshes (model)
56
+ {
57
+ for (let meshIndex = 0; meshIndex < model.MeshCount (); meshIndex++) {
58
+ let mesh = model.GetMesh (meshIndex);
59
+ let type = GetMeshType (mesh);
60
+ if (type === MeshType.Empty) {
61
+ model.RemoveMesh (meshIndex);
62
+ meshIndex = meshIndex - 1;
63
+ continue;
64
+ }
65
+ this.FinalizeMesh (model, mesh);
66
+ }
67
+ }
68
+
69
+ FinalizeMesh (model, mesh)
70
+ {
71
+ function CalculateCurveNormals (mesh)
72
+ {
73
+ function AddAverageNormal (mesh, triangle, vertexIndex, triangleNormals, vertexToTriangles)
74
+ {
75
+ function IsNormalInArray (array, normal)
76
+ {
77
+ for (let i = 0; i < array.length; i++) {
78
+ let current = array[i];
79
+ if (CoordIsEqual3D (current, normal)) {
80
+ return true;
81
+ }
82
+ }
83
+ return false;
84
+ }
85
+
86
+ let averageNormals = [];
87
+ let neigTriangles = vertexToTriangles.get (vertexIndex);
88
+ for (let i = 0; i < neigTriangles.length; i++) {
89
+ let neigIndex = neigTriangles[i];
90
+ let neigTriangle = mesh.GetTriangle (neigIndex);
91
+ if (triangle.curve === neigTriangle.curve) {
92
+ let triangleNormal = triangleNormals[neigIndex];
93
+ if (!IsNormalInArray (averageNormals, triangleNormal)) {
94
+ averageNormals.push (triangleNormal);
95
+ }
96
+ }
97
+ }
98
+
99
+ let averageNormal = new Coord3D (0.0, 0.0, 0.0);
100
+ for (let i = 0; i < averageNormals.length; i++) {
101
+ averageNormal = AddCoord3D (averageNormal, averageNormals[i]);
102
+ }
103
+ averageNormal.MultiplyScalar (1.0 / averageNormals.length);
104
+ averageNormal.Normalize ();
105
+ return mesh.AddNormal (averageNormal);
106
+ }
107
+
108
+ let triangleNormals = [];
109
+ let vertexToTriangles = new Map ();
110
+
111
+ for (let vertexIndex = 0; vertexIndex < mesh.VertexCount (); vertexIndex++) {
112
+ vertexToTriangles.set (vertexIndex, []);
113
+ }
114
+
115
+ for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
116
+ let triangle = mesh.GetTriangle (triangleIndex);
117
+ let v0 = mesh.GetVertex (triangle.v0);
118
+ let v1 = mesh.GetVertex (triangle.v1);
119
+ let v2 = mesh.GetVertex (triangle.v2);
120
+ let normal = CalculateTriangleNormal (v0, v1, v2);
121
+ triangleNormals.push (normal);
122
+ vertexToTriangles.get (triangle.v0).push (triangleIndex);
123
+ vertexToTriangles.get (triangle.v1).push (triangleIndex);
124
+ vertexToTriangles.get (triangle.v2).push (triangleIndex);
125
+ }
126
+
127
+ for (let triangleIndex = 0; triangleIndex < mesh.TriangleCount (); triangleIndex++) {
128
+ let triangle = mesh.GetTriangle (triangleIndex);
129
+ if (!triangle.HasNormals ()) {
130
+ let n0 = AddAverageNormal (mesh, triangle, triangle.v0, triangleNormals, vertexToTriangles);
131
+ let n1 = AddAverageNormal (mesh, triangle, triangle.v1, triangleNormals, vertexToTriangles);
132
+ let n2 = AddAverageNormal (mesh, triangle, triangle.v2, triangleNormals, vertexToTriangles);
133
+ triangle.SetNormals (n0, n1, n2);
134
+ }
135
+ }
136
+ }
137
+
138
+ let meshStatus = {
139
+ calculateCurveNormals : false
140
+ };
141
+
142
+ for (let i = 0; i < mesh.TriangleCount (); i++) {
143
+ let triangle = mesh.GetTriangle (i);
144
+ this.FinalizeTriangle (mesh, triangle, meshStatus);
145
+
146
+ if (triangle.mat === null) {
147
+ triangle.mat = this.GetDefaultMaterialIndex (model);
148
+ }
149
+ }
150
+
151
+ if (meshStatus.calculateCurveNormals) {
152
+ CalculateCurveNormals (mesh);
153
+ }
154
+ }
155
+
156
+ FinalizeTriangle (mesh, triangle, meshStatus)
157
+ {
158
+ if (!triangle.HasNormals ()) {
159
+ if (triangle.curve === null || triangle.curve === 0) {
160
+ let v0 = mesh.GetVertex (triangle.v0);
161
+ let v1 = mesh.GetVertex (triangle.v1);
162
+ let v2 = mesh.GetVertex (triangle.v2);
163
+ let normal = CalculateTriangleNormal (v0, v1, v2);
164
+ let normalIndex = mesh.AddNormal (normal);
165
+ triangle.SetNormals (normalIndex, normalIndex, normalIndex);
166
+ } else {
167
+ meshStatus.calculateCurveNormals = true;
168
+ }
169
+ }
170
+
171
+ if (triangle.curve === null) {
172
+ triangle.curve = 0;
173
+ }
174
+ }
175
+
176
+ FinalizeNodes (model)
177
+ {
178
+ let rootNode = model.GetRootNode ();
179
+
180
+ let emptyNodes = [];
181
+ rootNode.EnumerateChildren ((node) => {
182
+ if (node.IsEmpty ()) {
183
+ emptyNodes.push (node);
184
+ }
185
+ });
186
+
187
+ for (let nodeIndex = 0; nodeIndex < emptyNodes.length; nodeIndex++) {
188
+ let node = emptyNodes[nodeIndex];
189
+ let parentNode = node.GetParent ();
190
+ if (parentNode === null) {
191
+ continue;
192
+ }
193
+ parentNode.RemoveChildNode (node);
194
+ if (parentNode.IsEmpty ()) {
195
+ emptyNodes.push (parentNode);
196
+ }
197
+ }
198
+ }
199
+
200
+ GetDefaultMaterialIndex (model)
201
+ {
202
+ if (this.defaultMaterialIndex === null) {
203
+ let defaultMaterialColor = this.params.getDefaultMaterialColor ();
204
+ let defaultMaterial = new PhongMaterial ();
205
+ defaultMaterial.color = defaultMaterialColor;
206
+ defaultMaterial.isDefault = true;
207
+ this.defaultMaterialIndex = model.AddMaterial (defaultMaterial);
208
+ }
209
+ return this.defaultMaterialIndex;
210
+ }
211
+
212
+ Reset ()
213
+ {
214
+ this.defaultMaterialIndex = null;
215
+ }
216
+ }
217
+
218
+ export function FinalizeModel (model, params)
219
+ {
220
+ let finalizer = new ModelFinalizer (params);
221
+ finalizer.Finalize (model);
222
+ }
223
+
224
+ export function CheckModel (model)
225
+ {
226
+ function IsCorrectValue (val)
227
+ {
228
+ if (val === undefined || val === null) {
229
+ return false;
230
+ }
231
+ return true;
232
+ }
233
+
234
+ function IsCorrectNumber (val)
235
+ {
236
+ if (!IsCorrectValue (val)) {
237
+ return false;
238
+ }
239
+ if (isNaN (val)) {
240
+ return false;
241
+ }
242
+ return true;
243
+ }
244
+
245
+ function IsCorrectIndex (val, count)
246
+ {
247
+ if (!IsCorrectNumber (val)) {
248
+ return false;
249
+ }
250
+ if (val < 0 || val >= count) {
251
+ return false;
252
+ }
253
+ return true;
254
+ }
255
+
256
+ function CheckMesh (model, mesh)
257
+ {
258
+ function CheckTriangle (model, mesh, triangle)
259
+ {
260
+ if (!IsCorrectIndex (triangle.v0, mesh.VertexCount ())) {
261
+ return false;
262
+ }
263
+ if (!IsCorrectIndex (triangle.v1, mesh.VertexCount ())) {
264
+ return false;
265
+ }
266
+ if (!IsCorrectIndex (triangle.v2, mesh.VertexCount ())) {
267
+ return false;
268
+ }
269
+ if (triangle.HasVertexColors ()) {
270
+ if (!IsCorrectIndex (triangle.c0, mesh.VertexColorCount ())) {
271
+ return false;
272
+ }
273
+ if (!IsCorrectIndex (triangle.c1, mesh.VertexColorCount ())) {
274
+ return false;
275
+ }
276
+ if (!IsCorrectIndex (triangle.c2, mesh.VertexColorCount ())) {
277
+ return false;
278
+ }
279
+ }
280
+ if (!IsCorrectIndex (triangle.n0, mesh.NormalCount ())) {
281
+ return false;
282
+ }
283
+ if (!IsCorrectIndex (triangle.n1, mesh.NormalCount ())) {
284
+ return false;
285
+ }
286
+ if (!IsCorrectIndex (triangle.n2, mesh.NormalCount ())) {
287
+ return false;
288
+ }
289
+ if (triangle.HasTextureUVs ()) {
290
+ if (!IsCorrectIndex (triangle.u0, mesh.TextureUVCount ())) {
291
+ return false;
292
+ }
293
+ if (!IsCorrectIndex (triangle.u1, mesh.TextureUVCount ())) {
294
+ return false;
295
+ }
296
+ if (!IsCorrectIndex (triangle.u2, mesh.TextureUVCount ())) {
297
+ return false;
298
+ }
299
+ }
300
+ if (!IsCorrectIndex (triangle.mat, model.MaterialCount ())) {
301
+ return false;
302
+ }
303
+ if (!IsCorrectNumber (triangle.curve)) {
304
+ return false;
305
+ }
306
+
307
+ return true;
308
+ }
309
+
310
+ for (let i = 0; i < mesh.VertexCount (); i++) {
311
+ let vertex = mesh.GetVertex (i);
312
+ if (!IsCorrectNumber (vertex.x)) {
313
+ return false;
314
+ }
315
+ if (!IsCorrectNumber (vertex.y)) {
316
+ return false;
317
+ }
318
+ if (!IsCorrectNumber (vertex.z)) {
319
+ return false;
320
+ }
321
+ }
322
+
323
+ for (let i = 0; i < mesh.VertexColorCount (); i++) {
324
+ let color = mesh.GetVertexColor (i);
325
+ if (!IsCorrectNumber (color.r)) {
326
+ return false;
327
+ }
328
+ if (!IsCorrectNumber (color.g)) {
329
+ return false;
330
+ }
331
+ if (!IsCorrectNumber (color.b)) {
332
+ return false;
333
+ }
334
+ }
335
+
336
+ for (let i = 0; i < mesh.NormalCount (); i++) {
337
+ let normal = mesh.GetNormal (i);
338
+ if (!IsCorrectNumber (normal.x)) {
339
+ return false;
340
+ }
341
+ if (!IsCorrectNumber (normal.y)) {
342
+ return false;
343
+ }
344
+ if (!IsCorrectNumber (normal.z)) {
345
+ return false;
346
+ }
347
+ }
348
+
349
+ for (let i = 0; i < mesh.TextureUVCount (); i++) {
350
+ let uv = mesh.GetTextureUV (i);
351
+ if (!IsCorrectNumber (uv.x)) {
352
+ return false;
353
+ }
354
+ if (!IsCorrectNumber (uv.y)) {
355
+ return false;
356
+ }
357
+ }
358
+
359
+ for (let i = 0; i < mesh.TriangleCount (); i++) {
360
+ let triangle = mesh.GetTriangle (i);
361
+ if (!CheckTriangle (model, mesh, triangle)) {
362
+ return false;
363
+ }
364
+ }
365
+
366
+ return true;
367
+ }
368
+
369
+ for (let i = 0; i < model.MeshCount (); i++) {
370
+ let mesh = model.GetMesh (i);
371
+ if (!CheckMesh (model, mesh)) {
372
+ return false;
373
+ }
374
+ }
375
+
376
+ return true;
377
+ }
@@ -0,0 +1,117 @@
1
+ import { BoundingBoxCalculator3D } from '../geometry/box3d.js';
2
+ import { Octree } from '../geometry/octree.js';
3
+ import { GetMeshType, MeshType } from './meshutils.js';
4
+ import { Model } from './model.js';
5
+ import { Topology } from './topology.js';
6
+
7
+ export function IsModelEmpty (model)
8
+ {
9
+ let isEmpty = true;
10
+ model.EnumerateMeshInstances ((meshInstance) => {
11
+ if (GetMeshType (meshInstance) !== MeshType.Empty) {
12
+ isEmpty = false;
13
+ }
14
+ });
15
+ return isEmpty;
16
+ }
17
+
18
+ export function GetBoundingBox (object3D)
19
+ {
20
+ let calculator = new BoundingBoxCalculator3D ();
21
+ object3D.EnumerateVertices ((vertex) => {
22
+ calculator.AddPoint (vertex);
23
+ });
24
+ return calculator.GetBox ();
25
+ }
26
+
27
+ export function GetTopology (object3D)
28
+ {
29
+ function GetVertexIndex (vertex, octree, topology)
30
+ {
31
+ let index = octree.FindPoint (vertex);
32
+ if (index === null) {
33
+ index = topology.AddVertex ();
34
+ octree.AddPoint (vertex, index);
35
+ }
36
+ return index;
37
+ }
38
+
39
+ let boundingBox = GetBoundingBox (object3D);
40
+ let octree = new Octree (boundingBox);
41
+ let topology = new Topology ();
42
+
43
+ object3D.EnumerateTriangleVertices ((v0, v1, v2) => {
44
+ let v0Index = GetVertexIndex (v0, octree, topology);
45
+ let v1Index = GetVertexIndex (v1, octree, topology);
46
+ let v2Index = GetVertexIndex (v2, octree, topology);
47
+ topology.AddTriangle (v0Index, v1Index, v2Index);
48
+ });
49
+ return topology;
50
+ }
51
+
52
+ export function IsTwoManifold (object3D)
53
+ {
54
+ function GetEdgeOrientationInTriangle (topology, triangleIndex, edgeIndex)
55
+ {
56
+ const triangle = topology.triangles[triangleIndex];
57
+ const triEdge1 = topology.triangleEdges[triangle.triEdge1];
58
+ const triEdge2 = topology.triangleEdges[triangle.triEdge2];
59
+ const triEdge3 = topology.triangleEdges[triangle.triEdge3];
60
+ if (triEdge1.edge === edgeIndex) {
61
+ return triEdge1.reversed;
62
+ }
63
+ if (triEdge2.edge === edgeIndex) {
64
+ return triEdge2.reversed;
65
+ }
66
+ if (triEdge3.edge === edgeIndex) {
67
+ return triEdge3.reversed;
68
+ }
69
+ return null;
70
+ }
71
+
72
+ if (object3D instanceof Model) {
73
+ let isTwoManifold = true;
74
+ object3D.EnumerateMeshInstances ((meshInstance) => {
75
+ if (isTwoManifold) {
76
+ isTwoManifold = IsTwoManifold (meshInstance);
77
+ }
78
+ });
79
+ return isTwoManifold;
80
+ } else {
81
+ const topology = GetTopology (object3D);
82
+ for (let edgeIndex = 0; edgeIndex < topology.edges.length; edgeIndex++) {
83
+ const edge = topology.edges[edgeIndex];
84
+ if (edge.triangles.length !== 2) {
85
+ return false;
86
+ }
87
+
88
+ let edgeOrientation1 = GetEdgeOrientationInTriangle (topology, edge.triangles[0], edgeIndex);
89
+ let edgeOrientation2 = GetEdgeOrientationInTriangle (topology, edge.triangles[1], edgeIndex);
90
+ if (edgeOrientation1 === null || edgeOrientation2 === null || edgeOrientation1 === edgeOrientation2) {
91
+ return false;
92
+ }
93
+ }
94
+ return true;
95
+ }
96
+ }
97
+
98
+ export function HasDefaultMaterial (model)
99
+ {
100
+ for (let i = 0; i < model.MaterialCount (); i++) {
101
+ let material = model.GetMaterial (i);
102
+ if (material.isDefault && !material.vertexColors) {
103
+ return true;
104
+ }
105
+ }
106
+ return false;
107
+ }
108
+
109
+ export function ReplaceDefaultMaterialColor (model, color)
110
+ {
111
+ for (let i = 0; i < model.MaterialCount (); i++) {
112
+ let material = model.GetMaterial (i);
113
+ if (material.isDefault) {
114
+ material.color = color;
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,178 @@
1
+ import { Transformation } from '../geometry/transformation.js';
2
+
3
+ class NodeIdGenerator
4
+ {
5
+ constructor ()
6
+ {
7
+ this.nextId = 0;
8
+ }
9
+
10
+ GenerateId ()
11
+ {
12
+ const id = this.nextId;
13
+ this.nextId += 1;
14
+ return id;
15
+ }
16
+ }
17
+
18
+ export const NodeType =
19
+ {
20
+ GroupNode : 0,
21
+ MeshNode : 1
22
+ };
23
+
24
+ export class Node
25
+ {
26
+ constructor ()
27
+ {
28
+ this.type = NodeType.GroupNode;
29
+ this.name = '';
30
+ this.parent = null;
31
+ this.transformation = new Transformation ();
32
+
33
+ this.childNodes = [];
34
+ this.meshIndices = [];
35
+
36
+ this.idGenerator = new NodeIdGenerator ();
37
+ this.id = this.idGenerator.GenerateId ();
38
+ }
39
+
40
+ IsEmpty ()
41
+ {
42
+ return this.childNodes.length === 0 && this.meshIndices.length === 0;
43
+ }
44
+
45
+ GetType ()
46
+ {
47
+ return this.type;
48
+ }
49
+
50
+ SetType (type)
51
+ {
52
+ this.type = type;
53
+ }
54
+
55
+ GetId ()
56
+ {
57
+ return this.id;
58
+ }
59
+
60
+ GetName ()
61
+ {
62
+ return this.name;
63
+ }
64
+
65
+ SetName (name)
66
+ {
67
+ this.name = name;
68
+ }
69
+
70
+ HasParent ()
71
+ {
72
+ return this.parent !== null;
73
+ }
74
+
75
+ GetParent ()
76
+ {
77
+ return this.parent;
78
+ }
79
+
80
+ GetTransformation ()
81
+ {
82
+ return this.transformation;
83
+ }
84
+
85
+ GetWorldTransformation ()
86
+ {
87
+ let transformation = this.transformation.Clone ();
88
+ let parent = this.parent;
89
+ while (parent !== null) {
90
+ transformation.Append (parent.transformation);
91
+ parent = parent.parent;
92
+ }
93
+ return transformation;
94
+ }
95
+
96
+ SetTransformation (transformation)
97
+ {
98
+ this.transformation = transformation;
99
+ }
100
+
101
+ AddChildNode (node)
102
+ {
103
+ node.parent = this;
104
+ node.idGenerator = this.idGenerator;
105
+ node.id = node.idGenerator.GenerateId ();
106
+ this.childNodes.push (node);
107
+ return this.childNodes.length - 1;
108
+ }
109
+
110
+ RemoveChildNode (node)
111
+ {
112
+ node.parent = null;
113
+ let index = this.childNodes.indexOf (node);
114
+ this.childNodes.splice (index, 1);
115
+ }
116
+
117
+ GetChildNodes ()
118
+ {
119
+ return this.childNodes;
120
+ }
121
+
122
+ ChildNodeCount ()
123
+ {
124
+ return this.childNodes.length;
125
+ }
126
+
127
+ GetChildNode (index)
128
+ {
129
+ return this.childNodes[index];
130
+ }
131
+
132
+ AddMeshIndex (index)
133
+ {
134
+ this.meshIndices.push (index);
135
+ return this.meshIndices.length - 1;
136
+ }
137
+
138
+ MeshIndexCount ()
139
+ {
140
+ return this.meshIndices.length;
141
+ }
142
+
143
+ GetMeshIndex (index)
144
+ {
145
+ return this.meshIndices[index];
146
+ }
147
+
148
+ GetMeshIndices ()
149
+ {
150
+ return this.meshIndices;
151
+ }
152
+
153
+ Enumerate (processor)
154
+ {
155
+ processor (this);
156
+ for (const childNode of this.childNodes) {
157
+ childNode.Enumerate (processor);
158
+ }
159
+ }
160
+
161
+ EnumerateChildren (processor)
162
+ {
163
+ for (const childNode of this.childNodes) {
164
+ processor (childNode);
165
+ childNode.EnumerateChildren (processor);
166
+ }
167
+ }
168
+
169
+ EnumerateMeshIndices (processor)
170
+ {
171
+ for (const meshIndex of this.meshIndices) {
172
+ processor (meshIndex);
173
+ }
174
+ for (const childNode of this.childNodes) {
175
+ childNode.EnumerateMeshIndices (processor);
176
+ }
177
+ }
178
+ }