1 #include "anglestransform.qh"
3 #ifdef POSITIVE_PITCH_IS_DOWN
4 vector fixedvectoangles(vector a)
11 vector fixedvectoangles2(vector a, vector b)
14 ang = vectoangles2(a, b);
19 void fixedmakevectors(vector a)
21 // a makevectors that actually inverts vectoangles
28 // angles in fixedmakevectors/fixedvectoangles space
29 vector AnglesTransform_Apply(vector transform, vector v)
31 fixedmakevectors(transform);
32 return v_forward * v.x
37 vector AnglesTransform_Multiply(vector t1, vector t2)
39 vector m_forward, m_up;
40 fixedmakevectors(t2); m_forward = v_forward; m_up = v_up;
41 m_forward = AnglesTransform_Apply(t1, m_forward); m_up = AnglesTransform_Apply(t1, m_up);
42 return fixedvectoangles2(m_forward, m_up);
45 vector AnglesTransform_Invert(vector transform)
47 vector i_forward, i_up;
48 fixedmakevectors(transform);
49 // we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
50 // but these are orthogonal unit vectors!
51 // so to invert, we can simply fixedvectoangles the TRANSPOSED matrix
52 // TODO is this always -transform?
53 i_forward.x = v_forward.x;
54 i_forward.y = -v_right.x;
59 return fixedvectoangles2(i_forward, i_up);
62 vector AnglesTransform_TurnDirectionFR(vector transform)
64 // turn 180 degrees around v_up
65 // changes in-direction to out-direction
66 //fixedmakevectors(transform);
67 //return fixedvectoangles2(-1 * v_forward, 1 * v_up);
68 transform.x = -transform.x;
69 transform.y = 180 + transform.y;
70 transform.z = -transform.z;
77 vector AnglesTransform_TurnDirectionFU(vector transform)
79 // turn 180 degrees around v_up
80 // changes in-direction to out-direction
81 //fixedmakevectors(transform);
82 //return fixedvectoangles2(-1 * v_forward, 1 * v_up);
83 transform.x = -transform.x;
84 transform.y = 180 + transform.y;
85 transform.z = 180 - transform.z;
89 vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
91 return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
94 vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
96 return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
99 vector AnglesTransform_Normalize(vector t, float minimize_roll)
102 // first, bring all angles in their range...
103 t.x = t.x - 360 * rint(t.x / 360);
104 t.y = t.y - 360 * rint(t.y / 360);
105 t.z = t.z - 360 * rint(t.z / 360);
107 need_flip = (t.z > 90 || t.z <= -90);
109 need_flip = (t.x > 90 || t.x < -90); // for pitch we prefer to allow exactly -90 degrees for looking straight down
112 if(t.x >= 0) t.x = 180 - t.x; else t.x = -180 - t.x;
113 if(t.y > 0) t.y -= 180; else t.y += 180;
114 if(t.z > 0) t.z -= 180; else t.z += 180;
119 vector AnglesTransform_CancelRoll(vector t)
121 const float epsilon = 30;
125 // forward vector (NOT SO important)
126 // right vector, up vector: screen rotation (MORE important)
127 // choose best match among all pitch-yaw only rotations
129 // FIXME find a better method
131 f = fabs(t.x - (-90)) / epsilon;
140 f = fabs(t.x - 90) / epsilon;
151 #ifdef POSITIVE_PITCH_IS_DOWN
152 vector AnglesTransform_ApplyToAngles(vector transform, vector v)
155 v = AnglesTransform_Multiply(transform, v);
159 vector AnglesTransform_ApplyToVAngles(vector transform, vector v)
161 v = AnglesTransform_Multiply(transform, v);
164 vector AnglesTransform_FromAngles(vector v)
169 vector AnglesTransform_ToAngles(vector v)
174 vector AnglesTransform_FromVAngles(vector v)
178 vector AnglesTransform_ToVAngles(vector v)
183 vector AnglesTransform_ApplyToAngles(vector transform, vector v)
185 v = AnglesTransform_Multiply(transform, v);
188 vector AnglesTransform_ApplyToVAngles(vector transform, vector v)
191 v = AnglesTransform_Multiply(transform, v);
195 vector AnglesTransform_FromAngles(vector v)
199 vector AnglesTransform_ToAngles(vector v)
203 vector AnglesTransform_FromVAngles(vector v)
208 vector AnglesTransform_ToVAngles(vector v)
215 vector AnglesTransform_Multiply_GetPostShift(vector t0, vector st0, vector t1, vector st1)
217 // we want the result of:
218 // t0 * (t1 * p + st1) + st0
219 // t0 * t1 * p + t0 * st1 + st0
220 return st0 + AnglesTransform_Apply(t0, st1);
222 vector AnglesTransform_PrePostShift_GetPostShift(vector sf, vector t, vector st)
224 return st - AnglesTransform_Apply(t, sf);