Skip to content

Commit 25630f2

Browse files
committed
Static Tilemap Culling added
1 parent 7e957d5 commit 25630f2

3 files changed

Lines changed: 61 additions & 1 deletion

File tree

v3/src/camera/Camera.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ var Camera = new Class({
7070
centerToSize: require('./components/CenterToSize'),
7171
cull: require('./components/Cull'),
7272
cullHitTest: require('./components/CullHitTest'),
73+
cullTilemap: require('./components/CullTilemap'),
7374
destroy: require('./components/Destroy'),
7475
fade: require('./components/Fade'),
7576
flash: require('./components/Flash'),
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
var CullTilemap = function (tilemap)
2+
{
3+
var cameraMatrix = this.matrix.matrix;
4+
5+
var mva = cameraMatrix[0];
6+
var mvb = cameraMatrix[1];
7+
var mvc = cameraMatrix[2];
8+
var mvd = cameraMatrix[3];
9+
10+
/* First Invert Matrix */
11+
var determinant = (mva * mvd) - (mvb * mvc);
12+
13+
if (!determinant)
14+
{
15+
return tiles;
16+
}
17+
18+
var mve = cameraMatrix[4];
19+
var mvf = cameraMatrix[5];
20+
var tiles = tilemap.tiles;
21+
var scrollX = this.scrollX;
22+
var scrollY = this.scrollY;
23+
var cameraW = this.width;
24+
var cameraH = this.height;
25+
var culledObjects = this.culledObjects;
26+
var length = tiles.length;
27+
var tileW = tilemap.tileWidth;
28+
var tileH = tilemap.tileHeight;
29+
var cullW = cameraW + tileW;
30+
var cullH = cameraH + tileH;
31+
var scrollFactorX = tilemap.scrollFactorX;
32+
var scrollFactorY = tilemap.scrollFactorY;
33+
34+
determinant = 1 / determinant;
35+
36+
culledObjects.length = 0;
37+
38+
for (var index = 0; index < length; ++index)
39+
{
40+
var tile = tiles[index];
41+
var tileX = (tile.x - (scrollX * scrollFactorX));
42+
var tileY = (tile.y - (scrollY * scrollFactorY));
43+
var tx = (tileX * mva + tileY * mvc + mve);
44+
var ty = (tileX * mvb + tileY * mvd + mvf);
45+
var tw = ((tileX + tileW) * mva + (tileY + tileH) * mvc + mve);
46+
var th = ((tileX + tileW) * mvb + (tileY + tileH) * mvd + mvf);
47+
48+
if (tx > -tileW && ty > -tileH && tw < cullW && th < cullH)
49+
{
50+
culledObjects.push(tile);
51+
}
52+
}
53+
54+
return culledObjects;
55+
};
56+
57+
module.exports = CullTilemap;

v3/src/gameobjects/tilemap/static/StaticTilemapCanvasRenderer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var StaticTilemapCanvasRenderer = function (renderer, gameObject, interpolationP
77

88
gameObject.upload(camera);
99

10-
var tiles = gameObject.tiles;
10+
var tiles = camera.cullTilemap(gameObject);
1111
var tileWidth = gameObject.tileWidth;
1212
var tileHeight = gameObject.tileHeight;
1313
var frame = gameObject.frame;
@@ -16,6 +16,8 @@ var StaticTilemapCanvasRenderer = function (renderer, gameObject, interpolationP
1616
var image = frame.source.image;
1717
var tx = gameObject.x - camera.scrollX * gameObject.scrollFactorX;
1818
var ty = gameObject.y - camera.scrollY * gameObject.scrollFactorY;
19+
var boundsX = camera.scrollX;
20+
1921
ctx.save();
2022
ctx.translate(tx, ty);
2123
ctx.rotate(gameObject.rotation);

0 commit comments

Comments
 (0)