@@ -436,7 +436,12 @@ var StaticTilemapLayer = new Class({
436436 } ,
437437
438438 /**
439- * Upload the tile data to a VBO.
439+ * If the given tileset is dirty, or hasn't been rendered before, this will create a new
440+ * ArrayBuffer object and iterate through all of the tiles, generating batch data for
441+ * each one, storing the final results into a STATIC vertex buffer.
442+ *
443+ * If the tileset isn't dirty, this method simply returns after setting the vertex buffer
444+ * and buffering the data.
440445 *
441446 * @method Phaser.Tilemaps.StaticTilemapLayer#upload
442447 * @since 3.0.0
@@ -448,136 +453,146 @@ var StaticTilemapLayer = new Class({
448453 */
449454 upload : function ( camera , tilesetIndex )
450455 {
456+ var pipeline = this . pipeline ;
457+
451458 var renderer = this . renderer ;
459+
452460 var gl = renderer . gl ;
453461
454- var pipeline = renderer . pipelines . TextureTintPipeline ;
462+ var vertexBuffer = this . vertexBuffer [ tilesetIndex ] ;
463+ var bufferData = this . bufferData [ tilesetIndex ] ;
455464
456- if ( this . dirty [ tilesetIndex ] )
465+ if ( ! this . dirty [ tilesetIndex ] && vertexBuffer )
457466 {
458- var tileset = this . tileset [ tilesetIndex ] ;
459- var mapWidth = this . layer . width ;
460- var mapHeight = this . layer . height ;
461- var width = tileset . image . source [ 0 ] . width ;
462- var height = tileset . image . source [ 0 ] . height ;
463- var mapData = this . layer . data ;
464- var tile ;
465- var row ;
466- var col ;
467- var renderOrder = this . _renderOrder ;
468- var minTileIndex = tileset . firstgid ;
469- var maxTileIndex = tileset . firstgid + tileset . total ;
470-
471- var vertexBuffer = this . vertexBuffer [ tilesetIndex ] ;
472- var bufferData = this . bufferData [ tilesetIndex ] ;
473- var vOffset = - 1 ;
474- var bufferSize = ( mapWidth * mapHeight ) * pipeline . vertexSize * 6 ;
475-
476- this . vertexCount [ tilesetIndex ] = 0 ;
477-
478- if ( bufferData === null )
479- {
480- bufferData = new ArrayBuffer ( bufferSize ) ;
467+ renderer . setVertexBuffer ( vertexBuffer ) ;
481468
482- this . bufferData [ tilesetIndex ] = bufferData ;
469+ pipeline . setAttribPointers ( ) ;
483470
484- this . vertexViewF32 [ tilesetIndex ] = new Float32Array ( bufferData ) ;
485- this . vertexViewU32 [ tilesetIndex ] = new Uint32Array ( bufferData ) ;
486- }
471+ gl . bufferSubData ( gl . ARRAY_BUFFER , 0 , bufferData ) ;
487472
488- if ( renderOrder === 0 )
489- {
490- // right-down
473+ return this ;
474+ }
491475
492- for ( row = 0 ; row < mapHeight ; row ++ )
493- {
494- for ( col = 0 ; col < mapWidth ; col ++ )
495- {
496- tile = mapData [ row ] [ col ] ;
476+ var layer = this . layer ;
477+ var tileset = this . tileset [ tilesetIndex ] ;
478+ var mapWidth = layer . width ;
479+ var mapHeight = layer . height ;
480+ var width = tileset . image . source [ 0 ] . width ;
481+ var height = tileset . image . source [ 0 ] . height ;
482+ var mapData = layer . data ;
483+ var tile ;
484+ var row ;
485+ var col ;
486+ var renderOrder = this . _renderOrder ;
487+ var minTileIndex = tileset . firstgid ;
488+ var maxTileIndex = tileset . firstgid + tileset . total ;
489+ var vOffset = - 1 ;
490+ var bufferSize = ( mapWidth * mapHeight ) * pipeline . vertexSize * 6 ;
491+
492+ this . vertexCount [ tilesetIndex ] = 0 ;
493+
494+ if ( bufferData === null )
495+ {
496+ bufferData = new ArrayBuffer ( bufferSize ) ;
497+
498+ this . bufferData [ tilesetIndex ] = bufferData ;
497499
498- if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
499- {
500- continue ;
501- }
500+ this . vertexViewF32 [ tilesetIndex ] = new Float32Array ( bufferData ) ;
501+ this . vertexViewU32 [ tilesetIndex ] = new Uint32Array ( bufferData ) ;
502+ }
503+
504+ if ( renderOrder === 0 )
505+ {
506+ // right-down
502507
503- vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
508+ for ( row = 0 ; row < mapHeight ; row ++ )
509+ {
510+ for ( col = 0 ; col < mapWidth ; col ++ )
511+ {
512+ tile = mapData [ row ] [ col ] ;
513+
514+ if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
515+ {
516+ continue ;
504517 }
518+
519+ vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
505520 }
506521 }
507- else if ( renderOrder === 1 )
508- {
509- // left-down
522+ }
523+ else if ( renderOrder === 1 )
524+ {
525+ // left-down
510526
511- for ( row = 0 ; row < mapHeight ; row ++ )
527+ for ( row = 0 ; row < mapHeight ; row ++ )
528+ {
529+ for ( col = mapWidth - 1 ; col >= 0 ; col -- )
512530 {
513- for ( col = mapWidth - 1 ; col >= 0 ; col -- )
514- {
515- tile = mapData [ row ] [ col ] ;
531+ tile = mapData [ row ] [ col ] ;
516532
517- if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
518- {
519- continue ;
520- }
521-
522- vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
533+ if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
534+ {
535+ continue ;
523536 }
537+
538+ vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
524539 }
525540 }
526- else if ( renderOrder === 2 )
527- {
528- // right-up
541+ }
542+ else if ( renderOrder === 2 )
543+ {
544+ // right-up
529545
530- for ( row = mapHeight - 1 ; row >= 0 ; row -- )
546+ for ( row = mapHeight - 1 ; row >= 0 ; row -- )
547+ {
548+ for ( col = 0 ; col < mapWidth ; col ++ )
531549 {
532- for ( col = 0 ; col < mapWidth ; col ++ )
533- {
534- tile = mapData [ row ] [ col ] ;
535-
536- if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
537- {
538- continue ;
539- }
550+ tile = mapData [ row ] [ col ] ;
540551
541- vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
552+ if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
553+ {
554+ continue ;
542555 }
556+
557+ vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
543558 }
544559 }
545- else if ( renderOrder === 3 )
546- {
547- // left-up
560+ }
561+ else if ( renderOrder === 3 )
562+ {
563+ // left-up
548564
549- for ( row = mapHeight - 1 ; row >= 0 ; row -- )
565+ for ( row = mapHeight - 1 ; row >= 0 ; row -- )
566+ {
567+ for ( col = mapWidth - 1 ; col >= 0 ; col -- )
550568 {
551- for ( col = mapWidth - 1 ; col >= 0 ; col -- )
552- {
553- tile = mapData [ row ] [ col ] ;
569+ tile = mapData [ row ] [ col ] ;
554570
555- if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
556- {
557- continue ;
558- }
559-
560- vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
571+ if ( ! tile || tile . index < minTileIndex || tile . index > maxTileIndex || ! tile . visible )
572+ {
573+ continue ;
561574 }
575+
576+ vOffset = this . batchTile ( vOffset , tile , tileset , width , height , camera , tilesetIndex ) ;
562577 }
563578 }
579+ }
564580
565- this . dirty [ tilesetIndex ] = false ;
566-
567- if ( vertexBuffer === null )
568- {
569- vertexBuffer = renderer . createVertexBuffer ( bufferData , gl . STATIC_DRAW ) ;
581+ this . dirty [ tilesetIndex ] = false ;
570582
571- this . vertexBuffer [ tilesetIndex ] = vertexBuffer ;
572- }
573- else
574- {
575- renderer . setVertexBuffer ( vertexBuffer ) ;
583+ if ( vertexBuffer === null )
584+ {
585+ vertexBuffer = renderer . createVertexBuffer ( bufferData , gl . STATIC_DRAW ) ;
576586
577- gl . bufferSubData ( gl . ARRAY_BUFFER , 0 , bufferData ) ;
578- }
587+ this . vertexBuffer [ tilesetIndex ] = vertexBuffer ;
579588 }
580589
590+ renderer . setVertexBuffer ( vertexBuffer ) ;
591+
592+ pipeline . setAttribPointers ( ) ;
593+
594+ gl . bufferSubData ( gl . ARRAY_BUFFER , 0 , bufferData ) ;
595+
581596 return this ;
582597 } ,
583598
0 commit comments