00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00030 #include <assert.h>
00031 #include <memory.h>
00032
00033 #include "utility.h"
00034 #include "vec4.h"
00035 #include "mat4.h"
00036 #include "vec3.h"
00037
00042 kmVec3* kmVec3Fill(kmVec3* pOut, kmScalar x, kmScalar y, kmScalar z)
00043 {
00044 pOut->x = x;
00045 pOut->y = y;
00046 pOut->z = z;
00047 return pOut;
00048 }
00049
00050
00054 kmScalar kmVec3Length(const kmVec3* pIn)
00055 {
00056 return sqrtf(kmSQR(pIn->x) + kmSQR(pIn->y) + kmSQR(pIn->z));
00057 }
00058
00062 kmScalar kmVec3LengthSq(const kmVec3* pIn)
00063 {
00064 return kmSQR(pIn->x) + kmSQR(pIn->y) + kmSQR(pIn->z);
00065 }
00066
00071 kmVec3* kmVec3Normalize(kmVec3* pOut, const kmVec3* pIn)
00072 {
00073 kmScalar l = 1.0f / kmVec3Length(pIn);
00074
00075 kmVec3 v;
00076 v.x = pIn->x * l;
00077 v.y = pIn->y * l;
00078 v.z = pIn->z * l;
00079
00080 pOut->x = v.x;
00081 pOut->y = v.y;
00082 pOut->z = v.z;
00083
00084 return pOut;
00085 }
00086
00091 kmVec3* kmVec3Cross(kmVec3* pOut, const kmVec3* pV1, const kmVec3* pV2)
00092 {
00093
00094 kmVec3 v;
00095
00096 v.x = (pV1->y * pV2->z) - (pV1->z * pV2->y);
00097 v.y = (pV1->z * pV2->x) - (pV1->x * pV2->z);
00098 v.z = (pV1->x * pV2->y) - (pV1->y * pV2->x);
00099
00100 pOut->x = v.x;
00101 pOut->y = v.y;
00102 pOut->z = v.z;
00103
00104 return pOut;
00105 }
00106
00110 kmScalar kmVec3Dot(const kmVec3* pV1, const kmVec3* pV2)
00111 {
00112 return ( pV1->x * pV2->x
00113 + pV1->y * pV2->y
00114 + pV1->z * pV2->z );
00115 }
00116
00121 kmVec3* kmVec3Add(kmVec3* pOut, const kmVec3* pV1, const kmVec3* pV2)
00122 {
00123 kmVec3 v;
00124
00125 v.x = pV1->x + pV2->x;
00126 v.y = pV1->y + pV2->y;
00127 v.z = pV1->z + pV2->z;
00128
00129 pOut->x = v.x;
00130 pOut->y = v.y;
00131 pOut->z = v.z;
00132
00133 return pOut;
00134 }
00135
00140 kmVec3* kmVec3Subtract(kmVec3* pOut, const kmVec3* pV1, const kmVec3* pV2)
00141 {
00142 kmVec3 v;
00143
00144 v.x = pV1->x - pV2->x;
00145 v.y = pV1->y - pV2->y;
00146 v.z = pV1->z - pV2->z;
00147
00148 pOut->x = v.x;
00149 pOut->y = v.y;
00150 pOut->z = v.z;
00151
00152 return pOut;
00153 }
00154
00159 kmVec3* kmVec3Transform(kmVec3* pOut, const kmVec3* pV, const kmMat4* pM)
00160 {
00161
00162
00163
00164
00165
00166
00167 kmVec3 v;
00168
00169 v.x = pV->x * pM->mat[0] + pV->y * pM->mat[4] + pV->z * pM->mat[8] + pM->mat[12];
00170 v.y = pV->x * pM->mat[1] + pV->y * pM->mat[5] + pV->z * pM->mat[9] + pM->mat[13];
00171 v.z = pV->x * pM->mat[2] + pV->y * pM->mat[6] + pV->z * pM->mat[10] + pM->mat[14];
00172
00173 pOut->x = v.x;
00174 pOut->y = v.y;
00175 pOut->z = v.z;
00176
00177 return pOut;
00178 }
00179
00180 kmVec3* kmVec3InverseTransform(kmVec3* pOut, const kmVec3* pVect, const kmMat4* pM)
00181 {
00182 kmVec3 v1, v2;
00183
00184 v1.x = pVect->x - pM->mat[12];
00185 v1.y = pVect->y - pM->mat[13];
00186 v1.z = pVect->z - pM->mat[14];
00187
00188 v2.x = v1.x * pM->mat[0] + v1.y * pM->mat[1] + v1.z * pM->mat[2];
00189 v2.y = v1.x * pM->mat[4] + v1.y * pM->mat[5] + v1.z * pM->mat[6];
00190 v2.z = v1.x * pM->mat[8] + v1.y * pM->mat[9] + v1.z * pM->mat[10];
00191
00192 pOut->x = v2.x;
00193 pOut->y = v2.y;
00194 pOut->z = v2.z;
00195
00196 return pOut;
00197 }
00198
00199 kmVec3* kmVec3InverseTransformNormal(kmVec3* pOut, const kmVec3* pVect, const kmMat4* pM)
00200 {
00201 kmVec3 v;
00202
00203 v.x = pVect->x * pM->mat[0] + pVect->y * pM->mat[1] + pVect->z * pM->mat[2];
00204 v.y = pVect->x * pM->mat[4] + pVect->y * pM->mat[5] + pVect->z * pM->mat[6];
00205 v.z = pVect->x * pM->mat[8] + pVect->y * pM->mat[9] + pVect->z * pM->mat[10];
00206
00207 pOut->x = v.x;
00208 pOut->y = v.y;
00209 pOut->z = v.z;
00210
00211 return pOut;
00212 }
00213
00217 kmVec3* kmVec3TransformCoord(kmVec3* pOut, const kmVec3* pV, const kmMat4* pM)
00218 {
00219
00220
00221
00222
00223
00224
00225 assert(0 && "Not implemented!");
00226
00227 return pOut;
00228 }
00229
00230 kmVec3* kmVec3TransformNormal(kmVec3* pOut, const kmVec3* pV, const kmMat4* pM)
00231 {
00232
00233
00234
00235
00236
00237
00238 kmVec3 v;
00239
00240 v.x = pV->x * pM->mat[0] + pV->y * pM->mat[4] + pV->z * pM->mat[8];
00241 v.y = pV->x * pM->mat[1] + pV->y * pM->mat[5] + pV->z * pM->mat[9];
00242 v.z = pV->x * pM->mat[2] + pV->y * pM->mat[6] + pV->z * pM->mat[10];
00243
00244 pOut->x = v.x;
00245 pOut->y = v.y;
00246 pOut->z = v.z;
00247
00248 return pOut;
00249
00250 }
00251
00256 kmVec3* kmVec3Scale(kmVec3* pOut, const kmVec3* pIn, const kmScalar s)
00257 {
00258 pOut->x = pIn->x * s;
00259 pOut->y = pIn->y * s;
00260 pOut->z = pIn->z * s;
00261
00262 return pOut;
00263 }
00264
00268 int kmVec3AreEqual(const kmVec3* p1, const kmVec3* p2)
00269 {
00270 if ((p1->x < (p2->x + kmEpsilon) && p1->x > (p2->x - kmEpsilon)) &&
00271 (p1->y < (p2->y + kmEpsilon) && p1->y > (p2->y - kmEpsilon)) &&
00272 (p1->z < (p2->z + kmEpsilon) && p1->z > (p2->z - kmEpsilon))) {
00273 return 1;
00274 }
00275
00276 return 0;
00277 }
00278
00283 kmVec3* kmVec3Assign(kmVec3* pOut, const kmVec3* pIn) {
00284 if (pOut == pIn) {
00285 return pOut;
00286 }
00287
00288 pOut->x = pIn->x;
00289 pOut->y = pIn->y;
00290 pOut->z = pIn->z;
00291
00292 return pOut;
00293 }
00294
00298 kmVec3* kmVec3Zero(kmVec3* pOut) {
00299 pOut->x = 0.0f;
00300 pOut->y = 0.0f;
00301 pOut->z = 0.0f;
00302
00303 return pOut;
00304 }