Doodle3D-Slicer/src/interface/utils.js

85 lines
2.7 KiB
JavaScript
Raw Normal View History

2017-11-11 20:23:45 +01:00
import * as THREE from 'three';
import 'three/examples/js/controls/EditorControls';
import 'three/examples/js/controls/TransformControls';
export function placeOnGround(mesh) {
2017-11-12 01:51:41 +01:00
const boundingBox = new THREE.Box3().setFromObject(mesh);
2017-11-11 20:23:45 +01:00
mesh.position.y -= boundingBox.min.y;
mesh.updateMatrix();
}
export function createScene(canvas, props, state) {
let geometry;
if (props.geometry.isGeometry) {
geometry = props.geometry;
} else if (props.geometry.isBufferGeometry) {
geometry = new THREE.Geometry().fromBufferGeometry(props.geometry);
}
2017-11-12 00:46:12 +01:00
// center geometry
2017-11-11 20:23:45 +01:00
geometry.computeBoundingBox();
const centerX = (geometry.boundingBox.max.x + geometry.boundingBox.min.x) / 2;
const centerY = (geometry.boundingBox.max.y + geometry.boundingBox.min.y) / 2;
const centerZ = (geometry.boundingBox.max.z + geometry.boundingBox.min.z) / 2;
geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-centerX, -centerY, -centerZ));
2017-11-12 01:41:05 +01:00
const { width, height, printers } = props;
const { controlMode, printer } = state;
2017-11-11 20:23:45 +01:00
const renderer = new THREE.WebGLRenderer({ canvas, alpha: true });
renderer.setClearColor(0xffffff, 0);
renderer.setSize(width, height);
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(50, width / height, 1, 10000);
camera.position.set(0, 400, 300);
const directionalLight = new THREE.DirectionalLight(0xd5d5d5);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);
const light = new THREE.AmbientLight(0x808080);
scene.add(light);
const mesh = new THREE.Mesh(geometry, new THREE.MeshStandardMaterial({ color: 0x2194ce }));
placeOnGround(mesh);
scene.add(mesh);
const editorControls = new THREE.EditorControls(camera, canvas);
2017-11-12 01:51:33 +01:00
editorControls.focus(mesh);
2017-11-11 20:23:45 +01:00
const control = new THREE.TransformControls(camera, canvas);
2017-11-12 01:41:05 +01:00
control.setMode(controlMode);
2017-11-11 20:23:45 +01:00
control.setRotationSnap(THREE.Math.degToRad(45));
control.addEventListener('mouseDown', () => editorControls.enabled = false);
control.addEventListener('mouseUp', () => {
editorControls.enabled = true;
placeOnGround(mesh);
});
control.attach(mesh);
scene.add(control);
const render = () => {
control.update();
renderer.render(scene, camera);
};
control.addEventListener('change', render);
editorControls.addEventListener('change', render);
const box = new THREE.BoxHelper();
box.update(new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1).applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.5, 0))));
box.material.color.setHex(0x72bcd4);
scene.add(box);
2017-11-12 01:41:05 +01:00
const { dimensions } = printers[printer];
2017-11-12 00:46:39 +01:00
box.scale.set(dimensions.y, dimensions.z, dimensions.x);
2017-11-11 20:23:45 +01:00
render();
return { control, editorControls, scene, mesh, camera, renderer, render };
}