mirror of
https://gitee.com/ice-gl/icegl-three-vue-tres.git
synced 2025-04-05 06:22:43 +08:00
Merge branch 'master' into goViewPlugin
This commit is contained in:
commit
f0018f8132
BIN
public/plugins/industry4/alternator/images.zip
Normal file
BIN
public/plugins/industry4/alternator/images.zip
Normal file
Binary file not shown.
1
public/plugins/industry4/alternator/json/scene.json
Normal file
1
public/plugins/industry4/alternator/json/scene.json
Normal file
File diff suppressed because one or more lines are too long
BIN
public/plugins/industry4/preview/alternator.png
Normal file
BIN
public/plugins/industry4/preview/alternator.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 298 KiB |
@ -0,0 +1,14 @@
|
||||
<template>
|
||||
<!-- name:bj uuid:8d062f1d-8d00-4f4f-804d-8492626bc26c type:Group -->
|
||||
<primitive :object="object[0]" />
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
object: any
|
||||
}>(),
|
||||
{},
|
||||
)
|
||||
</script>
|
@ -0,0 +1,74 @@
|
||||
<template>
|
||||
<!-- name:103 uuid:f3ddf9ae-40de-4416-aa55-de0df5267f60 type:Mesh -->
|
||||
<primitive :object="object[0]" />
|
||||
<!-- name:Line005 uuid:8bd1f5e9-fa84-4ebd-8049-1b277af45da7 type:Mesh -->
|
||||
<primitive :object="object[1]" />
|
||||
<!-- name:Box002 uuid:2ea5ba62-7455-4a23-9636-f80a681b739d type:Mesh -->
|
||||
<primitive :object="object[2]" />
|
||||
<!-- name:gm00 uuid:5db561fc-8728-46b6-98ad-e0a6d5d27b7a type:Mesh -->
|
||||
<primitive :object="object[3]" />
|
||||
<!-- name:gm01 uuid:ef1bac09-c322-4322-9c09-50855ffbd608 type:Group -->
|
||||
<primitive :object="object[4]" />
|
||||
<!-- name:gm02 uuid:69049cd8-ca3f-485a-904b-dd2a9a2a203d type:Mesh -->
|
||||
<primitive :object="object[5]" />
|
||||
<!-- name:gm03 uuid:8453cf46-30aa-4124-a661-3db104356b17 type:Mesh -->
|
||||
<primitive :object="object[6]" />
|
||||
<!-- name:gm04 uuid:d60b5467-ccc4-47d9-9ab9-a413e55e69b9 type:Group -->
|
||||
<primitive :object="object[7]" />
|
||||
<!-- name:gm05 uuid:b402b548-4796-4ede-b96a-678a3817f5c8 type:Group -->
|
||||
<primitive :object="object[8]" />
|
||||
<!-- name:Cylinder002 uuid:3ada61e8-0ffe-4353-9dd1-77155c6e9f68 type:Group -->
|
||||
<primitive :object="object[9]" />
|
||||
<!-- name:Box004 uuid:d7c175d3-8835-4e3e-a228-139c58017f0e type:Group -->
|
||||
<primitive :object="object[10]" />
|
||||
<!-- name:Box006 uuid:451d0757-02fc-4b1b-9835-75a0f54d6341 type:Group -->
|
||||
<primitive :object="object[11]" />
|
||||
<!-- name:Hose003 uuid:57dce6f1-bf74-48d9-b89c-a23428db9479 type:Mesh -->
|
||||
<primitive :object="object[12]" />
|
||||
<!-- name:Cylinder007 uuid:ddcce890-9cbe-4b12-8064-aa82db31627e type:Group -->
|
||||
<primitive :object="object[13]" />
|
||||
<!-- name:Hose006 uuid:8c0b5342-989d-4259-a6a9-2ba86bbe2fc7 type:Mesh -->
|
||||
<primitive :object="object[14]" />
|
||||
<!-- name:Line006 uuid:c3e2ee48-5cdb-488f-b6ec-84dc5db95cfc type:Mesh -->
|
||||
<primitive :object="object[15]" />
|
||||
<!-- name:Box007 uuid:26f869bf-dcfb-4515-aad5-ab5f9f94f705 type:Group -->
|
||||
<primitive :object="object[16]" />
|
||||
<!-- name:Line056 uuid:b6df7dc1-aaaf-4658-801a-79d942cd9320 type:Mesh -->
|
||||
<primitive :object="object[17]" />
|
||||
<!-- name:Line062 uuid:19425b8c-28a1-40b9-9009-1cbdcf8c1d6c type:Mesh -->
|
||||
<primitive :object="object[18]" />
|
||||
<!-- name:Line063 uuid:11624393-901f-4db5-a4ee-8f860d223035 type:Mesh -->
|
||||
<primitive :object="object[19]" />
|
||||
<!-- name:Line069 uuid:c431f249-ecb6-45ad-954d-030e1c152c2d type:Mesh -->
|
||||
<primitive :object="object[20]" />
|
||||
<!-- name:Line070 uuid:038d2b39-0db2-43a3-95d9-b7307bed322e type:Mesh -->
|
||||
<primitive :object="object[21]" />
|
||||
<!-- name:Line071 uuid:d801af07-4df3-4d2e-9dd1-96e647a86ceb type:Mesh -->
|
||||
<primitive :object="object[22]" />
|
||||
<!-- name:Line066 uuid:ea47beda-9e41-4d8f-bdd3-89aaf664c45e type:Mesh -->
|
||||
<primitive :object="object[23]" />
|
||||
<!-- name:Line067 uuid:1ababc27-d0c6-4eaf-b231-c211ef156249 type:Mesh -->
|
||||
<primitive :object="object[24]" />
|
||||
<!-- name:Line068 uuid:eb526026-acd6-4399-b397-32464e8676f8 type:Mesh -->
|
||||
<primitive :object="object[25]" />
|
||||
<!-- name:Cylinder008 uuid:3fbac617-c962-40bf-8c41-362e5a86dbbc type:Group -->
|
||||
<primitive :object="object[26]" />
|
||||
<!-- name:Cylinder009 uuid:f4332569-03a1-4944-93f2-9f246c04cb56 type:Group -->
|
||||
<primitive :object="object[27]" />
|
||||
<!-- name:102 uuid:75a05d93-2840-453c-a5c3-cf5d9f04a831 type:Mesh -->
|
||||
<primitive :object="object[28]" />
|
||||
<!-- name:101 uuid:055c362c-6e2c-410c-ab45-76d6b13a9482 type:Mesh -->
|
||||
<primitive :object="object[29]" />
|
||||
<!-- name:100 uuid:865c32e0-fab0-4b8e-a62e-083d5ca7921d type:Group -->
|
||||
<primitive :object="object[30]" />
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
object: any
|
||||
}>(),
|
||||
{},
|
||||
)
|
||||
</script>
|
159
src/plugins/industry4/components/alternator/eventScript.js
Normal file
159
src/plugins/industry4/components/alternator/eventScript.js
Normal file
@ -0,0 +1,159 @@
|
||||
/* eslint-disable prefer-rest-params */
|
||||
/* eslint-disable no-undefined */
|
||||
/* eslint-disable guard-for-in */
|
||||
import * as THREE from 'three'
|
||||
|
||||
window.THREE = THREE // Used by APP Scripts.
|
||||
const Grscwh = { scene: null, renderer: null, camera: null, sizes: null }
|
||||
const player = {
|
||||
get renderer() {
|
||||
return Grscwh.renderer?.value
|
||||
},
|
||||
loader: new THREE.TextureLoader(),
|
||||
get scene() {
|
||||
return Grscwh.scene?.value
|
||||
},
|
||||
get camera() {
|
||||
return Grscwh.camera?.value
|
||||
},
|
||||
get width() {
|
||||
return Grscwh.sizes?.width?.value
|
||||
},
|
||||
get height() {
|
||||
return Grscwh.sizes?.height?.value
|
||||
},
|
||||
get dom() {
|
||||
return Grscwh.renderer?.value.domElement.parentElement
|
||||
},
|
||||
get canvas() {
|
||||
return Grscwh.renderer?.value.domElement
|
||||
},
|
||||
events: {},
|
||||
init(scene, renderer, camera, sizes) {
|
||||
Grscwh.scene = scene
|
||||
Grscwh.renderer = renderer
|
||||
Grscwh.camera = camera
|
||||
Grscwh.sizes = sizes
|
||||
},
|
||||
load(sceneObject) {
|
||||
const scriptsJson =
|
||||
{}
|
||||
|
||||
this.events = {
|
||||
init: [],
|
||||
start: [],
|
||||
stop: [],
|
||||
keydown: [],
|
||||
keyup: [],
|
||||
pointerdown: [],
|
||||
pointerup: [],
|
||||
pointermove: [],
|
||||
update: [],
|
||||
}
|
||||
let scriptWrapParams = 'player,renderer,scene,camera'
|
||||
const scriptWrapResultObj = {}
|
||||
|
||||
for (const eventKey in this.events) {
|
||||
scriptWrapParams += `,${eventKey}`
|
||||
scriptWrapResultObj[eventKey] = eventKey
|
||||
}
|
||||
const scriptWrapResult = JSON.stringify(scriptWrapResultObj).replace(/\"/g, '')
|
||||
for (const uuid in scriptsJson) {
|
||||
let curUuid = uuid
|
||||
//这里解决一个问题 目前并没有把 主场景scene直接替换而是通过group 加进入的,所以 如果事件是基于主场景scene 那么替换这个uuid为现在tres主场景的uuid
|
||||
if (uuid === sceneObject.uuid) {
|
||||
curUuid = this.scene.uuid
|
||||
}
|
||||
const object = this.scene.getObjectByProperty('uuid', curUuid, true)
|
||||
if (object === undefined) {
|
||||
console.warn('player: Script without object.', curUuid)
|
||||
continue
|
||||
}
|
||||
const scripts = scriptsJson[uuid]
|
||||
for (let i = 0; i < scripts.length; i++) {
|
||||
const script = scripts[i]
|
||||
// eslint-disable-next-line no-new-func
|
||||
const functions = new Function(scriptWrapParams, `${script.source}
|
||||
return ${scriptWrapResult};`).bind(object)(
|
||||
this,
|
||||
this.renderer,
|
||||
this.scene,
|
||||
this.camera,
|
||||
)
|
||||
for (const name in functions) {
|
||||
if (functions[name] === undefined) continue
|
||||
if (this.events[name] === undefined) {
|
||||
console.warn('player: Event type not supported (', name, ')')
|
||||
continue
|
||||
}
|
||||
this.events[name].push(functions[name].bind(object))
|
||||
}
|
||||
}
|
||||
this.dispatch(this.events.init, arguments)
|
||||
}
|
||||
},
|
||||
dispatch(array, event) {
|
||||
for (let i = 0, l = array.length; i < l; i++) {
|
||||
array[i](event)
|
||||
}
|
||||
},
|
||||
setCamera(value) {
|
||||
console.warn('暂时不考虑摄像机的设置函数', value)
|
||||
// camera = value
|
||||
// camera.aspect = this.width / this.height
|
||||
// camera.updateProjectionMatrix()
|
||||
},
|
||||
setScene(value) {
|
||||
console.warn('暂时不考虑场景的设置函数', value)
|
||||
// scene = value
|
||||
},
|
||||
setPixelRatio(value) {
|
||||
console.warn('暂时不考虑像素比的设置函数', value)
|
||||
},
|
||||
setSize(value) {
|
||||
console.warn('暂时不考虑尺寸的设置函数', value)
|
||||
},
|
||||
dispose() {
|
||||
// renderer.dispose();
|
||||
// camera = undefined;
|
||||
// scene = undefined;
|
||||
console.warn('暂时不考虑释放资源的函数')
|
||||
},
|
||||
onKeyDown(event) {
|
||||
player.dispatch(player.events.keydown, event)
|
||||
},
|
||||
onKeyUp(event) {
|
||||
player.dispatch(player.events.keyup, event)
|
||||
},
|
||||
onPointerDown(event) {
|
||||
player.dispatch(player.events.pointerdown, event)
|
||||
},
|
||||
onPointerUp(event) {
|
||||
player.dispatch(player.events.pointerup, event)
|
||||
},
|
||||
onPointerMove(event) {
|
||||
player.dispatch(player.events.pointermove, event)
|
||||
},
|
||||
play() {
|
||||
document.addEventListener('keydown', this.onKeyDown)
|
||||
document.addEventListener('keyup', this.onKeyUp)
|
||||
document.addEventListener('pointerdown', this.onPointerDown)
|
||||
document.addEventListener('pointerup', this.onPointerUp)
|
||||
document.addEventListener('pointermove', this.onPointerMove)
|
||||
this.dispatch(this.events.start, null)
|
||||
//renderer.setAnimationLoop( animate ); 播放是自动的
|
||||
},
|
||||
stop() {
|
||||
document.removeEventListener('keydown', this.onKeyDown)
|
||||
document.removeEventListener('keyup', this.onKeyUp)
|
||||
document.removeEventListener('pointerdown', this.onPointerDown)
|
||||
document.removeEventListener('pointerup', this.onPointerUp)
|
||||
document.removeEventListener('pointermove', this.onPointerMove)
|
||||
this.dispatch(this.events.stop, arguments)
|
||||
// renderer.setAnimationLoop( null );播放是自动的
|
||||
},
|
||||
render(elapsed, delta) {
|
||||
this.dispatch(this.events.update, { time: elapsed, delta })
|
||||
},
|
||||
}
|
||||
export default player
|
78
src/plugins/industry4/components/alternator/scene.vue
Normal file
78
src/plugins/industry4/components/alternator/scene.vue
Normal file
@ -0,0 +1,78 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Version: 1.668
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2024-05-28 09:23:39
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-28 12:07:29
|
||||
-->
|
||||
<template>
|
||||
<!-- name:AmbientLight uuid:4a88f8db-06d0-47b4-ad5f-aad9885c3b29 type:AmbientLight -->
|
||||
<primitive :object="sceneObject.children[0]" />
|
||||
<!-- name:bj .glb uuid:a0966008-e71e-4b13-bc13-86e5869a71b5 type:Group -->
|
||||
<primitive :object="sceneObject.children[1]">
|
||||
<firstLevel86e5869a71b5 :object="sceneObject.children[1].children" />
|
||||
</primitive>
|
||||
<!-- name:fdj .glb uuid:192ca4fd-3655-414f-a95d-da662feb67b1 type:Group -->
|
||||
<primitive :object="sceneObject.children[2]">
|
||||
<firstLevelda662feb67b1 :object="sceneObject.children[2].children" />
|
||||
</primitive>
|
||||
<!-- name:DirectionalLight uuid:76d3cd67-1b53-40f5-b5b6-59a9be50ec03 type:DirectionalLight -->
|
||||
<primitive :object="sceneObject.children[3]" />
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { onMounted } from 'vue'
|
||||
import * as THREE from 'three'
|
||||
import { loadImageToBase64, loadJsonFile, loadRemoteZip } from 'PLS/tresEditor'
|
||||
import { useTresContext, useRenderLoop } from '@tresjs/core'
|
||||
import player from './eventScript'
|
||||
import firstLevel86e5869a71b5 from './childComponent/firstLevel-86e5869a71b5.vue'
|
||||
import firstLevelda662feb67b1 from './childComponent/firstLevel-da662feb67b1.vue'
|
||||
|
||||
const { scene: tresScene, renderer, camera, sizes } = useTresContext()
|
||||
player.init(tresScene, renderer, camera, sizes)
|
||||
|
||||
const loader = new THREE.ObjectLoader()
|
||||
const scene = await loadJsonFile('./plugins/industry4/alternator/json/scene.json')
|
||||
|
||||
if (scene.geometries) {
|
||||
const geometriesZip = await loadRemoteZip('https://opensource-1314935952.cos.ap-nanjing.myqcloud.com/model/industry4/alternator/geometries.zip')
|
||||
for (const geometry of scene.geometries) {
|
||||
if (geometry.data && geometry.data.startsWith('url:')) {
|
||||
let url = geometry.data.slice(4)
|
||||
geometry.data = JSON.parse(await geometriesZip.files[url].async('string'))
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scene.images) {
|
||||
const imagesZip = await loadRemoteZip('./plugins/industry4/alternator/images.zip')
|
||||
for (const image of scene.images) {
|
||||
if (image.url && image.url.startsWith('url:')) {
|
||||
let url = image.url.slice(4)
|
||||
if (url.endsWith('.json')) {
|
||||
image.url = JSON.parse(await imagesZip.files[url].async('string'))
|
||||
} else {
|
||||
const idata = await imagesZip.files[url].async('base64')
|
||||
const fileNameParts = url.split('.')
|
||||
const extension = fileNameParts[fileNameParts.length - 1].toUpperCase()
|
||||
image.url = `data:image/${extension};base64,${idata}`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const sceneObject = loader.parse(scene) as any
|
||||
onMounted(() => {
|
||||
tresScene.value.background = sceneObject.background
|
||||
tresScene.value.environment = sceneObject.environment
|
||||
tresScene.value.fog = sceneObject.fog
|
||||
player.load(sceneObject)
|
||||
player.play()
|
||||
})
|
||||
const { onLoop } = useRenderLoop()
|
||||
onLoop(({ delta, elapsed }) => {
|
||||
if (player.renderer) {
|
||||
player.render(elapsed * 1000, delta * 1000)
|
||||
}
|
||||
})
|
||||
</script>
|
@ -4,7 +4,7 @@
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2023-11-10 16:11:27
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-24 09:55:21
|
||||
* @LastEditTime: 2024-05-28 09:22:03
|
||||
*/
|
||||
|
||||
export default {
|
||||
@ -57,6 +57,12 @@ export default {
|
||||
name: 'dissolveEffect',
|
||||
title: '溶解特效',
|
||||
},
|
||||
{
|
||||
src: 'plugins/industry4/preview/alternator.png',
|
||||
type: 'img',
|
||||
name: 'alternator',
|
||||
title: '发电机展示',
|
||||
},
|
||||
// { "src": "plugins/industry4/preview/deviceLight.png", "type": "img", "name": "deviceLightByComposerTres", "title": "发光后期useTres" },
|
||||
],
|
||||
}
|
||||
|
68
src/plugins/industry4/pages/alternator.vue
Normal file
68
src/plugins/industry4/pages/alternator.vue
Normal file
@ -0,0 +1,68 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Version: 1.668
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2024-05-28 09:22:40
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-28 09:24:17
|
||||
-->
|
||||
|
||||
<template>
|
||||
<loading />
|
||||
<TresCanvas v-bind="state">
|
||||
<OrbitControls />
|
||||
<TresPerspectiveCamera ref="cameraRef" uuid="1c22773e-eb46-4708-b3bd-2baf29ac5cb3" name="Camera" />
|
||||
<Suspense>
|
||||
<sceneCom />
|
||||
</Suspense>
|
||||
</TresCanvas>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import * as THREE from 'three'
|
||||
import { reactive, watch, ref } from 'vue'
|
||||
import { TresCanvas } from '@tresjs/core'
|
||||
import { OrbitControls } from '@tresjs/cientos'
|
||||
import sceneCom from '../components/alternator/scene.vue'
|
||||
import { loading2 as loading } from 'PLS/UIdemo'
|
||||
|
||||
const state = reactive({
|
||||
clearColor: '#201919',
|
||||
windowSize: true,
|
||||
antialias: true,
|
||||
shadows: true,
|
||||
shadowMapType: 1,
|
||||
toneMapping: 4,
|
||||
toneMappingExposure: 1,
|
||||
})
|
||||
|
||||
const cameraConfig = {
|
||||
metadata: { version: 4.6, type: 'Object', generator: 'Object3D.toJSON' },
|
||||
object: {
|
||||
type: 'PerspectiveCamera',
|
||||
name: 'Camera',
|
||||
layers: 1,
|
||||
matrix: [
|
||||
0.913136019977033, -1.3877787807814457e-17, 0.4076550122597582, 0, 0.14727121903745338, 0.9324634451239355, -0.3298834817792847, 0,
|
||||
-0.3801233971537743, 0.3612643402103247, 0.851465959054543, 0, -3.2597835600761362, 3.636647435981188, 6.776103699335103, 1,
|
||||
],
|
||||
up: [0, 1, 0],
|
||||
fov: 50,
|
||||
zoom: 1,
|
||||
near: 0.01,
|
||||
far: 1000,
|
||||
focus: 10,
|
||||
aspect: 1.262730627306273,
|
||||
filmGauge: 35,
|
||||
filmOffset: 0,
|
||||
},
|
||||
}
|
||||
const loader = new THREE.ObjectLoader()
|
||||
const cameraObject = loader.parse(cameraConfig)
|
||||
const cameraRef = ref(null)
|
||||
watch(
|
||||
() => cameraRef.value,
|
||||
(val) => {
|
||||
val.copy(cameraObject)
|
||||
},
|
||||
)
|
||||
</script>
|
@ -156,7 +156,11 @@ if (scene.images) {
|
||||
if (url.startsWith('images/')) {
|
||||
url = \`./plugins/${pluginState.pluginName}/\${url}\`
|
||||
}
|
||||
image.url = await loadImageToBase64(url)
|
||||
if (url.endsWith(".json")) {
|
||||
image.url = await loadJsonFile(url)
|
||||
} else {
|
||||
image.url = await loadImageToBase64(url)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -221,7 +225,11 @@ const codeForJson = (publicFolder, scene) => {
|
||||
scene.images.forEach((image) => {
|
||||
if (image.url) {
|
||||
imagesList.push({ uuid: image.uuid, url: image.url })
|
||||
image.url = `url:images/${image.uuid}.${getImageFormat(image.url)}`
|
||||
if (image.url.type) {
|
||||
image.url = `url:images/${image.uuid}.${image.url.type}.json`
|
||||
} else {
|
||||
image.url = `url:images/${image.uuid}.${getImageFormat(image.url)}`
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -234,7 +242,11 @@ const codeForJson = (publicFolder, scene) => {
|
||||
if (imagesList.length) {
|
||||
const imagesZip = publicFolder.folder('images')
|
||||
imagesList.forEach((image) => {
|
||||
imagesZip.file(`${image.uuid}.${getImageFormat(image.url)}`, image.url.split(';base64,').pop(), { base64: true })
|
||||
if (image.url.type) {
|
||||
imagesZip.file(`${image.uuid}.${image.url.type}.json`, JSON.stringify(image.url))
|
||||
} else {
|
||||
imagesZip.file(`${image.uuid}.${getImageFormat(image.url)}`, image.url.split(';base64,').pop(), { base64: true })
|
||||
}
|
||||
})
|
||||
}
|
||||
publicFolder.file(`json/scene.json`, JSON.stringify(scene))
|
||||
|
@ -6,7 +6,7 @@
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2024-05-10 10:32:35
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-16 16:21:49
|
||||
* @LastEditTime: 2024-05-28 11:54:39
|
||||
*/
|
||||
import { request } from '@fesjs/fes'
|
||||
import JSZip from 'jszip'
|
||||
@ -63,6 +63,21 @@ export async function loadImageToBase64(url) {
|
||||
})
|
||||
}
|
||||
|
||||
export const loadRemoteZip = (url) => {
|
||||
const loader = new THREE.FileLoader()
|
||||
loader.setResponseType('blob')
|
||||
return new Promise((resolve, reject) => {
|
||||
loader.load(
|
||||
url,
|
||||
async (data) => {
|
||||
resolve(await JSZip.loadAsync(data))
|
||||
},
|
||||
undefined, // 进度回调(可选)
|
||||
(error) => reject(error),
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
export const loadJson = (filepath) =>
|
||||
new Promise((resolve, reject) => {
|
||||
request(filepath, {}, { method: 'get' })
|
||||
@ -126,7 +141,11 @@ export const exporterJsonZip = (jsonObjct) => {
|
||||
jsonObjct.scene.images.forEach((image) => {
|
||||
if (image.url) {
|
||||
imagesList.push({ uuid: image.uuid, url: image.url })
|
||||
image.url = `url:images/${image.uuid}.${getImageFormat(image.url)}`
|
||||
if (image.url.type) {
|
||||
image.url = `url:images/${image.uuid}.${image.url.type}.json`
|
||||
} else {
|
||||
image.url = `url:images/${image.uuid}.${getImageFormat(image.url)}`
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -140,7 +159,11 @@ export const exporterJsonZip = (jsonObjct) => {
|
||||
if (imagesList.length) {
|
||||
const imagesZip = zip.folder('images')
|
||||
imagesList.forEach((image) => {
|
||||
imagesZip.file(`${image.uuid}.${getImageFormat(image.url)}`, image.url.split(';base64,').pop(), { base64: true })
|
||||
if (image.url.type) {
|
||||
imagesZip.file(`${image.uuid}.${image.url.type}.json`, JSON.stringify(image.url))
|
||||
} else {
|
||||
imagesZip.file(`${image.uuid}.${getImageFormat(image.url)}`, image.url.split(';base64,').pop(), { base64: true })
|
||||
}
|
||||
})
|
||||
}
|
||||
const json = JSON.stringify(jsonObjct)
|
||||
@ -196,13 +219,21 @@ export const importJsonZip = (file, handler) => {
|
||||
gJson.scene.images?.forEach((image) => {
|
||||
if (image.url.startsWith('url:')) {
|
||||
const imgName = image.url.slice(4)
|
||||
zip.files[imgName].async('base64').then((idata) => {
|
||||
const fileNameParts = imgName.split('.')
|
||||
const extension = fileNameParts[fileNameParts.length - 1].toUpperCase()
|
||||
image.url = `data:image/${extension};base64,${idata}`
|
||||
resourceNum.images--
|
||||
checkFinishImportJson(resourceNum, gJson, handler)
|
||||
})
|
||||
if (imgName.endsWith('.json')) {
|
||||
zip.files[imgName].async('string').then((gdata) => {
|
||||
image.url = JSON.parse(gdata)
|
||||
resourceNum.images--
|
||||
checkFinishImportJson(resourceNum, gJson, handler)
|
||||
})
|
||||
} else {
|
||||
zip.files[imgName].async('base64').then((idata) => {
|
||||
const fileNameParts = imgName.split('.')
|
||||
const extension = fileNameParts[fileNameParts.length - 1].toUpperCase()
|
||||
image.url = `data:image/${extension};base64,${idata}`
|
||||
resourceNum.images--
|
||||
checkFinishImportJson(resourceNum, gJson, handler)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -4,7 +4,7 @@
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2024-05-10 10:25:14
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-17 09:40:03
|
||||
* @LastEditTime: 2024-05-28 09:28:35
|
||||
-->
|
||||
<template></template>
|
||||
|
||||
@ -104,6 +104,7 @@ inputB.on('click', () => {
|
||||
|
||||
const f1 = paneControl.addFolder({
|
||||
title: '分解场景[中间件 测试用]',
|
||||
expanded: false,
|
||||
})
|
||||
const btn = f1.addButton({
|
||||
title: '生成分解场景Zip',
|
||||
|
@ -4,8 +4,8 @@
|
||||
* @Autor: 地虎降天龙
|
||||
* @Date: 2024-05-13 14:17:38
|
||||
* @LastEditors: 地虎降天龙
|
||||
* @LastEditTime: 2024-05-16 15:59:29
|
||||
* @LastEditTime: 2024-05-28 11:43:05
|
||||
*/
|
||||
import { loadJson, convertImageToBase64, loadJsonFile, loadImageToBase64 } from './common/utils'
|
||||
import { loadJson, convertImageToBase64, loadJsonFile, loadImageToBase64, loadRemoteZip } from './common/utils'
|
||||
|
||||
export { loadJson, convertImageToBase64, loadJsonFile, loadImageToBase64 }
|
||||
export { loadJson, convertImageToBase64, loadJsonFile, loadImageToBase64, loadRemoteZip }
|
||||
|
Loading…
x
Reference in New Issue
Block a user