f72dd58052cae248b0f85ba8faaafc3e121f99c9.svn-base 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import Event from '../core/Event'
  2. import * as THREE from 'three'
  3. import {animation, init} from './meshAnimation'
  4. import grentMesh from './grentMesh'
  5. import FeaturesToAttribute from '../worker/featuresToAttribute.worker'
  6. import config from './config'
  7. let $event = new Event()
  8. let EVENT_ID = 0
  9. let worker = new FeaturesToAttribute()
  10. worker.addEventListener('message', listener)
  11. async function listener(event) {
  12. let incident = event.data.incident
  13. let geoJsonArray = event.data.geoJsonArray
  14. let meshs = geoJsonArray.map(j => {
  15. let {
  16. maxHeight,
  17. animateBuffArrays,
  18. verticesBuffArrays: verticesArray,
  19. normalsBuffArrays: normalsArray,
  20. type
  21. } = j
  22. let geometry = new THREE.BufferGeometry()
  23. geometry.addAttribute('position', new THREE.BufferAttribute(verticesArray, 3));
  24. geometry.addAttribute('normal', new THREE.BufferAttribute(normalsArray, 3));
  25. var mesh = grentMesh(geometry, type);
  26. threeLayer.getScene().add(mesh)
  27. mesh.maxHeight = maxHeight
  28. init(verticesArray, maxHeight)
  29. animation(mesh, verticesArray, animateBuffArrays, config.stepTotal)
  30. return mesh
  31. })
  32. $event.emit(incident, meshs)
  33. }
  34. async function addArchitecture(features) {
  35. let incident = 'grentAttribute' + EVENT_ID++
  36. let map = threeLayer.getMap()
  37. let setting = {
  38. center: map.getCenter(),
  39. maxNativeZoom: map.getMaxNativeZoom()
  40. }
  41. let promise = new Promise(resolve => {
  42. $event.once(incident, mesh => {
  43. resolve(mesh)
  44. })
  45. })
  46. worker.postMessage({
  47. thing: 'initialAttribute',
  48. features: JSON.stringify(features),
  49. map: JSON.stringify(setting),
  50. incident
  51. })
  52. return promise
  53. }
  54. export default addArchitecture