diff --git a/core/src/avm2/globals/flash/geom/Matrix3D.as b/core/src/avm2/globals/flash/geom/Matrix3D.as index 7de1e1924..2519214be 100644 --- a/core/src/avm2/globals/flash/geom/Matrix3D.as +++ b/core/src/avm2/globals/flash/geom/Matrix3D.as @@ -1,194 +1,188 @@ // Based on the MIT-licensed OpenFL code https://github.com/openfl/openfl/blob/develop/src/openfl/geom/Matrix3D.hx package flash.geom { - public class Matrix3D { + public class Matrix3D { - // The 4x4 matrix data, stored in column-major order - private var _rawData: Vector.; + // The 4x4 matrix data, stored in column-major order + private var _rawData:Vector.; - public function get rawData(): Vector. { + public function get rawData():Vector. { return this._rawData.concat(); } - public function set rawData(value: Vector.): void { + public function set rawData(value:Vector.):void { this._rawData = value.concat(); } - - public function Matrix3D(v:Vector. = null) { - this._rawData = v; - if (this._rawData == null) { - this.identity() - } - } - public function identity():void { - // Note that every 4 elements is a *column*, not a row - this._rawData = new [ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 - ]; - } + public function Matrix3D(v:Vector. = null) { + this._rawData = v; + if (this._rawData == null) { + this.identity(); + } + } - public function appendTranslation(x:Number, y:Number, z:Number):void { - this._rawData[12] += x; - this._rawData[13] += y; - this._rawData[14] += z; - } + public function identity():void { + // Note that every 4 elements is a *column*, not a row + this._rawData = new [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ]; + } - public function appendRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void { - var tx:Number, ty:Number, tz:Number; - tx = ty = tz = 0; + public function appendTranslation(x:Number, y:Number, z:Number):void { + this._rawData[12] += x; + this._rawData[13] += y; + this._rawData[14] += z; + } - if (pivotPoint != null) - { - tx = pivotPoint.x; - ty = pivotPoint.y; - tz = pivotPoint.z; - } - var radian = degrees * Math.PI / 180; - var cos = Math.cos(radian); - var sin = Math.sin(radian); - var x = axis.x; - var y = axis.y; - var z = axis.z; - var x2 = x * x; - var y2 = y * y; - var z2 = z * z; - var ls = x2 + y2 + z2; - if (ls != 0) - { - var l = Math.sqrt(ls); - x /= l; - y /= l; - z /= l; - x2 /= ls; - y2 /= ls; - z2 /= ls; - } - var ccos = 1 - cos; - var m = new Matrix3D(); + public function appendRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void { + var tx:Number, ty:Number, tz:Number; + tx = ty = tz = 0; - var d = m.rawData; - d[0] = x2 + (y2 + z2) * cos; - d[1] = x * y * ccos + z * sin; - d[2] = x * z * ccos - y * sin; - d[4] = x * y * ccos - z * sin; - d[5] = y2 + (x2 + z2) * cos; - d[6] = y * z * ccos + x * sin; - d[8] = x * z * ccos + y * sin; - d[9] = y * z * ccos - x * sin; - d[10] = z2 + (x2 + y2) * cos; - d[12] = (tx * (y2 + z2) - x * (ty * y + tz * z)) * ccos + (ty * z - tz * y) * sin; - d[13] = (ty * (x2 + z2) - y * (tx * x + tz * z)) * ccos + (tz * x - tx * z) * sin; - d[14] = (tz * (x2 + y2) - z * (tx * x + ty * y)) * ccos + (tx * y - ty * x) * sin; + if (pivotPoint != null) { + tx = pivotPoint.x; + ty = pivotPoint.y; + tz = pivotPoint.z; + } + var radian = degrees * Math.PI / 180; + var cos = Math.cos(radian); + var sin = Math.sin(radian); + var x = axis.x; + var y = axis.y; + var z = axis.z; + var x2 = x * x; + var y2 = y * y; + var z2 = z * z; + var ls = x2 + y2 + z2; + if (ls != 0) { + var l = Math.sqrt(ls); + x /= l; + y /= l; + z /= l; + x2 /= ls; + y2 /= ls; + z2 /= ls; + } + var ccos = 1 - cos; + var m = new Matrix3D(); + + var d = m.rawData; + d[0] = x2 + (y2 + z2) * cos; + d[1] = x * y * ccos + z * sin; + d[2] = x * z * ccos - y * sin; + d[4] = x * y * ccos - z * sin; + d[5] = y2 + (x2 + z2) * cos; + d[6] = y * z * ccos + x * sin; + d[8] = x * z * ccos + y * sin; + d[9] = y * z * ccos - x * sin; + d[10] = z2 + (x2 + y2) * cos; + d[12] = (tx * (y2 + z2) - x * (ty * y + tz * z)) * ccos + (ty * z - tz * y) * sin; + d[13] = (ty * (x2 + z2) - y * (tx * x + tz * z)) * ccos + (tz * x - tx * z) * sin; + d[14] = (tz * (x2 + y2) - z * (tx * x + ty * y)) * ccos + (tx * y - ty * x) * sin; m.rawData = d; - this.append(m); - } - - public function copyRawDataFrom(vector:Vector., index:uint = 0, transpose:Boolean = false):void { - if (transpose) - { - this.transpose(); + this.append(m); } - var length = vector.length - index; + public function copyRawDataFrom(vector:Vector., index:uint = 0, transpose:Boolean = false):void { + if (transpose) { + this.transpose(); + } - for (var i = 0; i < length; i ++) - { - this._rawData[i] = vector[i + index]; + var length = vector.length - index; + + for (var i = 0; i < length; i++) { + this._rawData[i] = vector[i + index]; + } + + if (transpose) { + this.transpose(); + } } - if (transpose) - { - this.transpose(); + public function transpose():void { + // Make a copy + var oRawData = this._rawData.concat(); + this._rawData[1] = oRawData[4]; + this._rawData[2] = oRawData[8]; + this._rawData[3] = oRawData[12]; + this._rawData[4] = oRawData[1]; + this._rawData[6] = oRawData[9]; + this._rawData[7] = oRawData[13]; + this._rawData[8] = oRawData[2]; + this._rawData[9] = oRawData[6]; + this._rawData[11] = oRawData[14]; + this._rawData[12] = oRawData[3]; + this._rawData[13] = oRawData[7]; + this._rawData[14] = oRawData[11]; } + public function append(lhs:Matrix3D):void { + var m111:Number = this.rawData[0], + m121:Number = this.rawData[4], + m131:Number = this.rawData[8], + m141:Number = this.rawData[12], + m112:Number = this.rawData[1], + m122:Number = this.rawData[5], + m132:Number = this.rawData[9], + m142:Number = this.rawData[13], + m113:Number = this.rawData[2], + m123:Number = this.rawData[6], + m133:Number = this.rawData[10], + m143:Number = this.rawData[14], + m114:Number = this.rawData[3], + m124:Number = this.rawData[7], + m134:Number = this.rawData[11], + m144:Number = this.rawData[15], + m211:Number = lhs.rawData[0], + m221:Number = lhs.rawData[4], + m231:Number = lhs.rawData[8], + m241:Number = lhs.rawData[12], + m212:Number = lhs.rawData[1], + m222:Number = lhs.rawData[5], + m232:Number = lhs.rawData[9], + m242:Number = lhs.rawData[13], + m213:Number = lhs.rawData[2], + m223:Number = lhs.rawData[6], + m233:Number = lhs.rawData[10], + m243:Number = lhs.rawData[14], + m214:Number = lhs.rawData[3], + m224:Number = lhs.rawData[7], + m234:Number = lhs.rawData[11], + m244:Number = lhs.rawData[15]; + + this._rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; + this._rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; + this._rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; + this._rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; + + this._rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; + this._rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; + this._rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; + this._rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; + + this._rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; + this._rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; + this._rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; + this._rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; + + this._rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; + this._rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; + this._rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; + this._rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; + } + + // Based on https://github.com/openfl/openfl/blob/971a4c9e43b5472fd84d73920a2b7c1b3d8d9257/src/openfl/geom/Matrix3D.hx#L307 + public function appendScale(xScale:Number, yScale:Number, zScale:Number):void { + this.append(new Matrix3D(Vector.([ + xScale, 0.0, 0.0, 0.0, 0.0, yScale, 0.0, 0.0, 0.0, 0.0, zScale, 0.0, 0.0, 0.0, 0.0, 1.0 + ]))); + } + + public function clone():Matrix3D { + return new Matrix3D(this.rawData.concat()); + } + } - - public function transpose():void { - // Make a copy - var oRawData = this._rawData.concat(); - this._rawData[1] = oRawData[4]; - this._rawData[2] = oRawData[8]; - this._rawData[3] = oRawData[12]; - this._rawData[4] = oRawData[1]; - this._rawData[6] = oRawData[9]; - this._rawData[7] = oRawData[13]; - this._rawData[8] = oRawData[2]; - this._rawData[9] = oRawData[6]; - this._rawData[11] = oRawData[14]; - this._rawData[12] = oRawData[3]; - this._rawData[13] = oRawData[7]; - this._rawData[14] = oRawData[11]; - } - public function append(lhs:Matrix3D):void - { - var m111:Number = this.rawData[0], - m121:Number = this.rawData[4], - m131:Number = this.rawData[8], - m141:Number = this.rawData[12], - m112:Number = this.rawData[1], - m122:Number = this.rawData[5], - m132:Number = this.rawData[9], - m142:Number = this.rawData[13], - m113:Number = this.rawData[2], - m123:Number = this.rawData[6], - m133:Number = this.rawData[10], - m143:Number = this.rawData[14], - m114:Number = this.rawData[3], - m124:Number = this.rawData[7], - m134:Number = this.rawData[11], - m144:Number = this.rawData[15], - m211:Number = lhs.rawData[0], - m221:Number = lhs.rawData[4], - m231:Number = lhs.rawData[8], - m241:Number = lhs.rawData[12], - m212:Number = lhs.rawData[1], - m222:Number = lhs.rawData[5], - m232:Number = lhs.rawData[9], - m242:Number = lhs.rawData[13], - m213:Number = lhs.rawData[2], - m223:Number = lhs.rawData[6], - m233:Number = lhs.rawData[10], - m243:Number = lhs.rawData[14], - m214:Number = lhs.rawData[3], - m224:Number = lhs.rawData[7], - m234:Number = lhs.rawData[11], - m244:Number = lhs.rawData[15]; - - this._rawData[0] = m111 * m211 + m112 * m221 + m113 * m231 + m114 * m241; - this._rawData[1] = m111 * m212 + m112 * m222 + m113 * m232 + m114 * m242; - this._rawData[2] = m111 * m213 + m112 * m223 + m113 * m233 + m114 * m243; - this._rawData[3] = m111 * m214 + m112 * m224 + m113 * m234 + m114 * m244; - - this._rawData[4] = m121 * m211 + m122 * m221 + m123 * m231 + m124 * m241; - this._rawData[5] = m121 * m212 + m122 * m222 + m123 * m232 + m124 * m242; - this._rawData[6] = m121 * m213 + m122 * m223 + m123 * m233 + m124 * m243; - this._rawData[7] = m121 * m214 + m122 * m224 + m123 * m234 + m124 * m244; - - this._rawData[8] = m131 * m211 + m132 * m221 + m133 * m231 + m134 * m241; - this._rawData[9] = m131 * m212 + m132 * m222 + m133 * m232 + m134 * m242; - this._rawData[10] = m131 * m213 + m132 * m223 + m133 * m233 + m134 * m243; - this._rawData[11] = m131 * m214 + m132 * m224 + m133 * m234 + m134 * m244; - - this._rawData[12] = m141 * m211 + m142 * m221 + m143 * m231 + m144 * m241; - this._rawData[13] = m141 * m212 + m142 * m222 + m143 * m232 + m144 * m242; - this._rawData[14] = m141 * m213 + m142 * m223 + m143 * m233 + m144 * m243; - this._rawData[15] = m141 * m214 + m142 * m224 + m143 * m234 + m144 * m244; - } - - // Based on https://github.com/openfl/openfl/blob/971a4c9e43b5472fd84d73920a2b7c1b3d8d9257/src/openfl/geom/Matrix3D.hx#L307 - public function appendScale(xScale:Number, yScale:Number, zScale:Number):void { - this.append(new Matrix3D(Vector.([ - xScale, 0.0, 0.0, 0.0, 0.0, yScale, 0.0, 0.0, 0.0, 0.0, zScale, 0.0, 0.0, 0.0, 0.0, 1.0 - ]))); - } - - public function clone():Matrix3D { - return new Matrix3D(this.rawData.concat()); - } - -} } \ No newline at end of file