@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
65 lines (64 loc) • 2.22 kB
JavaScript
"use strict";
import { BasePersistedConfig } from "../../../../utils/BasePersistedConfig";
import { GlParamConfig } from "../../utils/GLParamConfig";
import { handleCopBuilderDependencies } from "../../../../cop/utils/BuilderUtils";
const FRAGMENT_KEY = "fragment";
export class TexturePersistedConfig extends BasePersistedConfig {
constructor(node) {
super(node);
this.node = node;
}
async toData() {
const assemblerController = this.node.assemblerController();
if (!assemblerController) {
return;
}
const param_uniform_pairs = [];
const param_configs = assemblerController.assembler.param_configs();
for (const param_config of param_configs) {
param_uniform_pairs.push([param_config.name(), param_config.uniformName()]);
}
const data = {
// fragment_shader: this.node.textureMaterial.fragmentShader,
uniforms: this.node.textureMaterial.uniforms,
param_uniform_pairs,
uniforms_time_dependent: assemblerController.assembler.uniformsTimeDependent(),
uniforms_resolution_dependent: assemblerController.assembler.uniformsResolutionDependent(),
shaders: {
[FRAGMENT_KEY]: this.node.textureMaterial.fragmentShader
}
};
return data;
}
load(data) {
const assemblerController = this.node.assemblerController();
if (assemblerController) {
return;
}
this.node.textureMaterial.uniforms = data.uniforms;
const shaders = data.shaders;
if (shaders && shaders[FRAGMENT_KEY] != null) {
this.node.textureMaterial.fragmentShader = shaders[FRAGMENT_KEY];
} else {
console.warn(`${this.node.path()}: persisted config has no fragment shader`);
}
handleCopBuilderDependencies({
node: this.node,
timeDependent: data.uniforms_time_dependent || false,
uniforms: data.uniforms
});
for (const pair of data.param_uniform_pairs) {
const param = this.node.params.get(pair[0]);
const uniform = data.uniforms[pair[1]];
if (param && uniform) {
const callback = () => {
GlParamConfig.callback(param, uniform);
};
param.options.set({
callback
});
callback();
}
}
}
}