Merge branch 'master' into goViewPlugin

This commit is contained in:
hawk86104 2024-05-28 12:11:38 +08:00
commit f0018f8132
13 changed files with 462 additions and 18 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

View File

@ -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>

View File

@ -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>

View 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

View 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>

View File

@ -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" },
],
}

View 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>

View File

@ -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))

View File

@ -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)
})
}
}
})
})

View File

@ -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',

View File

@ -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 }