import * as THREE from 'three'; import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; import { genGroupStruct, genAnimations } from './modalParse' const gltfLoader = new GLTFLoader(); const dracoLoader = new DRACOLoader(); dracoLoader.setDecoderPath('/model/draco/gltf/'); dracoLoader.setDecoderConfig({ type: 'js' }); //使用兼容性强的draco_decoder.js解码器 dracoLoader.preload(); gltfLoader.setDRACOLoader(dracoLoader); gltfLoader.setPath('/model/glft/'); async function loadModel(data) { const { modalValue, modalName, message } = data if (!modalValue) { const db = window['CustomDB']; const modalArr = await db.modal.where('modalName').equals(modalName).toArray(); modalValue = modalArr[0].modalVal; } gltfLoader.parse( modalValue, '/model/glft/', (gltf) => { const object = gltf.scene; object.traverse((obj) => { if (obj instanceof THREE.Mesh) { obj.material.emissiveIntensity = 1; // obj.material.emissiveMap = obj.material.map; obj.material.blending = THREE.CustomBlending; if (obj.material.opacity < 1) { obj.material.transparent = true; } obj.renderOrder = 1; // if (obj.name !== 'buxiugangse') { // obj.receiveShadow = true; // } // obj.castShadow = true; } }); object.name = modalName; dracoLoader.dispose(); self.postMessage({ modalName, work_type: "parseModel", ...genGroupStruct(object), sceneAnimations: genAnimations(gltf.animations), }); self.close(); }, (err) => { console.log(err); self.postMessage({ message: 'end', data: null }); self.close(); } ) } self.addEventListener( 'message', async function (e) { const data = e.data await loadModel(data) }, false );