import './three.min.js'; import './STLLoader.js'; import './OrbitControls.js'; class STLViewer extends HTMLElement { constructor() { super(); } connectedCallback() { this.connected = true; const shadowRoot = this.attachShadow({ mode: 'open' }); const container = document.createElement('div'); container.style.width = '100%'; container.style.height = '100%'; shadowRoot.appendChild(container); if (!this.hasAttribute('model')) { throw new Error('model attribute is required'); } const model = this.getAttribute('model'); let camera = new THREE.PerspectiveCamera(70, container.clientWidth / container.clientHeight, 1, 1000); let renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); renderer.setSize(container.clientWidth, container.clientHeight); container.appendChild(renderer.domElement); window.addEventListener('resize', function () { renderer.setSize(container.clientWidth, container.clientHeight); camera.aspect = container.clientWidth / container.clientHeight; camera.updateProjectionMatrix(); }, false); let controls = new THREE.OrbitControls(camera, renderer.domElement); controls.enableZoom = true; let scene = new THREE.Scene(); scene.add(new THREE.HemisphereLight(0xffffff, 1.5)); new THREE.STLLoader().load(model, (geometry) => { let material = new THREE.MeshPhongMaterial({ color: 0x6A39FF, specular: 100, shininess: 100, }); let mesh = new THREE.Mesh(geometry, material); scene.add(mesh); let middle = new THREE.Vector3(); geometry.computeBoundingBox(); geometry.boundingBox.getCenter(middle); mesh.geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(-middle.x, -middle.y, -middle.z)); let largestDimension = Math.max(geometry.boundingBox.max.x, geometry.boundingBox.max.y, geometry.boundingBox.max.z) camera.position.z = largestDimension * 1.5; controls.autoRotate = true; controls.autoRotateSpeed = 1; let animate = () => { controls.update(); renderer.render(scene, camera); if (this.connected) { requestAnimationFrame(animate); } }; animate(); }); } disconnectedCallback() { this.connected = false; } } customElements.define('stl-viewer', STLViewer);