| 73 | } |
| 74 | |
| 75 | void stMakeDirectionMtx(TPos3f *dirMtx, const TVec3f &vec, char axis) |
| 76 | { |
| 77 | TVec3f dir; |
| 78 | TVec3f normal; |
| 79 | |
| 80 | if (axis == 'Z') |
| 81 | { |
| 82 | normal.set(0.0f, 1.0f, 0.0f); |
| 83 | } |
| 84 | else |
| 85 | { |
| 86 | normal.set(0.0f, 0.0f, 1.0f); |
| 87 | } |
| 88 | |
| 89 | dir.cross(normal, vec); |
| 90 | stVecNormalize(&dir); |
| 91 | |
| 92 | normal.cross(vec, dir); |
| 93 | stVecNormalize(&normal); |
| 94 | |
| 95 | if (axis == 'Z') |
| 96 | { |
| 97 | dirMtx->mMtx[0][0] = dir.x; |
| 98 | dirMtx->mMtx[1][0] = dir.y; |
| 99 | dirMtx->mMtx[2][0] = dir.z; |
| 100 | |
| 101 | dirMtx->mMtx[0][1] = normal.x; |
| 102 | dirMtx->mMtx[1][1] = normal.y; |
| 103 | dirMtx->mMtx[2][1] = normal.z; |
| 104 | |
| 105 | dirMtx->mMtx[0][2] = vec.x; |
| 106 | dirMtx->mMtx[1][2] = vec.y; |
| 107 | dirMtx->mMtx[2][2] = vec.z; |
| 108 | } |
| 109 | else |
| 110 | { |
| 111 | dir.negate(); |
| 112 | dirMtx->mMtx[0][0] = dir.x; |
| 113 | dirMtx->mMtx[1][0] = dir.y; |
| 114 | dirMtx->mMtx[2][0] = dir.z; |
| 115 | |
| 116 | dirMtx->mMtx[0][1] = vec.x; |
| 117 | dirMtx->mMtx[1][1] = vec.y; |
| 118 | dirMtx->mMtx[2][1] = vec.z; |
| 119 | |
| 120 | dirMtx->mMtx[0][2] = normal.x; |
| 121 | dirMtx->mMtx[1][2] = normal.y; |
| 122 | dirMtx->mMtx[2][2] = normal.z; |
| 123 | } |
| 124 | |
| 125 | dirMtx->mMtx[0][3] = 0.0f; |
| 126 | dirMtx->mMtx[1][3] = 0.0f; |
| 127 | dirMtx->mMtx[2][3] = 0.0f; |
| 128 | } |
| 129 | |
| 130 | void stMakeRMtx(Mtx m, const TVec3f &vec1, const TVec3f &vec2, const TVec3f &vec3) |
| 131 | { |
no test coverage detected