Optimize WRot negation.

The conjugate of a quaternion just negates the x/y/z components, so
there is no need to recalculate from scratch and throw away precision
by forcing a quat->euler->quat round trip.
This commit is contained in:
Paul Chote
2020-07-18 14:32:17 +01:00
committed by reaperrr
parent f67f8ed05e
commit 70a86bed7a

View File

@@ -69,13 +69,24 @@ namespace OpenRA
Yaw = -WAngle.ArcTan(sycp, cycp);
}
WRot(int x, int y, int z, int w, WAngle roll, WAngle pitch, WAngle yaw)
{
this.x = x;
this.y = y;
this.z = z;
this.w = w;
Roll = roll;
Pitch = pitch;
Yaw = yaw;
}
public static readonly WRot None = new WRot(WAngle.Zero, WAngle.Zero, WAngle.Zero);
public static WRot FromFacing(int facing) { return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)); }
public static WRot FromYaw(WAngle yaw) { return new WRot(WAngle.Zero, WAngle.Zero, yaw); }
public static WRot operator +(WRot a, WRot b) { return new WRot(a.Roll + b.Roll, a.Pitch + b.Pitch, a.Yaw + b.Yaw); }
public static WRot operator -(WRot a, WRot b) { return new WRot(a.Roll - b.Roll, a.Pitch - b.Pitch, a.Yaw - b.Yaw); }
public static WRot operator -(WRot a) { return new WRot(-a.Roll, -a.Pitch, -a.Yaw); }
public static WRot operator -(WRot a) { return new WRot(-a.x, -a.y, -a.z, a.w, -a.Roll, -a.Pitch, -a.Yaw); }
public WRot Rotate(WRot rot)
{