@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
42 lines (36 loc) • 1.25 kB
text/typescript
/**
* Adds a clipping plane to the input material
*
*
*/
import {Plane, Material, ShaderMaterial} from 'three';
import {UpdateMatNode} from './_Base';
import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig';
import {ShaderMaterialWithCustomMaterials} from '../../../core/geometry/Material';
class ClippingPlaneMatParamsConfig extends NodeParamsConfig {
/** @param plane normal */
normal = ParamConfig.VECTOR3([0, 1, 0]);
/** @param plane constant */
constant = ParamConfig.FLOAT(0, {
range: [-1, 1],
rangeLocked: [false, false],
});
}
const ParamsConfig = new ClippingPlaneMatParamsConfig();
export class ClippingPlaneMatNode extends UpdateMatNode<ShaderMaterial, ClippingPlaneMatParamsConfig> {
override paramsConfig = ParamsConfig;
static override type() {
return 'clippingPlane';
}
private _plane = new Plane();
override async cook(inputMaterials: Material[]) {
const inputMaterial = inputMaterials[0] as ShaderMaterialWithCustomMaterials;
this._plane.normal.copy(this.pv.normal);
this._plane.constant = this.pv.constant;
if (!inputMaterial.clippingPlanes) {
inputMaterial.clippingPlanes = [];
}
inputMaterial.clippingPlanes.push(this._plane);
this.setMaterial(inputMaterial);
}
}