threepipe
Version:
A 3D viewer framework built on top of three.js in TypeScript with a focus on quality rendering, modularity and extensibility.
79 lines (78 loc) • 3.65 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { _testFinish, LoadingScreenPlugin, onChange, SSAAPlugin, ThreeViewer, uiFolderContainer, uiSlider, Vector2, } from 'threepipe';
import { TweakpaneUiPlugin } from '@threepipe/plugin-tweakpane';
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
// @ts-expect-error todo fix ts import
import { TemporalAAPlugin } from '@threepipe/webgi-plugins';
async function init() {
const viewer = new ThreeViewer({
canvas: document.getElementById('mcanvas'),
msaa: true,
rgbm: false, // The pass from three.js doesn't support RGBM encoded render targets
zPrepass: false,
renderScale: 1,
maxHDRIntensity: 100,
dropzone: {
addOptions: {
disposeSceneObjects: true,
},
},
plugins: [LoadingScreenPlugin, SSAAPlugin, TemporalAAPlugin],
});
// Extend the pass to add UI and pipeline pass options
let UnrealBloomPass2 = class UnrealBloomPass2 extends UnrealBloomPass {
constructor() {
super(...arguments);
this.passId = 'unrealBloom';
this.after = ['render', 'progressive'];
this.before = ['screen'];
this.required = ['render'];
}
setDirty() {
viewer.setDirty();
}
};
__decorate([
uiSlider('Strength', [0, 5], 0.01),
onChange(UnrealBloomPass2.prototype.setDirty),
__metadata("design:type", Object)
], UnrealBloomPass2.prototype, "strength", void 0);
__decorate([
uiSlider('Radius', [0, 1], 0.01),
onChange(UnrealBloomPass2.prototype.setDirty),
__metadata("design:type", Object)
], UnrealBloomPass2.prototype, "radius", void 0);
__decorate([
uiSlider('Threshold', [0, 8], 0.01),
onChange(UnrealBloomPass2.prototype.setDirty),
__metadata("design:type", Object)
], UnrealBloomPass2.prototype, "threshold", void 0);
UnrealBloomPass2 = __decorate([
uiFolderContainer('Unreal Bloom')
], UnrealBloomPass2);
const bloomPass = new UnrealBloomPass2(new Vector2(window.innerWidth, window.innerHeight), 1., 0.5, 1.5);
viewer.renderManager.registerPass(bloomPass);
const ui = viewer.addPluginSync(new TweakpaneUiPlugin(true));
await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr', {
setBackground: true,
});
const result = await viewer.load('https://threejs.org/examples/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf', {
autoCenter: true,
autoScale: true,
});
const model = result?.getObjectByName('node_damagedHelmet_-6514');
const materials = (model?.materials || []);
ui.appendChild(bloomPass.uiConfig);
for (const material of materials) {
ui.appendChild(material.uiConfig);
}
}
init().then(_testFinish);