UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

74 lines (73 loc) 2.66 kB
"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); } }