@jscad/modeling 3.0.2-alpha.0 → 3.0.4-alpha.0

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 (232) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/jscad-modeling.es.js +2 -7
  3. package/dist/jscad-modeling.min.js +2 -7
  4. package/package.json +6 -7
  5. package/rollup.config.js +8 -4
  6. package/src/colors/colorize.test.js +1 -1
  7. package/src/curves/bezier/arcLengthToT.js +1 -1
  8. package/src/curves/bezier/create.js +1 -1
  9. package/src/curves/bezier/index.js +7 -7
  10. package/src/curves/bezier/length.js +1 -1
  11. package/src/curves/bezier/lengths.js +2 -1
  12. package/src/curves/bezier/tangentAt.js +1 -1
  13. package/src/curves/bezier/valueAt.js +1 -1
  14. package/src/curves/index.js +3 -3
  15. package/src/geometries/geom2/applyTransforms.js +3 -1
  16. package/src/geometries/geom2/clone.js +5 -1
  17. package/src/geometries/geom2/create.js +4 -14
  18. package/src/geometries/geom2/fromSides.js +4 -2
  19. package/src/geometries/geom2/index.d.ts +0 -2
  20. package/src/geometries/geom2/index.js +21 -7
  21. package/src/geometries/geom2/isA.js +5 -1
  22. package/src/geometries/geom2/reverse.js +4 -2
  23. package/src/geometries/geom2/toOutlines.js +2 -1
  24. package/src/geometries/geom2/toPoints.js +5 -2
  25. package/src/geometries/geom2/toSides.js +4 -3
  26. package/src/geometries/geom2/toString.js +3 -2
  27. package/src/geometries/geom2/transform.js +4 -2
  28. package/src/geometries/geom2/validate.js +6 -2
  29. package/src/geometries/geom3/applyTransforms.test.js +2 -2
  30. package/src/geometries/geom3/clone.js +5 -1
  31. package/src/geometries/geom3/clone.test.js +2 -2
  32. package/src/geometries/geom3/create.js +6 -28
  33. package/src/geometries/geom3/{fromPoints.d.ts → fromVertices.d.ts} +1 -1
  34. package/src/geometries/geom3/{fromPoints.js → fromVertices.js} +15 -2
  35. package/src/geometries/geom3/{fromPoints.test.js → fromVertices.test.js} +6 -6
  36. package/src/geometries/geom3/{fromPointsConvex.d.ts → fromVerticesConvex.d.ts} +1 -1
  37. package/src/geometries/geom3/fromVerticesConvex.js +25 -0
  38. package/src/geometries/geom3/{fromPointsConvex.test.js → fromVerticesConvex.test.js} +3 -3
  39. package/src/geometries/geom3/index.d.ts +4 -5
  40. package/src/geometries/geom3/index.js +29 -9
  41. package/src/geometries/geom3/invert.js +5 -1
  42. package/src/geometries/geom3/invert.test.js +2 -2
  43. package/src/geometries/geom3/isA.js +5 -1
  44. package/src/geometries/geom3/isA.test.js +2 -2
  45. package/src/geometries/geom3/isConvex.d.ts +3 -0
  46. package/src/geometries/geom3/isConvex.js +65 -0
  47. package/src/geometries/geom3/isConvex.test.js +44 -0
  48. package/src/geometries/geom3/toPolygons.js +4 -2
  49. package/src/geometries/geom3/toString.js +3 -2
  50. package/src/geometries/geom3/toString.test.js +2 -2
  51. package/src/geometries/geom3/{toPoints.d.ts → toVertices.d.ts} +1 -1
  52. package/src/geometries/geom3/toVertices.js +20 -0
  53. package/src/geometries/geom3/{toPoints.test.js → toVertices.test.js} +4 -4
  54. package/src/geometries/geom3/transform.js +5 -2
  55. package/src/geometries/geom3/transform.test.js +2 -2
  56. package/src/geometries/geom3/validate.js +6 -2
  57. package/src/geometries/geom3/validate.test.js +4 -4
  58. package/src/geometries/index.d.ts +1 -0
  59. package/src/geometries/index.js +10 -7
  60. package/src/geometries/path2/appendArc.js +7 -5
  61. package/src/geometries/path2/appendArc.test.js +11 -15
  62. package/src/geometries/path2/appendBezier.js +6 -4
  63. package/src/geometries/path2/appendPoints.js +4 -2
  64. package/src/geometries/path2/applyTransforms.js +3 -0
  65. package/src/geometries/path2/clone.js +5 -1
  66. package/src/geometries/path2/close.js +5 -1
  67. package/src/geometries/path2/concat.js +3 -2
  68. package/src/geometries/path2/create.js +5 -25
  69. package/src/geometries/path2/equals.js +12 -7
  70. package/src/geometries/path2/fromPoints.js +5 -3
  71. package/src/geometries/path2/index.d.ts +0 -2
  72. package/src/geometries/path2/index.js +21 -6
  73. package/src/geometries/path2/isA.js +5 -1
  74. package/src/geometries/path2/reverse.js +4 -2
  75. package/src/geometries/path2/toPoints.js +5 -3
  76. package/src/geometries/path2/toString.js +3 -2
  77. package/src/geometries/path2/transform.js +4 -2
  78. package/src/geometries/path2/validate.js +5 -1
  79. package/src/geometries/path3/applyTransforms.js +22 -0
  80. package/src/geometries/path3/applyTransforms.test.js +28 -0
  81. package/src/geometries/path3/close.d.ts +3 -0
  82. package/src/geometries/path3/close.js +33 -0
  83. package/src/geometries/path3/close.test.js +43 -0
  84. package/src/geometries/path3/concat.d.ts +3 -0
  85. package/src/geometries/path3/concat.js +35 -0
  86. package/src/geometries/path3/concat.test.js +35 -0
  87. package/src/geometries/path3/create.d.ts +4 -0
  88. package/src/geometries/path3/create.js +14 -0
  89. package/src/geometries/path3/create.test.js +8 -0
  90. package/src/geometries/path3/equals.d.ts +3 -0
  91. package/src/geometries/path3/equals.js +50 -0
  92. package/src/geometries/path3/equals.test.js +38 -0
  93. package/src/geometries/path3/fromVertices.d.ts +8 -0
  94. package/src/geometries/path3/fromVertices.js +44 -0
  95. package/src/geometries/path3/fromVertices.test.js +33 -0
  96. package/src/geometries/path3/index.d.ts +13 -0
  97. package/src/geometries/path3/index.js +37 -0
  98. package/src/geometries/path3/isA.d.ts +3 -0
  99. package/src/geometries/path3/isA.js +22 -0
  100. package/src/geometries/path3/isA.test.js +19 -0
  101. package/src/geometries/path3/reverse.d.ts +3 -0
  102. package/src/geometries/path3/reverse.js +18 -0
  103. package/src/geometries/path3/reverse.test.js +9 -0
  104. package/src/geometries/path3/toString.d.ts +3 -0
  105. package/src/geometries/path3/toString.js +23 -0
  106. package/src/geometries/path3/toVertices.d.ts +4 -0
  107. package/src/geometries/path3/toVertices.js +15 -0
  108. package/src/geometries/path3/toVertices.test.js +13 -0
  109. package/src/geometries/path3/transform.d.ts +4 -0
  110. package/src/geometries/path3/transform.js +20 -0
  111. package/src/geometries/path3/transform.test.js +50 -0
  112. package/src/geometries/path3/type.d.ts +10 -0
  113. package/src/geometries/path3/validate.d.ts +1 -0
  114. package/src/geometries/path3/validate.js +44 -0
  115. package/src/geometries/poly2/arePointsInside.js +4 -1
  116. package/src/geometries/poly2/clone.js +4 -1
  117. package/src/geometries/poly2/create.js +3 -15
  118. package/src/geometries/poly2/index.js +16 -4
  119. package/src/geometries/poly2/isA.js +5 -1
  120. package/src/geometries/poly2/isConvex.js +5 -1
  121. package/src/geometries/poly2/isSimple.js +5 -1
  122. package/src/geometries/poly2/measureArea.js +4 -1
  123. package/src/geometries/poly2/measureBoundingBox.js +6 -1
  124. package/src/geometries/poly2/reverse.js +4 -1
  125. package/src/geometries/poly2/toPoints.js +6 -1
  126. package/src/geometries/poly2/toString.js +5 -1
  127. package/src/geometries/poly2/transform.js +5 -1
  128. package/src/geometries/poly2/validate.js +6 -2
  129. package/src/geometries/poly3/clone.js +4 -1
  130. package/src/geometries/poly3/create.js +4 -17
  131. package/src/geometries/poly3/fromVerticesAndPlane.js +3 -1
  132. package/src/geometries/poly3/index.js +19 -4
  133. package/src/geometries/poly3/invert.js +4 -1
  134. package/src/geometries/poly3/isA.js +5 -1
  135. package/src/geometries/poly3/isConvex.js +5 -1
  136. package/src/geometries/poly3/measureArea.js +5 -1
  137. package/src/geometries/poly3/measureBoundingBox.js +4 -1
  138. package/src/geometries/poly3/measureBoundingSphere.js +4 -3
  139. package/src/geometries/poly3/measureSignedVolume.js +6 -1
  140. package/src/geometries/poly3/plane.js +6 -0
  141. package/src/geometries/poly3/toString.js +5 -1
  142. package/src/geometries/poly3/toVertices.js +6 -1
  143. package/src/geometries/poly3/transform.js +5 -1
  144. package/src/geometries/poly3/validate.js +6 -2
  145. package/src/geometries/slice/calculatePlane.js +3 -3
  146. package/src/geometries/slice/clone.js +4 -1
  147. package/src/geometries/slice/create.js +5 -10
  148. package/src/geometries/slice/equals.js +5 -1
  149. package/src/geometries/slice/fromGeom2.js +1 -1
  150. package/src/geometries/slice/fromVertices.js +3 -3
  151. package/src/geometries/slice/index.js +19 -4
  152. package/src/geometries/slice/isA.js +5 -1
  153. package/src/geometries/slice/reverse.js +5 -2
  154. package/src/geometries/slice/toEdges.js +5 -3
  155. package/src/geometries/slice/toPolygons.js +5 -1
  156. package/src/geometries/slice/toString.js +5 -1
  157. package/src/geometries/slice/toVertices.js +5 -3
  158. package/src/geometries/slice/transform.js +4 -3
  159. package/src/geometries/slice/validate.js +3 -2
  160. package/src/index.d.ts +1 -0
  161. package/src/index.js +4 -0
  162. package/src/maths/constants.js +11 -7
  163. package/src/maths/index.js +2 -1
  164. package/src/maths/mat4/isOnlyTransformScale.js +1 -1
  165. package/src/operations/booleans/index.js +2 -0
  166. package/src/operations/booleans/intersect.js +0 -1
  167. package/src/operations/booleans/intersectGeom3.test.js +4 -4
  168. package/src/operations/booleans/scission.js +0 -1
  169. package/src/operations/booleans/subtractGeom3.test.js +4 -4
  170. package/src/operations/booleans/trees/splitLineSegmentByPlane.js +1 -4
  171. package/src/operations/booleans/trees/splitPolygonByPlane.test.js +138 -0
  172. package/src/operations/booleans/unionGeom3.test.js +40 -5
  173. package/src/operations/extrusions/extrudeFromSlices.js +15 -5
  174. package/src/operations/extrusions/extrudeFromSlices.test.js +6 -6
  175. package/src/operations/extrusions/extrudeLinear.test.js +8 -8
  176. package/src/operations/extrusions/extrudeRotate.js +2 -1
  177. package/src/operations/extrusions/extrudeRotate.test.js +46 -12
  178. package/src/operations/extrusions/extrudeWalls.test.js +60 -0
  179. package/src/operations/hulls/hull.test.js +5 -5
  180. package/src/operations/hulls/hullChain.test.js +5 -5
  181. package/src/operations/hulls/toUniquePoints.js +2 -2
  182. package/src/operations/minkowski/index.d.ts +1 -0
  183. package/src/operations/minkowski/index.js +15 -0
  184. package/src/operations/minkowski/minkowskiSum.d.ts +4 -0
  185. package/src/operations/minkowski/minkowskiSum.js +223 -0
  186. package/src/operations/minkowski/minkowskiSum.test.js +199 -0
  187. package/src/operations/modifiers/generalize.test.js +6 -6
  188. package/src/operations/modifiers/insertTjunctions.test.js +2 -2
  189. package/src/operations/modifiers/reTesselateCoplanarPolygons.js +10 -3
  190. package/src/operations/modifiers/reTesselateCoplanarPolygons.test.js +36 -1
  191. package/src/operations/modifiers/retessellate.js +4 -2
  192. package/src/operations/modifiers/retessellate.test.js +10 -10
  193. package/src/operations/modifiers/snap.test.js +28 -19
  194. package/src/operations/offsets/offsetGeom3.test.js +9 -11
  195. package/src/operations/transforms/center.test.js +7 -7
  196. package/src/operations/transforms/mirror.test.js +7 -7
  197. package/src/operations/transforms/rotate.test.js +7 -7
  198. package/src/operations/transforms/scale.test.js +7 -7
  199. package/src/operations/transforms/transform.test.js +2 -2
  200. package/src/operations/transforms/translate.test.js +7 -7
  201. package/src/primitives/arc.js +2 -2
  202. package/src/primitives/arc.test.js +104 -113
  203. package/src/primitives/cube.test.js +4 -4
  204. package/src/primitives/cuboid.test.js +4 -4
  205. package/src/primitives/cylinder.test.js +5 -5
  206. package/src/primitives/cylinderElliptic.test.js +9 -9
  207. package/src/primitives/ellipsoid.test.js +5 -5
  208. package/src/primitives/geodesicSphere.test.js +4 -4
  209. package/src/primitives/polyhedron.test.js +2 -2
  210. package/src/primitives/roundedCuboid.test.js +7 -7
  211. package/src/primitives/roundedCylinder.test.js +9 -9
  212. package/src/primitives/sphere.test.js +5 -5
  213. package/src/primitives/torus.test.js +4 -4
  214. package/src/utils/flatten.js +1 -1
  215. package/src/utils/flatten.test.js +94 -0
  216. package/src/geometries/geom2/fromCompactBinary.d.ts +0 -3
  217. package/src/geometries/geom2/fromCompactBinary.js +0 -40
  218. package/src/geometries/geom2/fromToCompactBinary.test.js +0 -100
  219. package/src/geometries/geom2/toCompactBinary.d.ts +0 -3
  220. package/src/geometries/geom2/toCompactBinary.js +0 -56
  221. package/src/geometries/geom3/fromCompactBinary.d.ts +0 -3
  222. package/src/geometries/geom3/fromCompactBinary.js +0 -42
  223. package/src/geometries/geom3/fromPointsConvex.js +0 -25
  224. package/src/geometries/geom3/fromToCompactBinary.test.js +0 -139
  225. package/src/geometries/geom3/toCompactBinary.d.ts +0 -3
  226. package/src/geometries/geom3/toCompactBinary.js +0 -66
  227. package/src/geometries/geom3/toPoints.js +0 -15
  228. package/src/geometries/path2/fromCompactBinary.d.ts +0 -3
  229. package/src/geometries/path2/fromCompactBinary.js +0 -31
  230. package/src/geometries/path2/fromToCompactBinary.test.js +0 -114
  231. package/src/geometries/path2/toCompactBinary.d.ts +0 -3
  232. package/src/geometries/path2/toCompactBinary.js +0 -50
@@ -1,100 +0,0 @@
1
- import test from 'ava'
2
-
3
- import { fromCompactBinary, toCompactBinary, create } from './index.js'
4
-
5
- test('toCompactBinary: converts geom2 into a compact form', (t) => {
6
- const geometry1 = create()
7
- const compacted1 = toCompactBinary(geometry1)
8
- const expected1 = new Float32Array([
9
- 0, // type flag
10
- 1, 0, 0, 0, // transforms
11
- 0, 1, 0, 0,
12
- 0, 0, 1, 0,
13
- 0, 0, 0, 1,
14
- -1, -1, -1, -1 // color
15
- ])
16
- t.deepEqual(compacted1, expected1)
17
-
18
- // geometry with a hole
19
- const geometry2 = create([
20
- [[10, 10], [-10, -10], [10, -10]],
21
- [[5, -5], [6, -4], [6, -5]]
22
- ])
23
- const compacted2 = toCompactBinary(geometry2)
24
- const expected2 = new Float32Array([
25
- 0, // type flag
26
- 1, 0, 0, 0, // transforms
27
- 0, 1, 0, 0,
28
- 0, 0, 1, 0,
29
- 0, 0, 0, 1,
30
- -1, -1, -1, -1, // color
31
- 3, 10, 10, -10, -10, 10, -10, // poly1
32
- 3, 5, -5, 6, -4, 6, -5 // poly2
33
- ])
34
- t.deepEqual(compacted2, expected2)
35
-
36
- // test color as well
37
- geometry2.color = [1, 2, 3, 4]
38
- const compacted3 = toCompactBinary(geometry2)
39
- const expected3 = new Float32Array([
40
- 0, // type flag
41
- 1, 0, 0, 0, // transforms
42
- 0, 1, 0, 0,
43
- 0, 0, 1, 0,
44
- 0, 0, 0, 1,
45
- 1, 2, 3, 4, // color
46
- 3, 10, 10, -10, -10, 10, -10, // poly1
47
- 3, 5, -5, 6, -4, 6, -5 // poly2
48
- ])
49
- t.deepEqual(compacted3, expected3)
50
- })
51
-
52
- test('fromCompactBinary: convert a compact form into a geom2', (t) => {
53
- const compacted1 = [
54
- 0, // type flag
55
- 1, 0, 0, 0, // transforms
56
- 0, 1, 0, 0,
57
- 0, 0, 1, 0,
58
- 0, 0, 0, 1,
59
- -1, -1, -1, -1 // color
60
- ]
61
- const expected1 = create()
62
- const geometry1 = fromCompactBinary(compacted1)
63
-
64
- t.deepEqual(geometry1, expected1)
65
-
66
- // geometry with a hole
67
- const compacted2 = [
68
- 0, // type flag
69
- 1, 0, 0, 0, // transforms
70
- 0, 1, 0, 0,
71
- 0, 0, 1, 0,
72
- 0, 0, 0, 1,
73
- -1, -1, -1, -1, // color
74
- 3, 10, 10, -10, -10, 10, -10, // poly1
75
- 3, 5, -5, 6, -5, 6, -4 // poly2
76
- ]
77
- const expected2 = create([
78
- [[10, 10], [-10, -10], [10, -10]],
79
- [[5, -5], [6, -5], [6, -4]]
80
- ])
81
- const geometry2 = fromCompactBinary(compacted2)
82
-
83
- t.deepEqual(geometry2, expected2)
84
-
85
- // test color as well
86
- const compacted3 = [
87
- 0, // type flag
88
- 1, 0, 0, 0, // transforms
89
- 0, 1, 0, 0,
90
- 0, 0, 1, 0,
91
- 0, 0, 0, 1,
92
- 4, 5, 6, 7, // color
93
- 3, 10, 10, -10, -10, 10, -10, // poly1
94
- 3, 5, -5, 6, -5, 6, -4 // poly2
95
- ]
96
- expected2.color = [4, 5, 6, 7]
97
- const geometry3 = fromCompactBinary(compacted3)
98
-
99
- t.deepEqual(geometry3, expected2)
100
- })
@@ -1,3 +0,0 @@
1
- import type { Geom2 } from './type.d.ts'
2
-
3
- export function toCompactBinary(geom: Geom2): Float32Array
@@ -1,56 +0,0 @@
1
- /**
2
- * Produces a compact binary representation from the given geometry.
3
- * @param {Geom2} geometry - the geometry
4
- * @returns {TypedArray} compact binary representation
5
- * @alias module:modeling/geometries/geom2.toCompactBinary
6
- */
7
- export const toCompactBinary = (geometry) => {
8
- const transforms = geometry.transforms
9
- let color = [-1, -1, -1, -1]
10
- if (geometry.color) color = geometry.color
11
-
12
- // Compute array size
13
- let size = 21
14
- geometry.outlines.forEach((outline) => {
15
- size += 2 * outline.length + 1
16
- })
17
-
18
- // FIXME why Float32Array?
19
- const compacted = new Float32Array(size) // type + transforms + color + points
20
-
21
- compacted[0] = 0 // type code: 0 => geom2, 1 => geom3 , 2 => path2
22
-
23
- compacted[1] = transforms[0]
24
- compacted[2] = transforms[1]
25
- compacted[3] = transforms[2]
26
- compacted[4] = transforms[3]
27
- compacted[5] = transforms[4]
28
- compacted[6] = transforms[5]
29
- compacted[7] = transforms[6]
30
- compacted[8] = transforms[7]
31
- compacted[9] = transforms[8]
32
- compacted[10] = transforms[9]
33
- compacted[11] = transforms[10]
34
- compacted[12] = transforms[11]
35
- compacted[13] = transforms[12]
36
- compacted[14] = transforms[13]
37
- compacted[15] = transforms[14]
38
- compacted[16] = transforms[15]
39
-
40
- compacted[17] = color[0]
41
- compacted[18] = color[1]
42
- compacted[19] = color[2]
43
- compacted[20] = color[3]
44
-
45
- let index = 21
46
- geometry.outlines.forEach((outline) => {
47
- compacted[index++] = outline.length
48
- outline.forEach((point) => {
49
- compacted[index++] = point[0]
50
- compacted[index++] = point[1]
51
- })
52
- })
53
-
54
- // TODO: how about custom properties or fields ?
55
- return compacted
56
- }
@@ -1,3 +0,0 @@
1
- import type { Geom3 } from './type.d.ts'
2
-
3
- export function fromCompactBinary(data: Array<number> | Float32Array | Float64Array): Geom3
@@ -1,42 +0,0 @@
1
- import * as vec3 from '../../maths/vec3/index.js'
2
- import * as mat4 from '../../maths/mat4/index.js'
3
-
4
- import * as poly3 from '../poly3/index.js'
5
-
6
- import { create } from './create.js'
7
-
8
- /**
9
- * Construct a new 3D geometry from the given compact binary data.
10
- * @param {TypedArray} data - compact binary data
11
- * @returns {Geom3} a new geometry
12
- * @alias module:modeling/geometries/geom3.fromCompactBinary
13
- */
14
- export const fromCompactBinary = (data) => {
15
- if (data[0] !== 1) throw new Error('invalid compact binary data')
16
-
17
- const created = create()
18
-
19
- created.transforms = mat4.clone(data.slice(1, 17))
20
-
21
- const numberOfVertices = data[21]
22
- let ci = 22
23
- let vi = data.length - (numberOfVertices * 3)
24
- while (vi < data.length) {
25
- const verticesPerPolygon = data[ci]
26
- ci++
27
-
28
- const vertices = []
29
- for (let i = 0; i < verticesPerPolygon; i++) {
30
- vertices.push(vec3.fromValues(data[vi], data[vi + 1], data[vi + 2]))
31
- vi += 3
32
- }
33
- created.polygons.push(poly3.create(vertices))
34
- }
35
-
36
- // transfer known properties, i.e. color
37
- if (data[17] >= 0) {
38
- created.color = [data[17], data[18], data[19], data[20]]
39
- }
40
- // TODO: how about custom properties or fields ?
41
- return created
42
- }
@@ -1,25 +0,0 @@
1
- import { runner } from '../../operations/hulls/quickhull/index.js'
2
- import { create } from './create.js'
3
- import * as poly3 from '../poly3/index.js'
4
-
5
- /**
6
- * Construct a new convex 3D geometry from a list of unique points.
7
- *
8
- * @param {Array} uniquePoints - list of points to construct convex 3D geometry
9
- * @returns {geom3} a new geometry
10
- * @alias module:modeling/geometries/geom3.fromPointsConvex
11
- */
12
- export const fromPointsConvex = (uniquePoints) => {
13
- if (!Array.isArray(uniquePoints)) {
14
- throw new Error('the given points must be an array')
15
- }
16
-
17
- const faces = runner(uniquePoints, { skipTriangulation: true })
18
-
19
- const polygons = faces.map((face) => {
20
- const vertices = face.map((index) => uniquePoints[index])
21
- return poly3.create(vertices)
22
- })
23
-
24
- return create(polygons)
25
- }
@@ -1,139 +0,0 @@
1
- import test from 'ava'
2
-
3
- import { fromCompactBinary, toCompactBinary, create, fromPoints } from './index.js'
4
-
5
- test('toCompactBinary: converts geom3 (default)', (t) => {
6
- const geometry = create()
7
- const compacted = toCompactBinary(geometry)
8
- const expected = new Float32Array(
9
- [
10
- 1, // type
11
- 1, 0, 0, 0, // transforms
12
- 0, 1, 0, 0,
13
- 0, 0, 1, 0,
14
- 0, 0, 0, 1,
15
- -1, -1, -1, -1, // color
16
- 0 // number of vertices
17
- ]
18
- )
19
- t.deepEqual(compacted, expected)
20
- })
21
-
22
- test('toCompactBinary: converts geom3 into a compact form', (t) => {
23
- // two polygons; 3 vertices, 4 vertices
24
- const vertices = [[[0, 0, 0], [1, 0, 0], [2, 0, 2]], [[0, 0, 0], [1, 0, 0], [2, 0, 2], [-3, 0, 3]]]
25
- const geometry = fromPoints(vertices)
26
- const compacted = toCompactBinary(geometry)
27
- const expected = new Float32Array(
28
- [
29
- 1, // type
30
- 1, 0, 0, 0, // transforms
31
- 0, 1, 0, 0,
32
- 0, 0, 1, 0,
33
- 0, 0, 0, 1,
34
- -1, -1, -1, -1, // color
35
- 7, // number of vertices
36
- 3, // number of vertices per polygon (2)
37
- 4,
38
- 0, 0, 0, // vertices (7)
39
- 1, 0, 0,
40
- 2, 0, 2,
41
- 0, 0, 0,
42
- 1, 0, 0,
43
- 2, 0, 2,
44
- -3, 0, 3
45
- ]
46
- )
47
-
48
- t.deepEqual(compacted, expected)
49
-
50
- // test color as well
51
- geometry.color = [1, 2, 3, 4]
52
- const compacted2 = toCompactBinary(geometry)
53
- const expected2 = new Float32Array(
54
- [
55
- 1, // type
56
- 1, 0, 0, 0, // transforms
57
- 0, 1, 0, 0,
58
- 0, 0, 1, 0,
59
- 0, 0, 0, 1,
60
- 1, 2, 3, 4, // color
61
- 7, // number of vertices
62
- 3, // number of vertices per polygon (2)
63
- 4,
64
- 0, 0, 0, // vertices (7)
65
- 1, 0, 0,
66
- 2, 0, 2,
67
- 0, 0, 0,
68
- 1, 0, 0,
69
- 2, 0, 2,
70
- -3, 0, 3
71
- ]
72
- )
73
-
74
- t.deepEqual(compacted2, expected2)
75
- })
76
-
77
- test('fromCompactBinary: convert a compact form into a geom3', (t) => {
78
- const compactedDefault = [
79
- 1, // type
80
- 1, 0, 0, 0, // transforms
81
- 0, 1, 0, 0,
82
- 0, 0, 1, 0,
83
- 0, 0, 0, 1,
84
- -1, -1, -1, -1, // color
85
- 0 // number of vertices
86
- ]
87
- let expected = create()
88
- let geometry = fromCompactBinary(compactedDefault)
89
-
90
- t.deepEqual(geometry, expected)
91
-
92
- const compacted1 = [
93
- 1, // type
94
- 1, 0, 0, 0, // transforms
95
- 0, 1, 0, 0,
96
- 0, 0, 1, 0,
97
- 0, 0, 0, 1,
98
- -1, -1, -1, -1, // color
99
- 7, // number of vertices
100
- 3, // number of vertices per polygon (2)
101
- 4,
102
- 0, 0, 0, // vertices (7)
103
- 1, 0, 0,
104
- 2, 0, 2,
105
- 0, 0, 0,
106
- 1, 0, 0,
107
- 2, 0, 2,
108
- -3, 0, 3
109
- ]
110
- const vertices = [[[0, 0, 0], [1, 0, 0], [2, 0, 2]], [[0, 0, 0], [1, 0, 0], [2, 0, 2], [-3, 0, 3]]]
111
- expected = fromPoints(vertices)
112
- geometry = fromCompactBinary(compacted1)
113
-
114
- t.deepEqual(geometry, expected)
115
-
116
- // test color as well
117
- const compacted2 = [
118
- 1, // type
119
- 1, 0, 0, 0, // transforms
120
- 0, 1, 0, 0,
121
- 0, 0, 1, 0,
122
- 0, 0, 0, 1,
123
- 4, 5, 6, 7, // color
124
- 7, // number of vertices
125
- 3, // number of vertices per polygon (2)
126
- 4,
127
- 0, 0, 0, // vertices (7)
128
- 1, 0, 0,
129
- 2, 0, 2,
130
- 0, 0, 0,
131
- 1, 0, 0,
132
- 2, 0, 2,
133
- -3, 0, 3
134
- ]
135
- expected.color = [4, 5, 6, 7]
136
- geometry = fromCompactBinary(compacted2)
137
-
138
- t.deepEqual(geometry, expected)
139
- })
@@ -1,3 +0,0 @@
1
- import type { Geom3 } from './type.d.ts'
2
-
3
- export function toCompactBinary(geom: Geom3): Float32Array
@@ -1,66 +0,0 @@
1
- import * as poly3 from '../poly3/index.js'
2
-
3
- /**
4
- * Return the given geometry in compact binary representation.
5
- * @param {Geom3} geometry - the geometry
6
- * @return {TypedArray} compact binary representation
7
- * @alias module:modeling/geometries/geom3.toCompactBinary
8
- */
9
- export const toCompactBinary = (geometry) => {
10
- const polygons = geometry.polygons
11
- const transforms = geometry.transforms
12
-
13
- const numberOfPolygons = polygons.length
14
- const numberOfVertices = polygons.reduce((count, polygon) => count + polygon.vertices.length, 0)
15
- let color = [-1, -1, -1, -1]
16
- if (geometry.color) color = geometry.color
17
-
18
- // FIXME why Float32Array?
19
- const compacted = new Float32Array(1 + 16 + 4 + 1 + numberOfPolygons + (numberOfVertices * 3))
20
- // type + transforms + color + numberOfPolygons + numberOfVerticesPerPolygon[] + vertices data[]
21
-
22
- compacted[0] = 1 // type code: 0 => geom2, 1 => geom3 , 2 => path2
23
-
24
- compacted[1] = transforms[0]
25
- compacted[2] = transforms[1]
26
- compacted[3] = transforms[2]
27
- compacted[4] = transforms[3]
28
- compacted[5] = transforms[4]
29
- compacted[6] = transforms[5]
30
- compacted[7] = transforms[6]
31
- compacted[8] = transforms[7]
32
- compacted[9] = transforms[8]
33
- compacted[10] = transforms[9]
34
- compacted[11] = transforms[10]
35
- compacted[12] = transforms[11]
36
- compacted[13] = transforms[12]
37
- compacted[14] = transforms[13]
38
- compacted[15] = transforms[14]
39
- compacted[16] = transforms[15]
40
-
41
- compacted[17] = color[0]
42
- compacted[18] = color[1]
43
- compacted[19] = color[2]
44
- compacted[20] = color[3]
45
-
46
- compacted[21] = numberOfVertices
47
-
48
- let ci = 22
49
- let vi = ci + numberOfPolygons
50
- polygons.forEach((polygon) => {
51
- const vertices = poly3.toVertices(polygon)
52
- // record the number of vertices per polygon
53
- compacted[ci] = vertices.length
54
- ci++
55
- // convert the vertices
56
- for (let i = 0; i < vertices.length; i++) {
57
- const vertex = vertices[i]
58
- compacted[vi + 0] = vertex[0]
59
- compacted[vi + 1] = vertex[1]
60
- compacted[vi + 2] = vertex[2]
61
- vi += 3
62
- }
63
- })
64
- // TODO: how about custom properties or fields ?
65
- return compacted
66
- }
@@ -1,15 +0,0 @@
1
- import * as poly3 from '../poly3/index.js'
2
-
3
- import { toPolygons } from './toPolygons.js'
4
-
5
- /**
6
- * Return the given geometry as a list of points, after applying transforms.
7
- * The returned array should not be modified as the points are shared with the geometry.
8
- * @param {Geom3} geometry - the geometry
9
- * @return {Array} list of points, where each sub-array represents a polygon
10
- * @alias module:modeling/geometries/geom3.toPoints
11
- */
12
- export const toPoints = (geometry) => {
13
- const polygons = toPolygons(geometry)
14
- return polygons.map((polygon) => poly3.toVertices(polygon))
15
- }
@@ -1,3 +0,0 @@
1
- import type { Path2 } from './type.d.ts'
2
-
3
- export function fromCompactBinary(data: Array<number> | Float32Array | Float64Array): Path2
@@ -1,31 +0,0 @@
1
- import * as mat4 from '../../maths/mat4/index.js'
2
- import * as vec2 from '../../maths/vec2/index.js'
3
-
4
- import { create } from './create.js'
5
-
6
- /**
7
- * Create a new path from the given compact binary data.
8
- * @param {TypedArray} data - compact binary data
9
- * @returns {Path2} a new path
10
- * @alias module:modeling/geometries/path2.fromCompactBinary
11
- */
12
- export const fromCompactBinary = (data) => {
13
- if (data[0] !== 2) throw new Error('invalid compact binary data')
14
-
15
- const created = create()
16
-
17
- created.transforms = mat4.clone(data.slice(1, 17))
18
-
19
- created.isClosed = !!data[17]
20
-
21
- for (let i = 22; i < data.length; i += 2) {
22
- const point = vec2.fromValues(data[i], data[i + 1])
23
- created.points.push(point)
24
- }
25
- // transfer known properties, i.e. color
26
- if (data[18] >= 0) {
27
- created.color = [data[18], data[19], data[20], data[21]]
28
- }
29
- // TODO: how about custom properties or fields ?
30
- return created
31
- }
@@ -1,114 +0,0 @@
1
- import test from 'ava'
2
-
3
- import { fromCompactBinary, toCompactBinary, create, fromPoints } from './index.js'
4
-
5
- test('toCompactBinary: converts path2 into a compact form', (t) => {
6
- const geometry1 = create()
7
- const compacted1 = toCompactBinary(geometry1)
8
- const expected1 = new Float32Array(
9
- [
10
- 2, // type
11
- 1, 0, 0, 0, // transforms
12
- 0, 1, 0, 0,
13
- 0, 0, 1, 0,
14
- 0, 0, 0, 1,
15
- 0, // isClosed
16
- -1, -1, -1, -1 // color
17
- ]
18
- )
19
-
20
- t.deepEqual(compacted1, expected1)
21
-
22
- const points = [[0, 0], [1, 0], [0, 1]]
23
- const geometry2 = fromPoints({ closed: true }, points)
24
- const compacted2 = toCompactBinary(geometry2)
25
- const expected2 = new Float32Array(
26
- [
27
- 2, // type
28
- 1, 0, 0, 0, // transforms
29
- 0, 1, 0, 0,
30
- 0, 0, 1, 0,
31
- 0, 0, 0, 1,
32
- 1, // closed/open flag
33
- -1, -1, -1, -1, // color
34
- 0, 0, // points
35
- 1, 0,
36
- 0, 1
37
- ]
38
- )
39
-
40
- t.deepEqual(compacted2, expected2)
41
-
42
- // test color as well
43
- geometry2.color = [1, 2, 3, 4]
44
- const compacted3 = toCompactBinary(geometry2)
45
- const expected3 = new Float32Array(
46
- [
47
- 2, // type
48
- 1, 0, 0, 0, // transforms
49
- 0, 1, 0, 0,
50
- 0, 0, 1, 0,
51
- 0, 0, 0, 1,
52
- 1, // closed/open flag
53
- 1, 2, 3, 4, // color
54
- 0, 0, // points
55
- 1, 0,
56
- 0, 1
57
- ]
58
- )
59
-
60
- t.deepEqual(compacted3, expected3)
61
- })
62
-
63
- test('fromCompactBinary: convert a compact form into a path2', (t) => {
64
- const compacted1 = [
65
- 2, // type
66
- 1, 0, 0, 0, // transforms
67
- 0, 1, 0, 0,
68
- 0, 0, 1, 0,
69
- 0, 0, 0, 1,
70
- 0, // isClosed
71
- -1, -1, -1, -1 // color
72
- ]
73
- const expected1 = create()
74
- const geometry1 = fromCompactBinary(compacted1)
75
-
76
- t.deepEqual(geometry1, expected1)
77
-
78
- const compacted2 = [
79
- 2, // type
80
- 1, 0, 0, 0, // transforms
81
- 0, 1, 0, 0,
82
- 0, 0, 1, 0,
83
- 0, 0, 0, 1,
84
- 1, // closed/open flag
85
- -1, -1, -1, -1, // color
86
- 0, 0, // points
87
- 1, 0,
88
- 0, 1
89
- ]
90
- const points = [[0, 0], [1, 0], [0, 1]]
91
- const expected2 = fromPoints({ closed: true }, points)
92
- const geometry2 = fromCompactBinary(compacted2)
93
-
94
- t.deepEqual(geometry2, expected2)
95
-
96
- // test color as well
97
- const compacted3 = [
98
- 2, // type
99
- 1, 0, 0, 0, // transforms
100
- 0, 1, 0, 0,
101
- 0, 0, 1, 0,
102
- 0, 0, 0, 1,
103
- 1, // closed/open flag
104
- 5, 6, 7, 8, // color
105
- 0, 0, // points
106
- 1, 0,
107
- 0, 1
108
- ]
109
- const expected3 = fromPoints({ closed: true }, points)
110
- expected3.color = [5, 6, 7, 8]
111
- const geometry3 = fromCompactBinary(compacted3)
112
-
113
- t.deepEqual(geometry3, expected3)
114
- })
@@ -1,3 +0,0 @@
1
- import type { Path2 } from './type.d.ts'
2
-
3
- export function toCompactBinary(geometry: Path2): Float32Array
@@ -1,50 +0,0 @@
1
- /**
2
- * Produce a compact binary representation from the given path.
3
- * @param {Path2} geometry - the path geometry
4
- * @returns {TypedArray} compact binary representation
5
- * @alias module:modeling/geometries/path2.toCompactBinary
6
- */
7
- export const toCompactBinary = (geometry) => {
8
- const points = geometry.points
9
- const transforms = geometry.transforms
10
- let color = [-1, -1, -1, -1]
11
- if (geometry.color) color = geometry.color
12
-
13
- // FIXME why Float32Array?
14
- const compacted = new Float32Array(1 + 16 + 1 + 4 + (points.length * 2)) // type + transforms + isClosed + color + points data
15
-
16
- compacted[0] = 2 // type code: 0 => geom2, 1 => geom3 , 2 => path2
17
-
18
- compacted[1] = transforms[0]
19
- compacted[2] = transforms[1]
20
- compacted[3] = transforms[2]
21
- compacted[4] = transforms[3]
22
- compacted[5] = transforms[4]
23
- compacted[6] = transforms[5]
24
- compacted[7] = transforms[6]
25
- compacted[8] = transforms[7]
26
- compacted[9] = transforms[8]
27
- compacted[10] = transforms[9]
28
- compacted[11] = transforms[10]
29
- compacted[12] = transforms[11]
30
- compacted[13] = transforms[12]
31
- compacted[14] = transforms[13]
32
- compacted[15] = transforms[14]
33
- compacted[16] = transforms[15]
34
-
35
- compacted[17] = geometry.isClosed ? 1 : 0
36
-
37
- compacted[18] = color[0]
38
- compacted[19] = color[1]
39
- compacted[20] = color[2]
40
- compacted[21] = color[3]
41
-
42
- for (let j = 0; j < points.length; j++) {
43
- const ci = j * 2 + 22
44
- const point = points[j]
45
- compacted[ci] = point[0]
46
- compacted[ci + 1] = point[1]
47
- }
48
- // TODO: how about custom properties or fields ?
49
- return compacted
50
- }