From 6ea894a28f5994efa935f757cd7eec7c20b9c82b Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 12 Dec 2017 19:29:21 -0500 Subject: [PATCH 1/2] Fix package name --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 72272e4..d805f15 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "Cesium + Three JS Experiment", + "name": "cesium-threejs-experiment", "version": "1.0.0", "private": true, "description": "Cesium + Three JS Experiment", From f424f3cac9f0c12b9ea6c2dd3b31e37b48e457aa Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 12 Dec 2017 20:35:35 -0500 Subject: [PATCH 2/2] Added obj loader and loading an obj into the scene --- public/CesiumThree.js | 40 +- public/MTLLoader.js | 560 ++++++++++++++++ public/OBJLoader.js | 721 ++++++++++++++++++++ public/sphere.mtl | 10 + public/sphere.obj | 1482 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2806 insertions(+), 7 deletions(-) create mode 100644 public/MTLLoader.js create mode 100644 public/OBJLoader.js create mode 100644 public/sphere.mtl create mode 100644 public/sphere.obj diff --git a/public/CesiumThree.js b/public/CesiumThree.js index d031e72..c6b89e0 100644 --- a/public/CesiumThree.js +++ b/public/CesiumThree.js @@ -6,14 +6,18 @@ define([ 'Cesium/Scene/ShadowMode', 'Cesium/Core/Color', 'Cesium/Core/Math', - 'Three/three.min' + 'Three/three.min', + 'MTLLoader', + 'OBJLoader' ], function( CesiumCartesian3, CesiumViewer, CesiumShadowMode, CesiumColor, CesiumMath, - THREE) { + THREE, + MTLLoader, + OBJLoader) { 'use strict'; var loadingIndicator = document.getElementById('loadingIndicator'); @@ -52,7 +56,6 @@ define([ sceneModePicker:false, navigationHelpButton:false, infoBox : false, - navigationHelpButton:false, navigationInstructionsInitiallyVisible:false, animation : false, timeline : false, @@ -67,7 +70,7 @@ define([ depth:true, stencil:false, anialias:false - }, + } }, targetFrameRate:60, resolutionScale:0.1, @@ -120,7 +123,7 @@ define([ minWGS84[0], minWGS84[1], maxWGS84[0], minWGS84[1], maxWGS84[0], maxWGS84[1], - minWGS84[0], maxWGS84[1], + minWGS84[0], maxWGS84[1] ]), material : CesiumColor.RED.withAlpha(0.2) } @@ -143,7 +146,7 @@ define([ latheMesh.position.z += 15000.0; // translate "up" in Three.js space so the "bottom" of the mesh is the handle latheMesh.rotation.x = Math.PI / 2; // rotate mesh for Cesium's Y-up system var latheMeshYup = new THREE.Group(); - latheMeshYup.add(latheMesh) + latheMeshYup.add(latheMesh); three.scene.add(latheMeshYup); // don’t forget to add it to the Three.js scene manually //Assign Three.js object mesh to our object array @@ -160,7 +163,7 @@ define([ dodecahedronMesh.position.z += 15000.0; // translate "up" in Three.js space so the "bottom" of the mesh is the handle dodecahedronMesh.rotation.x = Math.PI / 2; // rotate mesh for Cesium's Y-up system var dodecahedronMeshYup = new THREE.Group(); - dodecahedronMeshYup.add(dodecahedronMesh) + dodecahedronMeshYup.add(dodecahedronMesh); three.scene.add(dodecahedronMeshYup); // don’t forget to add it to the Three.js scene manually //Assign Three.js object mesh to our object array @@ -169,6 +172,29 @@ define([ _3DOB.minWGS84 = minWGS84; _3DOB.maxWGS84 = maxWGS84; _3Dobjects.push(_3DOB); + + // obj sphere + var mtlLoader = new THREE.MTLLoader(); + mtlLoader.load('sphere.mtl', function(materials) { + materials.preload(); + var objLoader = new THREE.OBJLoader(); + objLoader.setMaterials(materials); + objLoader.load('sphere.obj', function (object) { + object.scale.set(5000,5000,5000); //scale object to be visible at planet scale + object.position.z += 30000.0; // translate "up" in Three.js space so the "bottom" of the mesh is the handle + object.rotation.x = Math.PI / 2; // rotate mesh for Cesium's Y-up system + var objectYup = new THREE.Group(); + objectYup.add(object); + three.scene.add(objectYup); // don’t forget to add it to the Three.js scene manually + + //Assign Three.js object to our object array + _3DOB = new _3DObject(); + _3DOB.threeMesh = objectYup; + _3DOB.minWGS84 = minWGS84; + _3DOB.maxWGS84 = maxWGS84; + _3Dobjects.push(_3DOB); + }); + }); } // Looping Renderer diff --git a/public/MTLLoader.js b/public/MTLLoader.js new file mode 100644 index 0000000..7242266 --- /dev/null +++ b/public/MTLLoader.js @@ -0,0 +1,560 @@ +define([ + 'Three/three.min' + ], function( + THREE) { + 'use strict'; + + /** + * Loads a Wavefront .mtl file specifying materials + * + * @author angelxuanchang + */ + + THREE.MTLLoader = function ( manager ) { + + this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; + + }; + + THREE.MTLLoader.prototype = { + + constructor: THREE.MTLLoader, + + /** + * Loads and parses a MTL asset from a URL. + * + * @param {String} url - URL to the MTL file. + * @param {Function} [onLoad] - Callback invoked with the loaded object. + * @param {Function} [onProgress] - Callback for download progress. + * @param {Function} [onError] - Callback for download errors. + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to load. + */ + load: function ( url, onLoad, onProgress, onError ) { + + var scope = this; + + var loader = new THREE.FileLoader( this.manager ); + loader.setPath( this.path ); + loader.load( url, function ( text ) { + + onLoad( scope.parse( text ) ); + + }, onProgress, onError ); + + }, + + /** + * Set base path for resolving references. + * If set this path will be prepended to each loaded and found reference. + * + * @see setTexturePath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setPath: function ( path ) { + + this.path = path; + + }, + + /** + * Set base path for resolving texture references. + * If set this path will be prepended found texture reference. + * If not set and setPath is, it will be used as texture base path. + * + * @see setPath + * @param {String} path + * + * @example + * mtlLoader.setPath( 'assets/obj/' ); + * mtlLoader.setTexturePath( 'assets/textures/' ); + * mtlLoader.load( 'my.mtl', ... ); + */ + setTexturePath: function ( path ) { + + this.texturePath = path; + + }, + + setBaseUrl: function ( path ) { + + console.warn( 'THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.' ); + + this.setTexturePath( path ); + + }, + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setMaterialOptions: function ( value ) { + + this.materialOptions = value; + + }, + + /** + * Parses a MTL file. + * + * @param {String} text - Content of MTL file + * @return {THREE.MTLLoader.MaterialCreator} + * + * @see setPath setTexturePath + * + * @note In order for relative texture references to resolve correctly + * you must call setPath and/or setTexturePath explicitly prior to parse. + */ + parse: function ( text ) { + + var lines = text.split( '\n' ); + var info = {}; + var delimiter_pattern = /\s+/; + var materialsInfo = {}; + + for ( var i = 0; i < lines.length; i ++ ) { + + var line = lines[ i ]; + line = line.trim(); + + if ( line.length === 0 || line.charAt( 0 ) === '#' ) { + + // Blank line or comment ignore + continue; + + } + + var pos = line.indexOf( ' ' ); + + var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line; + key = key.toLowerCase(); + + var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : ''; + value = value.trim(); + + if ( key === 'newmtl' ) { + + // New material + + info = { name: value }; + materialsInfo[ value ] = info; + + } else if ( info ) { + + if ( key === 'ka' || key === 'kd' || key === 'ks' ) { + + var ss = value.split( delimiter_pattern, 3 ); + info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ]; + + } else { + + info[ key ] = value; + + } + + } + + } + + var materialCreator = new THREE.MTLLoader.MaterialCreator( this.texturePath || this.path, this.materialOptions ); + materialCreator.setCrossOrigin( this.crossOrigin ); + materialCreator.setManager( this.manager ); + materialCreator.setMaterials( materialsInfo ); + return materialCreator; + + } + + }; + + /** + * Create a new THREE-MTLLoader.MaterialCreator + * @param baseUrl - Url relative to which textures are loaded + * @param options - Set of options on how to construct the materials + * side: Which side to apply the material + * THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide + * wrap: What type of wrapping to apply for textures + * THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping + * normalizeRGB: RGBs need to be normalized to 0-1 from 0-255 + * Default: false, assumed to be already normalized + * ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's + * Default: false + * @constructor + */ + + THREE.MTLLoader.MaterialCreator = function ( baseUrl, options ) { + + this.baseUrl = baseUrl || ''; + this.options = options; + this.materialsInfo = {}; + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + this.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide; + this.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping; + + }; + + THREE.MTLLoader.MaterialCreator.prototype = { + + constructor: THREE.MTLLoader.MaterialCreator, + + crossOrigin: 'Anonymous', + + setCrossOrigin: function ( value ) { + + this.crossOrigin = value; + + }, + + setManager: function ( value ) { + + this.manager = value; + + }, + + setMaterials: function ( materialsInfo ) { + + this.materialsInfo = this.convert( materialsInfo ); + this.materials = {}; + this.materialsArray = []; + this.nameLookup = {}; + + }, + + convert: function ( materialsInfo ) { + + if ( ! this.options ) return materialsInfo; + + var converted = {}; + + for ( var mn in materialsInfo ) { + + // Convert materials info into normalized form based on options + + var mat = materialsInfo[ mn ]; + + var covmat = {}; + + converted[ mn ] = covmat; + + for ( var prop in mat ) { + + var save = true; + var value = mat[ prop ]; + var lprop = prop.toLowerCase(); + + switch ( lprop ) { + + case 'kd': + case 'ka': + case 'ks': + + // Diffuse color (color under white light) using RGB values + + if ( this.options && this.options.normalizeRGB ) { + + value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ]; + + } + + if ( this.options && this.options.ignoreZeroRGBs ) { + + if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) { + + // ignore + + save = false; + + } + + } + + break; + + default: + + break; + + } + + if ( save ) { + + covmat[ lprop ] = value; + + } + + } + + } + + return converted; + + }, + + preload: function () { + + for ( var mn in this.materialsInfo ) { + + this.create( mn ); + + } + + }, + + getIndex: function ( materialName ) { + + return this.nameLookup[ materialName ]; + + }, + + getAsArray: function () { + + var index = 0; + + for ( var mn in this.materialsInfo ) { + + this.materialsArray[ index ] = this.create( mn ); + this.nameLookup[ mn ] = index; + index ++; + + } + + return this.materialsArray; + + }, + + create: function ( materialName ) { + + if ( this.materials[ materialName ] === undefined ) { + + this.createMaterial_( materialName ); + + } + + return this.materials[ materialName ]; + + }, + + createMaterial_: function ( materialName ) { + + // Create material + + var scope = this; + var mat = this.materialsInfo[ materialName ]; + var params = { + + name: materialName, + side: this.side + + }; + + function resolveURL( baseUrl, url ) { + + if ( typeof url !== 'string' || url === '' ) + return ''; + + // Absolute URL + if ( /^https?:\/\//i.test( url ) ) return url; + + return baseUrl + url; + + } + + function setMapForType( mapType, value ) { + + if ( params[ mapType ] ) return; // Keep the first encountered texture + + var texParams = scope.getTextureParams( value, params ); + var map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) ); + + map.repeat.copy( texParams.scale ); + map.offset.copy( texParams.offset ); + + map.wrapS = scope.wrap; + map.wrapT = scope.wrap; + + params[ mapType ] = map; + + } + + for ( var prop in mat ) { + + var value = mat[ prop ]; + var n; + + if ( value === '' ) continue; + + switch ( prop.toLowerCase() ) { + + // Ns is material specular exponent + + case 'kd': + + // Diffuse color (color under white light) using RGB values + + params.color = new THREE.Color().fromArray( value ); + + break; + + case 'ks': + + // Specular color (color when light is reflected from shiny surface) using RGB values + params.specular = new THREE.Color().fromArray( value ); + + break; + + case 'map_kd': + + // Diffuse texture map + + setMapForType( "map", value ); + + break; + + case 'map_ks': + + // Specular map + + setMapForType( "specularMap", value ); + + break; + + case 'norm': + + setMapForType( "normalMap", value ); + + break; + + case 'map_bump': + case 'bump': + + // Bump texture map + + setMapForType( "bumpMap", value ); + + break; + + case 'ns': + + // The specular exponent (defines the focus of the specular highlight) + // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000. + + params.shininess = parseFloat( value ); + + break; + + case 'd': + n = parseFloat( value ); + + if ( n < 1 ) { + + params.opacity = n; + params.transparent = true; + + } + + break; + + case 'tr': + n = parseFloat( value ); + + if ( n > 0 ) { + + params.opacity = 1 - n; + params.transparent = true; + + } + + break; + + default: + break; + + } + + } + + this.materials[ materialName ] = new THREE.MeshPhongMaterial( params ); + return this.materials[ materialName ]; + + }, + + getTextureParams: function ( value, matParams ) { + + var texParams = { + + scale: new THREE.Vector2( 1, 1 ), + offset: new THREE.Vector2( 0, 0 ) + + }; + + var items = value.split( /\s+/ ); + var pos; + + pos = items.indexOf( '-bm' ); + + if ( pos >= 0 ) { + + matParams.bumpScale = parseFloat( items[ pos + 1 ] ); + items.splice( pos, 2 ); + + } + + pos = items.indexOf( '-s' ); + + if ( pos >= 0 ) { + + texParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + pos = items.indexOf( '-o' ); + + if ( pos >= 0 ) { + + texParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) ); + items.splice( pos, 4 ); // we expect 3 parameters here! + + } + + texParams.url = items.join( ' ' ).trim(); + return texParams; + + }, + + loadTexture: function ( url, mapping, onLoad, onProgress, onError ) { + + var texture; + var loader = THREE.Loader.Handlers.get( url ); + var manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager; + + if ( loader === null ) { + + loader = new THREE.TextureLoader( manager ); + + } + + if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin ); + texture = loader.load( url, onLoad, onProgress, onError ); + + if ( mapping !== undefined ) texture.mapping = mapping; + + return texture; + + } + + }; + + return THREE.MTLLoader; +}); diff --git a/public/OBJLoader.js b/public/OBJLoader.js new file mode 100644 index 0000000..aa85591 --- /dev/null +++ b/public/OBJLoader.js @@ -0,0 +1,721 @@ +define([ + 'Three/three.min' + ], function( + THREE) { + 'use strict'; + + /** + * @author mrdoob / http://mrdoob.com/ + */ + + THREE.OBJLoader = (function () { + // o object_name | g group_name + var object_pattern = /^[og]\s*(.+)?/; + // mtllib file_reference + var material_library_pattern = /^mtllib /; + // usemtl material_name + var material_use_pattern = /^usemtl /; + + function ParserState() { + + var state = { + objects: [], + object: {}, + + vertices: [], + normals: [], + colors: [], + uvs: [], + + materialLibraries: [], + + startObject: function (name, fromDeclaration) { + + // If the current object (initial from reset) is not from a g/o declaration in the parsed + // file. We need to use it for the first parsed g/o to keep things in sync. + if (this.object && this.object.fromDeclaration === false) { + + this.object.name = name; + this.object.fromDeclaration = (fromDeclaration !== false); + return; + + } + + var previousMaterial = (this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined); + + if (this.object && typeof this.object._finalize === 'function') { + + this.object._finalize(true); + + } + + this.object = { + name: name || '', + fromDeclaration: (fromDeclaration !== false), + + geometry: { + vertices: [], + normals: [], + colors: [], + uvs: [] + }, + materials: [], + smooth: true, + + startMaterial: function (name, libraries) { + + var previous = this._finalize(false); + + // New usemtl declaration overwrites an inherited material, except if faces were declared + // after the material, then it must be preserved for proper MultiMaterial continuation. + if (previous && (previous.inherited || previous.groupCount <= 0)) { + + this.materials.splice(previous.index, 1); + + } + + var material = { + index: this.materials.length, + name: name || '', + mtllib: (Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : ''), + smooth: (previous !== undefined ? previous.smooth : this.smooth), + groupStart: (previous !== undefined ? previous.groupEnd : 0), + groupEnd: -1, + groupCount: -1, + inherited: false, + + clone: function (index) { + + var cloned = { + index: (typeof index === 'number' ? index : this.index), + name: this.name, + mtllib: this.mtllib, + smooth: this.smooth, + groupStart: 0, + groupEnd: -1, + groupCount: -1, + inherited: false + }; + cloned.clone = this.clone.bind(cloned); + return cloned; + + } + }; + + this.materials.push(material); + + return material; + + }, + + currentMaterial: function () { + + if (this.materials.length > 0) { + + return this.materials[this.materials.length - 1]; + + } + + return undefined; + + }, + + _finalize: function (end) { + + var lastMultiMaterial = this.currentMaterial(); + if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) { + + lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3; + lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart; + lastMultiMaterial.inherited = false; + + } + + // Ignore objects tail materials if no face declarations followed them before a new o/g started. + if (end && this.materials.length > 1) { + + for (var mi = this.materials.length - 1; mi >= 0; mi--) { + + if (this.materials[mi].groupCount <= 0) { + + this.materials.splice(mi, 1); + + } + + } + + } + + // Guarantee at least one empty material, this makes the creation later more straight forward. + if (end && this.materials.length === 0) { + + this.materials.push({ + name: '', + smooth: this.smooth + }); + + } + + return lastMultiMaterial; + + } + }; + + // Inherit previous objects material. + // Spec tells us that a declared material must be set to all objects until a new material is declared. + // If a usemtl declaration is encountered while this new object is being parsed, it will + // overwrite the inherited material. Exception being that there was already face declarations + // to the inherited material, then it will be preserved for proper MultiMaterial continuation. + + if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') { + + var declared = previousMaterial.clone(0); + declared.inherited = true; + this.object.materials.push(declared); + + } + + this.objects.push(this.object); + + }, + + finalize: function () { + + if (this.object && typeof this.object._finalize === 'function') { + + this.object._finalize(true); + + } + + }, + + parseVertexIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + + }, + + parseNormalIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 3) * 3; + + }, + + parseUVIndex: function (value, len) { + + var index = parseInt(value, 10); + return (index >= 0 ? index - 1 : index + len / 2) * 2; + + }, + + addVertex: function (a, b, c) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + + }, + + addVertexLine: function (a) { + + var src = this.vertices; + var dst = this.object.geometry.vertices; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + + }, + + addNormal: function (a, b, c) { + + var src = this.normals; + var dst = this.object.geometry.normals; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + + }, + + addColor: function (a, b, c) { + + var src = this.colors; + var dst = this.object.geometry.colors; + + dst.push(src[a + 0], src[a + 1], src[a + 2]); + dst.push(src[b + 0], src[b + 1], src[b + 2]); + dst.push(src[c + 0], src[c + 1], src[c + 2]); + + }, + + addUV: function (a, b, c) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push(src[a + 0], src[a + 1]); + dst.push(src[b + 0], src[b + 1]); + dst.push(src[c + 0], src[c + 1]); + + }, + + addUVLine: function (a) { + + var src = this.uvs; + var dst = this.object.geometry.uvs; + + dst.push(src[a + 0], src[a + 1]); + + }, + + addFace: function (a, b, c, ua, ub, uc, na, nb, nc) { + + var vLen = this.vertices.length; + + var ia = this.parseVertexIndex(a, vLen); + var ib = this.parseVertexIndex(b, vLen); + var ic = this.parseVertexIndex(c, vLen); + + this.addVertex(ia, ib, ic); + + if (ua !== undefined) { + + var uvLen = this.uvs.length; + + ia = this.parseUVIndex(ua, uvLen); + ib = this.parseUVIndex(ub, uvLen); + ic = this.parseUVIndex(uc, uvLen); + + this.addUV(ia, ib, ic); + + } + + if (na !== undefined) { + + // Normals are many times the same. If so, skip function call and parseInt. + var nLen = this.normals.length; + ia = this.parseNormalIndex(na, nLen); + + ib = na === nb ? ia : this.parseNormalIndex(nb, nLen); + ic = na === nc ? ia : this.parseNormalIndex(nc, nLen); + + this.addNormal(ia, ib, ic); + + } + + if (this.colors.length > 0) { + + this.addColor(ia, ib, ic); + + } + + }, + + addLineGeometry: function (vertices, uvs) { + + this.object.geometry.type = 'Line'; + + var vLen = this.vertices.length; + var uvLen = this.uvs.length; + + for (var vi = 0, l = vertices.length; vi < l; vi++) { + + this.addVertexLine(this.parseVertexIndex(vertices[vi], vLen)); + + } + + for (var uvi = 0, l = uvs.length; uvi < l; uvi++) { + + this.addUVLine(this.parseUVIndex(uvs[uvi], uvLen)); + + } + + } + + }; + + state.startObject('', false); + + return state; + + } + + // + + function OBJLoader(manager) { + + this.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager; + + this.materials = null; + + } + + OBJLoader.prototype = { + + constructor: OBJLoader, + + load: function (url, onLoad, onProgress, onError) { + + var scope = this; + + var loader = new THREE.FileLoader(scope.manager); + loader.setPath(this.path); + loader.load(url, function (text) { + + onLoad(scope.parse(text)); + + }, onProgress, onError); + + }, + + setPath: function (value) { + + this.path = value; + + }, + + setMaterials: function (materials) { + + this.materials = materials; + + return this; + + }, + + parse: function (text) { + + console.time('OBJLoader'); + + var state = new ParserState(); + + if (text.indexOf('\r\n') !== -1) { + + // This is faster than String.split with regex that splits on both + text = text.replace(/\r\n/g, '\n'); + + } + + if (text.indexOf('\\\n') !== -1) { + + // join lines separated by a line continuation character (\) + text = text.replace(/\\\n/g, ''); + + } + + var lines = text.split('\n'); + var line = '', lineFirstChar = ''; + var lineLength = 0; + var result = []; + + // Faster to just trim left side of the line. Use if available. + var trimLeft = (typeof ''.trimLeft === 'function'); + + for (var i = 0, l = lines.length; i < l; i++) { + + line = lines[i]; + + line = trimLeft ? line.trimLeft() : line.trim(); + + lineLength = line.length; + + if (lineLength === 0) continue; + + lineFirstChar = line.charAt(0); + + // @todo invoke passed in handler if any + if (lineFirstChar === '#') continue; + + if (lineFirstChar === 'v') { + + var data = line.split(/\s+/); + + switch (data[0]) { + + case 'v': + state.vertices.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + if (data.length === 8) { + + state.colors.push( + parseFloat(data[4]), + parseFloat(data[5]), + parseFloat(data[6]) + ); + + } + break; + case 'vn': + state.normals.push( + parseFloat(data[1]), + parseFloat(data[2]), + parseFloat(data[3]) + ); + break; + case 'vt': + state.uvs.push( + parseFloat(data[1]), + parseFloat(data[2]) + ); + break; + + } + + } else if (lineFirstChar === 'f') { + + var lineData = line.substr(1).trim(); + var vertexData = lineData.split(/\s+/); + var faceVertices = []; + + // Parse the face vertex data into an easy to work with format + + for (var j = 0, jl = vertexData.length; j < jl; j++) { + + var vertex = vertexData[j]; + + if (vertex.length > 0) { + + var vertexParts = vertex.split('/'); + faceVertices.push(vertexParts); + + } + + } + + // Draw an edge between the first vertex and all subsequent vertices to form an n-gon + + var v1 = faceVertices[0]; + + for (var j = 1, jl = faceVertices.length - 1; j < jl; j++) { + + var v2 = faceVertices[j]; + var v3 = faceVertices[j + 1]; + + state.addFace( + v1[0], v2[0], v3[0], + v1[1], v2[1], v3[1], + v1[2], v2[2], v3[2] + ); + + } + + } else if (lineFirstChar === 'l') { + + var lineParts = line.substring(1).trim().split(" "); + var lineVertices = [], lineUVs = []; + + if (line.indexOf("/") === -1) { + + lineVertices = lineParts; + + } else { + + for (var li = 0, llen = lineParts.length; li < llen; li++) { + + var parts = lineParts[li].split("/"); + + if (parts[0] !== "") lineVertices.push(parts[0]); + if (parts[1] !== "") lineUVs.push(parts[1]); + + } + + } + state.addLineGeometry(lineVertices, lineUVs); + + } else if ((result = object_pattern.exec(line)) !== null) { + + // o object_name + // or + // g group_name + + // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869 + // var name = result[ 0 ].substr( 1 ).trim(); + var name = (" " + result[0].substr(1).trim()).substr(1); + + state.startObject(name); + + } else if (material_use_pattern.test(line)) { + + // material + + state.object.startMaterial(line.substring(7).trim(), state.materialLibraries); + + } else if (material_library_pattern.test(line)) { + + // mtl file + + state.materialLibraries.push(line.substring(7).trim()); + + } else if (lineFirstChar === 's') { + + result = line.split(' '); + + // smooth shading + + // @todo Handle files that have varying smooth values for a set of faces inside one geometry, + // but does not define a usemtl for each face set. + // This should be detected and a dummy material created (later MultiMaterial and geometry groups). + // This requires some care to not create extra material on each smooth value for "normal" obj files. + // where explicit usemtl defines geometry groups. + // Example asset: examples/models/obj/cerberus/Cerberus.obj + + /* + * http://paulbourke.net/dataformats/obj/ + * or + * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf + * + * From chapter "Grouping" Syntax explanation "s group_number": + * "group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off. + * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form + * surfaces, smoothing groups are either turned on or off; there is no difference between values greater + * than 0." + */ + if (result.length > 1) { + + var value = result[1].trim().toLowerCase(); + state.object.smooth = (value !== '0' && value !== 'off'); + + } else { + + // ZBrush can produce "s" lines #11707 + state.object.smooth = true; + + } + var material = state.object.currentMaterial(); + if (material) material.smooth = state.object.smooth; + + } else { + + // Handle null terminated files without exception + if (line === '\0') continue; + + throw new Error('THREE.OBJLoader: Unexpected line: "' + line + '"'); + + } + + } + + state.finalize(); + + var container = new THREE.Group(); + container.materialLibraries = [].concat(state.materialLibraries); + + for (var i = 0, l = state.objects.length; i < l; i++) { + + var object = state.objects[i]; + var geometry = object.geometry; + var materials = object.materials; + var isLine = (geometry.type === 'Line'); + + // Skip o/g line declarations that did not follow with any faces + if (geometry.vertices.length === 0) continue; + + var buffergeometry = new THREE.BufferGeometry(); + + buffergeometry.addAttribute('position', new THREE.Float32BufferAttribute(geometry.vertices, 3)); + + if (geometry.normals.length > 0) { + + buffergeometry.addAttribute('normal', new THREE.Float32BufferAttribute(geometry.normals, 3)); + + } else { + + buffergeometry.computeVertexNormals(); + + } + + if (geometry.colors.length > 0) { + + buffergeometry.addAttribute('color', new THREE.Float32BufferAttribute(geometry.colors, 3)); + + } + + if (geometry.uvs.length > 0) { + + buffergeometry.addAttribute('uv', new THREE.Float32BufferAttribute(geometry.uvs, 2)); + + } + + // Create materials + + var createdMaterials = []; + + for (var mi = 0, miLen = materials.length; mi < miLen; mi++) { + + var sourceMaterial = materials[mi]; + var material = undefined; + + if (this.materials !== null) { + + material = this.materials.create(sourceMaterial.name); + + // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material. + if (isLine && material && !(material instanceof THREE.LineBasicMaterial)) { + + var materialLine = new THREE.LineBasicMaterial(); + materialLine.copy(material); + material = materialLine; + + } + + } + + if (!material) { + + material = (!isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial()); + material.name = sourceMaterial.name; + + } + + material.flatShading = sourceMaterial.smooth ? false : true; + + createdMaterials.push(material); + + } + + // Create mesh + + var mesh; + + if (createdMaterials.length > 1) { + + for (var mi = 0, miLen = materials.length; mi < miLen; mi++) { + + var sourceMaterial = materials[mi]; + buffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi); + + } + + mesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials) : new THREE.LineSegments(buffergeometry, createdMaterials)); + + } else { + + mesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials[0]) : new THREE.LineSegments(buffergeometry, createdMaterials[0])); + + } + + mesh.name = object.name; + + container.add(mesh); + + } + + console.timeEnd('OBJLoader'); + + return container; + + } + + }; + + return OBJLoader; + })(); + + return THREE.OBJLoader; +}); diff --git a/public/sphere.mtl b/public/sphere.mtl new file mode 100644 index 0000000..70d3ba1 --- /dev/null +++ b/public/sphere.mtl @@ -0,0 +1,10 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl None +Ns 0 +Ka 0.000000 0.000000 0.000000 +Kd 0.8 0.8 0.8 +Ks 0.8 0.8 0.8 +d 1 +illum 2 diff --git a/public/sphere.obj b/public/sphere.obj new file mode 100644 index 0000000..8dbafe3 --- /dev/null +++ b/public/sphere.obj @@ -0,0 +1,1482 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib sphere.mtl +o Sphere +v 0.000000 -1.000000 0.000000 +v 0.038060 0.980785 -0.191342 +v 0.074658 0.923880 -0.375330 +v 0.108386 0.831470 -0.544895 +v 0.137950 0.707107 -0.693520 +v 0.162212 0.555570 -0.815493 +v 0.180240 0.382683 -0.906127 +v 0.191342 0.195090 -0.961940 +v 0.195090 0.000000 -0.980785 +v 0.191342 -0.195090 -0.961940 +v 0.180240 -0.382683 -0.906127 +v 0.162212 -0.555570 -0.815493 +v 0.137950 -0.707107 -0.693520 +v 0.108386 -0.831470 -0.544895 +v 0.074658 -0.923880 -0.375330 +v 0.038060 -0.980785 -0.191341 +v 0.074658 0.980785 -0.180240 +v 0.146447 0.923880 -0.353553 +v 0.212608 0.831470 -0.513280 +v 0.270598 0.707107 -0.653281 +v 0.318190 0.555570 -0.768178 +v 0.353553 0.382683 -0.853553 +v 0.375330 0.195090 -0.906127 +v 0.382684 0.000000 -0.923879 +v 0.375330 -0.195090 -0.906127 +v 0.353554 -0.382683 -0.853553 +v 0.318190 -0.555570 -0.768178 +v 0.270598 -0.707107 -0.653281 +v 0.212608 -0.831470 -0.513280 +v 0.146447 -0.923880 -0.353553 +v 0.074658 -0.980785 -0.180240 +v 0.108387 0.980785 -0.162212 +v 0.212608 0.923880 -0.318190 +v 0.308658 0.831470 -0.461940 +v 0.392848 0.707107 -0.587938 +v 0.461940 0.555570 -0.691342 +v 0.513280 0.382683 -0.768178 +v 0.544895 0.195090 -0.815493 +v 0.555570 0.000000 -0.831469 +v 0.544895 -0.195090 -0.815493 +v 0.513280 -0.382683 -0.768178 +v 0.461940 -0.555570 -0.691342 +v 0.392848 -0.707107 -0.587938 +v 0.308658 -0.831470 -0.461940 +v 0.212608 -0.923880 -0.318189 +v 0.108386 -0.980785 -0.162211 +v 0.137950 0.980785 -0.137950 +v 0.270598 0.923880 -0.270598 +v 0.392848 0.831470 -0.392847 +v 0.500000 0.707107 -0.500000 +v 0.587938 0.555570 -0.587938 +v 0.653282 0.382683 -0.653281 +v 0.693520 0.195090 -0.693520 +v 0.707107 0.000000 -0.707107 +v 0.693520 -0.195090 -0.693520 +v 0.653282 -0.382683 -0.653281 +v 0.587938 -0.555570 -0.587938 +v 0.500000 -0.707107 -0.500000 +v 0.392848 -0.831470 -0.392847 +v 0.270598 -0.923880 -0.270598 +v 0.137950 -0.980785 -0.137949 +v 0.162212 0.980785 -0.108386 +v 0.318190 0.923880 -0.212607 +v 0.461940 0.831470 -0.308658 +v 0.587938 0.707107 -0.392847 +v 0.691342 0.555570 -0.461940 +v 0.768178 0.382683 -0.513280 +v 0.815493 0.195090 -0.544895 +v 0.831470 0.000000 -0.555570 +v 0.815493 -0.195090 -0.544895 +v 0.768178 -0.382683 -0.513280 +v 0.691342 -0.555570 -0.461940 +v 0.587938 -0.707107 -0.392847 +v 0.461940 -0.831470 -0.308658 +v 0.318190 -0.923880 -0.212607 +v 0.162212 -0.980785 -0.108386 +v 0.180240 0.980785 -0.074658 +v 0.353554 0.923880 -0.146446 +v 0.513280 0.831470 -0.212607 +v 0.653282 0.707107 -0.270598 +v 0.768178 0.555570 -0.318189 +v 0.853554 0.382683 -0.353553 +v 0.906128 0.195090 -0.375330 +v 0.923880 0.000000 -0.382683 +v 0.906128 -0.195090 -0.375330 +v 0.853554 -0.382683 -0.353553 +v 0.768178 -0.555570 -0.318189 +v 0.653282 -0.707107 -0.270598 +v 0.513280 -0.831470 -0.212607 +v 0.353554 -0.923880 -0.146446 +v 0.180240 -0.980785 -0.074658 +v 0.191342 0.980785 -0.038060 +v 0.375331 0.923880 -0.074658 +v 0.544895 0.831470 -0.108386 +v 0.693520 0.707107 -0.137949 +v 0.815493 0.555570 -0.162211 +v 0.906128 0.382683 -0.180240 +v 0.961940 0.195090 -0.191341 +v 0.980785 0.000000 -0.195090 +v 0.961940 -0.195090 -0.191341 +v 0.906128 -0.382683 -0.180240 +v 0.815493 -0.555570 -0.162211 +v 0.693520 -0.707107 -0.137949 +v 0.544895 -0.831470 -0.108386 +v 0.375330 -0.923880 -0.074658 +v 0.191342 -0.980785 -0.038060 +v 0.195091 0.980785 0.000000 +v 0.382684 0.923880 0.000000 +v 0.555570 0.831470 0.000000 +v 0.707107 0.707107 0.000000 +v 0.831470 0.555570 0.000000 +v 0.923880 0.382683 0.000000 +v 0.980785 0.195090 0.000000 +v 1.000000 0.000000 0.000000 +v 0.980785 -0.195090 0.000000 +v 0.923880 -0.382683 0.000000 +v 0.831470 -0.555570 0.000000 +v 0.707107 -0.707107 0.000000 +v 0.555570 -0.831470 0.000000 +v 0.382684 -0.923880 0.000000 +v 0.195090 -0.980785 0.000000 +v 0.191342 0.980785 0.038061 +v 0.375331 0.923880 0.074658 +v 0.544895 0.831470 0.108387 +v 0.693520 0.707107 0.137950 +v 0.815493 0.555570 0.162212 +v 0.906128 0.382683 0.180240 +v 0.961940 0.195090 0.191342 +v 0.980785 0.000000 0.195091 +v 0.961940 -0.195090 0.191342 +v 0.906128 -0.382683 0.180240 +v 0.815493 -0.555570 0.162212 +v 0.693520 -0.707107 0.137950 +v 0.544895 -0.831470 0.108387 +v 0.375330 -0.923880 0.074658 +v 0.191342 -0.980785 0.038061 +v 0.180240 0.980785 0.074658 +v 0.353554 0.923880 0.146447 +v 0.513280 0.831470 0.212608 +v 0.653282 0.707107 0.270598 +v 0.768178 0.555570 0.318190 +v 0.853554 0.382683 0.353554 +v 0.906127 0.195090 0.375331 +v 0.923880 0.000000 0.382684 +v 0.906127 -0.195090 0.375331 +v 0.853554 -0.382683 0.353554 +v 0.768178 -0.555570 0.318190 +v 0.653282 -0.707107 0.270598 +v 0.513280 -0.831470 0.212608 +v 0.353553 -0.923880 0.146447 +v 0.180240 -0.980785 0.074658 +v 0.162212 0.980785 0.108387 +v 0.318190 0.923880 0.212608 +v 0.461940 0.831470 0.308659 +v 0.587938 0.707107 0.392848 +v 0.691342 0.555570 0.461940 +v 0.768178 0.382683 0.513280 +v 0.815493 0.195090 0.544895 +v 0.831470 0.000000 0.555571 +v 0.815493 -0.195090 0.544895 +v 0.768178 -0.382683 0.513280 +v 0.691342 -0.555570 0.461940 +v 0.587938 -0.707107 0.392848 +v 0.461940 -0.831470 0.308659 +v 0.318190 -0.923880 0.212608 +v 0.162212 -0.980785 0.108387 +v 0.137950 0.980785 0.137950 +v 0.270598 0.923880 0.270599 +v 0.392848 0.831470 0.392848 +v 0.500000 0.707107 0.500000 +v 0.587938 0.555570 0.587938 +v 0.653282 0.382683 0.653282 +v 0.693520 0.195090 0.693520 +v 0.707107 0.000000 0.707107 +v 0.693520 -0.195090 0.693520 +v 0.653282 -0.382683 0.653282 +v 0.587938 -0.555570 0.587938 +v 0.500000 -0.707107 0.500000 +v 0.392848 -0.831470 0.392848 +v 0.270598 -0.923880 0.270598 +v 0.137950 -0.980785 0.137950 +v 0.108386 0.980785 0.162212 +v 0.212608 0.923880 0.318190 +v 0.308658 0.831470 0.461940 +v 0.392848 0.707107 0.587938 +v 0.461940 0.555570 0.691342 +v 0.513280 0.382683 0.768178 +v 0.544895 0.195090 0.815493 +v 0.555570 0.000000 0.831470 +v 0.544895 -0.195090 0.815493 +v 0.513280 -0.382683 0.768178 +v 0.461940 -0.555570 0.691342 +v 0.392848 -0.707107 0.587938 +v 0.308658 -0.831470 0.461940 +v 0.212608 -0.923880 0.318190 +v 0.108386 -0.980785 0.162212 +v 0.074658 0.980785 0.180240 +v 0.146447 0.923880 0.353554 +v 0.212608 0.831470 0.513280 +v 0.270598 0.707107 0.653282 +v 0.318190 0.555570 0.768178 +v 0.353553 0.382683 0.853554 +v 0.375330 0.195090 0.906128 +v 0.382683 0.000000 0.923880 +v 0.375330 -0.195090 0.906128 +v 0.353553 -0.382683 0.853554 +v 0.318190 -0.555570 0.768178 +v 0.270598 -0.707107 0.653282 +v 0.212608 -0.831470 0.513280 +v 0.146447 -0.923880 0.353554 +v 0.074658 -0.980785 0.180240 +v 0.038060 0.980785 0.191342 +v 0.074658 0.923880 0.375331 +v 0.108386 0.831470 0.544896 +v 0.137950 0.707107 0.693520 +v 0.162212 0.555570 0.815493 +v 0.180240 0.382683 0.906128 +v 0.191342 0.195090 0.961940 +v 0.195090 0.000000 0.980786 +v 0.191342 -0.195090 0.961940 +v 0.180240 -0.382683 0.906128 +v 0.162212 -0.555570 0.815493 +v 0.137950 -0.707107 0.693520 +v 0.108386 -0.831470 0.544895 +v 0.074658 -0.923880 0.375331 +v 0.038060 -0.980785 0.191342 +v -0.000000 0.980785 0.195091 +v 0.000000 0.923880 0.382684 +v 0.000000 0.831470 0.555571 +v -0.000000 0.707107 0.707107 +v -0.000000 0.555570 0.831470 +v 0.000000 0.382683 0.923880 +v -0.000000 0.195090 0.980785 +v -0.000000 0.000000 1.000000 +v -0.000000 -0.195090 0.980785 +v 0.000000 -0.382683 0.923880 +v -0.000000 -0.555570 0.831470 +v -0.000000 -0.707107 0.707107 +v -0.000000 -0.831470 0.555570 +v 0.000000 -0.923880 0.382684 +v 0.000000 -0.980785 0.195091 +v -0.038060 0.980785 0.191342 +v -0.074658 0.923880 0.375331 +v -0.108386 0.831470 0.544896 +v -0.137950 0.707107 0.693520 +v -0.162212 0.555570 0.815493 +v -0.180240 0.382683 0.906128 +v -0.191342 0.195090 0.961940 +v -0.195090 0.000000 0.980786 +v -0.191342 -0.195090 0.961940 +v -0.180240 -0.382683 0.906128 +v -0.162212 -0.555570 0.815493 +v -0.137950 -0.707107 0.693520 +v -0.108386 -0.831470 0.544895 +v -0.074658 -0.923880 0.375331 +v -0.038060 -0.980785 0.191342 +v -0.000000 1.000000 0.000001 +v -0.074658 0.980785 0.180240 +v -0.146447 0.923880 0.353554 +v -0.212608 0.831470 0.513280 +v -0.270598 0.707107 0.653282 +v -0.318190 0.555570 0.768178 +v -0.353553 0.382683 0.853554 +v -0.375330 0.195090 0.906127 +v -0.382684 0.000000 0.923880 +v -0.375330 -0.195090 0.906127 +v -0.353553 -0.382683 0.853554 +v -0.318190 -0.555570 0.768178 +v -0.270598 -0.707107 0.653282 +v -0.212608 -0.831470 0.513280 +v -0.146447 -0.923880 0.353554 +v -0.074658 -0.980785 0.180240 +v -0.108386 0.980785 0.162212 +v -0.212608 0.923880 0.318190 +v -0.308658 0.831470 0.461940 +v -0.392847 0.707107 0.587938 +v -0.461940 0.555570 0.691342 +v -0.513280 0.382683 0.768178 +v -0.544895 0.195090 0.815493 +v -0.555570 0.000000 0.831470 +v -0.544895 -0.195090 0.815493 +v -0.513280 -0.382683 0.768178 +v -0.461940 -0.555570 0.691342 +v -0.392847 -0.707107 0.587938 +v -0.308658 -0.831470 0.461940 +v -0.212607 -0.923880 0.318190 +v -0.108386 -0.980785 0.162212 +v -0.137950 0.980785 0.137950 +v -0.270598 0.923880 0.270598 +v -0.392848 0.831470 0.392848 +v -0.500000 0.707107 0.500000 +v -0.587938 0.555570 0.587938 +v -0.653281 0.382683 0.653282 +v -0.693520 0.195090 0.693520 +v -0.707107 0.000000 0.707107 +v -0.693520 -0.195090 0.693520 +v -0.653281 -0.382683 0.653282 +v -0.587938 -0.555570 0.587938 +v -0.500000 -0.707107 0.500000 +v -0.392847 -0.831470 0.392848 +v -0.270598 -0.923880 0.270598 +v -0.137950 -0.980785 0.137950 +v -0.162212 0.980785 0.108387 +v -0.318190 0.923880 0.212608 +v -0.461940 0.831470 0.308659 +v -0.587938 0.707107 0.392848 +v -0.691342 0.555570 0.461940 +v -0.768178 0.382683 0.513280 +v -0.815493 0.195090 0.544895 +v -0.831470 0.000000 0.555570 +v -0.815493 -0.195090 0.544895 +v -0.768178 -0.382683 0.513280 +v -0.691342 -0.555570 0.461940 +v -0.587938 -0.707107 0.392848 +v -0.461940 -0.831470 0.308658 +v -0.318190 -0.923880 0.212608 +v -0.162212 -0.980785 0.108387 +v -0.180240 0.980785 0.074658 +v -0.353553 0.923880 0.146447 +v -0.513280 0.831470 0.212608 +v -0.653281 0.707107 0.270598 +v -0.768177 0.555570 0.318190 +v -0.853553 0.382683 0.353554 +v -0.906127 0.195090 0.375330 +v -0.923880 0.000000 0.382684 +v -0.906127 -0.195090 0.375330 +v -0.853553 -0.382683 0.353554 +v -0.768177 -0.555570 0.318190 +v -0.653281 -0.707107 0.270598 +v -0.513280 -0.831470 0.212608 +v -0.353553 -0.923880 0.146447 +v -0.180240 -0.980785 0.074658 +v -0.191342 0.980785 0.038061 +v -0.375330 0.923880 0.074658 +v -0.544895 0.831470 0.108387 +v -0.693520 0.707107 0.137950 +v -0.815493 0.555570 0.162212 +v -0.906127 0.382683 0.180240 +v -0.961939 0.195090 0.191342 +v -0.980785 0.000000 0.195090 +v -0.961939 -0.195090 0.191342 +v -0.906127 -0.382683 0.180240 +v -0.815493 -0.555570 0.162212 +v -0.693520 -0.707107 0.137950 +v -0.544895 -0.831470 0.108387 +v -0.375330 -0.923880 0.074658 +v -0.191342 -0.980785 0.038061 +v -0.195090 0.980785 0.000000 +v -0.382683 0.923880 0.000000 +v -0.555570 0.831470 0.000000 +v -0.707107 0.707107 0.000000 +v -0.831469 0.555570 0.000000 +v -0.923879 0.382683 0.000000 +v -0.980785 0.195090 0.000000 +v -1.000000 0.000000 0.000000 +v -0.980785 -0.195090 0.000000 +v -0.923879 -0.382683 0.000000 +v -0.831469 -0.555570 0.000000 +v -0.707107 -0.707107 0.000000 +v -0.555570 -0.831470 0.000000 +v -0.382683 -0.923880 0.000000 +v -0.195090 -0.980785 0.000000 +v -0.191342 0.980785 -0.038060 +v -0.375330 0.923880 -0.074658 +v -0.544895 0.831470 -0.108386 +v -0.693520 0.707107 -0.137949 +v -0.815493 0.555570 -0.162211 +v -0.906127 0.382683 -0.180240 +v -0.961939 0.195090 -0.191342 +v -0.980785 0.000000 -0.195090 +v -0.961939 -0.195090 -0.191342 +v -0.906127 -0.382683 -0.180240 +v -0.815493 -0.555570 -0.162211 +v -0.693520 -0.707107 -0.137949 +v -0.544895 -0.831470 -0.108386 +v -0.375330 -0.923880 -0.074658 +v -0.191342 -0.980785 -0.038060 +v -0.180240 0.980785 -0.074658 +v -0.353553 0.923880 -0.146446 +v -0.513280 0.831470 -0.212607 +v -0.653281 0.707107 -0.270598 +v -0.768177 0.555570 -0.318189 +v -0.853553 0.382683 -0.353553 +v -0.906127 0.195090 -0.375330 +v -0.923879 0.000000 -0.382683 +v -0.906127 -0.195090 -0.375330 +v -0.853553 -0.382683 -0.353553 +v -0.768177 -0.555570 -0.318189 +v -0.653281 -0.707107 -0.270598 +v -0.513280 -0.831470 -0.212607 +v -0.353553 -0.923880 -0.146446 +v -0.180240 -0.980785 -0.074657 +v -0.162212 0.980785 -0.108386 +v -0.318190 0.923880 -0.212607 +v -0.461940 0.831470 -0.308658 +v -0.587938 0.707107 -0.392847 +v -0.691341 0.555570 -0.461939 +v -0.768178 0.382683 -0.513280 +v -0.815493 0.195090 -0.544895 +v -0.831469 0.000000 -0.555570 +v -0.815493 -0.195090 -0.544895 +v -0.768178 -0.382683 -0.513280 +v -0.691341 -0.555570 -0.461939 +v -0.587938 -0.707107 -0.392847 +v -0.461940 -0.831470 -0.308658 +v -0.318189 -0.923880 -0.212607 +v -0.162212 -0.980785 -0.108386 +v -0.137950 0.980785 -0.137949 +v -0.270598 0.923880 -0.270598 +v -0.392847 0.831470 -0.392847 +v -0.500000 0.707107 -0.500000 +v -0.587937 0.555570 -0.587937 +v -0.653281 0.382683 -0.653281 +v -0.693519 0.195090 -0.693519 +v -0.707106 0.000000 -0.707106 +v -0.693519 -0.195090 -0.693519 +v -0.653281 -0.382683 -0.653281 +v -0.587937 -0.555570 -0.587937 +v -0.500000 -0.707107 -0.500000 +v -0.392847 -0.831470 -0.392847 +v -0.270598 -0.923880 -0.270598 +v -0.137950 -0.980785 -0.137949 +v -0.108386 0.980785 -0.162211 +v -0.212607 0.923880 -0.318189 +v -0.308658 0.831470 -0.461939 +v -0.392847 0.707107 -0.587937 +v -0.461939 0.555570 -0.691341 +v -0.513280 0.382683 -0.768177 +v -0.544895 0.195090 -0.815492 +v -0.555570 0.000000 -0.831469 +v -0.544895 -0.195090 -0.815492 +v -0.513280 -0.382683 -0.768177 +v -0.461939 -0.555570 -0.691341 +v -0.392847 -0.707107 -0.587937 +v -0.308658 -0.831470 -0.461939 +v -0.212607 -0.923880 -0.318189 +v -0.108386 -0.980785 -0.162211 +v -0.074658 0.980785 -0.180240 +v -0.146447 0.923880 -0.353553 +v -0.212607 0.831470 -0.513280 +v -0.270598 0.707107 -0.653281 +v -0.318189 0.555570 -0.768177 +v -0.353553 0.382683 -0.853553 +v -0.375330 0.195090 -0.906127 +v -0.382683 0.000000 -0.923879 +v -0.375330 -0.195090 -0.906127 +v -0.353553 -0.382683 -0.853553 +v -0.318189 -0.555570 -0.768177 +v -0.270598 -0.707107 -0.653281 +v -0.212607 -0.831470 -0.513279 +v -0.146446 -0.923880 -0.353553 +v -0.074658 -0.980785 -0.180240 +v -0.038060 0.980785 -0.191342 +v -0.074658 0.923880 -0.375330 +v -0.108386 0.831470 -0.544895 +v -0.137950 0.707107 -0.693520 +v -0.162211 0.555570 -0.815492 +v -0.180240 0.382683 -0.906127 +v -0.191341 0.195090 -0.961939 +v -0.195090 0.000000 -0.980785 +v -0.191341 -0.195090 -0.961939 +v -0.180240 -0.382683 -0.906127 +v -0.162211 -0.555570 -0.815492 +v -0.137950 -0.707107 -0.693520 +v -0.108386 -0.831470 -0.544895 +v -0.074658 -0.923880 -0.375330 +v -0.038060 -0.980785 -0.191341 +v 0.000000 0.980785 -0.195090 +v 0.000000 0.923880 -0.382683 +v 0.000000 0.831470 -0.555570 +v 0.000000 0.707107 -0.707106 +v 0.000000 0.555570 -0.831469 +v 0.000000 0.382683 -0.923879 +v 0.000000 0.195090 -0.980784 +v 0.000000 0.000000 -0.999999 +v 0.000000 -0.195090 -0.980784 +v 0.000000 -0.382683 -0.923879 +v 0.000000 -0.555570 -0.831469 +v 0.000000 -0.707107 -0.707106 +v 0.000000 -0.831470 -0.555570 +v 0.000000 -0.923880 -0.382683 +v 0.000000 -0.980785 -0.195090 +vn 0.0000 -0.8286 -0.5598 +vn 0.0000 -0.7040 -0.7101 +vn 0.1385 -0.7040 -0.6965 +vn 0.1092 -0.8286 -0.5490 +vn 0.0000 0.3805 -0.9247 +vn 0.0000 0.5528 -0.8333 +vn 0.1626 0.5528 -0.8173 +vn 0.1804 0.3805 -0.9070 +vn 0.0000 -0.9217 -0.3879 +vn 0.0757 -0.9217 -0.3804 +vn 0.0000 0.1939 -0.9810 +vn 0.1914 0.1939 -0.9622 +vn 0.0000 -0.9796 -0.2010 +vn 0.0392 -0.9796 -0.1971 +vn 0.0000 0.0000 -1.0000 +vn 0.1951 0.0000 -0.9808 +vn 0.0000 0.9796 -0.2010 +vn 0.0000 1.0000 0.0000 +vn 0.0392 0.9796 -0.1971 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.1939 -0.9810 +vn 0.1914 -0.1939 -0.9622 +vn 0.0000 0.9217 -0.3879 +vn 0.0757 0.9217 -0.3804 +vn 0.0000 -0.3805 -0.9247 +vn 0.1804 -0.3805 -0.9070 +vn 0.0000 0.8286 -0.5598 +vn 0.1092 0.8286 -0.5490 +vn 0.0000 -0.5528 -0.8333 +vn 0.1626 -0.5528 -0.8173 +vn 0.0000 0.7040 -0.7101 +vn 0.1385 0.7040 -0.6965 +vn 0.3189 -0.5528 -0.7699 +vn 0.2717 -0.7040 -0.6561 +vn 0.2717 0.7040 -0.6561 +vn 0.3189 0.5528 -0.7699 +vn 0.2142 -0.8286 -0.5171 +vn 0.3539 0.3805 -0.8544 +vn 0.1484 -0.9217 -0.3583 +vn 0.3754 0.1939 -0.9063 +vn 0.0769 -0.9796 -0.1856 +vn 0.3827 0.0000 -0.9239 +vn 0.0769 0.9796 -0.1856 +vn 0.3754 -0.1939 -0.9063 +vn 0.1484 0.9217 -0.3583 +vn 0.3539 -0.3805 -0.8544 +vn 0.2142 0.8286 -0.5171 +vn 0.1116 0.9796 -0.1671 +vn 0.1116 -0.9796 -0.1671 +vn 0.5556 0.0000 -0.8314 +vn 0.5450 -0.1939 -0.8157 +vn 0.2155 0.9217 -0.3225 +vn 0.5137 -0.3805 -0.7689 +vn 0.3110 0.8286 -0.4654 +vn 0.4630 -0.5528 -0.6929 +vn 0.3945 0.7040 -0.5904 +vn 0.3945 -0.7040 -0.5904 +vn 0.4630 0.5528 -0.6929 +vn 0.3110 -0.8286 -0.4654 +vn 0.5137 0.3805 -0.7689 +vn 0.2155 -0.9217 -0.3225 +vn 0.5450 0.1939 -0.8157 +vn 0.5021 0.7040 -0.5021 +vn 0.5893 0.5528 -0.5893 +vn 0.5021 -0.7040 -0.5021 +vn 0.3958 -0.8286 -0.3958 +vn 0.6539 0.3805 -0.6539 +vn 0.2743 -0.9217 -0.2743 +vn 0.6937 0.1939 -0.6937 +vn 0.1421 -0.9796 -0.1421 +vn 0.7071 0.0000 -0.7071 +vn 0.1421 0.9796 -0.1421 +vn 0.6937 -0.1939 -0.6937 +vn 0.2743 0.9217 -0.2743 +vn 0.6539 -0.3805 -0.6539 +vn 0.3958 0.8286 -0.3958 +vn 0.5893 -0.5528 -0.5893 +vn 0.8314 0.0000 -0.5556 +vn 0.8157 -0.1939 -0.5450 +vn 0.1671 0.9796 -0.1116 +vn 0.3225 0.9217 -0.2155 +vn 0.7689 -0.3805 -0.5137 +vn 0.4654 0.8286 -0.3110 +vn 0.6929 -0.5528 -0.4630 +vn 0.5904 0.7040 -0.3945 +vn 0.5904 -0.7040 -0.3945 +vn 0.6929 0.5528 -0.4630 +vn 0.4654 -0.8286 -0.3110 +vn 0.7689 0.3805 -0.5137 +vn 0.3225 -0.9217 -0.2155 +vn 0.8157 0.1939 -0.5450 +vn 0.1671 -0.9796 -0.1116 +vn 0.6561 -0.7040 -0.2717 +vn 0.5171 -0.8286 -0.2142 +vn 0.7699 0.5528 -0.3189 +vn 0.8544 0.3805 -0.3539 +vn 0.3583 -0.9217 -0.1484 +vn 0.9063 0.1939 -0.3754 +vn 0.1856 -0.9796 -0.0769 +vn 0.9239 0.0000 -0.3827 +vn 0.1856 0.9796 -0.0769 +vn 0.9063 -0.1939 -0.3754 +vn 0.3583 0.9217 -0.1484 +vn 0.8544 -0.3805 -0.3539 +vn 0.5171 0.8286 -0.2142 +vn 0.7699 -0.5528 -0.3189 +vn 0.6561 0.7040 -0.2717 +vn 0.9622 -0.1939 -0.1914 +vn 0.9070 -0.3805 -0.1804 +vn 0.3804 0.9217 -0.0757 +vn 0.5490 0.8286 -0.1092 +vn 0.8173 -0.5528 -0.1626 +vn 0.6965 0.7040 -0.1385 +vn 0.6965 -0.7040 -0.1385 +vn 0.8173 0.5528 -0.1626 +vn 0.5490 -0.8286 -0.1092 +vn 0.9070 0.3805 -0.1804 +vn 0.3804 -0.9217 -0.0757 +vn 0.9622 0.1939 -0.1914 +vn 0.1971 -0.9796 -0.0392 +vn 0.9808 0.0000 -0.1951 +vn 0.1971 0.9796 -0.0392 +vn 0.5598 -0.8286 0.0000 +vn 0.3879 -0.9217 0.0000 +vn 0.9247 0.3805 0.0000 +vn 0.9810 0.1939 0.0000 +vn 0.2010 -0.9796 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.2010 0.9796 0.0000 +vn 0.9810 -0.1939 0.0000 +vn 0.3879 0.9217 0.0000 +vn 0.9247 -0.3805 0.0000 +vn 0.5598 0.8286 0.0000 +vn 0.8333 -0.5528 0.0000 +vn 0.7101 0.7040 0.0000 +vn 0.7101 -0.7040 0.0000 +vn 0.8333 0.5528 0.0000 +vn 0.3804 0.9217 0.0757 +vn 0.5490 0.8286 0.1092 +vn 0.9070 -0.3805 0.1804 +vn 0.8173 -0.5528 0.1626 +vn 0.6965 0.7040 0.1385 +vn 0.6965 -0.7040 0.1385 +vn 0.8173 0.5528 0.1626 +vn 0.5490 -0.8286 0.1092 +vn 0.9070 0.3805 0.1804 +vn 0.3804 -0.9217 0.0757 +vn 0.9622 0.1939 0.1914 +vn 0.1971 -0.9796 0.0392 +vn 0.9808 0.0000 0.1951 +vn 0.1971 0.9796 0.0392 +vn 0.9622 -0.1939 0.1914 +vn 0.8544 0.3805 0.3539 +vn 0.9063 0.1939 0.3754 +vn 0.3583 -0.9217 0.1484 +vn 0.1856 -0.9796 0.0769 +vn 0.9239 0.0000 0.3827 +vn 0.1856 0.9796 0.0769 +vn 0.9063 -0.1939 0.3754 +vn 0.3583 0.9217 0.1484 +vn 0.8544 -0.3805 0.3539 +vn 0.5171 0.8286 0.2142 +vn 0.7699 -0.5528 0.3189 +vn 0.6561 0.7040 0.2717 +vn 0.6561 -0.7040 0.2717 +vn 0.7699 0.5528 0.3189 +vn 0.5171 -0.8286 0.2142 +vn 0.7689 -0.3805 0.5137 +vn 0.6929 -0.5528 0.4630 +vn 0.4654 0.8286 0.3110 +vn 0.5904 0.7040 0.3945 +vn 0.5904 -0.7040 0.3945 +vn 0.6929 0.5528 0.4630 +vn 0.4654 -0.8286 0.3110 +vn 0.7689 0.3805 0.5137 +vn 0.3225 -0.9217 0.2155 +vn 0.8157 0.1939 0.5450 +vn 0.1671 -0.9796 0.1116 +vn 0.8314 0.0000 0.5556 +vn 0.1671 0.9796 0.1116 +vn 0.8157 -0.1939 0.5450 +vn 0.3225 0.9217 0.2155 +vn 0.2743 -0.9217 0.2743 +vn 0.1421 -0.9796 0.1421 +vn 0.6937 0.1939 0.6937 +vn 0.7071 0.0000 0.7071 +vn 0.1421 0.9796 0.1421 +vn 0.6937 -0.1939 0.6937 +vn 0.2743 0.9217 0.2743 +vn 0.6539 -0.3805 0.6539 +vn 0.3958 0.8286 0.3958 +vn 0.5893 -0.5528 0.5893 +vn 0.5021 0.7040 0.5021 +vn 0.5021 -0.7040 0.5021 +vn 0.5893 0.5528 0.5893 +vn 0.3958 -0.8286 0.3958 +vn 0.6539 0.3805 0.6539 +vn 0.3110 0.8286 0.4654 +vn 0.3945 0.7040 0.5904 +vn 0.4630 -0.5528 0.6929 +vn 0.3945 -0.7040 0.5904 +vn 0.4630 0.5528 0.6929 +vn 0.3110 -0.8286 0.4654 +vn 0.5137 0.3805 0.7689 +vn 0.2155 -0.9217 0.3225 +vn 0.5450 0.1939 0.8157 +vn 0.1116 -0.9796 0.1671 +vn 0.5556 0.0000 0.8314 +vn 0.1116 0.9796 0.1671 +vn 0.5450 -0.1939 0.8157 +vn 0.2155 0.9217 0.3225 +vn 0.5137 -0.3805 0.7689 +vn 0.3754 0.1939 0.9063 +vn 0.3827 0.0000 0.9239 +vn 0.0769 0.9796 0.1856 +vn 0.0769 -0.9796 0.1856 +vn 0.3754 -0.1939 0.9063 +vn 0.1484 0.9217 0.3583 +vn 0.3539 -0.3805 0.8544 +vn 0.2142 0.8286 0.5171 +vn 0.3189 -0.5528 0.7699 +vn 0.2717 0.7040 0.6561 +vn 0.2717 -0.7040 0.6561 +vn 0.3189 0.5528 0.7699 +vn 0.2142 -0.8286 0.5171 +vn 0.3539 0.3805 0.8544 +vn 0.1484 -0.9217 0.3583 +vn 0.1626 -0.5528 0.8173 +vn 0.1385 -0.7040 0.6965 +vn 0.1385 0.7040 0.6965 +vn 0.1626 0.5528 0.8173 +vn 0.1092 -0.8286 0.5490 +vn 0.1804 0.3805 0.9070 +vn 0.0757 -0.9217 0.3804 +vn 0.1914 0.1939 0.9622 +vn 0.0392 -0.9796 0.1971 +vn 0.1951 0.0000 0.9808 +vn 0.0392 0.9796 0.1971 +vn 0.1914 -0.1939 0.9622 +vn 0.0757 0.9217 0.3804 +vn 0.1804 -0.3805 0.9070 +vn 0.1092 0.8286 0.5490 +vn 0.0000 -0.9796 0.2010 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.1939 0.9810 +vn 0.0000 0.9796 0.2010 +vn 0.0000 0.9217 0.3879 +vn 0.0000 -0.3805 0.9247 +vn 0.0000 0.8286 0.5598 +vn 0.0000 -0.5528 0.8333 +vn 0.0000 0.7040 0.7101 +vn 0.0000 -0.7040 0.7101 +vn 0.0000 0.5528 0.8333 +vn 0.0000 -0.8286 0.5598 +vn 0.0000 0.3805 0.9247 +vn 0.0000 -0.9217 0.3879 +vn 0.0000 0.1939 0.9810 +vn -0.1385 -0.7040 0.6965 +vn -0.1092 -0.8286 0.5490 +vn -0.1626 0.5528 0.8173 +vn -0.1804 0.3805 0.9070 +vn -0.0757 -0.9217 0.3804 +vn -0.1914 0.1939 0.9622 +vn -0.0392 -0.9796 0.1971 +vn -0.1951 0.0000 0.9808 +vn -0.0392 0.9796 0.1971 +vn -0.1914 -0.1939 0.9622 +vn -0.0757 0.9217 0.3804 +vn -0.1804 -0.3805 0.9070 +vn -0.1092 0.8286 0.5490 +vn -0.1626 -0.5528 0.8173 +vn -0.1385 0.7040 0.6965 +vn -0.0769 0.9796 0.1856 +vn -0.1484 0.9217 0.3583 +vn -0.3754 -0.1939 0.9063 +vn -0.3539 -0.3805 0.8544 +vn -0.2142 0.8286 0.5171 +vn -0.3189 -0.5528 0.7699 +vn -0.2717 0.7040 0.6561 +vn -0.2717 -0.7040 0.6561 +vn -0.3189 0.5528 0.7699 +vn -0.2142 -0.8286 0.5171 +vn -0.3539 0.3805 0.8544 +vn -0.1484 -0.9217 0.3583 +vn -0.3754 0.1939 0.9063 +vn -0.0769 -0.9796 0.1856 +vn -0.3827 0.0000 0.9239 +vn -0.4630 0.5528 0.6929 +vn -0.5137 0.3805 0.7689 +vn -0.3110 -0.8286 0.4654 +vn -0.2155 -0.9217 0.3225 +vn -0.5450 0.1939 0.8157 +vn -0.1116 -0.9796 0.1671 +vn -0.5556 0.0000 0.8314 +vn -0.1116 0.9796 0.1671 +vn -0.5450 -0.1939 0.8157 +vn -0.2155 0.9217 0.3225 +vn -0.5137 -0.3805 0.7689 +vn -0.3110 0.8286 0.4654 +vn -0.4630 -0.5528 0.6929 +vn -0.3945 0.7040 0.5904 +vn -0.3945 -0.7040 0.5904 +vn -0.6937 -0.1939 0.6937 +vn -0.6539 -0.3805 0.6539 +vn -0.2743 0.9217 0.2743 +vn -0.3958 0.8286 0.3958 +vn -0.5893 -0.5528 0.5893 +vn -0.5021 0.7040 0.5021 +vn -0.5021 -0.7040 0.5021 +vn -0.5893 0.5528 0.5893 +vn -0.3958 -0.8286 0.3958 +vn -0.6539 0.3805 0.6539 +vn -0.2743 -0.9217 0.2743 +vn -0.6937 0.1939 0.6937 +vn -0.1421 -0.9796 0.1421 +vn -0.7071 0.0000 0.7071 +vn -0.1421 0.9796 0.1421 +vn -0.4654 -0.8286 0.3110 +vn -0.3225 -0.9217 0.2155 +vn -0.7689 0.3805 0.5137 +vn -0.8157 0.1939 0.5450 +vn -0.1671 -0.9796 0.1116 +vn -0.8314 0.0000 0.5556 +vn -0.1671 0.9796 0.1116 +vn -0.8157 -0.1939 0.5450 +vn -0.3225 0.9217 0.2155 +vn -0.7689 -0.3805 0.5137 +vn -0.4654 0.8286 0.3110 +vn -0.6929 -0.5528 0.4630 +vn -0.5904 0.7040 0.3945 +vn -0.5904 -0.7040 0.3945 +vn -0.6929 0.5528 0.4630 +vn -0.3583 0.9217 0.1484 +vn -0.5171 0.8286 0.2142 +vn -0.8544 -0.3805 0.3539 +vn -0.7699 -0.5528 0.3189 +vn -0.6561 0.7040 0.2717 +vn -0.6561 -0.7040 0.2717 +vn -0.7699 0.5528 0.3189 +vn -0.5171 -0.8286 0.2142 +vn -0.8544 0.3805 0.3539 +vn -0.3583 -0.9217 0.1484 +vn -0.9063 0.1939 0.3754 +vn -0.1856 -0.9796 0.0769 +vn -0.9239 0.0000 0.3827 +vn -0.1856 0.9796 0.0769 +vn -0.9063 -0.1939 0.3754 +vn -0.9070 0.3805 0.1804 +vn -0.9622 0.1939 0.1914 +vn -0.3804 -0.9217 0.0757 +vn -0.1971 -0.9796 0.0392 +vn -0.9808 0.0000 0.1951 +vn -0.1971 0.9796 0.0392 +vn -0.9622 -0.1939 0.1914 +vn -0.3804 0.9217 0.0757 +vn -0.9070 -0.3805 0.1804 +vn -0.5490 0.8286 0.1092 +vn -0.8173 -0.5528 0.1626 +vn -0.6965 0.7040 0.1385 +vn -0.6965 -0.7040 0.1385 +vn -0.8173 0.5528 0.1626 +vn -0.5490 -0.8286 0.1092 +vn -0.9247 -0.3805 0.0000 +vn -0.8333 -0.5528 0.0000 +vn -0.5598 0.8286 0.0000 +vn -0.7101 0.7040 0.0000 +vn -0.7101 -0.7040 0.0000 +vn -0.8333 0.5528 0.0000 +vn -0.5598 -0.8286 0.0000 +vn -0.9247 0.3805 0.0000 +vn -0.3879 -0.9217 0.0000 +vn -0.9810 0.1939 0.0000 +vn -0.2010 -0.9796 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.2010 0.9796 0.0000 +vn -0.9810 -0.1939 0.0000 +vn -0.3879 0.9217 0.0000 +vn -0.3804 -0.9217 -0.0757 +vn -0.1971 -0.9796 -0.0392 +vn -0.9622 0.1939 -0.1914 +vn -0.9808 0.0000 -0.1951 +vn -0.1971 0.9796 -0.0392 +vn -0.9622 -0.1939 -0.1914 +vn -0.3804 0.9217 -0.0757 +vn -0.9070 -0.3805 -0.1804 +vn -0.5490 0.8286 -0.1092 +vn -0.8173 -0.5528 -0.1626 +vn -0.6965 0.7040 -0.1385 +vn -0.6965 -0.7040 -0.1385 +vn -0.8173 0.5528 -0.1626 +vn -0.5490 -0.8286 -0.1092 +vn -0.9070 0.3805 -0.1804 +vn -0.7699 -0.5528 -0.3189 +vn -0.6561 -0.7040 -0.2717 +vn -0.6561 0.7040 -0.2717 +vn -0.7699 0.5528 -0.3189 +vn -0.5171 -0.8286 -0.2142 +vn -0.8544 0.3805 -0.3539 +vn -0.3583 -0.9217 -0.1484 +vn -0.9063 0.1939 -0.3754 +vn -0.1856 -0.9796 -0.0769 +vn -0.9239 0.0000 -0.3827 +vn -0.1856 0.9796 -0.0769 +vn -0.9063 -0.1939 -0.3754 +vn -0.3583 0.9217 -0.1484 +vn -0.8544 -0.3805 -0.3539 +vn -0.5171 0.8286 -0.2142 +vn -0.1671 0.9796 -0.1116 +vn -0.1671 -0.9796 -0.1116 +vn -0.8314 0.0000 -0.5556 +vn -0.8157 -0.1939 -0.5450 +vn -0.3225 0.9217 -0.2155 +vn -0.7689 -0.3805 -0.5137 +vn -0.4654 0.8286 -0.3110 +vn -0.6929 -0.5528 -0.4630 +vn -0.5904 0.7040 -0.3945 +vn -0.5904 -0.7040 -0.3945 +vn -0.6929 0.5528 -0.4630 +vn -0.4654 -0.8286 -0.3110 +vn -0.7689 0.3805 -0.5137 +vn -0.3225 -0.9217 -0.2155 +vn -0.8157 0.1939 -0.5450 +vn -0.5021 0.7040 -0.5021 +vn -0.5893 0.5528 -0.5893 +vn -0.5021 -0.7040 -0.5021 +vn -0.3958 -0.8286 -0.3958 +vn -0.6539 0.3805 -0.6539 +vn -0.2743 -0.9217 -0.2743 +vn -0.6937 0.1939 -0.6937 +vn -0.1421 -0.9796 -0.1421 +vn -0.7071 0.0000 -0.7071 +vn -0.1421 0.9796 -0.1421 +vn -0.6937 -0.1939 -0.6937 +vn -0.2743 0.9217 -0.2743 +vn -0.6539 -0.3805 -0.6539 +vn -0.3958 0.8286 -0.3958 +vn -0.5893 -0.5528 -0.5893 +vn -0.5556 0.0000 -0.8314 +vn -0.5450 -0.1939 -0.8157 +vn -0.1116 0.9796 -0.1671 +vn -0.2155 0.9217 -0.3225 +vn -0.5137 -0.3805 -0.7689 +vn -0.3110 0.8286 -0.4654 +vn -0.4630 -0.5528 -0.6929 +vn -0.3945 0.7040 -0.5904 +vn -0.3945 -0.7040 -0.5904 +vn -0.4630 0.5528 -0.6929 +vn -0.3110 -0.8286 -0.4654 +vn -0.5137 0.3805 -0.7689 +vn -0.2155 -0.9217 -0.3225 +vn -0.5450 0.1939 -0.8157 +vn -0.1116 -0.9796 -0.1671 +vn -0.2717 -0.7040 -0.6561 +vn -0.2142 -0.8286 -0.5171 +vn -0.3189 0.5528 -0.7699 +vn -0.3539 0.3805 -0.8544 +vn -0.1484 -0.9217 -0.3583 +vn -0.3754 0.1939 -0.9063 +vn -0.0769 -0.9796 -0.1856 +vn -0.3827 0.0000 -0.9239 +vn -0.0769 0.9796 -0.1856 +vn -0.3754 -0.1939 -0.9063 +vn -0.1484 0.9217 -0.3583 +vn -0.3539 -0.3805 -0.8544 +vn -0.2142 0.8286 -0.5171 +vn -0.3189 -0.5528 -0.7699 +vn -0.2717 0.7040 -0.6561 +vn -0.0392 0.9796 -0.1971 +vn -0.0757 0.9217 -0.3804 +vn -0.1914 -0.1939 -0.9622 +vn -0.1804 -0.3805 -0.9070 +vn -0.1092 0.8286 -0.5490 +vn -0.1626 -0.5528 -0.8173 +vn -0.1385 0.7040 -0.6965 +vn -0.1385 -0.7040 -0.6965 +vn -0.1626 0.5528 -0.8173 +vn -0.1092 -0.8286 -0.5490 +vn -0.1804 0.3805 -0.9070 +vn -0.0757 -0.9217 -0.3804 +vn -0.1914 0.1939 -0.9622 +vn -0.0392 -0.9796 -0.1971 +vn -0.1951 0.0000 -0.9808 +usemtl None +s 1 +f 480//1 479//2 13//3 14//4 +f 473//5 472//6 6//7 7//8 +f 481//9 480//1 14//4 15//10 +f 474//11 473//5 7//8 8//12 +f 482//13 481//9 15//10 16//14 +f 475//15 474//11 8//12 9//16 +f 468//17 257//18 2//19 +f 1//20 482//13 16//14 +f 476//21 475//15 9//16 10//22 +f 469//23 468//17 2//19 3//24 +f 477//25 476//21 10//22 11//26 +f 470//27 469//23 3//24 4//28 +f 478//29 477//25 11//26 12//30 +f 471//31 470//27 4//28 5//32 +f 479//2 478//29 12//30 13//3 +f 472//6 471//31 5//32 6//7 +f 13//3 12//30 27//33 28//34 +f 6//7 5//32 20//35 21//36 +f 14//4 13//3 28//34 29//37 +f 7//8 6//7 21//36 22//38 +f 15//10 14//4 29//37 30//39 +f 8//12 7//8 22//38 23//40 +f 16//14 15//10 30//39 31//41 +f 9//16 8//12 23//40 24//42 +f 2//19 257//18 17//43 +f 1//20 16//14 31//41 +f 10//22 9//16 24//42 25//44 +f 3//24 2//19 17//43 18//45 +f 11//26 10//22 25//44 26//46 +f 4//28 3//24 18//45 19//47 +f 12//30 11//26 26//46 27//33 +f 5//32 4//28 19//47 20//35 +f 17//43 257//18 32//48 +f 1//20 31//41 46//49 +f 25//44 24//42 39//50 40//51 +f 18//45 17//43 32//48 33//52 +f 26//46 25//44 40//51 41//53 +f 19//47 18//45 33//52 34//54 +f 27//33 26//46 41//53 42//55 +f 20//35 19//47 34//54 35//56 +f 28//34 27//33 42//55 43//57 +f 21//36 20//35 35//56 36//58 +f 29//37 28//34 43//57 44//59 +f 22//38 21//36 36//58 37//60 +f 30//39 29//37 44//59 45//61 +f 23//40 22//38 37//60 38//62 +f 31//41 30//39 45//61 46//49 +f 24//42 23//40 38//62 39//50 +f 36//58 35//56 50//63 51//64 +f 44//59 43//57 58//65 59//66 +f 37//60 36//58 51//64 52//67 +f 45//61 44//59 59//66 60//68 +f 38//62 37//60 52//67 53//69 +f 46//49 45//61 60//68 61//70 +f 39//50 38//62 53//69 54//71 +f 32//48 257//18 47//72 +f 1//20 46//49 61//70 +f 40//51 39//50 54//71 55//73 +f 33//52 32//48 47//72 48//74 +f 41//53 40//51 55//73 56//75 +f 34//54 33//52 48//74 49//76 +f 42//55 41//53 56//75 57//77 +f 35//56 34//54 49//76 50//63 +f 43//57 42//55 57//77 58//65 +f 55//73 54//71 69//78 70//79 +f 48//74 47//72 62//80 63//81 +f 56//75 55//73 70//79 71//82 +f 49//76 48//74 63//81 64//83 +f 57//77 56//75 71//82 72//84 +f 50//63 49//76 64//83 65//85 +f 58//65 57//77 72//84 73//86 +f 51//64 50//63 65//85 66//87 +f 59//66 58//65 73//86 74//88 +f 52//67 51//64 66//87 67//89 +f 60//68 59//66 74//88 75//90 +f 53//69 52//67 67//89 68//91 +f 61//70 60//68 75//90 76//92 +f 54//71 53//69 68//91 69//78 +f 47//72 257//18 62//80 +f 1//20 61//70 76//92 +f 74//88 73//86 88//93 89//94 +f 67//89 66//87 81//95 82//96 +f 75//90 74//88 89//94 90//97 +f 68//91 67//89 82//96 83//98 +f 76//92 75//90 90//97 91//99 +f 69//78 68//91 83//98 84//100 +f 62//80 257//18 77//101 +f 1//20 76//92 91//99 +f 70//79 69//78 84//100 85//102 +f 63//81 62//80 77//101 78//103 +f 71//82 70//79 85//102 86//104 +f 64//83 63//81 78//103 79//105 +f 72//84 71//82 86//104 87//106 +f 65//85 64//83 79//105 80//107 +f 73//86 72//84 87//106 88//93 +f 66//87 65//85 80//107 81//95 +f 86//104 85//102 100//108 101//109 +f 79//105 78//103 93//110 94//111 +f 87//106 86//104 101//109 102//112 +f 80//107 79//105 94//111 95//113 +f 88//93 87//106 102//112 103//114 +f 81//95 80//107 95//113 96//115 +f 89//94 88//93 103//114 104//116 +f 82//96 81//95 96//115 97//117 +f 90//97 89//94 104//116 105//118 +f 83//98 82//96 97//117 98//119 +f 91//99 90//97 105//118 106//120 +f 84//100 83//98 98//119 99//121 +f 77//101 257//18 92//122 +f 1//20 91//99 106//120 +f 85//102 84//100 99//121 100//108 +f 78//103 77//101 92//122 93//110 +f 105//118 104//116 119//123 120//124 +f 98//119 97//117 112//125 113//126 +f 106//120 105//118 120//124 121//127 +f 99//121 98//119 113//126 114//128 +f 92//122 257//18 107//129 +f 1//20 106//120 121//127 +f 100//108 99//121 114//128 115//130 +f 93//110 92//122 107//129 108//131 +f 101//109 100//108 115//130 116//132 +f 94//111 93//110 108//131 109//133 +f 102//112 101//109 116//132 117//134 +f 95//113 94//111 109//133 110//135 +f 103//114 102//112 117//134 118//136 +f 96//115 95//113 110//135 111//137 +f 104//116 103//114 118//136 119//123 +f 97//117 96//115 111//137 112//125 +f 109//133 108//131 123//138 124//139 +f 117//134 116//132 131//140 132//141 +f 110//135 109//133 124//139 125//142 +f 118//136 117//134 132//141 133//143 +f 111//137 110//135 125//142 126//144 +f 119//123 118//136 133//143 134//145 +f 112//125 111//137 126//144 127//146 +f 120//124 119//123 134//145 135//147 +f 113//126 112//125 127//146 128//148 +f 121//127 120//124 135//147 136//149 +f 114//128 113//126 128//148 129//150 +f 107//129 257//18 122//151 +f 1//20 121//127 136//149 +f 115//130 114//128 129//150 130//152 +f 108//131 107//129 122//151 123//138 +f 116//132 115//130 130//152 131//140 +f 128//148 127//146 142//153 143//154 +f 136//149 135//147 150//155 151//156 +f 129//150 128//148 143//154 144//157 +f 122//151 257//18 137//158 +f 1//20 136//149 151//156 +f 130//152 129//150 144//157 145//159 +f 123//138 122//151 137//158 138//160 +f 131//140 130//152 145//159 146//161 +f 124//139 123//138 138//160 139//162 +f 132//141 131//140 146//161 147//163 +f 125//142 124//139 139//162 140//164 +f 133//143 132//141 147//163 148//165 +f 126//144 125//142 140//164 141//166 +f 134//145 133//143 148//165 149//167 +f 127//146 126//144 141//166 142//153 +f 135//147 134//145 149//167 150//155 +f 147//163 146//161 161//168 162//169 +f 140//164 139//162 154//170 155//171 +f 148//165 147//163 162//169 163//172 +f 141//166 140//164 155//171 156//173 +f 149//167 148//165 163//172 164//174 +f 142//153 141//166 156//173 157//175 +f 150//155 149//167 164//174 165//176 +f 143//154 142//153 157//175 158//177 +f 151//156 150//155 165//176 166//178 +f 144//157 143//154 158//177 159//179 +f 137//158 257//18 152//180 +f 1//20 151//156 166//178 +f 145//159 144//157 159//179 160//181 +f 138//160 137//158 152//180 153//182 +f 146//161 145//159 160//181 161//168 +f 139//162 138//160 153//182 154//170 +f 166//178 165//176 180//183 181//184 +f 159//179 158//177 173//185 174//186 +f 152//180 257//18 167//187 +f 1//20 166//178 181//184 +f 160//181 159//179 174//186 175//188 +f 153//182 152//180 167//187 168//189 +f 161//168 160//181 175//188 176//190 +f 154//170 153//182 168//189 169//191 +f 162//169 161//168 176//190 177//192 +f 155//171 154//170 169//191 170//193 +f 163//172 162//169 177//192 178//194 +f 156//173 155//171 170//193 171//195 +f 164//174 163//172 178//194 179//196 +f 157//175 156//173 171//195 172//197 +f 165//176 164//174 179//196 180//183 +f 158//177 157//175 172//197 173//185 +f 170//193 169//191 184//198 185//199 +f 178//194 177//192 192//200 193//201 +f 171//195 170//193 185//199 186//202 +f 179//196 178//194 193//201 194//203 +f 172//197 171//195 186//202 187//204 +f 180//183 179//196 194//203 195//205 +f 173//185 172//197 187//204 188//206 +f 181//184 180//183 195//205 196//207 +f 174//186 173//185 188//206 189//208 +f 167//187 257//18 182//209 +f 1//20 181//184 196//207 +f 175//188 174//186 189//208 190//210 +f 168//189 167//187 182//209 183//211 +f 176//190 175//188 190//210 191//212 +f 169//191 168//189 183//211 184//198 +f 177//192 176//190 191//212 192//200 +f 189//208 188//206 203//213 204//214 +f 182//209 257//18 197//215 +f 1//20 196//207 211//216 +f 190//210 189//208 204//214 205//217 +f 183//211 182//209 197//215 198//218 +f 191//212 190//210 205//217 206//219 +f 184//198 183//211 198//218 199//220 +f 192//200 191//212 206//219 207//221 +f 185//199 184//198 199//220 200//222 +f 193//201 192//200 207//221 208//223 +f 186//202 185//199 200//222 201//224 +f 194//203 193//201 208//223 209//225 +f 187//204 186//202 201//224 202//226 +f 195//205 194//203 209//225 210//227 +f 188//206 187//204 202//226 203//213 +f 196//207 195//205 210//227 211//216 +f 208//223 207//221 222//228 223//229 +f 201//224 200//222 215//230 216//231 +f 209//225 208//223 223//229 224//232 +f 202//226 201//224 216//231 217//233 +f 210//227 209//225 224//232 225//234 +f 203//213 202//226 217//233 218//235 +f 211//216 210//227 225//234 226//236 +f 204//214 203//213 218//235 219//237 +f 197//215 257//18 212//238 +f 1//20 211//216 226//236 +f 205//217 204//214 219//237 220//239 +f 198//218 197//215 212//238 213//240 +f 206//219 205//217 220//239 221//241 +f 199//220 198//218 213//240 214//242 +f 207//221 206//219 221//241 222//228 +f 200//222 199//220 214//242 215//230 +f 1//20 226//236 241//243 +f 220//239 219//237 234//244 235//245 +f 213//240 212//238 227//246 228//247 +f 221//241 220//239 235//245 236//248 +f 214//242 213//240 228//247 229//249 +f 222//228 221//241 236//248 237//250 +f 215//230 214//242 229//249 230//251 +f 223//229 222//228 237//250 238//252 +f 216//231 215//230 230//251 231//253 +f 224//232 223//229 238//252 239//254 +f 217//233 216//231 231//253 232//255 +f 225//234 224//232 239//254 240//256 +f 218//235 217//233 232//255 233//257 +f 226//236 225//234 240//256 241//243 +f 219//237 218//235 233//257 234//244 +f 212//238 257//18 227//246 +f 239//254 238//252 253//258 254//259 +f 232//255 231//253 246//260 247//261 +f 240//256 239//254 254//259 255//262 +f 233//257 232//255 247//261 248//263 +f 241//243 240//256 255//262 256//264 +f 234//244 233//257 248//263 249//265 +f 227//246 257//18 242//266 +f 1//20 241//243 256//264 +f 235//245 234//244 249//265 250//267 +f 228//247 227//246 242//266 243//268 +f 236//248 235//245 250//267 251//269 +f 229//249 228//247 243//268 244//270 +f 237//250 236//248 251//269 252//271 +f 230//251 229//249 244//270 245//272 +f 238//252 237//250 252//271 253//258 +f 231//253 230//251 245//272 246//260 +f 243//268 242//266 258//273 259//274 +f 251//269 250//267 266//275 267//276 +f 244//270 243//268 259//274 260//277 +f 252//271 251//269 267//276 268//278 +f 245//272 244//270 260//277 261//279 +f 253//258 252//271 268//278 269//280 +f 246//260 245//272 261//279 262//281 +f 254//259 253//258 269//280 270//282 +f 247//261 246//260 262//281 263//283 +f 255//262 254//259 270//282 271//284 +f 248//263 247//261 263//283 264//285 +f 256//264 255//262 271//284 272//286 +f 249//265 248//263 264//285 265//287 +f 242//266 257//18 258//273 +f 1//20 256//264 272//286 +f 250//267 249//265 265//287 266//275 +f 263//283 262//281 277//288 278//289 +f 271//284 270//282 285//290 286//291 +f 264//285 263//283 278//289 279//292 +f 272//286 271//284 286//291 287//293 +f 265//287 264//285 279//292 280//294 +f 258//273 257//18 273//295 +f 1//20 272//286 287//293 +f 266//275 265//287 280//294 281//296 +f 259//274 258//273 273//295 274//297 +f 267//276 266//275 281//296 282//298 +f 260//277 259//274 274//297 275//299 +f 268//278 267//276 282//298 283//300 +f 261//279 260//277 275//299 276//301 +f 269//280 268//278 283//300 284//302 +f 262//281 261//279 276//301 277//288 +f 270//282 269//280 284//302 285//290 +f 282//298 281//296 296//303 297//304 +f 275//299 274//297 289//305 290//306 +f 283//300 282//298 297//304 298//307 +f 276//301 275//299 290//306 291//308 +f 284//302 283//300 298//307 299//309 +f 277//288 276//301 291//308 292//310 +f 285//290 284//302 299//309 300//311 +f 278//289 277//288 292//310 293//312 +f 286//291 285//290 300//311 301//313 +f 279//292 278//289 293//312 294//314 +f 287//293 286//291 301//313 302//315 +f 280//294 279//292 294//314 295//316 +f 273//295 257//18 288//317 +f 1//20 287//293 302//315 +f 281//296 280//294 295//316 296//303 +f 274//297 273//295 288//317 289//305 +f 301//313 300//311 315//318 316//319 +f 294//314 293//312 308//320 309//321 +f 302//315 301//313 316//319 317//322 +f 295//316 294//314 309//321 310//323 +f 288//317 257//18 303//324 +f 1//20 302//315 317//322 +f 296//303 295//316 310//323 311//325 +f 289//305 288//317 303//324 304//326 +f 297//304 296//303 311//325 312//327 +f 290//306 289//305 304//326 305//328 +f 298//307 297//304 312//327 313//329 +f 291//308 290//306 305//328 306//330 +f 299//309 298//307 313//329 314//331 +f 292//310 291//308 306//330 307//332 +f 300//311 299//309 314//331 315//318 +f 293//312 292//310 307//332 308//320 +f 305//328 304//326 319//333 320//334 +f 313//329 312//327 327//335 328//336 +f 306//330 305//328 320//334 321//337 +f 314//331 313//329 328//336 329//338 +f 307//332 306//330 321//337 322//339 +f 315//318 314//331 329//338 330//340 +f 308//320 307//332 322//339 323//341 +f 316//319 315//318 330//340 331//342 +f 309//321 308//320 323//341 324//343 +f 317//322 316//319 331//342 332//344 +f 310//323 309//321 324//343 325//345 +f 303//324 257//18 318//346 +f 1//20 317//322 332//344 +f 311//325 310//323 325//345 326//347 +f 304//326 303//324 318//346 319//333 +f 312//327 311//325 326//347 327//335 +f 324//343 323//341 338//348 339//349 +f 332//344 331//342 346//350 347//351 +f 325//345 324//343 339//349 340//352 +f 318//346 257//18 333//353 +f 1//20 332//344 347//351 +f 326//347 325//345 340//352 341//354 +f 319//333 318//346 333//353 334//355 +f 327//335 326//347 341//354 342//356 +f 320//334 319//333 334//355 335//357 +f 328//336 327//335 342//356 343//358 +f 321//337 320//334 335//357 336//359 +f 329//338 328//336 343//358 344//360 +f 322//339 321//337 336//359 337//361 +f 330//340 329//338 344//360 345//362 +f 323//341 322//339 337//361 338//348 +f 331//342 330//340 345//362 346//350 +f 343//358 342//356 357//363 358//364 +f 336//359 335//357 350//365 351//366 +f 344//360 343//358 358//364 359//367 +f 337//361 336//359 351//366 352//368 +f 345//362 344//360 359//367 360//369 +f 338//348 337//361 352//368 353//370 +f 346//350 345//362 360//369 361//371 +f 339//349 338//348 353//370 354//372 +f 347//351 346//350 361//371 362//373 +f 340//352 339//349 354//372 355//374 +f 333//353 257//18 348//375 +f 1//20 347//351 362//373 +f 341//354 340//352 355//374 356//376 +f 334//355 333//353 348//375 349//377 +f 342//356 341//354 356//376 357//363 +f 335//357 334//355 349//377 350//365 +f 362//373 361//371 376//378 377//379 +f 355//374 354//372 369//380 370//381 +f 348//375 257//18 363//382 +f 1//20 362//373 377//379 +f 356//376 355//374 370//381 371//383 +f 349//377 348//375 363//382 364//384 +f 357//363 356//376 371//383 372//385 +f 350//365 349//377 364//384 365//386 +f 358//364 357//363 372//385 373//387 +f 351//366 350//365 365//386 366//388 +f 359//367 358//364 373//387 374//389 +f 352//368 351//366 366//388 367//390 +f 360//369 359//367 374//389 375//391 +f 353//370 352//368 367//390 368//392 +f 361//371 360//369 375//391 376//378 +f 354//372 353//370 368//392 369//380 +f 374//389 373//387 388//393 389//394 +f 367//390 366//388 381//395 382//396 +f 375//391 374//389 389//394 390//397 +f 368//392 367//390 382//396 383//398 +f 376//378 375//391 390//397 391//399 +f 369//380 368//392 383//398 384//400 +f 377//379 376//378 391//399 392//401 +f 370//381 369//380 384//400 385//402 +f 363//382 257//18 378//403 +f 1//20 377//379 392//401 +f 371//383 370//381 385//402 386//404 +f 364//384 363//382 378//403 379//405 +f 372//385 371//383 386//404 387//406 +f 365//386 364//384 379//405 380//407 +f 373//387 372//385 387//406 388//393 +f 366//388 365//386 380//407 381//395 +f 378//403 257//18 393//408 +f 1//20 392//401 407//409 +f 386//404 385//402 400//410 401//411 +f 379//405 378//403 393//408 394//412 +f 387//406 386//404 401//411 402//413 +f 380//407 379//405 394//412 395//414 +f 388//393 387//406 402//413 403//415 +f 381//395 380//407 395//414 396//416 +f 389//394 388//393 403//415 404//417 +f 382//396 381//395 396//416 397//418 +f 390//397 389//394 404//417 405//419 +f 383//398 382//396 397//418 398//420 +f 391//399 390//397 405//419 406//421 +f 384//400 383//398 398//420 399//422 +f 392//401 391//399 406//421 407//409 +f 385//402 384//400 399//422 400//410 +f 397//418 396//416 411//423 412//424 +f 405//419 404//417 419//425 420//426 +f 398//420 397//418 412//424 413//427 +f 406//421 405//419 420//426 421//428 +f 399//422 398//420 413//427 414//429 +f 407//409 406//421 421//428 422//430 +f 400//410 399//422 414//429 415//431 +f 393//408 257//18 408//432 +f 1//20 407//409 422//430 +f 401//411 400//410 415//431 416//433 +f 394//412 393//408 408//432 409//434 +f 402//413 401//411 416//433 417//435 +f 395//414 394//412 409//434 410//436 +f 403//415 402//413 417//435 418//437 +f 396//416 395//414 410//436 411//423 +f 404//417 403//415 418//437 419//425 +f 416//433 415//431 430//438 431//439 +f 409//434 408//432 423//440 424//441 +f 417//435 416//433 431//439 432//442 +f 410//436 409//434 424//441 425//443 +f 418//437 417//435 432//442 433//444 +f 411//423 410//436 425//443 426//445 +f 419//425 418//437 433//444 434//446 +f 412//424 411//423 426//445 427//447 +f 420//426 419//425 434//446 435//448 +f 413//427 412//424 427//447 428//449 +f 421//428 420//426 435//448 436//450 +f 414//429 413//427 428//449 429//451 +f 422//430 421//428 436//450 437//452 +f 415//431 414//429 429//451 430//438 +f 408//432 257//18 423//440 +f 1//20 422//430 437//452 +f 435//448 434//446 449//453 450//454 +f 428//449 427//447 442//455 443//456 +f 436//450 435//448 450//454 451//457 +f 429//451 428//449 443//456 444//458 +f 437//452 436//450 451//457 452//459 +f 430//438 429//451 444//458 445//460 +f 423//440 257//18 438//461 +f 1//20 437//452 452//459 +f 431//439 430//438 445//460 446//462 +f 424//441 423//440 438//461 439//463 +f 432//442 431//439 446//462 447//464 +f 425//443 424//441 439//463 440//465 +f 433//444 432//442 447//464 448//466 +f 426//445 425//443 440//465 441//467 +f 434//446 433//444 448//466 449//453 +f 427//447 426//445 441//467 442//455 +f 439//463 438//461 453//468 454//469 +f 447//464 446//462 461//470 462//471 +f 440//465 439//463 454//469 455//472 +f 448//466 447//464 462//471 463//473 +f 441//467 440//465 455//472 456//474 +f 449//453 448//466 463//473 464//475 +f 442//455 441//467 456//474 457//476 +f 450//454 449//453 464//475 465//477 +f 443//456 442//455 457//476 458//478 +f 451//457 450//454 465//477 466//479 +f 444//458 443//456 458//478 459//480 +f 452//459 451//457 466//479 467//481 +f 445//460 444//458 459//480 460//482 +f 438//461 257//18 453//468 +f 1//20 452//459 467//481 +f 446//462 445//460 460//482 461//470 +f 458//478 457//476 472//6 473//5 +f 466//479 465//477 480//1 481//9 +f 459//480 458//478 473//5 474//11 +f 467//481 466//479 481//9 482//13 +f 460//482 459//480 474//11 475//15 +f 453//468 257//18 468//17 +f 1//20 467//481 482//13 +f 461//470 460//482 475//15 476//21 +f 454//469 453//468 468//17 469//23 +f 462//471 461//470 476//21 477//25 +f 455//472 454//469 469//23 470//27 +f 463//473 462//471 477//25 478//29 +f 456//474 455//472 470//27 471//31 +f 464//475 463//473 478//29 479//2 +f 457//476 456//474 471//31 472//6 +f 465//477 464//475 479//2 480//1