afMatrix.cpp
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #include "afMatrix.h"
  2. #include "afVec3.h"
  3. #include "afVec3n.h"
  4. #include "afVec4.h"
  5. #include <D3DX8.h>
  6. #include <assert.h>
  7. #include <math.h>
  8. void sincos(float a, float& s, float& c)
  9. {
  10. s = (float)sin(a);
  11. c = (float)cos(a);
  12. }
  13. afMatrix::afMatrix()
  14. {
  15. makeIdent();
  16. }
  17. afMatrix::afMatrix(const float* nElements)
  18. {
  19. memcpy(&m00, nElements, 16*sizeof(float));
  20. }
  21. afMatrix::afMatrix(const D3DXMATRIX& nMat)
  22. {
  23. *getD3DMatrix() = nMat;
  24. }
  25. void
  26. afMatrix::makeIdent()
  27. {
  28.     m00 = m11 = m22 = m33 = 1.0f;
  29.     m01 = m02 = m03 =
  30.     m10 = m12 = m13 =
  31.     m20 = m21 = m23 =
  32.     m30 = m31 = m32 = 0.0f;
  33. }
  34. void
  35. afMatrix::makeProjection(float nFovY, float nAspect, float nNear, float nFar)
  36. {
  37. float h = (float)(cos(nFovY/2) / sin(nFovY/2));
  38. float w = h / nAspect;
  39. m00 = w; //2*nNear/w;
  40. m01 = m02 = m03 = m10 = 0.0f;
  41. m11 = h; //2*nNear/h;
  42. m12 = m13 = m20 = m21 = 0.0f;
  43. m22 = nFar/(nFar-nNear);
  44. m23 = 1.0f;
  45. m30 = m31 = 0.0f;
  46. m32 = nNear*nFar/(nNear-nFar);
  47. m33 = 0.0f;
  48. }
  49. void
  50. afMatrix::makeRotZXY(float nHead, float nPitch, float nRoll)
  51. {
  52.     float sinY;
  53.     float cosY;
  54.     sincos(nHead, sinY, cosY);
  55.     float sinX;
  56.     float cosX;
  57.     sincos(nPitch, sinX, cosX);
  58.     float sinZ;
  59.     float cosZ;
  60.     sincos(nRoll, sinZ, cosZ);
  61.     float cosYxcosZ = cosY*cosZ;
  62.     float sinYxsinZ = sinY*sinZ;
  63.     float sinYxcosZ = sinY*cosZ;
  64.     float cosYxsinZ = cosY*sinZ;
  65.     m00 = sinX*sinYxsinZ + cosYxcosZ;
  66.     m01 = - cosX*sinZ;
  67.     m02 = sinX*cosYxsinZ - sinYxcosZ;
  68.     m10 = cosYxsinZ - sinX*sinYxcosZ;
  69.     m11 = cosX*cosZ;
  70.     m12 = - sinX*cosYxcosZ - sinYxsinZ;
  71.     m20 = cosX*sinY;
  72.     m21 = sinX;
  73.     m22 = cosX*cosY;
  74.     m03 = m13 = m23 = m30 = m31 = m32 = 0.0f;
  75.     m33 = 1.0f;
  76. }
  77. void 
  78. afMatrix::makeTrans(const afVec3& nTrans)
  79. {
  80.     m00 = m11 = m22 = m33 = 1.0f;
  81.     m01 = m02 = m03 =
  82.     m10 = m12 = m13 =
  83.     m20 = m21 = m23 = 0.0f;
  84.     m30 = nTrans[0];
  85.     m31 = nTrans[1];
  86.     m32 = nTrans[2];
  87. }
  88. bool
  89. afMatrix::makeLookat(const afVec3n& nDir, const afVec3n& nUp)
  90. {
  91.     afVec3 vec1, vec2;
  92.     vec1.cross( nUp, nDir );
  93.     vec2.cross( nDir, vec1 );
  94.     if (vec1.normalize()==0.0f || vec2.normalize()==0.0f)
  95.         return false;
  96.     m00 = vec1[0];
  97.     m01 = vec1[1];
  98.     m02 = vec1[2];
  99.     m10 = vec2[0];
  100.     m11 = vec2[1];
  101.     m12 = vec2[2];
  102.     m20 = nDir[0];
  103.     m21 = nDir[1];
  104.     m22 = nDir[2];
  105.     m03 = m13 = m23 = m30 = m31 = m32 = 0.0f;
  106.     m33 = 1.0f;
  107. return true;
  108. }
  109. void
  110. afMatrix::makeScale(const afVec3& scale)
  111. {
  112.     m00 = scale[0];
  113. m11 = scale[1];
  114. m22 = scale[2];
  115.     m01 = m02 = m03 =
  116.     m10 = m12 = m13 =
  117.     m20 = m21 = m23 =
  118.     m30 = m31 = m32 = 0.0f;
  119.     m33 = 1.0f;
  120. }
  121. void 
  122. afMatrix::makeScale(float s)
  123. {
  124.     m00 = m11 = m22 = s;
  125.     m01 = m02 = m03 =
  126.     m10 = m12 = m13 =
  127.     m20 = m21 = m23 =
  128.     m30 = m31 = m32 = 0.0f;
  129.     m33 = 1.0f;
  130. }
  131. bool 
  132. afMatrix::invert()
  133. {
  134.     afMatrix tmp(*this);
  135.     // Gauss-Jordan elimination with partial pivoting
  136.     makeIdent();
  137.     int i, j, i1;
  138.     // Loop over cols of a from left to right, eliminating above and below diag
  139.     for (j = 0; j<4; j++)
  140.     {
  141.         // Find largest pivot in column j among rows j..3
  142.         i1 = j;       // Row with largest pivot candidate
  143.         for (i = j+1; i<4; i++)
  144.             if (fabs(tmp[i][j])>fabs(tmp[i1][j]))
  145.                 i1 = i;
  146.         // Swap rows i1 and j in tmp and this to put pivot on diagonal
  147.         afVec4 swap(tmp[i1]);
  148.         tmp.rowVec4(i1) = tmp.rowVec4(j);
  149.         tmp.rowVec4(j) = swap;
  150.         swap = rowVec4(i1);
  151.         rowVec4(i1) = rowVec4(j);
  152.         rowVec4(j) = swap;
  153.         // Scale row j to have a unit diagonal
  154.         if (tmp[j][j]==0.f)
  155.             return false;
  156.         rowVec4(j) /= tmp[j][j];
  157.         tmp.rowVec4(j) /= tmp[j][j];
  158.         // Eliminate off-diagonal elems in col j of tmp, doing identical ops to this
  159.         for (i = 0; i<4; i++)
  160.             if (i!=j) 
  161.             {
  162.                 rowVec4(i) -= tmp[i][j]*rowVec4(j);
  163.                 tmp.rowVec4(i) -= tmp[i][j]*tmp.rowVec4(j);
  164.             }
  165.     }
  166.     return true;
  167. }
  168. void 
  169. afMatrix::preMult(const afMatrix& nLf)
  170. {
  171.     assert(this!=&nLf);
  172.     float r0,r1,r2;
  173.     r0 = m00; r1 = m10; r2 = m20;
  174.     m00 = nLf.m00*r0+nLf.m01*r1+nLf.m02*r2+nLf.m03*m30;
  175.     m10 = nLf.m10*r0+nLf.m11*r1+nLf.m12*r2+nLf.m13*m30;
  176.     m20 = nLf.m20*r0+nLf.m21*r1+nLf.m22*r2+nLf.m23*m30;
  177.     m30 = nLf.m30*r0+nLf.m31*r1+nLf.m32*r2+nLf.m33*m30;
  178.     r0 = m01; r1 = m11; r2 = m21;
  179.     m01 = nLf.m00*r0+nLf.m01*r1+nLf.m02*r2+nLf.m03*m31;
  180.     m11 = nLf.m10*r0+nLf.m11*r1+nLf.m12*r2+nLf.m13*m31;
  181.     m21 = nLf.m20*r0+nLf.m21*r1+nLf.m22*r2+nLf.m23*m31;
  182.     m31 = nLf.m30*r0+nLf.m31*r1+nLf.m32*r2+nLf.m33*m31;
  183.     r0 = m02; r1 = m12; r2 = m22;
  184.     m02 = nLf.m00*r0+nLf.m01*r1+nLf.m02*r2+nLf.m03*m32;
  185.     m12 = nLf.m10*r0+nLf.m11*r1+nLf.m12*r2+nLf.m13*m32;
  186.     m22 = nLf.m20*r0+nLf.m21*r1+nLf.m22*r2+nLf.m23*m32;
  187.     m32 = nLf.m30*r0+nLf.m31*r1+nLf.m32*r2+nLf.m33*m32;
  188.     r0 = m03; r1 = m13; r2 = m23;
  189.     m03 = nLf.m00*r0+nLf.m01*r1+nLf.m02*r2+nLf.m03*m33;
  190.     m13 = nLf.m10*r0+nLf.m11*r1+nLf.m12*r2+nLf.m13*m33;
  191.     m23 = nLf.m20*r0+nLf.m21*r1+nLf.m22*r2+nLf.m23*m33;
  192.     m33 = nLf.m30*r0+nLf.m31*r1+nLf.m32*r2+nLf.m33*m33;
  193. }
  194. void 
  195. afMatrix::postMult(const afMatrix& nRt)
  196. {
  197.     assert(this!=&nRt);
  198.     float l0, l1, l2;
  199.     l0 = m00; l1 = m01; l2 = m02;
  200.     m00 = l0*nRt.m00 + l1*nRt.m10 + l2*nRt.m20 + m03*nRt.m30;
  201.     m01 = l0*nRt.m01 + l1*nRt.m11 + l2*nRt.m21 + m03*nRt.m31;
  202.     m02 = l0*nRt.m02 + l1*nRt.m12 + l2*nRt.m22 + m03*nRt.m32;
  203.     m03 = l0*nRt.m03 + l1*nRt.m13 + l2*nRt.m23 + m03*nRt.m33;
  204.     l0 = m10; l1 = m11; l2 = m12;
  205.     m10 = l0*nRt.m00 + l1*nRt.m10 + l2*nRt.m20 + m13*nRt.m30;
  206.     m11 = l0*nRt.m01 + l1*nRt.m11 + l2*nRt.m21 + m13*nRt.m31;
  207.     m12 = l0*nRt.m02 + l1*nRt.m12 + l2*nRt.m22 + m13*nRt.m32;
  208.     m13 = l0*nRt.m03 + l1*nRt.m13 + l2*nRt.m23 + m13*nRt.m33;
  209.     l0 = m20; l1 = m21; l2 = m22;
  210.     m20 = l0*nRt.m00 + l1*nRt.m10 + l2*nRt.m20 + m23*nRt.m30;
  211.     m21 = l0*nRt.m01 + l1*nRt.m11 + l2*nRt.m21 + m23*nRt.m31;
  212.     m22 = l0*nRt.m02 + l1*nRt.m12 + l2*nRt.m22 + m23*nRt.m32;
  213.     m23 = l0*nRt.m03 + l1*nRt.m13 + l2*nRt.m23 + m23*nRt.m33;
  214.     l0 = m30; l1 = m31; l2 = m32;
  215.     m30 = l0*nRt.m00 + l1*nRt.m10 + l2*nRt.m20 + m33*nRt.m30;
  216.     m31 = l0*nRt.m01 + l1*nRt.m11 + l2*nRt.m21 + m33*nRt.m31;
  217.     m32 = l0*nRt.m02 + l1*nRt.m12 + l2*nRt.m22 + m33*nRt.m32;
  218.     m33 = l0*nRt.m03 + l1*nRt.m13 + l2*nRt.m23 + m33*nRt.m33;
  219. }
  220. void 
  221. afMatrix::multVector(afVec4& dst, const afVec4& src) const 
  222. {
  223.     dst[0] = src[0]*m00 + src[1]*m10 + src[2]*m20 + src[3]*m30;
  224.     dst[1] = src[0]*m01 + src[1]*m11 + src[2]*m21 + src[3]*m31;
  225.     dst[2] = src[0]*m02 + src[1]*m12 + src[2]*m22 + src[3]*m32;
  226.     dst[3] = src[0]*m03 + src[1]*m13 + src[2]*m23 + src[3]*m33;
  227. }
  228. void 
  229. afMatrix::multVector(afVec4& dst, const afVec3& src) const 
  230. {
  231.     dst[0] = src[0]*m00 + src[1]*m10 + src[2]*m20 + m30;
  232.     dst[1] = src[0]*m01 + src[1]*m11 + src[2]*m21 + m31;
  233.     dst[2] = src[0]*m02 + src[1]*m12 + src[2]*m22 + m32;
  234.     dst[3] = src[0]*m03 + src[1]*m13 + src[2]*m23 + m33;
  235. }
  236. void 
  237. afMatrix::multVector(afVec3& dst, const afVec3& src) const
  238. {
  239.     dst[0] = src[0]*m00 + src[1]*m10 + src[2]*m20 + m30;
  240.     dst[1] = src[0]*m01 + src[1]*m11 + src[2]*m21 + m31;
  241.     dst[2] = src[0]*m02 + src[1]*m12 + src[2]*m22 + m32;
  242. }
  243. afMatrix&
  244. afMatrix::operator=(const D3DXMATRIX& nMat)
  245. {
  246. *getD3DMatrix() = nMat;
  247. return *this;
  248. }
  249. bool
  250. afMatrix::operator==(const afMatrix& nMat) const
  251. {
  252. return  m00==nMat.m00 && m01==nMat.m01 && m02==nMat.m02 && m03==nMat.m03 &&
  253. m10==nMat.m10 && m11==nMat.m11 && m12==nMat.m12 && m13==nMat.m13 &&
  254. m20==nMat.m20 && m21==nMat.m21 && m22==nMat.m22 && m23==nMat.m23 &&
  255. m30==nMat.m30 && m31==nMat.m31 && m32==nMat.m32 && m33==nMat.m33;
  256. }