Index: sky/examples/game/lib/sprite_box.dart |
diff --git a/sky/examples/game/lib/sprite_box.dart b/sky/examples/game/lib/sprite_box.dart |
index 7c95ee79d9066d2f80aaf437f2211e518fe1f458..59311f6d749a5ac5277443830f90ce5bda559879 100644 |
--- a/sky/examples/game/lib/sprite_box.dart |
+++ b/sky/examples/game/lib/sprite_box.dart |
@@ -19,11 +19,17 @@ class SpriteBox extends RenderBox { |
// Tracking of frame rate and updates |
double _lastTimeStamp; |
int _numFrames = 0; |
+ double _frameRate = 0.0; |
+ // Transformation mode |
SpriteBoxTransformMode transformMode; |
double _systemWidth; |
double _systemHeight; |
+ // Cached transformation matrix |
+ Matrix4 _transformMatrix; |
+ bool _transformMatrixIsDirty; |
+ |
// Setup |
SpriteBox(Node rootNode, [SpriteBoxTransformMode mode = SpriteBoxTransformMode.nativePoints, double width=1024.0, double height=1024.0]) { |
@@ -41,6 +47,8 @@ class SpriteBox extends RenderBox { |
_systemWidth = width; |
_systemHeight = height; |
+ _transformMatrixIsDirty = true; |
+ |
_scheduleTick(); |
} |
@@ -60,6 +68,8 @@ class SpriteBox extends RenderBox { |
void performLayout() { |
size = constraints.constrain(Size.infinite); |
+ _transformMatrixIsDirty = true; |
+ _callSpriteBoxPerformedLayout(_rootNode); |
} |
// Event handling |
@@ -69,8 +79,15 @@ class SpriteBox extends RenderBox { |
// Rendering |
- void paint(RenderObjectDisplayList canvas) { |
- // Move to correct coordinate space before drawing |
+ Matrix4 get transformMatrix { |
+ // Get cached matrix if available |
+ if (!_transformMatrixIsDirty && _transformMatrix != null) { |
+ return _transformMatrix; |
+ } |
+ |
+ _transformMatrix = new Matrix4.identity(); |
+ |
+ // Calculate matrix |
double scaleX = 1.0; |
double scaleY = 1.0; |
double offsetX = 0.0; |
@@ -122,10 +139,17 @@ class SpriteBox extends RenderBox { |
break; |
} |
+ _transformMatrix.translate(offsetX, offsetY); |
+ _transformMatrix.scale(scaleX, scaleY); |
+ |
+ return _transformMatrix; |
+ } |
+ |
+ void paint(RenderObjectDisplayList canvas) { |
canvas.save(); |
- canvas.translate(offsetX, offsetY); |
- canvas.scale(scaleX, scaleY); |
+ // Move to correct coordinate space before drawing |
+ canvas.concat(transformMatrix.storage); |
// Draw the sprite tree |
_rootNode.visit(canvas); |
@@ -151,13 +175,31 @@ class SpriteBox extends RenderBox { |
// Count the number of frames we've been running |
_numFrames += 1; |
+ _frameRate = 1.0/delta; |
+ |
// Print frame rate |
- if (_numFrames % 60 == 0) print("delta: ${delta} fps: ${1.0/delta}"); |
+ if (_numFrames % 60 == 0) print("delta: $delta fps: $_frameRate"); |
- _rootNode.update(delta); |
+ _callUpdate(_rootNode, delta); |
_scheduleTick(); |
} |
+ void _callUpdate(Node node, double dt) { |
+ node.update(dt); |
+ for (Node child in node.children) { |
+ if (!child.paused) { |
+ _callUpdate(child, dt); |
+ } |
+ } |
+ } |
+ |
+ void _callSpriteBoxPerformedLayout(Node node) { |
+ node.spriteBoxPerformedLayout(); |
+ for (Node child in node.children) { |
+ _callSpriteBoxPerformedLayout(child); |
+ } |
+ } |
+ |
// Hit tests |
List<Node> findNodesAtPosition(Point position) { |