UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

282 lines (265 loc) 11.1 kB
// 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;