123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- import modalWorker from './loadGltf.worker?worker';
- import Dexie from 'dexie';
- import { useModelStore } from '/@/store/modules/threejs';
- import * as THREE from 'three';
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
- export function initModalWorker() {
- type model = {
- modelName: string;
- modalVal: any;
- version: string;
- };
- const modalUrlArr = [
- // 'fm/fm_2023-06-02.glb',
- // 'fm/Fm-door_2023-11-29.glb',
- // 'fm/Fm-wire_2023-11-29.glb',
- // 'fm/Fm-wire-qd_2023-11-28.glb',
- // 'fm/Fm-wall_2023-11-29.glb',
- // 'fm/Fm-wall-qd_2023-11-28.glb',
- // 'fm/fmThree_2023-07-25.glb',
- // 'fm/fmThreeBase_2023-07-25.glb',
- // 'fm/fmXr-door_2023-12-28.glb',
- // 'fm/fmXr-wire_2023-12-29.glb',
- // 'fm/fmXr-wall_2023-12-29.glb',
- // 'fm/quickObfurage-door_2023-06-02.glb',
- // 'fm/quickObfurage-wire_2023-06-02.glb',
- // 'fm/quickObfurage-wall_2023-06-02.glb',
- // 'fc/wall_2023-10-11.glb',
- // // 'fc/ddFc_2023-10-11.glb',
- // // 'fc/sdFc_2023-10-19.glb',
- // 'fc/ddFc_2023-06-02.glb',
- // 'fc/sdFc_2023-06-02.glb',
- // 'cf/lmcf_2023-06-02.glb',
- // 'cf/lmcfSide_2023-06-02.glb',
- // 'cf/zdcf_2023-06-02.glb',
- // 'cf/dscf_2023-06-02.glb',
- // 'cf/dsgd_2023-06-02.glb',
- // 'cf/ddcf_2023-12-09.glb',
- // 'cf/dsmove_2023-06-02.glb',
- // 'cf/fixedCf_2023-11-29.glb',
- 'jbfj/jbfj-hd_2024-03-14.glb',
- 'jbfj/jbfj-fm_2023-06-02.glb',
- 'jbfj/jbfj-fc_2023-06-02.glb',
- 'ztfj/dj1_2023-06-02.glb',
- 'ztfj/dj2_2023-06-02.glb',
- 'ztfj/bg_2023-06-02.glb',
- 'ztfj/bg1_2023-06-02.glb',
- 'ztfj/dzp_2023-06-02.glb',
- 'ztfj/fbm_2023-06-02.glb',
- 'ztfj/ztfj-fc_2023-06-02.glb',
- 'ztfj/ztfj_2023-12-12.glb',
- 'ztfj/ztfj-xj_2024-07-12.glb',
- 'fire/laneway_2024-03-04.glb',
- 'fire/laneway-device_2024-03-19.glb',
- 'fire/chamber_2023-06-02.glb',
- // 'fire/workFace_2023-06-29.glb',
- 'fire/tunFace_2023-07-14.glb',
- 'fire/nitrogen_2023-06-02.glb',
- // 'fire/nitrogenUnderground_2023-09-15.glb',
- 'fire/nitrogenUnderground_2024-04-09.glb',
- 'fire/grout_2023-06-02.glb',
- 'fire/Bertai_2023-11-29.glb',
- 'fire/balancePress_2024-03-14.glb',
- 'yafeng/compressor_2023-07-10.glb',
- 'gas/gasPump_2024-03-04.glb',
- 'gas/gasPumpUnder_2023-10-05.glb',
- 'mb/obfurage_2024-03-19.glb',
- // 'workFace/workFace-base_2024-03-04.glb',
- // 'workFace/workFace-jin_2024-03-04.glb',
- // 'workFace/workFace-hui_2024-03-04.glb',
- 'workFace/workFace1-1_2024-04-09.glb',
- 'workFace/workFace2-1_2024-04-09.glb',
- 'workFace/workFace_2024-09-20.glb',
- ];
- const db: any = new Dexie('DB');
- window['CustomDB'] = db;
- const modelStore = useModelStore();
- db.version(1).stores({
- modal: '&modalName, modalVal, versionStr',
- });
- db.open();
- new Promise(async (resolve) => {
- const validateModelUrlArr: string[] = [];
- for (let i = 0; i < modalUrlArr.length; i++) {
- const url = modalUrlArr[i];
- const fileName = url.replace(/(.*\/)*([^.]+).*/gi, '$2');
- const modalName = fileName.slice(0, -11);
- const version = fileName.slice(-11);
- const modalArr = await db.modal.where('modalName').equals(modalName).toArray();
- if (modalArr.length < 1) {
- validateModelUrlArr.push(url);
- } else {
- // 判断该版本是否一致,不一致删除
- const data = modelStore.modelArr.get(modalName);
- const versionDB = modalArr[0].versionStr;
- if (versionDB == version) {
- // 版本一致
- if (!data) {
- const model: model = {
- modelName: modalName,
- modalVal: modalArr[0].modalVal,
- version: modalArr[0].versionStr,
- };
- // modelStore.setModel(model);
- }
- } else {
- // 版本不一致,删除模型,重新下载
- await db.modal.delete(modalName);
- validateModelUrlArr.push(url);
- }
- }
- }
- resolve(validateModelUrlArr);
- }).then((validateModelUrlArr: string[]) => {
- validateModelUrlArr.forEach((url) => {
- const worker = new modalWorker();
- worker.onmessage = async function (e) {
- const { data, message } = e.data;
- if (message === 'end') {
- if (data) {
- modelStore.setModel(data);
- }
- worker.terminate();
- }
- };
- worker.postMessage({ message: 'load', data: url });
- });
- });
- }
- export function initTHREE() {
- if (!window['$renderer']) {
- const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true }) as THREE.WebGLRenderer;
- renderer?.setPixelRatio(window.devicePixelRatio);
- renderer.toneMapping = THREE.ACESFilmicToneMapping;
- // renderer.shadowMap.enabled = true;
- renderer.toneMappingExposure = 1;
- // renderer.outputColorSpace= THREE.SRGBColorSpace;
- renderer.setClearAlpha(0);
- //renderer.shadowMap.type = THREE.PCFSoftShadowMap;
- //renderer.physicallyCorrectLights = true;
- window['$renderer'] = renderer;
- }
- if (!window['$camera']) {
- const camera = new THREE.PerspectiveCamera(50, document.body.clientWidth / document.body.clientHeight, 0.0000001, 1000);
- window['$camera'] = camera;
- }
- if (!window['$orbitControls']) {
- const orbitControls = new OrbitControls(window['$camera'] as THREE.Camera, window['$renderer']?.domElement) as OrbitControls;
- orbitControls.mouseButtons = {
- MIDDLE: THREE.MOUSE.PAN,
- RIGHT: THREE.MOUSE.ROTATE,
- };
- window['$orbitControls'] = orbitControls;
- }
- }
|