import Event from '../core/Event' import * as THREE from 'three' import {animation, init} from './meshAnimation' import grentMesh from './grentMesh' import FeaturesToAttribute from '../worker/featuresToAttribute.worker' import config from './config' let $event = new Event() let EVENT_ID = 0 let worker = new FeaturesToAttribute() worker.addEventListener('message', listener) async function listener(event) { let incident = event.data.incident let geoJsonArray = event.data.geoJsonArray let meshs = geoJsonArray.map(j => { let { maxHeight, animateBuffArrays, verticesBuffArrays: verticesArray, normalsBuffArrays: normalsArray, type } = j let geometry = new THREE.BufferGeometry() geometry.addAttribute('position', new THREE.BufferAttribute(verticesArray, 3)); geometry.addAttribute('normal', new THREE.BufferAttribute(normalsArray, 3)); var mesh = grentMesh(geometry, type); threeLayer.getScene().add(mesh) mesh.maxHeight = maxHeight init(verticesArray, maxHeight) animation(mesh, verticesArray, animateBuffArrays, config.stepTotal) return mesh }) $event.emit(incident, meshs) } async function addArchitecture(features) { let incident = 'grentAttribute' + EVENT_ID++ let map = threeLayer.getMap() let setting = { center: map.getCenter(), maxNativeZoom: map.getMaxNativeZoom() } let promise = new Promise(resolve => { $event.once(incident, mesh => { resolve(mesh) }) }) worker.postMessage({ thing: 'initialAttribute', features: JSON.stringify(features), map: JSON.stringify(setting), incident }) return promise } export default addArchitecture