home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / povsrc.sit / SOURCE / MATRICES.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-03  |  9.9 KB  |  364 lines

  1. /****************************************************************************
  2. *                matrices.c
  3. *
  4. *  This module contains code to manipulate 4x4 matrices.
  5. *
  6. *  from Persistence of Vision Raytracer 
  7. *  Copyright 1992 Persistence of Vision Team
  8. *---------------------------------------------------------------------------
  9. *  Copying, distribution and legal info is in the file povlegal.doc which
  10. *  should be distributed with this file. If povlegal.doc is not available
  11. *  or for more info please contact:
  12. *
  13. *       Drew Wells [POV-Team Leader] 
  14. *       CIS: 73767,1244  Internet: 73767.1244@compuserve.com
  15. *       Phone: (213) 254-4041
  16. * This program is based on the popular DKB raytracer version 2.12.
  17. * DKBTrace was originally written by David K. Buck.
  18. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  19. *
  20. *****************************************************************************/
  21.  
  22.  
  23. #include "frame.h"
  24. #include "vector.h"
  25. #include "povproto.h"
  26.  
  27. void MZero (result)
  28. MATRIX *result;
  29. {
  30.    /* Initialize the matrix to the following values:
  31.    0.0   0.0   0.0   0.0
  32.    0.0   0.0   0.0   0.0
  33.    0.0   0.0   0.0   0.0
  34.    0.0   0.0   0.0   0.0
  35. */
  36.    register int i, j;
  37.  
  38.    for (i = 0 ; i < 4 ; i++)
  39.       for (j = 0 ; j < 4 ; j++)
  40.          (*result)[i][j] = 0.0;
  41. }
  42.  
  43. void MIdentity (result)
  44. MATRIX *result;
  45. {
  46.    /* Initialize the matrix to the following values:
  47.    1.0   0.0   0.0   0.0
  48.    0.0   1.0   0.0   0.0
  49.    0.0   0.0   1.0   0.0
  50.    0.0   0.0   0.0   1.0
  51. */
  52.    register int i, j;
  53.  
  54.    for (i = 0 ; i < 4 ; i++)
  55.       for (j = 0 ; j < 4 ; j++)
  56.          if (i == j)
  57.             (*result)[i][j] = 1.0;
  58.          else
  59.             (*result)[i][j] = 0.0;
  60. }
  61.  
  62. void MTimes (result, matrix1, matrix2)
  63. MATRIX *result, *matrix1, *matrix2;
  64. {
  65.    register int i, j, k;
  66.    MATRIX temp_matrix;
  67.  
  68.    for (i = 0 ; i < 4 ; i++)
  69.       for (j = 0 ; j < 4 ; j++) {
  70.          temp_matrix[i][j] = 0.0;
  71.          for (k = 0 ; k < 4 ; k++)
  72.             temp_matrix[i][j] += (*matrix1)[i][k] * (*matrix2)[k][j];
  73.       }
  74.  
  75.    for (i = 0 ; i < 4 ; i++)
  76.       for (j = 0 ; j < 4 ; j++)
  77.          (*result)[i][j] = temp_matrix[i][j];
  78.  
  79.    COOPERATE    
  80. }
  81.  
  82. /*  AAC - These are not used, so they are commented out to save code space...
  83.  
  84. void MAdd (result, matrix1, matrix2)
  85.    MATRIX *result, *matrix1, *matrix2;
  86.    {
  87.    register int i, j;
  88.  
  89.    for (i = 0 ; i < 4 ; i++)
  90.       for (j = 0 ; j < 4 ; j++)
  91.          (*result)[i][j] = (*matrix1)[i][j] + (*matrix2)[i][j];
  92.    }
  93.  
  94. void MSub (result, matrix1, matrix2)
  95.    MATRIX *result, *matrix1, *matrix2;
  96.    {
  97.    register int i, j;
  98.  
  99.    for (i = 0 ; i < 4 ; i++)
  100.       for (j = 0 ; j < 4 ; j++)
  101.          (*result)[i][j] = (*matrix1)[i][j] - (*matrix2)[i][j];
  102.    }
  103.  
  104. void MScale (result, matrix1, amount)
  105. MATRIX *result, *matrix1;
  106. DBL amount;
  107. {
  108.    register int i, j;
  109.  
  110.    for (i = 0 ; i < 4 ; i++)
  111.       for (j = 0 ; j < 4 ; j++)
  112.      if (amount == 1.0)
  113.         (*result)[i][j] = (*matrix1)[i][j]; * just copy *
  114.      else
  115.             (*result)[i][j] = (*matrix1)[i][j] * amount;
  116.    return;
  117. }
  118. ... up to here! */
  119.  
  120. void MTranspose (result, matrix1)
  121. MATRIX *result, *matrix1;
  122. {
  123.    register int i, j;
  124.    MATRIX temp_matrix;
  125.  
  126.    for (i = 0 ; i < 4 ; i++)
  127.       for (j = 0 ; j < 4 ; j++)
  128.          temp_matrix[i][j] = (*matrix1)[j][i];
  129.  
  130.    for (i = 0 ; i < 4 ; i++)
  131.       for (j = 0 ; j < 4 ; j++)
  132.          (*result)[i][j] = temp_matrix[i][j];
  133. }
  134.  
  135.  
  136. void MTransformVector (result, vector, transformation)
  137. VECTOR *result, *vector;
  138. TRANSFORMATION *transformation;
  139. {
  140.    register int i;
  141.    DBL answer_array[4];
  142.    MATRIX *matrix;
  143.  
  144.    matrix = (MATRIX *) transformation -> matrix;
  145.  
  146.    for (i = 0 ; i < 4 ; i++)
  147.       answer_array[i] = vector -> x * (*matrix)[0][i]
  148.       + vector -> y * (*matrix)[1][i]
  149.       + vector -> z * (*matrix)[2][i]
  150.       + (*matrix)[3][i];
  151.  
  152.    result -> x  = answer_array[0];
  153.    result -> y  = answer_array[1];
  154.    result -> z  = answer_array[2];
  155. }
  156.  
  157. void MInverseTransformVector (result, vector, transformation)
  158. VECTOR *result, *vector;
  159. TRANSFORMATION *transformation;
  160. {
  161.    register int i;
  162.    DBL answer_array[4];
  163.    MATRIX *matrix;
  164.  
  165.    matrix = (MATRIX *) transformation -> inverse;
  166.  
  167.    for (i = 0 ; i < 4 ; i++)
  168.       answer_array[i] = vector -> x * (*matrix)[0][i]
  169.       + vector -> y * (*matrix)[1][i]
  170.       + vector -> z * (*matrix)[2][i]
  171.       + (*matrix)[3][i];
  172.  
  173.    result -> x  = answer_array[0];
  174.    result -> y  = answer_array[1];
  175.    result -> z  = answer_array[2];
  176. }
  177.  
  178. void MTransVector (result, vector, transformation)
  179. VECTOR *result, *vector;
  180. TRANSFORMATION *transformation;
  181. {
  182.    register int i;
  183.    DBL answer_array[4];
  184.    MATRIX *matrix;
  185.  
  186.    matrix = (MATRIX *) transformation -> matrix;
  187.  
  188.    for (i = 0 ; i < 4 ; i++)
  189.       answer_array[i] = vector -> x * (*matrix)[0][i]
  190.       + vector -> y * (*matrix)[1][i]
  191.       + vector -> z * (*matrix)[2][i];
  192.  
  193.    result -> x  = answer_array[0];
  194.    result -> y  = answer_array[1];
  195.    result -> z  = answer_array[2];
  196. }
  197.  
  198. void MInvTransVector (result, vector, transformation)
  199. VECTOR *result, *vector;
  200. TRANSFORMATION *transformation;
  201. {
  202.    register int i;
  203.    DBL answer_array[4];
  204.    MATRIX *matrix;
  205.  
  206.    matrix = (MATRIX *) transformation -> inverse;
  207.  
  208.    for (i = 0 ; i < 4 ; i++)
  209.       answer_array[i] = vector -> x * (*matrix)[0][i]
  210.       + vector -> y * (*matrix)[1][i]
  211.       + vector -> z * (*matrix)[2][i];
  212.  
  213.    result -> x  = answer_array[0];
  214.    result -> y  = answer_array[1];
  215.    result -> z  = answer_array[2];
  216. }
  217.  
  218. void MTransNormal (result, vector, transformation)
  219. VECTOR *result, *vector;
  220. TRANSFORMATION *transformation;
  221. {
  222.    register int i;
  223.    DBL answer_array[3];
  224.    MATRIX *matrix;
  225.  
  226.    matrix = (MATRIX *) transformation -> inverse;
  227.  
  228.    for (i = 0 ; i < 3 ; i++)
  229.       answer_array[i] = vector -> x * (*matrix)[i][0]
  230.       + vector -> y * (*matrix)[i][1]
  231.       + vector -> z * (*matrix)[i][2];
  232.  
  233.    result -> x  = answer_array[0];
  234.    result -> y  = answer_array[1];
  235.    result -> z  = answer_array[2];
  236. }
  237.  
  238. void Get_Scaling_Transformation (result, vector)
  239. TRANSFORMATION *result;
  240. VECTOR *vector;
  241. {
  242.    MIdentity ((MATRIX *)result -> matrix);
  243.    (result -> matrix)[0][0] = vector -> x;
  244.    (result -> matrix)[1][1] = vector -> y;
  245.    (result -> matrix)[2][2] = vector -> z;
  246.  
  247.    MIdentity ((MATRIX *)result -> inverse);
  248.    (result -> inverse)[0][0] = 1.0 / vector -> x;
  249.    (result -> inverse)[1][1]= 1.0 / vector -> y;
  250.    (result -> inverse)[2][2] = 1.0 / vector -> z;
  251. }
  252.  
  253. /* AAC - This is not used, so it's commented out...
  254.  
  255. void Get_Inversion_Transformation (result)
  256.    TRANSFORMATION *result;
  257.    {
  258.    MIdentity ((MATRIX *)result -> matrix);
  259.    (result -> matrix)[0][0] = -1.0;
  260.    (result -> matrix)[1][1] = -1.0;
  261.    (result -> matrix)[2][2] = -1.0;
  262.    (result -> matrix)[3][3] = -1.0;
  263.  
  264.  
  265.    (result -> inverse)[0][0] = -1.0;
  266.    (result -> inverse)[1][1] = -1.0;
  267.    (result -> inverse)[2][2] = -1.0;
  268.    (result -> inverse)[3][3] = -1.0;
  269.    }
  270. ... up to here! */
  271.  
  272. void Get_Translation_Transformation (transformation, vector)
  273. TRANSFORMATION *transformation;
  274. VECTOR *vector;
  275. {
  276.    MIdentity ((MATRIX *)transformation -> matrix);
  277.    (transformation -> matrix)[3][0] = vector -> x;
  278.    (transformation -> matrix)[3][1] = vector -> y;
  279.    (transformation -> matrix)[3][2] = vector -> z;
  280.  
  281.    MIdentity ((MATRIX *)transformation -> inverse);
  282.    (transformation -> inverse)[3][0] = 0.0 - vector -> x;
  283.    (transformation -> inverse)[3][1] = 0.0 - vector -> y;
  284.    (transformation -> inverse)[3][2] = 0.0 - vector -> z;
  285. }
  286.  
  287. void Get_Rotation_Transformation (transformation, vector)
  288. TRANSFORMATION *transformation;
  289. VECTOR *vector;
  290. {
  291.    MATRIX Matrix;
  292.    VECTOR Radian_Vector;
  293.    register DBL cosx, cosy, cosz, sinx, siny, sinz;
  294.  
  295.    VScale (Radian_Vector, *vector, M_PI/180.0);
  296.    MIdentity ((MATRIX *)transformation -> matrix);
  297.    cosx = cos (Radian_Vector.x);
  298.    sinx = sin (Radian_Vector.x);
  299.    cosy = cos (Radian_Vector.y);
  300.    siny = sin (Radian_Vector.y);
  301.    cosz = cos (Radian_Vector.z);
  302.    sinz = sin (Radian_Vector.z);
  303.  
  304.    (transformation -> matrix) [1][1] = cosx;
  305.    (transformation -> matrix) [2][2] = cosx;
  306.    (transformation -> matrix) [1][2] = sinx;
  307.    (transformation -> matrix) [2][1] = 0.0 - sinx;
  308.    MTranspose ((MATRIX *)transformation -> inverse, (MATRIX *)transformation -> matrix);
  309.  
  310.    MIdentity ((MATRIX *)Matrix);
  311.    Matrix [0][0] = cosy;
  312.    Matrix [2][2] = cosy;
  313.    Matrix [0][2] = 0.0 - siny;
  314.    Matrix [2][0] = siny;
  315.    MTimes ((MATRIX *)transformation -> matrix, (MATRIX *)transformation -> matrix, (MATRIX *)Matrix);
  316.    MTranspose ((MATRIX *)Matrix, (MATRIX *)Matrix);
  317.    MTimes ((MATRIX *)transformation -> inverse, (MATRIX *)Matrix, (MATRIX *)transformation -> inverse);
  318.  
  319.    MIdentity ((MATRIX *)Matrix);
  320.    Matrix [0][0] = cosz;
  321.    Matrix [1][1] = cosz;
  322.    Matrix [0][1] = sinz;
  323.    Matrix [1][0] = 0.0 - sinz;
  324.    MTimes ((MATRIX *)transformation -> matrix, (MATRIX *)transformation -> matrix, (MATRIX *)Matrix);
  325.    MTranspose ((MATRIX *)Matrix, (MATRIX *)Matrix);
  326.    MTimes ((MATRIX *)transformation -> inverse, (MATRIX *)Matrix, (MATRIX *)transformation -> inverse);
  327. }
  328.  
  329. /* AAC - This is not used so it's commented out...
  330.  
  331. void Get_Look_At_Transformation (result, Look_At, Up, Right)
  332.    TRANSFORMATION *result;
  333.    VECTOR *Look_At, *Up, *Right;
  334.    {
  335.    MIdentity ((MATRIX *)result -> inverse);
  336.    (result -> matrix)[0][0] = Right->x;
  337.    (result -> matrix)[0][1] = Right->y;
  338.    (result -> matrix)[0][2] = Right->z;
  339.    (result -> matrix)[1][0] = Up->x;
  340.    (result -> matrix)[1][1] = Up->y;
  341.    (result -> matrix)[1][2] = Up->z;
  342.    (result -> matrix)[2][0] = Look_At->x;
  343.    (result -> matrix)[2][1] = Look_At->y;
  344.    (result -> matrix)[2][2] = Look_At->z;
  345.  
  346.    MIdentity ((MATRIX *)result -> matrix);
  347.    MTranspose ((MATRIX *)result -> matrix, (MATRIX *)result -> inverse);   
  348.    }
  349.  
  350. ... up to here! */
  351.  
  352. void Compose_Transformations (Original_Transformation, New_Transformation)
  353. TRANSFORMATION *Original_Transformation, *New_Transformation;
  354. {
  355.    MTimes ((MATRIX *)Original_Transformation -> matrix,
  356.       (MATRIX *)Original_Transformation -> matrix,
  357.       (MATRIX *)New_Transformation -> matrix);
  358.  
  359.    MTimes ((MATRIX *)Original_Transformation -> inverse,
  360.       (MATRIX *)New_Transformation -> inverse,
  361.       (MATRIX *)Original_Transformation -> inverse);
  362. }
  363.