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