main.worker.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import modalWorker from './loadGltf.worker?worker';
  2. import Dexie from 'dexie';
  3. import { useModelStore } from '/@/store/modules/threejs';
  4. export function initModalWorker() {
  5. type model = {
  6. modelName: string;
  7. modelVal: any;
  8. };
  9. const modalUrlArr = [
  10. 'fm/fm.glb',
  11. 'fm/Fm-door.glb',
  12. 'fm/Fm-wire.glb',
  13. 'fm/Fm-wall.glb',
  14. 'fc/sdFc.glb',
  15. 'fc/ddFc.glb',
  16. 'cf/lmcf.glb',
  17. 'cf/lmcfSide.glb',
  18. 'cf/zdcf.glb',
  19. 'cf/dscf.glb',
  20. 'jbfj/jbfj_hd.glb',
  21. 'jbfj/jbfj_fm.glb',
  22. 'jbfj/jbfj_fc.glb',
  23. 'ztfj/main.glb',
  24. 'ztfj/dj1.glb',
  25. 'ztfj/dj2.glb',
  26. 'ztfj/bg.glb',
  27. 'fire/laneway.glb',
  28. 'fire/workFace.glb',
  29. 'yafeng/nitrogen.glb',
  30. 'ceshi/glass.glb',
  31. ];
  32. const db: any = new Dexie('DB');
  33. window['CustomDB'] = db;
  34. const modelStore = useModelStore();
  35. db.version(1).stores({
  36. modal: '++id, modalName, modalVal',
  37. });
  38. new Promise(async (resolve) => {
  39. const validateModelUrlArr: string[] = [];
  40. for (let i = 0; i < modalUrlArr.length; i++) {
  41. const url = modalUrlArr[i];
  42. const modalName = url.replace(/(.*\/)*([^.]+).*/gi, '$2');
  43. const aa = new Date().getTime();
  44. const modalArr = await db.modal.where('modalName').equals(modalName).toArray();
  45. console.log('模型下载时间------------》', new Date().getTime() - aa);
  46. if (modalArr.length < 1) {
  47. validateModelUrlArr.push(url);
  48. } else {
  49. if (!modelStore.modelArr.get(modalName)) {
  50. const model: model = {
  51. modelName: modalName,
  52. modelVal: modalArr[0].modalVal,
  53. };
  54. modelStore.setModel(model);
  55. }
  56. }
  57. }
  58. resolve(validateModelUrlArr);
  59. }).then((validateModelUrlArr: string[]) => {
  60. validateModelUrlArr.forEach((url) => {
  61. const worker = new modalWorker();
  62. worker.onmessage = async function (e) {
  63. const { data, message } = e.data;
  64. if (message === 'end') {
  65. if (data) {
  66. modelStore.setModel(data);
  67. }
  68. worker.terminate();
  69. }
  70. };
  71. worker.postMessage({ message: 'load', data: url });
  72. });
  73. });
  74. }
  75. initModalWorker();