Add prependRotation, copyRowTo and copyRowFrom (#11698)
Co-authored-by: Aaron Hill <aa1ronham@gmail.com>
This commit is contained in:
parent
1c151a86d6
commit
8f0a43f9d9
|
@ -106,6 +106,74 @@ package flash.geom {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Based on https://github.com/openfl/openfl/blob/develop/src/openfl/geom/Matrix3D.hx#L542C1-L573
|
||||||
|
public function copyRowTo(row:uint, vector3D:Vector3D):void {
|
||||||
|
if (row > 3) {
|
||||||
|
throw new ArgumentError("Error #2004: One of the parameters is invalid.", 2004);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (row) {
|
||||||
|
case 0:
|
||||||
|
vector3D.x = rawData[0];
|
||||||
|
vector3D.y = rawData[4];
|
||||||
|
vector3D.z = rawData[8];
|
||||||
|
vector3D.w = rawData[12];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
vector3D.x = rawData[1];
|
||||||
|
vector3D.y = rawData[5];
|
||||||
|
vector3D.z = rawData[9];
|
||||||
|
vector3D.w = rawData[13];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
vector3D.x = rawData[2];
|
||||||
|
vector3D.y = rawData[6];
|
||||||
|
vector3D.z = rawData[10];
|
||||||
|
vector3D.w = rawData[14];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
vector3D.x = rawData[3];
|
||||||
|
vector3D.y = rawData[7];
|
||||||
|
vector3D.z = rawData[11];
|
||||||
|
vector3D.w = rawData[15];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Based on https://github.com/openfl/openfl/blob/develop/src/openfl/geom/Matrix3D.hx#L504-L534
|
||||||
|
public function copyRowFrom(row:uint, vector3D:Vector3D):void {
|
||||||
|
if (row > 3) {
|
||||||
|
throw new ArgumentError("Error #2004: One of the parameters is invalid.", 2004);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (row) {
|
||||||
|
case 0:
|
||||||
|
_rawData[0] = vector3D.x;
|
||||||
|
_rawData[4] = vector3D.y;
|
||||||
|
_rawData[8] = vector3D.z;
|
||||||
|
_rawData[12] = vector3D.w;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
_rawData[1] = vector3D.x;
|
||||||
|
_rawData[5] = vector3D.y;
|
||||||
|
_rawData[9] = vector3D.z;
|
||||||
|
_rawData[13] = vector3D.w;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
_rawData[2] = vector3D.x;
|
||||||
|
_rawData[6] = vector3D.y;
|
||||||
|
_rawData[10] = vector3D.z;
|
||||||
|
_rawData[14] = vector3D.w;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
_rawData[3] = vector3D.x;
|
||||||
|
_rawData[7] = vector3D.y;
|
||||||
|
_rawData[11] = vector3D.z;
|
||||||
|
_rawData[15] = vector3D.w;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function deltaTransformVector(v:Vector3D):Vector3D {
|
public function deltaTransformVector(v:Vector3D):Vector3D {
|
||||||
var x:Number = this._rawData[0] * v.x + this._rawData[4] * v.y + this._rawData[8] * v.z;
|
var x:Number = this._rawData[0] * v.x + this._rawData[4] * v.y + this._rawData[8] * v.z;
|
||||||
var y:Number = this._rawData[1] * v.x + this._rawData[5] * v.y + this._rawData[9] * v.z;
|
var y:Number = this._rawData[1] * v.x + this._rawData[5] * v.y + this._rawData[9] * v.z;
|
||||||
|
@ -206,6 +274,12 @@ package flash.geom {
|
||||||
this.prepend(m);
|
this.prepend(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function prependRotation(degrees:Number, axis:Vector3D, pivotPoint:Vector3D = null):void {
|
||||||
|
var m = new Matrix3D();
|
||||||
|
m.appendRotation(degrees, axis, pivotPoint);
|
||||||
|
this.prepend(m);
|
||||||
|
}
|
||||||
|
|
||||||
public function get position():Vector3D {
|
public function get position():Vector3D {
|
||||||
return new Vector3D(_rawData[12], _rawData[13], _rawData[14]);
|
return new Vector3D(_rawData[12], _rawData[13], _rawData[14]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,6 +83,38 @@
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
trace("Column 4: " + e);
|
trace("Column 4: " + e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var row = new Vector3D();
|
||||||
|
for each (var i in [0, 1, 2, 3]) {
|
||||||
|
newMat.copyRowTo(i, row);
|
||||||
|
trace("Row: " + row + " w=" + row.w);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
newMat.copyRowTo(4, row);
|
||||||
|
} catch (e) {
|
||||||
|
trace("Row 4: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
var row0 = new Vector3D(100, 200, 300, 400);
|
||||||
|
var row1 = new Vector3D(500, 600, 700, 800);
|
||||||
|
var row2 = new Vector3D(900, 1000, 1100, 1200);
|
||||||
|
var row3 = new Vector3D(1300, 1400, 1500, 1600);
|
||||||
|
|
||||||
|
newMat.copyRowFrom(0, row0);
|
||||||
|
newMat.copyRowFrom(1, row1);
|
||||||
|
newMat.copyRowFrom(2, row2);
|
||||||
|
newMat.copyRowFrom(3, row3);
|
||||||
|
|
||||||
|
try {
|
||||||
|
newMat.copyRowFrom(4, row3)
|
||||||
|
} catch (e) {
|
||||||
|
trace("Copy from row 4: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
trace("After row copies: " + newMat.rawData);
|
||||||
|
|
||||||
|
newMat.prependRotation(90, Vector3D.X_AXIS);
|
||||||
|
trace("After prependRotation: " + newMat.rawData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -30,3 +30,11 @@ Column: Vector3D(5, 6, 7) w=8
|
||||||
Column: Vector3D(9, 10, 11) w=12
|
Column: Vector3D(9, 10, 11) w=12
|
||||||
Column: Vector3D(13, 14, 15) w=16
|
Column: Vector3D(13, 14, 15) w=16
|
||||||
Column 4: ArgumentError: Error #2004: One of the parameters is invalid.
|
Column 4: ArgumentError: Error #2004: One of the parameters is invalid.
|
||||||
|
Row: Vector3D(1, 5, 9) w=13
|
||||||
|
Row: Vector3D(2, 6, 10) w=14
|
||||||
|
Row: Vector3D(3, 7, 11) w=15
|
||||||
|
Row: Vector3D(4, 8, 12) w=16
|
||||||
|
Row 4: ArgumentError: Error #2004: One of the parameters is invalid.
|
||||||
|
Copy from row 4: ArgumentError: Error #2004: One of the parameters is invalid.
|
||||||
|
After row copies: 100,500,900,1300,200,600,1000,1400,300,700,1100,1500,400,800,1200,1600
|
||||||
|
After prependRotation: 100,500,900,1300,300,700,1100,1500,-200,-600,-1000,-1400,400,800,1200,1600
|
||||||
|
|
Binary file not shown.
|
@ -1 +1,6 @@
|
||||||
num_frames = 1
|
num_frames = 1
|
||||||
|
|
||||||
|
[approximations]
|
||||||
|
epsilon = 0.001
|
||||||
|
# Based on https://stackoverflow.com/questions/12643009/regular-expression-for-floating-point-numbers#comment101152072_12643009
|
||||||
|
number_patterns = ['([-+]?(?:[0-9]*[.])?[0-9]+(?:[eE][-+]?\d+)?|(?:NaN))']
|
Loading…
Reference in New Issue