@jscad/core 2.6.6 → 2.6.7

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.6.7](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.6...@jscad/core@2.6.7) (2023-06-27)
7
+
8
+ **Note:** Version bump only for package @jscad/core
9
+
10
+
11
+
12
+
13
+
6
14
  ## [2.6.6](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/core@2.6.5...@jscad/core@2.6.6) (2023-04-30)
7
15
 
8
16
  **Note:** Version bump only for package @jscad/core
@@ -26,7 +26,7 @@ var cachedSetTimeout,cachedClearTimeout,process=module.exports={};function defau
26
26
  },{}],8:[function(require,module,exports){
27
27
  module.exports={
28
28
  "name": "@jscad/core",
29
- "version": "2.6.6",
29
+ "version": "2.6.7",
30
30
  "description": "Core functionality for JSCAD Applications",
31
31
  "homepage": "https://openjscad.xyz/",
32
32
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -62,9 +62,9 @@ module.exports={
62
62
  "license": "MIT",
63
63
  "dependencies": {
64
64
  "@jscad/array-utils": "2.1.4",
65
- "@jscad/io": "2.4.5",
66
- "@jscad/io-utils": "2.0.24",
67
- "@jscad/modeling": "2.11.1",
65
+ "@jscad/io": "2.4.6",
66
+ "@jscad/io-utils": "2.0.25",
67
+ "@jscad/modeling": "2.12.0",
68
68
  "json5": "2.2.3",
69
69
  "strip-bom": "4.0.0"
70
70
  },
@@ -196,7 +196,7 @@ const zipSync=require("fflate").zipSync,strToU8=require("fflate").strToU8,string
196
196
  },{"xmlchars/xml/1.0/ed5":42,"xmlchars/xml/1.1/ed2":43,"xmlchars/xmlns/1.0/ed3":44}],46:[function(require,module,exports){
197
197
  module.exports={
198
198
  "name": "@jscad/amf-deserializer",
199
- "version": "2.3.4",
199
+ "version": "2.3.5",
200
200
  "description": "AMF Deserializer for JSCAD",
201
201
  "repository": "https://github.com/jscad/OpenJSCAD.org/",
202
202
  "main": "src/index.js",
@@ -227,7 +227,7 @@ module.exports={
227
227
  ],
228
228
  "license": "MIT",
229
229
  "dependencies": {
230
- "@jscad/modeling": "2.11.1",
230
+ "@jscad/modeling": "2.12.0",
231
231
  "saxes": "5.0.1"
232
232
  },
233
233
  "devDependencies": {
@@ -285,7 +285,7 @@ const{geometries:geometries,maths:maths,primitives:primitives}=require("@jscad/m
285
285
  },{"./helpers":59,"@jscad/modeling":215}],62:[function(require,module,exports){
286
286
  module.exports={
287
287
  "name": "@jscad/dxf-deserializer",
288
- "version": "2.3.21",
288
+ "version": "2.3.22",
289
289
  "description": "DXF Deserializer for JSCAD",
290
290
  "homepage": "https://openjscad.xyz/",
291
291
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -313,7 +313,7 @@ module.exports={
313
313
  ],
314
314
  "license": "MIT",
315
315
  "dependencies": {
316
- "@jscad/modeling": "2.11.1"
316
+ "@jscad/modeling": "2.12.0"
317
317
  },
318
318
  "devDependencies": {
319
319
  "ava": "3.15.0",
@@ -369,7 +369,7 @@ const{flatten:flatten,toArray:toArray}=require("@jscad/array-utils"),version=req
369
369
  },{"./package.json":77,"@jscad/array-utils":529}],77:[function(require,module,exports){
370
370
  module.exports={
371
371
  "name": "@jscad/json-deserializer",
372
- "version": "2.0.25",
372
+ "version": "2.0.26",
373
373
  "description": "JSON Deserializer for JSCAD",
374
374
  "homepage": "https://openjscad.xyz/",
375
375
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -400,7 +400,7 @@ module.exports={
400
400
  "@jscad/array-utils": "2.1.4"
401
401
  },
402
402
  "devDependencies": {
403
- "@jscad/modeling": "2.11.1",
403
+ "@jscad/modeling": "2.12.0",
404
404
  "ava": "3.15.0",
405
405
  "nyc": "15.1.0"
406
406
  },
@@ -416,7 +416,7 @@ const{colors:colors,primitives:primitives}=require("@jscad/modeling"),version=re
416
416
  },{"./package.json":80,"@jscad/modeling":215}],80:[function(require,module,exports){
417
417
  module.exports={
418
418
  "name": "@jscad/obj-deserializer",
419
- "version": "2.0.24",
419
+ "version": "2.0.25",
420
420
  "description": "OBJ Deserializer for JSCAD",
421
421
  "homepage": "https://openjscad.xyz/",
422
422
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -448,7 +448,7 @@ module.exports={
448
448
  ],
449
449
  "license": "MIT",
450
450
  "dependencies": {
451
- "@jscad/modeling": "2.11.1"
451
+ "@jscad/modeling": "2.12.0"
452
452
  },
453
453
  "devDependencies": {
454
454
  "ava": "3.15.0",
@@ -466,7 +466,7 @@ const{maths:maths,primitives:primitives}=require("@jscad/modeling"),{BinaryReade
466
466
  },{"./package.json":83,"@jscad/io-utils":70,"@jscad/modeling":215}],83:[function(require,module,exports){
467
467
  module.exports={
468
468
  "name": "@jscad/stl-deserializer",
469
- "version": "2.1.21",
469
+ "version": "2.1.22",
470
470
  "description": "STL Deserializer for JSCAD",
471
471
  "homepage": "https://openjscad.xyz/",
472
472
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -498,8 +498,8 @@ module.exports={
498
498
  ],
499
499
  "license": "MIT",
500
500
  "dependencies": {
501
- "@jscad/io-utils": "2.0.24",
502
- "@jscad/modeling": "2.11.1"
501
+ "@jscad/io-utils": "2.0.25",
502
+ "@jscad/modeling": "2.12.0"
503
503
  },
504
504
  "devDependencies": {
505
505
  "ava": "3.15.0",
@@ -532,7 +532,7 @@ const{geometries:geometries,modifiers:modifiers}=require("@jscad/modeling"),{fla
532
532
  },{"xmlchars/xml/1.0/ed5":87,"xmlchars/xml/1.1/ed2":88,"xmlchars/xmlns/1.0/ed3":89}],91:[function(require,module,exports){
533
533
  module.exports={
534
534
  "name": "@jscad/svg-deserializer",
535
- "version": "2.5.5",
535
+ "version": "2.5.6",
536
536
  "description": "SVG Deserializer for JSCAD",
537
537
  "homepage": "https://openjscad.xyz/",
538
538
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -565,7 +565,7 @@ module.exports={
565
565
  "license": "MIT",
566
566
  "dependencies": {
567
567
  "@jscad/array-utils": "2.1.4",
568
- "@jscad/modeling": "2.11.1",
568
+ "@jscad/modeling": "2.12.0",
569
569
  "saxes": "5.0.1"
570
570
  },
571
571
  "devDependencies": {
@@ -602,7 +602,7 @@ const{geometries:geometries,maths:maths,measurements:measurements,utils:utils}=r
602
602
  },{}],100:[function(require,module,exports){
603
603
  module.exports={
604
604
  "name": "@jscad/svg-serializer",
605
- "version": "2.3.12",
605
+ "version": "2.3.13",
606
606
  "description": "SVG Serializer for JSCAD",
607
607
  "homepage": "https://openjscad.xyz/",
608
608
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -634,7 +634,7 @@ module.exports={
634
634
  ],
635
635
  "license": "MIT",
636
636
  "dependencies": {
637
- "@jscad/modeling": "2.11.1",
637
+ "@jscad/modeling": "2.12.0",
638
638
  "onml": "1.3.0"
639
639
  },
640
640
  "devDependencies": {
@@ -659,7 +659,7 @@ module.exports={
659
659
  },{"xmlchars/xml/1.0/ed5":101,"xmlchars/xml/1.1/ed2":102,"xmlchars/xmlns/1.0/ed3":103}],105:[function(require,module,exports){
660
660
  module.exports={
661
661
  "name": "@jscad/x3d-deserializer",
662
- "version": "2.2.4",
662
+ "version": "2.2.5",
663
663
  "description": "X3D Deserializer for JSCAD",
664
664
  "repository": "https://github.com/jscad/OpenJSCAD.org/",
665
665
  "main": "src/index.js",
@@ -686,7 +686,7 @@ module.exports={
686
686
  },
687
687
  "dependencies": {
688
688
  "@jscad/array-utils": "2.1.4",
689
- "@jscad/modeling": "2.11.1",
689
+ "@jscad/modeling": "2.12.0",
690
690
  "saxes": "5.0.1"
691
691
  },
692
692
  "devDependencies": {
@@ -750,7 +750,7 @@ const{geometries:geometries}=require("@jscad/modeling"),{geom3:geom3,poly3:poly3
750
750
  "use strict";const isObject=t=>t&&"[object Object]"===Object.prototype.toString.call(t);function indenter(t){if(!(t>0))return t=>t;var e=" ".repeat(t);return t=>{if("string"!=typeof t)return t;const n=t.split("\n");return 1===n.length?e+t:n.map(t=>""===t.trim()?t:e+t).join("\n")}}const clean=t=>t.split("\n").filter(t=>""!==t.trim()).join("\n");function stringify(t,e){const n=e>0?"\n":"",r=indenter(e);return function t(e){let i,o="",s=!0;return e.some((e,r,c)=>{if(0===r)return i="<"+e,1===c.length;if(1===r){if(isObject(e))return Object.keys(e).map(t=>{let n=e[t];Array.isArray(n)&&(n=n.join(" ")),i+=" "+t+'="'+n+'"'}),2===c.length||void(i+=">");i+=">"}switch(typeof e){case"string":case"number":case"boolean":case"undefined":return void(o+=e+n)}s=!1,o+=t(e)})?i+"/>"+n:s?i+clean(o)+"</"+e[0]+">"+n:i+n+r(o)+"</"+e[0]+">"+n}(t)}module.exports=stringify;
751
751
 
752
752
  },{}],124:[function(require,module,exports){
753
- const{geometries:geometries,modifiers:modifiers}=require("@jscad/modeling"),{geom2:geom2,geom3:geom3,path2:path2,poly2:poly2,poly3:poly3}=geometries,{flatten:flatten}=require("@jscad/array-utils"),stringify=require("onml/lib/stringify"),mimeType="model/x3d+xml",serialize=(e,...o)=>{if(e=Object.assign({},{color:[0,0,1,1],smooth:!1,decimals:1e3,metadata:!0,unit:"millimeter",statusCallback:null},e),0===(o=(o=flatten(o)).filter(e=>geom3.isA(e)||geom2.isA(e)||path2.isA(e))).length)throw new Error("expected one or more geom3/geom2/path2 objects");e.statusCallback&&e.statusCallback({progress:0});let t=["X3D",{profile:"Interchange",version:"3.3","xmlns:xsd":"http://www.w3.org/2001/XMLSchema-instance","xsd:noNamespaceSchemaLocation":"http://www.web3d.org/specifications/x3d-3.3.xsd"}];e.metadata?t.push(["head",{},["meta",{name:"creator",content:"Created by JSCAD"}],["meta",{name:"reference",content:"https://www.openjscad.xyz"}],["meta",{name:"created",content:(new Date).toISOString()}]]):t.push(["head",{},["meta",{name:"creator",content:"Created by JSCAD"}]]),t=t.concat(convertObjects(o,e));const r=`<?xml version="1.0" encoding="UTF-8"?>\n${stringify(t,2)}`;return e&&e.statusCallback&&e.statusCallback({progress:100}),[r]},convertObjects=(e,o)=>{const t=[];return e.forEach((r,n)=>{if(o.statusCallback&&o.statusCallback({progress:100*n/e.length}),geom3.isA(r)){r=modifiers.generalize({snap:!0,triangulate:!0},r),geom3.toPolygons(r).length>0&&t.push(convertGeom3(r,o))}geom2.isA(r)&&t.push(convertGeom2(r,o)),path2.isA(r)&&t.push(convertPath2(r,o))}),[["Scene",{},["Transform",{rotation:"1 0 0 -1.5708"},...t]]]},convertPath2=(e,o)=>{const t=path2.toPoints(e).slice();t.length>1&&e.isClosed&&t.push(t[0]);const r=["Shape",{},convertPolyline2D(poly2.create(t),o)];return e.color&&r.push(convertAppearance(e,"emissiveColor",o)),r},convertGeom2=(e,o)=>{const t=geom2.toOutlines(e),r=["Group",{}];return t.forEach(t=>{t.length>1&&t.push(t[0]);const n=["Shape",{},convertPolyline2D(poly2.create(t),o)];e.color&&n.push(convertAppearance(e,"emissiveColor",o)),r.push(n)}),r},convertPolyline2D=(e,o)=>{return["Polyline2D",{lineSegments:e.vertices.map(e=>`${e[0]} ${e[1]}`).join(" ")}]},convertAppearance=(e,o,t)=>{return["Appearance",["Material",{[o]:e.color.slice(0,3).join(" "),transparency:roundToDecimals(1-e.color[3],t)}]]},convertGeom3=(e,o)=>{const t=["Shape",{},convertMesh(e,o)];let r=["Appearance",{},["Material"]];return e.color&&(r=convertAppearance(e,"diffuseColor",o)),t.push(r),t},convertMesh=(e,o)=>{const t=convertToTriangles(e,o),r=polygons2coordinates(t,o),n=r[0].join(" "),s=r[1].join(" "),a=r[2].join(" "),c=["IndexedTriangleSet",{ccw:"true",colorPerVertex:"false",normalPerVertex:o.smooth,solid:"false",index:n},["Coordinate",{point:s}]];return e.color||c.push(["Color",{color:a}]),c},convertToTriangles=(e,o)=>{const t=[];return geom3.toPolygons(e).forEach(r=>{const n=r.vertices[0];for(let s=r.vertices.length-3;s>=0;s--){const a=poly3.fromPoints([n,r.vertices[s+1],r.vertices[s+2]]);let c=o.color;e.color&&(c=e.color),r.color&&(c=r.color),a.color=c,t.push(a)}}),t},convertToColor=(e,o)=>{let t=o.color;return e.color&&(t=e.color),`${t[0]} ${t[1]} ${t[2]}`},roundToDecimals=(e,o)=>Math.round(e*o.decimals)/o.decimals,polygons2coordinates=(e,o)=>{const t=[],r=[],n=[],s=new Map;return e.forEach(e=>{const a=[],c=e.vertices.length;for(let t=0;t<c;t++){const n=e.vertices[t],c=`${n[0]},${n[1]},${n[2]}`;if(!s.has(c)){const e=roundToDecimals(n[0],o),t=roundToDecimals(n[1],o),a=roundToDecimals(n[2],o);r.push(`${e} ${t} ${a}`),s.set(c,r.length-1)}a.push(s.get(c))}t.push(a.join(" ")),n.push(convertToColor(e,o))}),s.clear(),[t,r,n]};module.exports={serialize:serialize,mimeType:mimeType};
753
+ const{geometries:geometries,modifiers:modifiers}=require("@jscad/modeling"),{geom2:geom2,geom3:geom3,path2:path2,poly2:poly2,poly3:poly3}=geometries,{flatten:flatten}=require("@jscad/array-utils"),stringify=require("onml/lib/stringify"),mimeType="model/x3d+xml",defNames=new Map,serialize=(e,...o)=>{if(e=Object.assign({},{color:[0,0,1,1],shininess:8/256,smooth:!1,decimals:1e3,metadata:!0,unit:"millimeter",statusCallback:null},e),0===(o=(o=flatten(o)).filter(e=>geom3.isA(e)||geom2.isA(e)||path2.isA(e))).length)throw new Error("expected one or more geom3/geom2/path2 objects");e.statusCallback&&e.statusCallback({progress:0});let t=["X3D",{profile:"Interchange",version:"3.3","xmlns:xsd":"http://www.w3.org/2001/XMLSchema-instance","xsd:noNamespaceSchemaLocation":"http://www.web3d.org/specifications/x3d-3.3.xsd"}];e.metadata?t.push(["head",{},["meta",{name:"creator",content:"Created by JSCAD"}],["meta",{name:"reference",content:"https://www.openjscad.xyz"}],["meta",{name:"created",content:(new Date).toISOString()}]]):t.push(["head",{},["meta",{name:"creator",content:"Created by JSCAD"}]]),t=t.concat(convertObjects(o,e));const r=`<?xml version="1.0" encoding="UTF-8"?>\n${stringify(t,2)}`;return e&&e.statusCallback&&e.statusCallback({progress:100}),[r]},convertObjects=(e,o)=>{const t=[];return e.forEach((r,s)=>{if(o.statusCallback&&o.statusCallback({progress:100*s/e.length}),geom3.isA(r)){r=modifiers.generalize({snap:!0,triangulate:!0},r),geom3.toPolygons(r).length>0&&t.push(convertGeom3(r,o))}geom2.isA(r)&&t.push(convertGeom2(r,o)),path2.isA(r)&&t.push(convertPath2(r,o))}),[["Scene",{},["Transform",{rotation:"1 0 0 -1.5708"},...t]]]},convertPath2=(e,o)=>{const t=path2.toPoints(e).slice();t.length>1&&e.isClosed&&t.push(t[0]);const r=["Shape",shapeAttributes(e),convertPolyline2D(poly2.create(t),o)];return e.color&&r.push(convertAppearance(e,"emissiveColor",o)),r},convertGeom2=(e,o)=>{const t=geom2.toOutlines(e),r=["Group",{}];return t.forEach(t=>{t.length>1&&t.push(t[0]);const s=["Shape",shapeAttributes(e),convertPolyline2D(poly2.create(t),o)];e.color&&s.push(convertAppearance(e,"emissiveColor",o)),r.push(s)}),r},shapeAttributes=(e,o={})=>(e.id&&Object.assign(o,{DEF:checkDefName(e.id)}),o),checkDefName=e=>{const o=defNames.get(e)||0;return defNames.set(e,o+1),o>0&&console.warn(`Warning: object.id set as DEF but not unique. ${e} set ${o+1} times.`),e},convertPolyline2D=(e,o)=>{return["Polyline2D",{lineSegments:e.vertices.map(e=>`${e[0]} ${e[1]}`).join(" ")}]},convertAppearance=(e,o,t)=>{const r={[o]:e.color.slice(0,3).join(" "),transparency:roundToDecimals(1-e.color[3],t)};return"diffuseColor"===o&&Object.assign(r,{specularColor:"0.2 0.2 0.2",shininess:t.shininess}),["Appearance",["Material",r]]},convertGeom3=(e,o)=>{const t=["Shape",shapeAttributes(e),convertMesh(e,o)];let r=["Appearance",{},["Material"]];return e.color&&(r=convertAppearance(e,"diffuseColor",o)),t.push(r),t},convertMesh=(e,o)=>{const t=convertToTriangles(e,o),r=polygons2coordinates(t,o),s=r[0].join(" "),n=r[1].join(" "),a=r[2].join(" "),c=["IndexedTriangleSet",{ccw:"true",colorPerVertex:"false",normalPerVertex:o.smooth,solid:"false",index:s},["Coordinate",{point:n}]];return e.color||c.push(["Color",{color:a}]),c},convertToTriangles=(e,o)=>{const t=[];return geom3.toPolygons(e).forEach(r=>{const s=r.vertices[0];for(let n=r.vertices.length-3;n>=0;n--){const a=poly3.fromPoints([s,r.vertices[n+1],r.vertices[n+2]]);let c=o.color;e.color&&(c=e.color),r.color&&(c=r.color),a.color=c,t.push(a)}}),t},convertToColor=(e,o)=>{let t=o.color;return e.color&&(t=e.color),`${t[0]} ${t[1]} ${t[2]}`},roundToDecimals=(e,o)=>Math.round(e*o.decimals)/o.decimals,polygons2coordinates=(e,o)=>{const t=[],r=[],s=[],n=new Map;return e.forEach(e=>{const a=[],c=e.vertices.length;for(let t=0;t<c;t++){const s=e.vertices[t],c=`${s[0]},${s[1]},${s[2]}`;if(!n.has(c)){const e=roundToDecimals(s[0],o),t=roundToDecimals(s[1],o),a=roundToDecimals(s[2],o);r.push(`${e} ${t} ${a}`),n.set(c,r.length-1)}a.push(n.get(c))}t.push(a.join(" ")),s.push(convertToColor(e,o))}),n.clear(),[t,r,s]};module.exports={serialize:serialize,mimeType:mimeType};
754
754
 
755
755
  },{"@jscad/array-utils":529,"@jscad/modeling":215,"onml/lib/stringify":123}],125:[function(require,module,exports){
756
756
  const cssColors=require("./cssColors"),colorNameToRgb=o=>cssColors[o.toLowerCase()];module.exports=colorNameToRgb;
@@ -798,7 +798,7 @@ module.exports={create:require("./create"),valueAt:require("./valueAt"),tangentA
798
798
  const lengths=require("./lengths"),length=(e,t)=>lengths(e,t)[e];module.exports=length;
799
799
 
800
800
  },{"./lengths":140}],140:[function(require,module,exports){
801
- const valueAt=require("./valueAt"),lengths=(e,r)=>{let t=0,n=[0],s=valueAt(0,r);for(let a=1;a<=e;a++){const i=valueAt(a/e,r);t+=distanceBetween(i,s),n.push(t),s=i}return n},distanceBetween=(e,r)=>{if(Number.isFinite(e)&&Number.isFinite(r))return Math.abs(e-r);if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)throw new Error("The operands must have the same number of dimensions.");let t=0;for(let n=0;n<e.length;n++)t+=(r[n]-e[n])*(r[n]-e[n]);return Math.sqrt(t)}throw new Error("The operands must be of the same type, either number or array.")};module.exports=lengths;
801
+ const valueAt=require("./valueAt"),lengths=(e,r)=>{let t=0;const n=[0];let s=valueAt(0,r);for(let a=1;a<=e;a++){const i=valueAt(a/e,r);t+=distanceBetween(i,s),n.push(t),s=i}return n},distanceBetween=(e,r)=>{if(Number.isFinite(e)&&Number.isFinite(r))return Math.abs(e-r);if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)throw new Error("The operands must have the same number of dimensions.");let t=0;for(let n=0;n<e.length;n++)t+=(r[n]-e[n])*(r[n]-e[n]);return Math.sqrt(t)}throw new Error("The operands must be of the same type, either number or array.")};module.exports=lengths;
802
802
 
803
803
  },{"./valueAt":142}],141:[function(require,module,exports){
804
804
  const tangentAt=(t,n)=>{if(t<0||t>1)throw new Error("Bezier tangentAt() input must be between 0 and 1");if("float_single"===n.pointType)return bezierTangent(n,n.points,t);{const e=[];for(let o=0;o<n.dimensions;o++){const r=[];for(let t=0;t<n.points.length;t++)r.push(n.points[t][o]);e.push(bezierTangent(n,r,t))}return e}},bezierTangent=function(t,n,e){const o=n.length-1;let r=0;for(let i=0;i<o;i++){const s=o*(n[i+1]-n[i]);r+=t.tangentPermutations[i]*Math.pow(1-e,o-1-i)*Math.pow(e,i)*s}return r};module.exports=tangentAt;
@@ -957,7 +957,7 @@ const mat4=require("../../maths/mat4"),transform=(t,r)=>{const s=mat4.multiply(m
957
957
  const vec2=require("../../maths/vec2"),isA=require("./isA"),validate=r=>{if(!isA(r))throw new Error("invalid path2 structure");if(r.points.length>1)for(let i=0;i<r.points.length;i++)if(vec2.equals(r.points[i],r.points[(i+1)%r.points.length]))throw new Error(`path2 duplicate points ${r.points[i]}`);if(r.points.forEach(r=>{if(!r.every(Number.isFinite))throw new Error(`path2 invalid point ${r}`)}),!r.transforms.every(Number.isFinite))throw new Error(`path2 invalid transforms ${r.transforms}`)};module.exports=validate;
958
958
 
959
959
  },{"../../maths/vec2":313,"./isA":186}],193:[function(require,module,exports){
960
- const measureArea=require("./measureArea"),flip=require("./flip"),arePointsInside=(e,r)=>{if(0===e.length)return 0;const t=r.vertices;return t.length<3?0:(measureArea(r)<0&&(r=flip(r)),e.reduce((e,r)=>e+isPointInside(r,t),0)===e.length?1:0)},isPointInside=(e,r)=>{const t=r.length,n=e[0],i=e[1];let s=r[t-1],o=r[0],l=s[1]>i,u=0,a=0;for(let e=t+1;--e;){const e=o[1]>i;if(l!==e){const e=s[0]>n,r=o[0]>n;e&&r?u=!u:o[0]-(o[1]-i)*(s[0]-o[0])/(s[1]-o[1])>=n&&(u=!u)}l=e,s=o,o=r[++a]}return u},isLeft=(e,r,t)=>(r[0]-e[0])*(t[1]-e[1])-(t[0]-e[0])*(r[1]-e[1]);module.exports=arePointsInside;
960
+ const measureArea=require("./measureArea"),flip=require("./flip"),arePointsInside=(e,r)=>{if(0===e.length)return 0;const n=r.vertices;return n.length<3?0:(measureArea(r)<0&&(r=flip(r)),e.reduce((e,r)=>e+isPointInside(r,n),0)===e.length?1:0)},isPointInside=(e,r)=>{const n=r.length,t=e[0],i=e[1];let s=r[n-1],o=r[0],l=s[1]>i,u=0,a=0;for(let e=n+1;--e;){const e=o[1]>i;if(l!==e){const e=s[0]>t,r=o[0]>t;e&&r?u=!u:o[0]-(o[1]-i)*(s[0]-o[0])/(s[1]-o[1])>=t&&(u=!u)}l=e,s=o,o=r[++a]}return u};module.exports=arePointsInside;
961
961
 
962
962
  },{"./flip":195,"./measureArea":197}],194:[function(require,module,exports){
963
963
  const create=e=>((void 0===e||e.length<3)&&(e=[]),{vertices:e});module.exports=create;
@@ -1002,9 +1002,9 @@ const plane=require("./plane"),measureArea=e=>{const r=e.vertices.length;if(r<3)
1002
1002
  const vec3=require("../../maths/vec3"),measureBoundingBox=e=>{const c=e.vertices,n=c.length,o=0===n?vec3.create():vec3.clone(c[0]),r=vec3.clone(o);for(let e=1;e<n;e++)vec3.min(o,o,c[e]),vec3.max(r,r,c[e]);return[o,r]};module.exports=measureBoundingBox;
1003
1003
 
1004
1004
  },{"../../maths/vec3":344}],208:[function(require,module,exports){
1005
- const vec3=require("../../maths/vec3"),vec4=require("../../maths/vec4"),cache=new WeakMap,measureBoundingSphere=e=>{let r=cache.get(e);if(r)return r;const t=e.vertices,c=vec4.create();if(0===t.length)return c[0]=0,c[1]=0,c[2]=0,c[3]=0,c;let a=t[0],n=a,s=a,h=a,u=a,o=a;t.forEach(e=>{a[0]>e[0]&&(a=e),n[1]>e[1]&&(n=e),s[2]>e[2]&&(s=e),h[0]<e[0]&&(h=e),u[1]<e[1]&&(u=e),o[2]<e[2]&&(o=e)}),c[0]=.5*(a[0]+h[0]),c[1]=.5*(n[1]+u[1]),c[2]=.5*(s[2]+o[2]);const i=c[0]-h[0],v=c[1]-u[1],m=c[2]-o[2];return c[3]=Math.sqrt(i*i+v*v+m*m),cache.set(e,c),c};module.exports=measureBoundingSphere;
1005
+ const vec4=require("../../maths/vec4"),cache=new WeakMap,measureBoundingSphere=e=>{const r=cache.get(e);if(r)return r;const t=e.vertices,c=vec4.create();if(0===t.length)return c[0]=0,c[1]=0,c[2]=0,c[3]=0,c;let n=t[0],a=n,s=n,h=n,o=n,u=n;t.forEach(e=>{n[0]>e[0]&&(n=e),a[1]>e[1]&&(a=e),s[2]>e[2]&&(s=e),h[0]<e[0]&&(h=e),o[1]<e[1]&&(o=e),u[2]<e[2]&&(u=e)}),c[0]=.5*(n[0]+h[0]),c[1]=.5*(a[1]+o[1]),c[2]=.5*(s[2]+u[2]);const i=c[0]-h[0],g=c[1]-o[1],m=c[2]-u[2];return c[3]=Math.sqrt(i*i+g*g+m*m),cache.set(e,c),c};module.exports=measureBoundingSphere;
1006
1006
 
1007
- },{"../../maths/vec3":344,"../../maths/vec4":370}],209:[function(require,module,exports){
1007
+ },{"../../maths/vec4":370}],209:[function(require,module,exports){
1008
1008
  const vec3=require("../../maths/vec3"),measureSignedVolume=e=>{let r=0;const t=e.vertices,c=vec3.create();for(let e=0;e<t.length-2;e++)vec3.cross(c,t[e+1],t[e+2]),r+=vec3.dot(t[0],c);return r/=6};module.exports=measureSignedVolume;
1009
1009
 
1010
1010
  },{"../../maths/vec3":344}],210:[function(require,module,exports){
@@ -1671,7 +1671,7 @@ const pointInTriangle=(n,a,e,r,i,o,t,x)=>(i-t)*(a-x)-(n-t)*(o-x)>=0&&(n-t)*(r-x)
1671
1671
  const mat4=require("../../maths/mat4"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),slice=require("./slice"),repairSlice=require("./slice/repair"),extrudeWalls=require("./extrudeWalls"),defaultCallback=(e,r,l)=>{let t=null;return geom2.isA(l)&&(t=slice.fromSides(geom2.toSides(l))),poly3.isA(l)&&(t=slice.fromPoints(poly3.toPoints(l))),0===e||1===e?slice.transform(mat4.fromTranslation(mat4.create(),[0,0,e]),t):null},extrudeFromSlices=(e,r)=>{const l={numberOfSlices:2,capStart:!0,capEnd:!0,close:!1,repair:!0,callback:defaultCallback},{numberOfSlices:t,capStart:o,capEnd:c,close:s,repair:i,callback:a}=Object.assign({},l,e);if(t<2)throw new Error("numberOfSlices must be 2 or more");i&&(r=repairSlice(r));const n=t-1;let u=null,m=null,f=null,g=[];for(let e=0;e<t;e++){const l=a(e/n,e,r);if(l){if(!slice.isA(l))throw new Error("the callback function must return slice objects");if(0===slice.toEdges(l).length)throw new Error("the callback function must return slices with one or more edges");f&&(g=g.concat(extrudeWalls(f,l))),0===e&&(u=l),e===t-1&&(m=l),f=l}}if(c){const e=slice.toPolygons(m);g=g.concat(e)}if(o){const e=slice.toPolygons(u).map(poly3.invert);g=g.concat(e)}return o||c||s&&!slice.equals(m,u)&&(g=g.concat(extrudeWalls(m,u))),geom3.create(g)};module.exports=extrudeFromSlices;
1672
1672
 
1673
1673
  },{"../../geometries/geom2":149,"../../geometries/geom3":164,"../../geometries/poly3":202,"../../maths/mat4":266,"./extrudeWalls":439,"./slice":448,"./slice/repair":450}],431:[function(require,module,exports){
1674
- const{TAU:TAU}=require("../../maths/constants"),slice=require("./slice"),mat4=require("../../maths/mat4"),extrudeFromSlices=require("./extrudeFromSlices"),geom2=require("../../geometries/geom2"),extrudeHelical=(e,t)=>{const r={angle:TAU,startAngle:0,pitch:10,endOffset:0,segmentsPerRotation:32},{angle:a,endOffset:s,segmentsPerRotation:i,startAngle:o}=Object.assign({},r,e);let n;n=!e.pitch&&e.height?e.height/(a/TAU):e.pitch?e.pitch:r.pitch;if(i<3)throw new Error("The number of segments per rotation needs to be at least 3.");let m=geom2.toSides(t);if(0===m.length)throw new Error("the given geometry cannot be empty");const l=m.filter(e=>e[0][0]>=0);let c=slice.fromSides(m);0===l.length&&(c=slice.reverse(c));const h=Math.round(i/TAU*Math.abs(a)),g=h>=2?h:2,u=mat4.create();let f;return extrudeFromSlices({numberOfSlices:g+1,callback:(e,t,r)=>{const i=o+a/g*t,m=s/g*t,l=(i-o)/TAU*n;return mat4.multiply(u,mat4.fromTranslation(mat4.create(),[m,0,l*Math.sign(a)]),mat4.fromXRotation(mat4.create(),-TAU/4*Math.sign(a))),f=mat4.create(),mat4.multiply(f,mat4.fromZRotation(mat4.create(),i),u),slice.transform(f,r)}},c)};module.exports=extrudeHelical;
1674
+ const{TAU:TAU}=require("../../maths/constants"),slice=require("./slice"),mat4=require("../../maths/mat4"),extrudeFromSlices=require("./extrudeFromSlices"),geom2=require("../../geometries/geom2"),extrudeHelical=(e,t)=>{const r={angle:TAU,startAngle:0,pitch:10,endOffset:0,segmentsPerRotation:32},{angle:a,endOffset:s,segmentsPerRotation:o,startAngle:i}=Object.assign({},r,e);let n;n=!e.pitch&&e.height?e.height/(a/TAU):e.pitch?e.pitch:r.pitch;if(o<3)throw new Error("The number of segments per rotation needs to be at least 3.");const m=geom2.toSides(t);if(0===m.length)throw new Error("the given geometry cannot be empty");const c=m.filter(e=>e[0][0]>=0);let l=slice.fromSides(m);0===c.length&&(l=slice.reverse(l));const h=Math.round(o/TAU*Math.abs(a)),g=h>=2?h:2,u=mat4.create();let f;return extrudeFromSlices({numberOfSlices:g+1,callback:(e,t,r)=>{const o=i+a/g*t,m=s/g*t,c=(o-i)/TAU*n;return mat4.multiply(u,mat4.fromTranslation(mat4.create(),[m,0,c*Math.sign(a)]),mat4.fromXRotation(mat4.create(),-TAU/4*Math.sign(a))),f=mat4.create(),mat4.multiply(f,mat4.fromZRotation(mat4.create(),o),u),slice.transform(f,r)}},l)};module.exports=extrudeHelical;
1675
1675
 
1676
1676
  },{"../../geometries/geom2":149,"../../maths/constants":217,"../../maths/mat4":266,"./extrudeFromSlices":430,"./slice":448}],432:[function(require,module,exports){
1677
1677
  const flatten=require("../../utils/flatten"),geom2=require("../../geometries/geom2"),path2=require("../../geometries/path2"),extrudeLinearGeom2=require("./extrudeLinearGeom2"),extrudeLinearPath2=require("./extrudeLinearPath2"),extrudeLinear=(e,...t)=>{const{height:r,twistAngle:i,twistSteps:n,repair:a}=Object.assign({},{height:1,twistAngle:0,twistSteps:1,repair:!0},e);if(0===(t=flatten(t)).length)throw new Error("wrong number of arguments");e={offset:[0,0,r],twistAngle:i,twistSteps:n,repair:a};const s=t.map(t=>path2.isA(t)?extrudeLinearPath2(e,t):geom2.isA(t)?extrudeLinearGeom2(e,t):t);return 1===s.length?s[0]:s};module.exports=extrudeLinear;
@@ -1761,7 +1761,7 @@ const flatten=require("../../utils/flatten"),geom3=require("../../geometries/geo
1761
1761
  const flatten=require("../../utils/flatten"),path2=require("../../geometries/path2"),hullPoints2=require("./hullPoints2"),toUniquePoints=require("./toUniquePoints"),hullPath2=(...t)=>{t=flatten(t);const e=toUniquePoints(t),o=hullPoints2(e);return path2.fromPoints({closed:!0},o)};module.exports=hullPath2;
1762
1762
 
1763
1763
  },{"../../geometries/path2":185,"../../utils/flatten":519,"./hullPoints2":461,"./toUniquePoints":471}],461:[function(require,module,exports){
1764
- const vec2=require("../../maths/vec2"),hullPoints2=t=>{let e=vec2.fromValues(1/0,1/0);t.forEach(t=>{(t[1]<e[1]||t[1]===e[1]&&t[0]<e[0])&&(e=t)});const n=[];t.forEach(t=>{const s=fakeAtan2(t[1]-e[1],t[0]-e[0]),o=vec2.squaredDistance(t,e);n.push({point:t,angle:s,distSq:o})}),n.sort((t,e)=>t.angle<e.angle?-1:t.angle>e.angle?1:t.distSq<e.distSq?-1:t.distSq>e.distSq?1:0);const s=[];return n.forEach(t=>{let e=s.length;for(;e>1&&ccw(s[e-2],s[e-1],t.point)<=Number.EPSILON;)s.pop(),e=s.length;s.push(t.point)}),s},ccw=(t,e,n)=>(e[0]-t[0])*(n[1]-t[1])-(e[1]-t[1])*(n[0]-t[0]),fakeAtan2=(t,e)=>0===t&&0===e?-1/0:-e/t;module.exports=hullPoints2;
1764
+ const vec2=require("../../maths/vec2"),hullPoints2=e=>{let t=vec2.fromValues(1/0,1/0);e.forEach(e=>{(e[1]<t[1]||e[1]===t[1]&&e[0]<t[0])&&(t=e)});const n=[];e.forEach(e=>{const o=fakeAtan2(e[1]-t[1],e[0]-t[0]),s=vec2.squaredDistance(e,t);n.push({point:e,angle:o,distSq:s})}),n.sort((e,t)=>e.angle!==t.angle?e.angle-t.angle:e.distSq-t.distSq);const o=[];return n.forEach(e=>{let t=o.length;for(;t>1&&ccw(o[t-2],o[t-1],e.point)<=Number.EPSILON;)o.pop(),t=o.length;o.push(e.point)}),o},ccw=(e,t,n)=>(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0]),fakeAtan2=(e,t)=>0===e&&0===t?-1/0:-t/e;module.exports=hullPoints2;
1765
1765
 
1766
1766
  },{"../../maths/vec2":313}],462:[function(require,module,exports){
1767
1767
  module.exports={hull:require("./hull"),hullChain:require("./hullChain")};
@@ -1809,9 +1809,9 @@ const aboutEqualNormals=require("../../maths/utils/aboutEqualNormals"),vec3=requ
1809
1809
  const{EPS:EPS}=require("../../maths/constants"),line2=require("../../maths/line2"),vec2=require("../../maths/vec2"),OrthoNormalBasis=require("../../maths/OrthoNormalBasis"),interpolateBetween2DPointsForY=require("../../maths/utils/interpolateBetween2DPointsForY"),{insertSorted:insertSorted,fnNumberSort:fnNumberSort}=require("../../utils"),poly3=require("../../geometries/poly3"),reTesselateCoplanarPolygons=t=>{if(t.length<2)return t;const e=[],o=t.length,n=poly3.plane(t[0]),l=new OrthoNormalBasis(n),i=[],r=[],s=new Map,f=new Map,p=new Map,h=10/EPS;for(let e=0;e<o;e++){const o=t[e];let n=[],g=o.vertices.length,c=-1;if(g>0){let t,i;for(let r=0;r<g;r++){let s=l.to2D(o.vertices[r]);const g=Math.floor(s[1]*h);let a;p.has(g)?a=p.get(g):p.has(g+1)?a=p.get(g+1):p.has(g-1)?a=p.get(g-1):(a=s[1],p.set(g,s[1])),s=vec2.fromValues(s[0],a),n.push(s);const u=s[1];(0===r||u<t)&&(t=u,c=r),(0===r||u>i)&&(i=u);let m=f.get(u);m||(m={},f.set(u,m)),m[e]=!0}if(t>=i)n=[],g=0,c=-1;else{let o=s.get(t);o||(o=[],s.set(t,o)),o.push(e)}}n.reverse(),c=g-c-1,i.push(n),r.push(c)}const g=[];f.forEach((t,e)=>g.push(e)),g.sort(fnNumberSort);let c=[],a=[];for(let t=0;t<g.length;t++){const o=[],p=g[t],h=f.get(p);for(let t=0;t<c.length;++t){const e=c[t],o=e.polygonindex;if(h[o]){const n=i[o],l=n.length;let r=e.leftvertexindex,s=e.rightvertexindex;for(;;){let t=r+1;if(t>=l&&(t=0),n[t][1]!==p)break;r=t}let f=s-1;if(f<0&&(f=l-1),n[f][1]===p&&(s=f),r!==e.leftvertexindex&&r===s)c.splice(t,1),--t;else{e.leftvertexindex=r,e.rightvertexindex=s,e.topleft=n[r],e.topright=n[s];let t=r+1;t>=l&&(t=0),e.bottomleft=n[t];let o=s-1;o<0&&(o=l-1),e.bottomright=n[o]}}}let u;if(t>=g.length-1)c=[],u=null;else{const e=.5*(p+(u=Number(g[t+1]))),o=s.get(p);for(const t in o){const n=o[t],l=i[n],s=l.length,f=r[n];let h=f;for(;;){let t=h+1;if(t>=s&&(t=0),l[t][1]!==p)break;if(t===f)break;h=t}let g=f;for(;;){let t=g-1;if(t<0&&(t=s-1),l[t][1]!==p)break;if(t===h)break;g=t}let a=h+1;a>=s&&(a=0);let u=g-1;u<0&&(u=s-1);const m={polygonindex:n,leftvertexindex:h,rightvertexindex:g,topleft:l[h],topright:l[g],bottomleft:l[a],bottomright:l[u]};insertSorted(c,m,(t,o)=>{const n=interpolateBetween2DPointsForY(t.topleft,t.bottomleft,e),l=interpolateBetween2DPointsForY(o.topleft,o.bottomleft,e);return n>l?1:n<l?-1:0})}}for(const t in c){const e=c[t];let n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,p);const l=vec2.fromValues(n,p);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,p);const i=vec2.fromValues(n,p);n=interpolateBetween2DPointsForY(e.topleft,e.bottomleft,u);const r=vec2.fromValues(n,u);n=interpolateBetween2DPointsForY(e.topright,e.bottomright,u);const s=vec2.fromValues(n,u),f={topleft:l,topright:i,bottomleft:r,bottomright:s,leftline:line2.fromPoints(line2.create(),l,r),rightline:line2.fromPoints(line2.create(),s,i)};if(o.length>0){const t=o[o.length-1],e=vec2.distance(f.topleft,t.topright),n=vec2.distance(f.bottomleft,t.bottomright);e<EPS&&n<EPS&&(f.topleft=t.topleft,f.leftline=t.leftline,f.bottomleft=t.bottomleft,o.splice(o.length-1,1))}o.push(f)}if(t>0){const t=new Set,i=new Set;for(let e=0;e<o.length;e++){const n=o[e];for(let e=0;e<a.length;e++)if(!i.has(e)){const o=a[e];if(vec2.distance(o.bottomleft,n.topleft)<EPS&&vec2.distance(o.bottomright,n.topright)<EPS){i.add(e);const l=line2.direction(n.leftline),r=line2.direction(o.leftline),s=l[0]-r[0],f=line2.direction(n.rightline),p=line2.direction(o.rightline),h=f[0]-p[0],g=Math.abs(s)<EPS,c=Math.abs(h)<EPS,a=c||h>=0;(g||s>=0)&&a&&(n.outpolygon=o.outpolygon,n.leftlinecontinues=g,n.rightlinecontinues=c,t.add(e));break}}}for(let o=0;o<a.length;o++)if(!t.has(o)){const t=a[o];t.outpolygon.rightpoints.push(t.bottomright),vec2.distance(t.bottomright,t.bottomleft)>EPS&&t.outpolygon.leftpoints.push(t.bottomleft),t.outpolygon.leftpoints.reverse();const i=t.outpolygon.rightpoints.concat(t.outpolygon.leftpoints).map(t=>l.to3D(t)),r=poly3.fromPointsAndPlane(i,n);r.vertices.length&&e.push(r)}}for(let t=0;t<o.length;t++){const e=o[t];e.outpolygon?(e.leftlinecontinues||e.outpolygon.leftpoints.push(e.topleft),e.rightlinecontinues||e.outpolygon.rightpoints.push(e.topright)):(e.outpolygon={leftpoints:[],rightpoints:[]},e.outpolygon.leftpoints.push(e.topleft),vec2.distance(e.topleft,e.topright)>EPS&&e.outpolygon.rightpoints.push(e.topright))}a=o}return e};module.exports=reTesselateCoplanarPolygons;
1810
1810
 
1811
1811
  },{"../../geometries/poly3":202,"../../maths/OrthoNormalBasis":216,"../../maths/constants":217,"../../maths/line2":228,"../../maths/utils/interpolateBetween2DPointsForY":292,"../../maths/vec2":313,"../../utils":521}],477:[function(require,module,exports){
1812
- const geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),aboutEqualNormals=require("../../maths/utils/aboutEqualNormals"),reTesselateCoplanarPolygons=require("./reTesselateCoplanarPolygons"),coplanar=(e,o)=>Math.abs(e[3]-o[3])<1.5e-7&&aboutEqualNormals(e,o),retessellate=e=>{if(e.isRetesselated)return e;const o=geom3.toPolygons(e),s=[];o.forEach(e=>{const o=s.find(o=>coplanar(o[0],poly3.plane(e)));if(o){o[1].push(e)}else s.push([poly3.plane(e),[e]])});let a=[];s.forEach(e=>{const o=e[1],s=reTesselateCoplanarPolygons(o);a=a.concat(s)});const l=geom3.create(a);return l.isRetesselated=!0,l};module.exports=retessellate;
1812
+ const geom3=require("../../geometries/geom3"),poly3=require("../../geometries/poly3"),{NEPS:NEPS}=require("../../maths/constants"),reTesselateCoplanarPolygons=require("./reTesselateCoplanarPolygons"),retessellate=e=>{if(e.isRetesselated)return e;const s=geom3.toPolygons(e).map((e,s)=>({vertices:e.vertices,plane:poly3.plane(e),index:s})),o=classifyPolygons(s),l=[];o.forEach(e=>{if(Array.isArray(e)){const s=reTesselateCoplanarPolygons(e);l.push(...s)}else l.push(e)});const n=geom3.create(l);return n.isRetesselated=!0,n},classifyPolygons=e=>{let s=[e];const o=[];for(let e=3;e>=0;e--){const l=[],n=3===e?1.5e-8:NEPS;s.forEach(s=>{s.sort(byPlaneComponent(e,n));let t=0;for(let r=1;r<s.length;r++)s[r].plane[e]-s[t].plane[e]>n&&(r-t==1?o.push(s[t]):l.push(s.slice(t,r)),t=r);s.length-t==1?o.push(s[t]):l.push(s.slice(t))}),s=l}const l=[];return s.forEach(e=>{e[0]&&(l[e[0].index]=e)}),o.forEach(e=>{l[e.index]=e}),l},byPlaneComponent=(e,s)=>(o,l)=>o.plane[e]-l.plane[e]>s?1:l.plane[e]-o.plane[e]>s?-1:0;module.exports=retessellate;
1813
1813
 
1814
- },{"../../geometries/geom3":164,"../../geometries/poly3":202,"../../maths/utils/aboutEqualNormals":289,"./reTesselateCoplanarPolygons":476}],478:[function(require,module,exports){
1814
+ },{"../../geometries/geom3":164,"../../geometries/poly3":202,"../../maths/constants":217,"./reTesselateCoplanarPolygons":476}],478:[function(require,module,exports){
1815
1815
  const flatten=require("../../utils/flatten"),vec2=require("../../maths/vec2"),geom2=require("../../geometries/geom2"),geom3=require("../../geometries/geom3"),path2=require("../../geometries/path2"),measureEpsilon=require("../../measurements/measureEpsilon"),snapPolygons=require("./snapPolygons"),snapPath2=e=>{const s=measureEpsilon(e),r=path2.toPoints(e).map(e=>vec2.snap(vec2.create(),e,s));return path2.create(r)},snapGeom2=e=>{const s=measureEpsilon(e);let r=geom2.toSides(e).map(e=>[vec2.snap(vec2.create(),e[0],s),vec2.snap(vec2.create(),e[1],s)]);return r=r.filter(e=>!vec2.equals(e[0],e[1])),geom2.create(r)},snapGeom3=e=>{const s=measureEpsilon(e),r=geom3.toPolygons(e),o=snapPolygons(s,r);return geom3.create(o)},snap=(...e)=>{if(0===(e=flatten(e)).length)throw new Error("wrong number of arguments");const s=e.map(e=>path2.isA(e)?snapPath2(e):geom2.isA(e)?snapGeom2(e):geom3.isA(e)?snapGeom3(e):e);return 1===s.length?s[0]:s};module.exports=snap;
1816
1816
 
1817
1817
  },{"../../geometries/geom2":149,"../../geometries/geom3":164,"../../geometries/path2":185,"../../maths/vec2":313,"../../measurements/measureEpsilon":385,"../../utils/flatten":519,"./snapPolygons":479}],479:[function(require,module,exports){
@@ -1848,31 +1848,31 @@ const flatten=require("../../utils/flatten"),mat4=require("../../maths/mat4"),ge
1848
1848
  const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),path2=require("../geometries/path2"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),arc=e=>{const r={center:[0,0],radius:1,startAngle:0,endAngle:TAU,makeTangent:!1,segments:32};let{center:t,radius:s,startAngle:n,endAngle:a,makeTangent:o,segments:c}=Object.assign({},r,e);if(!isNumberArray(t,2))throw new Error("center must be an array of X and Y values");if(!isGT(s,0))throw new Error("radius must be greater than zero");if(!isGTE(n,0))throw new Error("startAngle must be positive");if(!isGTE(a,0))throw new Error("endAngle must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");let i=TAU;(n%=TAU)<(a%=TAU)&&(i=a-n),n>a&&(i=a+(TAU-n));const m=Math.acos((s*s+s*s-EPS*EPS)/(2*s*s)),l=vec2.clone(t);let u;const A=[];if(i<m)u=vec2.fromAngleRadians(vec2.create(),n),vec2.scale(u,u,s),vec2.add(u,u,l),A.push(u);else{const e=Math.max(1,Math.floor(c*(i/TAU)))+1;let r=.5*e/i;r>.25&&(r=.25);const t=o?e+2:e;for(let a=0;a<=t;a++){let t=a;o&&((t=(a-1)*(e-2*r)/e+r)<0&&(t=0),t>e&&(t=e));const c=n+t*(i/e);u=vec2.fromAngleRadians(vec2.create(),c),vec2.scale(u,u,s),vec2.add(u,u,l),A.push(u)}}return path2.fromPoints({closed:!1},A)};module.exports=arc;
1849
1849
 
1850
1850
  },{"../geometries/path2":185,"../maths/constants":217,"../maths/vec2":313,"./commonChecks":491}],490:[function(require,module,exports){
1851
- const{TAU:TAU}=require("../maths/constants"),ellipse=require("./ellipse"),{isGT:isGT}=require("./commonChecks"),circle=e=>{const s={center:[0,0],radius:1,startAngle:0,endAngle:TAU,segments:32};let{center:r,radius:t,startAngle:n,endAngle:i,segments:l}=Object.assign({},s,e);if(!isGT(t,0))throw new Error("radius must be greater than zero");return ellipse({center:r,radius:t=[t,t],startAngle:n,endAngle:i,segments:l})};module.exports=circle;
1851
+ const{TAU:TAU}=require("../maths/constants"),ellipse=require("./ellipse"),{isGTE:isGTE}=require("./commonChecks"),circle=e=>{const s={center:[0,0],radius:1,startAngle:0,endAngle:TAU,segments:32};let{center:r,radius:t,startAngle:n,endAngle:i,segments:l}=Object.assign({},s,e);if(!isGTE(t,0))throw new Error("radius must be positive");return ellipse({center:r,radius:t=[t,t],startAngle:n,endAngle:i,segments:l})};module.exports=circle;
1852
1852
 
1853
1853
  },{"../maths/constants":217,"./commonChecks":491,"./ellipse":496}],491:[function(require,module,exports){
1854
1854
  const isNumberArray=(i,r)=>!!(Array.isArray(i)&&i.length>=r)&&i.every(i=>Number.isFinite(i)),isGT=(i,r)=>Number.isFinite(i)&&i>r,isGTE=(i,r)=>Number.isFinite(i)&&i>=r;module.exports={isNumberArray:isNumberArray,isGT:isGT,isGTE:isGTE};
1855
1855
 
1856
1856
  },{}],492:[function(require,module,exports){
1857
- const cuboid=require("./cuboid"),{isGT:isGT}=require("./commonChecks"),cube=e=>{let{center:r,size:i}=Object.assign({},{center:[0,0,0],size:2},e);if(!isGT(i,0))throw new Error("size must be greater than zero");return cuboid({center:r,size:i=[i,i,i]})};module.exports=cube;
1857
+ const cuboid=require("./cuboid"),{isGTE:isGTE}=require("./commonChecks"),cube=e=>{let{center:i,size:r}=Object.assign({},{center:[0,0,0],size:2},e);if(!isGTE(r,0))throw new Error("size must be positive");return cuboid({center:i,size:r=[r,r,r]})};module.exports=cube;
1858
1858
 
1859
1859
  },{"./commonChecks":491,"./cuboid":493}],493:[function(require,module,exports){
1860
- const geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isNumberArray:isNumberArray}=require("./commonChecks"),cuboid=e=>{const{center:r,size:o}=Object.assign({},{center:[0,0,0],size:[2,2,2]},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(o,3))throw new Error("size must be an array of width, depth and height values");if(!o.every(e=>e>0))throw new Error("size values must be greater than zero");return geom3.create([[[0,4,6,2],[-1,0,0]],[[1,3,7,5],[1,0,0]],[[0,1,5,4],[0,-1,0]],[[2,6,7,3],[0,1,0]],[[0,2,3,1],[0,0,-1]],[[4,5,7,6],[0,0,1]]].map(e=>{const t=e[0].map(e=>{return[r[0]+o[0]/2*(2*!!(1&e)-1),r[1]+o[1]/2*(2*!!(2&e)-1),r[2]+o[2]/2*(2*!!(4&e)-1)]});return poly3.create(t)}))};module.exports=cuboid;
1860
+ const geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isNumberArray:isNumberArray}=require("./commonChecks"),cuboid=e=>{const{center:r,size:o}=Object.assign({},{center:[0,0,0],size:[2,2,2]},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(o,3))throw new Error("size must be an array of width, depth and height values");if(!o.every(e=>e>=0))throw new Error("size values must be positive");return 0===o[0]||0===o[1]||0===o[2]?geom3.create():geom3.create([[[0,4,6,2],[-1,0,0]],[[1,3,7,5],[1,0,0]],[[0,1,5,4],[0,-1,0]],[[2,6,7,3],[0,1,0]],[[0,2,3,1],[0,0,-1]],[[4,5,7,6],[0,0,1]]].map(e=>{const t=e[0].map(e=>{return[r[0]+o[0]/2*(2*!!(1&e)-1),r[1]+o[1]/2*(2*!!(2&e)-1),r[2]+o[2]/2*(2*!!(4&e)-1)]});return poly3.create(t)}))};module.exports=cuboid;
1861
1861
 
1862
1862
  },{"../geometries/geom3":164,"../geometries/poly3":202,"./commonChecks":491}],494:[function(require,module,exports){
1863
- const cylinderElliptic=require("./cylinderElliptic"),{isGT:isGT}=require("./commonChecks"),cylinder=e=>{const{center:i,height:r,radius:t,segments:s}=Object.assign({},{center:[0,0,0],height:2,radius:1,segments:32},e);if(!isGT(t,0))throw new Error("radius must be greater than zero");return cylinderElliptic({center:i,height:r,startRadius:[t,t],endRadius:[t,t],segments:s})};module.exports=cylinder;
1863
+ const geom3=require("../geometries/geom3"),cylinderElliptic=require("./cylinderElliptic"),{isGTE:isGTE}=require("./commonChecks"),cylinder=e=>{const{center:i,height:r,radius:s,segments:t}=Object.assign({},{center:[0,0,0],height:2,radius:1,segments:32},e);if(!isGTE(s,0))throw new Error("radius must be positive");return 0===r||0===s?geom3.create():cylinderElliptic({center:i,height:r,startRadius:[s,s],endRadius:[s,s],segments:t})};module.exports=cylinder;
1864
1864
 
1865
- },{"./commonChecks":491,"./cylinderElliptic":495}],495:[function(require,module,exports){
1865
+ },{"../geometries/geom3":164,"./commonChecks":491,"./cylinderElliptic":495}],495:[function(require,module,exports){
1866
1866
  const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cylinderElliptic=e=>{const r={center:[0,0,0],height:2,startRadius:[1,1],startAngle:0,endRadius:[1,1],endAngle:TAU,segments:32};let{center:s,height:t,startRadius:a,startAngle:i,endRadius:o,endAngle:n,segments:u}=Object.assign({},r,e);if(!isNumberArray(s,3))throw new Error("center must be an array of X, Y and Z values");if(!isGT(t,0))throw new Error("height must be greater then zero");if(!isNumberArray(a,2))throw new Error("startRadius must be an array of X and Y values");if(!a.every(e=>e>=0))throw new Error("startRadius values must be positive");if(!isNumberArray(o,2))throw new Error("endRadius must be an array of X and Y values");if(!o.every(e=>e>=0))throw new Error("endRadius values must be positive");if(o.every(e=>0===e)&&a.every(e=>0===e))throw new Error("at least one radius must be positive");if(!isGTE(i,0))throw new Error("startAngle must be positive");if(!isGTE(n,0))throw new Error("endAngle must be positive");if(!isGTE(u,4))throw new Error("segments must be four or more");let c=TAU;(i%=TAU)<(n%=TAU)&&(c=n-i),i>n&&(c=n+(TAU-i));const l=Math.min(a[0],a[1],o[0],o[1]),m=Math.acos((l*l+l*l-EPS*EPS)/(2*l*l));if(c<m)throw new Error("startAngle and endAngle do not define a significant rotation");const h=Math.floor(u*(c/TAU)),d=vec3.fromValues(0,0,-t/2),v=vec3.fromValues(0,0,t/2),f=vec3.subtract(vec3.create(),v,d),g=vec3.fromValues(1,0,0),p=vec3.fromValues(0,1,0),A=vec3.create(),w=vec3.create(),E=vec3.create(),y=(e,r,s)=>{const t=r*c+i;return vec3.scale(A,g,s[0]*cos(t)),vec3.scale(w,p,s[1]*sin(t)),vec3.add(A,A,w),vec3.scale(E,f,e),vec3.add(E,E,d),vec3.add(vec3.create(),A,E)},T=(...e)=>{const r=e.map(e=>vec3.add(vec3.create(),e,s));return poly3.create(r)},b=[];for(let e=0;e<h;e++){const r=e/h;let s=(e+1)/h;c===TAU&&e===h-1&&(s=0),o[0]===a[0]&&o[1]===a[1]?(b.push(T(d,y(0,s,o),y(0,r,o))),b.push(T(y(0,s,o),y(1,s,o),y(1,r,o),y(0,r,o))),b.push(T(v,y(1,r,o),y(1,s,o)))):(a[0]>0&&a[1]>0&&b.push(T(d,y(0,s,a),y(0,r,a))),(a[0]>0||a[1]>0)&&b.push(T(y(0,r,a),y(0,s,a),y(1,r,o))),o[0]>0&&o[1]>0&&b.push(T(v,y(1,r,o),y(1,s,o))),(o[0]>0||o[1]>0)&&b.push(T(y(1,r,o),y(0,s,a),y(1,s,o))))}return c<TAU&&(b.push(T(d,y(0,0,a),v)),b.push(T(y(0,0,a),y(1,0,o),v)),b.push(T(d,v,y(0,1,a))),b.push(T(y(0,1,a),v,y(1,1,o)))),geom3.create(b)};module.exports=cylinderElliptic;
1867
1867
 
1868
1868
  },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec3":344,"./commonChecks":491}],496:[function(require,module,exports){
1869
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipse=e=>{const r={center:[0,0],radius:[1,1],startAngle:0,endAngle:TAU,segments:32};let{center:s,radius:t,startAngle:n,endAngle:o,segments:i}=Object.assign({},r,e);if(!isNumberArray(s,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("radius must be an array of X and Y values");if(!t.every(e=>e>0))throw new Error("radius values must be greater than zero");if(!isGTE(n,0))throw new Error("startAngle must be positive");if(!isGTE(o,0))throw new Error("endAngle must be positive");if(!isGTE(i,3))throw new Error("segments must be three or more");let a=TAU;(n%=TAU)<(o%=TAU)&&(a=o-n),n>o&&(a=o+(TAU-n));const m=Math.min(t[0],t[1]);if(a<Math.acos((m*m+m*m-EPS*EPS)/(2*m*m)))throw new Error("startAngle and endAngle do not define a significant rotation");i=Math.floor(i*(a/TAU));const u=vec2.clone(s),c=a/i,l=[];i=a<TAU?i+1:i;for(let e=0;e<i;e++){const r=c*e+n,s=vec2.fromValues(t[0]*cos(r),t[1]*sin(r));vec2.add(s,u,s),l.push(s)}return a<TAU&&l.push(u),geom2.fromPoints(l)};module.exports=ellipse;
1869
+ const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipse=e=>{const r={center:[0,0],radius:[1,1],startAngle:0,endAngle:TAU,segments:32};let{center:s,radius:t,startAngle:n,endAngle:o,segments:i}=Object.assign({},r,e);if(!isNumberArray(s,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("radius must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("radius values must be positive");if(!isGTE(n,0))throw new Error("startAngle must be positive");if(!isGTE(o,0))throw new Error("endAngle must be positive");if(!isGTE(i,3))throw new Error("segments must be three or more");if(0===t[0]||0===t[1])return geom2.create();let a=TAU;(n%=TAU)<(o%=TAU)&&(a=o-n),n>o&&(a=o+(TAU-n));const m=Math.min(t[0],t[1]);if(a<Math.acos((m*m+m*m-EPS*EPS)/(2*m*m)))throw new Error("startAngle and endAngle do not define a significant rotation");i=Math.floor(i*(a/TAU));const u=vec2.clone(s),c=a/i,l=[];i=a<TAU?i+1:i;for(let e=0;e<i;e++){const r=c*e+n,s=vec2.fromValues(t[0]*cos(r),t[1]*sin(r));vec2.add(s,u,s),l.push(s)}return a<TAU&&l.push(u),geom2.fromPoints(l)};module.exports=ellipse;
1870
1870
 
1871
1871
  },{"../geometries/geom2":149,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec2":313,"./commonChecks":491}],497:[function(require,module,exports){
1872
- const{TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipsoid=e=>{const{center:c,radius:r,segments:a,axes:s}=Object.assign({},{center:[0,0,0],radius:[1,1,1],segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(r,3))throw new Error("radius must be an array of X, Y and Z values");if(!r.every(e=>e>0))throw new Error("radius values must be greater than zero");if(!isGTE(a,4))throw new Error("segments must be four or more");const t=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[0]),r[0]),v=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[1]),r[1]),o=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),s[2]),r[2]),l=Math.round(a/4);let u;const i=[],d=vec3.create(),n=vec3.create();for(let e=0;e<=a;e++){const r=TAU*e/a,s=vec3.add(vec3.create(),vec3.scale(d,t,cos(r)),vec3.scale(n,v,sin(r)));if(e>0){let e,r;for(let a=0;a<=l;a++){const t=TAU/4*a/l,v=cos(t),m=sin(t);if(a>0){let t,h=[];t=vec3.subtract(vec3.create(),vec3.scale(d,u,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),t=vec3.subtract(vec3.create(),vec3.scale(d,s,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),a<l&&(t=vec3.subtract(vec3.create(),vec3.scale(d,s,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c))),t=vec3.subtract(vec3.create(),vec3.scale(d,u,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c)),i.push(poly3.create(h)),h=[],t=vec3.add(vec3.create(),vec3.scale(d,u,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),t=vec3.add(t,vec3.scale(d,s,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),a<l&&(t=vec3.add(t,vec3.scale(d,s,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t))),t=vec3.add(t,vec3.scale(d,u,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t)),h.reverse(),i.push(poly3.create(h))}e=v,r=m}}u=s}return geom3.create(i)};module.exports=ellipsoid;
1872
+ const{TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),ellipsoid=e=>{const{center:c,radius:r,segments:s,axes:a}=Object.assign({},{center:[0,0,0],radius:[1,1,1],segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(r,3))throw new Error("radius must be an array of X, Y and Z values");if(!r.every(e=>e>=0))throw new Error("radius values must be positive");if(!isGTE(s,4))throw new Error("segments must be four or more");if(0===r[0]||0===r[1]||0===r[2])return geom3.create();const t=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[0]),r[0]),v=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[1]),r[1]),o=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),a[2]),r[2]),i=Math.round(s/4);let l;const u=[],d=vec3.create(),n=vec3.create();for(let e=0;e<=s;e++){const r=TAU*e/s,a=vec3.add(vec3.create(),vec3.scale(d,t,cos(r)),vec3.scale(n,v,sin(r)));if(e>0){let e,r;for(let s=0;s<=i;s++){const t=TAU/4*s/i,v=cos(t),m=sin(t);if(s>0){let t,h=[];t=vec3.subtract(vec3.create(),vec3.scale(d,l,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),t=vec3.subtract(vec3.create(),vec3.scale(d,a,e),vec3.scale(n,o,r)),h.push(vec3.add(t,t,c)),s<i&&(t=vec3.subtract(vec3.create(),vec3.scale(d,a,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c))),t=vec3.subtract(vec3.create(),vec3.scale(d,l,v),vec3.scale(n,o,m)),h.push(vec3.add(t,t,c)),u.push(poly3.create(h)),h=[],t=vec3.add(vec3.create(),vec3.scale(d,l,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),t=vec3.add(t,vec3.scale(d,a,e),vec3.scale(n,o,r)),h.push(vec3.add(vec3.create(),c,t)),s<i&&(t=vec3.add(t,vec3.scale(d,a,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t))),t=vec3.add(t,vec3.scale(d,l,v),vec3.scale(n,o,m)),h.push(vec3.add(vec3.create(),c,t)),h.reverse(),u.push(poly3.create(h))}e=v,r=m}}l=a}return geom3.create(u)};module.exports=ellipsoid;
1873
1873
 
1874
1874
  },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec3":344,"./commonChecks":491}],498:[function(require,module,exports){
1875
- const mat4=require("../maths/mat4"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),polyhedron=require("./polyhedron"),{isGT:isGT,isGTE:isGTE}=require("./commonChecks"),geodesicSphere=e=>{let{radius:r,frequency:t}=Object.assign({},{radius:1,frequency:6},e);if(!isGT(r,0))throw new Error("radius must be greater than zero");if(!isGTE(t,6))throw new Error("frequency must be six or more");t=Math.floor(t/6);const o=[[.850651,0,-.525731],[.850651,-0,.525731],[-.850651,-0,.525731],[-.850651,0,-.525731],[0,-.525731,.850651],[0,.525731,.850651],[0,.525731,-.850651],[0,-.525731,-.850651],[-.525731,-.850651,-0],[.525731,-.850651,-0],[.525731,.850651,0],[-.525731,.850651,0]],s=[[0,9,1],[1,10,0],[6,7,0],[10,6,0],[7,9,0],[5,1,4],[4,1,9],[5,10,1],[2,8,3],[3,11,2],[2,5,4],[4,8,2],[2,11,5],[3,7,6],[6,11,3],[8,7,3],[9,8,4],[11,10,5],[10,11,6],[8,9,7]],n=(e,r,t)=>{const o=e[0],s=e[1],n=e[2];let c=t;const a=[],l=[];for(let e=0;e<r;e++)for(let t=0;t<r-e;t++){const f=e/r,u=(e+1)/r,h=t/(r-e),m=(t+1)/(r-e),g=r-e-1?t/(r-e-1):1,p=[];p[0]=i(i(o,s,h),n,f),p[1]=i(i(o,s,m),n,f),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}if(a.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3,t<r-e-1){const h=r-e-1?(t+1)/(r-e-1):1;p[0]=i(i(o,s,m),n,f),p[1]=i(i(o,s,h),n,u),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}a.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3}}return{points:a,triangles:l,offset:c}},i=(e,r,t)=>{const o=1-t,s=[];for(let n=0;n<3;n++)s[n]=e[n]*o+r[n]*t;return s};let c=[],a=[],l=0;for(let e=0;e<s.length;e++){const r=n([o[s[e][0]],o[s[e][1]],o[s[e][2]]],t,l);c=c.concat(r.points),a=a.concat(r.triangles),l=r.offset}let f=polyhedron({points:c,faces:a,orientation:"inward"});return 1!==r&&(f=geom3.transform(mat4.fromScaling(mat4.create(),[r,r,r]),f)),f};module.exports=geodesicSphere;
1875
+ const mat4=require("../maths/mat4"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),polyhedron=require("./polyhedron"),{isGTE:isGTE}=require("./commonChecks"),geodesicSphere=e=>{let{radius:r,frequency:t}=Object.assign({},{radius:1,frequency:6},e);if(!isGTE(r,0))throw new Error("radius must be positive");if(!isGTE(t,6))throw new Error("frequency must be six or more");if(0===r)return geom3.create();t=Math.floor(t/6);const o=[[.850651,0,-.525731],[.850651,-0,.525731],[-.850651,-0,.525731],[-.850651,0,-.525731],[0,-.525731,.850651],[0,.525731,.850651],[0,.525731,-.850651],[0,-.525731,-.850651],[-.525731,-.850651,-0],[.525731,-.850651,-0],[.525731,.850651,0],[-.525731,.850651,0]],s=[[0,9,1],[1,10,0],[6,7,0],[10,6,0],[7,9,0],[5,1,4],[4,1,9],[5,10,1],[2,8,3],[3,11,2],[2,5,4],[4,8,2],[2,11,5],[3,7,6],[6,11,3],[8,7,3],[9,8,4],[11,10,5],[10,11,6],[8,9,7]],n=(e,r,t)=>{const o=e[0],s=e[1],n=e[2];let c=t;const f=[],l=[];for(let e=0;e<r;e++)for(let t=0;t<r-e;t++){const a=e/r,u=(e+1)/r,m=t/(r-e),h=(t+1)/(r-e),g=r-e-1?t/(r-e-1):1,p=[];p[0]=i(i(o,s,m),n,a),p[1]=i(i(o,s,h),n,a),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}if(f.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3,t<r-e-1){const m=r-e-1?(t+1)/(r-e-1):1;p[0]=i(i(o,s,h),n,a),p[1]=i(i(o,s,m),n,u),p[2]=i(i(o,s,g),n,u);for(let e=0;e<3;e++){const r=vec3.length(p[e]);for(let t=0;t<3;t++)p[e][t]/=r}f.push(p[0],p[1],p[2]),l.push([c,c+1,c+2]),c+=3}}return{points:f,triangles:l,offset:c}},i=(e,r,t)=>{const o=1-t,s=[];for(let n=0;n<3;n++)s[n]=e[n]*o+r[n]*t;return s};let c=[],f=[],l=0;for(let e=0;e<s.length;e++){const r=n([o[s[e][0]],o[s[e][1]],o[s[e][2]]],t,l);c=c.concat(r.points),f=f.concat(r.triangles),l=r.offset}let a=polyhedron({points:c,faces:f,orientation:"inward"});return 1!==r&&(a=geom3.transform(mat4.fromScaling(mat4.create(),[r,r,r]),a)),a};module.exports=geodesicSphere;
1876
1876
 
1877
1877
  },{"../geometries/geom3":164,"../maths/mat4":266,"../maths/vec3":344,"./commonChecks":491,"./polyhedron":502}],499:[function(require,module,exports){
1878
1878
  module.exports={arc:require("./arc"),circle:require("./circle"),cube:require("./cube"),cuboid:require("./cuboid"),cylinder:require("./cylinder"),cylinderElliptic:require("./cylinderElliptic"),ellipse:require("./ellipse"),ellipsoid:require("./ellipsoid"),geodesicSphere:require("./geodesicSphere"),line:require("./line"),polygon:require("./polygon"),polyhedron:require("./polyhedron"),rectangle:require("./rectangle"),roundedCuboid:require("./roundedCuboid"),roundedCylinder:require("./roundedCylinder"),roundedRectangle:require("./roundedRectangle"),sphere:require("./sphere"),square:require("./square"),star:require("./star"),torus:require("./torus"),triangle:require("./triangle")};
@@ -1887,22 +1887,22 @@ const geom2=require("../geometries/geom2"),polygon=r=>{const{points:o,paths:t}=O
1887
1887
  const geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{isNumberArray:isNumberArray}=require("./commonChecks"),polyhedron=r=>{const e={points:[],faces:[],colors:void 0,orientation:"outward"},{points:o,faces:a,colors:t,orientation:n}=Object.assign({},e,r);if(!Array.isArray(o)||!Array.isArray(a))throw new Error("points and faces must be arrays");if(o.length<3)throw new Error("three or more points are required");if(a.length<1)throw new Error("one or more faces are required");if(t){if(!Array.isArray(t))throw new Error("colors must be an array");if(t.length!==a.length)throw new Error("faces and colors must have the same length")}o.forEach((r,e)=>{if(!isNumberArray(r,3))throw new Error(`point ${e} must be an array of X, Y, Z values`)}),a.forEach((r,e)=>{if(r.length<3)throw new Error(`face ${e} must contain 3 or more indexes`);if(!isNumberArray(r,r.length))throw new Error(`face ${e} must be an array of numbers`)}),"outward"!==n&&a.forEach(r=>r.reverse());const s=a.map((r,e)=>{const a=poly3.create(r.map(r=>o[r]));return t&&t[e]&&(a.color=t[e]),a});return geom3.create(s)};module.exports=polyhedron;
1888
1888
 
1889
1889
  },{"../geometries/geom3":164,"../geometries/poly3":202,"./commonChecks":491}],503:[function(require,module,exports){
1890
- const vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isNumberArray:isNumberArray}=require("./commonChecks"),rectangle=e=>{const{center:r,size:t}=Object.assign({},{center:[0,0],size:[2,2]},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("size must be an array of X and Y values");if(!t.every(e=>e>0))throw new Error("size values must be greater than zero");const a=[t[0]/2,t[1]/2],c=[a[0],-a[1]],s=[vec2.subtract(vec2.create(),r,a),vec2.add(vec2.create(),r,c),vec2.add(vec2.create(),r,a),vec2.subtract(vec2.create(),r,c)];return geom2.fromPoints(s)};module.exports=rectangle;
1890
+ const vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isNumberArray:isNumberArray}=require("./commonChecks"),rectangle=e=>{const{center:r,size:t}=Object.assign({},{center:[0,0],size:[2,2]},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("size must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(0===t[0]||0===t[1])return geom2.create();const a=[t[0]/2,t[1]/2],c=[a[0],-a[1]],s=[vec2.subtract(vec2.create(),r,a),vec2.add(vec2.create(),r,c),vec2.add(vec2.create(),r,a),vec2.subtract(vec2.create(),r,c)];return geom2.fromPoints(s)};module.exports=rectangle;
1891
1891
 
1892
1892
  },{"../geometries/geom2":149,"../maths/vec2":313,"./commonChecks":491}],504:[function(require,module,exports){
1893
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),createCorners=(e,r,t,s,c,o)=>{const a=TAU/4*c/s,n=cos(a),i=sin(a),u=s-c;let l=t*n,h=r[2]-(t-t*i);o||(h=t-t*i-r[2]),l=l>EPS?l:0;const d=vec3.add(vec3.create(),e,[r[0]-t,r[1]-t,h]),v=vec3.add(vec3.create(),e,[t-r[0],r[1]-t,h]),m=vec3.add(vec3.create(),e,[t-r[0],t-r[1],h]),p=vec3.add(vec3.create(),e,[r[0]-t,t-r[1],h]),f=[],g=[],E=[],y=[];for(let e=0;e<=u;e++){const r=u>0?TAU/4*e/u:0,t=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(t,t,l);const s=vec3.fromVec2(vec3.create(),t);f.push(vec3.add(vec3.create(),d,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),g.push(vec3.add(vec3.create(),v,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),E.push(vec3.add(vec3.create(),m,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),y.push(vec3.add(vec3.create(),p,s))}return o?[f,g,E,y]:(f.reverse(),g.reverse(),E.reverse(),y.reverse(),[y,E,g,f])},stitchCorners=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){const c=e[s],o=r[s];for(let e=0;e<c.length-1;e++)t.push(poly3.create([c[e],c[e+1],o[e]])),e<o.length-1&&t.push(poly3.create([o[e],c[e+1],o[e+1]]))}return t},stitchWalls=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){let c=e[s],o=r[s];const a=c[c.length-1],n=o[o.length-1],i=(s+1)%e.length;c=e[i],o=r[i];const u=c[0],l=o[0];t.push(poly3.create([a,u,l,n]))}return t},stitchSides=(e,r)=>{e=(e=[e[3],e[2],e[1],e[0]]).map(e=>e.slice().reverse());const t=[];e.forEach(e=>{e.forEach(e=>t.push(e))});const s=[];r.forEach(e=>{e.forEach(e=>s.push(e))});const c=[];for(let e=0;e<s.length;e++){const r=(e+1)%s.length;c.push(poly3.create([t[e],t[r],s[r],s[e]]))}return c},roundedCuboid=e=>{let{center:r,size:t,roundRadius:s,segments:c}=Object.assign({},{center:[0,0,0],size:[2,2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(t,3))throw new Error("size must be an array of X, Y and Z values");if(!t.every(e=>e>0))throw new Error("size values must be greater than zero");if(!isGT(s,0))throw new Error("roundRadius must be greater than zero");if(!isGTE(c,4))throw new Error("segments must be four or more");if(s>(t=t.map(e=>e/2))[0]-EPS||s>t[1]-EPS||s>t[2]-EPS)throw new Error("roundRadius must be smaller then the radius of all dimensions");c=Math.floor(c/4);let o=null,a=null,n=[];for(let e=0;e<=c;e++){const i=createCorners(r,t,s,c,e,!0),u=createCorners(r,t,s,c,e,!1);if(0===e&&(n=n.concat(stitchSides(u,i))),o&&(n=n.concat(stitchCorners(o,i),stitchWalls(o,i))),a&&(n=n.concat(stitchCorners(a,u),stitchWalls(a,u))),e===c){let e=i.map(e=>e[0]);n.push(poly3.create(e)),e=u.map(e=>e[0]),n.push(poly3.create(e))}o=i,a=u}return geom3.create(n)};module.exports=roundedCuboid;
1893
+ const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cuboid=require("./cuboid"),createCorners=(e,r,t,s,c,o)=>{const a=TAU/4*c/s,n=cos(a),i=sin(a),u=s-c;let l=t*n,h=r[2]-(t-t*i);o||(h=t-t*i-r[2]),l=l>EPS?l:0;const d=vec3.add(vec3.create(),e,[r[0]-t,r[1]-t,h]),v=vec3.add(vec3.create(),e,[t-r[0],r[1]-t,h]),m=vec3.add(vec3.create(),e,[t-r[0],t-r[1],h]),p=vec3.add(vec3.create(),e,[r[0]-t,t-r[1],h]),f=[],g=[],E=[],b=[];for(let e=0;e<=u;e++){const r=u>0?TAU/4*e/u:0,t=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(t,t,l);const s=vec3.fromVec2(vec3.create(),t);f.push(vec3.add(vec3.create(),d,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),g.push(vec3.add(vec3.create(),v,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),E.push(vec3.add(vec3.create(),m,s)),vec3.rotateZ(s,s,[0,0,0],TAU/4),b.push(vec3.add(vec3.create(),p,s))}return o?[f,g,E,b]:(f.reverse(),g.reverse(),E.reverse(),b.reverse(),[b,E,g,f])},stitchCorners=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){const c=e[s],o=r[s];for(let e=0;e<c.length-1;e++)t.push(poly3.create([c[e],c[e+1],o[e]])),e<o.length-1&&t.push(poly3.create([o[e],c[e+1],o[e+1]]))}return t},stitchWalls=(e,r)=>{const t=[];for(let s=0;s<e.length;s++){let c=e[s],o=r[s];const a=c[c.length-1],n=o[o.length-1],i=(s+1)%e.length;c=e[i],o=r[i];const u=c[0],l=o[0];t.push(poly3.create([a,u,l,n]))}return t},stitchSides=(e,r)=>{e=(e=[e[3],e[2],e[1],e[0]]).map(e=>e.slice().reverse());const t=[];e.forEach(e=>{e.forEach(e=>t.push(e))});const s=[];r.forEach(e=>{e.forEach(e=>s.push(e))});const c=[];for(let e=0;e<s.length;e++){const r=(e+1)%s.length;c.push(poly3.create([t[e],t[r],s[r],s[e]]))}return c},roundedCuboid=e=>{let{center:r,size:t,roundRadius:s,segments:c}=Object.assign({},{center:[0,0,0],size:[2,2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,3))throw new Error("center must be an array of X, Y and Z values");if(!isNumberArray(t,3))throw new Error("size must be an array of X, Y and Z values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(!isGTE(s,0))throw new Error("roundRadius must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");if(0===t[0]||0===t[1]||0===t[2])return geom3.create();if(0===s)return cuboid({center:r,size:t});if(s>(t=t.map(e=>e/2))[0]-EPS||s>t[1]-EPS||s>t[2]-EPS)throw new Error("roundRadius must be smaller then the radius of all dimensions");c=Math.floor(c/4);let o=null,a=null,n=[];for(let e=0;e<=c;e++){const i=createCorners(r,t,s,c,e,!0),u=createCorners(r,t,s,c,e,!1);if(0===e&&(n=n.concat(stitchSides(u,i))),o&&(n=n.concat(stitchCorners(o,i),stitchWalls(o,i))),a&&(n=n.concat(stitchCorners(a,u),stitchWalls(a,u))),e===c){let e=i.map(e=>e[0]);n.push(poly3.create(e)),e=u.map(e=>e[0]),n.push(poly3.create(e))}o=i,a=u}return geom3.create(n)};module.exports=roundedCuboid;
1894
1894
 
1895
- },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec2":313,"../maths/vec3":344,"./commonChecks":491}],505:[function(require,module,exports){
1896
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),roundedCylinder=e=>{const{center:c,height:r,radius:s,roundRadius:a,segments:t}=Object.assign({},{center:[0,0,0],height:2,radius:1,roundRadius:.2,segments:32},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isGT(r,0))throw new Error("height must be greater then zero");if(!isGT(s,0))throw new Error("radius must be greater then zero");if(!isGT(a,0))throw new Error("roundRadius must be greater then zero");if(a>s-EPS)throw new Error("roundRadius must be smaller then the radius");if(!isGTE(t,4))throw new Error("segments must be four or more");const v=[0,0,-r/2],o=[0,0,r/2],u=vec3.subtract(vec3.create(),o,v);if(2*a>vec3.length(u)-EPS)throw new Error("height must be larger than twice roundRadius");let d;d=Math.abs(u[0])>Math.abs(u[1])?vec3.fromValues(0,1,0):vec3.fromValues(1,0,0);const i=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),u),a),n=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),i,d)),s),l=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),n,i)),s);vec3.add(v,v,i),vec3.subtract(o,o,i);const h=Math.floor(.25*t),m=e=>{const r=e.map(e=>vec3.add(e,e,c));return poly3.create(r)},p=[],b=vec3.create(),g=vec3.create();let f;for(let e=0;e<=t;e++){const c=TAU*e/t,r=vec3.add(vec3.create(),vec3.scale(b,n,cos(c)),vec3.scale(g,l,sin(c)));if(e>0){let e,c,s=[];s.push(vec3.add(vec3.create(),v,r)),s.push(vec3.add(vec3.create(),v,f)),s.push(vec3.add(vec3.create(),o,f)),s.push(vec3.add(vec3.create(),o,r)),p.push(m(s));for(let a=0;a<=h;a++){const t=TAU/4*a/h,u=cos(t),d=sin(t);if(a>0){let t;s=[],t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,f,e),vec3.scale(g,i,c))),s.push(t),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,e),vec3.scale(g,i,c))),s.push(t),a<h&&(t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,u),vec3.scale(g,i,d))),s.push(t)),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,f,u),vec3.scale(g,i,d))),s.push(t),p.push(m(s)),s=[],t=vec3.add(vec3.create(),vec3.scale(b,f,e),vec3.scale(g,i,c)),vec3.add(t,t,o),s.push(t),t=vec3.add(vec3.create(),vec3.scale(b,r,e),vec3.scale(g,i,c)),vec3.add(t,t,o),s.push(t),a<h&&(t=vec3.add(vec3.create(),vec3.scale(b,r,u),vec3.scale(g,i,d)),vec3.add(t,t,o),s.push(t)),t=vec3.add(vec3.create(),vec3.scale(b,f,u),vec3.scale(g,i,d)),vec3.add(t,t,o),s.push(t),s.reverse(),p.push(m(s))}e=u,c=d}}f=r}return geom3.create(p)};module.exports=roundedCylinder;
1895
+ },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec2":313,"../maths/vec3":344,"./commonChecks":491,"./cuboid":493}],505:[function(require,module,exports){
1896
+ const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec3=require("../maths/vec3"),geom3=require("../geometries/geom3"),poly3=require("../geometries/poly3"),{sin:sin,cos:cos}=require("../maths/utils/trigonometry"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),cylinder=require("./cylinder"),roundedCylinder=e=>{const{center:c,height:r,radius:s,roundRadius:a,segments:t}=Object.assign({},{center:[0,0,0],height:2,radius:1,roundRadius:.2,segments:32},e);if(!isNumberArray(c,3))throw new Error("center must be an array of X, Y and Z values");if(!isGTE(r,0))throw new Error("height must be positive");if(!isGTE(s,0))throw new Error("radius must be positive");if(!isGTE(a,0))throw new Error("roundRadius must be positive");if(a>s)throw new Error("roundRadius must be smaller then the radius");if(!isGTE(t,4))throw new Error("segments must be four or more");if(0===r||0===s)return geom3.create();if(0===a)return cylinder({center:c,height:r,radius:s});const v=[0,0,-r/2],o=[0,0,r/2],i=vec3.subtract(vec3.create(),o,v);if(2*a>vec3.length(i)-EPS)throw new Error("height must be larger than twice roundRadius");let u;u=Math.abs(i[0])>Math.abs(i[1])?vec3.fromValues(0,1,0):vec3.fromValues(1,0,0);const d=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),i),a),n=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),d,u)),s),l=vec3.scale(vec3.create(),vec3.normalize(vec3.create(),vec3.cross(vec3.create(),n,d)),s);vec3.add(v,v,d),vec3.subtract(o,o,d);const h=Math.floor(.25*t),m=e=>{const r=e.map(e=>vec3.add(e,e,c));return poly3.create(r)},p=[],b=vec3.create(),f=vec3.create();let g;for(let e=0;e<=t;e++){const c=TAU*e/t,r=vec3.add(vec3.create(),vec3.scale(b,n,cos(c)),vec3.scale(f,l,sin(c)));if(e>0){let e,c,s=[];s.push(vec3.add(vec3.create(),v,r)),s.push(vec3.add(vec3.create(),v,g)),s.push(vec3.add(vec3.create(),o,g)),s.push(vec3.add(vec3.create(),o,r)),p.push(m(s));for(let a=0;a<=h;a++){const t=TAU/4*a/h,i=cos(t),u=sin(t);if(a>0){let t;s=[],t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,g,e),vec3.scale(f,d,c))),s.push(t),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,e),vec3.scale(f,d,c))),s.push(t),a<h&&(t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,r,i),vec3.scale(f,d,u))),s.push(t)),t=vec3.add(vec3.create(),v,vec3.subtract(b,vec3.scale(b,g,i),vec3.scale(f,d,u))),s.push(t),p.push(m(s)),s=[],t=vec3.add(vec3.create(),vec3.scale(b,g,e),vec3.scale(f,d,c)),vec3.add(t,t,o),s.push(t),t=vec3.add(vec3.create(),vec3.scale(b,r,e),vec3.scale(f,d,c)),vec3.add(t,t,o),s.push(t),a<h&&(t=vec3.add(vec3.create(),vec3.scale(b,r,i),vec3.scale(f,d,u)),vec3.add(t,t,o),s.push(t)),t=vec3.add(vec3.create(),vec3.scale(b,g,i),vec3.scale(f,d,u)),vec3.add(t,t,o),s.push(t),s.reverse(),p.push(m(s))}e=i,c=u}}g=r}return geom3.create(p)};module.exports=roundedCylinder;
1897
1897
 
1898
- },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec3":344,"./commonChecks":491}],506:[function(require,module,exports){
1899
- const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),roundedRectangle=e=>{let{center:r,size:a,roundRadius:t,segments:s}=Object.assign({},{center:[0,0],size:[2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(a,2))throw new Error("size must be an array of X and Y values");if(!a.every(e=>e>0))throw new Error("size values must be greater than zero");if(!isGT(t,0))throw new Error("roundRadius must be greater than zero");if(!isGTE(s,4))throw new Error("segments must be four or more");if(t>(a=a.map(e=>e/2))[0]-EPS||t>a[1]-EPS)throw new Error("roundRadius must be smaller then the radius of all dimensions");const c=Math.floor(s/4),o=vec2.add(vec2.create(),r,[a[0]-t,a[1]-t]),n=vec2.add(vec2.create(),r,[t-a[0],a[1]-t]),i=vec2.add(vec2.create(),r,[t-a[0],t-a[1]]),u=vec2.add(vec2.create(),r,[a[0]-t,t-a[1]]),d=[],v=[],m=[],h=[];for(let e=0;e<=c;e++){const r=TAU/4*e/c,a=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(a,a,t),d.push(vec2.add(vec2.create(),o,a)),vec2.rotate(a,a,vec2.create(),TAU/4),v.push(vec2.add(vec2.create(),n,a)),vec2.rotate(a,a,vec2.create(),TAU/4),m.push(vec2.add(vec2.create(),i,a)),vec2.rotate(a,a,vec2.create(),TAU/4),h.push(vec2.add(vec2.create(),u,a))}return geom2.fromPoints(d.concat(v,m,h))};module.exports=roundedRectangle;
1898
+ },{"../geometries/geom3":164,"../geometries/poly3":202,"../maths/constants":217,"../maths/utils/trigonometry":295,"../maths/vec3":344,"./commonChecks":491,"./cylinder":494}],506:[function(require,module,exports){
1899
+ const{EPS:EPS,TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),rectangle=require("./rectangle"),roundedRectangle=e=>{let{center:r,size:t,roundRadius:a,segments:c}=Object.assign({},{center:[0,0],size:[2,2],roundRadius:.2,segments:32},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isNumberArray(t,2))throw new Error("size must be an array of X and Y values");if(!t.every(e=>e>=0))throw new Error("size values must be positive");if(!isGTE(a,0))throw new Error("roundRadius must be positive");if(!isGTE(c,4))throw new Error("segments must be four or more");if(0===t[0]||0===t[1])return geom2.create();if(0===a)return rectangle({center:r,size:t});if(a>(t=t.map(e=>e/2))[0]-EPS||a>t[1]-EPS)throw new Error("roundRadius must be smaller then the radius of all dimensions");const s=Math.floor(c/4),o=vec2.add(vec2.create(),r,[t[0]-a,t[1]-a]),n=vec2.add(vec2.create(),r,[a-t[0],t[1]-a]),i=vec2.add(vec2.create(),r,[a-t[0],a-t[1]]),u=vec2.add(vec2.create(),r,[t[0]-a,a-t[1]]),d=[],v=[],m=[],l=[];for(let e=0;e<=s;e++){const r=TAU/4*e/s,t=vec2.fromAngleRadians(vec2.create(),r);vec2.scale(t,t,a),d.push(vec2.add(vec2.create(),o,t)),vec2.rotate(t,t,vec2.create(),TAU/4),v.push(vec2.add(vec2.create(),n,t)),vec2.rotate(t,t,vec2.create(),TAU/4),m.push(vec2.add(vec2.create(),i,t)),vec2.rotate(t,t,vec2.create(),TAU/4),l.push(vec2.add(vec2.create(),u,t))}return geom2.fromPoints(d.concat(v,m,l))};module.exports=roundedRectangle;
1900
1900
 
1901
- },{"../geometries/geom2":149,"../maths/constants":217,"../maths/vec2":313,"./commonChecks":491}],507:[function(require,module,exports){
1902
- const ellipsoid=require("./ellipsoid"),{isGT:isGT}=require("./commonChecks"),sphere=e=>{let{center:s,radius:r,segments:i,axes:t}=Object.assign({},{center:[0,0,0],radius:1,segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isGT(r,0))throw new Error("radius must be greater than zero");return ellipsoid({center:s,radius:r=[r,r,r],segments:i,axes:t})};module.exports=sphere;
1901
+ },{"../geometries/geom2":149,"../maths/constants":217,"../maths/vec2":313,"./commonChecks":491,"./rectangle":503}],507:[function(require,module,exports){
1902
+ const ellipsoid=require("./ellipsoid"),{isGTE:isGTE}=require("./commonChecks"),sphere=e=>{let{center:s,radius:r,segments:i,axes:t}=Object.assign({},{center:[0,0,0],radius:1,segments:32,axes:[[1,0,0],[0,-1,0],[0,0,1]]},e);if(!isGTE(r,0))throw new Error("radius must be positive");return ellipsoid({center:s,radius:r=[r,r,r],segments:i,axes:t})};module.exports=sphere;
1903
1903
 
1904
1904
  },{"./commonChecks":491,"./ellipsoid":497}],508:[function(require,module,exports){
1905
- const rectangle=require("./rectangle"),{isGT:isGT}=require("./commonChecks"),square=e=>{let{center:r,size:s}=Object.assign({},{center:[0,0],size:2},e);if(!isGT(s,0))throw new Error("size must be greater than zero");return rectangle({center:r,size:s=[s,s]})};module.exports=square;
1905
+ const rectangle=require("./rectangle"),{isGTE:isGTE}=require("./commonChecks"),square=e=>{let{center:r,size:s}=Object.assign({},{center:[0,0],size:2},e);if(!isGTE(s,0))throw new Error("size must be positive");return rectangle({center:r,size:s=[s,s]})};module.exports=square;
1906
1906
 
1907
1907
  },{"./commonChecks":491,"./rectangle":503}],509:[function(require,module,exports){
1908
1908
  const{TAU:TAU}=require("../maths/constants"),vec2=require("../maths/vec2"),geom2=require("../geometries/geom2"),{isGT:isGT,isGTE:isGTE,isNumberArray:isNumberArray}=require("./commonChecks"),getRadiusRatio=(e,r)=>e>0&&r>1&&r<e/2?Math.cos(Math.PI*r/e)/Math.cos(Math.PI*(r-1)/e):0,getPoints=(e,r,t,s)=>{const o=TAU/e,i=[];for(let a=0;a<e;a++){const e=vec2.fromAngleRadians(vec2.create(),o*a+t);vec2.scale(e,e,r),vec2.add(e,s,e),i.push(e)}return i},star=e=>{let{center:r,vertices:t,outerRadius:s,innerRadius:o,density:i,startAngle:a}=Object.assign({},{center:[0,0],vertices:5,outerRadius:1,innerRadius:0,density:2,startAngle:0},e);if(!isNumberArray(r,2))throw new Error("center must be an array of X and Y values");if(!isGTE(t,2))throw new Error("vertices must be two or more");if(!isGT(s,0))throw new Error("outerRadius must be greater than zero");if(!isGTE(o,0))throw new Error("innerRadius must be greater than zero");if(!isGTE(a,0))throw new Error("startAngle must be greater than zero");if(t=Math.floor(t),i=Math.floor(i),a%=TAU,0===o){if(!isGTE(i,2))throw new Error("density must be two or more");o=s*getRadiusRatio(t,i)}const n=vec2.clone(r),u=getPoints(t,s,a,n),c=getPoints(t,o,a+Math.PI/t,n),h=[];for(let e=0;e<t;e++)h.push(u[e]),h.push(c[e]);return geom2.fromPoints(h)};module.exports=star;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jscad/core",
3
- "version": "2.6.6",
3
+ "version": "2.6.7",
4
4
  "description": "Core functionality for JSCAD Applications",
5
5
  "homepage": "https://openjscad.xyz/",
6
6
  "repository": "https://github.com/jscad/OpenJSCAD.org",
@@ -36,9 +36,9 @@
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
38
  "@jscad/array-utils": "2.1.4",
39
- "@jscad/io": "2.4.5",
40
- "@jscad/io-utils": "2.0.24",
41
- "@jscad/modeling": "2.11.1",
39
+ "@jscad/io": "2.4.6",
40
+ "@jscad/io-utils": "2.0.25",
41
+ "@jscad/modeling": "2.12.0",
42
42
  "json5": "2.2.3",
43
43
  "strip-bom": "4.0.0"
44
44
  },
@@ -53,5 +53,5 @@
53
53
  "url": "https://opencollective.com/openjscad",
54
54
  "logo": "https://opencollective.com/openjscad/logo.txt"
55
55
  },
56
- "gitHead": "4313974b50957018d2edd010e3a251f59bea46a4"
56
+ "gitHead": "e269f212db5a00cda740d2f7ad3e5206d1eb839f"
57
57
  }