UNPKG

polygonjs-engine

Version:

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

63 lines (56 loc) 2.07 kB
import {Constructor} from '../../../../types/GlobalTypes'; import {BaseController} from './_BaseController'; import {TypedMatNode} from '../_Base'; import {Material} from 'three/src/materials/Material'; import {Color} from 'three/src/math/Color'; import {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig'; export function ColorParamConfig<TBase extends Constructor>(Base: TBase) { return class Mixin extends Base { /** @param material color */ color = ParamConfig.COLOR([1, 1, 1]); /** @param defines if the color attribute on the geometry is used */ useVertexColors = ParamConfig.BOOLEAN(0); /** @param sets the material to transparent */ transparent = ParamConfig.BOOLEAN(0); /** @param sets the material opacity */ opacity = ParamConfig.FLOAT(1); /** @param sets the min alpha below which the material is invisible */ alphaTest = ParamConfig.FLOAT(0); /** @param toggle on if you have a fog in the scene and the material should be affected by it */ useFog = ParamConfig.BOOLEAN(0); }; } class ColoredMaterial extends Material { public color!: Color; vertexColors!: boolean; transparent!: boolean; depthTest!: boolean; alphaTest!: number; fog!: boolean; } class ColorParamsConfig extends ColorParamConfig(NodeParamsConfig) {} class ColoredMatNode extends TypedMatNode<ColoredMaterial, ColorParamsConfig> { create_material() { return new ColoredMaterial(); } } export class ColorsController extends BaseController { constructor(protected node: ColoredMatNode) { super(node); } static update(node: ColoredMatNode) { const material = node.material; const pv = node.pv; material.color.copy(pv.color); const newVertexColor = pv.useVertexColors; // ? VertexColors : NoColors; if (newVertexColor != material.vertexColors) { material.vertexColors = newVertexColor; material.needsUpdate = true; } material.opacity = pv.opacity; material.transparent = pv.transparent || pv.opacity < 1; material.depthTest = true; material.alphaTest = pv.alphaTest; material.fog = pv.useFog; } }