Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
#include "zgl.h"
2
 
3
void gl_print_matrix( const float *m)
4
{
5
   int i;
6
 
7
   for (i=0;i<4;i++) {
8
      fprintf(stderr,"%f %f %f %f\n", m[i], m[4+i], m[8+i], m[12+i] );
9
   }
10
}
11
 
12
static inline void gl_matrix_update(GLContext *c)
13
{
14
  c->matrix_model_projection_updated=(c->matrix_mode<=1);
15
}
16
 
17
 
18
void glopMatrixMode(GLContext *c,GLParam *p)
19
{
20
  int mode=p[1].i;
21
  switch(mode) {
22
  case GL_MODELVIEW:
23
    c->matrix_mode=0;
24
    break;
25
  case GL_PROJECTION:
26
    c->matrix_mode=1;
27
    break;
28
  case GL_TEXTURE:
29
    c->matrix_mode=2;
30
    break;
31
  default:
32
    assert(0);
33
  }
34
}
35
 
36
void glopLoadMatrix(GLContext *c,GLParam *p)
37
{
38
  M4 *m;
39
  int i;
40
 
41
  GLParam *q;
42
 
43
  m=c->matrix_stack_ptr[c->matrix_mode];
44
  q=p+1;
45
 
46
  for(i=0;i<4;i++) {
47
    m->m[0][i]=q[0].f;
48
    m->m[1][i]=q[1].f;
49
    m->m[2][i]=q[2].f;
50
    m->m[3][i]=q[3].f;
51
    q+=4;
52
  }
53
 
54
  gl_matrix_update(c);
55
}
56
 
57
void glopLoadIdentity(GLContext *c,GLParam *p)
58
{
59
 
60
  gl_M4_Id(c->matrix_stack_ptr[c->matrix_mode]);
61
 
62
  gl_matrix_update(c);
63
}
64
 
65
void glopMultMatrix(GLContext *c,GLParam *p)
66
{
67
  M4 m;
68
  int i;
69
 
70
  GLParam *q;
71
  q=p+1;
72
 
73
  for(i=0;i<4;i++) {
74
    m.m[0][i]=q[0].f;
75
    m.m[1][i]=q[1].f;
76
    m.m[2][i]=q[2].f;
77
    m.m[3][i]=q[3].f;
78
    q+=4;
79
  }
80
 
81
  gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m);
82
 
83
  gl_matrix_update(c);
84
}
85
 
86
 
87
void glopPushMatrix(GLContext *c,GLParam *p)
88
{
89
  int n=c->matrix_mode;
90
  M4 *m;
91
 
92
  assert( (c->matrix_stack_ptr[n] - c->matrix_stack[n] + 1 )
93
	   < c->matrix_stack_depth_max[n] );
94
 
95
  m=++c->matrix_stack_ptr[n];
96
 
97
  gl_M4_Move(&m[0],&m[-1]);
98
 
99
  gl_matrix_update(c);
100
}
101
 
102
void glopPopMatrix(GLContext *c,GLParam *p)
103
{
104
  int n=c->matrix_mode;
105
 
106
  assert( c->matrix_stack_ptr[n] > c->matrix_stack[n] );
107
  c->matrix_stack_ptr[n]--;
108
  gl_matrix_update(c);
109
}
110
 
111
 
112
void glopRotate(GLContext *c,GLParam *p)
113
{
114
  M4 m;
115
  float u[3];
116
  float angle;
117
  int dir_code;
118
 
119
  angle = p[1].f * M_PI / 180.0;
120
  u[0]=p[2].f;
121
  u[1]=p[3].f;
122
  u[2]=p[4].f;
123
 
124
  /* simple case detection */
125
  dir_code = ((u[0] != 0)<<2) | ((u[1] != 0)<<1) | (u[2] != 0);
126
 
127
  switch(dir_code) {
128
  case 0:
129
    gl_M4_Id(&m);
130
    break;
131
  case 4:
132
    if (u[0] < 0) angle=-angle;
133
    gl_M4_Rotate(&m,angle,0);
134
    break;
135
  case 2:
136
    if (u[1] < 0) angle=-angle;
137
    gl_M4_Rotate(&m,angle,1);
138
    break;
139
  case 1:
140
    if (u[2] < 0) angle=-angle;
141
    gl_M4_Rotate(&m,angle,2);
142
    break;
143
  default:
144
    {
145
      float cost, sint;
146
 
147
      /* normalize vector */
148
      float len = u[0]*u[0]+u[1]*u[1]+u[2]*u[2];
149
      if (len == 0.0f) return;
150
      len = 1.0f / sqrt(len);
151
      u[0] *= len;
152
      u[1] *= len;
153
      u[2] *= len;
154
 
155
      /* store cos and sin values */
156
      cost=cos(angle);
157
      sint=sin(angle);
158
 
159
      /* fill in the values */
160
      m.m[3][0]=m.m[3][1]=m.m[3][2]=
161
        m.m[0][3]=m.m[1][3]=m.m[2][3]=0.0f;
162
      m.m[3][3]=1.0f;
163
 
164
      /* do the math */
165
      m.m[0][0]=u[0]*u[0]+cost*(1-u[0]*u[0]);
166
      m.m[1][0]=u[0]*u[1]*(1-cost)-u[2]*sint;
167
      m.m[2][0]=u[2]*u[0]*(1-cost)+u[1]*sint;
168
      m.m[0][1]=u[0]*u[1]*(1-cost)+u[2]*sint;
169
      m.m[1][1]=u[1]*u[1]+cost*(1-u[1]*u[1]);
170
      m.m[2][1]=u[1]*u[2]*(1-cost)-u[0]*sint;
171
      m.m[0][2]=u[2]*u[0]*(1-cost)-u[1]*sint;
172
      m.m[1][2]=u[1]*u[2]*(1-cost)+u[0]*sint;
173
      m.m[2][2]=u[2]*u[2]+cost*(1-u[2]*u[2]);
174
    }
175
  }
176
 
177
  gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m);
178
 
179
  gl_matrix_update(c);
180
}
181
 
182
void glopScale(GLContext *c,GLParam *p)
183
{
184
  float *m;
185
  float x=p[1].f,y=p[2].f,z=p[3].f;
186
 
187
  m=&c->matrix_stack_ptr[c->matrix_mode]->m[0][0];
188
 
189
  m[0] *= x;   m[1] *= y;   m[2]  *= z;
190
  m[4] *= x;   m[5] *= y;   m[6]  *= z;
191
  m[8] *= x;   m[9] *= y;   m[10] *= z;
192
  m[12] *= x;   m[13] *= y;   m[14] *= z;
193
  gl_matrix_update(c);
194
}
195
 
196
void glopTranslate(GLContext *c,GLParam *p)
197
{
198
  float *m;
199
  float x=p[1].f,y=p[2].f,z=p[3].f;
200
 
201
  m=&c->matrix_stack_ptr[c->matrix_mode]->m[0][0];
202
 
203
  m[3] = m[0] * x + m[1] * y + m[2]  * z + m[3];
204
  m[7] = m[4] * x + m[5] * y + m[6]  * z + m[7];
205
  m[11] = m[8] * x + m[9] * y + m[10] * z + m[11];
206
  m[15] = m[12] * x + m[13] * y + m[14] * z + m[15];
207
 
208
  gl_matrix_update(c);
209
}
210
 
211
 
212
void glopFrustum(GLContext *c,GLParam *p)
213
{
214
  float *r;
215
  M4 m;
216
  float left=p[1].f;
217
  float right=p[2].f;
218
  float bottom=p[3].f;
219
  float top=p[4].f;
220
  float near=p[5].f;
221
  float farp=p[6].f;
222
  float x,y,A,B,C,D;
223
 
224
  x = (2.0*near) / (right-left);
225
  y = (2.0*near) / (top-bottom);
226
  A = (right+left) / (right-left);
227
  B = (top+bottom) / (top-bottom);
228
  C = -(farp+near) / ( farp-near);
229
  D = -(2.0*farp*near) / (farp-near);
230
 
231
  r=&m.m[0][0];
232
  r[0]= x; r[1]=0; r[2]=A; r[3]=0;
233
  r[4]= 0; r[5]=y; r[6]=B; r[7]=0;
234
  r[8]= 0; r[9]=0; r[10]=C; r[11]=D;
235
  r[12]= 0; r[13]=0; r[14]=-1; r[15]=0;
236
 
237
  gl_M4_MulLeft(c->matrix_stack_ptr[c->matrix_mode],&m);
238
 
239
  gl_matrix_update(c);
240
}
241