UNPKG

@vrspace/babylonjs

Version:

vrspace.org babylonjs client

84 lines (78 loc) 2.86 kB
import {VRSPACEUI} from '../ui/vrspace-ui.js'; import { ScriptLoader } from '../client/script-loader.js'; /** * 3D Text writer, based on https://doc.babylonjs.com/extensions/meshWriter * Binds to a node, e.g. above avatar head. * Performance penalty in write(). Once rendered, performance is fine. */ export class TextWriter { constructor(scene) { this.scene = scene; this._initWriter(); /** Writer properties - scale, default font... */ this.writerProperties = {scale:.02,defaultFont:"Arial"}; /** Text properties, size, color etc */ this.textProperties = { anchor: "center", "letter-height": 8, color: "#1C3870" } /** Position relative to parent node, default z -1 */ this.relativePosition = new BABYLON.Vector3(0,0,-1); /** Rotation relative to parent, default x PI/2 */ this.relativeRotation = new BABYLON.Vector3( -Math.PI/2, 0, 0 ); /** Billboard mode for the text, default none */ this.billboardMode = BABYLON.Mesh.BILLBOARDMODE_NONE; } async _initWriter() { if ( ! this.Writer ) { await ScriptLoader.getInstance(VRSPACEUI.contentBase).loadScriptsToDocument([ "/babylon/js/lib/meshwriter.min.js" ]); this.Writer = BABYLON.MeshWriter(this.scene, this.writerProperties); } } clear(node) { if ( node._text ) { for ( var i = 0; i < node._text.length; i++ ) { var row = node._text.rows[i]; row.dispose(); } node._text.root.dispose(); delete node._text; } } async write(node, text, offset = new BABYLON.Vector3(0,0,0)) { await this._initWriter(); if ( text && text.length > 0 ) { if ( ! node._text ) { node._text = { root: new BABYLON.TransformNode('textParent'), rows:[], text:[] }; node._text.root.parent = node; node._text.root.position = this.relativePosition; node._text.root.billboardMode = this.billboardMode; } var textMesh = new this.Writer( text, this.textProperties ); textMesh.getMesh().position = textMesh.getMesh().position.add(offset); textMesh.getMesh().rotation = this.relativeRotation; textMesh.getMesh().parent = node._text.root; node._text.rows.push( textMesh ); node._text.text.push( text ); } } async writeArray( node, rows ) { if ( rows ) { for ( var i = 0; i < rows.length; i++ ) { this.write(node, rows[i], new BABYLON.Vector3(0,-i*this.writerProperties.scale*this.textProperties["letter-height"],0)); } } } // TODO this doesn't do anything dispose() { //this.clear(); //this.Writer.dispose(); } }