Skip to content

Commit a447d85

Browse files
committed
CullTiles recoded to use Camera worldView - finally, properly culling, regardless of layer scale or camera zoom! Fix phaserjs#3818
1 parent 049f59d commit a447d85

1 file changed

Lines changed: 14 additions & 89 deletions

File tree

src/tilemaps/components/CullTiles.js

Lines changed: 14 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
55
*/
66

7+
var SnapFloor = require('../../math/snap/SnapFloor');
8+
var SnapCeil = require('../../math/snap/SnapCeil');
9+
710
/**
811
* Returns the tiles in the given layer that are within the camera's viewport. This is used
912
* internally.
@@ -24,53 +27,21 @@ var CullTiles = function (layer, camera, outputArray)
2427

2528
outputArray.length = 0;
2629

27-
// var zoom = camera.zoom;
28-
// var originX = camera.width / 2;
29-
// var originY = camera.height / 2;
30-
31-
// var matrix = camera.matrix;
32-
33-
// matrix.applyITRS(camera.x, camera.y, camera.rotation, zoom, zoom);
34-
35-
// camera.matrix.loadIdentity();
36-
// camera.matrix.translate(camera.x + originX, camera.y + originY);
37-
// camera.matrix.rotate(camera.rotation);
38-
// camera.matrix.scale(zoom, zoom);
39-
// camera.matrix.translate(-originX, -originY);
40-
// camera.matrix.invert();
41-
42-
// camera.shakeEffect.preRender();
43-
4430
var tilemapLayer = layer.tilemapLayer;
4531

46-
// var tileW = layer.tileWidth;
47-
// var tileH = layer.tileHeight;
48-
49-
// var cullX = ((camera.scrollX * tilemapLayer.scrollFactorX) - tileW);
50-
// var cullY = ((camera.scrollY * tilemapLayer.scrollFactorY) - tileH);
51-
// var cullW = (cullX + (camera.width + tileW * 2));
52-
// var cullH = (cullY + (camera.height + tileH * 2));
32+
var tileW = Math.floor(layer.tileWidth * tilemapLayer.scaleX);
33+
var tileH = Math.floor(layer.tileHeight * tilemapLayer.scaleY);
5334

5435
var mapData = layer.data;
5536
var mapWidth = layer.width;
5637
var mapHeight = layer.height;
5738

58-
var boundsLeft = camera.worldBounds.left;
59-
var boundsRight = camera.worldBounds.right;
60-
var boundsTop = camera.worldBounds.top;
61-
var boundsBottom = camera.worldBounds.bottom;
62-
63-
// var cameraMatrix = camera.matrix.matrix;
64-
// var a = cameraMatrix[0];
65-
// var b = cameraMatrix[1];
66-
// var c = cameraMatrix[2];
67-
// var d = cameraMatrix[3];
68-
// var e = cameraMatrix[4];
69-
// var f = cameraMatrix[5];
70-
// var tCullX = cullX * a + cullY * c + e;
71-
// var tCullY = cullX * b + cullY * d + f;
72-
// var tCullW = cullW * a + cullH * c + e;
73-
// var tCullH = cullW * b + cullH * d + f;
39+
// Camera world view bounds, snapped for tile size
40+
41+
var boundsLeft = SnapFloor(camera.worldView.x, tileW);
42+
var boundsRight = SnapCeil(camera.worldView.right, tileW);
43+
var boundsTop = SnapFloor(camera.worldView.y, tileH);
44+
var boundsBottom = SnapCeil(camera.worldView.bottom, tileH);
7445

7546
var i = 0;
7647

@@ -85,67 +56,21 @@ var CullTiles = function (layer, camera, outputArray)
8556
continue;
8657
}
8758

88-
var tilePixelX = (tile.pixelX + tilemapLayer.x);
89-
var tilePixelY = (tile.pixelY + tilemapLayer.y);
59+
var tilePixelX = (tile.pixelX + tilemapLayer.x) * tilemapLayer.scaleX;
60+
var tilePixelY = (tile.pixelY + tilemapLayer.y) * tilemapLayer.scaleY;
9061

91-
if (tilePixelX >= boundsLeft && tilePixelX < boundsRight && tilePixelY >= boundsTop && tilePixelY < boundsBottom)
62+
if (tilePixelX >= boundsLeft && tilePixelX + tileW <= boundsRight && tilePixelY >= boundsTop && tilePixelY + tileH <= boundsBottom)
9263
{
9364
outputArray.push(tile);
9465
}
9566

9667
i++;
97-
98-
// var tileX = (tilePixelX * a + tilePixelY * c + e);
99-
// var tileY = (tilePixelX * b + tilePixelY * d + f);
100-
101-
// if (tile.visible &&
102-
// tileX >= tCullX &&
103-
// tileY >= tCullY &&
104-
// tileX + tileW <= tCullW &&
105-
// tileY + tileH <= tCullH
106-
// )
107-
// {
108-
// outputArray.push(tile);
109-
// }
11068
}
11169
}
11270

11371
window.noCull = i;
11472
window.cull = outputArray.length;
11573

116-
/* var tilemapLayer = layer.tilemapLayer;
117-
var mapData = layer.data;
118-
var mapWidth = layer.width;
119-
var mapHeight = layer.height;
120-
var left = (camera.scrollX * camera.zoom * tilemapLayer.scrollFactorX) - tilemapLayer.x;
121-
var top = (camera.scrollY * camera.zoom * tilemapLayer.scrollFactorY) - tilemapLayer.y;
122-
var sx = tilemapLayer.scaleX;
123-
var sy = tilemapLayer.scaleY;
124-
var tileWidth = layer.tileWidth * sx;
125-
var tileHeight = layer.tileHeight * sy;
126-
127-
for (var row = 0; row < mapHeight; ++row)
128-
{
129-
for (var col = 0; col < mapWidth; ++col)
130-
{
131-
var tile = mapData[row][col];
132-
133-
if (tile === null || tile.index === -1) { continue; }
134-
135-
var tileX = tile.pixelX * sx - left;
136-
var tileY = tile.pixelY * sy - top;
137-
var cullW = camera.width + tileWidth;
138-
var cullH = camera.height + tileHeight;
139-
140-
if (tile.visible &&
141-
tileX > -tileWidth && tileY > -tileHeight &&
142-
tileX < cullW && tileY < cullH)
143-
{
144-
outputArray.push(tile);
145-
}
146-
}
147-
} */
148-
14974
return outputArray;
15075
};
15176

0 commit comments

Comments
 (0)