UNPKG

vox-viewer

Version:

like model-viewer but for .vox models

144 lines (120 loc) 3.37 kB
import "../../vox-viewer"; import { LitElement, html } from "lit-element"; class DemoPage extends LitElement { static get is() { return "demo-page"; } static get properties() { return { selectedModel: { type: String }, selectedMode: { type: String }, }; } constructor() { super(); this.selectedMode = "examples"; this.selectedModel = "./models/deer.vox"; } onModelSelected() { const modelSelection = this.shadowRoot.querySelector("#model-selection"); this.selectedModel = modelSelection.value; } onModeSelected() { const modeSelection = this.shadowRoot.querySelector("#mode-selection"); this.selectedMode = modeSelection.value; if (this.selectedMode === "examples") { this.selectedModel = "./models/deer.vox"; } } onCustomModelUpload(e) { let files = e.target.files; let f = files[0]; let reader = new FileReader(); reader.onload = ((file) => { return (e) => { const string = e.target.result; const blob = new Blob([string]); const url = URL.createObjectURL(blob); this.selectedModel = url; }; })(f); reader.readAsArrayBuffer(f); } render() { return html` <style> :host { display: block; margin: 0px; padding: 10px; height: calc(100vh - 20px); width: calc(100vw - 20px); } .controls { height: 10%; width: 100%; display: flex; gap: 15px; } .container { height: 90%; width: 100%; display: flex; align-items: center; justify-content: center; } .vox-viewer { height: 100%; width: 100%; } </style> <div class="controls"> <div> Mode: <br /> <select id="mode-selection" value="${this.selectedMode}" @change="${this.onModeSelected}" > <option value="examples">Examples</option> <option value="custom">Own Model</option> </select> </div> <div> ${this.selectedMode === "custom" ? html`<div> Own Model: <br /> <input id="custom-model-selection" type="file" @change="${this.onCustomModelUpload}" /> </div>` : html`<div> Model: <br /> <select id="model-selection" value="${this.selectedModel}" @change="${this.onModelSelected}" > <option value="./models/deer.vox">Deer</option> <option value="./models/monu7.vox">Monument 7</option> <option value="./models/monu8.vox">Monument 8</option> <option value="./models/sphere.vox">Sphere</option> </select> </div>`} </div> </div> <div class="container"> <vox-viewer class="vox-viewer" src=${this.selectedModel} camera-controls auto-rotate shadow-intensity="0.3" ></vox-viewer> </div> `; } } customElements.define(DemoPage.is, DemoPage);