Yosun's picture
Deploy TripoSplat WebGPU demo
31c7d49 verified
Raw
History Blame Contribute Delete
1.75 kB
// Map this vendor path to the packed workspace package in the host application.
import { CancelledError, TripoSplatWebGPU } from '/vendor/@ai3d/triposplat-webgpu/index.js'
const input = document.querySelector('#image')
const generateButton = document.querySelector('#generate')
const cancelButton = document.querySelector('#cancel')
const status = document.querySelector('#status')
const model = new TripoSplatWebGPU({
modelBaseUrl: 'https://models.example.com/triposplat-webgpu/v1/',
})
let activeController
let activeScene
const compatibility = await TripoSplatWebGPU.checkCompatibility()
if (!compatibility.supported) {
status.textContent = compatibility.blockers.join('\n') || 'WebGPU is unsupported.'
generateButton.disabled = true
} else {
await model.load({ onProgress: (event) => { status.textContent = event.message } })
status.textContent = 'Model loaded'
}
cancelButton.addEventListener('click', () => activeController?.abort())
generateButton.addEventListener('click', async () => {
const file = input.files?.[0]
if (!file) return
activeController?.abort()
activeScene?.dispose()
activeController = new AbortController()
try {
activeScene = await model.generate(file, {
steps: 20,
guidanceScale: 3,
gaussianCount: 262144,
seed: 42,
signal: activeController.signal,
onProgress: (event) => { status.textContent = event.message },
})
status.textContent = `Generated ${activeScene.count.toLocaleString()} Gaussians locally.`
} catch (error) {
status.textContent = error instanceof CancelledError ? 'Cancelled' : String(error)
}
})
window.addEventListener('pagehide', () => {
activeController?.abort()
activeScene?.dispose()
void model.dispose()
})