@vci/quick-three
Version:
quick three
58 lines (57 loc) • 2.57 kB
JavaScript
import { mergeDeep, uuid } from "@vci/helper";
import { BlendFunction, SelectiveBloomEffect } from "postprocessing";
import { createTweenModifier } from "./../../helper/TweenHelper";
// 特效|虚幻
function createBloomEffect(option) {
const { qt, name, gui, paramsEffect } = mergeDeep(
{
name: "BloomEffect",
qt: null,
gui: null,
paramsEffect: {
opacity: 1,
blendFunction: BlendFunction.ADD,
mipmapBlur: true,
luminanceThreshold: 0,
luminanceSmoothing: 0.2,
intensity: 1,
radius: .85
}
},
option
);
const effect = new SelectiveBloomEffect(qt.scene, qt.camera, paramsEffect);
effect.blendMode.opacity.value = paramsEffect.opacity;
effect.inverted = true;
effect._intensity = paramsEffect.intensity;
qt.effect[effect.uuid = uuid()] = effect;
if (qt.debug) {
const menu = gui.addFolder(name);
menu.close();
const blendMode = effect.blendMode;
menu.add(blendMode.opacity, "value", 0.0, 1.0, 0.01).name("opacity").listen();
menu.add(blendMode, "blendFunction", BlendFunction).name("blend mode").listen();
menu.add(effect, "intensity", 0.0, 10.0, 0.01).onChange(value => effect.intensity = Number(value)).listen();
menu.add(effect.mipmapBlurPass, "radius", 0.0, 1.0, 0.001).onChange(value => effect.mipmapBlurPass.radius = Number(value)).listen();
const folderLuminance = menu.addFolder("Luminance");
folderLuminance.add(effect.luminancePass, "enabled").onChange(value => effect.luminancePass.enabled = value).listen();
folderLuminance.add(effect.luminanceMaterial, "threshold", 0.0, 1.0, 0.001).name("threshold").onChange(value => effect.luminanceMaterial.threshold = Number(value)).listen();
folderLuminance.add(effect.luminanceMaterial, "smoothing", 0.0, 1.0, 0.001).name("smoothing").onChange(value => effect.luminanceMaterial.smoothing = Number(value)).listen();
const folderSelection = menu.addFolder("Selection");
folderSelection.add(effect, "inverted").onChange(value => effect.inverted = value).listen();
folderSelection.add(effect, "ignoreBackground").onChange(value => effect.ignoreBackground = value).listen();
}
// 调整强度
effect.modifyIntensity = createTweenModifier(
qt.tw,
{
effect,
keyModifyProperty: "intensity",
twKey: `effectBloom.modifyIntensity@${effect.uuid}`
}
);
// 重置强度
effect.resetIntensity = async twOption => await effect.modifyIntensity(effect._intensity, twOption);
return effect;
}
export { createBloomEffect };