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,130 @@
1
+ export class RGBColor
2
+ {
3
+ constructor (r, g, b)
4
+ {
5
+ this.r = r; // 0 .. 255
6
+ this.g = g; // 0 .. 255
7
+ this.b = b; // 0 .. 255
8
+ }
9
+
10
+ Set (r, g, b)
11
+ {
12
+ this.r = r;
13
+ this.g = g;
14
+ this.b = b;
15
+ }
16
+
17
+ Clone ()
18
+ {
19
+ return new RGBColor (this.r, this.g, this.b);
20
+ }
21
+ }
22
+
23
+ export class RGBAColor
24
+ {
25
+ constructor (r, g, b, a)
26
+ {
27
+ this.r = r; // 0 .. 255
28
+ this.g = g; // 0 .. 255
29
+ this.b = b; // 0 .. 255
30
+ this.a = a; // 0 .. 255
31
+ }
32
+
33
+ Set (r, g, b, a)
34
+ {
35
+ this.r = r;
36
+ this.g = g;
37
+ this.b = b;
38
+ this.a = a;
39
+ }
40
+
41
+ Clone ()
42
+ {
43
+ return new RGBAColor (this.r, this.g, this.b, this.a);
44
+ }
45
+ }
46
+
47
+ export function ColorComponentFromFloat (component)
48
+ {
49
+ return parseInt (Math.round (component * 255.0), 10);
50
+ }
51
+
52
+ export function ColorComponentToFloat (component)
53
+ {
54
+ return component / 255.0;
55
+ }
56
+
57
+ export function RGBColorFromFloatComponents (r, g, b)
58
+ {
59
+ return new RGBColor (
60
+ ColorComponentFromFloat (r),
61
+ ColorComponentFromFloat (g),
62
+ ColorComponentFromFloat (b)
63
+ );
64
+ }
65
+
66
+ export function SRGBToLinear (component)
67
+ {
68
+ if (component < 0.04045) {
69
+ return component * 0.0773993808;
70
+ } else {
71
+ return Math.pow (component * 0.9478672986 + 0.0521327014, 2.4);
72
+ }
73
+ }
74
+
75
+ export function LinearToSRGB (component)
76
+ {
77
+ if (component < 0.0031308) {
78
+ return component * 12.92;
79
+ } else {
80
+ return 1.055 * (Math.pow (component, 0.41666)) - 0.055;
81
+ }
82
+ }
83
+
84
+ export function IntegerToHexString (intVal)
85
+ {
86
+ let result = parseInt (intVal, 10).toString (16);
87
+ while (result.length < 2) {
88
+ result = '0' + result;
89
+ }
90
+ return result;
91
+ }
92
+
93
+ export function RGBColorToHexString (color)
94
+ {
95
+ let r = IntegerToHexString (color.r);
96
+ let g = IntegerToHexString (color.g);
97
+ let b = IntegerToHexString (color.b);
98
+ return r + g + b;
99
+ }
100
+
101
+ export function RGBAColorToHexString (color)
102
+ {
103
+ let r = IntegerToHexString (color.r);
104
+ let g = IntegerToHexString (color.g);
105
+ let b = IntegerToHexString (color.b);
106
+ let a = IntegerToHexString (color.a);
107
+ return r + g + b + a;
108
+ }
109
+
110
+ export function HexStringToRGBColor (hexString)
111
+ {
112
+ if (hexString.length !== 6) {
113
+ return null;
114
+ }
115
+
116
+ let r = parseInt (hexString.substring (0, 2), 16);
117
+ let g = parseInt (hexString.substring (2, 4), 16);
118
+ let b = parseInt (hexString.substring (4, 6), 16);
119
+ return new RGBColor (r, g, b);
120
+ }
121
+
122
+ export function ArrayToRGBColor (arr)
123
+ {
124
+ return new RGBColor (arr[0], arr[1], arr[2]);
125
+ }
126
+
127
+ export function RGBColorIsEqual (a, b)
128
+ {
129
+ return a.r === b.r && a.g === b.g && a.b === b.b;
130
+ }
@@ -0,0 +1,433 @@
1
+ import { Coord2D } from '../geometry/coord2d.js';
2
+ import { Coord3D } from '../geometry/coord3d.js';
3
+ import { IsPositive, IsNegative, IsZero } from '../geometry/geometry.js';
4
+ import { Mesh } from './mesh.js';
5
+ import { Triangle } from './triangle.js';
6
+
7
+ export class GeneratorParams
8
+ {
9
+ constructor ()
10
+ {
11
+ this.name = null;
12
+ this.material = null;
13
+ }
14
+
15
+ SetName (name)
16
+ {
17
+ this.name = name;
18
+ return this;
19
+ }
20
+
21
+ SetMaterial (material)
22
+ {
23
+ this.material = material;
24
+ return this;
25
+ }
26
+ }
27
+
28
+ export class Generator
29
+ {
30
+ constructor (params)
31
+ {
32
+ this.params = params || new GeneratorParams ();
33
+ this.mesh = new Mesh ();
34
+ if (this.params.name !== null) {
35
+ this.mesh.SetName (this.params.name);
36
+ }
37
+ this.curve = null;
38
+ }
39
+
40
+ GetMesh ()
41
+ {
42
+ return this.mesh;
43
+ }
44
+
45
+ AddVertex (x, y, z)
46
+ {
47
+ let coord = new Coord3D (x, y, z);
48
+ return this.mesh.AddVertex (coord);
49
+ }
50
+
51
+ AddVertices (vertices)
52
+ {
53
+ let indices = [];
54
+ for (let i = 0; i < vertices.length; i++) {
55
+ let vertex = vertices[i];
56
+ indices.push (this.AddVertex (vertex.x, vertex.y, vertex.z));
57
+ }
58
+ return indices;
59
+ }
60
+
61
+ SetCurve (curve)
62
+ {
63
+ this.curve = curve;
64
+ }
65
+
66
+ ResetCurve ()
67
+ {
68
+ this.curve = null;
69
+ }
70
+
71
+ AddTriangle (v0, v1, v2)
72
+ {
73
+ let triangle = new Triangle (v0, v1, v2);
74
+ if (this.params.material !== null) {
75
+ triangle.mat = this.params.material;
76
+ }
77
+ if (this.curve !== null) {
78
+ triangle.SetCurve (this.curve);
79
+ }
80
+ return this.mesh.AddTriangle (triangle);
81
+ }
82
+
83
+ AddTriangleInverted (v0, v1, v2)
84
+ {
85
+ this.AddTriangle (v0, v2, v1);
86
+ }
87
+
88
+ AddConvexPolygon (vertices)
89
+ {
90
+ for (let vertexIndex = 0; vertexIndex < vertices.length - 2; vertexIndex++) {
91
+ this.AddTriangle (
92
+ vertices[0],
93
+ vertices[vertexIndex + 1],
94
+ vertices[vertexIndex + 2]
95
+ );
96
+ }
97
+ }
98
+
99
+ AddConvexPolygonInverted (vertices)
100
+ {
101
+ for (let vertexIndex = 0; vertexIndex < vertices.length - 2; vertexIndex++) {
102
+ this.AddTriangleInverted (
103
+ vertices[0],
104
+ vertices[vertexIndex + 1],
105
+ vertices[vertexIndex + 2]
106
+ );
107
+ }
108
+ }
109
+ }
110
+
111
+ export class GeneratorHelper
112
+ {
113
+ constructor (generator)
114
+ {
115
+ this.generator = generator;
116
+ }
117
+
118
+ GenerateSurfaceBetweenPolygons (startIndices, endIndices)
119
+ {
120
+ if (startIndices.length !== endIndices.length) {
121
+ return;
122
+ }
123
+ const vertexCount = startIndices.length;
124
+ for (let i = 0; i < vertexCount; i++) {
125
+ const index = i;
126
+ const nextIndex = (i < vertexCount - 1) ? index + 1 : 0;
127
+ this.generator.AddConvexPolygon ([
128
+ startIndices[index],
129
+ startIndices[nextIndex],
130
+ endIndices[nextIndex],
131
+ endIndices[index]
132
+ ]);
133
+ }
134
+ }
135
+
136
+ GenerateTriangleFan (startIndices, endIndex)
137
+ {
138
+ const vertexCount = startIndices.length;
139
+ for (let i = 0; i < vertexCount; i++) {
140
+ const index = i;
141
+ const nextIndex = (i < vertexCount - 1) ? index + 1 : 0;
142
+ this.generator.AddTriangle (
143
+ endIndex,
144
+ startIndices[index],
145
+ startIndices[nextIndex]
146
+ );
147
+ }
148
+ }
149
+ }
150
+
151
+ function GetCylindricalCoord (radius, angle)
152
+ {
153
+ return new Coord2D (
154
+ radius * Math.cos (angle),
155
+ radius * Math.sin (angle)
156
+ );
157
+ }
158
+
159
+ export function GenerateCuboid (genParams, xSize, ySize, zSize)
160
+ {
161
+ if (!IsPositive (xSize) || !IsPositive (ySize) || !IsPositive (zSize)) {
162
+ return null;
163
+ }
164
+
165
+ let generator = new Generator (genParams);
166
+
167
+ generator.AddVertex (0.0, 0.0, 0.0);
168
+ generator.AddVertex (xSize, 0.0, 0.0);
169
+ generator.AddVertex (xSize, ySize, 0.0);
170
+ generator.AddVertex (0.0, ySize, 0.0);
171
+ generator.AddVertex (0.0, 0.0, zSize);
172
+ generator.AddVertex (xSize, 0.0, zSize);
173
+ generator.AddVertex (xSize, ySize, zSize);
174
+ generator.AddVertex (0.0, ySize, zSize);
175
+
176
+ generator.AddConvexPolygon ([0, 3, 2, 1]);
177
+ generator.AddConvexPolygon ([0, 1, 5, 4]);
178
+ generator.AddConvexPolygon ([1, 2, 6, 5]);
179
+ generator.AddConvexPolygon ([2, 3, 7, 6]);
180
+ generator.AddConvexPolygon ([3, 0, 4, 7]);
181
+ generator.AddConvexPolygon ([4, 5, 6, 7]);
182
+
183
+ return generator.GetMesh ();
184
+ }
185
+
186
+ export function GenerateCone (genParams, topRadius, bottomRadius, height, segments, smooth)
187
+ {
188
+ if (IsNegative (topRadius) || IsNegative (bottomRadius)) {
189
+ return null;
190
+ }
191
+
192
+ if (!IsPositive (height) || segments < 3) {
193
+ return null;
194
+ }
195
+
196
+ let isZeroTop = IsZero (topRadius);
197
+ let isZeroBottom = IsZero (bottomRadius);
198
+ if (isZeroTop && isZeroBottom) {
199
+ return null;
200
+ }
201
+
202
+ let generator = new Generator (genParams);
203
+ let helper = new GeneratorHelper (generator);
204
+ const step = 2.0 * Math.PI / segments;
205
+ const curve = (smooth ? 1 : null);
206
+
207
+ let topPolygon = [];
208
+ if (isZeroTop) {
209
+ topPolygon.push (generator.AddVertex (0.0, 0.0, height));
210
+ } else {
211
+ for (let i = 0; i < segments; i++) {
212
+ let topVertex = GetCylindricalCoord (topRadius, i * step);
213
+ topPolygon.push (generator.AddVertex (topVertex.x, topVertex.y, height));
214
+ }
215
+ }
216
+
217
+ let bottomPolygon = [];
218
+ if (isZeroBottom) {
219
+ bottomPolygon.push (generator.AddVertex (0.0, 0.0, 0.0));
220
+ } else {
221
+ for (let i = 0; i < segments; i++) {
222
+ let bottomVertex = GetCylindricalCoord (bottomRadius, i * step);
223
+ bottomPolygon.push (generator.AddVertex (bottomVertex.x, bottomVertex.y, 0.0));
224
+ }
225
+ }
226
+
227
+ if (isZeroTop) {
228
+ generator.SetCurve (curve);
229
+ helper.GenerateTriangleFan (bottomPolygon, topPolygon[0]);
230
+ generator.ResetCurve ();
231
+ generator.AddConvexPolygonInverted (bottomPolygon);
232
+ } else if (isZeroBottom) {
233
+ generator.SetCurve (curve);
234
+ helper.GenerateTriangleFan (topPolygon.slice ().reverse (), bottomPolygon[0]);
235
+ generator.ResetCurve ();
236
+ generator.AddConvexPolygon (topPolygon);
237
+ } else {
238
+ generator.SetCurve (curve);
239
+ helper.GenerateSurfaceBetweenPolygons (bottomPolygon, topPolygon);
240
+ generator.ResetCurve ();
241
+ generator.AddConvexPolygonInverted (bottomPolygon);
242
+ generator.AddConvexPolygon (topPolygon);
243
+ }
244
+
245
+ return generator.GetMesh ();
246
+ }
247
+
248
+ export function GenerateCylinder (genParams, radius, height, segments, smooth)
249
+ {
250
+ return GenerateCone (genParams, radius, radius, height, segments, smooth);
251
+ }
252
+
253
+ export function GenerateSphere (genParams, radius, segments, smooth)
254
+ {
255
+ function GetSphericalCoord (radius, theta, phi)
256
+ {
257
+ return new Coord3D (
258
+ radius * Math.sin (theta) * Math.cos (phi),
259
+ radius * Math.sin (theta) * Math.sin (phi),
260
+ radius * Math.cos (theta)
261
+ );
262
+ }
263
+
264
+ if (!IsPositive (radius) || segments < 3) {
265
+ return null;
266
+ }
267
+
268
+ let generator = new Generator (genParams);
269
+ let helper = new GeneratorHelper (generator);
270
+
271
+ generator.SetCurve (smooth ? 1 : null);
272
+
273
+ let allLevelVertices = [];
274
+ let levels = segments + 1;
275
+ const levelStep = Math.PI / segments;
276
+ const cylindricalStep = 2.0 * Math.PI / segments;
277
+ for (let levelIndex = 1; levelIndex < levels - 1; levelIndex++) {
278
+ let levelVertices = [];
279
+ let theta = levelIndex * levelStep;
280
+ for (let cylindricalIndex = 0; cylindricalIndex < segments; cylindricalIndex++) {
281
+ let phi = cylindricalIndex * cylindricalStep;
282
+ let vertex = GetSphericalCoord (radius, theta, -phi);
283
+ levelVertices.push (generator.AddVertex (vertex.x, vertex.y, vertex.z));
284
+ }
285
+ if (levelIndex > 1) {
286
+ helper.GenerateSurfaceBetweenPolygons (allLevelVertices[allLevelVertices.length - 1], levelVertices);
287
+ }
288
+ allLevelVertices.push (levelVertices);
289
+ }
290
+
291
+ let topVertex = generator.AddVertex (0.0, 0.0, radius);
292
+ let bottomVertex = generator.AddVertex (0.0, 0.0, -radius);
293
+ helper.GenerateTriangleFan (allLevelVertices[0].slice ().reverse (), topVertex);
294
+ helper.GenerateTriangleFan (allLevelVertices[allLevelVertices.length - 1], bottomVertex);
295
+
296
+ generator.ResetCurve ();
297
+
298
+ return generator.GetMesh ();
299
+ }
300
+
301
+ export function GeneratePlatonicSolid (genParams, type, radius)
302
+ {
303
+ function AddVertex (generator, radius, x, y, z)
304
+ {
305
+ let vertex = new Coord3D (x, y, z);
306
+ vertex.MultiplyScalar (radius / vertex.Length ());
307
+ generator.AddVertex (vertex.x, vertex.y, vertex.z);
308
+ }
309
+
310
+ if (!IsPositive (radius)) {
311
+ return null;
312
+ }
313
+
314
+ let generator = new Generator (genParams);
315
+ if (type === 'tetrahedron') {
316
+ let a = 1.0;
317
+ AddVertex (generator, radius, +a, +a, +a);
318
+ AddVertex (generator, radius, -a, -a, +a);
319
+ AddVertex (generator, radius, -a, +a, -a);
320
+ AddVertex (generator, radius, +a, -a, -a);
321
+ generator.AddTriangle (0, 1, 3);
322
+ generator.AddTriangle (0, 2, 1);
323
+ generator.AddTriangle (0, 3, 2);
324
+ generator.AddTriangle (1, 2, 3);
325
+ } else if (type === 'hexahedron') {
326
+ let a = 1.0;
327
+ AddVertex (generator, radius, +a, +a, +a);
328
+ AddVertex (generator, radius, +a, +a, -a);
329
+ AddVertex (generator, radius, +a, -a, +a);
330
+ AddVertex (generator, radius, +a, -a, -a);
331
+ AddVertex (generator, radius, -a, +a, +a);
332
+ AddVertex (generator, radius, -a, +a, -a);
333
+ AddVertex (generator, radius, -a, -a, +a);
334
+ AddVertex (generator, radius, -a, -a, -a);
335
+ generator.AddConvexPolygon ([0, 1, 5, 4]);
336
+ generator.AddConvexPolygon ([0, 2, 3, 1]);
337
+ generator.AddConvexPolygon ([0, 4, 6, 2]);
338
+ generator.AddConvexPolygon ([1, 3, 7, 5]);
339
+ generator.AddConvexPolygon ([2, 6, 7, 3]);
340
+ generator.AddConvexPolygon ([4, 5, 7, 6]);
341
+ } else if (type === 'octahedron') {
342
+ let a = 1.0;
343
+ let b = 0.0;
344
+ AddVertex (generator, radius, +a, +b, +b);
345
+ AddVertex (generator, radius, -a, +b, +b);
346
+ AddVertex (generator, radius, +b, +a, +b);
347
+ AddVertex (generator, radius, +b, -a, +b);
348
+ AddVertex (generator, radius, +b, +b, +a);
349
+ AddVertex (generator, radius, +b, +b, -a);
350
+ generator.AddTriangle (0, 2, 4);
351
+ generator.AddTriangle (0, 3, 5);
352
+ generator.AddTriangle (0, 4, 3);
353
+ generator.AddTriangle (0, 5, 2);
354
+ generator.AddTriangle (1, 2, 5);
355
+ generator.AddTriangle (1, 3, 4);
356
+ generator.AddTriangle (1, 4, 2);
357
+ generator.AddTriangle (1, 5, 3);
358
+ } else if (type === 'dodecahedron') {
359
+ let a = 1.0;
360
+ let b = 0.0;
361
+ let c = (1.0 + Math.sqrt (5.0)) / 2.0;
362
+ let d = 1.0 / c;
363
+ AddVertex (generator, radius, +a, +a, +a);
364
+ AddVertex (generator, radius, +a, +a, -a);
365
+ AddVertex (generator, radius, +a, -a, +a);
366
+ AddVertex (generator, radius, -a, +a, +a);
367
+ AddVertex (generator, radius, +a, -a, -a);
368
+ AddVertex (generator, radius, -a, +a, -a);
369
+ AddVertex (generator, radius, -a, -a, +a);
370
+ AddVertex (generator, radius, -a, -a, -a);
371
+ AddVertex (generator, radius, +b, +d, +c);
372
+ AddVertex (generator, radius, +b, +d, -c);
373
+ AddVertex (generator, radius, +b, -d, +c);
374
+ AddVertex (generator, radius, +b, -d, -c);
375
+ AddVertex (generator, radius, +d, +c, +b);
376
+ AddVertex (generator, radius, +d, -c, +b);
377
+ AddVertex (generator, radius, -d, +c, +b);
378
+ AddVertex (generator, radius, -d, -c, +b);
379
+ AddVertex (generator, radius, +c, +b, +d);
380
+ AddVertex (generator, radius, -c, +b, +d);
381
+ AddVertex (generator, radius, +c, +b, -d);
382
+ AddVertex (generator, radius, -c, +b, -d);
383
+ generator.AddConvexPolygon ([0, 8, 10, 2, 16]);
384
+ generator.AddConvexPolygon ([0, 16, 18, 1, 12]);
385
+ generator.AddConvexPolygon ([0, 12, 14, 3, 8]);
386
+ generator.AddConvexPolygon ([1, 9, 5, 14, 12]);
387
+ generator.AddConvexPolygon ([1, 18, 4, 11, 9]);
388
+ generator.AddConvexPolygon ([2, 10, 6, 15, 13]);
389
+ generator.AddConvexPolygon ([2, 13, 4, 18, 16]);
390
+ generator.AddConvexPolygon ([3, 14, 5, 19, 17]);
391
+ generator.AddConvexPolygon ([3, 17, 6, 10, 8]);
392
+ generator.AddConvexPolygon ([4, 13, 15, 7, 11]);
393
+ generator.AddConvexPolygon ([5, 9, 11, 7, 19]);
394
+ generator.AddConvexPolygon ([6, 17, 19, 7, 15]);
395
+ } else if (type === 'icosahedron') {
396
+ let a = 1.0;
397
+ let b = 0.0;
398
+ let c = (1.0 + Math.sqrt (5.0)) / 2.0;
399
+ AddVertex (generator, radius, +b, +a, +c);
400
+ AddVertex (generator, radius, +b, +a, -c);
401
+ AddVertex (generator, radius, +b, -a, +c);
402
+ AddVertex (generator, radius, +b, -a, -c);
403
+ AddVertex (generator, radius, +a, +c, +b);
404
+ AddVertex (generator, radius, +a, -c, +b);
405
+ AddVertex (generator, radius, -a, +c, +b);
406
+ AddVertex (generator, radius, -a, -c, +b);
407
+ AddVertex (generator, radius, +c, +b, +a);
408
+ AddVertex (generator, radius, +c, +b, -a);
409
+ AddVertex (generator, radius, -c, +b, +a);
410
+ AddVertex (generator, radius, -c, +b, -a);
411
+ generator.AddTriangle (0, 2, 8);
412
+ generator.AddTriangle (0, 4, 6);
413
+ generator.AddTriangle (0, 6, 10);
414
+ generator.AddTriangle (0, 8, 4);
415
+ generator.AddTriangle (0, 10, 2);
416
+ generator.AddTriangle (1, 3, 11);
417
+ generator.AddTriangle (1, 4, 9);
418
+ generator.AddTriangle (1, 6, 4);
419
+ generator.AddTriangle (1, 9, 3);
420
+ generator.AddTriangle (1, 11, 6);
421
+ generator.AddTriangle (2, 5, 8);
422
+ generator.AddTriangle (2, 7, 5);
423
+ generator.AddTriangle (2, 10, 7);
424
+ generator.AddTriangle (3, 5, 7);
425
+ generator.AddTriangle (3, 7, 11);
426
+ generator.AddTriangle (3, 9, 5);
427
+ generator.AddTriangle (4, 8, 9);
428
+ generator.AddTriangle (5, 9, 8);
429
+ generator.AddTriangle (6, 11, 10);
430
+ generator.AddTriangle (7, 10, 11);
431
+ }
432
+ return generator.GetMesh ();
433
+ }