@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
45 lines (44 loc) • 1.55 kB
JavaScript
;
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);
}
}