1 #ifdef _WIN32
2 #include "windows.h"
3 #endif
4
5 #include <GL/gl.h>
6 #include "GL/glut.h"
7
8 #include "stdio.h"
9 #include "string.h"
10 #include "stdlib.h"
11 #include "math.h"
12 #include "vector.h"
13 #include "cmc.h"
14 #include "3dobject.h"
15
16 #include "bitmap.h"
17
18 #include "myglutaux.h"
19
20
21
22 C3DObject *characters[256]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
23 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
24 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
26 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
27 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
28 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
29 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
30 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
31 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
32 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
33 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
34 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
35 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
37 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
38
39 //int TEXTURE_APPROXIMATION=GL_NEAREST;
40 int TEXTURE_APPROXIMATION=GL_LINEAR;
41
42
draw3Dtext(char * text,float dx,float dy,float dz,float r,float g,float b)43 float draw3Dtext(char *text,float dx,float dy,float dz,float r,float g,float b)
44 {
45 int i;
46 int len=strlen(text);
47 float ancho=(float(len-1)*1.8F);
48
49 glMatrixMode(GL_MODELVIEW);
50 glPushMatrix();
51
52 glScalef(dx,dy,dz);
53 glTranslatef(-(ancho/2.0F),0,0);
54
55 for(i=0;i<len;i++) {
56 if (characters[text[i]]==0) {
57 char filename[6];
58
59 filename[0]=text[i];
60 filename[1]='.';
61 filename[2]='a';
62 filename[3]='s';
63 filename[4]='c';
64 filename[5]=0;
65 characters[text[i]]=new C3DObject(filename,"/usr/local/share/netherearth/textures/");
66 characters[text[i]]->normalize();
67 } /* if */
68 if (characters[text[i]]!=NULL) {
69 characters[text[i]]->draw(r,g,b);
70 } /* if */
71 glTranslatef(1.8F,0,0);
72 } /* for */
73
74 glPopMatrix();
75
76 return (ancho+1.0F)*dx;
77 } /* draw3Dtext */
78
79
nearest2pow(int n)80 int nearest2pow(int n)
81 {
82 int v[]={2,4,8,16,32,64,128,256,512,-1};
83 int better,dif,i;
84
85 better=2;
86 dif=abs(n-v[0]);
87
88 i=0;
89 while(v[i]!=-1) {
90 if (abs(n-v[i])<dif) {
91 better=v[i];
92 dif=abs(n-v[i]);
93 } /* if */
94 i++;
95 } /* while */
96
97 return better;
98 } /* nearest2pow */
99
100
glutSolidBox(float dx,float dy,float dz)101 void glutSolidBox(float dx,float dy,float dz)
102 {
103 glBegin(GL_TRIANGLES);
104
105 /* UP */
106 glNormal3f(0,1.0,0);
107 glVertex3f(-dx,-dy,-dz);
108 glVertex3f( dx,-dy, dz);
109 glVertex3f( dx,-dy,-dz);
110
111 glVertex3f( dx,-dy, dz);
112 glVertex3f(-dx,-dy,-dz);
113 glVertex3f(-dx,-dy, dz);
114
115 /* DOWN */
116 glNormal3f(0,-1.0,0);
117 glVertex3f( dx, dy, dz);
118 glVertex3f(-dx, dy,-dz);
119 glVertex3f( dx, dy,-dz);
120
121 glVertex3f(-dx, dy,-dz);
122 glVertex3f( dx, dy, dz);
123 glVertex3f(-dx, dy, dz);
124
125 /* LEFT */
126 glNormal3f(1.0,0,0);
127 glVertex3f(-dx,-dy,-dz);
128 glVertex3f(-dx, dy, dz);
129 glVertex3f(-dx, dy,-dz);
130
131 glVertex3f(-dx, dy, dz);
132 glVertex3f(-dx,-dy,-dz);
133 glVertex3f(-dx,-dy, dz);
134
135 /* RIGHT */
136 glNormal3f(-1.0,0,0);
137 glVertex3f( dx, dy, dz);
138 glVertex3f( dx,-dy,-dz);
139 glVertex3f( dx, dy,-dz);
140
141 glVertex3f( dx,-dy,-dz);
142 glVertex3f( dx, dy, dz);
143 glVertex3f( dx,-dy, dz);
144
145 /* FRONT */
146 glNormal3f(0.0,0,-1.0);
147 glVertex3f(-dx,-dy, dz);
148 glVertex3f( dx, dy, dz);
149 glVertex3f( dx,-dy, dz);
150
151 glVertex3f( dx, dy, dz);
152 glVertex3f(-dx,-dy, dz);
153 glVertex3f(-dx, dy, dz);
154
155 /* BACK */
156 glNormal3f(0.0,0,1.0);
157 glVertex3f( dx, dy,-dz);
158 glVertex3f(-dx,-dy,-dz);
159 glVertex3f( dx,-dy,-dz);
160
161 glVertex3f(-dx,-dy,-dz);
162 glVertex3f( dx, dy,-dz);
163 glVertex3f(-dx, dy,-dz);
164
165 glEnd();
166 } /* glutSolidBox */
167
168
glutPrint(char * str)169 void glutPrint(char *str)
170 {
171 int i;
172
173 for(i=0;str[i]!=0;i++)
174 glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,str[i]);
175 } /* glutPrint */
176
177
glutPrintxy(float x,float y,char * str)178 void glutPrintxy(float x,float y,char *str)
179 {
180 glMatrixMode(GL_PROJECTION);
181 glPushMatrix();
182 glLoadIdentity();
183 glMatrixMode(GL_MODELVIEW);
184 glPushMatrix();
185 glLoadIdentity();
186
187 glRasterPos2f(x,y);
188 glutPrint(str);
189
190 glMatrixMode(GL_MODELVIEW);
191 glPopMatrix();
192 glMatrixMode(GL_PROJECTION);
193 glPopMatrix();
194 } /* glutPrint */
195
196
Normal(double vector1[3],double vector2[3],double resultado[3])197 void Normal (double vector1[3],double vector2[3],double resultado[3])
198 {
199 double norma;
200 resultado[0]=vector1[1]*vector2[2]-vector2[1]*vector1[2];
201 resultado[1]=vector1[2]*vector2[0]-vector2[2]*vector1[0];
202 resultado[2]=vector1[0]*vector2[1]-vector2[0]*vector1[1];
203 norma=sqrt(resultado[0]*resultado[0]+
204 resultado[1]*resultado[1]+
205 resultado[2]*resultado[2]);
206 resultado[0]/=norma;
207 resultado[1]/=norma;
208 resultado[2]/=norma;
209 } /* Normal */
210
211
Normalf(float vector1[3],float vector2[3],float resultado[3])212 void Normalf (float vector1[3],float vector2[3],float resultado[3])
213 {
214 float norma;
215 resultado[0]=vector1[1]*vector2[2]-vector2[1]*vector1[2];
216 resultado[1]=vector1[2]*vector2[0]-vector2[2]*vector1[0];
217 resultado[2]=vector1[0]*vector2[1]-vector2[0]*vector1[1];
218 norma=sqrt(resultado[0]*resultado[0]+
219 resultado[1]*resultado[1]+
220 resultado[2]*resultado[2]);
221 resultado[0]/=norma;
222 resultado[1]/=norma;
223 resultado[2]/=norma;
224 } /* Normal */
225
226
ObtainYAngle(Vector * v)227 float ObtainYAngle(Vector *v)
228 {
229 double x=v->x,z=v->z;
230 double h=sqrt(x*x+z*z);
231 double cy,sy;
232
233 if (h==0) return 0;
234
235 cy=x/h;
236 sy=z/h;
237 // printf("%f %f %f\n",cy,sy,h);
238 return float((atan2(cy,sy)*180))/3.141592F;
239 } /* ObtainYAngle */
240
241
ApplyMatrix(float v[4],float matrix[16],float out[4])242 void ApplyMatrix(float v[4],float matrix[16],float out[4])
243 {
244 out[0]=v[0]*matrix[0]+v[1]*matrix[4]+v[2]*matrix[8]+v[3]*matrix[12];
245 out[1]=v[0]*matrix[1]+v[1]*matrix[5]+v[2]*matrix[9]+v[3]*matrix[13];
246 out[2]=v[0]*matrix[2]+v[1]*matrix[6]+v[2]*matrix[10]+v[3]*matrix[14];
247 out[3]=v[0]*matrix[3]+v[1]*matrix[7]+v[2]*matrix[11]+v[3]*matrix[15];
248
249 } /* ApplyMatrix */
250
251
ApplyMatrix2(float v[4],float matrix[16],float out[4])252 void ApplyMatrix2(float v[4],float matrix[16],float out[4])
253 {
254 out[0]=v[0]*matrix[0]+v[1]*matrix[1]+v[2]*matrix[2]+v[3]*matrix[3];
255 out[1]=v[0]*matrix[4]+v[1]*matrix[5]+v[2]*matrix[6]+v[3]*matrix[7];
256 out[2]=v[0]*matrix[8]+v[1]*matrix[9]+v[2]*matrix[10]+v[3]*matrix[11];
257 out[3]=v[0]*matrix[12]+v[1]*matrix[13]+v[2]*matrix[14]+v[3]*matrix[15];
258
259 } /* ApplyMatrix2 */
260
261
MulMatrix(float m2[16],float m1[16],float out[16])262 void MulMatrix(float m2[16],float m1[16],float out[16])
263 {
264 out[0]=m1[0]*m2[0]+m1[1]*m2[4]+m1[2]*m2[8]+m1[3]*m2[12];
265 out[1]=m1[0]*m2[1]+m1[1]*m2[5]+m1[2]*m2[9]+m1[3]*m2[13];
266 out[2]=m1[0]*m2[2]+m1[1]*m2[6]+m1[2]*m2[10]+m1[3]*m2[14];
267 out[3]=m1[0]*m2[3]+m1[1]*m2[7]+m1[2]*m2[11]+m1[3]*m2[15];
268
269 out[4]=m1[4]*m2[0]+m1[5]*m2[4]+m1[6]*m2[8]+m1[7]*m2[12];
270 out[5]=m1[4]*m2[1]+m1[5]*m2[5]+m1[6]*m2[9]+m1[7]*m2[13];
271 out[6]=m1[4]*m2[2]+m1[5]*m2[6]+m1[6]*m2[10]+m1[7]*m2[14];
272 out[7]=m1[4]*m2[3]+m1[5]*m2[7]+m1[6]*m2[11]+m1[7]*m2[15];
273
274 out[8]=m1[8]*m2[0]+m1[9]*m2[4]+m1[10]*m2[8]+m1[11]*m2[12];
275 out[9]=m1[8]*m2[1]+m1[9]*m2[5]+m1[10]*m2[9]+m1[11]*m2[13];
276 out[10]=m1[8]*m2[2]+m1[9]*m2[6]+m1[10]*m2[10]+m1[11]*m2[14];
277 out[11]=m1[8]*m2[3]+m1[9]*m2[7]+m1[10]*m2[11]+m1[11]*m2[15];
278
279 out[12]=m1[12]*m2[0]+m1[13]*m2[4]+m1[14]*m2[8]+m1[15]*m2[12];
280 out[13]=m1[12]*m2[1]+m1[13]*m2[5]+m1[14]*m2[9]+m1[15]*m2[13];
281 out[14]=m1[12]*m2[2]+m1[13]*m2[6]+m1[14]*m2[10]+m1[15]*m2[14];
282 out[15]=m1[12]*m2[3]+m1[13]*m2[7]+m1[14]*m2[11]+m1[15]*m2[15];
283
284 } /* MulMatrix */
285
286
PlaneLineCollision(float plane[4],float p[3],float v[3],float crossp[3])287 bool PlaneLineCollision(float plane[4],float p[3],float v[3],float crossp[3])
288 {
289 float lambda;
290 float tmp1,tmp2;
291
292 tmp1=plane[0]*v[0]+plane[1]*v[1]+plane[2]*v[2];
293 if (tmp1==0) return false;
294
295 tmp2=plane[0]*p[0]+plane[1]*p[1]+plane[2]*p[2]+plane[3];
296 lambda=-tmp2/tmp1;
297
298 crossp[0]=p[0]+v[0]*lambda;
299 crossp[1]=p[1]+v[1]*lambda;
300 crossp[2]=p[2]+v[2]*lambda;
301 return true;
302 } /* PlaneLineCollision */
303
304
305
DistributeVector(Vector v,Vector v2,Vector * r1,Vector * r2)306 void DistributeVector(Vector v,Vector v2,Vector *r1,Vector *r2)
307 {
308 double norma;
309 double tmp;
310
311 norma=v.normalize();
312
313 tmp=v.x*v2.x+v.y*v2.y+v.z*v2.z;
314
315 r1->x=tmp*v.x;
316 r1->y=tmp*v.y;
317 r1->z=tmp*v.z;
318
319 r2->x=v2.x-r1->x;
320 r2->y=v2.y-r1->y;
321 r2->z=v2.z-r1->z;
322 } /* DistributeVector */
323
324
determinante_d(double m[9])325 double determinante_d(double m[9])
326 {
327 return m[0]*(m[4]*m[8]-m[7]*m[5]) -
328 m[1]*(m[3]*m[8]-m[5]*m[6]) +
329 m[2]*(m[3]*m[7]-m[6]*m[4]);
330 } /* determinante_d */
331
332
determinante_f(float m[9])333 float determinante_f(float m[9])
334 {
335 return m[0]*(m[4]*m[8]-m[7]*m[5]) -
336 m[1]*(m[3]*m[8]-m[5]*m[6]) +
337 m[2]*(m[3]*m[7]-m[6]*m[4]);
338 } /* determinante_f */
339
340
kramer_d(double m[9],double c[3],double sol[3])341 bool kramer_d(double m[9],double c[3],double sol[3])
342 {
343 double mt[9];
344 double d;
345
346 d=determinante_d(m);
347 if (d==0) return false;
348
349 mt[0]=c[0];
350 mt[1]=m[1];
351 mt[2]=m[2];
352
353 mt[3]=c[1];
354 mt[4]=m[4];
355 mt[5]=m[5];
356
357 mt[6]=c[2];
358 mt[7]=m[7];
359 mt[8]=m[8];
360
361 sol[0]=determinante_d(mt)/d;
362
363 mt[0]=m[0];
364 mt[1]=c[0];
365 mt[2]=m[2];
366
367 mt[3]=m[3];
368 mt[4]=c[1];
369 mt[5]=m[5];
370
371 mt[6]=m[6];
372 mt[7]=c[2];
373 mt[8]=m[8];
374
375 sol[1]=determinante_d(mt)/d;
376
377 mt[0]=m[0];
378 mt[1]=m[1];
379 mt[2]=c[0];
380
381 mt[3]=m[3];
382 mt[4]=m[4];
383 mt[5]=c[1];
384
385 mt[6]=m[6];
386 mt[7]=m[7];
387 mt[8]=c[2];
388
389 sol[2]=determinante_d(mt)/d;
390
391 return true;
392 } /* kramer_d */
393
394
kramer_f(float m[9],float c[3],float sol[3])395 bool kramer_f(float m[9],float c[3],float sol[3])
396 {
397 float mt[9];
398 float d;
399
400 d=determinante_f(m);
401 if (d==0) return false;
402
403 mt[0]=c[0];
404 mt[1]=m[1];
405 mt[2]=m[2];
406
407 mt[3]=c[1];
408 mt[4]=m[4];
409 mt[5]=m[5];
410
411 mt[6]=c[2];
412 mt[7]=m[7];
413 mt[8]=m[8];
414
415 sol[0]=determinante_f(mt)/d;
416
417 mt[0]=m[0];
418 mt[1]=c[0];
419 mt[2]=m[2];
420
421 mt[3]=m[3];
422 mt[4]=c[1];
423 mt[5]=m[5];
424
425 mt[6]=m[6];
426 mt[7]=c[2];
427 mt[8]=m[8];
428
429 sol[1]=determinante_f(mt)/d;
430
431 mt[0]=m[0];
432 mt[1]=m[1];
433 mt[2]=c[0];
434
435 mt[3]=m[3];
436 mt[4]=m[4];
437 mt[5]=c[1];
438
439 mt[6]=m[6];
440 mt[7]=m[7];
441 mt[8]=c[2];
442
443 sol[2]=determinante_f(mt)/d;
444
445 return true;
446 } /* kramer_f */
447
448
gauss_solve_d(double * m,double * ctnt,double * s,int neq)449 bool gauss_solve_d(double *m,double *ctnt,double *s,int neq)
450 {
451 int i,j,k;
452 int *order;
453 bool found;
454 double c,det;
455 double tmp;
456
457 // FILE *fp;
458
459 // fp=fopen("out.txt","w");
460
461 det=det_d(m,neq);
462 if (det==0) return false;
463
464 // fprintf(fp,"%f\n",float(det));
465
466 order=new int[neq];
467 for(i=0;i<neq;i++) order[i]=-1;
468
469 for(i=0;i<neq;i++) {
470 // int a,b;
471 // fprintf(fp,"%i\n",i);
472 // for(a=0;a<neq;a++) {
473 // for(b=0;b<neq;b++) {
474 // fprintf(fp,"%.6f ",float(m[a*neq+b]));
475 // } /* for */
476 // fprintf(fp,"| %.6f\n",float(ctnt[a]));
477 // } /* for */
478
479 /* Buscar una ecuaci�n con coeficiente de la variable i diferente de 0: */
480 for(j=0,found=false,tmp=0;j<neq;j++) {
481 if (fabs(m[i+j*neq])>tmp) {
482 found=true;
483 for(k=0;k<i;k++) {
484 if (order[k]==j) found=false;
485 } /* for */
486 if (found) {
487 order[i]=j;
488 tmp=fabs(m[i+j*neq]);
489 } /* if */
490 } /* if */
491 } /* for */
492
493 if (!found) return false;
494
495 /* Colocar un 1: */
496 c=m[i+order[i]*neq];
497 for(j=0;j<neq;j++) {
498 m[order[i]*neq+j]/=c;
499 } /* for */
500 ctnt[order[i]]/=c;
501
502 /* Llenar la columna de ceros: */
503 for(j=0;j<neq;j++) {
504 if (j!=order[i]) {
505 c=m[i+j*neq];
506
507 for(k=0;k<neq;k++) {
508 m[j*neq+k]-=c*m[order[i]*neq+k];
509 } /* for */
510 m[j*neq+i]=0;
511 ctnt[j]-=c*ctnt[order[i]];
512 } /* if */
513 } /* for */
514 } /* for */
515
516 for(i=0;i<neq;i++) {
517 s[i]=ctnt[order[i]]/m[order[i]*neq+i];
518 } /* for */
519
520 delete order;
521 return true;
522 } /* gauss_solve_d */
523
524
det_d(double * m,int size)525 double det_d(double *m,int size)
526 {
527 double acum=0;
528 double *mt;
529 int i,j,k;
530
531 if (size==1) return m[0];
532
533 mt=new double[(size-1)*(size-1)];
534
535 for(i=0;i<size;i++) {
536 double val;
537 val=m[i];
538 if (val!=0) {
539 if ((i&1)!=0) val=-val;
540
541 for(j=0;j<size-1;j++) {
542 for(k=0;k<size-1;k++) {
543 if (k<i) {
544 mt[j*(size-1)+k]=m[(j+1)*size+k];
545 } else {
546 mt[j*(size-1)+k]=m[(j+1)*size+k+1];
547 } /* if */
548 } /* for */
549 } /* for */
550
551 acum+=val*det_d(mt,size-1);
552 } /* if */
553 } /* for */
554
555 delete mt;
556
557 return acum;
558 } /* det_d */
559
560
distancia_a_recta(Vector p,Vector pr,Vector vr)561 double distancia_a_recta(Vector p,Vector pr,Vector vr)
562 {
563 /* Buscamos el plano que tiene como vector normal 'vr' y pasa por 'p': */
564 /* x*vr.x + y*vr.y + z*vr.z - (p*vr) = 0 */
565
566 /* Buscamos el punto de colisi�n entre la recta y el plano anterior: */
567 Vector col_point;
568 double lambda;
569 double tmp1,tmp2;
570
571 tmp1=vr*vr;
572 tmp2=vr*pr-(p*vr);
573 lambda=-tmp2/tmp1;
574
575 col_point=pr+vr*lambda;
576
577 return (p-col_point).norma();
578 } /* distancia_a_recta */
579
580
LineLineCollision(float p0[3],float v0[3],float p1[3],float v1[3],float * l1,float * l2)581 bool LineLineCollision(float p0[3],float v0[3],float p1[3],float v1[3],float *l1,float *l2)
582 {
583 float m[6];
584 float det;
585
586 m[0]=v0[0]; m[1]=-v1[0]; m[2]=p1[0]-p0[0];
587 m[3]=v0[1]; m[4]=-v1[1]; m[5]=p1[1]-p0[1];
588 det=m[0]*m[4]-m[1]*m[3];
589 if (det!=0) {
590 *l1=(m[2]*m[4]-m[5]*m[1])/det;
591 *l2=(m[0]*m[5]-m[3]*m[2])/det;
592 return true;
593 } /* if */
594
595 m[0]=v0[0]; m[1]=-v1[0]; m[2]=p1[0]-p0[0];
596 m[3]=v0[2]; m[4]=-v1[2]; m[5]=p1[2]-p0[2];
597 det=m[0]*m[4]-m[1]*m[3];
598 if (det!=0) {
599 *l1=(m[2]*m[4]-m[5]*m[1])/det;
600 *l2=(m[0]*m[5]-m[3]*m[2])/det;
601 return true;
602 } /* if */
603
604 m[0]=v0[1]; m[1]=-v1[1]; m[2]=p1[1]-p0[1];
605 m[3]=v0[2]; m[4]=-v1[2]; m[5]=p1[2]-p0[2];
606 det=m[0]*m[4]-m[1]*m[3];
607 if (det!=0) {
608 *l1=(m[2]*m[4]-m[5]*m[1])/det;
609 *l2=(m[0]*m[5]-m[3]*m[2])/det;
610 return true;
611 } /* if */
612
613 return false;
614 } /* LineLineCollision */
615
616
createTexture(char * fname)617 unsigned int createTexture(char *fname)
618 {
619 unsigned int tname=0;
620 int i,j,k,val;
621 int sz;
622 GLubyte *textura;
623 Bitmap *bmp=NULL;
624
625 bmp=new Bitmap(fname);
626
627 if (bmp->valid()) {
628 sz=bmp->getdx();
629 if (bmp->getdy()<sz) sz=bmp->getdy();
630 textura=new GLubyte[sz*sz*4];
631 for(j=0,k=0;j<sz;j++) {
632 for(i=0;i<sz;i++) {
633 val=i+j*bmp->getdx();
634 textura[k++]=bmp->getr(val);
635 textura[k++]=bmp->getg(val);
636 textura[k++]=bmp->getb(val);
637 textura[k++]=255;
638 } /* for */
639 } /* for */
640
641 glGenTextures(1,&tname);
642 glPixelStorei(GL_UNPACK_ALIGNMENT,tname);
643 glBindTexture(GL_TEXTURE_2D,tname);
644 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
645 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
646 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,TEXTURE_APPROXIMATION);
647 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,TEXTURE_APPROXIMATION);
648 glTexImage2D(GL_TEXTURE_2D,0,4,sz,sz,0,GL_RGBA,GL_UNSIGNED_BYTE,textura);
649 delete textura;
650 } else {
651 delete bmp;
652 return 0;
653 } /* if */
654
655 return tname;
656 } /* createTexture */
657
658
createTexture(char * fname,int x,int y,int sz)659 unsigned int createTexture(char *fname,int x,int y,int sz)
660 {
661 unsigned int tname=0;
662 int i,j,k,val;
663 GLubyte *textura;
664 Bitmap *bmp=NULL;
665
666 bmp=new Bitmap(fname);
667
668 if (bmp->valid()) {
669 textura=new GLubyte[sz*sz*4];
670 for(j=0,k=0;j<sz;j++) {
671 for(i=0;i<sz;i++) {
672 val=(x+i)+(y+j)*bmp->getdx();
673 textura[k++]=bmp->getr(val);
674 textura[k++]=bmp->getg(val);
675 textura[k++]=bmp->getb(val);
676 textura[k++]=255;
677 } /* for */
678 } /* for */
679
680 glGenTextures(1,&tname);
681 glPixelStorei(GL_UNPACK_ALIGNMENT,tname);
682 glBindTexture(GL_TEXTURE_2D,tname);
683 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
684 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
685 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,TEXTURE_APPROXIMATION);
686 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,TEXTURE_APPROXIMATION);
687 glTexImage2D(GL_TEXTURE_2D,0,4,sz,sz,0,GL_RGBA,GL_UNSIGNED_BYTE,textura);
688 delete textura;
689 delete bmp;
690 } else {
691 delete bmp;
692 return 0;
693 } /* if */
694
695 return tname;
696 } /* createTexture */
697
698
699