UNPKG

@polygonjs/polygonjs

Version:

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

72 lines (67 loc) 2.25 kB
import {Constructor} from '../../../../types/GlobalTypes'; import {BaseController, MaterialTexturesRecord, SetParamsTextureNodesRecord} from './_BaseController'; import {TypedMatNode} from '../_Base'; import type { PointsMaterial, ShaderMaterial, MeshStandardMaterial, MeshPhysicalMaterial, MeshPhongMaterial, MeshLambertMaterial, MeshBasicMaterial, MeshToonMaterial, Material, } from 'three'; import {NodeParamsConfig, ParamConfig} from '../../utils/params/ParamsConfig'; import {isBooleanTrue} from '../../../../core/BooleanValue'; export interface UniformFogControllers { uniformFog: UniformFogController; } export function FogParamConfig<TBase extends Constructor>(Base: TBase) { return class Mixin extends Base { /** @param toggle on if you have a fog in the scene and the material should be affected by it */ useFog = ParamConfig.BOOLEAN(0); }; } class FogUniformsParamsConfig extends FogParamConfig(NodeParamsConfig) {} type FoggableUniformsMaterial = | ShaderMaterial | PointsMaterial | MeshStandardMaterial | MeshPhysicalMaterial | MeshPhongMaterial | MeshLambertMaterial | MeshBasicMaterial | MeshToonMaterial; function isValidFogMaterial(material?: Material): material is FoggableUniformsMaterial { if (!material) { return false; } return (material as PointsMaterial).fog != null; } abstract class FogUniformsMatNode extends TypedMatNode<FoggableUniformsMaterial, FogUniformsParamsConfig> { // createMaterial() { // return new Material(); // } controllers!: UniformFogControllers; } export class UniformFogController extends BaseController { constructor(protected override node: FogUniformsMatNode) { super(node); } static async update(node: FogUniformsMatNode) { const material = await node.material(); if (!isValidFogMaterial(material)) { return; } node.controllers.uniformFog.updateMaterial(material); } override updateMaterial(material: FoggableUniformsMaterial) { const pv = this.node.pv; material.fog = isBooleanTrue(pv.useFog); } override getTextures(material: FoggableUniformsMaterial, record: MaterialTexturesRecord) {} override setParamsFromMaterial(material: FoggableUniformsMaterial, record: SetParamsTextureNodesRecord) { this.node.p.useFog.set(material.fog); } }