forked from Experience-Monks/three-bmfont-text
-
Notifications
You must be signed in to change notification settings - Fork 14
/
index.js
executable file
·129 lines (104 loc) · 3.38 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var createLayout = require('layout-bmfont-text')
var createIndices = require('quad-indices')
var vertices = require('./lib/vertices')
var utils = require('./lib/utils')
module.exports = function createTextGeometry (opt) {
return new TextGeometry(opt)
}
class TextGeometry extends THREE.BufferGeometry {
constructor (opt) {
super()
if (typeof opt === 'string') {
opt = { text: opt }
}
// use these as default values for any subsequent
// calls to update()
this._opt = Object.assign({}, opt)
// also do an initial setup...
if (opt) this.update(opt)
}
update(opt) {
if (typeof opt === 'string') {
opt = { text: opt }
}
// use constructor defaults
opt = Object.assign({}, this._opt, opt)
if (!opt.font) {
throw new TypeError('must specify a { font } in options')
}
this.layout = createLayout(opt)
// get vec2 texcoords
var flipY = opt.flipY !== false
// the desired BMFont data
var font = opt.font
// determine texture size from font file
var texWidth = font.common.scaleW
var texHeight = font.common.scaleH
// get visible glyphs
var glyphs = this.layout.glyphs.filter(function (glyph) {
var bitmap = glyph.data
return bitmap.width * bitmap.height > 0
})
// provide visible glyphs for convenience
this.visibleGlyphs = glyphs
// get common vertex data
var positions = vertices.positions(glyphs)
var uvs = vertices.uvs(glyphs, texWidth, texHeight, flipY)
var indices = createIndices([], {
clockwise: true,
type: 'uint16',
count: glyphs.length
})
// update vertex data
this.setIndex(indices)
this.setAttribute('position', new THREE.BufferAttribute(positions, 2))
this.setAttribute('uv', new THREE.BufferAttribute(uvs, 2))
// update multipage data
if (!opt.multipage && 'page' in this.attributes) {
// disable multipage rendering
this.removeAttribute('page')
} else if (opt.multipage) {
// enable multipage rendering
var pages = vertices.pages(glyphs)
this.setAttribute('page', new THREE.BufferAttribute(pages, 1))
}
// recompute bounding box and sphere, if present
if (this.boundingBox !== null) {
this.computeBoundingBox();
}
if (this.boundingSphere !== null) {
this.computeBoundingSphere();
}
}
computeBoundingSphere() {
if (this.boundingSphere === null) {
this.boundingSphere = new THREE.Sphere()
}
var positions = this.attributes.position.array
var itemSize = this.attributes.position.itemSize
if (!positions || !itemSize || positions.length < 2) {
this.boundingSphere.radius = 0
this.boundingSphere.center.set(0, 0, 0)
return
}
utils.computeSphere(positions, this.boundingSphere)
if (isNaN(this.boundingSphere.radius)) {
console.error('THREE.BufferGeometry.computeBoundingSphere(): ' +
'Computed radius is NaN. The ' +
'"position" attribute is likely to have NaN values.')
}
}
computeBoundingBox() {
if (this.boundingBox === null) {
this.boundingBox = new THREE.Box3()
}
var bbox = this.boundingBox
var positions = this.attributes.position.array
var itemSize = this.attributes.position.itemSize
if (!positions || !itemSize || positions.length < 2) {
bbox.makeEmpty()
return
}
utils.computeBox(positions, bbox)
}
}