@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
163 lines (162 loc) • 5.46 kB
JavaScript
;
import { TypedPostNode, PostParamOptions } from "./_Base";
import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig";
import {
BlendFunction,
DepthEffect,
DepthOfFieldEffect,
EffectPass,
TextureEffect,
VignetteEffect,
VignetteTechnique
} from "postprocessing";
import { isBooleanTrue } from "../../../core/Type";
const VIGNETTE_TECHNIQUES = [VignetteTechnique.DEFAULT, VignetteTechnique.ESKIL];
const VIGNETTE_TECHNIQUE_NAME_BY_TECHNIQUE = {
[VignetteTechnique.DEFAULT]: "DEFAULT",
[VignetteTechnique.ESKIL]: "ESKIL"
};
var RenderMode = /* @__PURE__ */ ((RenderMode2) => {
RenderMode2["DEFAULT"] = "DEFAULT";
RenderMode2["DEPTH"] = "DEPTH";
RenderMode2["COC"] = "CIRCLE_OF_CONFUSION";
return RenderMode2;
})(RenderMode || {});
const RENDER_MODES = ["DEFAULT" /* DEFAULT */, "DEPTH" /* DEPTH */, "CIRCLE_OF_CONFUSION" /* COC */];
class DepthOfFieldPostParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
this.depthOfField = ParamConfig.FOLDER();
/** @param focalDepth */
this.focusDistance = ParamConfig.FLOAT(10, {
range: [0, 1],
rangeLocked: [true, false],
...PostParamOptions
});
/** @param focalDepth */
this.focusRange = ParamConfig.FLOAT(1, {
range: [0, 1],
rangeLocked: [true, true],
...PostParamOptions
});
/** @param bokeh scale */
this.bokehScale = ParamConfig.FLOAT(2, {
range: [0, 5],
rangeLocked: [true, false],
...PostParamOptions
});
this.vignette = ParamConfig.FOLDER();
/** @param vignetting */
this.vignetting = ParamConfig.BOOLEAN(0, {
...PostParamOptions
});
/** @param vignette technique */
this.vignettingTechnique = ParamConfig.INTEGER(0, {
...PostParamOptions,
menu: {
entries: VIGNETTE_TECHNIQUES.map((value) => {
return {
name: VIGNETTE_TECHNIQUE_NAME_BY_TECHNIQUE[value],
value
};
})
}
});
/** @param vignette darkness */
this.vignetteDarkness = ParamConfig.FLOAT(0.5, {
range: [0, 1],
rangeLocked: [true, false],
step: 1e-3,
...PostParamOptions
});
/** @param vignette offset */
this.vignetteOffset = ParamConfig.FLOAT(0.35, {
range: [0, 1],
rangeLocked: [true, false],
step: 1e-3,
...PostParamOptions
});
this.debug = ParamConfig.FOLDER();
/** @param render mode */
this.renderMode = ParamConfig.INTEGER(0, {
...PostParamOptions,
menu: {
entries: RENDER_MODES.map((name, value) => ({ name, value }))
}
});
}
}
const ParamsConfig = new DepthOfFieldPostParamsConfig();
export class DepthOfFieldPostNode extends TypedPostNode {
constructor() {
super(...arguments);
this.paramsConfig = ParamsConfig;
}
static type() {
return "depthOfField";
}
createPass(context) {
const depthOfFieldEffect = new DepthOfFieldEffect(context.camera, {
blendFunction: BlendFunction.NORMAL,
focusDistance: 0,
// focalLength: 0.048,
focusRange: 1,
bokehScale: 2,
height: 480,
worldFocusDistance: 1,
worldFocusRange: 1
});
const depthEffect = new DepthEffect({
blendFunction: BlendFunction.SKIP
});
const vignetteEffect = new VignetteEffect({
eskil: false,
offset: 0.35,
darkness: 0.5
});
const cocTextureEffect = new TextureEffect({
blendFunction: BlendFunction.SKIP,
texture: depthOfFieldEffect.cocTexture
});
const DOFPass = new EffectPass(
context.camera,
depthOfFieldEffect,
vignetteEffect,
cocTextureEffect,
depthEffect
);
this.updatePass(DOFPass);
return DOFPass;
}
updatePass(pass) {
const effects = pass.effects;
const vignetteEffect = effects.find((effect) => effect instanceof VignetteEffect);
if (vignetteEffect) {
this._updateDOFPass(pass);
} else {
this._updateSmaaPass(pass);
}
}
_updateSmaaPass(pass) {
const renderMode = RENDER_MODES[this.pv.renderMode];
pass.enabled = renderMode === "DEFAULT" /* DEFAULT */;
}
_updateDOFPass(pass) {
const effects = pass.effects;
const vignetteEffect = effects.find((effect) => effect instanceof VignetteEffect);
const DOF = effects.find((effect) => effect instanceof DepthOfFieldEffect);
const depthEffect = effects.find((effect) => effect instanceof DepthEffect);
const cocTextureEffect = effects.find((effect) => effect instanceof TextureEffect);
const vignetteEnabled = isBooleanTrue(this.pv.vignetting);
const renderMode = RENDER_MODES[this.pv.renderMode];
depthEffect.blendMode.blendFunction = renderMode === "DEPTH" /* DEPTH */ ? BlendFunction.NORMAL : BlendFunction.SKIP;
cocTextureEffect.blendMode.blendFunction = renderMode === "CIRCLE_OF_CONFUSION" /* COC */ ? BlendFunction.NORMAL : BlendFunction.SKIP;
vignetteEffect.blendMode.blendFunction = renderMode === "DEFAULT" /* DEFAULT */ && vignetteEnabled ? BlendFunction.NORMAL : BlendFunction.SKIP;
DOF.circleOfConfusionMaterial.focusDistance = this.pv.focusDistance;
DOF.circleOfConfusionMaterial.focusRange = this.pv.focusRange;
DOF.bokehScale = this.pv.bokehScale;
vignetteEffect.blendMode.opacity.value = vignetteEnabled ? 1 : 0;
vignetteEffect.darkness = this.pv.vignetteDarkness;
vignetteEffect.offset = this.pv.vignetteOffset;
}
}