/* File: TextureRenderable_PixelCollision.js
*
* Implements the pixelTouches() and related supporting functions of TextureRenderable
*/
/*jslint node: true, vars: true */
/*global gEngine, TextureRenderable, vec2 */
/* find out more about jslint: http://www.jslint.com/help.html */
"use strict"; // Operate in Strict mode such that variables must be declared before used!
/**
* Implements the pixelTouches() and related supporting functions of TextureRenderable
* @class TextureRenderable
* @param {TextureRenderable} other to check for collision with
* @param {vec2} wcTouchPos world coordinate position of first collision
* @returns {Boolean} true if collision is detected
*/
TextureRenderable.prototype.pixelTouches = function(other, wcTouchPos) {
var pixelTouch = false;
var xIndex = 0, yIndex;
var otherIndex = [0, 0];
var xDir = [1, 0];
var yDir = [0, 1];
var otherXDir = [1, 0];
var otherYDir = [0, 1];
vec2.rotate(xDir, xDir, this.mXform.getRotationInRad());
vec2.rotate(yDir, yDir, this.mXform.getRotationInRad());
vec2.rotate(otherXDir, otherXDir, other.mXform.getRotationInRad());
vec2.rotate(otherYDir, otherYDir, other.mXform.getRotationInRad());
while ((!pixelTouch) && (xIndex < this.mTexWidth)) {
yIndex = 0;
while ((!pixelTouch) && (yIndex < this.mTexHeight)) {
if (this._pixelAlphaValue(xIndex, yIndex) > 0) {
this._indexToWCPosition(wcTouchPos, xIndex, yIndex, xDir, yDir);
other._wcPositionToIndex(otherIndex, wcTouchPos, otherXDir, otherYDir);
if ((otherIndex[0] >= 0) && (otherIndex[0] < other.mTexWidth) &&
(otherIndex[1] >= 0) && (otherIndex[1] < other.mTexHeight)) {
pixelTouch = other._pixelAlphaValue(otherIndex[0], otherIndex[1]) > 0;
}
}
yIndex++;
}
xIndex++;
}
return pixelTouch;
};
/**
* Get the color array from the GPU and set it to the renderables Color Array
* @memberOf TextureRenderable
* @returns {void}
*/
TextureRenderable.prototype.setColorArray = function () {
if (this.mColorArray === null) {
this.mColorArray = gEngine.Textures.getColorArray(this.mTexture);
}
};
TextureRenderable.prototype._pixelAlphaValue = function (x, y) {
y += this.mTexBottomIndex;
x += this.mTexLeftIndex;
x = x * 4;
y = y * 4;
return this.mColorArray[(y * this.mTextureInfo.mWidth) + x + 3];
};
TextureRenderable.prototype._wcPositionToIndex = function (returnIndex, wcPos, xDir, yDir) {
// use wcPos to compute the corresponding returnIndex[0 and 1]
var delta = [];
vec2.sub(delta, wcPos, this.mXform.getPosition());
var xDisp = vec2.dot(delta, xDir);
var yDisp = vec2.dot(delta, yDir);
returnIndex[0] = this.mTexWidth * (xDisp / this.mXform.getWidth());
returnIndex[1] = this.mTexHeight * (yDisp / this.mXform.getHeight());
// recall that xForm.getPosition() returns center, yet
// Texture origin is at lower-left corner!
returnIndex[0] += this.mTexWidth / 2;
returnIndex[1] += this.mTexHeight / 2;
returnIndex[0] = Math.floor(returnIndex[0]);
returnIndex[1] = Math.floor(returnIndex[1]);
};
TextureRenderable.prototype._indexToWCPosition = function (returnWCPos, i, j, xDir, yDir) {
var x = i * this.mXform.getWidth() / this.mTexWidth;
var y = j * this.mXform.getHeight() / this.mTexHeight;
var xDisp = x - (this.mXform.getWidth() * 0.5);
var yDisp = y - (this.mXform.getHeight() * 0.5);
var xDirDisp = [];
var yDirDisp = [];
vec2.scale(xDirDisp, xDir, xDisp);
vec2.scale(yDirDisp, yDir, yDisp);
vec2.add(returnWCPos, this.mXform.getPosition(), xDirDisp);
vec2.add(returnWCPos, returnWCPos, yDirDisp);
};
//--- end of Public Methods
//</editor-fold>