UNPKG

@polygonjs/polygonjs

Version:

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

45 lines (44 loc) 1.55 kB
"use strict"; import { ShaderMaterial } from "three"; import { FrontSide } from "three"; import { PrimitiveMatNode } from "./_Base"; import VERTEX from "../gl/gl/volume/vert.glsl"; import FRAGMENT from "../gl/gl/volume/frag.glsl"; import { VOLUME_UNIFORMS } from "../gl/gl/volume/uniforms"; import { UniformsUtils } from "three"; import { NodeParamsConfig } from "../utils/params/ParamsConfig"; import { addUserDataRenderHook } from "../../../core/geometry/Material"; import { VolumeController, VolumeParamConfig } from "./utils/VolumeController"; import { MatType } from "../../poly/registers/nodes/types/Mat"; class VolumeMatParamsConfig extends VolumeParamConfig(NodeParamsConfig) { } const ParamsConfig = new VolumeMatParamsConfig(); export class VolumeMatNode extends PrimitiveMatNode { constructor() { super(...arguments); this.paramsConfig = ParamsConfig; this._volumeController = new VolumeController(this); } static type() { return MatType.VOLUME; } createMaterial() { const mat = new ShaderMaterial({ vertexShader: VERTEX, fragmentShader: FRAGMENT, side: FrontSide, transparent: true, depthTest: true, uniforms: UniformsUtils.clone(VOLUME_UNIFORMS) }); addUserDataRenderHook(mat, VolumeController.renderHook.bind(VolumeController)); return mat; } initializeNode() { } async cook() { this._material = this._material || this.createMaterial(); this._volumeController.updateUniformsFromParams(this._material); this.setMaterial(this._material); } }