obelisk.js
Version:
JavaScript Library for Building Pixel Isometric Element with HTML5 Canvas
135 lines (111 loc) • 4.54 kB
JavaScript
/*jslint node: true*/
'use strict';
var CubeDimension = require('../dimensions/CubeDimension');
var BrickDimension = require('../dimensions/BrickDimension');
var SideXDimension = require('../dimensions/SideXDimension');
var SideYDimension = require('../dimensions/SideYDimension');
var CubeColor = require('../colors/CubeColor');
var SideColor = require('../colors/SideColor');
var Matrix = require('../geom/Matrix');
var PixelObject = require('../display/PixelObject');
var BitmapData = require('../display/BitmapData');
var AbstractPrimitive = require('./AbstractPrimitive');
var Brick = require('./Brick');
var SideX = require('./SideX');
var SideY = require('./SideY');
var Cube, p;
Cube = function (dimension, color, border, useDefaultCanvas) {
this.initialize(dimension, color, border, useDefaultCanvas);
};
p = Cube.prototype = new AbstractPrimitive();
// public properties
// constructor
p.initialize = function (dimension, color, border, useDefaultCanvas) {
this.initRender(dimension, color, border, useDefaultCanvas);
this.initRectangle();
this.initBitmapData();
this.build();
this.renderBitmapDataForCanvas();
return this;
};
// private method
p.initRender = function (dimension, color, border, useDefaultCanvas) {
this.useDefaultCanvas = useDefaultCanvas || false;
this.border = border || border === undefined;
this.dimension = dimension === undefined ? new CubeDimension() : dimension;
this.color = color === undefined ? new CubeColor() : color;
};
p.initRectangle = function () {
this.w = this.dimension.xAxis + this.dimension.yAxis;
this.h = this.dimension.zAxis + (this.dimension.xAxis + this.dimension.yAxis) / 2;
// 22.6 degrees implementation
this.w -= 2;
this.h -= 1;
// the matrix offset between the bitmap and the 3d pixel coordinate ZERO point
this.matrix = new Matrix();
this.matrix.tx = -this.dimension.yAxis + 2;
this.matrix.ty = -this.dimension.zAxis;
};
p.initBitmapData = function () {
this.bitmapData = new BitmapData(this.w, this.h, this.useDefaultCanvas);
};
p.renderBitmapDataForCanvas = function () {
this.canvas = this.bitmapData.canvas;
};
p.build = function () {
var brick, sideX, sideY, poBrick, poX, poY, ctx, bmd, offsetX, offsetY,
i, j, k;
// horizontal layer
brick = new Brick(
new BrickDimension(this.dimension.xAxis, this.dimension.yAxis),
new SideColor(this.color.border, this.color.horizontal),
this.border
);
// left side
sideX = new SideX(
new SideXDimension(this.dimension.xAxis, this.dimension.zAxis),
new SideColor(this.color.border, this.color.left),
this.border
);
// right side
sideY = new SideY(
new SideYDimension(this.dimension.yAxis, this.dimension.zAxis),
new SideColor(this.color.border, this.color.right),
this.border
);
poBrick = new PixelObject(brick);
poX = new PixelObject(sideX);
poY = new PixelObject(sideY);
ctx = this.bitmapData.context;
ctx.drawImage(poBrick.canvas, poBrick.x + this.dimension.yAxis - 2, poBrick.y);
ctx.drawImage(poX.canvas, poX.x, poX.y + this.dimension.zAxis + this.dimension.yAxis / 2 - 1);
ctx.drawImage(poY.canvas, poY.x + this.w - 2, poX.y + this.dimension.zAxis + this.dimension.xAxis / 2 - 1);
// highlight & highlight fix
bmd = new BitmapData(this.w, this.h);
if (this.border) {
offsetX = this.dimension.xAxis - 2;
offsetY = (this.dimension.xAxis + this.dimension.yAxis) / 2 - 2;
//the 2px in bounding without hightlight
for (i = 0; i < this.dimension.xAxis - 2; i += 1) {
bmd.setPixel(offsetX + 1 - i, offsetY - Math.floor(i / 2), this.color.borderHighlight);
}
//the 2px in bounding without hightlight
for (j = 0; j < this.dimension.yAxis - 2; j += 1) {
bmd.setPixel(offsetX + j, offsetY - Math.floor(j / 2), this.color.borderHighlight);
}
for (k = 0; k < this.dimension.zAxis; k += 1) {
bmd.setPixel(offsetX, offsetY + k, this.color.borderHighlight);
}
} else {
for (i = 0; i < this.dimension.zAxis; i += 1) {
bmd.setPixel(this.dimension.xAxis - 2, (this.dimension.xAxis + this.dimension.yAxis) / 2 - 1 + i, this.color.left);
}
}
bmd.context.putImageData(bmd.imageData, 0, 0);
ctx.drawImage(bmd.canvas, 0, 0);
};
// public methods
p.toString = function () {
return '[Cube]';
};
module.exports = Cube;