Merge pull request #443 from vlidholt/master

First pass on sprite 3D node
diff --git a/sky/packages/sky/example/game/lib/node3d.dart b/sky/packages/sky/example/game/lib/node3d.dart
new file mode 100644
index 0000000..d98d471
--- /dev/null
+++ b/sky/packages/sky/example/game/lib/node3d.dart
@@ -0,0 +1,36 @@
+part of sprites;
+
+class Node3D extends Node {
+
+  double _rotationX = 0.0;
+
+  double get rotationX => _rotationX;
+
+  set rotationX(double rotationX) {
+    _rotationX = rotationX;
+    invalidateTransformMatrix();
+  }
+
+  double _rotationY = 0.0;
+
+  double get rotationY => _rotationY;
+
+  set rotationY(double rotationY) {
+    _rotationY = rotationY;
+    invalidateTransformMatrix();
+  }
+
+  Matrix4 computeTransformMatrix() {
+    // Apply normal 2d transforms
+    Matrix4 matrix = super.computeTransformMatrix();
+
+
+    matrix.translate(0.0, 0.0, 500.0);
+
+    // Rotate around x and y axis
+    matrix.rotateY(radians(_rotationY));
+    matrix.rotateX(radians(_rotationX));
+
+    return matrix;
+  }
+}
diff --git a/sky/packages/sky/example/game/lib/sprites.dart b/sky/packages/sky/example/game/lib/sprites.dart
index 1da06b7..c25eace 100644
--- a/sky/packages/sky/example/game/lib/sprites.dart
+++ b/sky/packages/sky/example/game/lib/sprites.dart
@@ -22,6 +22,7 @@
 part 'color_secuence.dart';
 part 'image_map.dart';
 part 'node.dart';
+part 'node3d.dart';
 part 'node_with_size.dart';
 part 'particle_system.dart';
 part 'sprite.dart';