@@ -5325,12 +5325,13 @@ var egret;
5325
5325
this . contextLost = false ;
5326
5326
this . currentBaseTexture = null ;
5327
5327
this . currentBatchSize = 0 ;
5328
+ this . drawData = [ ] ;
5328
5329
this . $drawCalls = 0 ;
5329
5330
this . $computeDrawCall = false ;
5330
5331
this . globalMatrix = new egret . Matrix ( ) ;
5331
5332
this . savedGlobalMatrix = new egret . Matrix ( ) ;
5332
5333
this . _globalAlpha = 1 ;
5333
- this . stencilList = [ ] ;
5334
+ this . $ stencilList = [ ] ;
5334
5335
this . graphicsPoints = null ;
5335
5336
this . graphicsIndices = null ;
5336
5337
this . graphicsBuffer = null ;
@@ -5453,7 +5454,7 @@ var egret;
5453
5454
* 获取指定坐标的像素
5454
5455
*/
5455
5456
p . getPixel = function ( x , y ) {
5456
- return null ; //this.context.getImageData(x, y, 1, 1).data;
5457
+ return [ ] ; //this.context.getImageData(x, y, 1, 1).data;
5457
5458
} ;
5458
5459
/**
5459
5460
* 转换成base64字符串,如果图片(或者包含的图片)跨域,则返回null
@@ -5570,8 +5571,9 @@ var egret;
5570
5571
this . createWebGLTexture ( texture ) ;
5571
5572
var webGLTexture = texture [ "webGLTexture" ] [ this . glID ] ;
5572
5573
if ( webGLTexture !== this . currentBaseTexture || this . currentBatchSize >= this . size - 1 ) {
5573
- this . $drawWebGL ( ) ;
5574
+ // this.$drawWebGL();
5574
5575
this . currentBaseTexture = webGLTexture ;
5576
+ this . drawData . push ( { texture : this . currentBaseTexture , count : 0 } ) ;
5575
5577
}
5576
5578
//计算出绘制矩阵,之后把矩阵还原回之前的
5577
5579
var locWorldTransform = this . globalMatrix ;
@@ -5643,21 +5645,39 @@ var egret;
5643
5645
// alpha
5644
5646
vertices [ index ++ ] = alpha ;
5645
5647
this . currentBatchSize ++ ;
5648
+ this . drawData [ this . drawData . length - 1 ] . count ++ ;
5646
5649
} ;
5647
5650
p . $drawWebGL = function ( ) {
5648
5651
if ( this . currentBatchSize == 0 || this . contextLost ) {
5649
5652
return ;
5650
5653
}
5651
- if ( this . $computeDrawCall ) {
5652
- this . $drawCalls ++ ;
5653
- }
5654
5654
this . start ( ) ;
5655
5655
var gl = this . context ;
5656
- gl . bindTexture ( gl . TEXTURE_2D , this . currentBaseTexture ) ;
5657
5656
var view = this . vertices . subarray ( 0 , this . currentBatchSize * 4 * this . vertSize ) ;
5658
5657
gl . bufferSubData ( gl . ARRAY_BUFFER , 0 , view ) ;
5659
- gl . drawElements ( gl . TRIANGLES , this . currentBatchSize * 6 , gl . UNSIGNED_SHORT , 0 ) ;
5658
+ var length = this . drawData . length ;
5659
+ var offset = 0 ;
5660
+ for ( var i = 0 ; i < length ; i ++ ) {
5661
+ var data = this . drawData [ i ] ;
5662
+ if ( data . texture ) {
5663
+ gl . bindTexture ( gl . TEXTURE_2D , data . texture ) ;
5664
+ var size = data . count * 6 ;
5665
+ gl . drawElements ( gl . TRIANGLES , size , gl . UNSIGNED_SHORT , offset * 2 ) ;
5666
+ offset += size ;
5667
+ if ( this . $computeDrawCall ) {
5668
+ this . $drawCalls ++ ;
5669
+ }
5670
+ }
5671
+ else {
5672
+ var blendModeWebGL = WebGLRenderBuffer . blendModesForGL [ data ] ;
5673
+ if ( blendModeWebGL ) {
5674
+ this . context . blendFunc ( blendModeWebGL [ 0 ] , blendModeWebGL [ 1 ] ) ;
5675
+ }
5676
+ }
5677
+ }
5678
+ this . drawData . length = 0 ;
5660
5679
this . currentBatchSize = 0 ;
5680
+ this . currentBaseTexture = null ;
5661
5681
} ;
5662
5682
p . start = function ( ) {
5663
5683
if ( this . contextLost ) {
@@ -5724,24 +5744,21 @@ var egret;
5724
5744
} ;
5725
5745
p . setGlobalCompositeOperation = function ( value ) {
5726
5746
if ( this . currentBlendMode != value ) {
5727
- var blendModeWebGL = WebGLRenderBuffer . blendModesForGL [ value ] ;
5728
- if ( blendModeWebGL ) {
5729
- this . $drawWebGL ( ) ;
5730
- this . context . blendFunc ( blendModeWebGL [ 0 ] , blendModeWebGL [ 1 ] ) ;
5731
- this . currentBlendMode = value ;
5732
- }
5747
+ this . drawData . push ( value ) ;
5748
+ this . currentBlendMode = value ;
5749
+ this . currentBaseTexture = null ;
5733
5750
}
5734
5751
} ;
5735
5752
p . pushMask = function ( mask ) {
5736
5753
//todo 把绘制数据缓存提升性能
5737
5754
this . $drawWebGL ( ) ;
5738
5755
var gl = this . context ;
5739
- if ( this . stencilList . length === 0 ) {
5756
+ if ( this . $ stencilList. length === 0 ) {
5740
5757
gl . enable ( gl . STENCIL_TEST ) ;
5741
5758
gl . clear ( gl . STENCIL_BUFFER_BIT ) ;
5742
5759
}
5743
- var level = this . stencilList . length ;
5744
- this . stencilList . push ( mask ) ;
5760
+ var level = this . $ stencilList. length ;
5761
+ this . $ stencilList. push ( mask ) ;
5745
5762
gl . colorMask ( false , false , false , false ) ;
5746
5763
gl . stencilFunc ( gl . EQUAL , level , 0xFF ) ;
5747
5764
gl . stencilOp ( gl . KEEP , gl . KEEP , gl . INCR ) ;
@@ -5762,12 +5779,12 @@ var egret;
5762
5779
p . popMask = function ( ) {
5763
5780
this . $drawWebGL ( ) ;
5764
5781
var gl = this . context ;
5765
- var mask = this . stencilList . pop ( ) ;
5766
- if ( this . stencilList . length === 0 ) {
5782
+ var mask = this . $ stencilList. pop ( ) ;
5783
+ if ( this . $ stencilList. length === 0 ) {
5767
5784
gl . disable ( gl . STENCIL_TEST ) ;
5768
5785
}
5769
5786
else {
5770
- var level = this . stencilList . length ;
5787
+ var level = this . $ stencilList. length ;
5771
5788
gl . colorMask ( false , false , false , false ) ;
5772
5789
gl . stencilFunc ( gl . EQUAL , level + 1 , 0xFF ) ;
5773
5790
gl . stencilOp ( gl . KEEP , gl . KEEP , gl . DECR ) ;
@@ -6033,6 +6050,7 @@ var egret;
6033
6050
}
6034
6051
else {
6035
6052
if ( child [ "isFPS" ] ) {
6053
+ buffer . $drawWebGL ( ) ;
6036
6054
buffer . $computeDrawCall = false ;
6037
6055
this . drawDisplayObject ( child , buffer , dirtyList , matrix , child . $displayList , clipRegion , root ) ;
6038
6056
buffer . $drawWebGL ( ) ;
@@ -6050,7 +6068,6 @@ var egret;
6050
6068
* @private
6051
6069
*/
6052
6070
p . drawWithClip = function ( displayObject , buffer , dirtyList , matrix , clipRegion , root ) {
6053
- //todo 可以使用stencil代替混合模式
6054
6071
var drawCalls = 0 ;
6055
6072
var hasBlendMode = ( displayObject . $blendMode !== 0 ) ;
6056
6073
if ( hasBlendMode ) {
@@ -6128,33 +6145,55 @@ var egret;
6128
6145
egret . Matrix . release ( displayMatrix ) ;
6129
6146
return drawCalls ;
6130
6147
}
6131
- //绘制显示对象自身,若有scrollRect,应用clip
6132
- var displayBuffer = this . createRenderBuffer ( region . width , region . height ) ;
6133
- var displayContext = displayBuffer . context ;
6134
- if ( ! displayContext ) {
6135
- drawCalls += this . drawDisplayObject ( displayObject , buffer , dirtyList , matrix , displayObject . $displayList , clipRegion , root ) ;
6148
+ //没有遮罩,同时显示对象没有子项
6149
+ if ( ! mask && ( ! displayObject . $children || displayObject . $children . length == 0 ) ) {
6150
+ if ( scrollRect ) {
6151
+ buffer . pushMask ( scrollRect ) ;
6152
+ }
6153
+ var offsetM = egret . Matrix . create ( ) . setTo ( 1 , 0 , 0 , 1 , 0 , 0 ) ;
6154
+ //绘制显示对象
6155
+ if ( hasBlendMode ) {
6156
+ buffer . setGlobalCompositeOperation ( compositeOp ) ;
6157
+ }
6158
+ drawCalls += this . drawDisplayObject ( displayObject , buffer , dirtyList , offsetM , displayObject . $displayList , region , null ) ;
6159
+ egret . Matrix . release ( offsetM ) ;
6160
+ if ( hasBlendMode ) {
6161
+ buffer . setGlobalCompositeOperation ( defaultCompositeOp ) ;
6162
+ }
6136
6163
egret . sys . Region . release ( region ) ;
6137
6164
egret . Matrix . release ( displayMatrix ) ;
6138
6165
return drawCalls ;
6139
6166
}
6140
- if ( scrollRect ) {
6141
- var m = displayMatrix ;
6142
- displayBuffer . setTransform ( m . a , m . b , m . c , m . d , m . tx - region . minX , m . ty - region . minY ) ;
6143
- displayBuffer . pushMask ( scrollRect ) ;
6144
- }
6145
- displayBuffer . setTransform ( 1 , 0 , 0 , 1 , - region . minX , - region . minY ) ;
6146
- var offsetM = egret . Matrix . create ( ) . setTo ( 1 , 0 , 0 , 1 , - region . minX , - region . minY ) ;
6147
- drawCalls += this . drawDisplayObject ( displayObject , displayBuffer , dirtyList , offsetM , displayObject . $displayList , region , root ? displayObject : null ) ;
6148
- egret . Matrix . release ( offsetM ) ;
6149
- //绘制遮罩
6150
- if ( mask ) {
6151
- //如果只有一次绘制或是已经被cache直接绘制到displayContext
6152
- var maskRenderNode = mask . $getRenderNode ( ) ;
6153
- if ( maskRenderNode && maskRenderNode . $getRenderCount ( ) == 1 || mask . $displayList ) {
6154
- displayBuffer . setGlobalCompositeOperation ( "destination-in" ) ;
6155
- drawCalls += this . drawDisplayObject ( mask , displayBuffer , dirtyList , offsetM , mask . $displayList , region , root ? mask : null ) ;
6167
+ else {
6168
+ //绘制显示对象自身,若有scrollRect,应用clip
6169
+ var displayBuffer = this . createRenderBuffer ( region . width , region . height ) ;
6170
+ var displayContext = displayBuffer . context ;
6171
+ if ( ! displayContext ) {
6172
+ drawCalls += this . drawDisplayObject ( displayObject , buffer , dirtyList , matrix , displayObject . $displayList , clipRegion , root ) ;
6173
+ egret . sys . Region . release ( region ) ;
6174
+ egret . Matrix . release ( displayMatrix ) ;
6175
+ return drawCalls ;
6156
6176
}
6157
- else {
6177
+ if ( scrollRect ) {
6178
+ var m = displayMatrix ;
6179
+ displayBuffer . setTransform ( m . a , m . b , m . c , m . d , m . tx - region . minX , m . ty - region . minY ) ;
6180
+ displayBuffer . pushMask ( scrollRect ) ;
6181
+ }
6182
+ displayBuffer . setTransform ( 1 , 0 , 0 , 1 , - region . minX , - region . minY ) ;
6183
+ var offsetM = egret . Matrix . create ( ) . setTo ( 1 , 0 , 0 , 1 , - region . minX , - region . minY ) ;
6184
+ drawCalls += this . drawDisplayObject ( displayObject , displayBuffer , dirtyList , offsetM , displayObject . $displayList , region , root ? displayObject : null ) ;
6185
+ egret . Matrix . release ( offsetM ) ;
6186
+ //绘制遮罩
6187
+ if ( mask ) {
6188
+ //如果只有一次绘制或是已经被cache直接绘制到displayContext
6189
+ //webgl暂时无法添加,因为会有边界像素没有被擦除
6190
+ //var maskRenderNode = mask.$getRenderNode();
6191
+ //if (maskRenderNode && maskRenderNode.$getRenderCount() == 1 || mask.$displayList) {
6192
+ // displayBuffer.setGlobalCompositeOperation("destination-in");
6193
+ // drawCalls += this.drawDisplayObject(mask, displayBuffer, dirtyList, offsetM,
6194
+ // mask.$displayList, region, root ? mask : null);
6195
+ //}
6196
+ //else {
6158
6197
var maskBuffer = this . createRenderBuffer ( region . width , region . height ) ;
6159
6198
var maskContext = maskBuffer . context ;
6160
6199
if ( ! maskContext ) {
@@ -6180,26 +6219,27 @@ var egret;
6180
6219
}
6181
6220
renderBufferPool . push ( maskBuffer ) ;
6182
6221
}
6183
- }
6184
- //绘制结果到屏幕
6185
- if ( drawCalls > 0 ) {
6186
- drawCalls ++ ;
6187
- if ( hasBlendMode ) {
6188
- buffer . setGlobalCompositeOperation ( compositeOp ) ;
6189
- }
6190
- buffer . setGlobalAlpha ( 1 ) ;
6191
- buffer . setTransform ( 1 , 0 , 0 , 1 , region . minX + matrix . tx , region . minY + matrix . ty ) ;
6192
- displayBuffer . $drawWebGL ( ) ;
6193
- web . WebGLUtils . deleteWebGLTexture ( displayBuffer . surface ) ;
6194
- buffer . drawImage ( displayBuffer . surface , 0 , 0 , displayBuffer . surface . width , displayBuffer . surface . height , 0 , 0 , displayBuffer . surface . width , displayBuffer . surface . height ) ;
6195
- if ( hasBlendMode ) {
6196
- buffer . setGlobalCompositeOperation ( defaultCompositeOp ) ;
6222
+ //绘制结果到屏幕
6223
+ if ( drawCalls > 0 ) {
6224
+ drawCalls ++ ;
6225
+ if ( hasBlendMode ) {
6226
+ buffer . setGlobalCompositeOperation ( compositeOp ) ;
6227
+ }
6228
+ buffer . setGlobalAlpha ( 1 ) ;
6229
+ buffer . setTransform ( 1 , 0 , 0 , 1 , region . minX + matrix . tx , region . minY + matrix . ty ) ;
6230
+ displayBuffer . $drawWebGL ( ) ;
6231
+ web . WebGLUtils . deleteWebGLTexture ( displayBuffer . surface ) ;
6232
+ buffer . drawImage ( displayBuffer . surface , 0 , 0 , displayBuffer . surface . width , displayBuffer . surface . height , 0 , 0 , displayBuffer . surface . width , displayBuffer . surface . height ) ;
6233
+ if ( hasBlendMode ) {
6234
+ buffer . setGlobalCompositeOperation ( defaultCompositeOp ) ;
6235
+ }
6197
6236
}
6237
+ displayBuffer . setGlobalCompositeOperation ( defaultCompositeOp ) ;
6238
+ renderBufferPool . push ( displayBuffer ) ;
6239
+ egret . sys . Region . release ( region ) ;
6240
+ egret . Matrix . release ( displayMatrix ) ;
6241
+ return drawCalls ;
6198
6242
}
6199
- renderBufferPool . push ( displayBuffer ) ;
6200
- egret . sys . Region . release ( region ) ;
6201
- egret . Matrix . release ( displayMatrix ) ;
6202
- return drawCalls ;
6203
6243
} ;
6204
6244
/**
6205
6245
* @private
@@ -6351,7 +6391,6 @@ var egret;
6351
6391
}
6352
6392
buffer . transform ( 1 , 0 , 0 , 1 , - node . x , - node . y ) ;
6353
6393
}
6354
- buffer . $drawWebGL ( ) ;
6355
6394
node . dirtyRender = false ;
6356
6395
} ;
6357
6396
/**
@@ -6390,7 +6429,6 @@ var egret;
6390
6429
}
6391
6430
buffer . transform ( 1 , 0 , 0 , 1 , - node . x , - node . y ) ;
6392
6431
}
6393
- buffer . $drawWebGL ( ) ;
6394
6432
node . dirtyRender = false ;
6395
6433
} ;
6396
6434
p . renderGroup = function ( groupNode , buffer ) {
0 commit comments