@jscad/x3d-deserializer 3.0.0-alpha.0 → 3.0.2-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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jscad/x3d-deserializer",
3
- "version": "3.0.0-alpha.0",
3
+ "version": "3.0.2-alpha.0",
4
4
  "description": "X3D Deserializer for JSCAD",
5
5
  "homepage": "https://openjscad.xyz/",
6
6
  "repository": "https://github.com/jscad/OpenJSCAD.org/",
@@ -32,8 +32,9 @@
32
32
  "access": "public"
33
33
  },
34
34
  "dependencies": {
35
- "@jscad/array-utils": "3.0.0-alpha.0",
36
- "@jscad/modeling": "3.0.0-alpha.0",
35
+ "@jscad/array-utils": "3.0.1-alpha.0",
36
+ "@jscad/io-utils": "3.0.2-alpha.0",
37
+ "@jscad/modeling": "3.0.2-alpha.0",
37
38
  "saxes": "^6.0.0"
38
39
  },
39
40
  "devDependencies": {
@@ -46,5 +47,5 @@
46
47
  "rollup-plugin-banner": "^0.2.1",
47
48
  "rollup-plugin-version-injector": "^1.3.3"
48
49
  },
49
- "gitHead": "3656d36ed9cd738ab884e86aae5a2ce08d52adf7"
50
+ "gitHead": "ac80d1a7cb0a8efb21aff9193d4a8bccb6e31f1c"
50
51
  }
package/rollup.config.js CHANGED
@@ -24,6 +24,6 @@ export default {
24
24
  nodeResolve(),
25
25
  banner('<%= pkg.description %>\n@module <%= pkg.name %>\n@version <%= pkg.version %>\n@license <%= pkg.license %>'),
26
26
  versionInjector({ injectInComments: { fileRegexp: /\.(html)$/ }, logLevel: 'warn' }),
27
- terser({ compress: { module: true }, mangle: false, format: { comments: 'some'} })
27
+ terser({ compress: { module: true }, mangle: false, format: { comments: 'some' } })
28
28
  ]
29
29
  }
package/src/index.js CHANGED
@@ -12,6 +12,7 @@
12
12
  * @example
13
13
  * const { deserializer, extension } = require('@jscad/x3d-deserializer')
14
14
  */
15
+ import { ensureString } from '@jscad/io-utils'
15
16
 
16
17
  import { translate } from './translate.js'
17
18
  import { instantiate } from './instantiate.js'
@@ -41,6 +42,7 @@ const deserialize = (options, input) => {
41
42
  }
42
43
  options = Object.assign({}, defaults, options)
43
44
 
45
+ input = ensureString(input)
44
46
  return options.output === 'script' ? translate(options, input) : instantiate(options, input)
45
47
  }
46
48
 
package/src/objects.js CHANGED
@@ -1,4 +1,4 @@
1
- import { poly2 } from '@jscad/modeling'
1
+ import { area } from '@jscad/modeling'
2
2
 
3
3
  export const x3dTypes = {
4
4
  X3D: 0,
@@ -89,31 +89,31 @@ export const x3dTransform = (element) => {
89
89
  }
90
90
 
91
91
  if (element.center) {
92
- const values = element.center.trim().split(/ +/).map((v) => parseFloat(v))
92
+ const values = parseNumbers(element.center)
93
93
  if (values.length > 2) {
94
94
  obj.center = values
95
95
  }
96
96
  }
97
97
  if (element.rotation) {
98
- const values = element.rotation.trim().split(/ +/).map((v) => parseFloat(v))
98
+ const values = parseNumbers(element.rotation)
99
99
  if (values.length > 3) {
100
100
  obj.rotation = values
101
101
  }
102
102
  }
103
103
  if (element.scale) {
104
- const values = element.scale.trim().split(/ +/).map((v) => parseFloat(v))
104
+ const values = parseNumbers(element.scale)
105
105
  if (values.length > 2) {
106
106
  obj.scale = values
107
107
  }
108
108
  }
109
109
  if (element.scaleorientation) {
110
- const values = element.scaleorientation.trim().split(/ +/).map((v) => parseFloat(v))
110
+ const values = parseNumbers(element.scaleorientation)
111
111
  if (values.length > 3) {
112
112
  obj.scaleOrientation = values
113
113
  }
114
114
  }
115
115
  if (element.translation) {
116
- const values = element.translation.trim().split(/ +/).map((v) => parseFloat(v))
116
+ const values = parseNumbers(element.translation)
117
117
  if (values.length > 2) {
118
118
  obj.translation = values
119
119
  }
@@ -138,7 +138,7 @@ export const x3dBox = (element) => {
138
138
  const obj = { definition: x3dTypes.BOX, size: [2, 2, 2] }
139
139
 
140
140
  if (element.size) {
141
- const values = element.size.trim().split(/ +/).map((v) => parseFloat(v))
141
+ const values = parseNumbers(element.size)
142
142
  if (values.length > 2) {
143
143
  obj.size = values
144
144
  }
@@ -187,7 +187,7 @@ export const x3dSphere = (element) => {
187
187
  obj.radius = parseFloat(element.radius)
188
188
  }
189
189
  if (element.subdivision) {
190
- const values = element.subdivision.trim().split(/ +/).map((v) => parseFloat(v))
190
+ const values = parseNumbers(element.subdivision)
191
191
  if (values.length > 1) {
192
192
  obj.subdivision = Math.max(...values)
193
193
  }
@@ -217,18 +217,18 @@ export const x3dExtrusion = (element) => {
217
217
  obj.endCap = element.endCap.includes('TRUE') || element.endCap.includes('true')
218
218
  }
219
219
  if (element.crossSection) {
220
- const values = element.crossSection.trim().split(/ +/).map((v) => parseFloat(v))
220
+ const values = parseNumbers(element.crossSection)
221
221
  const numpoints = Math.trunc(values.length / 2)
222
222
  const points = []
223
223
  for (let i = 0; i < numpoints; i++) {
224
224
  const vi = i * 2
225
225
  points.push([values[vi], values[vi + 1]])
226
226
  }
227
- obj.ccw = (poly2.measureArea(poly2.create(points)) < 0) // WHAT!!!! X3D IS SICK!!!
227
+ obj.ccw = (area(points) < 0) // WHAT!!!! X3D IS SICK!!!
228
228
  obj.crossSection = points
229
229
  }
230
230
  if (element.orientation) {
231
- const values = element.orientation.trim().split(/ +/).map((v) => parseFloat(v))
231
+ const values = parseNumbers(element.orientation)
232
232
  const numpoints = Math.trunc(values.length / 4)
233
233
  const points = []
234
234
  for (let i = 0; i < numpoints; i++) {
@@ -238,7 +238,7 @@ export const x3dExtrusion = (element) => {
238
238
  obj.orientations = points
239
239
  }
240
240
  if (element.scale) {
241
- const values = element.scale.trim().split(/ +/).map((v) => parseFloat(v))
241
+ const values = parseNumbers(element.scale)
242
242
  const numpoints = Math.trunc(values.length / 2)
243
243
  const points = []
244
244
  for (let i = 0; i < numpoints; i++) {
@@ -251,7 +251,7 @@ export const x3dExtrusion = (element) => {
251
251
  obj.scales = points
252
252
  }
253
253
  if (element.spine) {
254
- const values = element.spine.trim().split(/ +/).map((v) => parseFloat(v))
254
+ const values = parseNumbers(element.spine)
255
255
  const numpoints = Math.trunc(values.length / 3)
256
256
  const points = []
257
257
  for (let i = 0; i < numpoints; i++) {
@@ -337,7 +337,7 @@ export const x3dPolyline2D = (element) => {
337
337
  const obj = { definition: x3dTypes.POLYLINE2D, lineSegments: [] }
338
338
 
339
339
  if (element.lineSegments) {
340
- const values = element.lineSegments.trim().split(/ +/).map((v) => parseFloat(v))
340
+ const values = parseNumbers(element.lineSegments)
341
341
  for (let i = 0; i < values.length; i = i + 2) {
342
342
  const point = [values[i], values[i + 1]]
343
343
  obj.lineSegments.push(point)
@@ -350,7 +350,7 @@ export const x3dRectangle2D = (element) => {
350
350
  const obj = { definition: x3dTypes.RECTANGLE2D, size: [2, 2] }
351
351
 
352
352
  if (element.size) {
353
- const values = element.size.trim().split(/ +/).map((v) => parseFloat(v))
353
+ const values = parseNumbers(element.size)
354
354
  if (values.length > 1) {
355
355
  obj.size = values
356
356
  }
@@ -362,7 +362,7 @@ export const x3dTriangleSet2D = (element) => {
362
362
  const obj = { definition: x3dTypes.TRIANGLESET2D, vertices: [] }
363
363
 
364
364
  if (element.vertices) {
365
- const values = element.vertices.trim().split(/ +/).map((v) => parseFloat(v))
365
+ const values = parseNumbers(element.vertices)
366
366
  for (let i = 0; i < values.length; i = i + 2) {
367
367
  const point = [values[i], values[i + 1]]
368
368
  obj.vertices.push(point)
@@ -379,7 +379,7 @@ export const x3dLineSet = (element) => {
379
379
  const obj = { definition: x3dTypes.LINESET, vertexCount: [], colorPerVertex: true }
380
380
 
381
381
  if (element.vertexCount) {
382
- obj.vertexCount = element.vertexCount.trim().split(/ +/).map((v) => parseFloat(v))
382
+ obj.vertexCount = parseNumbers(element.vertexCount)
383
383
  }
384
384
  // color attributes
385
385
  if (element.colorPerVertex) {
@@ -393,9 +393,8 @@ export const x3dIndexedLineSet = (element) => {
393
393
  const obj = { definition: x3dTypes.INDEXEDLINESET, indexes: [], colorPerVertex: true }
394
394
 
395
395
  if (element.coordIndex) {
396
- const indexes = element.coordIndex.trim().split(/ -1/)
397
- obj.indexes = indexes.map((index) => index.trim().split(/ +/).map((v) => parseFloat(v)))
398
- obj.indexes = obj.indexes.filter((index) => index.length > 1)
396
+ const indexes = parseIndices(element.coordIndex)
397
+ obj.indexes = indexes.filter((index) => index.length > 1)
399
398
  }
400
399
  // color attributes
401
400
  if (element.colorPerVertex) {
@@ -413,7 +412,7 @@ export const x3dColor = (element) => {
413
412
  const obj = { definition: x3dTypes.COLOR, colors: [] }
414
413
 
415
414
  if (element.color) {
416
- const values = element.color.trim().split(/ +/).map((v) => parseFloat(v))
415
+ const values = parseNumbers(element.color)
417
416
  const numvalues = values.length
418
417
  const numcolors = Math.trunc(numvalues / 3)
419
418
  for (let i = 0; i < numcolors; i++) {
@@ -428,7 +427,7 @@ export const x3dCoordinate = (element) => {
428
427
  const obj = { definition: x3dTypes.COORDINATE, points: [] }
429
428
 
430
429
  if (element.point) {
431
- const values = element.point.trim().split(/ +/).map((v) => parseFloat(v))
430
+ const values = parseNumbers(element.point)
432
431
  const numvalues = values.length
433
432
  const numpoints = Math.trunc(numvalues / 3)
434
433
  for (let i = 0; i < numpoints; i++) {
@@ -456,7 +455,7 @@ export const x3dTriangleFanSet = (element) => {
456
455
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
457
456
  }
458
457
  if (element.fanCount) {
459
- obj.fanCount = element.fanCount.trim().split(/ +/).map((v) => parseFloat(v))
458
+ obj.fanCount = parseNumbers(element.fanCount)
460
459
  }
461
460
  obj.objects = []
462
461
  return obj
@@ -469,7 +468,7 @@ export const x3dTriangleStripSet = (element) => {
469
468
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
470
469
  }
471
470
  if (element.stripCount) {
472
- obj.stripCount = element.stripCount.trim().split(/ +/).map((v) => parseFloat(v))
471
+ obj.stripCount = parseNumbers(element.stripCount)
473
472
  }
474
473
  obj.objects = []
475
474
  return obj
@@ -492,7 +491,7 @@ export const x3dIndexedTriangleSet = (element) => {
492
491
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
493
492
  }
494
493
  if (element.index) {
495
- obj.index = element.index.trim().split(/ +/).map((v) => parseFloat(v))
494
+ obj.index = parseNumbers(element.index)
496
495
  }
497
496
  obj.objects = []
498
497
  return obj
@@ -505,8 +504,8 @@ export const x3dIndexedTriangleFanSet = (element) => {
505
504
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
506
505
  }
507
506
  if (element.index) {
508
- const indexes = element.index.trim().split(/ -1/)
509
- obj.fans = indexes.map((index) => index.trim().split(/ +/).map((v) => parseFloat(v))).filter((index) => index.length > 2)
507
+ const indexes = parseIndices(element.index)
508
+ obj.fans = indexes.filter((index) => index.length > 2)
510
509
  }
511
510
  obj.objects = []
512
511
  return obj
@@ -520,8 +519,8 @@ export const x3dIndexedTriangleStripSet = (element) => {
520
519
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
521
520
  }
522
521
  if (element.index) {
523
- const indexes = element.index.trim().split(/ -1/)
524
- obj.strips = indexes.map((index) => index.trim().split(/ +/).map((v) => parseFloat(v))).filter((index) => index.length > 2)
522
+ const indexes = parseIndices(element.index)
523
+ obj.strips = indexes.filter((index) => index.length > 2)
525
524
  }
526
525
  return obj
527
526
  }
@@ -533,7 +532,7 @@ export const x3dIndexedQuadSet = (element) => {
533
532
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
534
533
  }
535
534
  if (element.index) {
536
- obj.index = element.index.trim().split(/ +/).map((v) => parseFloat(v))
535
+ obj.index = parseNumbers(element.index)
537
536
  }
538
537
  obj.objects = []
539
538
  return obj
@@ -549,8 +548,8 @@ export const x3dIndexedFaceSet = (element) => {
549
548
  obj.convex = element.convex.includes('TRUE') || element.convex.includes('true')
550
549
  }
551
550
  if (element.coordIndex) {
552
- const indexes = element.coordIndex.trim().split(/ -1/)
553
- obj.faces = indexes.map((index) => index.trim().split(/ +/).map((v) => parseFloat(v))).filter((index) => index.length > 2)
551
+ const indexes = parseIndices(element.coordIndex)
552
+ obj.faces = indexes.filter((index) => index.length > 2)
554
553
  }
555
554
  // color attributes
556
555
  if (element.colorPerVertex) {
@@ -559,11 +558,11 @@ export const x3dIndexedFaceSet = (element) => {
559
558
  if (element.colorIndex) {
560
559
  if (obj.colorPerVertex) {
561
560
  // indexes are provided for each VERTEX
562
- const indexes = element.colorIndex.trim().split(/ -1/)
563
- obj.colorIndex = indexes.map((index) => index.trim().split(/ +/).map((v) => parseFloat(v))).filter((index) => index.length > 2)
561
+ const indexes = parseIndices(element.colorIndex)
562
+ obj.colorIndex = indexes.filter((index) => index.length > 2)
564
563
  } else {
565
564
  // indexes are provided for each FACE
566
- obj.colorIndex = element.colorIndex.trim().split(/ +/).map((v) => parseFloat(v))
565
+ obj.colorIndex = parseNumbers(element.colorIndex)
567
566
  }
568
567
  } else {
569
568
  // reuse the indexes for the FACES
@@ -589,7 +588,7 @@ export const x3dElevationGrid = (element) => {
589
588
  obj.zSpacing = parseFloat(element.zSpacing)
590
589
  }
591
590
  if (element.height) {
592
- obj.height = element.height.trim().split(/ +/).map((v) => parseFloat(v))
591
+ obj.height = parseNumbers(element.height)
593
592
  }
594
593
  if (element.ccw) {
595
594
  obj.ccw = element.ccw.includes('TRUE') || element.ccw.includes('true')
@@ -632,14 +631,14 @@ export const x3dMaterial = (element) => {
632
631
  alpha = 1.0 - element.transparency
633
632
  }
634
633
  if (element.diffuseColor) {
635
- const values = element.diffuseColor.trim().split(/ +/).map((v) => parseFloat(v))
634
+ const values = parseNumbers(element.diffuseColor)
636
635
  if (values.length > 2) {
637
636
  if (values.length < 4) values.push(alpha)
638
637
  obj.color = values
639
638
  }
640
639
  }
641
640
  if (element.emissiveColor) {
642
- const values = element.emissiveColor.trim().split(/ +/).map((v) => parseFloat(v))
641
+ const values = parseNumbers(element.emissiveColor)
643
642
  if (values.length > 2) {
644
643
  if (values.length < 4) values.push(alpha)
645
644
  obj.color = values
@@ -656,3 +655,11 @@ export const x3dGroup = (element) => {
656
655
  obj.objects = []
657
656
  return obj
658
657
  }
658
+
659
+ export const parseNumbers = (attribute) =>
660
+ attribute.trim().replace(/,/g, ' ').split(/ +/).map((v) => parseFloat(v))
661
+
662
+ export const parseIndices = (attribute) => {
663
+ const indexes = attribute.replace(/,/g, ' ').trim().split(/ -1/)
664
+ return indexes.map((index) => parseNumbers(index))
665
+ }
package/src/parse.js CHANGED
@@ -45,21 +45,6 @@ import {
45
45
  x3dMaterial
46
46
  } from './objects.js'
47
47
 
48
- let x3dLast = null // last object found
49
- let x3dDefinition = x3dTypes.X3D // what kind of object being created
50
-
51
- // high level elements / definitions
52
- const x3dObjects = [] // list of objects
53
- const x3dDefs = new Map() // list of named objects
54
-
55
- const x3dMaterials = [] // list of materials
56
- const x3dTextures = [] // list of textures
57
-
58
- const x3dLength = { factor: 1.0, name: 'meters' }
59
- const x3dAngle = { factor: 1.0, name: 'radians' }
60
-
61
- let x3dObj = null // x3d in object form
62
-
63
48
  const nodeToObjectMap = {
64
49
  X3D: x3dX3D,
65
50
  UNIT: x3dUnit,
@@ -107,10 +92,25 @@ const nodeToObjectMap = {
107
92
  let objectId = 1
108
93
  const getObjectId = () => ('0000' + objectId++).slice(-4)
109
94
 
110
- const createX3DParser = (src) => {
95
+ export const parse = (src) => {
111
96
  // create a parser for the XML
112
97
  const parser = new saxes.SaxesParser()
113
98
 
99
+ // high level elements / definitions
100
+ let x3dLast = null // last object found
101
+ let x3dDefinition = x3dTypes.X3D // what kind of object being created
102
+
103
+ const x3dObjects = [] // list of objects
104
+ const x3dDefs = new Map() // list of named objects
105
+
106
+ const x3dMaterials = [] // list of materials
107
+ const x3dTextures = [] // list of textures
108
+
109
+ const x3dLength = { factor: 1.0, name: 'meters' }
110
+ const x3dAngle = { factor: 1.0, name: 'radians' }
111
+
112
+ let x3dObj = null // x3d in object form
113
+
114
114
  parser.on('error', (e) => {
115
115
  console.log(`error: line ${e.line}, column ${e.column}, bad character [${e.c}]`)
116
116
  })
@@ -331,10 +331,8 @@ const createX3DParser = (src) => {
331
331
 
332
332
  // start the parser
333
333
  parser.write(src).close()
334
- }
335
334
 
336
- export const parse = (src) => {
337
- createX3DParser(src)
335
+ // return the results
338
336
  // console.log(JSON.stringify(x3dObj))
339
337
  return { x3dObj, x3dMaterials, x3dTextures }
340
338
  }
@@ -0,0 +1,82 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
3
+ <X3D profile='Interchange' version='3.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance'>
4
+ <head>
5
+ <component level='2' name='TriangleSets'/>
6
+ <unit category='length' conversionFactor='0.001' name='millimeters'/>
7
+ <meta content='TriangleSets.x3d' name='title'/>
8
+ </head>
9
+ <!-- ==================== -->
10
+ <!-- Examples from https://x3dgraphics.com/examples/X3dForWebAuthors/Chapter13GeometryTrianglesQuadrilaterals/ -->
11
+ <!-- ==================== -->
12
+ <Scene>
13
+ <!-- Default Shapes -->
14
+ <Group>
15
+
16
+ <Shape>
17
+ <IndexedTriangleFanSet/>
18
+ </Shape>
19
+
20
+ <Shape>
21
+ <IndexedTriangleSet/>
22
+ </Shape>
23
+
24
+ <Shape>
25
+ <IndexedTriangleStripSet/>
26
+ </Shape>
27
+
28
+ <Shape>
29
+ <IndexedFaceSet/>
30
+ </Shape>
31
+
32
+ </Group>
33
+ <Group>
34
+
35
+ <Shape>
36
+ <IndexedTriangleFanSet ccw='true' colorPerVertex='true' index='18,19,20,21,22,23,24,25,26,-1,27,28,29,30,31,32,-1' normalPerVertex='true' solid='false'>
37
+ <Coordinate point='-4 1 3 -2 2 1.5 -3 4 0.5 -2 3 1.5 0 4 0.0 2 3 1.5 5 5 -2.5 4 3 1.5 6 4 2.0 -4 1 3 -2 2 1.0 -3 4 0.0 -2 3 1.0 0 4 0.0 2 3 1.0 5 5 -2.0 4 3 1.5 6 4 2.0 0 -2 4 1 -3 3.5 1.5 -1.5 3 0 -1 2 -.5 0 2.5 -1.5 1 3 -2 0 3.5 -3 -2 2 -3 -4 3 2 -4 -2 0 -3 -.5 1.3 -1.5 -1 4 -2 -1.5 4.2 -4.2 -1 3 -6 -.5'/>
38
+ <Color color='0 .8 0 0 1 1 1 0 0 1 .5 0 .8 0 1 1 1 0 .6 .3 .1 1 0 .5 0 1 .5 1 0 0 .8 0 1 1 1 0 0 1 1 1 .5 0 .6 .3 .1 1 0 .5 0 .8 0 0 1 .5 0 .8 0 0 1 1 1 0 0 1 .5 0 .8 0 1 1 1 0 .6 .3 .1 1 0 .5 0 1 .5 1 0 0 .8 0 1 1 1 0 0 1 1 1 .5 0 .6 .3 .1 1 0 .5 0 .8 0 0 1 .5'/>
39
+ </IndexedTriangleFanSet>
40
+ </Shape>
41
+
42
+ <Shape>
43
+ <IndexedTriangleSet ccw='true' colorPerVertex='true' index='0,1,2,3,4,5,6,7,8' normalPerVertex='true' solid='false'>
44
+ <Coordinate point='-4 1 3 -2 2 1.5 -3 4 0.5 -2 3 1.5 0 4 0 2 3 1.5 5 5 -2.5 4 3 1.5 6 4 2'/>
45
+ <Color color='0 0.8 0 0 1 1 1 0 0 1 0.5 0 0.8 0 1 1 1 0 0.6 0.3 0.1 1 0 0.5 0 1 0.5'/>
46
+ </IndexedTriangleSet>
47
+ </Shape>
48
+
49
+ <Shape>
50
+ <IndexedTriangleStripSet ccw='true' colorPerVertex='true' index='9,10,11,12,13,-1,14,15,16,17,-1' normalPerVertex='true' solid='false'>
51
+ <Coordinate point='-4 1 3 -2 2 1.5 -3 4 0.5 -2 3 1.5 0 4 0.0 2 3 1.5 5 5 -2.5 4 3 1.5 6 4 2.0 -4 1 3 -2 2 1.0 -3 4 0.0 -2 3 1.0 0 4 0.0 2 3 1.0 5 5 -2.0 4 3 1.5 6 4 2.0 0 -2 4 1 -3 3.5 1.5 -1.5 3 0 -1 2 -.5 0 2.5 -1.5 1 3 -2 0 3.5 -3 -2 2 -3 -4 3 2 -4 -2 0 -3 -.5 1.3 -1.5 -1 4 -2 -1.5 4.2 -4.2 -1 3 -6 -.5'/>
52
+ <Color color='0 .8 0 0 1 1 1 0 0 1 .5 0 .8 0 1 1 1 0 .6 .3 .1 1 0 .5 0 1 .5 1 0 0 .8 0 1 1 1 0 0 1 1 1 .5 0 .6 .3 .1 1 0 .5 0 .8 0 0 1 .5'/>
53
+ </IndexedTriangleStripSet>
54
+ </Shape>
55
+
56
+ <Shape>
57
+ <IndexedQuadSet ccw='true' colorPerVertex='true' index='0,1,2,3,4,5,6,7' normalPerVertex='true' solid='false'>
58
+ <Coordinate point='-6 -2 0 -1 -2 0 -1 2 0 -6 2 0 1 -2 0 6 -2 0 6 2 0 1 2 0'/>
59
+ <Color color='0.2 0.2 0.2 1 0.058824 0.227451 0.4 1 0.121569 0 0.007843 0.960784 0.6 0.235294 0 0.94902 1 0.380392 0.239216 1 0.886275 1 0.121569 0.964706'/>
60
+ </IndexedQuadSet>
61
+ </Shape>
62
+
63
+ <Shape>
64
+ <Appearance>
65
+ <Material ambientIntensity='0.0534211' diffuseColor='0.756863 0.729412 0.537255' emissiveColor='0.18 0.17 0.13' shininess='0.19' specularColor='0.38 0.38 0.27'/>
66
+ </Appearance>
67
+ <IndexedFaceSet colorIndex='0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,2,1,3,224,225' colorPerVertex='false' convex='false' coordIndex='0,1,2,-1,12,13,14,-1,15,16,17,-1,18,19,20,-1,21,22,23,-1,24,25,26,-1,27,28,29,-1,30,31,32,-1,33,34,35,-1,36,37,38,-1,39,40,41,-1,42,43,44,-1,45,46,47,-1,48,49,50,-1,51,52,53,-1,54,55,56,-1,57,58,59,-1,60,61,62,-1,63,64,65,-1,66,67,68,-1,69,70,71,-1,72,73,74,-1,75,76,77,-1,78,79,80,-1,81,82,83,-1,84,85,86,-1,87,88,89,-1,90,91,92,-1,93,94,95,-1,96,97,98,-1,99,100,101,-1,102,103,104,-1,105,106,107,-1,108,109,110,-1,111,112,113,-1,114,115,116,-1,117,118,119,-1,120,121,122,-1,123,124,125,-1,126,127,128,-1,129,130,131,-1,132,133,134,-1,135,136,137,-1,138,139,140,-1,141,142,143,-1,144,145,146,-1,147,148,149,-1,150,151,152,-1,153,154,155,-1,156,157,158,-1,159,160,161,-1,162,163,164,-1,165,166,167,-1,168,169,170,-1,171,172,173,-1,174,175,176,-1,177,178,179,-1,180,181,182,-1,183,184,185,-1,186,187,188,-1,189,190,191,-1,192,193,194,-1,195,196,197,-1,198,199,200,-1,201,202,203,-1,204,205,206,-1,207,208,209,-1,210,211,212,-1,213,214,215,-1,216,217,218,-1,219,220,221,-1,222,223,224,-1,225,226,227,-1,228,229,230,-1,231,232,233,-1,234,235,236,-1,237,238,239,-1,240,241,242,-1,243,244,245,-1,246,247,248,-1,249,250,251,-1,252,253,254,-1,255,256,257,-1,258,259,260,-1,261,262,263,-1,264,265,266,-1,267,268,269,-1,270,271,272,-1,273,274,275,-1,276,277,278,-1,279,280,281,-1,282,283,284,-1,285,286,287,-1,288,289,290,-1,291,292,293,-1,294,295,296,-1,297,298,299,-1,300,301,302,-1,303,304,305,-1,306,307,308,-1,309,310,311,-1,312,313,314,-1,315,316,317,-1,318,319,320,-1,321,322,323,-1,324,325,326,-1,327,328,329,-1,330,331,332,-1,333,334,335,-1,336,337,338,-1,339,340,341,-1,342,343,344,-1,345,346,347,-1,348,349,350,-1,351,352,353,-1,354,355,356,-1,357,358,359,-1,360,361,362,-1,363,364,365,-1,366,367,368,-1,369,370,371,-1,372,373,374,-1,375,376,377,-1,378,379,380,-1,381,382,383,-1,384,385,386,-1,387,388,389,-1,390,391,392,-1,393,394,395,-1,396,397,398,-1,399,400,401,-1,402,403,404,-1,405,406,407,-1,408,409,410,-1,411,412,413,-1,414,415,416,-1,417,418,419,-1,420,421,422,-1,423,424,425,-1,426,427,428,-1,429,430,431,-1,432,433,434,-1,435,436,437,-1,438,439,440,-1,441,442,443,-1,444,445,446,-1,447,448,449,-1,450,451,452,-1,453,454,455,-1,456,457,458,-1,459,460,461,-1,462,463,464,-1,465,466,467,-1,468,469,470,-1,471,472,473,-1,474,475,476,-1,477,478,479,-1,480,481,482,-1,483,484,485,-1,486,487,488,-1,489,490,491,-1,492,493,494,-1,495,496,497,-1,498,499,500,-1,501,502,503,-1,504,505,506,-1,507,508,509,-1,510,511,512,-1,513,514,515,-1,516,517,518,-1,519,520,521,-1,522,523,524,-1,525,526,527,-1,528,529,530,-1,531,532,533,-1,534,535,536,-1,537,538,539,-1,540,541,542,-1,543,544,545,-1,546,547,548,-1,549,550,551,-1,552,553,554,-1,555,556,557,-1,558,559,560,-1,561,562,563,-1,564,565,566,-1,567,568,569,-1,570,571,572,-1,573,574,575,-1,576,577,578,-1,579,580,581,-1,582,583,584,-1,585,586,587,-1,588,589,590,-1,591,592,593,-1,594,595,596,-1,597,598,599,-1,600,601,602,-1,603,604,605,-1,606,607,608,-1,609,610,611,-1,612,613,614,-1,615,616,617,-1,618,619,620,-1,621,622,623,-1,624,625,626,-1,627,628,629,-1,630,631,632,-1,633,634,635,-1,636,637,638,-1,639,640,641,-1,642,643,644,-1,645,646,647,-1,648,649,650,-1,651,652,653,-1,654,655,656,-1,657,658,659,-1,660,661,662,-1,663,664,665,-1,666,667,668,-1,669,670,671,-1,6,7,8,-1,3,4,5,-1,9,10,11,-1,672,673,674,-1,675,676,677,-1' creaseAngle='3.14159' normalIndex='0,1,2,-1,10,10,10,-1,11,11,11,-1,12,12,12,-1,13,13,13,-1,14,14,14,-1,15,16,17,-1,18,19,20,-1,21,22,23,-1,24,25,26,-1,27,27,27,-1,28,28,28,-1,29,29,29,-1,30,31,32,-1,33,34,35,-1,36,37,38,-1,39,40,41,-1,42,43,44,-1,45,46,47,-1,48,49,50,-1,51,51,51,-1,52,53,54,-1,55,56,57,-1,58,59,60,-1,61,62,63,-1,64,65,66,-1,67,67,67,-1,68,69,70,-1,71,72,73,-1,74,74,74,-1,75,75,75,-1,76,76,76,-1,77,78,79,-1,80,80,80,-1,81,82,83,-1,84,84,84,-1,85,85,85,-1,86,86,86,-1,87,87,87,-1,88,88,88,-1,89,89,89,-1,90,91,92,-1,93,94,95,-1,96,96,96,-1,97,98,99,-1,100,101,102,-1,103,104,105,-1,106,107,108,-1,109,110,111,-1,112,113,114,-1,115,115,115,-1,116,117,118,-1,119,119,119,-1,120,121,122,-1,123,124,125,-1,126,127,128,-1,129,129,129,-1,130,131,132,-1,133,134,135,-1,136,136,136,-1,137,138,139,-1,140,141,142,-1,143,143,143,-1,144,145,146,-1,147,148,149,-1,150,151,152,-1,153,154,155,-1,156,156,156,-1,157,157,157,-1,158,159,160,-1,161,162,163,-1,164,164,164,-1,165,165,165,-1,166,167,168,-1,169,170,171,-1,172,173,174,-1,175,176,177,-1,178,178,178,-1,179,179,179,-1,180,181,182,-1,183,184,185,-1,186,187,188,-1,189,189,189,-1,190,190,190,-1,191,192,193,-1,194,195,196,-1,197,197,197,-1,198,198,198,-1,199,199,199,-1,200,201,202,-1,203,204,205,-1,206,206,206,-1,207,208,209,-1,210,210,210,-1,211,211,211,-1,212,212,212,-1,213,213,213,-1,214,215,216,-1,217,218,219,-1,220,220,220,-1,221,221,221,-1,222,222,222,-1,223,224,225,-1,226,227,228,-1,229,229,229,-1,230,231,232,-1,233,234,235,-1,236,237,238,-1,239,240,241,-1,242,243,244,-1,245,246,247,-1,248,248,248,-1,249,249,249,-1,250,251,252,-1,253,254,255,-1,256,257,258,-1,259,260,261,-1,262,263,264,-1,265,265,265,-1,266,266,266,-1,267,267,267,-1,268,269,270,-1,271,272,273,-1,274,275,276,-1,277,278,279,-1,280,281,282,-1,283,284,285,-1,286,287,288,-1,289,289,289,-1,290,291,292,-1,293,294,295,-1,296,297,298,-1,299,300,301,-1,302,303,304,-1,305,305,305,-1,306,307,308,-1,309,310,311,-1,312,312,312,-1,313,313,313,-1,314,314,314,-1,315,316,317,-1,318,318,318,-1,319,320,321,-1,322,322,322,-1,323,323,323,-1,324,324,324,-1,325,325,325,-1,326,326,326,-1,327,327,327,-1,328,329,330,-1,331,332,333,-1,334,334,334,-1,335,336,337,-1,338,339,340,-1,341,342,343,-1,344,345,346,-1,347,348,349,-1,350,351,352,-1,353,353,353,-1,354,355,356,-1,357,357,357,-1,358,359,360,-1,361,362,363,-1,364,365,366,-1,367,367,367,-1,368,369,370,-1,371,372,373,-1,374,374,374,-1,375,376,377,-1,378,379,380,-1,381,381,381,-1,382,383,384,-1,385,386,387,-1,388,389,390,-1,391,392,393,-1,394,394,394,-1,395,395,395,-1,396,397,398,-1,399,400,401,-1,402,402,402,-1,403,403,403,-1,404,405,406,-1,407,408,409,-1,410,411,412,-1,413,414,415,-1,416,416,416,-1,417,417,417,-1,418,419,420,-1,421,422,423,-1,424,425,426,-1,427,427,427,-1,428,428,428,-1,429,430,431,-1,432,433,434,-1,435,435,435,-1,436,436,436,-1,437,437,437,-1,438,439,440,-1,441,442,443,-1,444,444,444,-1,445,446,447,-1,448,448,448,-1,449,449,449,-1,450,450,450,-1,451,451,451,-1,452,453,454,-1,455,456,457,-1,458,458,458,-1,459,459,459,-1,460,460,460,-1,461,462,463,-1,464,465,466,-1,467,467,467,-1,468,469,470,-1,471,472,473,-1,474,475,476,-1,477,478,479,-1,480,481,482,-1,483,484,485,-1,486,486,486,-1,487,487,487,-1,4,5,6,-1,3,3,3,-1,7,8,9,-1,488,488,488,-1,489,490,491,-1' solid='false'>
68
+ <Coordinate point='-0.0902426 0.707736 -0.361894 -0.126242 0.7163 -0.510588 -0.0821966 0.717949 -0.490936 1.05985e-006 0.934617 0.0504887 -0.00664806 0.898872 -0.0277972 0 0.901021 0.122661 1.05985e-006 0.934617 0.0504887 0 0.901021 0.122661 -2.03005e-006 0.90317 0.277591 1.06986e-006 1.0793 3.47475e-007 1.05985e-006 0.934617 0.0504887 -2.03005e-006 0.90317 0.277591 -0.114758 0.901562 -0.463227 -0.118379 0.85895 -0.478181 -0.098076 0.874364 -0.394307 -0.118483 0.948969 -0.478612 -0.114758 0.901562 -0.463227 -0.098076 0.874364 -0.394307 -0.148198 0.693025 -0.60134 -0.153978 0.652374 -0.625216 -0.140082 0.684348 -0.567816 -0.126187 0.716322 -0.510419 -0.148198 0.693025 -0.60134 -0.140082 0.684348 -0.567816 -0.151929 0.723428 -0.61675 -0.148198 0.693025 -0.60134 -0.126187 0.716322 -0.510419 -0.123346 0.739931 -0.0712886 -0.147796 0.734624 -0.210758 -0.142964 0.693107 -0.139234 -0.147796 0.734624 -0.210758 -0.154642 0.690461 -0.206715 -0.142964 0.693107 -0.139234 -0.142964 0.693107 -0.139234 -0.154642 0.690461 -0.206715 -0.170992 0.648327 -0.242015 -0.118464 0.756954 0.588829 -0.134253 0.756954 0.279345 -0.302092 0.706351 0.270908 -0.171744 0.724864 -0.680752 -0.227054 0.740499 -0.761237 -0.221648 0.65237 -0.934256 -0.227054 0.740499 -0.761237 -0.171744 0.724864 -0.680752 -0.156404 0.717949 -0.47297 -0.227054 0.740499 -0.761237 -0.156404 0.717949 -0.47297 -0.193516 0.738534 -0.463984 -0.193516 0.738534 -0.463984 -0.156404 0.717949 -0.47297 -0.10699 0.717949 -0.106569 -0.156404 0.717949 -0.47297 -0.0902276 0.707736 -0.361897 -0.0580738 0.70326 -0.0822888 -0.0902276 0.707736 -0.361897 -0.00919576 0.699209 -0.0271805 -0.0580738 0.70326 -0.0822888 -0.156404 0.717949 -0.47297 -0.0580737 0.70326 -0.0822888 -0.10699 0.717949 -0.106569 -0.10699 0.717949 -0.106569 -0.0580738 0.70326 -0.0822888 -0.0766211 0.707736 0.27759 -0.113414 0.724864 0.27759 -0.10699 0.717949 -0.106569 -0.0766211 0.707736 0.27759 -0.0580738 0.70326 -0.0822888 -0.00919576 0.699209 -0.0271805 -0.0352099 0.699209 0.27759 -0.00919576 0.699209 -0.0271805 -0.0030355 0.697365 0.277591 -0.0352099 0.699209 0.27759 -0.0580738 0.70326 -0.0822888 -0.0352099 0.699209 0.27759 -0.0766211 0.707736 0.27759 -0.00303552 0.697365 0.277591 -0.00303664 0.699209 0.4528 -0.0352099 0.699209 0.27759 -0.131733 0.744141 0.27759 -0.113414 0.724864 0.27759 -0.123031 0.740499 0.495402 -0.123031 0.740499 0.495402 -0.113414 0.724864 0.27759 -0.091476 0.717949 0.518391 -0.113414 0.724864 0.27759 -0.0766211 0.707736 0.27759 -0.091476 0.717949 0.518391 -0.00303936 0.724864 0.878668 -0.047258 0.717949 0.759194 -0.00303808 0.707736 0.678309 -0.0766211 0.707736 0.27759 -0.0430349 0.70326 0.495403 -0.091476 0.717949 0.518391 -0.0352099 0.699209 0.27759 -0.0430349 0.70326 0.495403 -0.0766211 0.707736 0.27759 -0.0430349 0.70326 0.495403 -0.047258 0.717949 0.759194 -0.091476 0.717949 0.518391 -0.00303808 0.707736 0.678309 -0.047258 0.717949 0.759194 -0.0430349 0.70326 0.495403 -0.00303664 0.699209 0.4528 -0.00303808 0.707736 0.678309 -0.0430349 0.70326 0.495403 -0.0352099 0.699209 0.27759 -0.00303664 0.699209 0.4528 -0.0430349 0.70326 0.495403 -0.00303936 0.724864 0.878668 -0.0430376 0.740499 0.931031 -0.047258 0.717949 0.759194 -0.0352143 0.759118 0.978427 -0.076625 0.759118 0.878668 -0.0430376 0.740499 0.931031 -0.0914776 0.738534 0.759194 -0.113416 0.759118 0.678308 -0.123031 0.740499 0.495402 -0.0914776 0.738534 0.759194 -0.123031 0.740499 0.495402 -0.091476 0.717949 0.518391 -0.076625 0.759118 0.878668 -0.113416 0.759118 0.678308 -0.0914776 0.738534 0.759194 -0.0430376 0.740499 0.931031 -0.076625 0.759118 0.878668 -0.0914776 0.738534 0.759194 -0.0430376 0.740499 0.931031 -0.0914776 0.738534 0.759194 -0.047258 0.717949 0.759194 -0.047258 0.717949 0.759194 -0.0914776 0.738534 0.759194 -0.091476 0.717949 0.518391 -0.113416 0.759118 0.678308 -0.131734 0.759118 0.452799 -0.123031 0.740499 0.495402 -0.131734 0.759118 0.452799 -0.131733 0.744141 0.27759 -0.123031 0.740499 0.495402 -0.135694 0.759118 0.27759 -0.131733 0.744141 0.27759 -0.131734 0.759118 0.452799 -0.125212 0.740499 -0.0660358 -0.193516 0.738534 -0.463984 -0.159365 0.739516 -0.265011 -0.182866 0.759118 -0.339472 -0.193516 0.738534 -0.463984 -0.125212 0.740499 -0.0660358 -0.182866 0.759118 -0.339472 -0.125212 0.740499 -0.0660358 -0.135326 0.759118 -0.00108072 -0.125212 0.740499 -0.0660358 -0.10699 0.717949 -0.106569 -0.113414 0.724864 0.27759 -0.135326 0.759118 -0.00108072 -0.125212 0.740499 -0.0660358 -0.131733 0.744141 0.27759 -0.131733 0.744141 0.27759 -0.125212 0.740499 -0.0660358 -0.113414 0.724864 0.27759 -0.135694 0.759118 0.27759 -0.135326 0.759118 -0.00108072 -0.131733 0.744141 0.27759 -0.182866 0.759118 -0.339472 -0.241643 0.759118 -0.666992 -0.193516 0.738534 -0.463984 -0.241643 0.759118 -0.666992 -0.227054 0.740499 -0.761237 -0.193516 0.738534 -0.463984 -0.235296 0.759118 -0.842319 -0.227054 0.740499 -0.761237 -0.241643 0.759118 -0.666992 -0.235296 0.759118 -0.842319 -0.221648 0.65237 -0.934256 -0.227054 0.740499 -0.761237 -0.235296 0.759118 -0.842319 -0.211867 0.759118 -0.884567 -0.221648 0.65237 -0.934256 -0.00304013 0.759118 0.999996 -0.0352143 0.759118 0.978427 -0.00304 0.744141 0.978427 -0.00304 0.744141 0.978427 -0.0430376 0.740499 0.931031 -0.00303936 0.724864 0.878668 -0.00304 0.744141 0.978427 -0.0352143 0.759118 0.978427 -0.0430376 0.740499 0.931031 -0.131733 0.794038 0.27759 -0.135326 0.759118 -0.00108072 -0.135694 0.759118 0.27759 -0.125212 0.80253 -0.0660358 -0.135326 0.759118 -0.00108072 -0.131733 0.794038 0.27759 -0.125212 0.80253 -0.0660358 -0.182866 0.759118 -0.339472 -0.135326 0.759118 -0.00108072 -0.193516 0.807112 -0.463984 -0.182866 0.759118 -0.339472 -0.125212 0.80253 -0.0660358 -0.193516 0.807112 -0.463984 -0.241643 0.759118 -0.666992 -0.182866 0.759118 -0.339472 -0.193516 0.807112 -0.463984 -0.227054 0.80253 -0.761237 -0.241643 0.759118 -0.666992 -0.246206 1.14936 -1.059 -0.227054 0.80253 -0.761237 -0.171744 0.838984 -0.680752 -0.227054 0.80253 -0.761237 -0.235296 0.759118 -0.842323 -0.241643 0.759118 -0.666992 -0.246206 1.14936 -1.059 -0.235296 0.759118 -0.842323 -0.227054 0.80253 -0.761237 -0.246206 1.14936 -1.059 -0.211867 0.759118 -0.884567 -0.235296 0.759118 -0.842323 -0.113414 0.838984 0.27759 -0.125212 0.80253 -0.0660358 -0.131733 0.794038 0.27759 -0.10699 0.855105 -0.106569 -0.125212 0.80253 -0.0660358 -0.113414 0.838984 0.27759 -0.10699 0.855105 -0.106569 -0.193516 0.807112 -0.463984 -0.125212 0.80253 -0.0660358 -0.156404 0.855105 -0.47297 -0.193516 0.807112 -0.463984 -0.10699 0.855105 -0.106569 -0.156404 0.855105 -0.47297 -0.227054 0.80253 -0.761237 -0.193516 0.807112 -0.463984 -0.156404 0.855105 -0.47297 -0.171744 0.838984 -0.680752 -0.227054 0.80253 -0.761237 -0.076621 0.878917 0.27759 -0.10699 0.855105 -0.106569 -0.113414 0.838984 0.27759 -0.0580738 0.889352 -0.0822888 -0.10699 0.855105 -0.106569 -0.076621 0.878917 0.27759 -0.0580738 0.889352 -0.0822888 -0.156404 0.855105 -0.47297 -0.10699 0.855105 -0.106569 -0.0580738 0.889352 -0.0822888 -0.0902276 0.878917 -0.361897 -0.156404 0.855105 -0.47297 -0.00919576 0.898799 -0.0271805 -0.0902276 0.878917 -0.361897 -0.0580738 0.889352 -0.0822888 -0.0352099 0.898799 0.27759 -0.0580738 0.889352 -0.0822888 -0.076621 0.878917 0.27759 -0.00919576 0.898799 -0.0271805 -0.0580738 0.889352 -0.0822888 -0.0352099 0.898799 0.27759 -0.00919576 0.898799 -0.0271805 -0.0352099 0.898799 0.27759 -0.0030355 0.903097 0.277591 -0.00303999 0.794038 0.978427 -0.0352143 0.759118 0.978427 -0.00304013 0.759118 0.999996 -0.00303999 0.794038 0.978427 -0.0430376 0.80253 0.931031 -0.0352143 0.759118 0.978427 -0.0352143 0.759118 0.978427 -0.0430376 0.80253 0.931031 -0.076625 0.759118 0.878668 -0.0430376 0.80253 0.931031 -0.0914776 0.807112 0.759194 -0.076625 0.759118 0.878668 -0.076625 0.759118 0.878668 -0.0914776 0.807112 0.759194 -0.113416 0.759118 0.678308 -0.0914776 0.807112 0.759194 -0.123031 0.80253 0.495402 -0.113416 0.759118 0.678308 -0.123031 0.80253 0.495402 -0.131734 0.759118 0.452799 -0.113416 0.759118 0.678308 -0.123031 0.80253 0.495402 -0.131733 0.794038 0.27759 -0.131734 0.759118 0.452799 -0.131733 0.794038 0.27759 -0.135694 0.759118 0.27759 -0.131734 0.759118 0.452799 -0.00303999 0.794038 0.978427 -0.00303936 0.838984 0.878668 -0.0430376 0.80253 0.931031 -0.00303936 0.838984 0.878668 -0.047258 0.855105 0.759194 -0.0430376 0.80253 0.931031 -0.0430376 0.80253 0.931031 -0.047258 0.855105 0.759194 -0.0914776 0.807112 0.759194 -0.047258 0.855105 0.759194 -0.091476 0.855105 0.518391 -0.0914776 0.807112 0.759194 -0.091476 0.855105 0.518391 -0.123031 0.80253 0.495402 -0.0914776 0.807112 0.759194 -0.091476 0.855105 0.518391 -0.113414 0.838984 0.27759 -0.123031 0.80253 0.495402 -0.113414 0.838984 0.27759 -0.131733 0.794038 0.27759 -0.123031 0.80253 0.495402 -0.00303808 0.878917 0.678309 -0.047258 0.855105 0.759194 -0.00303936 0.838984 0.878668 -0.00303808 0.878917 0.678309 -0.0430349 0.889352 0.495403 -0.047258 0.855105 0.759194 -0.0430349 0.889352 0.495403 -0.091476 0.855105 0.518391 -0.047258 0.855105 0.759194 -0.0430349 0.889352 0.495403 -0.076621 0.878917 0.27759 -0.091476 0.855105 0.518391 -0.076621 0.878917 0.27759 -0.113414 0.838984 0.27759 -0.091476 0.855105 0.518391 -0.00303808 0.878917 0.678309 -0.00303664 0.898799 0.4528 -0.0430349 0.889352 0.495403 -0.00303664 0.898799 0.4528 -0.0352099 0.898799 0.27759 -0.0430349 0.889352 0.495403 -0.0352099 0.898799 0.27759 -0.076621 0.878917 0.27759 -0.0430349 0.889352 0.495403 -0.00303551 0.903097 0.277591 -0.0352099 0.898799 0.27759 -0.00303664 0.898799 0.4528 -0.126225 0.85895 -0.510592 -0.171744 0.838984 -0.680752 -0.156404 0.855105 -0.47297 -0.0902276 0.878917 -0.361897 -0.126225 0.85895 -0.510592 -0.156404 0.855105 -0.47297 -0.159365 0.739516 -0.265011 -0.193516 0.738534 -0.463984 -0.10699 0.717949 -0.106569 -0.125212 0.740499 -0.0660358 -0.159365 0.739516 -0.265011 -0.10699 0.717949 -0.106569 -0.171744 0.724864 -0.680752 -0.126225 0.7163 -0.510592 -0.156404 0.717949 -0.47297 -0.156404 0.717949 -0.47297 -0.126225 0.7163 -0.510592 -0.0902276 0.707736 -0.361897 0.0584968 0.693107 -0.188007 0.0300801 0.734624 -0.253822 0.0721283 0.739931 -0.118612 0.0584968 0.693107 -0.188007 0.0380172 0.690461 -0.253357 0.0300801 0.734624 -0.253822 0.036411 0.648327 -0.292226 0.0380172 0.690461 -0.253357 0.0584968 0.693107 -0.188007 0.296012 0.706351 0.270908 0.128173 0.756954 0.279345 0.112384 0.756954 0.588829 -0.221672 0.65237 -0.934251 -0.151089 0.740499 -0.776192 -0.171766 0.724864 -0.680748 -0.0821966 0.717949 -0.490936 -0.171766 0.724864 -0.680748 -0.151089 0.740499 -0.776192 -0.0450844 0.738534 -0.49992 -0.0821966 0.717949 -0.490936 -0.151089 0.740499 -0.776192 0.0414473 0.717949 -0.142505 -0.0821966 0.717949 -0.490936 -0.0450844 0.738534 -0.49992 0.00905313 0.70326 -0.0985401 -0.0902426 0.707736 -0.361894 -0.0821966 0.717949 -0.490936 0.00905313 0.70326 -0.0985401 -0.00920661 0.699209 -0.0271778 -0.0902426 0.707736 -0.361894 0.0414473 0.717949 -0.142505 0.00905313 0.70326 -0.0985401 -0.0821966 0.717949 -0.490936 0.0705411 0.707736 0.27759 0.00905313 0.70326 -0.0985401 0.0414473 0.717949 -0.142505 0.0705411 0.707736 0.27759 0.0414473 0.717949 -0.142505 0.107334 0.724864 0.27759 0.0291299 0.699209 0.27759 -0.00920661 0.699209 -0.0271778 0.00905313 0.70326 -0.0985401 0.0291299 0.699209 0.27759 -0.00304449 0.697365 0.277591 -0.00920661 0.699209 -0.0271778 0.0705411 0.707736 0.27759 0.0291299 0.699209 0.27759 0.00905313 0.70326 -0.0985401 0.0291299 0.699209 0.27759 -0.00304335 0.699209 0.4528 -0.00304447 0.697365 0.277591 0.116951 0.740499 0.495402 0.107334 0.724864 0.27759 0.125653 0.744141 0.27759 0.085396 0.717949 0.518391 0.107334 0.724864 0.27759 0.116951 0.740499 0.495402 0.085396 0.717949 0.518391 0.0705411 0.707736 0.27759 0.107334 0.724864 0.27759 -0.00304191 0.707736 0.678309 0.041178 0.717949 0.759194 -0.00304063 0.724864 0.878668 0.085396 0.717949 0.518391 0.0369549 0.70326 0.495403 0.0705411 0.707736 0.27759 0.0705411 0.707736 0.27759 0.0369549 0.70326 0.495403 0.0291299 0.699209 0.27759 0.085396 0.717949 0.518391 0.041178 0.717949 0.759194 0.0369549 0.70326 0.495403 0.0369549 0.70326 0.495403 0.041178 0.717949 0.759194 -0.00304191 0.707736 0.678309 0.0369549 0.70326 0.495403 -0.00304191 0.707736 0.678309 -0.00304335 0.699209 0.4528 0.0369549 0.70326 0.495403 -0.00304335 0.699209 0.4528 0.0291299 0.699209 0.27759 0.041178 0.717949 0.759194 0.0369577 0.740499 0.931031 -0.00304063 0.724864 0.878668 0.0369577 0.740499 0.931031 0.070545 0.759118 0.878668 0.0291344 0.759118 0.978427 0.116951 0.740499 0.495402 0.107336 0.759118 0.678308 0.0853976 0.738534 0.759194 0.085396 0.717949 0.518391 0.116951 0.740499 0.495402 0.0853976 0.738534 0.759194 0.0853976 0.738534 0.759194 0.107336 0.759118 0.678308 0.070545 0.759118 0.878668 0.0853976 0.738534 0.759194 0.070545 0.759118 0.878668 0.0369577 0.740499 0.931031 0.041178 0.717949 0.759194 0.0853976 0.738534 0.759194 0.0369577 0.740499 0.931031 0.085396 0.717949 0.518391 0.0853976 0.738534 0.759194 0.041178 0.717949 0.759194 0.116951 0.740499 0.495402 0.125654 0.759118 0.452799 0.107336 0.759118 0.678308 0.116951 0.740499 0.495402 0.125653 0.744141 0.27759 0.125654 0.759118 0.452799 0.125654 0.759118 0.452799 0.125653 0.744141 0.27759 0.129614 0.759118 0.27759 0.0155534 0.739516 -0.307358 -0.0450844 0.738534 -0.49992 0.0761915 0.740499 -0.114795 0.0761915 0.740499 -0.114795 -0.0450844 0.738534 -0.49992 0.00239428 0.759118 -0.384322 0.0988058 0.759118 -0.053328 0.0761915 0.740499 -0.114795 0.00239428 0.759118 -0.384322 0.107334 0.724864 0.27759 0.0414473 0.717949 -0.142505 0.0761915 0.740499 -0.114795 0.125653 0.744141 0.27759 0.0761915 0.740499 -0.114795 0.0988058 0.759118 -0.053328 0.107334 0.724864 0.27759 0.0761915 0.740499 -0.114795 0.125653 0.744141 0.27759 0.125653 0.744141 0.27759 0.0988058 0.759118 -0.053328 0.129614 0.759118 0.27759 -0.0450844 0.738534 -0.49992 -0.101867 0.759118 -0.694509 0.00239428 0.759118 -0.384322 -0.0450844 0.738534 -0.49992 -0.151089 0.740499 -0.776192 -0.101867 0.759118 -0.694509 -0.101867 0.759118 -0.694509 -0.151089 0.740499 -0.776192 -0.174195 0.759118 -0.854348 -0.151089 0.740499 -0.776192 -0.221672 0.65237 -0.934251 -0.174195 0.759118 -0.854348 -0.221672 0.65237 -0.934251 -0.21189 0.759118 -0.884562 -0.174195 0.759118 -0.854348 -0.00303999 0.744141 0.978427 0.0291344 0.759118 0.978427 -0.00303985 0.759118 0.999996 -0.00304063 0.724864 0.878668 0.0369577 0.740499 0.931031 -0.00303999 0.744141 0.978427 0.0369577 0.740499 0.931031 0.0291344 0.759118 0.978427 -0.00303999 0.744141 0.978427 0.129614 0.759118 0.27759 0.0988058 0.759118 -0.053328 0.125653 0.794038 0.27759 0.125653 0.794038 0.27759 0.0988058 0.759118 -0.053328 0.0761915 0.80253 -0.114795 0.0988058 0.759118 -0.053328 0.00239428 0.759118 -0.384322 0.0761915 0.80253 -0.114795 0.0761915 0.80253 -0.114795 0.00239428 0.759118 -0.384322 -0.0450844 0.807112 -0.49992 0.00239428 0.759118 -0.384322 -0.101867 0.759118 -0.694509 -0.0450844 0.807112 -0.49992 -0.101867 0.759118 -0.694509 -0.151089 0.80253 -0.776192 -0.0450844 0.807112 -0.49992 -0.171766 0.838984 -0.680748 -0.151089 0.80253 -0.776192 -0.246233 1.14936 -1.05901 -0.101867 0.759118 -0.694509 -0.174196 0.759118 -0.854351 -0.151089 0.80253 -0.776192 -0.151089 0.80253 -0.776192 -0.174196 0.759118 -0.854351 -0.246233 1.14936 -1.05901 -0.174196 0.759118 -0.854351 -0.21189 0.759118 -0.884562 -0.246233 1.14936 -1.05901 0.125653 0.794038 0.27759 0.0761915 0.80253 -0.114795 0.107334 0.838984 0.27759 0.107334 0.838984 0.27759 0.0761915 0.80253 -0.114795 0.0414473 0.855105 -0.142505 0.0761915 0.80253 -0.114795 -0.0450844 0.807112 -0.49992 0.0414473 0.855105 -0.142505 0.0414473 0.855105 -0.142505 -0.0450844 0.807112 -0.49992 -0.0821966 0.855105 -0.490936 -0.0450844 0.807112 -0.49992 -0.151089 0.80253 -0.776192 -0.0821966 0.855105 -0.490936 -0.151089 0.80253 -0.776192 -0.171766 0.838984 -0.680748 -0.0821966 0.855105 -0.490936 0.107334 0.838984 0.27759 0.0414473 0.855105 -0.142505 0.070541 0.878917 0.27759 0.070541 0.878917 0.27759 0.0414473 0.855105 -0.142505 0.00905313 0.889352 -0.0985401 0.0414473 0.855105 -0.142505 -0.0821966 0.855105 -0.490936 0.00905313 0.889352 -0.0985401 -0.0821966 0.855105 -0.490936 -0.0902426 0.878917 -0.361894 0.00905313 0.889352 -0.0985401 0.00905313 0.889352 -0.0985401 -0.0902426 0.878917 -0.361894 -0.00920661 0.898799 -0.0271778 0.070541 0.878917 0.27759 0.00905313 0.889352 -0.0985401 0.0291299 0.898799 0.27759 0.0291299 0.898799 0.27759 0.00905313 0.889352 -0.0985401 -0.00920661 0.898799 -0.0271778 -0.00304449 0.903097 0.277591 0.0291299 0.898799 0.27759 -0.00920661 0.898799 -0.0271778 -0.00303986 0.759118 0.999996 0.0291344 0.759118 0.978427 -0.00303999 0.794038 0.978427 0.0291344 0.759118 0.978427 0.0369577 0.80253 0.931031 -0.00303999 0.794038 0.978427 0.070545 0.759118 0.878668 0.0369577 0.80253 0.931031 0.0291344 0.759118 0.978427 0.070545 0.759118 0.878668 0.0853976 0.807112 0.759194 0.0369577 0.80253 0.931031 0.107336 0.759118 0.678308 0.0853976 0.807112 0.759194 0.070545 0.759118 0.878668 0.107336 0.759118 0.678308 0.116951 0.80253 0.495402 0.0853976 0.807112 0.759194 0.107336 0.759118 0.678308 0.125654 0.759118 0.452799 0.116951 0.80253 0.495402 0.125654 0.759118 0.452799 0.125653 0.794038 0.27759 0.116951 0.80253 0.495402 0.125654 0.759118 0.452799 0.129614 0.759118 0.27759 0.125653 0.794038 0.27759 0.0369577 0.80253 0.931031 -0.00304063 0.838984 0.878668 -0.00303999 0.794038 0.978427 0.0369577 0.80253 0.931031 0.041178 0.855105 0.759194 -0.00304063 0.838984 0.878668 0.0853976 0.807112 0.759194 0.041178 0.855105 0.759194 0.0369577 0.80253 0.931031 0.0853976 0.807112 0.759194 0.085396 0.855105 0.518391 0.041178 0.855105 0.759194 0.0853976 0.807112 0.759194 0.116951 0.80253 0.495402 0.085396 0.855105 0.518391 0.116951 0.80253 0.495402 0.107334 0.838984 0.27759 0.085396 0.855105 0.518391 0.116951 0.80253 0.495402 0.125653 0.794038 0.27759 0.107334 0.838984 0.27759 -0.00304063 0.838984 0.878668 0.041178 0.855105 0.759194 -0.00304191 0.878917 0.678309 0.041178 0.855105 0.759194 0.0369549 0.889352 0.495403 -0.00304191 0.878917 0.678309 0.041178 0.855105 0.759194 0.085396 0.855105 0.518391 0.0369549 0.889352 0.495403 0.085396 0.855105 0.518391 0.070541 0.878917 0.27759 0.0369549 0.889352 0.495403 0.085396 0.855105 0.518391 0.107334 0.838984 0.27759 0.070541 0.878917 0.27759 0.0369549 0.889352 0.495403 -0.00304335 0.898799 0.4528 -0.00304191 0.878917 0.678309 0.0369549 0.889352 0.495403 0.0291299 0.898799 0.27759 -0.00304335 0.898799 0.4528 0.0369549 0.889352 0.495403 0.070541 0.878917 0.27759 0.0291299 0.898799 0.27759 -0.00304335 0.898799 0.4528 0.0291299 0.898799 0.27759 -0.00304448 0.903097 0.277591 -0.0821966 0.855105 -0.490936 -0.171766 0.838984 -0.680748 -0.126242 0.85895 -0.510588 -0.0821966 0.855105 -0.490936 -0.126242 0.85895 -0.510588 -0.0902426 0.878917 -0.361894 0.0414473 0.717949 -0.142505 -0.0450844 0.738534 -0.49992 0.0155534 0.739516 -0.307358 0.0414473 0.717949 -0.142505 0.0155534 0.739516 -0.307358 0.0761915 0.740499 -0.114795 -0.0821966 0.717949 -0.490936 -0.126242 0.7163 -0.510588 -0.171766 0.724864 -0.680748 -0.00303241 0.934544 0.0504887 -0.0026253 0.898799 -0.0279467 -0.00303347 0.900948 0.122661 -0.00303241 0.934544 0.0504887 -0.00303347 0.900948 0.122661 -0.0030355 0.903097 0.277591'/>
69
+ <Color color='0.756863 0.729412 0.537255 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.936863 0.899412 0.667255 0.697647 0.487647 0.377059 0.697647 0.487647 0.377059'/>
70
+ </IndexedFaceSet>
71
+ </Shape>
72
+
73
+ <Shape>
74
+ <IndexedFaceSet coordIndex='0, 1, 2, 3' solid='false' texCoordIndex='0, 1, 2, 3'>
75
+ <TextureCoordinate point='0.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0'/>
76
+ <Coordinate point='-1.5 0.0 0.0 1.5 0.0 0.0 1.5 3.0 0.0 -1.5 3.0 0.0'/>
77
+ </IndexedFaceSet>
78
+ </Shape>
79
+
80
+ </Group>
81
+ </Scene>
82
+ </X3D>
@@ -0,0 +1,54 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
3
+ <X3D profile='Interchange' version='3.0' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance'>
4
+ <head>
5
+ <component level='2' name='TriangleSets'/>
6
+ <unit category='length' conversionFactor='0.001' name='millimeters'/>
7
+ <meta content='TriangleSets.x3d' name='title'/>
8
+ </head>
9
+ <!-- ==================== -->
10
+ <Scene>
11
+ <!-- Default Shapes -->
12
+ <Group>
13
+ <Shape>
14
+ <TriangleFanSet/>
15
+ </Shape>
16
+ <Shape>
17
+ <TriangleSet/>
18
+ </Shape>
19
+ <Shape>
20
+ <TriangleStripSet/>
21
+ </Shape>
22
+ </Group>
23
+ <Group>
24
+ <Shape containerField='shape'>
25
+ <Appearance>
26
+ <Material emissiveColor='0.0 1.0 0.0'/>
27
+ </Appearance>
28
+ <TriangleSet ccw='true' colorPerVertex='true' normalPerVertex='true' solid='true'>
29
+ <Coordinate point='-10.0 0.0 10.0, 10.0 0.0 10.0, 10.0 0.0 -10.0, -10.0 0.0 10.0, 10.0 0.0 -10.0, -10.0 0.0 -10.0'/>
30
+ </TriangleSet>
31
+ </Shape>
32
+ <Shape>
33
+ <TriangleFanSet ccw='true' colorPerVertex='false' fanCount='6 6' normalPerVertex='true' solid='false'>
34
+ <Coordinate point='0 0 0, -.5 -2 .5, -1.5 -2 1, -2.5 -1.5 0.5, -2.5 -.5 0, -2.5 1 .5, 0 0 0, -2.5 1 .5, .5 2 0, 1.5 1.5 .5, 2.5 .5 0, -.5 -2 .5'/>
35
+ <Color color='0.5 0.1 0.5, 0.8 0.3 0.8'/>
36
+ </TriangleFanSet>
37
+ </Shape>
38
+ <Shape>
39
+ <TriangleStripSet ccw='true' colorPerVertex='true' normalPerVertex='true' solid='false' stripCount='13'>
40
+ <Coordinate point='-4.0 -1.0 -.5, -4.5 -2.0 -.5, -3.0 -.5 0, -2.5 -1.5 -.5, -2.0 -.5 -1, -1.5 -1.5 -.5, -.5 .5 -.5, 0 0 0, 1 .5 -.5, 1.5 -2.0 -1, 2.5 -2.0 -.5, 2.5 -2.5 -.5, 3.5 -2.0 -1.0,'/>
41
+ </TriangleStripSet>
42
+ <Appearance>
43
+ <Material diffuseColor='0.5 0.5 0.5'/>
44
+ </Appearance>
45
+ </Shape>
46
+ <Shape>
47
+ <QuadSet ccw='true' colorPerVertex='true' normalPerVertex='true' solid='false'>
48
+ <Coordinate point='-6 -2 0, -1 -2 0, -1 2 0, -6 2 0, 1 -2 0, 6 -2 0, 6 2 0, 1 2 0'/>
49
+ <Color color='0.2 0.2 0.2, 1 0.058824 0.227451, 0.4 1 0.121569, 0 0.007843 0.960784, 0.6 0.235294 0, 0.94902 1 0.380392, 0.239216 1 0.886275, 1 0.121569 0.964706'/>
50
+ </QuadSet>
51
+ </Shape>
52
+ </Group>
53
+ </Scene>
54
+ </X3D>
@@ -91,6 +91,19 @@ test('deserialize X3D 3D triangle sets to JSCAD geometry', (t) => {
91
91
  t.true(geom3.isA(observed[3]))
92
92
  })
93
93
 
94
+ test('deserialize X3D 3D triangle sets with comma delimiters to JSCAD geometry', (t) => {
95
+ const inputPath = path.resolve(samplesPath, 'tests/TriangleSets_CommaMF.x3d')
96
+ const inputFile = fs.readFileSync(inputPath)
97
+
98
+ const observed = deserialize({ output: 'geometry', addMetaData: false }, inputFile)
99
+ t.true(Array.isArray(observed))
100
+ t.is(observed.length, 4)
101
+ t.true(geom3.isA(observed[0]))
102
+ t.true(geom3.isA(observed[1]))
103
+ t.true(geom3.isA(observed[2]))
104
+ t.true(geom3.isA(observed[3]))
105
+ })
106
+
94
107
  test('deserialize X3D 3D transforms to JSCAD geometry', (t) => {
95
108
  const inputPath = path.resolve(samplesPath, 'tests/Transforms.x3d')
96
109
  const inputFile = fs.readFileSync(inputPath)
@@ -119,6 +132,21 @@ test('deserialize X3D 3D indexed triangle sets to JSCAD geometry', (t) => {
119
132
  t.true(geom3.isA(observed[5]))
120
133
  })
121
134
 
135
+ test('deserialize X3D 3D indexed triangle sets with comma delimiters to JSCAD geometry', (t) => {
136
+ const inputPath = path.resolve(samplesPath, 'tests/IndexedTriangleSets_CommaMF.x3d')
137
+ const inputFile = fs.readFileSync(inputPath)
138
+
139
+ const observed = deserialize({ output: 'geometry', addMetaData: false }, inputFile)
140
+ t.true(Array.isArray(observed))
141
+ t.is(observed.length, 6)
142
+ t.true(geom3.isA(observed[0]))
143
+ t.true(geom3.isA(observed[1]))
144
+ t.true(geom3.isA(observed[2]))
145
+ t.true(geom3.isA(observed[3]))
146
+ t.true(geom3.isA(observed[4]))
147
+ t.true(geom3.isA(observed[5]))
148
+ })
149
+
122
150
  test('deserialize X3D 3D groups to JSCAD geometry', (t) => {
123
151
  const inputPath = path.resolve(samplesPath, 'tests/Groups.x3d')
124
152
  const inputFile = fs.readFileSync(inputPath)