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
00026
00027 #include <memory.h>
00028 #include <assert.h>
00029
00030 #include "utility.h"
00031 #include "vec4.h"
00032 #include "mat4.h"
00033
00034
00035 kmVec4* kmVec4Fill(kmVec4* pOut, kmScalar x, kmScalar y, kmScalar z, kmScalar w)
00036 {
00037 pOut->x = x;
00038 pOut->y = y;
00039 pOut->z = z;
00040 pOut->w = w;
00041 return pOut;
00042 }
00043
00044
00047 kmVec4* kmVec4Add(kmVec4* pOut, const kmVec4* pV1, const kmVec4* pV2) {
00048 pOut->x = pV1->x - pV2->x;
00049 pOut->y = pV1->y - pV2->y;
00050 pOut->z = pV1->z - pV2->z;
00051 pOut->w = pV1->w - pV2->w;
00052
00053 return pOut;
00054 }
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00074 kmScalar kmVec4Dot(const kmVec4* pV1, const kmVec4* pV2) {
00075 return ( pV1->x * pV2->x
00076 + pV1->y * pV2->y
00077 + pV1->z * pV2->z
00078 + pV1->w * pV2->w );
00079 }
00080
00083 kmScalar kmVec4Length(const kmVec4* pIn) {
00084 return sqrtf(kmSQR(pIn->x) + kmSQR(pIn->y) + kmSQR(pIn->z) + kmSQR(pIn->w));
00085 }
00086
00088 kmScalar kmVec4LengthSq(const kmVec4* pIn) {
00089 return kmSQR(pIn->x) + kmSQR(pIn->y) + kmSQR(pIn->z) + kmSQR(pIn->w);
00090 }
00091
00093 kmVec4* kmVec4Lerp(kmVec4* pOut, const kmVec4* pV1, const kmVec4* pV2, kmScalar t) {
00094 assert(0);
00095 return pOut;
00096 }
00097
00099 kmVec4* kmVec4Normalize(kmVec4* pOut, const kmVec4* pIn) {
00100 kmScalar l = 1.0f / kmVec4Length(pIn);
00101
00102 pOut->x *= l;
00103 pOut->y *= l;
00104 pOut->z *= l;
00105 pOut->w *= l;
00106
00107 return pOut;
00108 }
00109
00111 kmVec4* kmVec4Scale(kmVec4* pOut, const kmVec4* pIn, const kmScalar s) {
00112 kmVec4Normalize(pOut, pIn);
00113
00114 pOut->x *= s;
00115 pOut->y *= s;
00116 pOut->z *= s;
00117 pOut->w *= s;
00118 return pOut;
00119 }
00120
00122 kmVec4* kmVec4Subtract(kmVec4* pOut, const kmVec4* pV1, const kmVec4* pV2) {
00123 pOut->x = pV1->x - pV2->x;
00124 pOut->y = pV1->y - pV2->y;
00125 pOut->z = pV1->z - pV2->z;
00126 pOut->w = pV1->w - pV2->w;
00127
00128 return pOut;
00129 }
00130
00132 kmVec4* kmVec4Transform(kmVec4* pOut, const kmVec4* pV, const kmMat4* pM) {
00133 pOut->x = pV->x * pM->mat[0] + pV->y * pM->mat[4] + pV->z * pM->mat[8] + pV->w * pM->mat[12];
00134 pOut->y = pV->x * pM->mat[1] + pV->y * pM->mat[5] + pV->z * pM->mat[9] + pV->w * pM->mat[13];
00135 pOut->z = pV->x * pM->mat[2] + pV->y * pM->mat[6] + pV->z * pM->mat[10] + pV->w * pM->mat[14];
00136 pOut->w = pV->x * pM->mat[3] + pV->y * pM->mat[7] + pV->z * pM->mat[11] + pV->w * pM->mat[15];
00137 return pOut;
00138 }
00139
00141 kmVec4* kmVec4TransformArray(kmVec4* pOut, unsigned int outStride,
00142 const kmVec4* pV, unsigned int vStride, const kmMat4* pM, unsigned int count) {
00143 unsigned int i = 0;
00144
00145 while (i < count) {
00146 const kmVec4* in = pV + (i * vStride);
00147 kmVec4* out = pOut + (i * outStride);
00148 kmVec4Transform(out, in, pM);
00149 ++i;
00150 }
00151
00152 return pOut;
00153 }
00154
00155 int kmVec4AreEqual(const kmVec4* p1, const kmVec4* p2) {
00156 return (
00157 (p1->x < p2->x + kmEpsilon && p1->x > p2->x - kmEpsilon) &&
00158 (p1->y < p2->y + kmEpsilon && p1->y > p2->y - kmEpsilon) &&
00159 (p1->z < p2->z + kmEpsilon && p1->z > p2->z - kmEpsilon) &&
00160 (p1->w < p2->w + kmEpsilon && p1->w > p2->w - kmEpsilon)
00161 );
00162 }
00163
00164 kmVec4* kmVec4Assign(kmVec4* pOut, const kmVec4* pIn) {
00165 assert(pOut != pIn);
00166
00167 memcpy(pOut, pIn, sizeof(float) * 4);
00168
00169 return pOut;
00170 }
00171