diff --git a/obelisk.js/obelisk.js-tests.ts b/obelisk.js/obelisk.js-tests.ts
new file mode 100644
index 0000000000..bc706cec8d
--- /dev/null
+++ b/obelisk.js/obelisk.js-tests.ts
@@ -0,0 +1,148 @@
+///
+
+function test_brick() {
+ var canvas = document.getElementById('canvas-demo');
+
+ var point = new obelisk.Point(500, 20);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ var color = new obelisk.SideColor().getByInnerColor(obelisk.ColorPattern.PINK);
+ var dimension = new obelisk.BrickDimension(300, 400);
+ var brick = new obelisk.Brick(dimension, color);
+
+ pixelView.renderObject(brick);
+ var p3D = new obelisk.Point3D(20, 20, 0);
+ pixelView.renderObject(brick, p3D);
+}
+
+function test_cube() {
+ var canvas = document.getElementById('canvas-demo');
+
+ var point = new obelisk.Point(500, 240);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ var dimension = new obelisk.CubeDimension(120, 200, 60);
+ var color = new obelisk.CubeColor().getByHorizontalColor(obelisk.ColorPattern.GRAY);
+ var cube = new obelisk.Cube(dimension, color, false);
+ pixelView.renderObject(cube);
+}
+
+function test_pyramid() {
+ var canvas = document.getElementById('canvas-demo');
+
+ var point = new obelisk.Point(500, 240);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ var dimension = new obelisk.PyramidDimension(120);
+ var color = new obelisk.PyramidColor().getByRightColor(obelisk.ColorPattern.YELLOW);
+ var pyramid = new obelisk.Pyramid(dimension, color);
+ pixelView.renderObject(pyramid);
+}
+
+function test_side() {
+ var canvas = document.getElementById('canvas-demo');
+
+ var point = new obelisk.Point(500, 200);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ var colorX = new obelisk.SideColor().getByInnerColor(obelisk.ColorPattern.PINK);
+ var colorY = new obelisk.SideColor().getByInnerColor(obelisk.ColorPattern.GRASS_GREEN);
+ var dimensionX = new obelisk.SideXDimension(300, 100);
+ var dimensionY = new obelisk.SideYDimension(300, 100);
+ var sideX = new obelisk.SideX(dimensionX, colorX);
+ var sideY = new obelisk.SideY(dimensionY, colorY);
+
+ pixelView.renderObject(sideX);
+
+ var p3DY = new obelisk.Point3D(0, 30, 0);
+ pixelView.renderObject(sideY, p3DY);
+}
+
+function test_slope() {
+ var canvas = document.getElementById('canvas-demo');
+
+ var point = new obelisk.Point(550, 50);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ var colorBrick = new obelisk.SideColor().getByInnerColor(obelisk.ColorPattern.GRAY);
+ var dimension = new obelisk.BrickDimension(150, 400);
+ var brick = new obelisk.Brick(dimension, colorBrick);
+
+ pixelView.renderObject(brick);
+
+ var color = new obelisk.SlopeColor().getByHorizontalColor(obelisk.ColorPattern.GRAY);
+
+ var dimensionNorth = new obelisk.SlopeDimension(50, 40);
+ var dimensionEast = new obelisk.SlopeDimension(40, 50);
+ var dimensionSouth = new obelisk.SlopeDimension(50, 40);
+ var dimensionWest = new obelisk.SlopeDimension(40, 50);
+
+ var slopeNorth = new obelisk.SlopeNorth(dimensionNorth, color, false);
+ var slopeEast = new obelisk.SlopeEast(dimensionEast, color);
+ var slopeSouth = new obelisk.SlopeSouth(dimensionSouth, color);
+ var slopeWest = new obelisk.SlopeWest(dimensionWest, color);
+
+ var p3dNorth = new obelisk.Point3D(50, 50, 0);
+ var p3dEast = new obelisk.Point3D(50, 200, 0);
+ var p3dSouth = new obelisk.Point3D(50, 125, 0);
+ var p3dWest = new obelisk.Point3D(50, 275, 0);
+
+ pixelView.renderObject(slopeNorth, p3dNorth);
+ pixelView.renderObject(slopeSouth, p3dSouth);
+ pixelView.renderObject(slopeEast, p3dEast);
+ pixelView.renderObject(slopeWest, p3dWest);
+
+ pixelView.clear();
+}
+
+function test_gif_rendering() {
+ var WIDTH = 64;
+ var HEIGHT = 28;
+
+ var img = document.getElementById('animation');
+ var ctx = document.createElement('canvas').getContext("2d");
+ var canvas = document.getElementById('canvas-uncle');
+
+ var stack: any[] = [];
+ var size = 8;
+ var point = new obelisk.Point(50, 120);
+ var pixelView = new obelisk.PixelView(canvas, point);
+
+ function draw() {
+ ctx.drawImage(img, 0, 0, WIDTH, HEIGHT);
+ var imgData = ctx.getImageData(0, 0, WIDTH, HEIGHT);
+ pixelView.clear();
+ for (var y = HEIGHT - 1; y >= 0; y--) {
+ for (var x = 0; x < WIDTH - 1; x++) {
+ var pixelColor = obelisk.CanvasTool.getPixel(imgData, x, y);
+ if (pixelColor !== 0xFFFFFF) {
+ var cube: obelisk.Cube;
+ var flag = false;
+ for (var i in stack) {
+ if (stack[i][1] === pixelColor) {
+ cube = stack[i][0];
+ flag = true;
+ break;
+ }
+ }
+ if (!flag) {
+ var fixedColor = obelisk.ColorGeom.applyBrightness(pixelColor, 50);
+ var color = new obelisk.CubeColor().getByHorizontalColor(fixedColor);
+ var dimension = new obelisk.CubeDimension(size, size + 2, size);
+ cube = new obelisk.Cube(dimension, color, false);
+ stack.push([cube, pixelColor]);
+ }
+ var p3d = new obelisk.Point3D(x * (size - 2), 0, (HEIGHT - 1 - y) * (size));
+ pixelView.renderObject(cube, p3d);
+ }
+ }
+ }
+ }
+ window.setInterval(draw, 50);
+
+ var canvasFloor = document.getElementById('canvas-floor');
+ var pixelViewFloor = new obelisk.PixelView(canvasFloor, point);
+ var floorDimension = new obelisk.CubeDimension((size - 2) * (WIDTH + 2), (size - 2) * 9, size);
+ var floor = new obelisk.Cube(floorDimension, new obelisk.CubeColor(), false);
+ pixelViewFloor.renderObject(floor, new obelisk.Point3D(-20, -30, 0));
+}
\ No newline at end of file
diff --git a/obelisk.js/obelisk.js.d.ts b/obelisk.js/obelisk.js.d.ts
new file mode 100644
index 0000000000..32a53ebce2
--- /dev/null
+++ b/obelisk.js/obelisk.js.d.ts
@@ -0,0 +1,228 @@
+// Type definitions for obelisk.js v1.1.0
+// Project: https://github.com/nosir/obelisk.js/
+// Definitions by: Brian Drupieski
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+declare module obelisk {
+
+ export var version: string;
+ export var author: string;
+
+ export class Matrix {
+ constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number);
+
+ a: number;
+ b: number;
+ c: number;
+ d: number;
+ tx: number;
+ ty: number;
+ }
+
+ export class Point {
+ constructor(x?: number, y?: number);
+
+ x: number;
+ y: number;
+ }
+
+ export class Point3D {
+ constructor(x?: number, y?: number, z?: number);
+
+ x: number;
+ y: number;
+ z: number;
+
+ toGlobalCoordinates(offset?: obelisk.Point): obelisk.Point;
+ }
+
+ export class ColorGeom {
+ static get32(color: number): number;
+ static applyBrightness(color: number, brightness: number, highlight?: boolean): number;
+ }
+
+ export class ColorPattern {
+ static GRASS_GREEN: number;
+ static YELLOW: number;
+ static WINE_RED: number;
+ static PINK: number;
+ static PURPLE: number;
+ static BLUE: number;
+ static GRAY: number;
+ static BLACK: number;
+ static FINE_COLORS: number[];
+
+ static getRandomComfortableColor(): number;
+ }
+
+ export class CanvasTool {
+ static getPixel(imageData: ImageData, x: number, y: number): number;
+ }
+
+ export class CanvasManager {
+ static defaultCanvas: HTMLCanvasElement;
+
+ static getDefaultCanvas(): HTMLCanvasElement;
+ static getNewCanvas(): HTMLCanvasElement;
+ }
+
+ export class AbstractColor {
+ constructor();
+
+ inner: number;
+ border: number;
+ borderHighlight: number;
+ left: number;
+ right: number;
+ horizontal: number;
+ leftSlope: number;
+ rightSlope: number;
+ }
+
+ export class CubeColor extends AbstractColor {
+ constructor(border?: number, borderHighlight?: number, left?: number, right?: number, horizontal?: number);
+
+ BRIGHTNESS_GAIN: number;
+
+ getByHorizontalColor(horizontal: number): CubeColor;
+ }
+
+ export class PyramidColor extends AbstractColor {
+ constructor(border?: number, borderHighlight?: number, left?: number, right?: number);
+
+ BRIGHTNESS_GAIN: number;
+
+ getByRightColor(horizontal: number): PyramidColor;
+ }
+
+ export class SideColor extends AbstractColor {
+ constructor(border?: number, inner?: number);
+
+ BRIGHTNESS_GAIN: number;
+
+ getByInnerColor(inner: number): SideColor;
+ }
+
+ export class SlopeColor extends AbstractColor {
+ constructor(border?: number, borderHighlight?: number, left?: number, right?: number, leftSlope?: number, rightSlope?: number);
+
+ BRIGHTNESS_GAIN: number;
+
+ getByHorizontalColor(horizontal: number): SlopeColor;
+ }
+
+ export class AbstractDimension {
+ constructor();
+
+ xAxis: number;
+ yAxis: number;
+ zAxis: number;
+ tall: boolean;
+ }
+
+ export class BrickDimension extends AbstractDimension {
+ constructor(xAxis?: number, yAxis?: number);
+ }
+
+ export class CubeDimension extends AbstractDimension {
+ constructor(xAxis?: number, yAxis?: number, zAxis?: number);
+ }
+
+ export class PyramidDimension extends AbstractDimension {
+ constructor(axis?: number, tall?: boolean);
+ }
+
+ export class SideXDimension extends AbstractDimension {
+ constructor(xAxis?: number, zAxis?: number);
+ }
+
+ export class SideYDimension extends AbstractDimension {
+ constructor(yAxis?: number, zAxis?: number);
+ }
+
+ export class SlopeDimension extends AbstractDimension {
+ constructor(xAxis?: number, yAxis?: number);
+ }
+
+ export class BitmapData {
+ constructor(w: number, h: number, useDefaultCanvas?: boolean);
+
+ imageData: ImageData;
+ canvas: HTMLCanvasElement;
+ context : CanvasRenderingContext2D;
+
+ setPixel(posX: number, posY: number, color: number): void;
+ setPixelByIndex(index: number, color: number): void;
+ checkPixelAvailable(x: number, y: number): boolean;
+ floodFill(posX: number, posY: number, color: number): void;
+ }
+
+ export class PixelObject {
+ constructor(primitive: AbstractPrimitive, point3D?: Point3D);
+
+ x: number;
+ y: number;
+ canvas: HTMLCanvasElement;
+ }
+
+ export class PixelView {
+ constructor(canvas: HTMLCanvasElement, point?: Point);
+
+ canvas: HTMLCanvasElement;
+ context: CanvasRenderingContext2D;
+ point: Point;
+
+ renderObject(primitive: AbstractPrimitive, point3D?: Point3D): void;
+ clear(): void;
+ }
+
+ export class AbstractPrimitive {
+ constructor();
+
+ canvas: HTMLCanvasElement;
+ w: number;
+ h: number;
+ dimension: AbstractDimension;
+ color: AbstractColor;
+ border: boolean;
+ bitmapData: BitmapData;
+ useDefaultCanvas: boolean;
+ matrix: Matrix;
+ }
+
+ export class Brick extends AbstractPrimitive {
+ constructor(dimension?: BrickDimension, color?: SideColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class Cube extends AbstractPrimitive {
+ constructor(dimension?: CubeDimension, color?: CubeColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class Pyramid extends AbstractPrimitive {
+ constructor(dimension?: PyramidDimension, color?: PyramidColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SideX extends AbstractPrimitive {
+ constructor(dimension?: SideXDimension, color?: SideColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SideY extends AbstractPrimitive {
+ constructor(dimension?: SideYDimension, color?: SideColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SlopeEast extends AbstractPrimitive {
+ constructor(dimension?: SlopeDimension, color?: SlopeColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SlopeNorth extends AbstractPrimitive {
+ constructor(dimension?: SlopeDimension, color?: SlopeColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SlopeSouth extends AbstractPrimitive {
+ constructor(dimension?: SlopeDimension, color?: SlopeColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+
+ export class SlopeWest extends AbstractPrimitive {
+ constructor(dimension?: SlopeDimension, color?: SlopeColor, border?: boolean, useDefaultCanvas?: boolean);
+ }
+}
\ No newline at end of file