UNPKG

@polygonjs/polygonjs

Version:

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

59 lines (58 loc) 2.09 kB
"use strict"; import { TypedMatNode } from "../_Base"; import { BaseTextureMapController, BooleanParamOptions, NodePathOptions } from "./_BaseTextureController"; import { NodeParamsConfig, ParamConfig } from "../../utils/params/ParamsConfig"; export function SpecularMapParamConfig(Base) { return class Mixin extends Base { constructor() { super(...arguments); /** @param toggle if you want to use a specular map */ this.useSpecularMap = ParamConfig.BOOLEAN(0, BooleanParamOptions(TextureSpecularMapController)); /** @param specify the specular map COP node */ this.specularMap = ParamConfig.NODE_PATH("", NodePathOptions(TextureSpecularMapController, "useSpecularMap")); } }; } function isTextureSpecularMapMaterial(material) { if (!material) { return false; } return material.isMeshPhongMaterial != null; } class TextureSpecularMapParamsConfig extends SpecularMapParamConfig(NodeParamsConfig) { } class TextureSpecularMapMatNode extends TypedMatNode { // abstract override createMaterial(): TextureSpecularMapControllerCurrentMaterial; } export class TextureSpecularMapController extends BaseTextureMapController { constructor(node) { super(node); this.node = node; } initializeNode() { this.add_hooks(this.node.p.useSpecularMap, this.node.p.specularMap); } static async update(node) { node.controllers.specularMap.update(); } async update() { const material = await this.node.material(); if (!isTextureSpecularMapMaterial(material)) { return; } this.node.controllers.specularMap.updateMaterial(material); } async updateMaterial(material) { await this._update(material, "specularMap", this.node.p.useSpecularMap, this.node.p.specularMap); } getTextures(material, record) { record.set("specularMap", material.specularMap); } setParamsFromMaterial(material, record) { const mapNode = record.get("specularMap"); this.node.p.useSpecularMap.set(mapNode != null); if (mapNode) { this.node.p.specularMap.setNode(mapNode, { relative: true }); } } }