import * as THREE from 'three'; import UseThree from '../../../../utils/threejs/useThree'; import singleWindow from './dandaoFc.threejs'; import doubleWindow from './shuangdaoFc.threejs'; import singleWindowXk from './dandaoFcXk.threejs'; import { animateCamera } from '/@/utils/threejs/util'; import useEvent from '../../../../utils/threejs/useEvent'; import { useGlobSetting } from '/@/hooks/setting'; // import * as dat from 'dat.gui'; // const gui = new dat.GUI(); // gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999'; // 模型对象、 文字对象 let model: UseThree, singleWindowObj, doubleWindowObj: doubleWindow, singleWindowXkObj: singleWindowXk, group: THREE.Object3D, windowType = 'singleWindow'; const { mouseDownFn } = useEvent(); // 打灯光 const addLight = () => { if (!model || !model.scene) return; const directionalLight = new THREE.DirectionalLight(0xffffff, 1); directionalLight.position.set(-110, 150, 647); model.scene?.add(directionalLight); // directionalLight.target = group; const pointLight2 = new THREE.PointLight(0xffffff, 1, 150); pointLight2.position.set(-101, 34, 16); pointLight2.shadow.bias = 0.05; model.scene.add(pointLight2); const pointLight3 = new THREE.PointLight(0xffffff, 1, 150); pointLight3.position.set(19, 25, -7); pointLight3.shadow.bias = 0.05; model.scene.add(pointLight3); const pointLight6 = new THREE.PointLight(0xffffff, 1, 300); pointLight6.position.set(51, 51, 9); pointLight6.shadow.bias = 0.05; model.scene.add(pointLight6); }; // 初始化左右摇摆动画 const startAnimation = () => { // 定义鼠标点击事件 model.canvasContainer?.addEventListener('mousedown', mouseEvent.bind(null)); model.canvasContainer?.addEventListener('pointerup', (event) => { event.stopPropagation(); // 单道、 双道 if (windowType === 'doubleWindow' && doubleWindowObj) { doubleWindowObj.mouseUpModel.call(doubleWindowObj); } else if (windowType === 'singleWindow' && singleWindowObj) { singleWindowObj.mouseUpModel.call(singleWindowObj); } else if (windowType === 'singleXkWindow' && singleWindowXkObj) { singleWindowXkObj.mouseUpModel.call(singleWindowXkObj); } }); }; // 鼠标点击、松开事件 const mouseEvent = (event) => { if (event.button == 0) { mouseDownFn(model, group, event, (intersects) => { if (windowType === 'doubleWindow' && doubleWindowObj) { doubleWindowObj.mousedownModel.call(doubleWindowObj, intersects); } else if (windowType === 'singleWindow' && singleWindowObj) { singleWindowObj.mousedownModel.call(singleWindowObj, intersects); } else if (windowType === 'singleXkWindow' && singleWindowXkObj) { singleWindowXkObj.mousedownModel.call(singleWindowXkObj, intersects); } }); } }; export const addMonitorText = (selectData) => { if (windowType === 'doubleWindow' && doubleWindowObj) { return doubleWindowObj.addMonitorText.call(doubleWindowObj, selectData); } else if (windowType === 'singleWindow' && singleWindowObj) { return singleWindowObj.addMonitorText.call(singleWindowObj, selectData); } else if (windowType === 'singleXkWindow' && singleWindowXkObj) { return singleWindowXkObj.addMonitorText.call(singleWindowXkObj, selectData); } }; export const play = (rotationParam, flag) => { if (windowType === 'doubleWindow' && doubleWindowObj) { return doubleWindowObj.play.call(doubleWindowObj, rotationParam, flag); } else if (windowType === 'singleWindow' && singleWindowObj) { return singleWindowObj.play.call(singleWindowObj, rotationParam, flag); } else if (windowType === 'singleXkWindow' && singleWindowXkObj) { return singleWindowXkObj.play.call(singleWindowXkObj, rotationParam, flag); } }; // 切换风窗类型 export const setModelType = (type) => { // if (!model || !model.scene) return; windowType = type; return new Promise((resolve) => { // 显示双道风窗 if (windowType === 'doubleWindow' && doubleWindowObj && doubleWindowObj.group) { model.startAnimation = doubleWindowObj.render.bind(doubleWindowObj); model.scene?.remove(group); group = doubleWindowObj.group; const oldCameraPosition = { x: 100, y: 0, z: 500 }; model.scene?.add(doubleWindowObj.group); setTimeout(async () => { resolve(null); await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model); }, 300); } else if (windowType === 'singleWindow') { // 显示单道风窗 model.startAnimation = singleWindowObj.render.bind(singleWindowObj); model.scene?.remove(group); group = singleWindowObj.group; const oldCameraPosition = { x: 100, y: 0, z: 500 }; model.scene?.add(singleWindowObj.group); setTimeout(async () => { resolve(null); await animateCamera(oldCameraPosition, { x: 0, y: 0, z: 0 }, { x: 66.257, y: 57.539, z: 94.313 }, { x: 0, y: 0, z: 0 }, model); }, 300); } }); }; export const mountedThree = (playerDom) => { const { sysOrgCode } = useGlobSetting(); return new Promise(async (resolve) => { model = new UseThree('#window3D'); if (!model || !model.renderer || !model.camera) return; model.setEnvMap('test1'); resolve(null); model.camera.position.set(100, 0, 1000); doubleWindowObj = new doubleWindow(model); if (sysOrgCode === 'sdmtjtbetmk') { const singleWindowBet = await import('./dandaoFcBet.threejs'); if (singleWindowBet) singleWindowObj = new singleWindowBet.default(model); } else { singleWindowObj = new singleWindow(model); } doubleWindowObj.mountedThree(playerDom); singleWindowObj.mountedThree(playerDom); model.animate(); addLight(); startAnimation(); }); }; export const destroy = () => { if (model) { model.isRender = false; console.log('场景销毁前信息----------->', model.renderer?.info); model.isRender = false; doubleWindowObj.destroy(); singleWindowObj.destroy(); model.destroy(); model = null; group = null; singleWindowObj = null; doubleWindowObj = null; } };