loadModel.worker.js 2.1 KB

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