0.11.0 • Published 8 months ago

aframe-troika-text v0.11.0

Weekly downloads
103
License
MIT
Repository
-
Last release
8 months ago

aframe-troika-text

Version License

This package provides an A-Frame component and primitive for rendering three-dimensional text using Troika's text renderer.

It has similar performance and quality to A-Frame's built-in SDF text component, but brings some additional advantages:

  • It reads font files directly (ttf, otf, woff) and does not require using an external tool to pre-generate SDF textures with the glyphs you think you'll need.

  • It supports ligatures so you can use fonts like Material Icons.

  • Rather than using a fully custom shader, it patches the built-in Three.js material shaders as needed, so you don't lose all the nice standard shader features like lighting and fog.

  • Support for right-to-left/bidirectional language layout and shaping of Arabic text.

API

This package registers both a component (<a-entity troika-text="value:Hello" />) and a primitive (<a-troika-text value="Hello"></a-troika-text>). Use whichever is most convenient for you.

I've attempted to keep the API as close as possible to that of A-Frame's default text component and a-text primitive, however some things don't quite map exactly.

Property on componentAttribute on primitiveDescriptionDefault Value
alignalignMulti-line text alignment (left, center, right, justify).left
anchoranchorHorizontal positioning (left, center, right, align).center
baselinebaselineVertical positioning (top, center, bottom).center
clipRectclip-rectFour comma- or space-separated numbers defining a rectangle (minX, minY, maxX, maxY) outside which pixels will be hidden.no clipping
curveRadiuscurve-radiusA cylindrical radius along which the text's plane will be curved. Positive = concave, negative = convex.0
colorcolorText color. This is a shortcut for specifying a custom material.white
depthOffsetdepth-offsetDepth buffer offset to help prevent z-fighting. Negative numbers are closer to camera, positives further.0
directiondirectionMain bidi direction of the text: 'auto', 'ltr', or 'rtl''auto'
fillOpacityfill-opacityOpacity of the glyph's fill.1
fontfontURL to a font file - can be a .ttf, .otf, or .woff (no .woff2) or an <a-asset-item> id such as #font.Roboto loaded from Google Fonts
fontSizefont-sizeEm-height at which to render the font, in meters.0.2
letterSpacingletter-spacingLetter spacing in meters.0
lineHeightline-heightLine height as a multiple of the fontSize.derived from font metrics
maxWidthmax-widthMaximum width of the text block at which text will start wrapping, in meters.Infinity (no wrapping)
outlineBluroutline-blurA blur radius applied to the outer edge of the text's outlineWidth.0
outlineColoroutline-colorColor of an outline drawn around the glyph paths.black
outlineOffsetXoutline-offset-xHorizontal offset of the outline (ala text-shadow), as a number in meters or a percentage of the font-size.0
outlineOffsetYoutline-offset-yVertical offset of the outline (ala text-shadow), as a number in meters or a percentage of the font-size.0
outlineOpacityoutline-opacityOpacity of the outline, from 0 to 1.1
outlineWidthoutline-widthWidth of an outline drawn around the glyph paths, as a number in meters or a percentage of the font-size.0
overflowWrapoverflow-wrapControls how text wraps: "normal" to break at whitespace characters, or "break-word" to break within words.normal
valuevalueThe actual content of the text. Line breaks and tabs are supported with \n and \t.''
strokeColorstroke-colorColor of a stroke drawn inside the glyph paths.grey
strokeOpacitystroke-opacityOpacity of the stroke, from 0 to 1.1
strokeWidthstroke-widthWidth of a stroke drawn inside the glyph paths, as a number in meters or a percentage of the font-size.0
textIndenttext-indentWidth of an indentation space to be added before the first character of a line.0
whiteSpacewhite-spaceHow whitespace should be handled (i.e., normal, nowrap).normal (behaves like pre-wrap)

Note: It does not currently follow how the built-in text component interacts with a geometry component for auto-sizing and anchoring. I think that's a nice feature so it's probably worth adding; in the meantime just use the maxWidth and anchor/baseline attributes to control it manually.

Changing the material

By default the text will render using a MeshBasicMaterial using the color property described in the table above. But you can also change the material to gain more advanced shader features such as physically-based lighting.

If you are using the <a-troika-text> primitive, you can assign it a material component just as you would any other entity.

<a-troika-text
  value="Hello!"
  material="shader: standard; metalness: 0.8;"
></a-troika-text>

If you are using the troika-text="..." component, you must instead give it a troika-text-material="..." attribute to distinguish the text material from the entity's main material. You can pass it anything supported by the built in material component.

<a-entity
  troika-text="value: Hello!"
  troika-text-material="shader: standard; metalness: 0.8;"
></a-entity>

Installation

Browser

Install and use by directly including the browser files:

<head>
  <title>My A-Frame Scene</title>
  <script src="https://aframe.io/releases/1.3.0/aframe.min.js"></script>
  <script src="https://unpkg.com/aframe-troika-text/dist/aframe-troika-text.min.js"></script>
</head>

<body>
  <a-scene>
    <!-- As a component: -->
    <a-entity troika-text="value: Hello world!"></a-entity>
    
    <!-- As a primitive: -->
    <a-troika-text value="Hello world!"></a-troika-text>
  </a-scene>
</body>

npm

Install via npm:

npm install aframe-troika-text

Then require and use.

require('aframe');
require('aframe-troika-text');
0.11.0

8 months ago

0.10.0

1 year ago

0.10.1

1 year ago

0.9.0

1 year ago

0.8.0

2 years ago

0.7.1

2 years ago

0.7.0

2 years ago

0.6.0

3 years ago

0.5.0

4 years ago

0.4.0

4 years ago

0.3.4

4 years ago

0.3.3

4 years ago

0.3.2

4 years ago

0.3.1

4 years ago

0.2.2

4 years ago

0.2.1

4 years ago

0.2.0

4 years ago

0.1.2

5 years ago

0.1.0

5 years ago