diff --git a/src/jlmap3d/jl3dpassflow/jl3dpassflow.js b/src/jlmap3d/jl3dpassflow/jl3dpassflow.js index ada87e2ab..723a90ca9 100644 --- a/src/jlmap3d/jl3dpassflow/jl3dpassflow.js +++ b/src/jlmap3d/jl3dpassflow/jl3dpassflow.js @@ -354,7 +354,7 @@ export function Jl3dpassflow(dom) { } } } - },3000); + },1000); }; },1000); @@ -390,7 +390,7 @@ export function Jl3dpassflow(dom) { } moveanimateupdate(); - scope.anime = requestAnimationFrame(animate); + requestAnimationFrame(animate); } @@ -468,7 +468,7 @@ export function Jl3dpassflow(dom) { } if(humans[i].stage == 0){ - console.log(humans[i].doors); + // console.log(humans[i].doors); zhajiin[humans[i].doors].waiting = 0; humans[i].stage = 1; } @@ -805,8 +805,7 @@ export function Jl3dpassflow(dom) { } function zhajicontrol(type,door){ - console.log(door); - console.log(zhajiin); + let devicenum = door-1; if(type == "in"){ deviceaction[zhajiin[devicenum].id].action.reset(); diff --git a/src/jlmap3d/jl3dpassflow/jl3dpassflownew.js b/src/jlmap3d/jl3dpassflow/jl3dpassflownew.js new file mode 100644 index 000000000..b05c2fc8d --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/jl3dpassflownew.js @@ -0,0 +1,1102 @@ +import { Staticmodel } from '@/jlmap3d/jl3dpassflow/config.js'; +//loader +import { FBXLoader } from '@/jlmap3d/main/loaders/FBXLoader'; +import { OBJLoader } from '@/jlmap3d/main/loaders/OBJLoader'; + +import { OrbitControls } from '@/jlmap3d/main/control/OrbitControls'; + +import { ModelManager } from '@/jlmap3d/jl3dpassflow/loader.js'; +import { SkeletonUtils } from '@/jlmap3d/main/utils/SkeletonUtils.js'; + +import { Pathfinding } from '@/jlmap3d/jl3dpassflow/utils/Pathfinding.js'; +// const Pathfinding = window.threePathfinding.Pathfinding; +import { ZoneManager } from '@/jlmap3d/jl3dpassflow/model/zonemanager.js'; + +import StompClient from '@/utils/sock'; +import { Loading } from 'element-ui'; + +// const Pathfinding = window.threePathfinding.Pathfinding; +var clock = new THREE.Clock(); +let delta; +let scene,camerass,renderer; +let rendermode = 0; + +var mixers = []; +var testmesh1,testmesh2; +var humans = []; +var checkdoor1 = []; +var checkdoor2 = []; +var station; +var zhajiinmodel; +var zhajioutmodel; +var monitor; +let ids = 0; + +let humanlist = new THREE.Group(); + +let originhuman1 = null; +let originhuman2 = null; +let originanima1 = null; +let originanima2 = null; +let moveanimatelist = []; + +let zhajiin = []; +let zhajiout = []; + +let deviceaction = []; + +let passerwebwork = new Worker("../../static/workertest/passsimulation/passer.js"); +let stationwebwork = new Worker("../../static/workertest/passsimulation/station.js"); + +let stationzon = new ZoneManager(); + +for(let i=0;i<5;i++){ + checkdoor1[i]={ + id:"c1"+i, + status:0, + pos:[], + max:10 + }; +} + +for(let i=0;i<5;i++){ + let zhaji = { + id:"in0"+(i+1), + status:0, + waiting:0 + } + zhajiin.push(zhaji); +} + +for(let i=0;i<5;i++){ + let zhaji = { + id:"out0"+(i+1), + status:0, + waiting:0 + } + zhajiout.push(zhaji); +} + +let stationleft = []; +let stationright = []; + +for(let i=0;i<22;i++){ + let sl = { + id:"left"+i, + status:0, + waiting:0 + } + stationleft.push(sl); +} + +for(let i=0;i<22;i++){ + let sr = { + id:"right"+i, + status:0, + waiting:0 + } + stationright.push(sr); +} + +var windowWidth = window.innerWidth ; +var windowHeight = window.innerHeight; +var views = [ + { + left: 0, + bottom: 0, + width: 0.5, + height: 0.5, + background: new THREE.Color( 0.5, 0.5, 0.7 ), + eye: [ 3.7, 16, 26 ], + up: [3.7, 10 ,16 ], + fov: 30 + }, + { + left: 0, + bottom: 0.5, + width: 0.5, + height: 0.5, + background: new THREE.Color( 0.5, 0.5, 0.7 ), + eye: [ 3.7,17,-4 ], + up: [ 3.7, 10 ,16], + fov: 30 + }, + { + left: 0.5, + bottom: 0, + width: 0.5, + height: 0.5, + background: new THREE.Color( 0.7, 0.5, 0.5 ), + eye: [ -60, 6,11], + up: [ -59, 5.9,11 ], + fov: 45 + }, + { + left: 0.5, + bottom: 0.5, + width: 0.5, + height: 0.5, + background: new THREE.Color( 0.5, 0.7, 0.7 ), + eye: [ -7,17,2], + up: [-7, 10, 8], + fov: 60 + } + ]; + + +export function Jl3dpassflow(dom) { + var scope = this; + + this.dom = dom; + this.nowcode = null; + this.animateswitch = false; + this.signallights = []; + this.mixers = []; + this.showmodel = null; + //初始化webgl渲染 + renderer = new THREE.WebGLRenderer({ antialias: true }); + + renderer.setClearColor(new THREE.Color(0x000000)); + renderer.setSize(dom.offsetWidth, dom.offsetHeight); + + this.dom.appendChild(renderer.domElement); + + //定义相机 + + camerass = new THREE.PerspectiveCamera(70, dom.offsetWidth / dom.offsetHeight, 0.01, 1000); + camerass.position.set(0, 80, 40); + camerass.aspect = dom.offsetWidth / dom.offsetHeight; + camerass.updateProjectionMatrix(); + + for ( var ii = 0; ii < views.length; ++ ii ) { + + var view = views[ ii ]; + var camera = new THREE.PerspectiveCamera( view.fov, window.innerWidth / window.innerHeight, 1, 200 ); + camera.position.fromArray( view.eye ); + camera.lookAt( view.up[0],view.up[1],view.up[2] ); + view.camera = camera; + + } + + + + //定义场景(渲染容器) + scene = new THREE.Scene(); + scene.background = new THREE.Color(0xa0a0a0); + + var mesh = new THREE.Mesh(new THREE.PlaneBufferGeometry(200, 200), new THREE.MeshPhongMaterial({ color: 0x999999, depthWrite: false })); + mesh.rotation.x = - Math.PI / 2; + mesh.receiveShadow = true; + scene.add(mesh); + + var grid = new THREE.GridHelper(200, 20, 0x000000, 0x000000); + grid.material.opacity = 0.2; + grid.material.transparent = true; + scene.add(grid); + + + //定义全局光 + let ambientLight = new THREE.AmbientLight(0xffffff, 1.3); + scene.add(ambientLight); + + // + // var spotLight = new THREE.SpotLight(0xffffff); + // spotLight.position.set(-50, 60, 15); + // spotLight.castShadow = true; + // spotLight.shadow.mapSize.width = 1024; + // spotLight.shadow.mapSize.height = 1024; + // scene.add(spotLight); + + + + this.controls = new THREE.OrbitControls(camerass, dom); + this.controls.maxPolarAngle = Math.PI / 2; + this.controls.minPolarangle = Math.PI / 5; + this.controls.maxDistance = 800; + this.controls.screenSpacePanning = true; + this.controls.update(); + this.selectmodel = null; + + + const Color = { + GROUND: new THREE.Color( 0x606060 ).convertGammaToLinear( 2.2 ).getHex(), + NAVMESH: new THREE.Color( 0xFFFFFF ).convertGammaToLinear( 2.2 ).getHex(), + }; + + const ZONE = 'level'; + const SPEED = 10; + const OFFSET = 0.2; + + THREE.Pathfinding = Pathfinding; + + let level, navmesh; + + let groupID, path; + + const playerPosition = new THREE.Vector3( -3.5, 0.5, 5.5 ); + const targetPosition = new THREE.Vector3(); + + const pathfinder = new THREE.Pathfinding(); + const mouse = new THREE.Vector2(); + const raycaster = new THREE.Raycaster(); + + var loader = new THREE.OBJLoader(); + + // load a resource + loader.load( + // resource URL + '../../static/model/path/path.obj', + // called when resource is loaded + function ( object ) { + + + console.time('createZone()'); + const zone = THREE.Pathfinding.createZone(object.children[0].geometry); + console.timeEnd('createZone()'); + + pathfinder.setZoneData( ZONE, zone ); + + const navWireframe = new THREE.Mesh(object.children[0].geometry, new THREE.MeshBasicMaterial({ + color: 0x808080, + wireframe: true + })); + navWireframe.position.y = OFFSET / 2; + // scene.add(navWireframe); + + navmesh = object.children[0]; + // scene.add(navmesh); + + // Set the player's navigation mesh group + groupID = pathfinder.getGroup( ZONE, playerPosition ); + + }, + // called when loading is in progresses + function ( xhr ) { + + console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' ); + + }, + // called when loading has errors + function ( error ) { + + console.log( 'An error happened' ); + + } + ); + document.addEventListener( 'mouseup', onDocumentMouseUp, false ); + + function onDocumentMouseUp (event) { + + mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; + mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; + + + camerass.updateMatrixWorld(); + + raycaster.setFromCamera( mouse, camerass ); + + const intersects = raycaster.intersectObject( navmesh ); + + if ( !intersects.length ) return; + console.log(intersects[0].point); + targetPosition.copy( intersects[0].point ); + + originhuman1.position.copy( playerPosition ); + // Teleport on ctrl/cmd click or RMB. + if (event.metaKey || event.ctrlKey || event.button === 2) { + + path = null; + originhuman1.position.copy( playerPosition.copy( targetPosition ) ); + + return; + + } + + path = pathfinder.findPath( playerPosition, targetPosition, ZONE, groupID ); + + let points = []; + points.push(new THREE.Vector3(originhuman1.position.x,originhuman1.position.y,originhuman1.position.z)); + for(let i=0;i 0.05 * 0.05) { + // velocity.normalize(); + // // Move player to target + // playerPosition.add( velocity.multiplyScalar( dt * SPEED ) ); + // // originhuman1.lookAt(); + // originhuman1.position.copy( playerPosition ); + // } else { + // // Remove node from the path we calculated + // path.shift(); + // } + if(originhuman1.curve){ + if(originhuman1.progress<1){ + let point = originhuman1.curve.getPointAt(originhuman1.progress); + + //更新模型坐标 + originhuman1.position.x = point.x; + originhuman1.position.y = point.y; + originhuman1.position.z = point.z; + if((originhuman1.progress+0.001)<1){ + let tangent = originhuman1.curve.getPointAt(originhuman1.progress+0.001); + originhuman1.lookAt(new THREE.Vector3(tangent.x,originhuman1.position.y,tangent.z)); + } + + originhuman1.progress += 0.05; + }else{ + playerPosition.copy( originhuman1.position ) + } + + } + + } + + window.onresize = function () { + + renderer.setSize(scope.dom.offsetWidth, scope.dom.offsetHeight); + windowWidth = scope.dom.offsetWidth ; + windowHeight = scope.dom.offsetHeight; + + camerass.aspect = scope.dom.offsetWidth / scope.dom.offsetHeight; + camerass.updateProjectionMatrix(); + } + + this.anime = null; + + this.modelmanager = new ModelManager(); + let loadingInstance = Loading.service({ fullscreen: true }); + this.modelmanager.loadpromise(Staticmodel, scope.mixers).then(function (data) { + // console.log(scope.modelmanager); + initstationanimation(scope.modelmanager.station.mesh); + initzhajiinaimation(scope.modelmanager.zhajiin.mesh); + initzhajioutanimation(scope.modelmanager.zhajiout.mesh); + + level = scope.modelmanager.station.mesh; + + monitor = scope.modelmanager.monitor.mesh; + scene.add(monitor); + + + + + inithumans(); + + loadingInstance.close(); + + scope.switchrender(true); + + animate(); + }) + + function inithumans(){ + + originhuman1 = scope.modelmanager.man1.mesh; + originhuman1.progress = 1; + scene.add(originhuman1); + originhuman2 = scope.modelmanager.man2.mesh; + let mixer1 = new THREE.AnimationMixer( originhuman1 ); + let mixer2 = new THREE.AnimationMixer( originhuman2 ); + originanima1 = originhuman1.animations[ 0 ]; + originanima2 = originhuman2.animations[ 0 ]; + originhuman1.remove(originhuman1.children[2]); + scene.add(humanlist); + scene.add(scope.modelmanager.man1.mesh); + + for(let i=0;i<200;i++){ + var mantype = Math.floor(Math.random()*(3-1+1))+1; + let newhuman; + if(mantype == 1){ + newhuman = THREE.SkeletonUtils.clone( originhuman1 ); + newhuman.animations = []; + newhuman.animations.push(originanima1.clone()); + }else{ + newhuman = THREE.SkeletonUtils.clone( originhuman2 ); + newhuman.animations = []; + newhuman.animations.push(originanima2.clone()); + } + + // zhajiin[j].waiting = 1; + + let mixer = new THREE.AnimationMixer( newhuman ); + mixer.runplay = false; + let action = mixer.clipAction( newhuman.animations[ 0 ] ); + + newhuman.status = 1; + newhuman.stage = 0; + let newone = { + id:i, + mesh:newhuman, + direct:null, + doorstatus:null, + doors:null, + action:action, + mixer:mixer, + runrail:null + }; + + + + humans.push(newone); + mixers.push(mixer); + humanlist.add(newhuman); + } + + + + } + + + let checkobject = setInterval(function(){ + // console.log(originhuman1); + if(originhuman1){ + console.log("start"); + clearInterval(checkobject); + //进站控制 + startWorker(); + // stationwebwork.postMessage("on"); + // passerwebwork.postMessage("on"); + + }; + },1000); + + + + this.switchrender = function(mode){ + if(mode){ + rendermode = 0; + renderer.setViewport( 0, 0, scope.dom.offsetWidth, scope.dom.offsetHeight ); + renderer.setScissor( 0, 0, scope.dom.offsetWidth, scope.dom.offsetHeight ); + renderer.setScissorTest( false ); + renderer.setSize(scope.dom.offsetWidth, scope.dom.offsetHeight); + camerass.aspect = dom.offsetWidth / dom.offsetHeight; + camerass.updateProjectionMatrix(); + }else{ + rendermode = 1; + } + } + + function startWorker(){ + passerwebwork.onmessage = function (event) { + if(humans){ + // console.log(humans.length); + + // console.log(humans.length); + for(let i=0;i=0;i--){ + if(mixers[i]._actions[0].isRunning()){ + mixers[i].update( delta ); + } + } + + }; + stationwebwork.onmessage = function (event) { + // console.log("stationwebwork"); + if(humans.length<200){ + newhumancreate(); + } + }; + } + + + //循环渲染函数 + function animate() { + // console.log(rendermode); + if(rendermode == 0){ + renderer.render(scene, camerass); + scope.controls.update(); + }else{ + monitorrender(); + } + + delta = clock.getDelta(); + tick(delta); + requestAnimationFrame(animate); + + } + + function moveanimateinit(model,name,points,index,speed){ + + let curve = new THREE.CatmullRomCurve3(points); + curve.curvrtype = "chordal"; + // curve.getLength(); + // curve动画轨迹 + // progress动画进度 + // enable当前动画开关 + // speed动画速度 + // console.log(curve); + let animate = { + name:index, + index:index, + curve:curve, + progress:0, + directchange:false, + enable:true, + status:"start", + speed:speed, + }; + humans[index].runrail = animate; + humans[index].status = 1; + humans[index].action.play(); + humans[index].mixer.runplay = true; + moveanimatelist.push(animate); + } + + function moveanimateupdate(){ + if(humans.length>0){ + for(let i=0;i=1){ + // let point = humans[i].runrail.curve.getPointAt(1); + //更新模型坐标 + // console.log(moveanimatelist); + if(humans[i].status == 1){ + humans[i].runrail.enable = false; + humans[i].runrail.progress = 1; + humans[i].mixer.runplay = false; + humans[i].action.stop(); + humans[i].status = 0; + + if(humans[i].stage == 4){ + + humanlist.remove(humans[i].mesh); + // humans.splice(i,1); + } + + if(humans[i].stage == 3){ + + if(humans[i].direct == 1){ + + stationleft[humans[i].doors].waiting = 0; + }else{ + + stationright[humans[i].doors].waiting = 0; + } + humans[i].stage = 4; + + } + + if(humans[i].stage == 2){ + humans[i].stage = 3; + + } + + if(humans[i].stage == 1){ + + + humans[i].stage = 2; + + } + + if(humans[i].stage == 0){ + // console.log(humans[i].doors); + zhajiin[humans[i].doors].waiting = 0; + humans[i].stage = 1; + } + + moveanimatelist.splice(i,1); + + } + + }else{ + //根据动画进度获取动画轨迹上点 + + let point = humans[i].runrail.curve.getPointAt(humans[i].runrail.progress); + + //更新模型坐标 + humans[i].mesh.position.x = point.x; + humans[i].mesh.position.y = point.y; + humans[i].mesh.position.z = point.z; + if((humans[i].runrail.progress+0.001)<1){ + let tangent = humans[i].runrail.curve.getPointAt(humans[i].runrail.progress+0.001); + humans[i].mesh.lookAt(new THREE.Vector3(tangent.x,humans[i].mesh.position.y,tangent.z)); + } + + humans[i].runrail.progress += humans[i].runrail.speed; + point = null; + + } + + } + } + } + } + + function newhumancreate(){ + var direct = Math.floor(Math.random()*(3-1+1))+1; + var mantype = Math.floor(Math.random()*(3-1+1))+1; + // console.log(direct); + let points = []; + let newhuman; + if(mantype == 1){ + newhuman = THREE.SkeletonUtils.clone( originhuman1 ); + newhuman.animations = []; + newhuman.animations.push(originanima1.clone()); + }else{ + newhuman = THREE.SkeletonUtils.clone( originhuman2 ); + newhuman.animations = []; + newhuman.animations.push(originanima2.clone()); + } + + if(direct == 1|| direct == 2){ + let testposition = stationzon.getzoneposition("enter1"); + newhuman.position.set(32,10,25); + points.push(testposition); + points.push(new THREE.Vector3(26,10,21)); + points.push(new THREE.Vector3(18,10,18)); + }else{ + let testposition = stationzon.getzoneposition("enter2"); + newhuman.position.set(32,10,-5); + points.push(testposition); + points.push(new THREE.Vector3(26,10,12)); + points.push(new THREE.Vector3(24,10,17)); + points.push(new THREE.Vector3(18,10,18)); + } + + let j = Math.floor(Math.random()*(4-1+1))+1; + points.push(new THREE.Vector3(-0.5+j*1.4,10,18.5)); + // zhajiin[j].waiting = 1; + + let mixer = new THREE.AnimationMixer( newhuman ); + mixer.runplay = false; + let action = mixer.clipAction( newhuman.animations[ 0 ] ); + + var stationdirection = Math.floor(Math.random()*(2-1+1))+1; + let newone = { + id:humans.length, + mesh:newhuman, + status:1, + stage:0, + direct:stationdirection, + doorstatus:null, + doors:j, + action:action, + mixer:mixer, + runrail:null + }; + + humans.push(newone); + mixers.push(mixer); + humanlist.add(newhuman); + + + moveanimateinit(newone,humans.length,points,newone.id,0.002); + + // return newone; + } + + function initstationanimation(object){ + let mixer = new THREE.AnimationMixer( object ); + + let newclip = object.animations[ 0 ]; + for(let j=0;j 0) { + + // Grab the lowest f(x) to process next. Heap keeps this sorted for us. + const currentNode = openHeap.pop(); + + // End case -- result has been found, return the traced path. + if (currentNode === end) { + let curr = currentNode; + const ret = []; + while (curr.parent) { + ret.push(curr); + curr = curr.parent; + } + this.cleanUp(ret); + return ret.reverse(); + } + + // Normal case -- move currentNode from open to closed, process each of its neighbours. + currentNode.closed = true; + + // Find all neighbours for the current node. Optionally find diagonal neighbours as well (false by default). + const neighbours = this.neighbours(graph, currentNode); + + for (let i = 0, il = neighbours.length; i < il; i++) { + const neighbour = neighbours[i]; + + if (neighbour.closed) { + // Not a valid node to process, skip to next neighbour. + continue; + } + + // The g score is the shortest distance from start to current node. + // We need to check if the path we have arrived at this neighbour is the shortest one we have seen yet. + const gScore = currentNode.g + neighbour.cost; + const beenVisited = neighbour.visited; + + if (!beenVisited || gScore < neighbour.g) { + + // Found an optimal (so far) path to this node. Take score for node to see how good it is. + neighbour.visited = true; + neighbour.parent = currentNode; + if (!neighbour.centroid || !end.centroid) throw new Error('Unexpected state'); + neighbour.h = neighbour.h || this.heuristic(neighbour.centroid, end.centroid); + neighbour.g = gScore; + neighbour.f = neighbour.g + neighbour.h; + + if (!beenVisited) { + // Pushing to heap will put it in proper place based on the 'f' value. + openHeap.push(neighbour); + } else { + // Already seen the node, but since it has been rescored we need to reorder it in the heap + openHeap.rescoreElement(neighbour); + } + } + } + } + + // No result was found - empty array signifies failure to find path. + return []; + } + + static heuristic (pos1, pos2) { + return Utils.distanceToSquared(pos1, pos2); + } + + static neighbours (graph, node) { + const ret = []; + + for (let e = 0; e < node.neighbours.length; e++) { + ret.push(graph[node.neighbours[e]]); + } + + return ret; + } +} + +export { AStar }; diff --git a/src/jlmap3d/jl3dpassflow/utils/BinaryHeap.js b/src/jlmap3d/jl3dpassflow/utils/BinaryHeap.js new file mode 100644 index 000000000..07e4fac18 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/BinaryHeap.js @@ -0,0 +1,134 @@ +// javascript-astar +// http://github.com/bgrins/javascript-astar +// Freely distributable under the MIT License. +// Implements the astar search algorithm in javascript using a binary heap. + +class BinaryHeap { + constructor (scoreFunction) { + this.content = []; + this.scoreFunction = scoreFunction; + } + + push (element) { + // Add the new element to the end of the array. + this.content.push(element); + + // Allow it to sink down. + this.sinkDown(this.content.length - 1); + } + + pop () { + // Store the first element so we can return it later. + const result = this.content[0]; + // Get the element at the end of the array. + const end = this.content.pop(); + // If there are any elements left, put the end element at the + // start, and let it bubble up. + if (this.content.length > 0) { + this.content[0] = end; + this.bubbleUp(0); + } + return result; + } + + remove (node) { + const i = this.content.indexOf(node); + + // When it is found, the process seen in 'pop' is repeated + // to fill up the hole. + const end = this.content.pop(); + + if (i !== this.content.length - 1) { + this.content[i] = end; + + if (this.scoreFunction(end) < this.scoreFunction(node)) { + this.sinkDown(i); + } else { + this.bubbleUp(i); + } + } + } + + size () { + return this.content.length; + } + + rescoreElement (node) { + this.sinkDown(this.content.indexOf(node)); + } + + sinkDown (n) { + // Fetch the element that has to be sunk. + const element = this.content[n]; + + // When at 0, an element can not sink any further. + while (n > 0) { + // Compute the parent element's index, and fetch it. + const parentN = ((n + 1) >> 1) - 1; + const parent = this.content[parentN]; + + if (this.scoreFunction(element) < this.scoreFunction(parent)) { + // Swap the elements if the parent is greater. + this.content[parentN] = element; + this.content[n] = parent; + // Update 'n' to continue at the new position. + n = parentN; + } else { + // Found a parent that is less, no need to sink any further. + break; + } + } + } + + bubbleUp (n) { + // Look up the target element and its score. + const length = this.content.length, + element = this.content[n], + elemScore = this.scoreFunction(element); + + while (true) { + // Compute the indices of the child elements. + const child2N = (n + 1) << 1, + child1N = child2N - 1; + // This is used to store the new position of the element, + // if any. + let swap = null; + let child1Score; + // If the first child exists (is inside the array)... + if (child1N < length) { + // Look it up and compute its score. + const child1 = this.content[child1N]; + child1Score = this.scoreFunction(child1); + + // If the score is less than our element's, we need to swap. + if (child1Score < elemScore) { + swap = child1N; + } + } + + // Do the same checks for the other child. + if (child2N < length) { + const child2 = this.content[child2N], + child2Score = this.scoreFunction(child2); + if (child2Score < (swap === null ? elemScore : child1Score)) { + swap = child2N; + } + } + + // If the element needs to be moved, swap it, and continue. + if (swap !== null) { + this.content[n] = this.content[swap]; + this.content[swap] = element; + n = swap; + } + + // Otherwise, we are done. + else { + break; + } + } + } + +} + +export { BinaryHeap }; diff --git a/src/jlmap3d/jl3dpassflow/utils/Builder.js b/src/jlmap3d/jl3dpassflow/utils/Builder.js new file mode 100644 index 000000000..2c4a44749 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/Builder.js @@ -0,0 +1,200 @@ +import { + Vector3, +} from 'three'; + +import { Utils } from './Utils'; + +class Builder { + /** + * Constructs groups from the given navigation mesh. + * @param {Geometry} geometry + * @return {Zone} + */ + static buildZone (geometry) { + + const navMesh = this._buildNavigationMesh(geometry); + + const zone = {}; + + navMesh.vertices.forEach((v) => { + v.x = Utils.roundNumber(v.x, 2); + v.y = Utils.roundNumber(v.y, 2); + v.z = Utils.roundNumber(v.z, 2); + }); + + zone.vertices = navMesh.vertices; + + const groups = this._buildPolygonGroups(navMesh); + + // TODO: This block represents a large portion of navigation mesh construction time + // and could probably be optimized. For example, construct portals while + // determining the neighbor graph. + zone.groups = new Array(groups.length); + groups.forEach((group, groupIndex) => { + + const indexByPolygon = new Map(); // { polygon: index in group } + group.forEach((poly, polyIndex) => { indexByPolygon.set(poly, polyIndex); }); + + const newGroup = new Array(group.length); + group.forEach((poly, polyIndex) => { + + const neighbourIndices = []; + poly.neighbours.forEach((n) => neighbourIndices.push(indexByPolygon.get(n))); + + // Build a portal list to each neighbour + const portals = []; + poly.neighbours.forEach((n) => portals.push(this._getSharedVerticesInOrder(poly, n))); + + const centroid = new Vector3( 0, 0, 0 ); + centroid.add( zone.vertices[ poly.vertexIds[0] ] ); + centroid.add( zone.vertices[ poly.vertexIds[1] ] ); + centroid.add( zone.vertices[ poly.vertexIds[2] ] ); + centroid.divideScalar( 3 ); + centroid.x = Utils.roundNumber(centroid.x, 2); + centroid.y = Utils.roundNumber(centroid.y, 2); + centroid.z = Utils.roundNumber(centroid.z, 2); + + newGroup[polyIndex] = { + id: polyIndex, + neighbours: neighbourIndices, + vertexIds: poly.vertexIds, + centroid: centroid, + portals: portals + }; + }); + + zone.groups[groupIndex] = newGroup; + }); + + return zone; + } + + /** + * Constructs a navigation mesh from the given geometry. + * @param {Geometry} geometry + * @return {Object} + */ + static _buildNavigationMesh (geometry) { + geometry.mergeVertices(); + return this._buildPolygonsFromGeometry(geometry); + } + + static _buildPolygonGroups (navigationMesh) { + + const polygons = navigationMesh.polygons; + + const polygonGroups = []; + + const spreadGroupId = function (polygon) { + polygon.neighbours.forEach((neighbour) => { + if (neighbour.group === undefined) { + neighbour.group = polygon.group; + spreadGroupId(neighbour); + } + }); + }; + + polygons.forEach((polygon) => { + if (polygon.group !== undefined) { + // this polygon is already part of a group + polygonGroups[polygon.group].push(polygon); + } else { + // we need to make a new group and spread its ID to neighbors + polygon.group = polygonGroups.length; + spreadGroupId(polygon); + polygonGroups.push([polygon]); + } + }); + + return polygonGroups; + } + + static _buildPolygonNeighbours (polygon, vertexPolygonMap) { + const neighbours = new Set(); + + const groupA = vertexPolygonMap[polygon.vertexIds[0]]; + const groupB = vertexPolygonMap[polygon.vertexIds[1]]; + const groupC = vertexPolygonMap[polygon.vertexIds[2]]; + + // It's only necessary to iterate groups A and B. Polygons contained only + // in group C cannot share a >1 vertex with this polygon. + // IMPORTANT: Bublé cannot compile for-of loops. + groupA.forEach((candidate) => { + if (candidate === polygon) return; + if (groupB.includes(candidate) || groupC.includes(candidate)) { + neighbours.add(candidate); + } + }); + groupB.forEach((candidate) => { + if (candidate === polygon) return; + if (groupC.includes(candidate)) { + neighbours.add(candidate); + } + }); + + return neighbours; + } + + static _buildPolygonsFromGeometry (geometry) { + + const polygons = []; + const vertices = geometry.vertices; + + // Constructing the neighbor graph brute force is O(n²). To avoid that, + // create a map from vertices to the polygons that contain them, and use it + // while connecting polygons. This reduces complexity to O(n*m), where 'm' + // is related to connectivity of the mesh. + const vertexPolygonMap = new Array(vertices.length); // array of polygon objects by vertex index + for (let i = 0; i < vertices.length; i++) { + vertexPolygonMap[i] = []; + } + + // Convert the faces into a custom format that supports more than 3 vertices + geometry.faces.forEach((face) => { + const poly = { vertexIds: [face.a, face.b, face.c], neighbours: null }; + polygons.push(poly); + vertexPolygonMap[face.a].push(poly); + vertexPolygonMap[face.b].push(poly); + vertexPolygonMap[face.c].push(poly); + }); + + // Build a list of adjacent polygons + polygons.forEach((polygon) => { + polygon.neighbours = this._buildPolygonNeighbours(polygon, vertexPolygonMap); + }); + + return { + polygons: polygons, + vertices: vertices + }; + } + + static _getSharedVerticesInOrder (a, b) { + + const aList = a.vertexIds; + const a0 = aList[0], a1 = aList[1], a2 = aList[2]; + + const bList = b.vertexIds; + const shared0 = bList.includes(a0); + const shared1 = bList.includes(a1); + const shared2 = bList.includes(a2); + + // it seems that we shouldn't have an a and b with <2 shared vertices here unless there's a bug + // in the neighbor identification code, or perhaps a malformed input geometry; 3 shared vertices + // is a kind of embarrassing but possible geometry we should handle + if (shared0 && shared1 && shared2) { + return Array.from(aList); + } else if (shared0 && shared1) { + return [a0, a1]; + } else if (shared1 && shared2) { + return [a1, a2]; + } else if (shared0 && shared2) { + return [a2, a0]; // this ordering will affect the string pull algorithm later, not clear if significant + } else { + console.warn("Error processing navigation mesh neighbors; neighbors with <2 shared vertices found."); + return []; + } + } +} + +export { Builder }; diff --git a/src/jlmap3d/jl3dpassflow/utils/Channel.js b/src/jlmap3d/jl3dpassflow/utils/Channel.js new file mode 100644 index 000000000..1850bd2f7 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/Channel.js @@ -0,0 +1,93 @@ +import { Utils } from './Utils'; + +class Channel { + constructor () { + this.portals = []; + } + + push (p1, p2) { + if (p2 === undefined) p2 = p1; + this.portals.push({ + left: p1, + right: p2 + }); + } + + stringPull () { + const portals = this.portals; + const pts = []; + // Init scan state + let portalApex, portalLeft, portalRight; + let apexIndex = 0, + leftIndex = 0, + rightIndex = 0; + + portalApex = portals[0].left; + portalLeft = portals[0].left; + portalRight = portals[0].right; + + // Add start point. + pts.push(portalApex); + + for (let i = 1; i < portals.length; i++) { + const left = portals[i].left; + const right = portals[i].right; + + // Update right vertex. + if (Utils.triarea2(portalApex, portalRight, right) <= 0.0) { + if (Utils.vequal(portalApex, portalRight) || Utils.triarea2(portalApex, portalLeft, right) > 0.0) { + // Tighten the funnel. + portalRight = right; + rightIndex = i; + } else { + // Right over left, insert left to path and restart scan from portal left point. + pts.push(portalLeft); + // Make current left the new apex. + portalApex = portalLeft; + apexIndex = leftIndex; + // Reset portal + portalLeft = portalApex; + portalRight = portalApex; + leftIndex = apexIndex; + rightIndex = apexIndex; + // Restart scan + i = apexIndex; + continue; + } + } + + // Update left vertex. + if (Utils.triarea2(portalApex, portalLeft, left) >= 0.0) { + if (Utils.vequal(portalApex, portalLeft) || Utils.triarea2(portalApex, portalRight, left) < 0.0) { + // Tighten the funnel. + portalLeft = left; + leftIndex = i; + } else { + // Left over right, insert right to path and restart scan from portal right point. + pts.push(portalRight); + // Make current right the new apex. + portalApex = portalRight; + apexIndex = rightIndex; + // Reset portal + portalLeft = portalApex; + portalRight = portalApex; + leftIndex = apexIndex; + rightIndex = apexIndex; + // Restart scan + i = apexIndex; + continue; + } + } + } + + if ((pts.length === 0) || (!Utils.vequal(pts[pts.length - 1], portals[portals.length - 1].left))) { + // Append last point to path. + pts.push(portals[portals.length - 1].left); + } + + this.path = pts; + return pts; + } +} + +export { Channel }; diff --git a/src/jlmap3d/jl3dpassflow/utils/Pathfinding.js b/src/jlmap3d/jl3dpassflow/utils/Pathfinding.js new file mode 100644 index 000000000..be7925f58 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/Pathfinding.js @@ -0,0 +1,315 @@ +import { + Vector3, + Plane, + Geometry, + Triangle, +} from 'three'; + +import { Utils } from './Utils'; +import { AStar } from './AStar'; +import { Builder } from './Builder'; +import { Channel } from './Channel'; + +/** + * Defines an instance of the pathfinding module, with one or more zones. + */ +class Pathfinding { + constructor () { + this.zones = {}; + } + + /** + * (Static) Builds a zone/node set from navigation mesh geometry. + * @param {BufferGeometry} geometry + * @return {Zone} + */ + static createZone (geometry) { + if ( geometry.isGeometry ) { + // Haven't actually implemented support for BufferGeometry yet, but Geometry is somewhat + // not-recommended these days, so go ahead and start warning. + console.warn('[three-pathfinding]: Use BufferGeometry, not Geometry, to create zone.'); + } else { + geometry = new Geometry().fromBufferGeometry(geometry); + } + + return Builder.buildZone(geometry); + } + + /** + * Sets data for the given zone. + * @param {string} zoneID + * @param {Zone} zone + */ + setZoneData (zoneID, zone) { + this.zones[zoneID] = zone; + } + + /** + * Returns a random node within a given range of a given position. + * @param {string} zoneID + * @param {number} groupID + * @param {Vector3} nearPosition + * @param {number} nearRange + * @return {Node} + */ + getRandomNode (zoneID, groupID, nearPosition, nearRange) { + + if (!this.zones[zoneID]) return new Vector3(); + + nearPosition = nearPosition || null; + nearRange = nearRange || 0; + + const candidates = []; + const polygons = this.zones[zoneID].groups[groupID]; + + polygons.forEach((p) => { + if (nearPosition && nearRange) { + if (Utils.distanceToSquared(nearPosition, p.centroid) < nearRange * nearRange) { + candidates.push(p.centroid); + } + } else { + candidates.push(p.centroid); + } + }); + + return Utils.sample(candidates) || new Vector3(); + } + + /** + * Returns the closest node to the target position. + * @param {Vector3} position + * @param {string} zoneID + * @param {number} groupID + * @param {boolean} checkPolygon + * @return {Node} + */ + getClosestNode (position, zoneID, groupID, checkPolygon = false) { + const nodes = this.zones[zoneID].groups[groupID]; + const vertices = this.zones[zoneID].vertices; + let closestNode = null; + let closestDistance = Infinity; + + nodes.forEach((node) => { + const distance = Utils.distanceToSquared(node.centroid, position); + if (distance < closestDistance + && (!checkPolygon || Utils.isVectorInPolygon(position, node, vertices))) { + closestNode = node; + closestDistance = distance; + } + }); + + return closestNode; + } + + /** + * Returns a path between given start and end points. If a complete path + * cannot be found, will return the nearest endpoint available. + * + * @param {Vector3} startPosition Start position. + * @param {Vector3} targetPosition Destination. + * @param {string} zoneID ID of current zone. + * @param {number} groupID Current group ID. + * @return {Array} Array of points defining the path. + */ + findPath (startPosition, targetPosition, zoneID, groupID) { + const nodes = this.zones[zoneID].groups[groupID]; + const vertices = this.zones[zoneID].vertices; + + const closestNode = this.getClosestNode(startPosition, zoneID, groupID, true); + const farthestNode = this.getClosestNode(targetPosition, zoneID, groupID, true); + + // If we can't find any node, just go straight to the target + if (!closestNode || !farthestNode) { + return null; + } + + const paths = AStar.search(nodes, closestNode, farthestNode); + + const getPortalFromTo = function (a, b) { + for (var i = 0; i < a.neighbours.length; i++) { + if (a.neighbours[i] === b.id) { + return a.portals[i]; + } + } + }; + + // We have the corridor, now pull the rope. + const channel = new Channel(); + channel.push(startPosition); + for (let i = 0; i < paths.length; i++) { + const polygon = paths[i]; + const nextPolygon = paths[i + 1]; + + if (nextPolygon) { + const portals = getPortalFromTo(polygon, nextPolygon); + channel.push( + vertices[portals[0]], + vertices[portals[1]] + ); + } + } + channel.push(targetPosition); + channel.stringPull(); + + // Return the path, omitting first position (which is already known). + const path = channel.path.map((c) => new Vector3(c.x, c.y, c.z)); + path.shift(); + return path; + } +} + +/** + * Returns closest node group ID for given position. + * @param {string} zoneID + * @param {Vector3} position + * @return {number} + */ +Pathfinding.prototype.getGroup = (function() { + const plane = new Plane(); + return function (zoneID, position, checkPolygon = false) { + if (!this.zones[zoneID]) return null; + + let closestNodeGroup = null; + let distance = Math.pow(50, 2); + const zone = this.zones[zoneID]; + + for (let i = 0; i < zone.groups.length; i++) { + const group = zone.groups[i]; + for (const node of group) { + if (checkPolygon) { + plane.setFromCoplanarPoints( + zone.vertices[node.vertexIds[0]], + zone.vertices[node.vertexIds[1]], + zone.vertices[node.vertexIds[2]] + ); + if (Math.abs(plane.distanceToPoint(position)) < 0.01) { + const poly = [ + zone.vertices[node.vertexIds[0]], + zone.vertices[node.vertexIds[1]], + zone.vertices[node.vertexIds[2]] + ]; + if(Utils.isPointInPoly(poly, position)) { + return i; + } + } + } + const measuredDistance = Utils.distanceToSquared(node.centroid, position); + if (measuredDistance < distance) { + closestNodeGroup = i; + distance = measuredDistance; + } + } + } + + return closestNodeGroup; + }; +}()); + +/** + * Clamps a step along the navmesh, given start and desired endpoint. May be + * used to constrain first-person / WASD controls. + * + * @param {Vector3} start + * @param {Vector3} end Desired endpoint. + * @param {Node} node + * @param {string} zoneID + * @param {number} groupID + * @param {Vector3} endTarget Updated endpoint. + * @return {Node} Updated node. + */ +Pathfinding.prototype.clampStep = (function () { + const point = new Vector3(); + const plane = new Plane(); + const triangle = new Triangle(); + + const endPoint = new Vector3(); + + let closestNode; + let closestPoint = new Vector3(); + let closestDistance; + + return function (startRef, endRef, node, zoneID, groupID, endTarget) { + const vertices = this.zones[zoneID].vertices; + const nodes = this.zones[zoneID].groups[groupID]; + + const nodeQueue = [node]; + const nodeDepth = {}; + nodeDepth[node.id] = 0; + + closestNode = undefined; + closestPoint.set(0, 0, 0); + closestDistance = Infinity; + + // Project the step along the current node. + plane.setFromCoplanarPoints( + vertices[node.vertexIds[0]], + vertices[node.vertexIds[1]], + vertices[node.vertexIds[2]] + ); + plane.projectPoint(endRef, point); + endPoint.copy(point); + + for (let currentNode = nodeQueue.pop(); currentNode; currentNode = nodeQueue.pop()) { + + triangle.set( + vertices[currentNode.vertexIds[0]], + vertices[currentNode.vertexIds[1]], + vertices[currentNode.vertexIds[2]] + ); + + triangle.closestPointToPoint(endPoint, point); + + if (point.distanceToSquared(endPoint) < closestDistance) { + closestNode = currentNode; + closestPoint.copy(point); + closestDistance = point.distanceToSquared(endPoint); + } + + const depth = nodeDepth[currentNode.id]; + if (depth > 2) continue; + + for (let i = 0; i < currentNode.neighbours.length; i++) { + const neighbour = nodes[currentNode.neighbours[i]]; + if (neighbour.id in nodeDepth) continue; + + nodeQueue.push(neighbour); + nodeDepth[neighbour.id] = depth + 1; + } + } + + endTarget.copy(closestPoint); + return closestNode; + }; +}()); + +/** + * Defines a zone of interconnected groups on a navigation mesh. + * + * @type {Object} + * @property {Array} groups + * @property {Array} vertices + */ +const Zone = {}; // jshint ignore:line + +/** + * Defines a group within a navigation mesh. + * + * @type {Object} + */ +const Group = {}; // jshint ignore:line + +/** + * Defines a node (or polygon) within a group. + * + * @type {Object} + * @property {number} id + * @property {Array} neighbours IDs of neighboring nodes. + * @property {Array} vertexIds + * @property {Vector3} centroid + * @property {Array>} portals Array of portals, each defined by two vertex IDs. + * @property {boolean} closed + * @property {number} cost + */ +const Node = {}; // jshint ignore:line + +export { Pathfinding }; diff --git a/src/jlmap3d/jl3dpassflow/utils/PathfindingHelper.js b/src/jlmap3d/jl3dpassflow/utils/PathfindingHelper.js new file mode 100644 index 000000000..20a869e9c --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/PathfindingHelper.js @@ -0,0 +1,53 @@ +import { + Color, + Object3D, + LineBasicMaterial, + MeshBasicMaterial, + SphereBufferGeometry, + BoxGeometry, + Mesh, + SphereGeometry, + Geometry, + Vector3, + Line, +} from 'three'; + +const OFFSET = 0.2; + +/** + * Helper for debugging pathfinding behavior. + */ +class PathfindingHelper extends Object3D { + constructor () { + super(); + + this._playerMarker = null; + + this._markers = [ + this._playerMarker, + ]; + + this._markers.forEach( ( marker ) => { + this.add( marker ); + + } ); + + } + + + + /** + * @param {Vector3} position + * @return {this} + */ + setPlayerPosition( position ) { + // this._playerMarker.lookAt(position); + this._playerMarker.position.copy( position ); + return this; + + } + + +} + +export { PathfindingHelper }; diff --git a/src/jlmap3d/jl3dpassflow/utils/Utils.js b/src/jlmap3d/jl3dpassflow/utils/Utils.js new file mode 100644 index 000000000..d8a80b574 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/Utils.js @@ -0,0 +1,66 @@ +class Utils { + + static roundNumber (value, decimals) { + const factor = Math.pow(10, decimals); + return Math.round(value * factor) / factor; + } + + static sample (list) { + return list[Math.floor(Math.random() * list.length)]; + } + + static distanceToSquared (a, b) { + + var dx = a.x - b.x; + var dy = a.y - b.y; + var dz = a.z - b.z; + + return dx * dx + dy * dy + dz * dz; + + } + + //+ Jonas Raoni Soares Silva + //@ http://jsfromhell.com/math/is-point-in-poly [rev. #0] + static isPointInPoly (poly, pt) { + for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i].z <= pt.z && pt.z < poly[j].z) || (poly[j].z <= pt.z && pt.z < poly[i].z)) && (pt.x < (poly[j].x - poly[i].x) * (pt.z - poly[i].z) / (poly[j].z - poly[i].z) + poly[i].x) && (c = !c); + return c; + } + + static isVectorInPolygon (vector, polygon, vertices) { + + // reference point will be the centroid of the polygon + // We need to rotate the vector as well as all the points which the polygon uses + + var lowestPoint = 100000; + var highestPoint = -100000; + + var polygonVertices = []; + + polygon.vertexIds.forEach((vId) => { + lowestPoint = Math.min(vertices[vId].y, lowestPoint); + highestPoint = Math.max(vertices[vId].y, highestPoint); + polygonVertices.push(vertices[vId]); + }); + + if (vector.y < highestPoint + 0.5 && vector.y > lowestPoint - 0.5 && + this.isPointInPoly(polygonVertices, vector)) { + return true; + } + return false; + } + + static triarea2 (a, b, c) { + var ax = b.x - a.x; + var az = b.z - a.z; + var bx = c.x - a.x; + var bz = c.z - a.z; + return bx * az - ax * bz; + } + + static vequal (a, b) { + return this.distanceToSquared(a, b) < 0.00001; + } +} + +export { Utils }; diff --git a/src/jlmap3d/jl3dpassflow/utils/index.js b/src/jlmap3d/jl3dpassflow/utils/index.js new file mode 100644 index 000000000..bd702f6f9 --- /dev/null +++ b/src/jlmap3d/jl3dpassflow/utils/index.js @@ -0,0 +1,4 @@ +import { Pathfinding } from './Pathfinding'; +import { PathfindingHelper } from './PathfindingHelper'; + +export { Pathfinding, PathfindingHelper }; diff --git a/src/jlmap3d/jl3dsimulation/connect/Jlmap3dSubscribeNew.js b/src/jlmap3d/jl3dsimulation/connect/Jlmap3dSubscribeNew.js index 57285b9f7..c35bdce7e 100644 --- a/src/jlmap3d/jl3dsimulation/connect/Jlmap3dSubscribeNew.js +++ b/src/jlmap3d/jl3dsimulation/connect/Jlmap3dSubscribeNew.js @@ -53,12 +53,12 @@ export function Jlmap3dSubscribeNew(jlmap3d,routegroup,jsonwebwork) { jsonwebwork.onmessage = function (event) { - + // console.log(event.data); // if(event.data.deviceType == "TRAIN"){ // // console.log(event.data); // // } - console.log(event.data); + // console.log(event.data); if(event.data.type == "Device_Load_Destroy_3D"){ DeviceDestroy(event.data); return; @@ -150,7 +150,6 @@ export function Jlmap3dSubscribeNew(jlmap3d,routegroup,jsonwebwork) { let code = data.code; if(trainlisttest.list[code].right != data.right){ - if(data.right == "0"){ trainlisttest.list[code].right = "0"; trainlisttest.list[code].rotation.y = Math.PI; @@ -442,27 +441,28 @@ export function Jlmap3dSubscribeNew(jlmap3d,routegroup,jsonwebwork) { for(let i=0,leni=data.length;i 1) { + const points = []; + for (let i = 0; i < model.points.length; i++) { + points.push([model.points[i].x, model.points[i].y]); + } + this.line = new Polyline({ + zlevel: this.zlevel, + progressive: model.progressive, + z: this.z, + shape: { + points: points + }, + style: { + lineWidth: model.width, + stroke: style.Power.strokeColor + } + }); + this.add(this.line); + } + } + + createTerminal() { // 创建左右端点 + const model = this.model; + const style = this.style; + if (model && model.leftTerminal) { // 左端点 + const traingle = new JTriangle(model.points[0], model.points[1]); + this.leftTerminal = new ESeparator({ + style: style, + zlevel: this.zlevel, + z: this.z + 3, + traingle: traingle, + width: model.width, + stroke: style.Power.strokeColor, + point: { + x: model.points[0].x, + y: model.points[0].y + } + }); + this.add(this.leftTerminal); + } + if (model && model.rightTerminal) { // 右端点 + const traingle = new JTriangle(model.points[model.points.length - 2], model.points[model.points.length - 1]); + this.rightTerminal = new ESeparator({ + style: style, + zlevel: this.zlevel, + z: this.z + 3, + traingle: traingle, + width: model.width, + stroke: style.Power.strokeColor, + point: { + x: model.points[model.points.length - 1].x, + y: model.points[model.points.length - 1].y + } + }); + this.add(this.rightTerminal); + } + } + + setLineType(type) { + switch (type) { + case '01': break; + case '02': + this.eachChild((child) => { + child.setStyle('lineDash', this.style.Line.lineDash || [4]); + }); + break; + } + } + + setState(model) { + if (!this.isShowShape) return; + this.setLineType(model.type); + } + // 设置显示模式 + setShowMode() { + const showMode = this.model.showMode; + const showConditions = this.model.showConditions; + if (!showConditions || showConditions === '01' || showMode === showConditions) { + this.eachChild((child) => { + child.show(); + }); + } else { + this.eachChild((child) => { + child.hide(); + }); + } + } + setShowStation(stationCode) { + if (!stationCode || this.model.stationCode === stationCode) { + this.eachChild((child) => { + child.show(); + }); + this.isShowShape = true; + this.setState(this.model); + } else { + this.eachChild((child) => { + child.hide(); + }); + this.isShowShape = false; + } + } +} diff --git a/src/jmapNew/shape/Station/ESingleControl.js b/src/jmapNew/shape/Station/ESingleControl.js index ad2956851..3d87a0ec7 100644 --- a/src/jmapNew/shape/Station/ESingleControl.js +++ b/src/jmapNew/shape/Station/ESingleControl.js @@ -70,6 +70,12 @@ export default class ESingleControl extends Group { this.control.setStyle('fill', color); } } + + setTextColor(color) { + if (color) { + this.text.setStyle('textFill', color); + } + } getArcBoundingRect() { const rect = this.control.getBoundingRect().clone(); const scale = this.control.scale[0]; diff --git a/src/jmapNew/shape/Station/index.js b/src/jmapNew/shape/Station/index.js index ca5433e33..d508a395a 100644 --- a/src/jmapNew/shape/Station/index.js +++ b/src/jmapNew/shape/Station/index.js @@ -291,12 +291,15 @@ export default class Station extends Group { this.emergencyControl && this.emergencyControl.setColor(this.style.Station.StationControl.lamp.grayColor); this.substationControl && this.substationControl.setColor(this.style.Station.StationControl.lamp.grayColor); this.centerControl && this.centerControl.setColor(this.style.Station.StationControl.lamp.greenColor); + this.centerControl && this.centerControl.setTextColor(this.style.Station.StationControl.lamp.greenColor); // 文字颜色 } handleLocal() { // 站控 this.emergencyControl && this.emergencyControl.setColor(this.style.Station.StationControl.lamp.grayColor); this.substationControl && this.substationControl.setColor(this.style.Station.StationControl.lamp.yellowColor); + this.substationControl && this.substationControl.setTextColor(this.style.Station.StationControl.lamp.yellowColor); // 文字颜色 this.centerControl && this.centerControl.setColor(this.style.Station.StationControl.lamp.grayColor); + this.arrowsControl && this.arrowsControl.setColor(this.style.Station.StationControl.lamp.greenColor); } handleEmergency() { // 紧急站控 @@ -315,7 +318,8 @@ export default class Station extends Group { setState(model) { if (!this.isShowShape) return; this.recover(); - model.controlMode && this['handle' + model.controlMode](); + // model.controlMode && this['handle' + model.controlMode](); + this.handleLocal(); } getShapeTipPoint(opts) { diff --git a/src/jmapNew/shape/factory.js b/src/jmapNew/shape/factory.js index 4741ab55a..02ed5d3c7 100644 --- a/src/jmapNew/shape/factory.js +++ b/src/jmapNew/shape/factory.js @@ -24,6 +24,7 @@ import AutomaticRoute from './AutomacticRoute/index.js'; import SaidLamp from './SaidLamp/index.js'; import SplitStation from './SplitStation/index'; import Arrow from './Arrow/index'; +import Power from './Power/index'; /** 图库*/ const mapShape = {}; @@ -69,6 +70,7 @@ mapShape[deviceType.Axle] = SaidLamp; mapShape[deviceType.SwitchFault] = SaidLamp; mapShape[deviceType.SplitStation] = SplitStation; mapShape[deviceType.Arrow] = Arrow; +mapShape[deviceType.Power] = Power; function shapefactory(device, jmap) { const type = device._type; diff --git a/src/jmapNew/theme/beijing_01/menus/menuButton.vue b/src/jmapNew/theme/beijing_01/menus/menuButton.vue index 6cd39b79d..8f6275fc4 100644 --- a/src/jmapNew/theme/beijing_01/menus/menuButton.vue +++ b/src/jmapNew/theme/beijing_01/menus/menuButton.vue @@ -302,7 +302,7 @@ export default { '$store.state.menuOperation.selectedCount': function (val) { this.selectedChange(); } - }, + }, mounted() { this.resetPosition(); }, diff --git a/src/jmapNew/utils/parser.js b/src/jmapNew/utils/parser.js index e75dc26ed..c7c3f6186 100644 --- a/src/jmapNew/utils/parser.js +++ b/src/jmapNew/utils/parser.js @@ -144,9 +144,12 @@ export function parser(data, skinCode, showConfig) { zrUtil.each(data.splitStationList || [], elem => { mapDevice[elem.code] = createDevice(deviceType.SplitStation, elem, propConvert, showConfig); }, this); - zrUtil.each( data.arrowList || [], elem => { + zrUtil.each(data.arrowList || [], elem => { mapDevice[elem.code] = createDevice(deviceType.Arrow, elem, propConvert, showConfig); }, this); + zrUtil.each(data.powerList || [], elem => { + mapDevice[elem.code] = createDevice(deviceType.Power, elem, propConvert, showConfig); + }, this); zrUtil.each(data.indicatorLightList || [], elem => { switch (elem.type) { case 'AtsControl': @@ -326,6 +329,7 @@ export function updateMapData(state, model) { case deviceType.SplitStation: updateForList(model, state, 'splitStationList'); break; case deviceType.SwitchFault: updateForList(model, state, 'indicatorLightList'); break; case deviceType.Arrow: updateForList(model, state, 'arrowList'); break; + case deviceType.Power: updateForList(model, state, 'powerList'); break; } } } diff --git a/src/store/modules/map.js b/src/store/modules/map.js index 3205a7be4..96f3d7bd4 100644 --- a/src/store/modules/map.js +++ b/src/store/modules/map.js @@ -342,6 +342,13 @@ const map = { return []; } }, + powerList: (state) => { + if (state.map) { + return state.map.powerList || []; + } else { + return []; + } + }, tempSpeedLimitList: (state) => { if (state.map) { return state.map.tempSpeedLimitList; diff --git a/src/views/jlmap3d/passflow/jl3dpassflow.vue b/src/views/jlmap3d/passflow/jl3dpassflow.vue index b60de1e1b..d5d1f4068 100644 --- a/src/views/jlmap3d/passflow/jl3dpassflow.vue +++ b/src/views/jlmap3d/passflow/jl3dpassflow.vue @@ -30,7 +30,7 @@ export default { return { jl3d: null, rendermode:'监控视角', - renderswitch:true + renderswitch:false }; }, computed: { diff --git a/src/views/jsxt/competition/examDetail.vue b/src/views/jsxt/competition/examDetail.vue index 48ecc8904..46375740c 100644 --- a/src/views/jsxt/competition/examDetail.vue +++ b/src/views/jsxt/competition/examDetail.vue @@ -182,7 +182,7 @@ export default { } else { getPracticalQuestion(this.$route.query.raceId).then((responese)=>{ if (responese.data) { - participantCreatTrainingRoom(this.$route.query.raceId, {mapId: 41, prdType: '02'}).then(resp => { + participantCreatTrainingRoom(this.$route.query.raceId, {mapId: 41, prdType: '03'}).then(resp => { const query = { lineCode: '11', mapId: '41', group: resp.data, raceId: this.$route.query.raceId}; this.$router.replace({ path: `/jointTrainingNew`, query: query}); }); diff --git a/src/views/newMap/displayNew/chatView/chatBox.vue b/src/views/newMap/displayNew/chatView/chatBox.vue index 64278f6be..c0221b57c 100644 --- a/src/views/newMap/displayNew/chatView/chatBox.vue +++ b/src/views/newMap/displayNew/chatView/chatBox.vue @@ -2,7 +2,7 @@
- +
@@ -11,8 +11,8 @@
-
- +
+
@@ -43,12 +43,14 @@
+
+ diff --git a/src/views/newMap/displayNew/chatView/chatMemberList.vue b/src/views/newMap/displayNew/chatView/chatMemberList.vue index ddb243928..1fc6bcdb3 100644 --- a/src/views/newMap/displayNew/chatView/chatMemberList.vue +++ b/src/views/newMap/displayNew/chatView/chatMemberList.vue @@ -5,14 +5,16 @@
{{ member.memberName }}
+
+ diff --git a/static/model/path/path.obj b/static/model/path/path.obj new file mode 100644 index 000000000..279d3e50d --- /dev/null +++ b/static/model/path/path.obj @@ -0,0 +1,2339 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 26.05.2020 14:22:29 + +mtllib path1.mtl + +# +# object Object003 +# + +v -8.9962 1.7700 -3.8817 +v -8.9962 1.7700 26.4933 +v -8.9962 1.7700 20.0796 +v -8.9962 1.7700 3.6701 +v -73.7774 1.7700 3.6701 +v -73.7774 1.7700 20.0796 +v 62.6500 1.7700 20.0796 +v 62.6500 1.7700 3.6701 +v 6.5981 1.7700 -3.8817 +v 16.4686 1.7700 -3.8817 +v 33.2752 1.7700 -3.8817 +v 54.4041 1.7700 -3.8817 +v -67.5531 1.7700 26.4933 +v -46.4919 1.7700 26.4933 +v -32.8491 1.7700 26.4933 +v -19.2064 1.7700 26.4933 +v -19.2064 1.7700 -3.8817 +v -32.8491 1.7700 -3.8817 +v -46.4919 1.7700 -3.8817 +v -66.9803 1.7700 -3.8817 +v 6.5981 1.7700 26.4933 +v 16.4686 1.7700 26.4933 +v 33.2752 1.7700 26.4933 +v 55.8860 1.7700 26.4933 +v -19.2064 1.7700 3.6701 +v -32.8491 1.7700 3.6701 +v -46.4919 1.7700 3.6701 +v -66.9803 1.7700 3.6701 +v -67.5531 1.7700 20.0796 +v -46.4919 1.7700 20.0796 +v -32.8491 1.7700 20.0796 +v -19.2064 1.7700 20.0796 +v 54.4041 1.7700 3.6701 +v 33.2752 1.7700 3.6701 +v 16.4686 1.7700 3.6701 +v 6.5981 1.7700 3.6701 +v 6.5981 1.7700 20.0796 +v 16.4686 1.7700 20.0796 +v 33.2752 1.7700 20.0796 +v 55.8860 1.7700 20.0796 +v -73.7774 1.7700 7.3729 +v -73.7774 1.7700 15.4537 +v -64.5896 1.7700 7.3729 +v -64.5896 1.7700 15.4537 +v -46.3581 1.7700 10.6700 +v -46.3581 1.7700 12.1065 +v -64.5896 1.7700 10.0665 +v -64.5896 1.7700 12.7601 +v -63.4810 1.7700 12.0071 +v -61.2585 1.7700 12.0071 +v -54.5549 1.7700 12.0355 +v -51.0997 1.7700 12.2997 +v -48.2912 1.7700 11.8423 +v -46.6636 1.7700 11.8423 +v -46.6636 1.7700 10.6868 +v -48.2912 1.7700 10.6868 +v -51.0997 1.7700 10.1886 +v -54.5549 1.7700 10.3210 +v -61.2585 1.7700 10.4683 +v -63.4810 1.7700 10.4683 +v -43.0812 1.7700 26.4933 +v -39.6705 1.7700 26.4933 +v -36.2598 1.7700 26.4933 +v -36.2598 1.7700 -3.8817 +v -39.6705 1.7700 -3.8817 +v -43.0812 1.7700 -3.8817 +v -36.2598 1.7700 3.6701 +v -39.6705 1.7700 3.6701 +v -43.0812 1.7700 3.6701 +v -43.0812 1.7700 20.0796 +v -39.6705 1.7700 20.0796 +v -36.2598 1.7700 20.0796 +v -8.9962 1.7700 14.6978 +v -8.9962 1.7700 7.9943 +v 62.6500 1.7700 14.9969 +v 62.6500 1.7700 7.5672 +v -20.9192 1.7700 11.9786 +v -20.9192 1.7700 10.4133 +v -32.8491 1.7700 14.6097 +v -32.8491 1.7700 7.9943 +v 6.5981 1.7700 11.3556 +v 6.5981 1.7700 14.6978 +v 16.4686 1.7700 7.9943 +v 16.4686 1.7700 14.6097 +v 50.4514 1.7700 14.9969 +v 50.5224 1.7700 7.5672 +v 33.2752 1.7700 14.6097 +v 33.2752 1.7700 7.9943 +v -43.7832 1.7700 10.3643 +v -43.7832 1.7700 11.9764 +v -41.4092 1.7700 10.3643 +v -41.4092 1.7700 11.9764 +v -40.0577 1.7700 14.6097 +v -40.0577 1.7700 7.9943 +v -27.3418 1.7700 26.4933 +v -23.7540 1.7700 26.4933 +v -23.7540 1.7700 -3.8817 +v -27.3418 1.7700 -3.8817 +v -23.7540 1.7700 3.6701 +v -27.3418 1.7700 3.6701 +v -27.3418 1.7700 20.0796 +v -23.7540 1.7700 20.0796 +v -23.1627 1.7700 10.4133 +v -27.3418 1.7700 7.9943 +v -27.3418 1.7700 14.6097 +v -23.1627 1.7700 11.9786 +v -13.3889 1.7700 -3.8817 +v -14.6588 1.7700 -3.8817 +v -13.3889 1.7700 3.6701 +v -14.6588 1.7700 3.6701 +v -14.6588 1.7700 26.4933 +v -10.1112 1.7700 26.4933 +v -14.6588 1.7700 20.0796 +v -10.1112 1.7700 20.0796 +v -12.5445 1.7700 11.3755 +v -18.0861 1.7700 11.3755 +v -18.0861 1.7700 14.6978 +v -10.6822 1.7700 14.6978 +v -3.3044 1.7700 -3.8817 +v 2.3873 1.7700 -3.8817 +v -3.3044 1.7700 26.4933 +v 2.3873 1.7700 26.4933 +v -3.3044 1.7700 20.0796 +v 2.3873 1.7700 20.0796 +v 2.3873 1.7700 3.6701 +v -3.6383 1.7700 3.6701 +v -3.3044 1.7700 14.6978 +v 2.3873 1.7700 14.6978 +v 1.5269 1.7700 11.3556 +v -3.6383 1.7700 7.9943 +v -0.3188 1.7700 -3.8817 +v -0.3188 1.7700 3.6701 +v -0.3838 1.7700 7.9074 +v -0.1964 1.7700 10.4165 +v 10.1563 1.7700 -3.8817 +v 12.2524 1.7700 -3.8817 +v 10.1563 1.7700 26.4933 +v 12.2524 1.7700 26.4933 +v 12.2524 1.7700 3.6701 +v 10.1563 1.7700 3.6701 +v 10.1563 1.7700 20.0796 +v 12.2524 1.7700 20.0796 +v 10.1563 1.7700 12.1642 +v 12.2524 1.7700 12.1642 +v 12.2524 1.7700 10.2589 +v 10.1563 1.7700 10.1269 +v 22.7198 1.7700 -3.8817 +v 29.1133 1.7700 -3.8817 +v 22.7198 1.7700 26.4933 +v 29.1133 1.7700 26.4933 +v 29.1133 1.7700 3.6701 +v 22.7198 1.7700 3.6701 +v 22.7198 1.7700 20.0796 +v 29.1133 1.7700 20.0796 +v 22.7198 1.7700 14.6097 +v 29.1133 1.7700 14.6097 +v 29.1133 1.7700 7.9943 +v 22.7198 1.7700 7.9943 +v 41.2768 1.7700 -3.8817 +v 46.7687 1.7700 -3.8817 +v 41.7369 1.7700 26.4933 +v 47.7302 1.7700 26.4933 +v 46.7687 1.7700 3.6701 +v 41.2768 1.7700 3.6701 +v 41.7369 1.7700 20.0796 +v 47.7302 1.7700 20.0796 +v 44.2499 1.7700 7.9943 +v 40.0714 1.7700 7.9943 +v 40.0494 1.7700 14.6097 +v 44.2038 1.7700 14.6097 +v 36.1802 1.7700 -3.8817 +v 38.1806 1.7700 -3.8817 +v 36.2437 1.7700 26.4933 +v 38.3998 1.7700 26.4933 +v 36.2437 1.7700 20.0796 +v 38.3998 1.7700 20.0796 +v 36.0109 1.7700 14.6097 +v 37.5960 1.7700 14.6097 +v 38.1806 1.7700 3.6701 +v 36.1802 1.7700 3.6701 +v 37.6065 1.7700 7.9943 +v 36.0139 1.7700 7.9943 +v 50.4791 1.7700 12.0256 +v 50.4946 1.7700 10.5785 +v 33.2752 1.7700 12.0256 +v 33.2752 1.7700 10.5785 +v 28.6630 1.7740 10.3745 +v 28.6532 1.7740 12.1864 +v 40.0628 1.7700 10.1071 +v 40.0580 1.7700 12.0256 +v 44.2218 1.7700 12.0256 +v 44.2319 1.7700 10.1071 +v 36.0127 1.7700 10.5785 +v 36.0121 1.7700 12.0256 +v 37.6001 1.7700 12.0256 +v 37.6024 1.7700 10.5785 +v 31.6495 1.7700 3.6701 +v 30.7390 1.7700 3.6701 +v 31.6495 1.7700 7.9943 +v 30.7390 1.7700 7.9943 +v 30.7390 1.7700 -3.8817 +v 31.6495 1.7700 -3.8817 +v 30.7390 1.7700 26.4933 +v 31.6495 1.7700 26.4933 +v 30.7390 1.7700 20.0796 +v 31.6495 1.7700 20.0796 +v 30.7390 1.7700 14.6097 +v 31.6495 1.7700 14.6097 +v 31.6495 1.7700 10.5785 +v 30.7390 1.7700 10.5785 +v 30.7390 1.7700 12.0256 +v 31.6495 1.7700 12.0256 +v 51.4215 1.7700 3.6701 +v 49.7513 1.7700 3.6701 +v 48.0722 1.7700 7.9943 +v 46.7001 1.7700 7.9943 +v 49.7513 1.7700 -3.8817 +v 51.4215 1.7700 -3.8817 +v 50.9161 1.7700 26.4933 +v 52.7001 1.7700 26.4933 +v 50.9161 1.7700 20.0796 +v 52.7001 1.7700 20.0796 +v 46.6443 1.7700 14.6097 +v 48.0109 1.7700 14.6097 +v 48.9139 1.7700 10.5943 +v 46.1511 1.7700 10.5173 +v 46.1265 1.7700 11.8126 +v 48.8868 1.7700 11.8126 +v -59.5387 1.7700 11.3094 +v -56.7749 1.7700 11.2578 +v -56.7749 1.7700 10.1483 +v -59.5387 1.7700 10.1516 +v -10.5492 1.7700 -3.8817 +v -10.5492 1.7700 3.6701 +v -12.5445 1.7700 10.5318 +v -8.9962 1.7700 11.3757 +v -3.6383 1.7700 11.3757 +v -10.3463 1.7700 10.5318 +v -10.3443 1.7700 11.3757 +v 1.4597 1.7700 3.6701 +v 1.4597 1.7700 -3.8817 +v 1.5269 1.7700 10.4165 +v -33.1634 9.8454 26.1474 +v -33.7472 9.8454 14.0505 +v -23.7444 9.8454 12.1185 +v -22.0887 9.8454 -5.9874 +v -33.1634 9.8454 -5.9874 +v -33.7472 9.8454 8.5854 +v -33.7472 9.8454 11.2184 +v -33.7472 9.8454 14.0505 +v -3.7582 9.8454 26.1474 +v 21.7860 9.8454 14.0505 +v 39.9530 9.8454 14.0505 +v 39.9530 9.8454 10.4284 +v 21.7860 9.8454 12.0085 +v 21.7860 9.8454 14.0505 +v 39.9530 9.8454 26.1475 +v -8.0470 9.8454 -5.9874 +v 21.7860 9.8454 8.3750 +v 39.9530 9.8454 8.5854 +v 39.9530 9.8454 -5.9874 +v 21.7861 9.8454 -5.9874 +v 11.5320 9.8454 14.0505 +v 11.5365 9.8454 26.1474 +v 11.2845 9.8454 -5.9874 +v -22.0887 9.8454 26.1474 +v -24.1194 9.8454 -5.9874 +v -24.1194 9.8454 8.5854 +v -8.5704 9.8454 26.1474 +v -4.4674 9.8454 -5.9874 +v -22.5111 9.8454 14.4459 +v 11.1340 9.8454 14.2816 +v -3.7582 9.8454 6.9394 +v -8.5704 9.8454 6.9394 +v 0.1622 9.8454 11.7284 +v 0.1622 9.8454 14.2816 +v -11.0396 9.8454 14.4459 +v -50.3494 9.8454 14.0505 +v -50.3494 9.8454 26.1474 +v -50.3494 9.8454 8.5854 +v -50.3494 9.8454 -5.9874 +v -50.3494 9.8454 11.2184 +v -38.8308 9.8454 33.3474 +v -47.2405 9.8454 33.3474 +v -38.8308 9.8454 30.2966 +v -47.2405 9.8454 30.2966 +v -37.8884 9.8454 -10.5865 +v -48.7535 9.8454 -10.5865 +v 35.3569 9.8454 -10.3826 +v 27.1679 9.8454 -10.3826 +v 35.3542 9.8454 33.0756 +v 26.9415 9.8454 33.0756 +v -22.0887 9.8454 8.8551 +v -23.3414 9.8454 -5.9874 +v -23.3414 9.8454 8.4894 +v -8.0470 9.8454 -3.1824 +v -4.4674 9.8454 -3.1824 +v -43.0999 9.8454 14.0505 +v -40.4129 9.8454 14.0505 +v -41.8927 9.8454 11.8541 +v -43.7034 9.8454 11.8542 +v -40.4129 9.8454 8.5854 +v -43.0999 9.8454 8.5854 +v -43.7034 9.8454 10.5376 +v -41.8927 9.8454 10.5376 +v -8.5704 9.8454 17.2820 +v -18.7676 9.8454 14.4459 +v -10.9714 9.8454 14.4459 +v -10.7366 9.8454 17.2731 +v -18.7412 9.8454 17.2731 +v -22.8640 9.8454 26.1474 +v -22.9049 9.8454 14.0505 +v -22.8985 9.8454 15.8912 +v -12.5938 9.8454 12.1185 +v -20.9597 9.8454 12.1185 +v -20.9608 9.8454 10.4534 +v -12.5916 9.8454 10.4922 +v -22.0887 9.8454 10.4106 +v -22.5111 9.8454 15.5681 +v -18.7500 9.8454 15.8920 +v -18.7588 9.8454 15.5681 +v -22.0887 9.8454 15.8911 +v -8.5704 9.8454 16.8646 +v -10.7348 9.8454 16.8647 +v -2.8450 9.8454 26.1474 +v 7.1673 9.8454 26.1474 +v -3.7582 9.8454 17.7820 +v -2.8828 9.8454 16.8742 +v -7.4595 9.8454 17.8002 +v -0.2547 9.8454 16.8708 +v -0.2554 9.8454 17.2703 +v 1.1990 9.8454 17.2676 +v 7.3434 9.8454 17.2565 +v 7.3406 9.8454 14.2816 +v 8.5060 9.8454 15.9791 +v 7.3426 9.8454 15.9791 +v 11.1340 9.8454 15.5800 +v 9.3256 9.8454 15.5800 +v 7.3420 9.8454 15.5800 +v -11.3478 9.8454 17.2731 +v -11.3493 9.8454 21.9935 +v -8.5704 9.8454 22.0052 +v -3.7582 9.8454 22.0255 +v -2.8618 9.8454 22.0293 +v 4.4201 9.8454 22.0600 +v 11.5320 9.8454 22.0666 +v -10.7357 9.8454 21.4374 +v -8.5704 9.8454 21.4387 +v -3.7582 9.8454 21.4383 +v -2.8636 9.8454 21.4382 +v 4.0538 9.8454 21.4376 +v 11.5320 9.8454 21.4400 +v 19.2251 9.8454 26.1474 +v 19.8916 9.8454 26.1474 +v 19.8916 9.8454 21.4431 +v 19.2251 9.8454 22.0431 +v -10.3261 9.8454 10.4922 +v -0.3214 9.8454 7.8960 +v -11.0396 9.8454 12.1185 +v -8.5997 9.8454 5.4342 +v -3.7569 9.8454 5.4342 +v -3.1144 9.8454 5.4672 +v -3.0683 9.8454 7.8959 +v -9.1031 9.8454 5.4122 +v -8.9990 9.8454 10.2201 +v -8.9664 9.8454 11.3080 +v -10.3449 9.8454 11.3111 +v -0.3199 9.8454 10.4983 +v 1.4590 9.8454 10.5012 +v 1.4621 9.8454 11.7284 +v -11.0396 9.8454 13.7320 +v -23.7444 9.8454 13.7320 +v 0.1622 9.8454 12.1864 +v 0.1622 9.8454 13.7280 +v 11.1340 9.8454 13.7280 +v 11.1340 9.8454 12.1864 +v 9.6834 9.8454 -5.9874 +v 9.6671 9.8454 -4.5869 +v 10.1092 9.8454 11.7284 +v 4.6861 9.8454 11.7284 +v 10.1084 9.8454 12.1864 +v 3.8194 9.8454 12.1864 +v 11.1437 9.8454 10.3745 +v 11.1542 9.8454 8.8646 +v 10.4639 9.8454 8.8646 +v 10.4639 9.8454 8.3750 +v 11.2845 9.8454 8.3750 +v 11.5409 9.8454 15.9791 +v 20.5873 9.8454 14.0505 +v 15.6336 9.8454 14.0505 +v 20.5873 9.8454 17.6729 +v 15.6336 9.8454 17.6729 +v 39.9530 9.8454 12.0085 +v 21.7860 9.8454 10.4284 +v 30.7197 9.8454 12.0085 +v 22.9972 9.8454 12.0085 +v 30.7197 9.8454 10.4284 +v 22.9972 9.8454 10.4284 +v 33.2127 9.8454 12.0085 +v 33.2127 9.8454 10.4284 +v 19.1082 9.8454 -5.9874 +v 19.1082 9.8454 8.3750 +v 21.7861 9.8454 -1.5328 +v 21.7860 9.8454 6.5719 +v 19.1082 9.8454 -1.5328 +v 19.1082 9.8454 6.5719 +v -3.7582 6.8736 11.8549 +v -8.5704 6.8736 11.8549 +v -3.7582 6.8736 14.1800 +v -8.5704 6.8736 14.1800 +v -17.5004 1.7339 11.8549 +v -17.5004 1.7339 14.1800 +v 5.1738 1.7622 11.8549 +v 5.1738 1.7622 14.1800 +v -40.0577 1.7700 12.1094 +v -40.0577 1.7700 13.6333 +v -40.0577 1.7700 8.8954 +v -40.0577 1.7700 10.3934 +v 12.7254 9.8454 13.7280 +v 12.7254 9.8454 12.1864 +v 12.7352 9.8454 10.3745 +v 12.7456 9.8454 8.8646 +v 30.0552 9.8454 14.0505 +v 29.4137 9.8454 16.0219 +v 27.0995 9.8454 23.1333 +v 26.9415 9.8454 26.1691 +v 33.6353 9.8454 14.0505 +v 33.8707 9.8454 15.1882 +v 35.9439 9.8454 25.2073 +v 35.3542 9.8454 26.1691 +v 30.2462 9.8454 8.4730 +v 27.1679 9.8454 -5.9896 +v 33.5236 9.8454 8.5109 +v 35.3569 9.8454 -5.9896 +v 11.2845 9.8454 -4.5869 +v 10.1053 9.8454 10.3995 +v 28.6532 1.7740 13.7280 +v 28.6734 1.7740 8.8646 +v -38.8308 9.8454 26.1691 +v -47.2405 9.8454 26.1691 +v -48.7535 9.8454 -5.9896 +v -37.8885 9.8454 -5.9896 +v 6.5981 1.7700 11.8805 +v 6.5981 1.7700 14.1989 +v -18.0861 1.7700 11.9209 +v -18.0861 1.7700 14.2820 +# 446 vertices + +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0015 1.0000 -0.0010 +vn 0.0015 1.0000 -0.0010 +vn 0.0015 1.0000 -0.0010 +vn 0.0015 1.0000 -0.0010 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0019 1.0000 -0.0000 +vn 0.0019 1.0000 -0.0000 +vn 0.0019 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.8558 0.5174 +vn 0.0000 0.8558 0.5174 +vn 0.0000 0.8558 0.5174 +vn 0.0000 0.8558 0.5174 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.4988 0.8667 -0.0000 +vn -0.4988 0.8667 -0.0000 +vn -0.4988 0.8667 -0.0000 +vn -0.4988 0.8667 -0.0000 +vn 0.4967 0.8679 -0.0000 +vn 0.4967 0.8679 -0.0000 +vn 0.4967 0.8679 -0.0000 +vn 0.4967 0.8679 -0.0000 +vn -0.4436 0.8962 -0.0000 +vn -0.4436 0.8962 -0.0000 +vn -0.4436 0.8962 -0.0000 +vn -0.4436 0.8962 -0.0000 +vn -0.4099 0.9121 -0.0000 +vn -0.4099 0.9121 -0.0000 +vn -0.4099 0.9121 -0.0000 +vn -0.4099 0.9121 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.4520 0.8920 0.0000 +vn 0.4520 0.8920 0.0000 +vn 0.4520 0.8920 0.0000 +vn 0.4520 0.8920 0.0000 +vn 0.4520 0.8920 0.0031 +vn 0.4520 0.8920 0.0031 +vn 0.4520 0.8920 0.0031 +vn 0.4520 0.8920 0.0031 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn -0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0015 1.0000 0.0010 +vn 0.0015 1.0000 0.0010 +vn 0.0015 1.0000 0.0010 +vn 0.0015 1.0000 0.0010 +vn 0.0019 1.0000 0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0019 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0054 1.0000 0.0000 +vn -0.0054 1.0000 0.0000 +vn -0.0054 1.0000 0.0000 +vn -0.0054 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0615 0.9981 0.0000 +vn 0.0615 0.9981 0.0000 +vn 0.0615 0.9981 0.0000 +vn 0.0615 0.9981 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +# 1121 vertex normals + +vt 0.9959 0.5045 0.0000 +vt 0.9959 0.8642 0.0000 +vt 0.0063 0.0495 0.0000 +vt 0.0063 0.4092 0.0000 +vt 0.0063 0.2893 0.0000 +vt 0.0063 0.1694 0.0000 +vt 0.9959 0.7443 0.0000 +vt 0.9959 0.6244 0.0000 +vt 0.9952 0.1694 0.0000 +vt 0.9952 0.2893 0.0000 +vt 0.0070 0.7443 0.0000 +vt 0.0070 0.6244 0.0000 +vt 0.7981 0.5045 0.0000 +vt 0.6003 0.5045 0.0000 +vt 0.4025 0.5045 0.0000 +vt 0.2048 0.5045 0.0000 +vt 0.7974 0.4092 0.0000 +vt 0.5997 0.4092 0.0000 +vt 0.4019 0.4092 0.0000 +vt 0.2041 0.4092 0.0000 +vt 0.2041 0.0495 0.0000 +vt 0.4019 0.0495 0.0000 +vt 0.5997 0.0495 0.0000 +vt 0.7974 0.0495 0.0000 +vt 0.7981 0.8642 0.0000 +vt 0.6003 0.8642 0.0000 +vt 0.4025 0.8642 0.0000 +vt 0.2048 0.8642 0.0000 +vt 0.2041 0.1694 0.0000 +vt 0.4019 0.1694 0.0000 +vt 0.5997 0.1694 0.0000 +vt 0.7974 0.1694 0.0000 +vt 0.7974 0.2893 0.0000 +vt 0.5997 0.2893 0.0000 +vt 0.4019 0.2893 0.0000 +vt 0.2041 0.2893 0.0000 +vt 0.2048 0.6244 0.0000 +vt 0.4025 0.6244 0.0000 +vt 0.6003 0.6244 0.0000 +vt 0.7981 0.6244 0.0000 +vt 0.7981 0.7443 0.0000 +vt 0.6003 0.7443 0.0000 +vt 0.4025 0.7443 0.0000 +vt 0.2048 0.7443 0.0000 +vt 0.9952 0.2094 0.0000 +vt 0.9952 0.2493 0.0000 +vt 0.7974 0.2094 0.0000 +vt 0.7974 0.2493 0.0000 +vt 0.5997 0.2094 0.0000 +vt 0.5997 0.2493 0.0000 +vt 0.7974 0.2227 0.0000 +vt 0.7974 0.2360 0.0000 +vt 0.7692 0.2379 0.0000 +vt 0.7409 0.2398 0.0000 +vt 0.7127 0.2417 0.0000 +vt 0.6844 0.2436 0.0000 +vt 0.6562 0.2455 0.0000 +vt 0.6279 0.2474 0.0000 +vt 0.6279 0.2113 0.0000 +vt 0.6562 0.2132 0.0000 +vt 0.6844 0.2151 0.0000 +vt 0.7127 0.2170 0.0000 +vt 0.7409 0.2189 0.0000 +vt 0.7692 0.2208 0.0000 +vt 0.5502 0.4092 0.0000 +vt 0.5008 0.4092 0.0000 +vt 0.4513 0.4092 0.0000 +vt 0.4513 0.0495 0.0000 +vt 0.5008 0.0495 0.0000 +vt 0.5502 0.0495 0.0000 +vt 0.4513 0.1694 0.0000 +vt 0.5008 0.1694 0.0000 +vt 0.5502 0.1694 0.0000 +vt 0.5502 0.2893 0.0000 +vt 0.5008 0.2893 0.0000 +vt 0.4513 0.2893 0.0000 +vt 0.0063 0.2493 0.0000 +vt 0.0063 0.2094 0.0000 +vt 0.9959 0.7043 0.0000 +vt 0.9959 0.6644 0.0000 +vt 0.0070 0.7043 0.0000 +vt 0.0070 0.6644 0.0000 +vt 0.2041 0.2493 0.0000 +vt 0.2041 0.2094 0.0000 +vt 0.4019 0.2493 0.0000 +vt 0.4019 0.2094 0.0000 +vt 0.7981 0.6644 0.0000 +vt 0.7981 0.7043 0.0000 +vt 0.6003 0.6644 0.0000 +vt 0.6003 0.7043 0.0000 +vt 0.2048 0.7043 0.0000 +vt 0.2048 0.6644 0.0000 +vt 0.4025 0.7043 0.0000 +vt 0.4025 0.6644 0.0000 +vt 0.5502 0.2094 0.0000 +vt 0.5502 0.2493 0.0000 +vt 0.5008 0.2094 0.0000 +vt 0.5008 0.2493 0.0000 +vt 0.4513 0.2493 0.0000 +vt 0.4513 0.2094 0.0000 +vt 0.3360 0.4092 0.0000 +vt 0.2700 0.4092 0.0000 +vt 0.2700 0.0495 0.0000 +vt 0.3360 0.0495 0.0000 +vt 0.2700 0.1694 0.0000 +vt 0.3360 0.1694 0.0000 +vt 0.3360 0.2893 0.0000 +vt 0.2700 0.2893 0.0000 +vt 0.2700 0.2094 0.0000 +vt 0.3360 0.2094 0.0000 +vt 0.3360 0.2493 0.0000 +vt 0.2700 0.2493 0.0000 +vt 0.0723 0.0495 0.0000 +vt 0.1382 0.0495 0.0000 +vt 0.0723 0.1694 0.0000 +vt 0.1382 0.1694 0.0000 +vt 0.1382 0.4092 0.0000 +vt 0.0723 0.4092 0.0000 +vt 0.1382 0.2893 0.0000 +vt 0.0723 0.2893 0.0000 +vt 0.0723 0.2094 0.0000 +vt 0.1382 0.2094 0.0000 +vt 0.1382 0.2493 0.0000 +vt 0.0723 0.2493 0.0000 +vt 0.9299 0.5045 0.0000 +vt 0.8640 0.5045 0.0000 +vt 0.9299 0.8642 0.0000 +vt 0.8640 0.8642 0.0000 +vt 0.9299 0.7443 0.0000 +vt 0.8640 0.7443 0.0000 +vt 0.8640 0.6244 0.0000 +vt 0.9299 0.6244 0.0000 +vt 0.9299 0.7043 0.0000 +vt 0.8640 0.7043 0.0000 +vt 0.8640 0.6644 0.0000 +vt 0.9299 0.6644 0.0000 +vt 0.8860 0.5045 0.0000 +vt 0.8860 0.6244 0.0000 +vt 0.9080 0.6644 0.0000 +vt 0.8860 0.6644 0.0000 +vt 0.7516 0.5045 0.0000 +vt 0.7242 0.5045 0.0000 +vt 0.7516 0.8642 0.0000 +vt 0.7242 0.8642 0.0000 +vt 0.7242 0.6244 0.0000 +vt 0.7516 0.6244 0.0000 +vt 0.7516 0.7443 0.0000 +vt 0.7242 0.7443 0.0000 +vt 0.7516 0.7043 0.0000 +vt 0.7242 0.7043 0.0000 +vt 0.7242 0.6644 0.0000 +vt 0.7516 0.6644 0.0000 +vt 0.5349 0.5045 0.0000 +vt 0.4680 0.5045 0.0000 +vt 0.5349 0.8642 0.0000 +vt 0.4680 0.8642 0.0000 +vt 0.4680 0.6244 0.0000 +vt 0.5349 0.6244 0.0000 +vt 0.5349 0.7443 0.0000 +vt 0.4680 0.7443 0.0000 +vt 0.5349 0.7043 0.0000 +vt 0.4680 0.7043 0.0000 +vt 0.4680 0.6644 0.0000 +vt 0.5349 0.6644 0.0000 +vt 0.3411 0.5045 0.0000 +vt 0.2742 0.5045 0.0000 +vt 0.3411 0.8642 0.0000 +vt 0.2742 0.8642 0.0000 +vt 0.2742 0.6244 0.0000 +vt 0.3411 0.6244 0.0000 +vt 0.3411 0.7443 0.0000 +vt 0.2742 0.7443 0.0000 +vt 0.2742 0.6644 0.0000 +vt 0.3411 0.6644 0.0000 +vt 0.3411 0.7043 0.0000 +vt 0.2742 0.7043 0.0000 +vt 0.3941 0.5045 0.0000 +vt 0.3733 0.5045 0.0000 +vt 0.3941 0.8642 0.0000 +vt 0.3733 0.8642 0.0000 +vt 0.3941 0.7443 0.0000 +vt 0.3733 0.7443 0.0000 +vt 0.3941 0.7043 0.0000 +vt 0.3733 0.7043 0.0000 +vt 0.3733 0.6244 0.0000 +vt 0.3941 0.6244 0.0000 +vt 0.3733 0.6644 0.0000 +vt 0.3941 0.6644 0.0000 +vt 0.2048 0.6887 0.0000 +vt 0.2048 0.6800 0.0000 +vt 0.4025 0.6887 0.0000 +vt 0.4025 0.6800 0.0000 +vt 0.4680 0.6800 0.0000 +vt 0.4680 0.6887 0.0000 +vt 0.3411 0.6800 0.0000 +vt 0.3411 0.6887 0.0000 +vt 0.2742 0.6887 0.0000 +vt 0.2742 0.6800 0.0000 +vt 0.3941 0.6800 0.0000 +vt 0.3941 0.6887 0.0000 +vt 0.3733 0.6887 0.0000 +vt 0.3733 0.6800 0.0000 +vt 0.4281 0.6244 0.0000 +vt 0.4424 0.6244 0.0000 +vt 0.4281 0.6644 0.0000 +vt 0.4424 0.6644 0.0000 +vt 0.4424 0.5045 0.0000 +vt 0.4281 0.5045 0.0000 +vt 0.4424 0.8642 0.0000 +vt 0.4281 0.8642 0.0000 +vt 0.4424 0.7443 0.0000 +vt 0.4281 0.7443 0.0000 +vt 0.4424 0.7043 0.0000 +vt 0.4281 0.7043 0.0000 +vt 0.4281 0.6800 0.0000 +vt 0.4424 0.6800 0.0000 +vt 0.4424 0.6887 0.0000 +vt 0.4281 0.6887 0.0000 +vt 0.2319 0.6244 0.0000 +vt 0.2471 0.6244 0.0000 +vt 0.2319 0.6644 0.0000 +vt 0.2471 0.6644 0.0000 +vt 0.2471 0.5045 0.0000 +vt 0.2319 0.5045 0.0000 +vt 0.2471 0.8642 0.0000 +vt 0.2319 0.8642 0.0000 +vt 0.2471 0.7443 0.0000 +vt 0.2319 0.7443 0.0000 +vt 0.2471 0.7043 0.0000 +vt 0.2319 0.7043 0.0000 +vt 0.2319 0.6800 0.0000 +vt 0.2471 0.6800 0.0000 +vt 0.2471 0.6887 0.0000 +vt 0.2319 0.6887 0.0000 +vt 0.7299 0.2406 0.0000 +vt 0.7237 0.2410 0.0000 +vt 0.7237 0.2177 0.0000 +vt 0.7299 0.2182 0.0000 +vt 0.0393 0.0495 0.0000 +vt 0.0393 0.1694 0.0000 +vt 0.0393 0.2094 0.0000 +vt 0.9959 0.6644 0.0000 +vt 0.9299 0.6644 0.0000 +vt 0.0063 0.2094 0.0000 +vt 0.9959 0.6644 0.0000 +vt 0.9959 0.6644 0.0000 +vt 0.8750 0.6244 0.0000 +vt 0.8750 0.5045 0.0000 +vt 0.8750 0.6644 0.0000 +vt 0.3667 0.5133 0.0000 +vt 0.2485 0.5133 0.0000 +vt 0.2485 0.6424 0.0000 +vt 0.3667 0.6672 0.0000 +vt 0.3667 0.8562 0.0000 +vt 0.2485 0.8562 0.0000 +vt 0.2485 0.7007 0.0000 +vt 0.2485 0.6726 0.0000 +vt 0.2485 0.6424 0.0000 +vt 0.5623 0.5133 0.0000 +vt 0.7228 0.5133 0.0000 +vt 0.8348 0.6424 0.0000 +vt 1.2674 0.6424 0.0000 +vt 1.2674 0.6810 0.0000 +vt 0.8348 0.6642 0.0000 +vt 0.8348 0.6424 0.0000 +vt 1.2674 0.5133 0.0000 +vt 0.5109 0.8562 0.0000 +vt 0.8348 0.7007 0.0000 +vt 1.2674 0.7007 0.0000 +vt 1.2674 0.8562 0.0000 +vt 0.8348 0.8562 0.0000 +vt 0.7228 0.6424 0.0000 +vt 0.7228 0.5133 0.0000 +vt 0.7228 0.7007 0.0000 +vt 0.7228 0.8562 0.0000 +vt 0.3667 0.5133 0.0000 +vt 0.3667 0.8562 0.0000 +vt 0.3667 0.7007 0.0000 +vt 0.5109 0.5133 0.0000 +vt 0.5623 0.8562 0.0000 +vt 0.3667 0.6399 0.0000 +vt 0.7228 0.6399 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5958 0.6672 0.0000 +vt 0.5958 0.6399 0.0000 +vt 0.4918 0.6672 0.0000 +vt 0.4918 0.6399 0.0000 +vt 0.0652 0.6424 0.0000 +vt 0.0652 0.5133 0.0000 +vt 0.0652 0.7007 0.0000 +vt 0.0652 0.8562 0.0000 +vt 0.0652 0.6726 0.0000 +vt 0.6215 0.4836 0.0000 +vt 0.6215 0.5602 0.0000 +vt 0.5317 0.4836 0.0000 +vt 0.5317 0.5602 0.0000 +vt 0.6215 0.5162 0.0000 +vt 0.5317 0.5162 0.0000 +vt 0.6317 0.5887 0.0000 +vt 0.5158 0.5887 0.0000 +vt 0.6317 0.5397 0.0000 +vt 0.5158 0.5397 0.0000 +vt 0.6032 0.5418 0.0000 +vt 0.6032 0.5887 0.0000 +vt 0.5158 0.5418 0.0000 +vt 0.5158 0.5887 0.0000 +vt 0.6096 0.9318 0.0000 +vt 0.4826 0.9318 0.0000 +vt 0.6096 1.0055 0.0000 +vt 0.4826 1.0055 0.0000 +vt 0.3667 0.7617 0.0000 +vt 0.3667 0.8562 0.0000 +vt 0.3667 0.7617 0.0000 +vt 0.5109 0.7919 0.0000 +vt 0.5623 0.7919 0.0000 +vt 0.1425 0.6424 0.0000 +vt 0.1712 0.6424 0.0000 +vt 0.1712 0.6726 0.0000 +vt 0.1425 0.6726 0.0000 +vt 0.1712 0.7007 0.0000 +vt 0.1425 0.7007 0.0000 +vt 0.1425 0.6867 0.0000 +vt 0.1712 0.6867 0.0000 +vt 0.5109 0.6228 0.0000 +vt 0.4084 0.6399 0.0000 +vt 0.4501 0.6399 0.0000 +vt 0.4628 0.6228 0.0000 +vt 0.4148 0.6228 0.0000 +vt 0.3584 0.5133 0.0000 +vt 0.3584 0.6424 0.0000 +vt 0.3667 0.6224 0.0000 +vt 0.3584 0.6224 0.0000 +vt 0.4648 0.6672 0.0000 +vt 0.4025 0.6672 0.0000 +vt 0.3978 0.7478 0.0000 +vt 0.4697 0.7157 0.0000 +vt 0.3667 0.7082 0.0000 +vt 0.3667 0.6342 0.0000 +vt 0.3667 0.6256 0.0000 +vt 0.4127 0.6285 0.0000 +vt 0.4105 0.6342 0.0000 +vt 0.5109 0.6313 0.0000 +vt 0.4565 0.6313 0.0000 +vt 0.5720 0.5133 0.0000 +vt 0.6788 0.5133 0.0000 +vt 0.5623 0.6026 0.0000 +vt 0.5716 0.6026 0.0000 +vt 0.5228 0.6113 0.0000 +vt 0.6000 0.6123 0.0000 +vt 0.5996 0.6080 0.0000 +vt 0.6151 0.6081 0.0000 +vt 0.6811 0.6082 0.0000 +vt 0.6812 0.6399 0.0000 +vt 0.7228 0.5507 0.0000 +vt 0.6934 0.6176 0.0000 +vt 0.6811 0.6176 0.0000 +vt 0.7228 0.5770 0.0000 +vt 0.7020 0.6242 0.0000 +vt 0.6812 0.6242 0.0000 +vt 0.4603 0.6228 0.0000 +vt 0.4813 0.5629 0.0000 +vt 0.5109 0.5627 0.0000 +vt 0.5623 0.5573 0.0000 +vt 0.5718 0.5530 0.0000 +vt 0.6495 0.5569 0.0000 +vt 0.7227 0.5284 0.0000 +vt 0.4878 0.5671 0.0000 +vt 0.5109 0.5674 0.0000 +vt 0.5623 0.5620 0.0000 +vt 0.5718 0.5573 0.0000 +vt 0.6456 0.5628 0.0000 +vt 0.7227 0.5308 0.0000 +vt 0.7228 0.5635 0.0000 +vt 0.7228 0.5571 0.0000 +vt 0.8068 0.5133 0.0000 +vt 0.8141 0.5133 0.0000 +vt 0.8141 0.5635 0.0000 +vt 0.8068 0.5571 0.0000 +vt 0.4973 0.7034 0.0000 +vt 0.5985 0.7099 0.0000 +vt 0.5109 0.7324 0.0000 +vt 0.5623 0.7324 0.0000 +vt 0.5691 0.7337 0.0000 +vt 0.5696 0.7103 0.0000 +vt 0.5053 0.7340 0.0000 +vt 0.5071 0.6991 0.0000 +vt 0.5078 0.6781 0.0000 +vt 0.4941 0.6821 0.0000 +vt 0.5994 0.6817 0.0000 +vt 0.6183 0.6816 0.0000 +vt 0.6197 0.6672 0.0000 +vt 0.4918 0.6490 0.0000 +vt 0.3667 0.6490 0.0000 +vt 0.5958 0.6613 0.0000 +vt 0.5958 0.6458 0.0000 +vt 0.7228 0.6458 0.0000 +vt 0.7228 0.6613 0.0000 +vt 0.7228 0.8152 0.0000 +vt 0.7054 0.8562 0.0000 +vt 0.7054 0.8357 0.0000 +vt 0.6884 0.6672 0.0000 +vt 0.6540 0.6672 0.0000 +vt 0.6804 0.6613 0.0000 +vt 0.6381 0.6613 0.0000 +vt 0.7115 0.6799 0.0000 +vt 0.7228 0.6795 0.0000 +vt 0.7228 0.6925 0.0000 +vt 0.7144 0.6937 0.0000 +vt 0.7146 0.6982 0.0000 +vt 0.7228 0.6985 0.0000 +vt 0.7228 0.6038 0.0000 +vt 0.8049 0.6424 0.0000 +vt 0.7676 0.6424 0.0000 +vt 0.8049 0.6038 0.0000 +vt 0.7676 0.6038 0.0000 +vt 1.2674 0.6642 0.0000 +vt 0.8348 0.6804 0.0000 +vt 1.0078 0.6642 0.0000 +vt 0.8636 0.6642 0.0000 +vt 1.0078 0.6807 0.0000 +vt 0.8636 0.6805 0.0000 +vt 1.0779 0.6642 0.0000 +vt 1.0779 0.6808 0.0000 +vt 0.8062 0.8562 0.0000 +vt 0.8062 0.7007 0.0000 +vt 0.8348 0.8080 0.0000 +vt 0.8348 0.7489 0.0000 +vt 0.8062 0.8080 0.0000 +vt 0.8062 0.7489 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.3667 0.6672 0.0000 +vt 0.3667 0.6490 0.0000 +vt 0.3667 0.7617 0.0000 +vt 0.3667 0.7082 0.0000 +vt 0.7228 0.6458 0.0000 +vt 0.7228 0.6613 0.0000 +vt 0.7228 0.6795 0.0000 +vt 0.7228 0.6925 0.0000 +vt 0.7228 0.6458 0.0000 +vt 0.7228 0.6613 0.0000 +vt 0.7228 0.6795 0.0000 +vt 0.7228 0.6925 0.0000 +vt 1.0317 0.6424 0.0000 +vt 1.0157 0.6214 0.0000 +vt 0.9770 0.5455 0.0000 +vt 0.9548 0.5133 0.0000 +vt 1.1169 0.6424 0.0000 +vt 1.1221 0.6303 0.0000 +vt 1.1768 0.5234 0.0000 +vt 1.1812 0.5133 0.0000 +vt 1.0362 0.7007 0.0000 +vt 0.9529 0.8562 0.0000 +vt 1.1143 0.7007 0.0000 +vt 1.1702 0.8562 0.0000 +vt 0.7228 0.8444 0.0000 +vt 0.7115 0.6799 0.0000 +vt 0.4513 0.2239 0.0000 +vt 0.4513 0.2342 0.0000 +vt 0.4513 0.2148 0.0000 +vt 0.4513 0.2434 0.0000 +vt 0.4680 0.6989 0.0000 +vt 0.4680 0.6702 0.0000 +vt 0.1939 0.5133 0.0000 +vt 0.0947 0.5133 0.0000 +vt 0.0785 0.8562 0.0000 +vt 0.2026 0.8562 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.5623 0.7275 0.0000 +vt 0.7981 0.6984 0.0000 +vt 0.7981 0.6707 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.5109 0.7275 0.0000 +vt 0.1382 0.2159 0.0000 +vt 0.1382 0.2443 0.0000 +# 482 texture coords + +g Object003 +usemtl 23___Default +s off +f 418/465/1 417/467/2 91/97/3 +f 67/71/4 64/68/5 65/69/6 68/72/7 +f 70/74/8 61/65/9 62/66/10 71/75/11 +f 151/157/12 148/154/13 147/153/14 152/158/15 +f 153/159/16 149/155/17 150/156/18 154/160/19 +f 106/112/20 103/109/21 104/110/22 105/111/23 +f 27/31/24 19/23/25 20/24/26 28/32/27 +f 108/114/28 110/116/29 109/115/30 107/113/31 +f 98/104/32 100/106/33 99/105/34 97/103/35 +f 113/119/36 111/117/37 112/118/38 114/120/39 +f 101/107/40 95/101/41 96/102/42 102/108/43 +f 14/18/44 30/34/45 29/33/46 13/17/47 +f 132/138/48 131/137/49 119/125/50 126/132/51 +f 139/145/52 136/142/53 135/141/54 140/146/55 +f 159/165/56 164/170/57 163/169/58 160/166/59 +f 165/171/60 161/167/61 162/168/62 166/172/63 +f 122/128/64 124/130/65 123/129/66 121/127/67 +f 138/144/68 142/148/69 141/147/70 137/143/71 +f 44/48/72 42/46/73 6/10/74 29/33/75 +f 41/45/76 43/47/77 28/32/78 5/9/79 +f 30/34/80 46/50/81 54/58/82 53/57/83 52/56/84 51/55/85 230/236/86 229/235/87 50/54/88 49/53/89 48/52/90 44/48/91 29/33/92 +f 60/64/93 59/63/94 232/238/95 231/237/96 58/62/97 57/61/98 56/60/99 55/59/100 45/49/101 27/31/102 28/32/103 43/47/104 47/51/105 +f 45/49/106 55/59/107 54/58/108 46/50/109 +f 56/60/110 57/61/111 52/56/112 53/57/113 +f 48/52/114 49/53/115 60/64/116 47/51/117 +f 89/95/118 69/73/119 27/31/120 45/49/121 +f 69/73/122 66/70/123 19/23/124 27/31/125 +f 68/72/126 65/69/127 66/70/128 69/73/129 +f 64/68/130 67/71/131 26/30/132 18/22/133 +f 72/76/134 63/67/135 15/19/136 31/35/137 +f 71/75/138 62/66/139 63/67/140 72/76/141 +f 61/65/142 70/74/143 30/34/144 14/18/145 +f 93/99/146 92/98/147 71/75/148 72/76/149 +f 94/100/150 67/71/151 68/72/152 91/97/153 +f 155/161/154 153/159/155 154/160/156 156/162/157 +f 157/163/158 151/157/159 152/158/160 158/164/161 +f 115/121/162 109/115/163 110/116/164 116/122/165 +f 118/124/166 117/123/167 113/119/168 114/120/169 +f 103/109/170 99/105/171 100/106/172 104/110/173 +f 105/111/174 101/107/175 102/108/176 106/112/177 +f 127/133/178 123/129/179 124/130/180 128/134/181 +f 132/138/182 133/139/183 134/140/184 +f 143/149/185 141/147/186 142/148/187 144/150/188 +f 145/151/189 139/145/190 140/146/191 146/152/192 +f 86/92/193 76/82/194 8/12/195 33/37/196 +f 75/81/197 85/91/198 40/44/199 7/11/200 +f 167/173/201 163/169/202 164/170/203 168/174/204 +f 170/176/205 169/175/206 165/171/207 166/172/208 +f 92/98/209 90/96/210 70/74/211 71/75/212 +f 89/95/213 91/97/214 68/72/215 69/73/216 +f 94/100/217 80/86/218 26/30/219 67/71/220 +f 79/85/221 93/99/222 72/76/223 31/35/224 +f 90/96/225 89/95/226 45/49/227 46/50/228 +f 90/96/229 46/50/230 30/34/231 70/74/232 +f 97/103/233 99/105/234 25/29/235 17/21/236 +f 100/106/237 98/104/238 18/22/239 26/30/240 +f 102/108/241 96/102/242 16/20/243 32/36/244 +f 95/101/245 101/107/246 31/35/247 15/19/248 +f 104/110/249 100/106/250 26/30/251 80/86/252 +f 99/105/253 103/109/254 78/84/255 25/29/256 +f 106/112/257 102/108/258 32/36/259 77/83/260 +f 101/107/261 105/111/262 79/85/263 31/35/264 +f 116/122/265 78/84/266 445/481/267 +f 107/113/268 109/115/269 234/240/270 233/239/271 +f 110/116/272 108/114/273 17/21/274 25/29/275 +f 114/120/276 112/118/277 2/4/278 3/5/279 +f 111/117/280 113/119/281 32/36/282 16/20/283 +f 116/122/284 110/116/285 25/29/286 78/84/287 +f 109/115/288 115/121/289 235/241/290 234/240/291 +f 73/77/292 118/124/293 114/120/294 3/5/295 +f 32/36/296 113/119/297 117/123/298 77/83/299 +f 126/132/300 119/125/301 1/1/302 4/8/303 +f 120/126/304 125/131/305 36/40/306 9/13/307 +f 121/127/308 123/129/309 3/7/310 2/2/311 +f 124/130/312 122/128/313 21/25/314 37/41/315 +f 128/134/316 124/130/317 37/41/318 82/88/319 +f 123/129/320 127/133/321 73/79/322 3/7/323 +f 130/136/324 126/132/325 4/8/326 74/80/327 +f 125/131/328 129/135/329 81/87/330 36/40/331 +f 131/137/332 132/138/333 240/247/334 241/248/335 +f 130/136/336 133/139/337 132/138/338 126/132/339 +f 240/247/340 132/138/341 134/140/342 242/249/343 +f 145/151/344 144/150/345 84/90/346 83/89/347 +f 444/477/348 82/88/349 143/149/350 +f 140/146/351 135/141/352 9/13/353 36/40/354 +f 136/142/355 139/145/356 35/39/357 10/14/358 +f 137/143/359 141/147/360 37/41/361 21/25/362 +f 142/148/363 138/144/364 22/26/365 38/42/366 +f 144/150/367 142/148/368 38/42/369 84/90/370 +f 141/147/371 143/149/372 82/88/373 37/41/374 +f 146/152/375 140/146/376 36/40/377 81/87/378 +f 139/145/379 145/151/380 83/89/381 35/39/382 +f 152/158/383 147/153/384 10/14/385 35/39/386 +f 201/207/387 198/204/388 197/203/389 202/208/390 +f 205/211/391 203/209/392 204/210/393 206/212/394 +f 149/155/395 153/159/396 38/42/397 22/26/398 +f 207/213/399 205/211/400 206/212/401 208/214/402 +f 153/159/403 155/161/404 84/90/405 38/42/406 +f 158/164/407 152/158/408 35/39/409 83/89/410 +f 198/204/411 200/206/412 199/205/413 197/203/414 +f 217/223/415 214/220/416 213/219/417 218/224/418 +f 179/185/419 172/178/420 171/177/421 180/186/422 +f 221/227/423 219/225/424 220/226/425 222/228/426 +f 174/180/427 176/182/428 175/181/429 173/179/430 +f 181/187/431 179/185/432 180/186/433 182/188/434 +f 214/220/435 216/222/436 215/221/437 213/219/438 +f 224/230/439 223/229/440 221/227/441 222/228/442 +f 175/181/443 176/182/444 178/184/445 177/183/446 +f 193/199/447 186/192/448 185/191/449 194/200/450 +f 195/201/451 190/196/452 189/195/453 196/202/454 +f 180/186/455 171/177/456 11/15/457 34/38/458 +f 172/178/459 179/185/460 164/170/461 159/165/462 +f 173/179/463 175/181/464 39/43/465 23/27/466 +f 176/182/467 174/180/468 161/167/469 165/171/470 +f 182/188/471 180/186/472 34/38/473 88/94/474 +f 179/185/475 181/187/476 168/174/477 164/170/478 +f 39/43/479 175/181/480 177/183/481 87/93/482 +f 169/175/483 178/184/484 176/182/485 165/171/486 +f 191/197/487 190/196/488 169/175/489 170/176/490 +f 189/195/491 192/198/492 167/173/493 168/174/494 +f 209/215/495 199/205/496 200/206/497 210/216/498 +f 211/217/499 207/213/500 208/214/501 212/218/502 +f 195/201/503 194/200/504 177/183/505 178/184/506 +f 193/199/507 196/202/508 181/187/509 182/188/510 +f 226/232/511 225/231/512 215/221/513 216/222/514 +f 227/233/515 223/229/516 224/230/517 228/234/518 +f 194/200/519 185/191/520 87/93/521 177/183/522 +f 186/192/523 193/199/524 182/188/525 88/94/526 +f 196/202/527 189/195/528 168/174/529 181/187/530 +f 190/196/531 195/201/532 178/184/533 169/175/534 +f 211/217/535 210/216/536 187/193/537 188/194/538 +f 202/208/539 197/203/540 34/38/541 11/15/542 +f 198/204/543 201/207/544 148/154/545 151/157/546 +f 206/212/547 204/210/548 23/27/549 39/43/550 +f 203/209/551 205/211/552 154/160/553 150/156/554 +f 208/214/555 206/212/556 39/43/557 87/93/558 +f 205/211/559 207/213/560 156/162/561 154/160/562 +f 197/203/563 199/205/564 88/94/565 34/38/566 +f 200/206/567 198/204/568 151/157/569 157/163/570 +f 210/216/571 200/206/572 157/163/573 438/470/574 +f 199/205/575 209/215/576 186/192/577 88/94/578 +f 212/218/579 208/214/580 87/93/581 185/191/582 +f 188/194/583 437/469/584 211/217/585 +f 191/197/586 227/233/587 226/232/588 192/198/589 +f 184/190/590 225/231/591 228/234/592 183/189/593 +f 218/224/594 213/219/595 33/37/596 12/16/597 +f 214/220/598 217/223/599 160/166/600 163/169/601 +f 222/228/602 220/226/603 24/28/604 40/44/605 +f 219/225/606 221/227/607 166/172/608 162/168/609 +f 213/219/610 215/221/611 86/92/612 33/37/613 +f 216/222/614 214/220/615 163/169/616 167/173/617 +f 85/91/618 224/230/619 222/228/620 40/44/621 +f 166/172/622 221/227/623 223/229/624 170/176/625 +f 192/198/626 226/232/627 216/222/628 167/173/629 +f 86/92/630 215/221/631 225/231/632 184/190/633 +f 228/234/634 224/230/635 85/91/636 183/189/637 +f 223/229/638 227/233/639 191/197/640 170/176/641 +f 229/235/642 232/238/643 59/63/644 50/54/645 +f 231/237/646 230/236/647 51/55/648 58/62/649 +f 233/239/650 234/240/651 4/6/652 1/3/653 +f 234/240/654 235/241/655 74/78/656 4/6/657 +f 236/242/658 237/243/659 130/136/660 74/80/661 +f 74/78/662 235/241/663 238/244/664 +f 238/245/665 239/246/666 236/242/667 74/80/668 +f 241/248/669 240/247/670 125/131/671 120/126/672 +f 125/131/673 240/247/674 242/249/675 129/135/676 +f 359/287/677 314/334/678 315/335/679 245/253/680 372/394/681 371/393/682 +f 374/396/683 375/397/684 376/398/685 381/404/686 382/405/687 373/395/688 +f 427/455/689 253/262/690 393/417/691 399/423/692 +f 257/266/693 429/457/694 430/458/695 +f 431/459/696 259/268/697 394/418/698 398/422/699 397/421/700 +f 432/460/701 262/271/702 403/427/703 404/428/704 259/268/705 431/459/706 +f 243/251/707 311/330/708 313/333/709 312/331/710 244/252/711 +f 247/255/712 248/256/713 268/278/714 267/277/715 +f 347/368/716 348/369/717 306/325/718 309/328/719 +f 301/320/720 298/317/721 299/318/722 300/319/723 +f 244/252/724 299/318/725 439/471/726 243/251/727 +f 305/324/728 302/321/729 303/322/730 304/323/731 +f 280/291/732 303/322/733 441/473/734 281/292/735 +f 283/294/736 285/298/737 286/299/738 284/296/739 +f 439/295/740 440/297/741 286/299/742 285/298/743 +f 442/300/744 287/302/745 288/303/746 441/301/747 +f 289/304/748 290/306/749 432/307/750 434/305/751 +f 426/309/752 292/311/753 291/310/754 430/308/755 +f 317/337/756 316/336/757 315/335/758 314/334/759 +f 294/313/760 295/314/761 293/312/762 246/254/763 +f 297/316/764 296/315/765 360/382/766 361/383/767 +f 299/318/768 244/252/769 250/258/770 249/257/771 300/319/772 +f 298/317/773 301/320/774 282/293/775 278/289/776 +f 280/291/777 282/293/778 301/320/779 304/323/780 303/322/781 +f 249/257/782 248/256/783 302/321/784 305/324/785 300/319/786 +f 266/250/787 269/279/788 342/363/789 341/362/790 340/361/791 310/329/792 322/340/793 +f 324/344/794 309/328/795 306/325/796 323/343/797 +f 313/333/798 311/330/799 266/276/800 322/332/801 +f 316/336/802 293/312/803 318/338/804 +f 310/329/805 320/341/806 322/340/807 +f 319/339/808 321/342/809 307/326/810 271/281/811 +f 350/371/812 328/348/813 327/347/814 349/370/815 +f 329/349/816 323/343/817 306/325/818 348/369/819 349/370/820 327/347/821 +f 331/351/822 330/350/823 328/348/824 350/371/825 351/372/826 332/352/827 +f 333/353/828 332/352/829 351/372/830 352/373/831 388/355/832 335/356/833 +f 333/353/834 335/356/835 336/357/836 +f 337/358/837 272/282/838 338/359/839 +f 334/354/840 339/360/841 338/359/842 272/282/843 +f 251/259/844 343/364/845 342/363/846 269/279/847 +f 344/365/848 343/364/849 251/259/850 325/345/851 +f 345/366/852 344/365/853 325/345/854 326/346/855 +f 264/260/856 346/367/857 345/366/858 326/346/859 +f 353/376/860 356/379/861 346/375/862 264/273/863 +f 361/383/864 360/382/865 274/284/866 273/283/867 +f 360/382/868 296/315/869 258/267/870 246/254/871 293/312/872 316/336/873 317/337/874 357/380/875 365/387/876 364/386/877 +f 366/388/878 365/387/879 357/380/880 367/389/881 +f 358/381/882 368/390/883 369/391/884 436/406/885 385/409/886 386/410/887 +f 277/288/888 371/393/889 372/394/890 271/281/891 307/326/892 308/327/893 +f 374/396/894 276/286/895 334/354/896 272/282/897 375/397/898 +f 381/404/899 379/402/900 380/403/901 382/405/902 +f 361/383/903 362/384/904 378/401/905 377/400/906 270/280/907 297/316/908 +f 373/395/909 382/405/910 380/403/911 370/392/912 275/285/913 +f 263/272/914 388/412/915 390/414/916 +f 395/419/917 397/421/918 398/422/919 396/420/920 +f 400/424/921 399/423/922 393/417/923 254/263/924 +f 435/463/925 387/274/926 402/426/927 406/430/928 405/429/929 +f 405/429/930 403/427/931 262/271/932 401/425/933 +f 404/428/934 406/430/935 402/426/936 259/268/937 +f 408/431/938 407/432/939 273/283/940 274/284/941 +f 410/433/942 409/434/943 407/432/944 408/431/945 +f 411/435/946 412/436/947 410/433/948 408/431/949 +f 414/437/950 413/438/951 407/432/952 409/434/953 +f 245/253/954 415/439/955 416/440/956 372/394/957 +f 417/441/958 418/442/959 318/338/960 293/312/961 +f 419/443/962 420/444/963 376/398/964 375/397/965 +f 421/445/966 422/446/967 384/408/968 383/407/969 +f 437/447/970 188/448/971 420/444/972 419/443/973 +f 187/449/974 438/450/975 422/446/976 421/445/977 +f 392/416/978 390/414/979 388/412/980 352/374/981 +f 391/415/982 392/416/983 352/374/984 355/378/985 +f 253/262/986 427/455/987 428/456/988 +f 253/262/989 428/456/990 429/457/991 257/266/992 +f 255/264/993 256/265/994 252/261/995 423/451/996 395/419/997 396/420/998 +f 252/261/999 389/413/1000 391/415/1001 424/452/1002 423/451/1003 +f 391/415/1004 355/378/1005 425/453/1006 424/452/1007 +f 354/377/1008 426/454/1009 425/453/1010 355/378/1011 +f 395/419/1012 423/451/1013 427/455/1014 399/423/1015 +f 427/455/1016 423/451/1017 424/452/1018 428/456/1019 +f 428/456/1020 424/452/1021 425/453/1022 429/457/1023 +f 426/454/1024 430/458/1025 429/457/1026 425/453/1027 +f 397/421/1028 400/424/1029 433/461/1030 431/459/1031 +f 431/459/1032 433/461/1033 434/462/1034 432/460/1035 +f 254/263/1036 260/269/1037 433/461/1038 400/424/1039 +f 260/269/1040 261/270/1041 434/462/1042 433/461/1043 +f 401/425/1044 265/275/1045 435/463/1046 405/429/1047 +f 378/401/1048 362/384/1049 363/385/1050 358/381/1051 386/410/1052 387/411/1053 435/399/1054 +f 436/464/1055 383/407/1056 384/408/1057 385/409/1058 +f 380/403/1059 379/402/1060 436/406/1061 369/391/1062 370/392/1063 +f 92/98/1064 415/466/1065 418/465/1066 91/97/1067 +f 92/98/1068 416/468/1069 415/466/1070 +f 417/467/1071 94/100/1072 91/97/1073 +f 92/98/1074 93/99/1075 416/468/1076 +f 437/469/1077 156/162/1078 207/213/1079 211/217/1080 +f 438/470/1081 187/193/1082 210/216/1083 +f 298/317/1084 440/472/1085 439/471/1086 299/318/1087 +f 278/289/1088 279/290/1089 440/472/1090 298/317/1091 +f 303/322/1092 302/321/1093 442/474/1094 441/473/1095 +f 248/256/1096 247/255/1097 442/474/1098 302/321/1099 +f 413/438/1100 414/437/1101 444/475/1102 443/476/1103 +f 143/149/1104 146/152/1105 443/478/1106 444/477/1107 +f 146/152/1108 81/87/1109 443/478/1110 +f 412/436/1111 411/435/1112 445/479/1113 446/480/1114 +f 77/83/1115 446/482/1116 445/481/1117 78/84/1118 +f 77/83/1119 117/123/1120 446/482/1121 +# 251 polygons - 19 triangles + diff --git a/static/workertest/passsimulation/passer.js b/static/workertest/passsimulation/passer.js new file mode 100644 index 000000000..537fd5e60 --- /dev/null +++ b/static/workertest/passsimulation/passer.js @@ -0,0 +1,25 @@ +var i=0; +var update = null; +function timedCount(){ + + onmessage = (e) => { + + + if(e.data == "on"){ + + update = setInterval("passerupdate()", 50); + } + + if(e.data == "off"){ + clearInterval(update); + } +} + + +} +function passerupdate(){ + + postMessage("up"); +} + +timedCount(); diff --git a/static/workertest/passsimulation/station.js b/static/workertest/passsimulation/station.js new file mode 100644 index 000000000..b6bfb877f --- /dev/null +++ b/static/workertest/passsimulation/station.js @@ -0,0 +1,25 @@ +var i=0; +var update = null; +function timedCount(){ + + onmessage = (e) => { + + + if(e.data == "on"){ + console.log("on"); + update = setInterval("stationupdate()", 3000); + } + + if(e.data == "off"){ + clearInterval(update); + } +} + + +} +function stationupdate(){ + + postMessage("up"); +} + +timedCount();