TkAstral3D/packages/sdk/lib/core/shaderMaterial/ShaderMaterialManager.ts
2025-10-04 23:36:07 +08:00

91 lines
3.6 KiB
TypeScript

import {ShaderMaterial, Vector2} from "three";
import {useAddSignal} from "@/hooks";
import {CircleGridShaderMaterial} from "@/core/shaderMaterial/modules/CircleGridShaderMaterial";
import {DynamicCheckerboardShaderMaterial} from "@/core/shaderMaterial/modules/DynamicCheckerboardShaderMaterial";
import {FlickerShaderMaterial} from "@/core/shaderMaterial/modules/FlickerShaderMaterial";
import {SlowSmokeShaderMaterial} from "@/core/shaderMaterial/modules/SlowSmokeShaderMaterial";
import {StreamerWallShaderMaterial} from "@/core/shaderMaterial/modules/StreamerWallShaderMaterial";
import { SnowingShaderMaterial } from "@/core/shaderMaterial/modules/SnowingShaderMaterial";
import App from "@/core/app/App";
interface IShaderMaterialClass {
Name: string,
_ShaderMaterial: ShaderMaterial,
Resolution?: Vector2,
Update: () => void,
}
export class ShaderMaterialManager {
shaderMaterials: IShaderMaterialClass[] = [];
classMap: { [className: string]: string } = {};
constructor() {
useAddSignal("instantiateShaderMaterial", (shaderMaterialClass: IShaderMaterialClass) => {
this.push(shaderMaterialClass);
})
useAddSignal("sceneResize", (width: number, height: number) => {
const resolution = new Vector2(width, height);
this.shaderMaterials.forEach(sm => {
sm.Resolution = resolution;
})
})
useAddSignal("sceneLoadComplete", () => {
this.init();
})
}
get needRender() {
return this.shaderMaterials.length > 0;
}
init() {
if(!App.metadata._ShaderMaterialClassMap) return;
this.classMap = App.metadata._ShaderMaterialClassMap;
if (this.classMap) {
for (let className in this.classMap) {
const material = App.materials[this.classMap[className]] as ShaderMaterial;
switch (className) {
case "CircleGridShaderMaterial":
CircleGridShaderMaterial.Material = material;
this.shaderMaterials.push(CircleGridShaderMaterial);
break;
case "DynamicCheckerboardShaderMaterial":
DynamicCheckerboardShaderMaterial.Material = material;
this.shaderMaterials.push(DynamicCheckerboardShaderMaterial);
break;
case "FlickerShaderMaterial":
FlickerShaderMaterial.Material = material;
this.shaderMaterials.push(FlickerShaderMaterial);
break;
case "SlowSmokeShaderMaterial":
SlowSmokeShaderMaterial.Material = material;
this.shaderMaterials.push(SlowSmokeShaderMaterial);
break;
case "StreamerWallShaderMaterial":
StreamerWallShaderMaterial.Material = material;
this.shaderMaterials.push(StreamerWallShaderMaterial);
break;
case "SnowingShaderMaterial":
SnowingShaderMaterial.Material = material;
this.shaderMaterials.push(SnowingShaderMaterial);
break;
}
}
}
}
push(sm: IShaderMaterialClass) {
this.shaderMaterials.push(sm);
this.classMap[sm.Name] = sm._ShaderMaterial.uuid;
App.metadata._ShaderMaterialClassMap = this.classMap;
}
update() {
for (let i = 0; i < this.shaderMaterials.length; i++) {
this.shaderMaterials[i].Update();
}
}
}