Skip to content

Commit 9691572

Browse files
committed
Merge pull request #525 from starwed/viewport-cleaner
Viewport refactoring (round 1)
2 parents 11db5d4 + d8d58dd commit 9691572

File tree

9 files changed

+713
-697
lines changed

9 files changed

+713
-697
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"src/html.js",
3636
"src/storage.js",
3737
"src/extensions.js",
38+
"src/viewport.js",
3839
"src/device.js",
3940
"src/sprite.js",
4041
"src/canvas.js",

src/DOM.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,8 @@ Crafty.extend({
389389
*/
390390
translate: function (x, y) {
391391
return {
392-
x: (x - Crafty.stage.x + document.body.scrollLeft + document.documentElement.scrollLeft - Crafty.viewport._x)/Crafty.viewport._zoom,
393-
y: (y - Crafty.stage.y + document.body.scrollTop + document.documentElement.scrollTop - Crafty.viewport._y)/Crafty.viewport._zoom
392+
x: (x - Crafty.stage.x + document.body.scrollLeft + document.documentElement.scrollLeft - Crafty.viewport._x)/Crafty.viewport._scale,
393+
y: (y - Crafty.stage.y + document.body.scrollTop + document.documentElement.scrollTop - Crafty.viewport._y)/Crafty.viewport._scale
394394
}
395395
}
396396
}

src/DebugLayer.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Crafty.c("DebugPolygon", {
227227
ctx = Crafty.DebugCanvas.context;
228228
ctx.beginPath();
229229
for (var p in this.polygon.points) {
230-
ctx.lineTo(Crafty.viewport.x + this.map.points[p][0], Crafty.viewport.y + this.map.points[p][1]);
230+
ctx.lineTo(this.map.points[p][0],this.map.points[p][1]);
231231
}
232232
ctx.closePath();
233233

@@ -323,10 +323,8 @@ Crafty.DebugCanvas = {
323323
Crafty.DebugCanvas.context = c.getContext('2d');
324324
Crafty.DebugCanvas._canvas = c;
325325

326-
//Set any existing transformations
327-
var zoom = Crafty.viewport._zoom
328-
if (zoom != 1)
329-
Crafty.DebugCanvas.context.scale(zoom, zoom);
326+
327+
330328
}
331329
//Bind rendering of canvas context (see drawing.js)
332330
Crafty.unbind("RenderScene", Crafty.DebugCanvas.renderScene)
@@ -344,8 +342,12 @@ Crafty.DebugCanvas = {
344342
ctx = Crafty.DebugCanvas.context,
345343
current;
346344

345+
var view = Crafty.viewport;
346+
ctx.setTransform(view._scale, 0, 0, view._scale, view._x, view._y)
347+
347348
ctx.clearRect(rect._x, rect._y, rect._w, rect._h);
348349

350+
349351
//sort the objects by the global Z
350352
//q.sort(zsort);
351353
for (; i < l; i++) {

src/HashMap.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@
9797
obj = results[i];
9898
if (!obj) continue; //skip if deleted
9999
id = obj[0]; //unique ID
100-
100+
obj = obj._mbr || obj
101101
//check if not added to hash and that actually intersects
102-
if (!found[id] && obj.x < rect._x + rect._w && obj._x + obj._w > rect._x &&
103-
obj.y < rect._y + rect._h && obj._h + obj._y > rect._y)
102+
if (!found[id] && obj._x < rect._x + rect._w && obj._x + obj._w > rect._x &&
103+
obj._y < rect._y + rect._h && obj._h + obj._y > rect._y)
104104
found[id] = results[i];
105105
}
106106

src/canvas.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ Crafty.extend({
191191
Crafty.canvas._canvas = c;
192192

193193
//Set any existing transformations
194-
var zoom = Crafty.viewport._zoom
194+
var zoom = Crafty.viewport._scale
195195
if (zoom != 1)
196196
Crafty.canvas.context.scale(zoom, zoom);
197197

src/core.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,8 @@
10371037
if (loops) {
10381038
drawTimeStart = currentTime;
10391039
Crafty.trigger("RenderScene")
1040+
// Post-render cleanup opportunity
1041+
Crafty.trigger("PostRender");
10401042
currentTime = +new Date();
10411043
Crafty.trigger("MeasureRenderTime", currentTime - drawTimeStart);
10421044

src/drawing.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ Crafty.DrawManager = (function () {
337337
/** array of dirty rects on screen */
338338
var dirty_rects = [], changed_objs = [],
339339
/** array of DOMs needed updating */
340-
dom = [],
340+
dom = [],
341+
342+
dirtyViewport = false,
343+
341344

342345
/** recManager: an object for managing dirty rectangles. */
343346
rectManager = {
@@ -413,6 +416,9 @@ Crafty.DrawManager = (function () {
413416

414417
};
415418

419+
Crafty.bind("InvalidateViewport", function(){dirtyViewport=true});
420+
Crafty.bind("PostRender", function(){dirtyViewport=false});
421+
416422
return {
417423
/**@
418424
* #Crafty.DrawManager.total2D
@@ -577,15 +583,21 @@ Crafty.DrawManager = (function () {
577583

578584
renderCanvas: function() {
579585
var l = changed_objs.length;
580-
if (!l) { return; }
586+
if (!l && !dirtyViewport) { return; }
581587

582588
var i = 0, l = changed_objs.length, rect, q,
583589
j, len, obj, ent, ctx = Crafty.canvas.context, DM = Crafty.DrawManager;
590+
584591

592+
if (dirtyViewport){
593+
var view = Crafty.viewport;
594+
ctx.setTransform(view._scale, 0, 0, view._scale, view.x, view.y)
595+
596+
}
585597
//if the amount of changed objects is over 60% of the total objects
586598
//do the naive method redrawing
587599
// TODO: I'm not sure this condition really makes that much sense!
588-
if (l / DM.total2D > 0.6 ) {
600+
if (l / DM.total2D > 0.6 || dirtyViewport) {
589601
DM.drawAll();
590602
rectManager.clean()
591603
return;
@@ -672,6 +684,15 @@ Crafty.DrawManager = (function () {
672684
* @see DOM.draw
673685
*/
674686
renderDOM: function() {
687+
// Adjust the viewport
688+
if (dirtyViewport){
689+
var style = Crafty.stage.inner.style, view = Crafty.viewport;
690+
691+
style.transform = style[Crafty.support.prefix + "Transform"] = "scale(" + view._scale + ", " + view._scale + ")"
692+
style.left = view.x + "px";
693+
style.top = view.y + "px";
694+
style.zIndex = 10;
695+
}
675696

676697
//if no objects have been changed, stop
677698
if (!dom.length) return;

0 commit comments

Comments
 (0)