Add prependRotation, copyRowTo and copyRowFrom (#11698)

Co-authored-by: Aaron Hill <aa1ronham@gmail.com>
This commit is contained in:
Fancy2209 2023-06-30 18:31:08 +00:00 committed by GitHub
parent 1c151a86d6
commit 8f0a43f9d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 120 additions and 1 deletions

View File

@ -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 {
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;
@ -206,6 +274,12 @@ package flash.geom {
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 {
return new Vector3D(_rawData[12], _rawData[13], _rawData[14]);
}
@ -593,6 +667,6 @@ import flash.geom.Orientation3D;
function checkOrientation(orientationStyle:String) {
if (!(orientationStyle == Orientation3D.AXIS_ANGLE || orientationStyle == Orientation3D.EULER_ANGLES || orientationStyle == Orientation3D.QUATERNION)) {
throw new Error("Error #2187: Invalid orientation style " + orientationStyle + ". Value must be one of 'Orientation3D.EULER_ANGLES', 'Orientation3D.AXIS_ANGLE', or 'Orientation3D.QUATERNION'.", 2187);
throw new Error("Error #2187: Invalid orientation style " + orientationStyle + ". Value must be one of 'Orientation3D.EULER_ANGLES', 'Orientation3D.AXIS_ANGLE', or 'Orientation3D.QUATERNION'.", 2187);
}
}

View File

@ -83,6 +83,38 @@
} catch (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);
}
}
}

View File

@ -30,3 +30,11 @@ Column: Vector3D(5, 6, 7) w=8
Column: Vector3D(9, 10, 11) w=12
Column: Vector3D(13, 14, 15) w=16
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

View File

@ -1 +1,6 @@
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))']