00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 INLINE_MATHUTIL FLOATNAME(LMatrix3)
00020 make_xi_mat(const FLOATNAME(LVector2) &x) {
00021 return FLOATNAME(LMatrix3)(1.0f, 0, 0,
00022 0, x[0], x[1],
00023 0, -x[1], x[0]);
00024 }
00025
00026
00027 INLINE_MATHUTIL FLOATNAME(LMatrix3)
00028 make_x_mat(const FLOATNAME(LVector2) &x) {
00029 return FLOATNAME(LMatrix3)(1.0f, 0, 0,
00030 0, x[1], x[0],
00031 0, -x[0], x[1]);
00032 }
00033
00034
00035 INLINE_MATHUTIL FLOATNAME(LMatrix3)
00036 make_y_mat(const FLOATNAME(LVector2) &y) {
00037 return FLOATNAME(LMatrix3)(y[1], 0, -y[0],
00038 0, 1.0f, 0,
00039 y[0], 0, y[1]);
00040 }
00041
00042
00043 INLINE_MATHUTIL FLOATNAME(LMatrix3)
00044 make_z_mat(const FLOATNAME(LVector2) &z) {
00045 return FLOATNAME(LMatrix3)(z[1], -z[0], 0,
00046 z[0], z[1], 0,
00047 0, 0, 1.0f);
00048 }
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 void
00062 heads_up(FLOATNAME(LMatrix3) &mat, const FLOATNAME(LVector3) &fwd,
00063 const FLOATNAME(LVector3) &up, CoordinateSystem cs) {
00064 if (cs == CS_default) {
00065 cs = default_coordinate_system;
00066 }
00067
00068 if (cs == CS_zup_right || cs == CS_zup_left) {
00069
00070
00071
00072
00073
00074
00075 FLOATNAME(LVector2) y(up[0], up[2]);
00076 FLOATTYPE d = dot(y, y);
00077 if (d==0.0f) {
00078 y = FLOATNAME(LVector2)(0.0f, 1.0f);
00079 } else {
00080 y /= csqrt(d);
00081 }
00082
00083
00084
00085
00086
00087 FLOATNAME(LVector2) x(up[1], up[0]*y[0]+up[2]*y[1]);
00088 d = dot(x, x);
00089 if (d==0.0f) {
00090 x = FLOATNAME(LVector2)(0.0f, 1.0f);
00091 } else {
00092 x /= csqrt(d);
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 FLOATNAME(LVector2) z(fwd[0]*y[1] - fwd[2]*y[0],
00105 -fwd[0]*y[0]*x[0] + fwd[1]*x[1] - fwd[2]*y[1]*x[0]);
00106 d = dot(z, z);
00107 if (d==0.0f) {
00108 z = FLOATNAME(LVector2)(0.0f, 1.0f);
00109 } else {
00110 z /= csqrt(d);
00111 }
00112
00113
00114 if (cs == CS_zup_right) {
00115 mat =
00116 make_z_mat(z) *
00117 make_x_mat(x) *
00118 make_y_mat(y);
00119 } else {
00120 mat =
00121 make_z_mat(z) *
00122 make_x_mat(-x) *
00123 make_y_mat(-y);
00124 }
00125 } else {
00126
00127
00128
00129
00130
00131
00132 FLOATNAME(LVector2) z(up[0], up[1]);
00133 FLOATTYPE d = dot(z, z);
00134 if (d==0.0f) {
00135 z = FLOATNAME(LVector2)(0.0f, 1.0f);
00136 } else {
00137 z /= csqrt(d);
00138 }
00139
00140
00141
00142
00143
00144 FLOATNAME(LVector2) x(up[0]*z[0] + up[1]*z[1], up[2]);
00145 d = dot(x, x);
00146 if (d==0.0f) {
00147 x = FLOATNAME(LVector2)(1.0f, 0.0f);
00148 } else {
00149 x /= csqrt(d);
00150 }
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 FLOATNAME(LVector2) y(fwd[0]*z[1] - fwd[1]*z[0],
00162 -fwd[0]*x[1]*z[0] - fwd[1]*x[1]*z[1] + fwd[2]*x[0]);
00163 d = dot(y, y);
00164 if (d==0.0f) {
00165 y = FLOATNAME(LVector2)(0.0f, 1.0f);
00166 } else {
00167 y /= csqrt(d);
00168 }
00169
00170
00171 if (cs == CS_yup_right) {
00172 mat =
00173 make_y_mat(y) *
00174 make_xi_mat(-x) *
00175 make_z_mat(-z);
00176 } else {
00177 mat =
00178 make_y_mat(y) *
00179 make_xi_mat(x) *
00180 make_z_mat(z);
00181 }
00182 }
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 void
00198 look_at(FLOATNAME(LMatrix3) &mat, const FLOATNAME(LVector3) &fwd,
00199 const FLOATNAME(LVector3) &up, CoordinateSystem cs) {
00200 if (cs == CS_default) {
00201 cs = default_coordinate_system;
00202 }
00203
00204 if (cs == CS_zup_right || cs == CS_zup_left) {
00205
00206
00207
00208
00209
00210
00211 FLOATNAME(LVector2) z(fwd[0], fwd[1]);
00212 FLOATTYPE d = dot(z, z);
00213 if (d==0.0f) {
00214 z = FLOATNAME(LVector2)(0.0f, 1.0f);
00215 } else {
00216 z /= csqrt(d);
00217 }
00218
00219
00220
00221
00222
00223 FLOATNAME(LVector2) x(fwd[0]*z[0] + fwd[1]*z[1], fwd[2]);
00224 d = dot(x, x);
00225 if (d==0.0f) {
00226 x = FLOATNAME(LVector2)(1.0f, 0.0f);
00227 } else {
00228 x /= csqrt(d);
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 FLOATNAME(LVector2) y(up[0]*z[1] - up[1]*z[0],
00241 -up[0]*x[1]*z[0] - up[1]*x[1]*z[1] + up[2]*x[0]);
00242 d = dot(y, y);
00243 if (d==0.0f) {
00244 y = FLOATNAME(LVector2)(0.0f, 1.0f);
00245 } else {
00246 y /= csqrt(d);
00247 }
00248
00249
00250 if (cs == CS_zup_right) {
00251 mat =
00252 make_y_mat(y) *
00253 make_xi_mat(x) *
00254 make_z_mat(z);
00255 } else {
00256 mat =
00257 make_y_mat(-y) *
00258 make_xi_mat(-x) *
00259 make_z_mat(z);
00260 }
00261 } else {
00262
00263
00264
00265
00266
00267
00268 FLOATNAME(LVector2) y(fwd[0], fwd[2]);
00269 FLOATTYPE d = dot(y, y);
00270 if (d==0.0f) {
00271 y = FLOATNAME(LVector2)(0.0f, 1.0f);
00272 } else {
00273 y /= csqrt(d);
00274 }
00275
00276
00277
00278
00279
00280 FLOATNAME(LVector2) x(fwd[1], fwd[0]*y[0]+fwd[2]*y[1]);
00281 d = dot(x, x);
00282 if (d==0.0f) {
00283 x = FLOATNAME(LVector2)(0.0f, 1.0f);
00284 } else {
00285 x /= csqrt(d);
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 FLOATNAME(LVector2) z(up[0]*y[1] - up[2]*y[0],
00298 -up[0]*y[0]*x[0] + up[1]*x[1] - up[2]*y[1]*x[0]);
00299 d = dot(z, z);
00300 if (d==0.0f) {
00301 z = FLOATNAME(LVector2)(0.0f, 1.0f);
00302 } else {
00303 z /= csqrt(d);
00304 }
00305
00306
00307 if (cs == CS_yup_right) {
00308 mat =
00309 make_z_mat(z) *
00310 make_x_mat(x) *
00311 make_y_mat(-y);
00312 } else {
00313 mat =
00314 make_z_mat(-z) *
00315 make_x_mat(-x) *
00316 make_y_mat(-y);
00317 }
00318 }
00319 }