loadModel.worker.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import * as THREE from 'three';
  2. import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
  3. import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
  4. import { genGroupStruct, genAnimations } from './modalParse'
  5. const gltfLoader = new GLTFLoader();
  6. const dracoLoader = new DRACOLoader();
  7. dracoLoader.setDecoderPath('/model/draco/gltf/');
  8. dracoLoader.setDecoderConfig({ type: 'js' }); //使用兼容性强的draco_decoder.js解码器
  9. dracoLoader.preload();
  10. gltfLoader.setDRACOLoader(dracoLoader);
  11. gltfLoader.setPath('/model/glft/');
  12. async function loadModel(data) {
  13. const { modalValue, modalName, message } = data
  14. if (!modalValue) {
  15. const db = window['CustomDB'];
  16. const modalArr = await db.modal.where('modalName').equals(modalName).toArray();
  17. modalValue = modalArr[0].modalVal;
  18. }
  19. gltfLoader.parse(
  20. modalValue,
  21. '/model/glft/',
  22. (gltf) => {
  23. const object = gltf.scene;
  24. object.traverse((obj) => {
  25. if (obj instanceof THREE.Mesh) {
  26. obj.material.emissiveIntensity = 1;
  27. // obj.material.emissiveMap = obj.material.map;
  28. obj.material.blending = THREE.CustomBlending;
  29. if (obj.material.opacity < 1) {
  30. obj.material.transparent = true;
  31. }
  32. obj.renderOrder = 1;
  33. // if (obj.name !== 'buxiugangse') {
  34. // obj.receiveShadow = true;
  35. // }
  36. // obj.castShadow = true;
  37. }
  38. });
  39. object.name = modalName;
  40. dracoLoader.dispose();
  41. self.postMessage({
  42. modalName,
  43. work_type: "parseModel",
  44. ...genGroupStruct(object),
  45. sceneAnimations: genAnimations(gltf.animations),
  46. });
  47. self.close();
  48. },
  49. (err) => {
  50. console.log(err);
  51. self.postMessage({ message: 'end', data: null });
  52. self.close();
  53. }
  54. )
  55. }
  56. self.addEventListener(
  57. 'message',
  58. async function (e) {
  59. const data = e.data
  60. await loadModel(data)
  61. },
  62. false
  63. );