Skip to content

Commit 10c19bd

Browse files
committed
StaticTilemapLayer.upload will now set the vertex attributes and buffer the data, and handles internal checks more efficiently.
1 parent 6e15f6b commit 10c19bd

1 file changed

Lines changed: 109 additions & 94 deletions

File tree

src/tilemaps/staticlayer/StaticTilemapLayer.js

Lines changed: 109 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)