Home Reference Source

src/textures/ASCIITexture.js

import { CanvasTexture, RepeatWrapping } from "three";

/**
 * An ASCII character lookup texture.
 */

export class ASCIITexture extends CanvasTexture {

	/**
	 * Constructs a new ASCII texture.
	 *
	 * @param {Object} [options] - The options.
	 * @param {String} [options.characters] - The character set to render. Defaults to a common ASCII art charset.
	 * @param {String} [options.font="Arial"] - The font.
	 * @param {Number} [options.fontSize=54] - The font size in pixels.
	 * @param {Number} [options.size=1024] - The texture size.
	 * @param {Number} [options.cellCount=16] - The cell count along each side of the texture.
	 */

	constructor({
		characters = " .:,'-^=*+?!|0#X%WM@",
		font = "Arial",
		fontSize = 54,
		size = 1024,
		cellCount = 16
	} = {}) {

		super(
			document.createElement("canvas"),
			undefined,
			RepeatWrapping,
			RepeatWrapping
		);

		const canvas = this.image;
		canvas.width = canvas.height = size;

		const context = canvas.getContext("2d");
		const cellSize = size / cellCount;
		context.font = `${fontSize}px ${font}`;
		context.textAlign = "center";
		context.textBaseline = "middle";
		context.fillStyle = "#ffffff";

		for(let i = 0, l = characters.length; i < l; ++i) {

			const char = characters[i];
			const x = i % cellCount;
			const y = Math.floor(i / cellCount);

			context.fillText(char, x * cellSize + cellSize / 2, y * cellSize + cellSize / 2);

		}

		/**
		 * The amount of characters in this texture.
		 *
		 * @type {Number}
		 * @readonly
		 */

		this.characterCount = characters.length;

		/**
		 * The cell count along each side of the texture.
		 *
		 * @type {Number}
		 * @readonly
		 */

		this.cellCount = cellCount;

	}

}