Source: primitives/label.js

const SpriteText = require('three-spritetext').default;

/**
 * Bitmap labels, this is used with {@link Glyph} to 
 * provide labels.
 * 
 * @param {String} textIn - Text to be displayed dwith the label.
 * @param {THREE.Color} colour - Colour to be set for the label.
 * 
 * @class
 * @author Alan Wu
 * @return {Label}
 */
exports.Label = function (textIn, colour) {
  let text = textIn;
  let sprite = undefined;
  if (colour)
    sprite = new SpriteText(text, 0.015, colour.getStyle());
  else
    sprite = new SpriteText(text, 0.015);
  sprite.material.sizeAttenuation = false;
  sprite.center.x = -0.05;
  sprite.center.y = 0;

  /**
   * Get the current position in an array containing the x, y and z
   * coordinates.
   * 
   * @return {Array}
   */
  this.getPosition = () => {
    if (sprite)
      return [sprite.position.x, sprite.position.y, sprite.position.z];
    return [0, 0, 0];
  }

  /**
   * Set the position of the label in  3D coordinates.
   * 
   * @param {Number} x - x coordinate to be set.
   * @param {Number} y - y coordinate to be set.
   * @param {Number} z - z coordinate to be set.
   */
  this.setPosition = (x, y, z) => {
    if (sprite) {
      sprite.position.set(x, y, z);
    }
  }

  /**
   * Set the colour of the label
   * 
   * @param {THREE.Color} colour - colour to be set
   */
  this.setColour = colour => {
    sprite.color = colour.getStyle();
  }

  /**
   * Scale the label.
   * 
   * @param {Number} scaling - Scale to be set.
   */
  this.setScale = scaling => {
    if (sprite && scaling > 0.0)
      sprite.scale.set(scaling, scaling, 1.0);
  }

  /**
   * Free up the memory
   */
  this.dispose = () => {
    sprite.dispose();
  }

  /**
   * Get the intrnal sprite.
   * 
   * @return {THREE.Sprite}
   */
  this.getSprite = () => {
    return sprite;
  }

  /**
   * Get the text.
   * 
   * @return {String}
   */
  this.getString = () => {
    return text;
  }

};