source: golgotha/src/i4/math/matrix.hh @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 12 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 3.8 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#ifndef __MATRIX_HPP_
10#define __MATRIX_HPP_
11
12#include <string.h>
13#include "math/point.hh"
14
15class i4_4x4_matrix_class
16{
17protected:
18  i4_float elt[4*4];
19public:
20 
21  i4_4x4_matrix_class() { ; }
22
23  i4_4x4_matrix_class(const i4_4x4_matrix_class &copy_from)
24  //{{{
25  {
26    memcpy(elt,copy_from.elt,sizeof(i4_4x4_matrix_class));
27  }
28  //}}}
29
30  void scale(i4_float sx, i4_float sy, i4_float sz)
31  //{{{
32  {
33    elt[0]=sx;   elt[1]=0.0;    elt[2]=0.0;    elt[3]=0.0;
34    elt[4]=0.0;    elt[5]=sy;   elt[6]=0.0;    elt[7]=0.0;
35    elt[8]=0.0;    elt[9]=0.0;    elt[10]=sz;  elt[11]=0.0;
36    elt[12]=0.0;   elt[13]=0.0;   elt[14]=0;   elt[15]=1.0;
37  }
38  //}}}
39
40  void identity()
41  //{{{
42  {
43    scale(1,1,1);
44  }
45  //}}}
46
47  void translate(i4_float tx, i4_float ty, i4_float tz)
48  //{{{
49  {
50    elt[0] = 1.0;    elt[1]  = 0.0;    elt[2]  = 0.0;    elt[3] = tx;
51    elt[4] = 0.0;    elt[5]  = 1.0;    elt[6]  = 0.0;    elt[7] = ty;
52    elt[8] = 0.0;    elt[9]  = 0.0;    elt[10] = 1.0;   elt[11] = tz;
53    elt[12]= 0.0;    elt[13] = 0.0;    elt[14] = 0.0;   elt[15] = 1.0;
54  }
55  //}}}
56
57  void rotate_x(i4_angle ax)
58  //{{{
59  {
60    i4_float cos_ax=cos(ax);
61    i4_float sin_ax=sin(ax);
62
63    elt[0]=1.0;        elt[1]=0.0;           elt[2]=0.0;        elt[3]=0.0;
64    elt[4]=0.0;        elt[5]=cos_ax;        elt[6]=-sin_ax;    elt[7]=0.0;
65    elt[8]=0.0;        elt[9]=sin_ax;        elt[10]=cos_ax;    elt[11]=0.0;
66    elt[12]=0.0;       elt[13]=0.0;          elt[14]=0.0;       elt[15]=1.0;
67  }
68  //}}}
69
70  void rotate_y(i4_angle ay)
71  //{{{
72  {
73    i4_float cos_ay=cos(ay);
74    i4_float sin_ay=sin(ay);
75
76    elt[0]=cos_ay;   elt[1]=0.0;             elt[2]=sin_ay;    elt[3]=0.0;
77    elt[4]=0.0;      elt[5]=1.0;             elt[6]=0.0;       elt[7]=0.0;
78    elt[8]=-sin_ay;  elt[9]=0.0;             elt[10]=cos_ay;   elt[11]=0.0;
79    elt[12]=0.0;     elt[13]=0.0;            elt[14]=0.0;      elt[15]=1.0;
80  }
81  //}}}
82
83  void rotate_z(i4_angle az)
84  //{{{
85  {
86    i4_float cos_az=cos(az);
87    i4_float sin_az=sin(az);
88
89    elt[0]=cos_az;   elt[1]=-sin_az;       elt[2]=0.0;          elt[3]=0.0;
90    elt[4]=sin_az;   elt[5]=cos_az;        elt[6]=0.0;          elt[7]=0.0;
91    elt[8]=0.0;      elt[9]=0.0;           elt[10]=1.0;         elt[11]=0.0;
92    elt[12]=0.0;     elt[13]=0.0;          elt[14]=0.0;         elt[15]=1.0;
93  }
94  //}}}
95 
96  i4_4x4_matrix_class &multiply(const i4_4x4_matrix_class &a, const i4_4x4_matrix_class &b)
97  //{{{
98  {
99    int i,j,k;
100    i4_float sum;
101
102    for (i=0;i<4;i++)
103      for (j=0;j<4;j++)
104      {   
105        sum=0;
106        for (k=0; k<4; k++)
107          sum += a.elt[i*4+k] * b.elt[k*4+j];
108        elt[i*4+j] = sum;
109      }
110    return *this;
111  }
112  //}}}
113
114  // this version of multiple store the result in this
115  void multiply(const i4_4x4_matrix_class &b)
116  //{{{
117  {
118    i4_4x4_matrix_class result;
119    multiply(b,result);
120    *this=result;
121  }
122  //}}}
123
124  void transform(const i4_3d_vector &b, i4_3d_vector &result)
125  //{{{
126  {
127    i4_float vx,vy,vz;
128    vx=b.x;
129    vy=b.y;
130    vz=b.z;
131         
132    result.x = vx*elt[0] + vy*elt[1] + vz*elt[2] + elt[3];
133    result.y = vx*elt[4] + vy*elt[5] + vz*elt[6] + elt[7];
134    result.z = vx*elt[8] + vy*elt[9] + vz*elt[10] + elt[11];
135  }
136  //}}}
137};
138
139#endif
140
141//{{{ Emacs Locals
142// Local Variables:
143// folded-file: t
144// End:
145//}}}
Note: See TracBrowser for help on using the repository browser.