@@ -36,14 +36,28 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
3636
3737 renderer . setPipeline ( pipeline ) ;
3838
39- var camMatrix = pipeline . _tempCameraMatrix ;
40- var spriteMatrix = pipeline . _tempSpriteMatrix ;
39+ var crop = ( src . cropWidth > 0 || src . cropHeight > 0 ) ;
4140
42- spriteMatrix . applyITRS ( src . x - camera . scrollX * src . scrollFactorX , src . y - camera . scrollY * src . scrollFactorY , src . rotation , src . scaleX , src . scaleY ) ;
41+ if ( crop )
42+ {
43+ pipeline . flush ( ) ;
4344
44- camMatrix . copyFrom ( camera . matrix ) ;
45+ renderer . pushScissor (
46+ src . x ,
47+ src . y ,
48+ src . cropWidth * src . scaleX ,
49+ src . cropHeight * src . scaleY
50+ ) ;
51+ }
52+
53+ var camMatrix = pipeline . _tempMatrix1 ;
54+ var spriteMatrix = pipeline . _tempMatrix2 ;
55+ var calcMatrix = pipeline . _tempMatrix3 ;
56+ var fontMatrix = pipeline . _tempMatrix4 ;
4557
46- var calcMatrix ;
58+ spriteMatrix . applyITRS ( src . x , src . y , src . rotation , src . scaleX , src . scaleY ) ;
59+
60+ camMatrix . copyFrom ( camera . matrix ) ;
4761
4862 if ( parentMatrix )
4963 {
@@ -54,12 +68,16 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
5468 spriteMatrix . e = src . x ;
5569 spriteMatrix . f = src . y ;
5670
57- // Multiply by the Sprite matrix
58- calcMatrix = camMatrix . multiply ( spriteMatrix ) ;
71+ // Multiply by the Sprite matrix, store result in calcMatrix
72+ camMatrix . multiply ( spriteMatrix , calcMatrix ) ;
5973 }
6074 else
6175 {
62- calcMatrix = camMatrix . multiply ( spriteMatrix ) ;
76+ spriteMatrix . e -= camera . scrollX * src . scrollFactorX ;
77+ spriteMatrix . f -= camera . scrollY * src . scrollFactorY ;
78+
79+ // Multiply by the Sprite matrix, store result in calcMatrix
80+ camMatrix . multiply ( spriteMatrix , calcMatrix ) ;
6381 }
6482
6583 var frame = src . frame ;
@@ -79,7 +97,6 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
7997
8098 var xAdvance = 0 ;
8199 var yAdvance = 0 ;
82- var indexCount = 0 ;
83100 var charCode = 0 ;
84101 var lastCharCode = 0 ;
85102 var letterSpacing = src . letterSpacing ;
@@ -89,26 +106,36 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
89106 var glyphW = 0 ;
90107 var glyphH = 0 ;
91108 var lastGlyph ;
109+ var scrollX = src . scrollX ;
110+ var scrollY = src . scrollY ;
92111
93112 var fontData = src . fontData ;
94113 var chars = fontData . chars ;
95114 var lineHeight = fontData . lineHeight ;
96115 var scale = ( src . fontSize / fontData . size ) ;
97116 var rotation = 0 ;
98117
99- var roundPixels = camera . roundPixels ;
100- var displayCallback = src . displayCallback ;
101- var crop = ( src . cropWidth > 0 || src . cropHeight > 0 ) ;
118+ var align = src . _align ;
119+ var currentLine = 0 ;
120+ var lineOffsetX = 0 ;
102121
103- if ( crop )
122+ // Update the bounds - skipped internally if not dirty
123+ src . getTextBounds ( false ) ;
124+
125+ var lineData = src . _bounds . lines ;
126+
127+ if ( align === 1 )
104128 {
105- renderer . pushScissor (
106- src . x ,
107- src . y ,
108- src . cropWidth * src . scaleX ,
109- src . cropHeight * src . scaleY
110- ) ;
129+ lineOffsetX = ( lineData . longest - lineData . lengths [ 0 ] ) / 2 ;
111130 }
131+ else if ( align === 2 )
132+ {
133+ lineOffsetX = ( lineData . longest - lineData . lengths [ 0 ] ) ;
134+ }
135+
136+ var roundPixels = camera . roundPixels ;
137+ var displayCallback = src . displayCallback ;
138+ var callbackData = src . callbackData ;
112139
113140 for ( var i = 0 ; i < textLength ; i ++ )
114141 {
@@ -117,6 +144,17 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
117144 // Carriage-return
118145 if ( charCode === 10 )
119146 {
147+ currentLine ++ ;
148+
149+ if ( align === 1 )
150+ {
151+ lineOffsetX = ( lineData . longest - lineData . lengths [ currentLine ] ) / 2 ;
152+ }
153+ else if ( align === 2 )
154+ {
155+ lineOffsetX = ( lineData . longest - lineData . lengths [ currentLine ] ) ;
156+ }
157+
120158 xAdvance = 0 ;
121159 yAdvance += lineHeight ;
122160 lastGlyph = null ;
@@ -137,8 +175,8 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
137175 glyphW = glyph . width ;
138176 glyphH = glyph . height ;
139177
140- var x = ( glyph . xOffset + xAdvance ) * scale ;
141- var y = ( glyph . yOffset + yAdvance ) * scale ;
178+ var x = ( glyph . xOffset + xAdvance ) - scrollX ;
179+ var y = ( glyph . yOffset + yAdvance ) - scrollY ;
142180
143181 if ( lastGlyph !== null )
144182 {
@@ -156,29 +194,25 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
156194 continue ;
157195 }
158196
159- x -= src . displayOriginX ;
160- y -= src . displayOriginY ;
161197 scale = ( src . fontSize / src . fontData . size ) ;
162198 rotation = 0 ;
163199
164200 if ( displayCallback )
165201 {
166- var output = displayCallback ( {
167- color : 0 ,
168- tint : {
169- topLeft : tintTL ,
170- topRight : tintTR ,
171- bottomLeft : tintBL ,
172- bottomRight : tintBR
173- } ,
174- index : i ,
175- charCode : charCode ,
176- x : x ,
177- y : y ,
178- scale : scale ,
179- rotation : rotation ,
180- data : glyph . data
181- } ) ;
202+ callbackData . color = 0 ;
203+ callbackData . tint . topLeft = tintTL ;
204+ callbackData . tint . topRight = tintTR ;
205+ callbackData . tint . bottomLeft = tintBL ;
206+ callbackData . tint . bottomRight = tintBR ;
207+ callbackData . index = i ;
208+ callbackData . charCode = charCode ;
209+ callbackData . x = x ;
210+ callbackData . y = y ;
211+ callbackData . scale = scale ;
212+ callbackData . rotation = rotation ;
213+ callbackData . data = glyph . data ;
214+
215+ var output = displayCallback ( callbackData ) ;
182216
183217 x = output . x ;
184218 y = output . y ;
@@ -206,25 +240,37 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
206240 tintBR = Utils . getTintAppendFloatAlpha ( tintBR , camera . alpha * src . _alphaBR ) ;
207241 }
208242
243+ x *= scale ;
244+ y *= scale ;
245+
246+ x -= src . displayOriginX ;
247+ y -= src . displayOriginY ;
248+
249+ x += lineOffsetX ;
250+
251+ fontMatrix . applyITRS ( x , y , rotation , scale , scale ) ;
252+
253+ calcMatrix . multiply ( fontMatrix , spriteMatrix ) ;
254+
209255 var u0 = glyphX / textureWidth ;
210256 var v0 = glyphY / textureHeight ;
211257 var u1 = ( glyphX + glyphW ) / textureWidth ;
212258 var v1 = ( glyphY + glyphH ) / textureHeight ;
213259
214- var xw = x + glyphW * scale ;
215- var yh = y + glyphH * scale ;
260+ var xw = glyphW ;
261+ var yh = glyphH ;
216262
217- var tx0 = x * calcMatrix . a + y * calcMatrix . c + calcMatrix . e ;
218- var ty0 = x * calcMatrix . b + y * calcMatrix . d + calcMatrix . f ;
263+ var tx0 = spriteMatrix . e ;
264+ var ty0 = spriteMatrix . f ;
219265
220- var tx1 = x * calcMatrix . a + yh * calcMatrix . c + calcMatrix . e ;
221- var ty1 = x * calcMatrix . b + yh * calcMatrix . d + calcMatrix . f ;
266+ var tx1 = yh * spriteMatrix . c + spriteMatrix . e ;
267+ var ty1 = yh * spriteMatrix . d + spriteMatrix . f ;
222268
223- var tx2 = xw * calcMatrix . a + yh * calcMatrix . c + calcMatrix . e ;
224- var ty2 = xw * calcMatrix . b + yh * calcMatrix . d + calcMatrix . f ;
269+ var tx2 = xw * spriteMatrix . a + yh * spriteMatrix . c + spriteMatrix . e ;
270+ var ty2 = xw * spriteMatrix . b + yh * spriteMatrix . d + spriteMatrix . f ;
225271
226- var tx3 = xw * calcMatrix . a + y * calcMatrix . c + calcMatrix . e ;
227- var ty3 = xw * calcMatrix . b + y * calcMatrix . d + calcMatrix . f ;
272+ var tx3 = xw * spriteMatrix . a + spriteMatrix . e ;
273+ var ty3 = xw * spriteMatrix . b + spriteMatrix . f ;
228274
229275 if ( roundPixels )
230276 {
@@ -246,6 +292,8 @@ var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPerce
246292
247293 if ( crop )
248294 {
295+ pipeline . flush ( ) ;
296+
249297 renderer . popScissor ( ) ;
250298 }
251299} ;
0 commit comments