threepipe
Version:
A 3D viewer framework built on top of three.js in TypeScript with a focus on quality rendering, modularity and extensibility.
53 lines (52 loc) • 2.18 kB
JavaScript
import { _testFinish, BoxGeometry, Color, LoadingScreenPlugin, Mesh, PhysicalMaterial, PopmotionPlugin, ThreeViewer, Vector3, } from 'threepipe';
import { createSimpleButtons } from '../examples-utils/simple-bottom-buttons.js';
async function init() {
const viewer = new ThreeViewer({
canvas: document.getElementById('mcanvas'),
renderScale: 'auto',
plugins: [LoadingScreenPlugin],
});
const popmotion = viewer.addPluginSync(PopmotionPlugin);
await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr');
const cube = viewer.scene.addObject(new Mesh(new BoxGeometry(1, 1, 1), new PhysicalMaterial({ color: 0xff0000 })));
let isMovedUp = false;
createSimpleButtons({
['Move Up/Down']: async (btn) => {
btn.disabled = true;
await popmotion.animateTargetAsync(cube, 'position', {
to: cube.position.clone().add(new Vector3(0, isMovedUp ? -1 : 1, 0)),
duration: 500, // ms
onComplete: () => isMovedUp = !isMovedUp,
onUpdate: () => cube.setDirty(),
});
btn.disabled = false;
},
['Rotate +90deg']: async (btn) => {
btn.disabled = true;
await popmotion.animateAsync({
from: cube.rotation.y,
to: cube.rotation.y + Math.PI / 2,
duration: 500,
onUpdate: (v) => {
cube.rotation.y = v;
cube.setDirty();
},
});
btn.disabled = false;
},
['Change Color']: async (btn) => {
btn.disabled = true;
await popmotion.animateAsync({
from: '#' + cube.material.color.getHexString(),
to: '#' + new Color().setHSL(Math.random(), 1, 0.5).getHexString(),
duration: 500,
onUpdate: (v) => {
cube.material.color.set(v);
cube.material.setDirty();
},
});
btn.disabled = false;
},
});
}
init().finally(_testFinish);