91 lines
3.6 KiB
TypeScript
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();
|
|
}
|
|
}
|
|
} |