constructor(parent) {
    const mesh = new Text()
    mesh.geometry.boundingSphere.version = 0
    super(parent, mesh)

    /* TODO mirroring to DOM...?
    const el = this._domEl = document.createElement('section')
    el.style = 'position:fixed;left:-99px;overflow:hidden;width:10px;height:10px;'
    document.body.appendChild(el) //should insert into local element
    */

    this.selectable = false
    this.selectionStart = this.selectionEnd = -1
    this.onSyncStart = null
    this.onSyncComplete = null
    this.gpuAccelerateSDF = true

    mesh.addEventListener('syncstart', e => {
      this.notifyWorld('text3DSyncStart')
      if (this.onSyncStart) {
        this.onSyncStart()
      }
    })
    mesh.addEventListener('synccomplete', e => {
      if (!this.isDestroying) {
        mesh.geometry.boundingSphere.version++
        this.afterUpdate()
        this.notifyWorld('text3DSyncComplete')
        this.requestRender()
        if (this.onSyncComplete) {
          this.onSyncComplete()
        }
      }
    })
  }
Facade wrapper for a TextMesh. All configuration properties of TextMesh
are accepted and proxied through directly.