@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
56 lines (55 loc) • 1.65 kB
JavaScript
;
import { ParamConfig } from "../../../utils/params/ParamsConfig";
import { isBooleanTrue } from "../../../../../core/BooleanValue";
import { NodeContext } from "../../../../poly/NodeContext";
const CallbackOptions = {
computeOnDirty: false,
callback: (node) => {
SceneMaterialOverrideController.update(node);
}
};
export function SceneMaterialOverrideParamConfig(Base) {
return class Mixin extends Base {
constructor() {
super(...arguments);
/** @param toggle on to override all materials */
this.useOverrideMaterial = ParamConfig.BOOLEAN(0, {
...CallbackOptions,
separatorBefore: true
});
/** @param material */
this.overrideMaterial = ParamConfig.NODE_PATH("", {
visibleIf: { useOverrideMaterial: 1 },
nodeSelection: {
context: NodeContext.MAT
},
dependentOnFoundNode: false,
...CallbackOptions
});
}
};
}
export class SceneMaterialOverrideController {
constructor(node) {
this.node = node;
}
async update() {
const scene = this.node.object;
const pv = this.node.pv;
if (isBooleanTrue(pv.useOverrideMaterial)) {
const node = pv.overrideMaterial.nodeWithContext(NodeContext.MAT);
if (node) {
const container = await node.compute();
scene.overrideMaterial = container.material();
} else {
scene.overrideMaterial = null;
this.node.states.error.set("overrideMaterial node not found");
}
} else {
scene.overrideMaterial = null;
}
}
static async update(node) {
node.sceneMaterialOverrideController.update();
}
}