w3d
Version:
Framework to create 3D web pages.
95 lines (76 loc) • 2.53 kB
JavaScript
/*
* text.js
* Copyright 2017 Lucas Neves <lcneves@gmail.com>
*
* Makes 2D and 3D text for the w3d engine.
* Methods return a promise that resolves to an array of objects to be added.
*/
;
const THREE = require('three');
const fontLoader = new THREE.FontLoader();
const windowUtils = require('./window-utils.js');
const objectUtils = require('./object-utils.js');
const objectCommons = require('./object-commons.js');
const units = require('./units.js');
const theme = require('./theme.js');
const Word2D = require('./word2d.js');
const CURVE_SEGMENTS = 12;
class TextMesh extends THREE.Mesh {
constructor (geometry, material) {
super(geometry, material);
this.castShadow = true;
this._worldToPixelsRatio = windowUtils.worldToPixels;
this._isText3D = true;
}
}
const textMeshPrototype = {
resize () {
var scaleFactor = this._worldToPixelsRatio / windowUtils.worldToPixels;
this.scale.set(scaleFactor, scaleFactor, scaleFactor);
this.w3dAllNeedUpdate();
}
};
objectUtils.importPrototype(TextMesh.prototype, objectCommons);
objectUtils.importPrototype(TextMesh.prototype, textMeshPrototype);
function makeText3D (object) {
const text = object.getProperty('text');
var fontPromise = theme.resources.fonts[
object.getStyle('font-family') + '-' + object.getStyle('font-weight')
].fontPromise;
return new Promise(resolve => {
fontPromise.then(font => {
if (!font.isFont) {
fontLoader.parse(font);
}
var geometry = new THREE.TextGeometry(text, {
font: font,
size: units.convert(object, 'font-size', 'world'),
height: units.convert(object, 'font-height', 'world'),
curveSegments: CURVE_SEGMENTS,
bevelEnabled: false
});
var material = new THREE.MeshPhongMaterial(
{ color: object.getStyle('color') }
);
var mesh = new TextMesh(geometry, material);
resolve([mesh]);
});
});
}
// Adapted from https://jsfiddle.net/h9sub275/4/
function makeText2D (object) {
return new Promise(resolve => {
var wordArray = object.getProperty('text').split(' ');
const style = {
fontSize: units.convert(object, 'font-size'),
fontFamily: object.getStyle('font-family'),
color: object.getStyle('color')
};
for (let i = 0; i < wordArray.length; i++) {
wordArray[i] = new Word2D(wordArray[i], style, object);
}
resolve(wordArray);
});
}
module.exports.makeText3D = makeText3D;
module.exports.makeText2D = makeText2D;