starling-framework
Version:
A fast, productive library for 2D cross-platform development.
282 lines (265 loc) • 11.1 kB
JavaScript
// Class: starling.utils.MatrixUtil
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../hxClasses_stub").default;
var $hxEnums = require("./../../hxEnums_stub").default;
var $import = require("./../../import_stub").default;
function openfl__$Vector_Vector_$Impl_$() {return require("./../../openfl/_Vector/Vector_Impl_");}
function openfl_geom_Vector3D() {return $import(require("openfl/geom/Vector3D"));}
function openfl_geom_Matrix3D() {return $import(require("openfl/geom/Matrix3D"));}
function openfl_geom_Matrix() {return $import(require("openfl/geom/Matrix"));}
function openfl_geom_Point() {return $import(require("openfl/geom/Point"));}
function starling_utils_MathUtil() {return require("./../../starling/utils/MathUtil");}
// Constructor
var MatrixUtil = function(){}
// Meta
MatrixUtil.__name__ = "starling.utils.MatrixUtil";
MatrixUtil.__isInterface__ = false;
MatrixUtil.prototype = {
};
MatrixUtil.prototype.__class__ = MatrixUtil.prototype.constructor = $hxClasses["starling.utils.MatrixUtil"] = MatrixUtil;
// Init
// Statics
MatrixUtil.convertTo3D = function(matrix,out) {
if(out == null) {
out = new (openfl_geom_Matrix3D().default)();
}
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,0,matrix.a);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,1,matrix.b);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,4,matrix.c);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,5,matrix.d);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,12,matrix.tx);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData,13,matrix.ty);
out.copyRawDataFrom(MatrixUtil.sRawData);
return out;
}
MatrixUtil.convertTo2D = function(matrix3D,out) {
if(out == null) {
out = new (openfl_geom_Matrix().default)();
}
matrix3D.copyRawDataTo(MatrixUtil.sRawData2);
out.a = MatrixUtil.sRawData2[0];
out.b = MatrixUtil.sRawData2[1];
out.c = MatrixUtil.sRawData2[4];
out.d = MatrixUtil.sRawData2[5];
out.tx = MatrixUtil.sRawData2[12];
out.ty = MatrixUtil.sRawData2[13];
return out;
}
MatrixUtil.isIdentity = function(matrix) {
if(matrix.a == 1.0 && matrix.b == 0.0 && matrix.c == 0.0 && matrix.d == 1.0 && matrix.tx == 0.0) {
return matrix.ty == 0.0;
} else {
return false;
}
}
MatrixUtil.isIdentity3D = function(matrix) {
var data = MatrixUtil.sRawData2;
matrix.copyRawDataTo(data);
if(data[0] == 1.0 && data[1] == 0.0 && data[2] == 0.0 && data[3] == 0.0 && data[4] == 0.0 && data[5] == 1.0 && data[6] == 0.0 && data[7] == 0.0 && data[8] == 0.0 && data[9] == 0.0 && data[10] == 1.0 && data[11] == 0.0 && data[12] == 0.0 && data[13] == 0.0 && data[14] == 0.0) {
return data[15] == 1.0;
} else {
return false;
}
}
MatrixUtil.transformPoint = function(matrix,point,out) {
return MatrixUtil.transformCoords(matrix,point.x,point.y,out);
}
MatrixUtil.transformPoint3D = function(matrix,point,out) {
return MatrixUtil.transformCoords3D(matrix,point.x,point.y,point.z,out);
}
MatrixUtil.transformCoords = function(matrix,x,y,out) {
if(out == null) {
out = new (openfl_geom_Point().default)();
}
out.x = matrix.a * x + matrix.c * y + matrix.tx;
out.y = matrix.d * y + matrix.b * x + matrix.ty;
return out;
}
MatrixUtil.transformCoords3D = function(matrix,x,y,z,out) {
if(out == null) {
out = new (openfl_geom_Vector3D().default)();
}
matrix.copyRawDataTo(MatrixUtil.sRawData2);
out.x = x * MatrixUtil.sRawData2[0] + y * MatrixUtil.sRawData2[4] + z * MatrixUtil.sRawData2[8] + MatrixUtil.sRawData2[12];
out.y = x * MatrixUtil.sRawData2[1] + y * MatrixUtil.sRawData2[5] + z * MatrixUtil.sRawData2[9] + MatrixUtil.sRawData2[13];
out.z = x * MatrixUtil.sRawData2[2] + y * MatrixUtil.sRawData2[6] + z * MatrixUtil.sRawData2[10] + MatrixUtil.sRawData2[14];
out.w = x * MatrixUtil.sRawData2[3] + y * MatrixUtil.sRawData2[7] + z * MatrixUtil.sRawData2[11] + MatrixUtil.sRawData2[15];
return out;
}
MatrixUtil.skew = function(matrix,skewX,skewY) {
var sinX = Math.sin(skewX);
var cosX = Math.cos(skewX);
var sinY = Math.sin(skewY);
var cosY = Math.cos(skewY);
matrix.setTo(matrix.a * cosY - matrix.b * sinX,matrix.a * sinY + matrix.b * cosX,matrix.c * cosY - matrix.d * sinX,matrix.c * sinY + matrix.d * cosX,matrix.tx * cosY - matrix.ty * sinX,matrix.tx * sinY + matrix.ty * cosX);
}
MatrixUtil.prependMatrix = function(base,prep) {
base.setTo(base.a * prep.a + base.c * prep.b,base.b * prep.a + base.d * prep.b,base.a * prep.c + base.c * prep.d,base.b * prep.c + base.d * prep.d,base.tx + base.a * prep.tx + base.c * prep.ty,base.ty + base.b * prep.tx + base.d * prep.ty);
}
MatrixUtil.prependTranslation = function(matrix,tx,ty) {
matrix.tx += matrix.a * tx + matrix.c * ty;
matrix.ty += matrix.b * tx + matrix.d * ty;
}
MatrixUtil.prependScale = function(matrix,sx,sy) {
matrix.setTo(matrix.a * sx,matrix.b * sx,matrix.c * sy,matrix.d * sy,matrix.tx,matrix.ty);
}
MatrixUtil.prependRotation = function(matrix,angle) {
var sin = Math.sin(angle);
var cos = Math.cos(angle);
matrix.setTo(matrix.a * cos + matrix.c * sin,matrix.b * cos + matrix.d * sin,matrix.c * cos - matrix.a * sin,matrix.d * cos - matrix.b * sin,matrix.tx,matrix.ty);
}
MatrixUtil.prependSkew = function(matrix,skewX,skewY) {
var sinX = Math.sin(skewX);
var cosX = Math.cos(skewX);
var sinY = Math.sin(skewY);
var cosY = Math.cos(skewY);
matrix.setTo(matrix.a * cosY + matrix.c * sinY,matrix.b * cosY + matrix.d * sinY,matrix.c * cosX - matrix.a * sinX,matrix.d * cosX - matrix.b * sinX,matrix.tx,matrix.ty);
}
MatrixUtil.toString3D = function(matrix,transpose,precision) {
if(precision == null) {
precision = 3;
}
if(transpose == null) {
transpose = true;
}
if(transpose) {
matrix.transpose();
}
matrix.copyRawDataTo(MatrixUtil.sRawData2);
if(transpose) {
matrix.transpose();
}
return "[Matrix3D rawData=\n" + MatrixUtil.formatRawData(MatrixUtil.sRawData2,4,4,precision) + "\n]";
}
MatrixUtil.toString = function(matrix,precision) {
if(precision == null) {
precision = 3;
}
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,0,matrix.a);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,1,matrix.c);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,2,matrix.tx);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,3,matrix.b);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,4,matrix.d);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sRawData2,5,matrix.ty);
return "[Matrix rawData=\n" + MatrixUtil.formatRawData(MatrixUtil.sRawData2,3,2,precision) + "\n]";
}
MatrixUtil.formatRawData = function(data,numCols,numRows,precision,indent) {
if(indent == null) {
indent = " ";
}
var result = indent;
var numValues = numCols * numRows;
var highestValue = 0.0;
var valueString;
var value;
var _g = 0;
var _g1 = numValues;
while(_g < _g1) {
var i = _g++;
value = Math.abs(data[i]);
if(value > highestValue) {
highestValue = value;
}
}
var numChars = (starling_utils_MathUtil().default).toFixed(highestValue,precision).length + 1;
var _g2 = 0;
var _g3 = numRows;
while(_g2 < _g3) {
var y = _g2++;
var _g21 = 0;
var _g31 = numCols;
while(_g21 < _g31) {
var x = _g21++;
value = data[numCols * y + x];
valueString = (starling_utils_MathUtil().default).toFixed(value,precision);
while(valueString.length < numChars) valueString = " " + valueString;
result += valueString;
if(x != numCols - 1) {
result += ", ";
}
}
if(y != numRows - 1) {
result += "\n" + indent;
}
}
return result;
}
MatrixUtil.snapToPixels = function(matrix,pixelSize) {
var E = 0.0001;
var doSnap = false;
var aSq;
var bSq;
var cSq;
var dSq;
if(matrix.b + E > 0 && matrix.b - E < 0 && matrix.c + E > 0 && matrix.c - E < 0) {
aSq = matrix.a * matrix.a;
dSq = matrix.d * matrix.d;
doSnap = aSq + E > 1 && aSq - E < 1 && dSq + E > 1 && dSq - E < 1;
} else if(matrix.a + E > 0 && matrix.a - E < 0 && matrix.d + E > 0 && matrix.d - E < 0) {
bSq = matrix.b * matrix.b;
cSq = matrix.c * matrix.c;
doSnap = bSq + E > 1 && bSq - E < 1 && cSq + E > 1 && cSq - E < 1;
}
if(doSnap) {
matrix.tx = Math.round(matrix.tx / pixelSize) * pixelSize;
matrix.ty = Math.round(matrix.ty / pixelSize) * pixelSize;
}
}
MatrixUtil.createPerspectiveProjectionMatrix = function(x,y,width,height,stageWidth,stageHeight,cameraPos,out) {
if(stageHeight == null) {
stageHeight = 0;
}
if(stageWidth == null) {
stageWidth = 0;
}
if(out == null) {
out = new (openfl_geom_Matrix3D().default)();
}
if(stageWidth <= 0) {
stageWidth = width;
}
if(stageHeight <= 0) {
stageHeight = height;
}
if(cameraPos == null) {
cameraPos = MatrixUtil.sPoint3D;
cameraPos.setTo(stageWidth / 2,stageHeight / 2,stageWidth / Math.tan(0.5) * 0.5);
}
var focalLength = Math.abs(cameraPos.z);
var offsetX = cameraPos.x - stageWidth / 2;
var offsetY = cameraPos.y - stageHeight / 2;
var far = focalLength * 20;
var near = 1;
var scaleX = stageWidth / width;
var scaleY = stageHeight / height;
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,0,2 * focalLength / stageWidth);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,5,-2 * focalLength / stageHeight);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,10,far / (far - near));
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,14,-far * near / (far - near));
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,11,1);
var _g = MatrixUtil.sMatrixData;
(openfl__$Vector_Vector_$Impl_$().default).set(_g,0,_g[0] * scaleX);
var _g1 = MatrixUtil.sMatrixData;
(openfl__$Vector_Vector_$Impl_$().default).set(_g1,5,_g1[5] * scaleY);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,8,scaleX - 1 - 2 * scaleX * (x - offsetX) / stageWidth);
(openfl__$Vector_Vector_$Impl_$().default).set(MatrixUtil.sMatrixData,9,-scaleY + 1 + 2 * scaleY * (y - offsetY) / stageHeight);
out.copyRawDataFrom(MatrixUtil.sMatrixData);
out.prependTranslation(-stageWidth / 2.0 - offsetX,-stageHeight / 2.0 - offsetY,focalLength);
return out;
}
MatrixUtil.createOrthographicProjectionMatrix = function(x,y,width,height,out) {
if(out == null) {
out = new (openfl_geom_Matrix().default)();
}
out.setTo(2.0 / width,0,0,-2.0 / height,-(2 * x + width) / width,(2 * y + height) / height);
return out;
}
MatrixUtil.sRawData = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[1.0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])
MatrixUtil.sRawData2 = (openfl__$Vector_Vector_$Impl_$().default)._new(16,true)
MatrixUtil.sPoint3D = new (openfl_geom_Vector3D().default)()
MatrixUtil.sMatrixData = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
// Export
exports.default = MatrixUtil;