UNPKG

@vrspace/babylonjs

Version:

vrspace.org babylonjs client

133 lines (125 loc) 5.47 kB
import { VRSPACE } from '../../client/vrspace.js'; import { VRSPACEUI } from '../vrspace-ui.js'; import { VRSpaceAPI } from '../../client/rest-api.js'; /** Event Recorder is server-side component. This UI sends commands to the server that control recording and playback. UI buttons (record, stop, play) are bound to current camera. */ export class RecorderUI { /** * @param scene babylonjs scene * @param name eventRecorder name, defaults to Recorder:userId on the server */ constructor(scene, name) { // parameters this.scene = scene; this.name = name; this.recorder = null; this.contentBase = VRSPACEUI.contentBase; } /** * Shows the UI * @param {*} button option HUD button that activates this submenu */ show(button) { if (button) { VRSPACEUI.hud.showButtons(false, button); VRSPACEUI.hud.newRow(); } this.recordButton = VRSPACEUI.hud.addButton("REC", this.contentBase + "/content/icons/dot.png", () => this.record(), false); VRSPACEUI.hud.markEnabled(this.recordButton); this.stopButton = VRSPACEUI.hud.addButton("Stop", this.contentBase + "/content/icons/pause.png", () => this.stop(), false); VRSPACEUI.hud.markDisabled(this.stopButton); this.playButton = VRSPACEUI.hud.addButton("Play", this.contentBase + "/content/icons/play.png", () => this.play(), false); VRSPACEUI.hud.markDisabled(this.playButton); this.deleteButton = VRSPACEUI.hud.addButton("Delete", this.contentBase + "/content/icons/delete.png", () => this.delete(), false); VRSPACEUI.hud.markDisabled(this.deleteButton); this.saveButton = VRSPACEUI.hud.addButton("Save", this.contentBase + "/content/icons/save.png", () => this.save(), false); VRSPACEUI.hud.markDisabled(this.saveButton); this.loadButton = VRSPACEUI.hud.addButton("Load", this.contentBase + "/content/icons/file.png", () => this.load(), false); VRSPACEUI.hud.markEnabled(this.loadButton); } /** Start recording */ record() { console.log("Recording..."); if (!this.recorder) { // create recorder on the server VRSPACE.send('{"command":{"Recording":{"action":"record", "name":"' + this.name + '"}}}'); } VRSPACEUI.hud.markDisabled(this.recordButton); VRSPACEUI.hud.markEnabled(this.stopButton); VRSPACEUI.hud.markDisabled(this.playButton); VRSPACEUI.hud.markDisabled(this.deleteButton); VRSPACEUI.hud.markDisabled(this.saveButton); VRSPACEUI.hud.markDisabled(this.loadButton); } /** Stop recording */ stop() { console.log('Stopped'); VRSPACE.send('{"command":{"Recording":{"action":"stop", "name":"' + this.name + '"}}}'); VRSPACEUI.hud.markEnabled(this.recordButton); VRSPACEUI.hud.markDisabled(this.stopButton); VRSPACEUI.hud.markEnabled(this.playButton); VRSPACEUI.hud.markEnabled(this.deleteButton); VRSPACEUI.hud.markEnabled(this.saveButton); VRSPACEUI.hud.markDisabled(this.loadButton); } /** Start playing */ play() { console.log('Playing...'); VRSPACE.send('{"command":{"Recording":{"action":"play", "name":"' + this.name + '"}}}'); VRSPACEUI.hud.markDisabled(this.recordButton); VRSPACEUI.hud.markEnabled(this.stopButton); VRSPACEUI.hud.markActive(this.playButton); VRSPACEUI.hud.markDisabled(this.deleteButton); VRSPACEUI.hud.markDisabled(this.saveButton); VRSPACEUI.hud.markDisabled(this.loadButton); } /** Delete current recorder */ delete() { console.log('Deleted'); VRSPACE.send('{"command":{"Recording":{"action":"delete", "name":"' + this.name + '"}}}'); VRSPACEUI.hud.markEnabled(this.recordButton); VRSPACEUI.hud.markDisabled(this.stopButton); VRSPACEUI.hud.markDisabled(this.playButton); VRSPACEUI.hud.markDisabled(this.deleteButton); VRSPACEUI.hud.markDisabled(this.saveButton); VRSPACEUI.hud.markEnabled(this.loadButton); } /** Save and download recording JSON */ save() { VRSpaceAPI.getInstance().endpoint.recorder.save(this.name).then(recording => VRSPACEUI.saveFile(this.name + ".json", JSON.stringify(recording))); } /** Upload and load recording JSON */ load() { let input = document.createElement("input"); input.setAttribute('type', 'file'); input.setAttribute('style', 'display:none'); input.setAttribute('accept', '.json'); document.body.appendChild(input); input.addEventListener("change", () => { for (let i = 0; i < input.files.length; i++) { const file = input.files[i]; console.log("Uploading ", file); file.text().then(json => VRSpaceAPI.getInstance().endpoint.recorder.load(this.name, json)).catch(err => { console.error("Error reading " + file, err); }); }; document.body.removeChild(input); VRSPACEUI.hud.markDisabled(this.recordButton); VRSPACEUI.hud.markEnabled(this.stopButton); VRSPACEUI.hud.markActive(this.playButton); VRSPACEUI.hud.markDisabled(this.deleteButton); VRSPACEUI.hud.markDisabled(this.saveButton); VRSPACEUI.hud.markDisabled(this.loadButton); }, false); input.addEventListener("cancel", () => document.body.removeChild(input), false); input.click(); } /** Clear current hud row and display all buttons */ hide() { VRSPACEUI.hud.clearRow(); VRSPACEUI.hud.showButtons(true); } }