@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
74 lines (73 loc) • 2.66 kB
JavaScript
"use strict";
import { TypedMatNode } from "../_Base";
import { BaseTextureMapController, BooleanParamOptions, NodePathOptions } from "./_BaseTextureController";
import { NodeParamsConfig, ParamConfig } from "../../utils/params/ParamsConfig";
import { ColorConversion } from "../../../../core/Color";
export function EmissiveMapParamConfig(Base) {
return class Mixin extends Base {
constructor() {
super(...arguments);
/** @param emissive color */
this.emissive = ParamConfig.COLOR([0, 0, 0], { separatorBefore: true });
/** @param toggle if you want to use a emissive map */
this.useEmissiveMap = ParamConfig.BOOLEAN(0, BooleanParamOptions(TextureEmissiveMapController));
/** @param specify the emissive map COP node */
this.emissiveMap = ParamConfig.NODE_PATH("", NodePathOptions(TextureEmissiveMapController, "useEmissiveMap"));
/** @param emissive intensity */
this.emissiveIntensity = ParamConfig.FLOAT(1);
}
};
}
function _isValidMaterial(material) {
if (!material) {
return false;
}
return material.emissive != null;
}
class TextureEmissiveMapParamsConfig extends EmissiveMapParamConfig(NodeParamsConfig) {
}
class TextureEmissiveMapMatNode extends TypedMatNode {
async material() {
const container = await this.compute();
return container.material();
}
}
const tmpN3 = [0, 0, 0];
export class TextureEmissiveMapController extends BaseTextureMapController {
constructor(node) {
super(node);
this.node = node;
}
initializeNode() {
this.add_hooks(this.node.p.useEmissiveMap, this.node.p.emissiveMap);
}
static async update(node) {
node.controllers.emissiveMap.update();
}
async update() {
const material = await this.node.material();
if (!_isValidMaterial(material)) {
return;
}
await this.updateMaterial(material);
}
async updateMaterial(material) {
await this._update(material, "emissiveMap", this.node.p.useEmissiveMap, this.node.p.emissiveMap);
material.emissive.copy(this.node.pv.emissive);
material.emissiveIntensity = this.node.pv.emissiveIntensity;
}
getTextures(material, record) {
record.set("emissiveMap", material.emissiveMap);
}
setParamsFromMaterial(material, record) {
const mapNode = record.get("emissiveMap");
this.node.p.useEmissiveMap.set(mapNode != null);
if (mapNode) {
this.node.p.emissiveMap.setNode(mapNode, { relative: true });
}
material.emissive.toArray(tmpN3);
this.node.p.emissive.set(tmpN3);
this.node.p.emissive.setConversion(ColorConversion.NONE);
this.node.p.emissiveIntensity.set(material.emissiveIntensity);
}
}