Index: sky/examples/game/lib/node.dart |
diff --git a/sky/examples/game/lib/node.dart b/sky/examples/game/lib/node.dart |
index 1db9cf20463f9dd80c28b04b798a182f3c9343bf..753ed972e4f1027c02d038f633ecac56cd3ee121 100644 |
--- a/sky/examples/game/lib/node.dart |
+++ b/sky/examples/game/lib/node.dart |
@@ -13,10 +13,10 @@ class Node { |
Point _position; |
double _rotation; |
- |
- bool _isMatrixDirty; |
+ |
Matrix4 _transformMatrix; |
- Matrix4 _transformMatrixFromWorld; |
+ Matrix4 _transformMatrixNodeToBox; |
+ Matrix4 _transformMatrixBoxToNode; |
double _scaleX; |
double _scaleY; |
@@ -30,6 +30,10 @@ class Node { |
bool paused = false; |
+ bool _userInteractionEnabled = false; |
+ bool handleMultiplePointers = false; |
+ int _handlingPointer; |
+ |
List<Node>_children; |
// Constructors |
@@ -38,7 +42,6 @@ class Node { |
_rotation = 0.0; |
_position = Point.origin; |
_scaleX = _scaleY = 1.0; |
- _isMatrixDirty = false; |
_transformMatrix = new Matrix4.identity(); |
_children = []; |
_childrenNeedSorting = false; |
@@ -56,20 +59,23 @@ class Node { |
double get rotation => _rotation; |
void set rotation(double rotation) { |
+ assert(rotation != null); |
_rotation = rotation; |
- _isMatrixDirty = true; |
+ _invalidateTransformMatrix(); |
} |
Point get position => _position; |
void set position(Point position) { |
+ assert(position != null); |
_position = position; |
- _isMatrixDirty = true; |
+ _invalidateTransformMatrix(); |
} |
double get zPosition => _zPosition; |
void set zPosition(double zPosition) { |
+ assert(zPosition != null); |
_zPosition = zPosition; |
if (_parent != null) { |
_parent._childrenNeedSorting = true; |
@@ -82,8 +88,9 @@ class Node { |
} |
void set scale(double scale) { |
+ assert(scale != null); |
_scaleX = _scaleY = scale; |
- _isMatrixDirty = true; |
+ _invalidateTransformMatrix(); |
} |
List<Node> get children => _children; |
@@ -91,6 +98,7 @@ class Node { |
// Adding and removing children |
void addChild(Node child) { |
+ assert(child != null); |
assert(child._parent == null); |
_childrenNeedSorting = true; |
@@ -99,12 +107,15 @@ class Node { |
child._spriteBox = this._spriteBox; |
_childrenLastAddedOrder += 1; |
child._addedOrder = _childrenLastAddedOrder; |
+ if (_spriteBox != null) _spriteBox._eventTargets = null; |
} |
void removeChild(Node child) { |
+ assert(child != null); |
if (_children.remove(child)) { |
child._parent = null; |
child._spriteBox = null; |
+ if (_spriteBox != null) _spriteBox._eventTargets = null; |
} |
} |
@@ -120,12 +131,13 @@ class Node { |
} |
_children = []; |
_childrenNeedSorting = false; |
+ if (_spriteBox != null) _spriteBox._eventTargets = null; |
} |
// Calculating the transformation matrix |
Matrix4 get transformMatrix { |
- if (!_isMatrixDirty) { |
+ if (_transformMatrix != null) { |
return _transformMatrix; |
} |
@@ -148,42 +160,58 @@ class Node { |
} |
// Create transformation matrix for scale, position and rotation |
- _transformMatrix.setValues(cy * _scaleX, sy * _scaleX, 0.0, 0.0, |
+ _transformMatrix = new Matrix4(cy * _scaleX, sy * _scaleX, 0.0, 0.0, |
-sx * _scaleY, cx * _scaleY, 0.0, 0.0, |
0.0, 0.0, 1.0, 0.0, |
- _position.x, _position.y, 0.0, 1.0 |
- ); |
+ _position.x, _position.y, 0.0, 1.0); |
return _transformMatrix; |
} |
+ void _invalidateTransformMatrix() { |
+ _transformMatrix = null; |
+ _invalidateToBoxTransformMatrix(); |
+ } |
+ |
+ void _invalidateToBoxTransformMatrix () { |
+ _transformMatrixNodeToBox = null; |
+ _transformMatrixBoxToNode = null; |
+ |
+ for (Node child in children) { |
+ child._invalidateToBoxTransformMatrix(); |
+ } |
+ } |
+ |
// Transforms to other nodes |
Matrix4 _nodeToBoxMatrix() { |
assert(_spriteBox != null); |
- |
- Matrix4 t = transformMatrix; |
- |
- // Apply transforms from parents |
- Node p = this.parent; |
- while (p != null) { |
- t = new Matrix4.copy(p.transformMatrix).multiply(t); |
- p = p.parent; |
+ if (_transformMatrixNodeToBox != null) { |
+ return _transformMatrixNodeToBox; |
} |
- // Apply transform from sprite box |
- t = new Matrix4.copy(_spriteBox.transformMatrix).multiply(t); |
- |
- return t; |
+ if (_parent == null) { |
+ // Base case, we are at the top |
+ assert(this == _spriteBox.rootNode); |
+ _transformMatrixNodeToBox = new Matrix4.copy(_spriteBox.transformMatrix).multiply(transformMatrix); |
+ } |
+ else { |
+ _transformMatrixNodeToBox = new Matrix4.copy(_parent._nodeToBoxMatrix()).multiply(transformMatrix); |
+ } |
+ return _transformMatrixNodeToBox; |
} |
Matrix4 _boxToNodeMatrix() { |
assert(_spriteBox != null); |
- Matrix4 t = _nodeToBoxMatrix(); |
- t.invert(); |
+ if (_transformMatrixBoxToNode != null) { |
+ return _transformMatrixBoxToNode; |
+ } |
+ |
+ _transformMatrixBoxToNode = new Matrix4.copy(_nodeToBoxMatrix()); |
+ _transformMatrixBoxToNode.invert(); |
- return t; |
+ return _transformMatrixBoxToNode; |
} |
Point convertPointToNodeSpace(Point boxPoint) { |
@@ -225,6 +253,7 @@ class Node { |
// Rendering |
void visit(PictureRecorder canvas) { |
+ assert(canvas != null); |
if (!visible) return; |
prePaint(canvas); |
@@ -241,7 +270,6 @@ class Node { |
} |
void paint(PictureRecorder canvas) { |
- |
} |
void visitChildren(PictureRecorder canvas) { |
@@ -276,4 +304,17 @@ class Node { |
void spriteBoxPerformedLayout() { |
} |
+ |
+ // Handling user interaction |
+ |
+ bool get userInteractionEnabled => _userInteractionEnabled; |
+ |
+ void set userInteractionEnabled(bool userInteractionEnabled) { |
+ _userInteractionEnabled = userInteractionEnabled; |
+ if (_spriteBox != null) _spriteBox._eventTargets = null; |
+ } |
+ |
+ bool handleEvent(SpriteBoxEvent event) { |
+ return false; |
+ } |
} |