From 835cdba82d88c6547065b93c6bc3bea05e927c82 Mon Sep 17 00:00:00 2001 From: "2817212736@qq.com" <2817212736@qq.com> Date: Fri, 9 May 2025 16:31:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9D=99=E9=BB=98=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/common/MaterialEditor.ts | 5 ++--- src/helpers/helper.imageLoader.ts | 2 +- src/lib/entry.ts | 21 ++++++++++++++++++++- src/lib/index.ts | 5 +++-- src/stores/eventStore.ts | 2 +- src/stores/sceneStore.ts | 13 ++++++------- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index bd0b51f..6edcba8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "material-editor", "private": true, - "version": "1.0.4", + "version": "1.0.5", "type": "module", "scripts": { "dev": "vite", diff --git a/src/common/MaterialEditor.ts b/src/common/MaterialEditor.ts index 6018c81..49bea65 100644 --- a/src/common/MaterialEditor.ts +++ b/src/common/MaterialEditor.ts @@ -27,7 +27,7 @@ async function textureRenderUpdate(textureRecord:TextureTableRecord){ /** * 材质编辑器 */ -export class MaterialEditor extends Singleton +export class MaterialEditor { Geometrys: Map; @@ -40,9 +40,8 @@ export class MaterialEditor extends Singleton private _MeshMaterial: MeshPhysicalMaterial = new MeshPhysicalMaterial({}); //构造 - private constructor() + constructor() { - super(); this.initGeometrys(); this.LoadDefaultExr(); diff --git a/src/helpers/helper.imageLoader.ts b/src/helpers/helper.imageLoader.ts index 646db33..adf30bb 100644 --- a/src/helpers/helper.imageLoader.ts +++ b/src/helpers/helper.imageLoader.ts @@ -1,6 +1,5 @@ import { ImageLoader } from "three"; -let loader = new ImageLoader(); export async function LoadImageFromUrl(url: string): Promise { return new Promise(async (res, rej) => @@ -11,6 +10,7 @@ export async function LoadImageFromUrl(url: string): Promise return; }; + var loader = new ImageLoader(); loader.load(url, img => res(img), e => { }, err => res(undefined) diff --git a/src/lib/entry.ts b/src/lib/entry.ts index 830686d..ad836c6 100644 --- a/src/lib/entry.ts +++ b/src/lib/entry.ts @@ -2,9 +2,11 @@ import { createApp, type App as VueApp } from 'vue' import App from '../App.vue' import '../assets/main.css' -import { createPinia } from 'pinia'; +import { createPinia, disposePinia } from 'pinia'; import { ConfigureLibOutput, type LibOutputConfig } from './libOutputConfig'; import { useEvent } from '../stores/eventStore'; +import { useScene, useSceneRaw } from '../stores/sceneStore'; +import { DeflateAsync } from '../helpers/helper.compression'; let app: VueApp = undefined; @@ -40,4 +42,21 @@ export function Submit() { /** 更新材质贴图 */ export function UpdateTexture() { useEvent().Publish('update-texture'); +} + +export async function SubmitRawAsync(options: { textureSrc: string }): Promise<{ file: string }> +{ + const scene = useSceneRaw(); + + const virtualDom = document.createElement('div'); + virtualDom.style.display = 'none'; + scene.Initial(virtualDom); + await scene.ChangeTextureAsync(options.textureSrc); + var json = btoa(String.fromCharCode(...await DeflateAsync(await scene.SerializeMaterialAsync()))); + + scene.Dispose(); + virtualDom.remove(); + return { + file: json + }; } \ No newline at end of file diff --git a/src/lib/index.ts b/src/lib/index.ts index 66a4fd5..4c23d5d 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,9 +1,10 @@ -import { Mount, Unmount, Submit, UpdateTexture, Configure } from "./entry"; +import { Mount, Unmount, Submit, UpdateTexture, Configure, SubmitRawAsync } from "./entry"; export { Mount, Unmount, Submit, UpdateTexture, - Configure + Configure, + SubmitRawAsync } \ No newline at end of file diff --git a/src/stores/eventStore.ts b/src/stores/eventStore.ts index 6368628..43c0919 100644 --- a/src/stores/eventStore.ts +++ b/src/stores/eventStore.ts @@ -19,4 +19,4 @@ export const useEvent = defineStore('event', () => { return { Subscribe, Publish, Unsubscribe }; }); -export type EventNames = 'submit' | 'update-texture' \ No newline at end of file +export type EventNames = 'submit' | 'update-texture'; \ No newline at end of file diff --git a/src/stores/sceneStore.ts b/src/stores/sceneStore.ts index 13b71fc..421fc99 100644 --- a/src/stores/sceneStore.ts +++ b/src/stores/sceneStore.ts @@ -7,7 +7,7 @@ import { Texture } from "three"; import { materialRenderer } from "../common/MaterialRenderer"; import { MaterialOut } from "../common/MaterialSerializer"; -export const useScene = defineStore('scene', () => { +const sceneSetup = () => { let _editor: MaterialEditor | undefined; let _database: Database | undefined; const _currGeometry = ref('球'); @@ -35,7 +35,7 @@ export const useScene = defineStore('scene', () => { // 为Material配置一个ObjectId,否则其无法被序列化 // Material.value.objectId = new ObjectId(undefined, undefined); - _editor = MaterialEditor.GetInstance(); + _editor = new MaterialEditor(); Geometries.value = Array.from(_editor.Geometrys.keys()); _currGeometry.value = _editor.CurGeometryName; @@ -50,16 +50,12 @@ export const useScene = defineStore('scene', () => { } function Dispose() { - console.log("Disposing..."); Material.value.GoodBye(); _editor?.Dispose(); _editor = undefined; _database.Destroy(); _database = undefined; window.onresize = undefined; - - // 释放Singleton - MaterialEditor.ReleaseInstance(); } function ChangeGeometry(geoName: string) { @@ -150,7 +146,10 @@ export const useScene = defineStore('scene', () => { GenerateMaterialLogoAsync, Dispose }; -}); +}; + +export const useScene = defineStore('scene', sceneSetup); +export const useSceneRaw = defineStore('sceneRaw', sceneSetup); // 独立场景,用来静默执行材质序列化 export type TextureAdjustment = { wrapS: number,