UNPKG

@polygonjs/polygonjs

Version:

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

60 lines (59 loc) 2.02 kB
"use strict"; import { PrimitiveMatNode } from "./_Base"; import { Sky } from "three/examples/jsm/objects/Sky"; import { MatType } from "../../poly/registers/nodes/types/Mat"; import { ParamConfig, NodeParamsConfig } from "../utils/params/ParamsConfig"; class SkyMatParamsConfig extends NodeParamsConfig { constructor() { super(...arguments); /** @param turbidity */ this.turbidity = ParamConfig.FLOAT(2, { range: [0, 20] }); /** @param rayleigh */ this.rayleigh = ParamConfig.FLOAT(1, { range: [0, 4] }); /** @param mieCoefficient */ this.mieCoefficient = ParamConfig.FLOAT(5e-3); /** @param mieDirectional */ this.mieDirectional = ParamConfig.FLOAT(0.8); /** @param inclination */ this.inclination = ParamConfig.FLOAT(0.5); /** @param azimuth */ this.azimuth = ParamConfig.FLOAT(0.25); /** @param up */ this.up = ParamConfig.VECTOR3([0, 1, 0]); } } const ParamsConfig = new SkyMatParamsConfig(); export class SkyMatNode extends PrimitiveMatNode { constructor() { super(...arguments); this.paramsConfig = ParamsConfig; } static type() { return MatType.SKY; } createMaterial() { const object = new Sky(); const mat = object.material; mat.depthWrite = true; return mat; } async cook() { this._material = this._material || this.createMaterial(); const uniforms = this._material.uniforms; uniforms.turbidity.value = this.pv.turbidity; uniforms.rayleigh.value = this.pv.rayleigh; uniforms.mieCoefficient.value = this.pv.mieCoefficient; uniforms.mieDirectionalG.value = this.pv.mieDirectional; uniforms.up.value.copy(this.pv.up); const theta = Math.PI * (this.pv.inclination - 0.5); const phi = 2 * Math.PI * (this.pv.azimuth - 0.5); uniforms.sunPosition.value.x = Math.cos(phi); uniforms.sunPosition.value.y = Math.sin(phi) * Math.sin(theta); uniforms.sunPosition.value.z = Math.sin(phi) * Math.cos(theta); this.setMaterial(this._material); } }