Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: sky/examples/game/lib/transform_node.dart

Issue 1180703002: Fixes matrix transformations in sprites (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sky/examples/game/lib/transform_node.dart
diff --git a/sky/examples/game/lib/transform_node.dart b/sky/examples/game/lib/transform_node.dart
deleted file mode 100644
index 07c08b6233dad84ed27b9996cfd719f4421f10a5..0000000000000000000000000000000000000000
--- a/sky/examples/game/lib/transform_node.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-part of sprites;
-
-double degrees2radians(double degrees) => degrees * Math.PI/180.8;
-
-double radians2degrees(double radians) => radians * 180.0/Math.PI;
-
-class TransformNode {
-
- // Member variables
-
- SpriteBox _spriteBox;
- TransformNode _parent;
-
- Vector2 _position;
- double _rotation;
-
- bool _isMatrixDirty;
- Matrix3 _transform;
- Matrix3 _pivotTransform;
-
- double _width;
- double _height;
-
- double _scaleX;
- double _scaleY;
-
- Vector2 _pivot;
-
- bool visible;
-
- double _zPosition;
- int _addedOrder;
- int _childrenLastAddedOrder;
- bool _childrenNeedSorting;
-
- List<TransformNode>_children;
-
- // Constructors
-
- TransformNode() {
- _width = 0.0;
- _height = 0.0;
- _rotation = 0.0;
- _pivot = new Vector2(0.0, 0.0);
- _position = new Vector2(0.0, 0.0);
- _scaleX = _scaleY = 1.0;
- _isMatrixDirty = false;
- _transform = new Matrix3.identity();
- _pivotTransform = new Matrix3.identity();
- _children = [];
- _childrenNeedSorting = false;
- _childrenLastAddedOrder = 0;
- visible = true;
- }
-
- // Property setters and getters
-
- SpriteBox get spriteBox => _spriteBox;
-
- TransformNode get parent => _parent;
-
- double get rotation => _rotation;
-
- void set rotation(double rotation) {
- _rotation = rotation;
- _isMatrixDirty = true;
- }
-
- Vector2 get position => _position;
-
- void set position(Vector2 position) {
- _position = position;
- _isMatrixDirty = true;
- }
-
- double get width => _width;
-
- void set width(double width) {
- _width = width;
- _isMatrixDirty = true;
- }
-
- double get height => _height;
-
- void set height(double height) {
- _height = height;
- _isMatrixDirty = true;
- }
-
- Vector2 get pivot => _pivot;
-
- void set pivot(Vector2 pivot) {
- _pivot = pivot;
- _isMatrixDirty = true;
- }
-
- double get zPosition => _zPosition;
-
- void set zPosition(double zPosition) {
- _zPosition = zPosition;
- if (_parent != null) {
- _parent._childrenNeedSorting = true;
- }
- }
-
- double get scale {
- assert(_scaleX == _scaleY);
- return _scaleX;
- }
-
- void set scale(double scale) {
- _scaleX = _scaleY = scale;
- _isMatrixDirty = true;
- }
-
- List<TransformNode> get children => _children;
-
- // Adding and removing children
-
- void addChild(TransformNode child) {
- assert(child._parent == null);
-
- _childrenNeedSorting = true;
- _children.add(child);
- child._parent = this;
- child._spriteBox = this._spriteBox;
- _childrenLastAddedOrder += 1;
- child._addedOrder = _childrenLastAddedOrder;
- }
-
- void removeChild(TransformNode child) {
- if (_children.remove(child)) {
- child._parent = null;
- child._spriteBox = null;
- }
- }
-
- void removeFromParent() {
- assert(_parent != null);
- _parent.removeFromParent();
- }
-
- void removeAllChildren() {
- for (TransformNode child in _children) {
- child._parent = null;
- child._spriteBox = null;
- }
- _children = [];
- _childrenNeedSorting = false;
- }
-
- // Calculating the transformation matrix
-
- Matrix3 get transformMatrix {
- if (!_isMatrixDirty) {
- return _transform;
- }
-
- Vector2 pivotInPoints = new Vector2(_width * _pivot[0], _height * _pivot[1]);
-
- double cx, sx, cy, sy;
-
- if (_rotation == 0) {
- cx = 1.0;
- sx = 0.0;
- cy = 1.0;
- sy = 0.0;
- }
- else {
- double radiansX = degrees2radians(_rotation);
- double radiansY = degrees2radians(_rotation);
-
- cx = Math.cos(radiansX);
- sx = Math.sin(radiansX);
- cy = Math.cos(radiansY);
- sy = Math.sin(radiansY);
- }
-
- // TODO: Add support for scale
- double scaleX = 1.0;
- double scaleY = 1.0;
-
- // Create transformation matrix for scale, position and rotation
- _transform.setValues(cy * scaleX, sy * scaleX, 0.0,
- -sx * scaleY, cx * scaleY, 0.0,
- _position[0], _position[1], 1.0);
-
- if (_pivot.x != 0 || _pivot.y != 0) {
- _pivotTransform.setValues(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, pivotInPoints[0], pivotInPoints[1], 1.0);
- _transform.multiply(_pivotTransform);
- }
-
- return _transform;
- }
-
- // Rendering
-
- void visit(PictureRecorder canvas) {
- if (!visible) return;
-
- prePaint(canvas);
- paint(canvas);
- visitChildren(canvas);
- postPaint(canvas);
- }
-
- void prePaint(PictureRecorder canvas) {
- canvas.save();
-
- canvas.translate(_position[0], _position[1]);
- canvas.rotate(degrees2radians(_rotation));
- canvas.scale(_scaleX, _scaleY);
- canvas.translate(-_width*_pivot[0], -_height*_pivot[1]);
-
- // TODO: Use transformation matrix instead of individual calls
-// List<double> matrix = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
-// this.transformMatrix.copyIntoArray(matrix);
-// canvas.concat(matrix);
- }
-
- void paint(PictureRecorder canvas) {
-
- }
-
- void visitChildren(PictureRecorder canvas) {
- // Sort children primarily by zPosition, secondarily by added order
- if (_childrenNeedSorting) {
- _children.sort((TransformNode a, TransformNode b) {
- if (a._zPosition == b._zPosition) {
- return b._addedOrder - a._addedOrder;
- }
- else if (a._zPosition > b._zPosition) {
- return 1;
- }
- else {
- return -1;
- }
- });
- _childrenNeedSorting = false;
- }
-
- // Visit each child
- _children.forEach((child) => child.visit(canvas));
- }
-
- void postPaint(PictureRecorder canvas) {
- canvas.restore();
- }
-
- // Receiving update calls
-
- void update(double dt) {
-
- }
-}

Powered by Google App Engine
This is Rietveld 408576698