-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbase.js
126 lines (98 loc) · 3.35 KB
/
base.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
var TextRenderer = require('fontpath-simple-renderer')
var createShader = require('gl-basic-shader')
var inherits = require('inherits')
//require only the math we really need..
var mat4 = {
create: require('gl-mat4/create'),
identity: require('gl-mat4/identity'),
translate: require('gl-mat4/translate'),
scale: require('gl-mat4/scale')
}
var createMesh = require('gl-basic-mesh')
var tmp3 = [ 0, 0, 0 ]
function TriangleRenderer(gl, options) {
if (!(this instanceof TriangleRenderer))
return new TriangleRenderer(gl, options)
options = options||{}
TextRenderer.call(this, options)
if (!gl)
throw 'must specify gl parameter'
this.gl = gl
this.mode = typeof options.mode === 'number' ? options.mode : gl.TRIANGLES
this.projection = mat4.create()
this.view = mat4.create()
this.simplifyAmount = typeof options.simplifyAmount === 'number' ? options.simplifyAmount : 0.02
this.color = options.color || [1, 1, 1, 1]
var shader = options.shader
if (!shader) {
this.defaultShader = createShader(gl)
shader = this.defaultShader
}
this.shader = shader
this.meshCache = {}
}
//inherits from TextRenderer
inherits(TriangleRenderer, TextRenderer)
TriangleRenderer.prototype.triangulateGlyph = function(glyph) {
throw new Error('this method should be implemented by subclasses')
}
TriangleRenderer.prototype._drawGlyph = function(data) {
var chr = String.fromCharCode(data.charCode)
var cached = this.meshCache[ chr ]
if (!cached) {
var triangulated = this.triangulateGlyph(data.glyph)
var newMesh = createMesh(this.gl, {
positions: triangulated.positions,
positionSize: 2,
elements: triangulated.cells,
shader: this.shader
})
cached = {
mesh: newMesh,
modelTransform: mat4.create()
}
this.meshCache[chr] = cached
}
var mesh = cached.mesh
mesh.bind()
var modelTransform = cached.modelTransform
mat4.identity( modelTransform )
tmp3[0] = data.position[0]
tmp3[1] = data.position[1]
tmp3[2] = 0
mat4.translate( modelTransform, modelTransform, tmp3 )
tmp3[0] = data.scale[0]
tmp3[1] = data.scale[1]
tmp3[3] = 1
mat4.scale( modelTransform, modelTransform, tmp3 )
var uniforms = mesh.shader.uniforms,
uTypes = mesh.shader.types.uniforms
if (uTypes.tint) mesh.shader.uniforms.tint = this.color
if (uTypes.model) mesh.shader.uniforms.model = modelTransform
if (uTypes.projection) mesh.shader.uniforms.projection = this.projection
if (uTypes.view) mesh.shader.uniforms.view = this.view
mesh.draw(this.mode)
mesh.unbind()
}
TriangleRenderer.prototype.draw = function(x, y, start, end) {
var result = this.render(x, y, start, end)
for (var i=0; i<result.underlines.length; i++) {
//TODO: maybe use gl-sprite-batch for underlines?
}
for (i=0; i<result.glyphs.length; i++) {
var g = result.glyphs[i]
this._drawGlyph(g)
}
}
TriangleRenderer.prototype.dispose = function() {
for (var k in this.meshCache) {
this.meshCache[k].mesh.dispose()
}
this.meshCache = null
if (this.defaultShader) {
this.defaultShader.dispose()
this.defaultShader = null
}
this.gl = null
}
module.exports = TriangleRenderer