Source: ui/widget/label.js

/**
Text label somewhere in space.
CHECKME position of the label is actually center of the text plane
 */
export class Label {
  /** hack for calculating position/required texture size*/
  static fontRatio=1.5;
  /**
  @param text label text
  @param position Vector3 to put label at - center of the label!
  @param parent optional parent node
   */
  constructor(text, position, parent) {
    /** Label text */
    this.text = text;
    /** Label position */
    this.position = position;
    /** Parent node */
    this.parent = parent;
    /** text color, default white */
    this.color = "white";
    /** Label height, default 1 */
    this.height = 1;
    /** default none (null), may be "transparent", "white", "rgba(50,50,200,0.5)" etc */
    this.background = null;
    /** background border thickness, default 0 (no border)*/
    this.border = 0;
    /** background corner radius, default 0 */
    this.cornerRadius = 0;
    //this.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER;
    /** horizontal text alignment, default left */
    this.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_LEFT;
    /** vertical text alignment, default top */
    this.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_TOP;
    /** hack for calculating position */
    this.fontRatio=this.constructor.fontRatio;
  }

  /** Set text after display() */
  setText(text) {
    this.text = text;
    this.textBlock.text = this.text;
  }
  /** Change background color after display() */
  setBackground(string) {
    this.texture.background = string;
  }
  /** Change text color after display() */
  setColor(string) {
    this.textBlock.color = string;
  }
  display() {
    this.textBlock = new BABYLON.GUI.TextBlock();
    this.textBlock.text = this.text;
    this.textBlock.textHorizontalAlignment = this.horizontalAlignment;
    this.textBlock.textVerticalAlignment = this.verticalAlignment;
    this.textBlock.color = this.color;
  
    this.textPlane = BABYLON.MeshBuilder.CreatePlane("Text-"+this.text, {height:this.height,width:this.text.length/this.fontRatio*this.height});
    this.textPlane.parent = this.parent;
    //this.textPlane.position = new BABYLON.Vector3(this.text.length/2,this.spacing*2,0);
    this.textPlane.position = this.position;
    //this.textPlane.position = new BABYLON.Vector3(this.position.x, this.position.y, this.position.z);

    // this works exactly only for proportinal fonts (courrier etc)
    var width = this.textBlock.fontSizeInPixels/this.fontRatio * this.textBlock.text.length;
    var height = this.textBlock.fontSizeInPixels+2;
    this.texture = BABYLON.GUI.AdvancedDynamicTexture.CreateForMesh(
      this.textPlane,
      width,
      height,
      false // mouse events disabled
    );
    this.texture.addControl(this.textBlock);

    if ( this.background ) {
      this.setBackground(this.background);
    }
  }
  
  dispose() {
    if ( this.textBlock ) {
      this.textBlock.dispose();
      this.textPlane.material.dispose();
      this.textPlane.dispose();
      this.texture.dispose();
      delete this.textBlock;
      delete this.textPlane;
      delete this.texture;
    }
  }
}