Annotation of OpenXM/src/cfep/glray3.c, Revision 1.1.1.1
1.1 takayama 1: /*
2: * This program is under the GNU GPL.
3: * Use at your own risk.
4: *
5: * written by David Bucciarelli (tech.hmw@plus.it)
6: * Humanware s.r.l.
7: * MesaDemo. Mesa-5.1/progs/demos/ray.c. Modified by Nobuki Takayama. 2006-02-22.
8: */
9:
10: #include <stdio.h>
11: #include <stdlib.h>
12: #include <string.h>
13: #include <math.h>
14: #include "myenv.h"
15:
16: #ifdef COCOA
17: #import <OpenGL/OpenGL.h>
18: #import <OpenGL/gl.h>
19: #import <OpenGL/glu.h>
20: #else
21: #include <GL/glut.h>
22: #endif
23:
24: #include "mygl.h"
25:
26: static int WIDTH = 640;
27: static int HEIGHT = 480;
28:
29: static GLint T0 = 0;
30: static GLint Frames = 0;
31:
32: #define BASESIZE 7.5f
33: #define SPHERE_RADIUS 0.75f
34:
35: #define TEX_CHECK_WIDTH 256
36: #define TEX_CHECK_HEIGHT 256
37: #define TEX_CHECK_SLOT_SIZE (TEX_CHECK_HEIGHT/16)
38: #define TEX_CHECK_NUMSLOT (TEX_CHECK_HEIGHT/TEX_CHECK_SLOT_SIZE)
39:
40: #define TEX_REFLECT_WIDTH 256
41: #define TEX_REFLECT_HEIGHT 256
42: #define TEX_REFLECT_SLOT_SIZE (TEX_REFLECT_HEIGHT/16)
43: #define TEX_REFLECT_NUMSLOT (TEX_REFLECT_HEIGHT/TEX_REFLECT_SLOT_SIZE)
44:
45: #ifndef M_PI
46: #define M_PI 3.1415926535
47: #endif
48:
49: #define EPSILON 0.0001
50:
51: #define clamp255(a) ( (a)<(0.0f) ? (0.0f) : ((a)>(255.0f) ? (255.0f) : (a)) )
52:
53: #define fabs(x) ((x)<0.0f?-(x):(x))
54:
55: #define vequ(a,b) { (a)[0]=(b)[0]; (a)[1]=(b)[1]; (a)[2]=(b)[2]; }
56: #define vsub(a,b,c) { (a)[0]=(b)[0]-(c)[0]; (a)[1]=(b)[1]-(c)[1]; (a)[2]=(b)[2]-(c)[2]; }
57: #define dprod(a,b) ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
58: #define vnormalize(a,b) { \
59: register float m_norm; \
60: m_norm=sqrt((double)dprod((a),(a))); \
61: (a)[0] /=m_norm; \
62: (a)[1] /=m_norm; \
63: (a)[2] /=m_norm; }
64:
65: static GLubyte checkmap[TEX_CHECK_HEIGHT][TEX_CHECK_WIDTH][3];
66: static GLuint checkid;
67: static int checkmap_currentslot = 0;
68:
69: static GLubyte reflectmap[TEX_REFLECT_HEIGHT][TEX_REFLECT_WIDTH][3];
70: static GLuint reflectid;
71: static int reflectmap_currentslot = 0;
72:
73: static GLuint lightdlist;
74: static GLuint objdlist;
75:
76: static float lightpos[3] = { 2.1, 2.1, 2.8 };
77: static float objpos[3] = { 0.0, 0.0, 1.0 };
78:
79: static float sphere_pos[TEX_CHECK_HEIGHT][TEX_REFLECT_WIDTH][3];
80:
81: static int win = 0;
82:
83: static float fogcolor[4] = { 0.05, 0.05, 0.05, 1.0 };
84:
85: static float obs[3] = { 7.0, 0.0, 2.0 };
86: static float dir[3];
87: static float v = 0.0;
88: static float alpha = -90.0;
89: static float beta = 90.0;
90:
91: static int fog = 1;
92: static int bfcull = 1;
93: static int poutline = 0;
94: static int help = 1;
95: static int showcheckmap = 1;
96: static int showreflectmap = 1;
97: static int joyavailable = 0;
98: static int joyactive = 0;
99:
100: static void
101: calcposobs(void)
102: {
103: dir[0] = sin(alpha * M_PI / 180.0);
104: dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
105: dir[2] = cos(beta * M_PI / 180.0);
106:
107: if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
108: dir[0] = 0;
109: if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
110: dir[1] = 0;
111: if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
112: dir[2] = 0;
113:
114: obs[0] += v * dir[0];
115: obs[1] += v * dir[1];
116: obs[2] += v * dir[2];
117: }
118:
119:
120:
121: static void
122: reshape(int w, int h)
123: {
124: WIDTH = w;
125: HEIGHT = h;
126: glViewport(0, 0, w, h);
127: glMatrixMode(GL_PROJECTION);
128: glLoadIdentity();
129: gluPerspective(45.0, w / (float) h, 0.8, 40.0);
130: glMatrixMode(GL_MODELVIEW);
131: glLoadIdentity();
132: }
133:
134:
135:
136: static GLboolean
137: seelight(float p[3], float dir[3])
138: {
139: float c[3], b, a, d, t, dist[3];
140:
141: vsub(c, p, objpos);
142: b = -dprod(c, dir);
143: a = dprod(c, c) - SPHERE_RADIUS * SPHERE_RADIUS;
144:
145: if ((d = b * b - a) < 0.0 || (b < 0.0 && a > 0.0))
146: return GL_FALSE;
147:
148: d = sqrt(d);
149:
150: t = b - d;
151:
152: if (t < EPSILON) {
153: t = b + d;
154: if (t < EPSILON)
155: return GL_FALSE;
156: }
157:
158: vsub(dist, lightpos, p);
159: if (dprod(dist, dist) < t * t)
160: return GL_FALSE;
161:
162: return GL_TRUE;
163: }
164:
165: static int
166: colorcheckmap(float ppos[3], float c[3])
167: {
168: static float norm[3] = { 0.0f, 0.0f, 1.0f };
169: float ldir[3], vdir[3], h[3], dfact, kfact, r, g, b;
170: int x, y;
171:
172: x = (int) ((ppos[0] + BASESIZE / 2) * (10.0f / BASESIZE));
173: if ((x < 0) || (x > 10))
174: return GL_FALSE;
175:
176: y = (int) ((ppos[1] + BASESIZE / 2) * (10.0f / BASESIZE));
177: if ((y < 0) || (y > 10))
178: return GL_FALSE;
179:
180: r = 255.0f;
181: if (y & 1) {
182: if (x & 1)
183: g = 255.0f;
184: else
185: g = 0.0f;
186: }
187: else {
188: if (x & 1)
189: g = 0.0f;
190: else
191: g = 255.0f;
192: }
193: b = 0.0f;
194:
195: vsub(ldir, lightpos, ppos);
196: vnormalize(ldir, ldir);
197:
198: if (seelight(ppos, ldir)) {
199: c[0] = r * 0.05f;
200: c[1] = g * 0.05f;
201: c[2] = b * 0.05f;
202:
203: return GL_TRUE;
204: }
205:
206: dfact = dprod(ldir, norm);
207: if (dfact < 0.0f)
208: dfact = 0.0f;
209:
210: vsub(vdir, obs, ppos);
211: vnormalize(vdir, vdir);
212: h[0] = 0.5f * (vdir[0] + ldir[0]);
213: h[1] = 0.5f * (vdir[1] + ldir[1]);
214: h[2] = 0.5f * (vdir[2] + ldir[2]);
215: kfact = dprod(h, norm);
216: kfact = pow(kfact, 6.0) * 7.0 * 255.0;
217:
218: r = r * dfact + kfact;
219: g = g * dfact + kfact;
220: b = b * dfact + kfact;
221:
222: c[0] = clamp255(r);
223: c[1] = clamp255(g);
224: c[2] = clamp255(b);
225:
226: return GL_TRUE;
227: }
228:
229: static void
230: updatecheckmap(int slot)
231: {
232: float c[3], ppos[3];
233: int x, y;
234:
235: glBindTexture(GL_TEXTURE_2D, checkid);
236:
237: ppos[2] = 0.0f;
238: for (y = slot * TEX_CHECK_SLOT_SIZE; y < (slot + 1) * TEX_CHECK_SLOT_SIZE;
239: y++) {
240: ppos[1] = (y / (float) TEX_CHECK_HEIGHT) * BASESIZE - BASESIZE / 2;
241:
242: for (x = 0; x < TEX_CHECK_WIDTH; x++) {
243: ppos[0] = (x / (float) TEX_CHECK_WIDTH) * BASESIZE - BASESIZE / 2;
244:
245: colorcheckmap(ppos, c);
246: checkmap[y][x][0] = (GLubyte) c[0];
247: checkmap[y][x][1] = (GLubyte) c[1];
248: checkmap[y][x][2] = (GLubyte) c[2];
249: }
250: }
251:
252: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, slot * TEX_CHECK_SLOT_SIZE,
253: TEX_CHECK_WIDTH, TEX_CHECK_SLOT_SIZE, GL_RGB,
254: GL_UNSIGNED_BYTE,
255: &checkmap[slot * TEX_CHECK_SLOT_SIZE][0][0]);
256:
257: }
258:
259: static void
260: updatereflectmap(int slot)
261: {
262: float rf, r, g, b, t, dfact, kfact, rdir[3];
263: float rcol[3], ppos[3], norm[3], ldir[3], h[3], vdir[3], planepos[3];
264: int x, y;
265:
266: glBindTexture(GL_TEXTURE_2D, reflectid);
267:
268: for (y = slot * TEX_REFLECT_SLOT_SIZE;
269: y < (slot + 1) * TEX_REFLECT_SLOT_SIZE; y++)
270: for (x = 0; x < TEX_REFLECT_WIDTH; x++) {
271: ppos[0] = sphere_pos[y][x][0] + objpos[0];
272: ppos[1] = sphere_pos[y][x][1] + objpos[1];
273: ppos[2] = sphere_pos[y][x][2] + objpos[2];
274:
275: vsub(norm, ppos, objpos);
276: vnormalize(norm, norm);
277:
278: vsub(ldir, lightpos, ppos);
279: vnormalize(ldir, ldir);
280: vsub(vdir, obs, ppos);
281: vnormalize(vdir, vdir);
282:
283: rf = 2.0f * dprod(norm, vdir);
284: if (rf > EPSILON) {
285: rdir[0] = rf * norm[0] - vdir[0];
286: rdir[1] = rf * norm[1] - vdir[1];
287: rdir[2] = rf * norm[2] - vdir[2];
288:
289: t = -objpos[2] / rdir[2];
290:
291: if (t > EPSILON) {
292: planepos[0] = objpos[0] + t * rdir[0];
293: planepos[1] = objpos[1] + t * rdir[1];
294: planepos[2] = 0.0f;
295:
296: if (!colorcheckmap(planepos, rcol))
297: rcol[0] = rcol[1] = rcol[2] = 0.0f;
298: }
299: else
300: rcol[0] = rcol[1] = rcol[2] = 0.0f;
301: }
302: else
303: rcol[0] = rcol[1] = rcol[2] = 0.0f;
304:
305: dfact = 0.1f * dprod(ldir, norm);
306:
307: if (dfact < 0.0f) {
308: dfact = 0.0f;
309: kfact = 0.0f;
310: }
311: else {
312: h[0] = 0.5f * (vdir[0] + ldir[0]);
313: h[1] = 0.5f * (vdir[1] + ldir[1]);
314: h[2] = 0.5f * (vdir[2] + ldir[2]);
315: kfact = dprod(h, norm);
316: kfact = pow(kfact, 4.0);
317: if (kfact < 1.0e-10)
318: kfact = 0.0;
319: }
320:
321: r = dfact + kfact;
322: g = dfact + kfact;
323: b = dfact + kfact;
324:
325: r *= 255.0f;
326: g *= 255.0f;
327: b *= 255.0f;
328:
329: r += rcol[0];
330: g += rcol[1];
331: b += rcol[2];
332:
333: r = clamp255(r);
334: g = clamp255(g);
335: b = clamp255(b);
336:
337: reflectmap[y][x][0] = (GLubyte) r;
338: reflectmap[y][x][1] = (GLubyte) g;
339: reflectmap[y][x][2] = (GLubyte) b;
340: }
341:
342: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, slot * TEX_REFLECT_SLOT_SIZE,
343: TEX_REFLECT_WIDTH, TEX_REFLECT_SLOT_SIZE, GL_RGB,
344: GL_UNSIGNED_BYTE,
345: &reflectmap[slot * TEX_REFLECT_SLOT_SIZE][0][0]);
346: }
347:
348: static void
349: drawbase(void)
350: {
351: glColor3f(0.0, 0.0, 0.0);
352: glBindTexture(GL_TEXTURE_2D, checkid);
353: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
354:
355: glBegin(GL_QUADS);
356: glTexCoord2f(0.0f, 0.0f);
357: glVertex3f(-BASESIZE / 2.0f, -BASESIZE / 2.0f, 0.0f);
358:
359: glTexCoord2f(1.0f, 0.0f);
360: glVertex3f(BASESIZE / 2.0f, -BASESIZE / 2.0f, 0.0f);
361:
362: glTexCoord2f(1.0f, 1.0f);
363: glVertex3f(BASESIZE / 2.0f, BASESIZE / 2.0f, 0.0f);
364:
365: glTexCoord2f(0.0f, 1.0f);
366: glVertex3f(-BASESIZE / 2.0f, BASESIZE / 2.0f, 0.0f);
367:
368: glEnd();
369: }
370:
371: static void
372: drawobj(void)
373: {
374: glColor3f(0.0, 0.0, 0.0);
375: glBindTexture(GL_TEXTURE_2D, reflectid);
376: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
377:
378: glPushMatrix();
379: glTranslatef(objpos[0], objpos[1], objpos[2]);
380: glCallList(objdlist);
381: glPopMatrix();
382: }
383:
384:
385: static void
386: updatemaps(void)
387: {
388: updatecheckmap(checkmap_currentslot);
389: checkmap_currentslot = (checkmap_currentslot + 1) % TEX_CHECK_NUMSLOT;
390:
391: updatereflectmap(reflectmap_currentslot);
392: reflectmap_currentslot =
393: (reflectmap_currentslot + 1) % TEX_REFLECT_NUMSLOT;
394: }
395:
396: static void
397: draw(void)
398: {
399: static char frbuf[80] = "";
400:
401:
402: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
403:
404: glEnable(GL_TEXTURE_2D);
405: glEnable(GL_DEPTH_TEST);
406: if (fog)
407: glEnable(GL_FOG);
408: else
409: glDisable(GL_FOG);
410:
411: glPushMatrix();
412: calcposobs();
413:
414: gluLookAt(obs[0], obs[1], obs[2],
415: obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
416: 0.0, 0.0, 1.0);
417:
418: drawbase();
419: drawobj();
420:
421: glColor3f(1.0, 1.0, 1.0);
422: glDisable(GL_TEXTURE_2D);
423:
424: glPushMatrix();
425: glTranslatef(lightpos[0], lightpos[1], lightpos[2]);
426: glCallList(lightdlist);
427: glPopMatrix();
428:
429: glPopMatrix();
430:
431: glDisable(GL_DEPTH_TEST);
432: glDisable(GL_FOG);
433:
434: glMatrixMode(GL_PROJECTION);
435: glPushMatrix();
436: glLoadIdentity();
437: glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
438: glMatrixMode(GL_MODELVIEW);
439:
440: glColor3f(0.0f, 0.3f, 1.0f);
441:
442: if (showcheckmap) {
443: glEnable(GL_TEXTURE_2D);
444: glBindTexture(GL_TEXTURE_2D, checkid);
445: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
446:
447: glBegin(GL_QUADS);
448: glTexCoord2f(1.0f, 0.0f);
449: glVertex2i(10, 30);
450: glTexCoord2f(1.0f, 1.0f);
451: glVertex2i(10 + 90, 30);
452: glTexCoord2f(0.0f, 1.0f);
453: glVertex2i(10 + 90, 30 + 90);
454: glTexCoord2f(0.0f, 0.0f);
455: glVertex2i(10, 30 + 90);
456: glEnd();
457:
458: glDisable(GL_TEXTURE_2D);
459: glBegin(GL_LINE_LOOP);
460: glVertex2i(10, 30);
461: glVertex2i(10 + 90, 30);
462: glVertex2i(10 + 90, 30 + 90);
463: glVertex2i(10, 30 + 90);
464: glEnd();
465: glRasterPos2i(105, 65);
466: }
467:
468: if (showreflectmap) {
469: glEnable(GL_TEXTURE_2D);
470: glBindTexture(GL_TEXTURE_2D, reflectid);
471: glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
472:
473: glBegin(GL_QUADS);
474: glTexCoord2f(1.0f, 0.0f);
475: glVertex2i(540, 30);
476: glTexCoord2f(1.0f, 1.0f);
477: glVertex2i(540 + 90, 30);
478: glTexCoord2f(0.0f, 1.0f);
479: glVertex2i(540 + 90, 30 + 90);
480: glTexCoord2f(0.0f, 0.0f);
481: glVertex2i(540, 30 + 90);
482: glEnd();
483:
484: glDisable(GL_TEXTURE_2D);
485: glBegin(GL_LINE_LOOP);
486: glVertex2i(540, 30);
487: glVertex2i(540 + 90, 30);
488: glVertex2i(540 + 90, 30 + 90);
489: glVertex2i(540, 30 + 90);
490: glEnd();
491: glRasterPos2i(360, 65);
492: }
493:
494: glDisable(GL_TEXTURE_2D);
495:
496: glRasterPos2i(10, 10);
497: glRasterPos2i(360, 470);
498:
499:
500: glMatrixMode(GL_PROJECTION);
501: glPopMatrix();
502: glMatrixMode(GL_MODELVIEW);
503:
504: }
505:
506: static void
507: inittextures(void)
508: {
509: int y;
510:
511: glGenTextures(1, &checkid);
512: glBindTexture(GL_TEXTURE_2D, checkid);
513:
514: glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
515: glTexImage2D(GL_TEXTURE_2D, 0, 3, TEX_CHECK_WIDTH, TEX_CHECK_HEIGHT,
516: 0, GL_RGB, GL_UNSIGNED_BYTE, checkmap);
517:
518: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
519: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
520:
521: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
522: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
523:
524: for (y = 0; y < TEX_CHECK_NUMSLOT; y++)
525: updatecheckmap(y);
526:
527:
528:
529: glGenTextures(1, &reflectid);
530: glBindTexture(GL_TEXTURE_2D, reflectid);
531:
532: glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
533: glTexImage2D(GL_TEXTURE_2D, 0, 3, TEX_REFLECT_WIDTH, TEX_REFLECT_HEIGHT,
534: 0, GL_RGB, GL_UNSIGNED_BYTE, reflectmap);
535:
536: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
537: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
538:
539: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
540: glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
541:
542: for (y = 0; y < TEX_REFLECT_NUMSLOT; y++)
543: updatereflectmap(y);
544:
545:
546: }
547:
548: static void
549: initspherepos(void)
550: {
551: float alpha, beta, sa, ca, sb, cb;
552: int x, y;
553:
554: for (y = 0; y < TEX_REFLECT_HEIGHT; y++) {
555: beta = M_PI - y * (M_PI / TEX_REFLECT_HEIGHT);
556:
557: for (x = 0; x < TEX_REFLECT_WIDTH; x++) {
558: alpha = -x * (2.0f * M_PI / TEX_REFLECT_WIDTH);
559:
560: sa = sin(alpha);
561: ca = cos(alpha);
562:
563: sb = sin(beta);
564: cb = cos(beta);
565:
566: sphere_pos[y][x][0] = SPHERE_RADIUS * sa * sb;
567: sphere_pos[y][x][1] = SPHERE_RADIUS * ca * sb;
568: sphere_pos[y][x][2] = SPHERE_RADIUS * cb;
569: }
570: }
571: }
572:
573: static void
574: initdlists(void)
575: {
576: GLUquadricObj *obj;
577:
578: obj = gluNewQuadric();
579: lightdlist = glGenLists(1);
580: glNewList(lightdlist, GL_COMPILE);
581: gluQuadricDrawStyle(obj, GLU_FILL);
582: gluQuadricNormals(obj, GLU_NONE);
583: gluQuadricTexture(obj, GL_TRUE);
584: gluSphere(obj, 0.25f, 6, 6); // 0.25 is the radius.
585: glEndList();
586:
587: objdlist = glGenLists(1);
588: glNewList(objdlist, GL_COMPILE);
589: gluQuadricDrawStyle(obj, GLU_FILL);
590: gluQuadricNormals(obj, GLU_NONE);
591: gluQuadricTexture(obj, GL_TRUE);
592: gluSphere(obj, SPHERE_RADIUS, 16, 16); // main sphere radius is 0.75
593: glEndList();
594:
595: }
596:
597: #ifdef MYTEST
598: main(int argc, char **argv) {
599: /* glutInit(&argc, argv);
600: glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
601: glutInitWindowSize(400,400);
602: glutInitWindowPosition(100,100);
603: glutCreateWindow("glicosahedron");
604: */ // They does not work.
605:
606: glutInitWindowPosition(0, 0);
607: glutInitWindowSize(WIDTH, HEIGHT);
608: // glutInit(&ac, av);
609:
610: //glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
611: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
612:
613: if (!(win = glutCreateWindow("Ray"))) {
614: fprintf(stderr, "Error, couldn't open window\n");
615: return -1;
616: }
617:
618:
619: glib3_ray_init();
620: glib3_ray_change_alpha(-90.0);
621: glib3_ray_change_beta(90.0);
622: glutReshapeFunc(reshape);
623: glutDisplayFunc(glib3_ray);
624: // glutIdleFunc(glib3_ray);
625: glib3_ray();
626: glutMainLoop();
627: }
628: #endif
629:
630: void glib3_ray_change_alpha(float e) { alpha = e; }
631: void glib3_ray_change_beta(float e) { beta = e; }
632:
633:
634: void glib3_ray_reshape(float w,float h) {
635: reshape(w,h);
636: }
637: void glib3_ray() {
638: // glib3_ray_change_alpha(-90.0+xnear*5);
639: // glib3_ray_change_beta(90.0+ynear*3);
640: draw();
641: }
642:
643: void glib3_ray_init() {
644:
645:
646: reshape(WIDTH, HEIGHT);
647:
648: glShadeModel(GL_FLAT);
649: glEnable(GL_DEPTH_TEST);
650: glDepthFunc(GL_LEQUAL);
651: glEnable(GL_CULL_FACE);
652: glEnable(GL_TEXTURE_2D);
653: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
654:
655: glEnable(GL_FOG);
656: glFogi(GL_FOG_MODE, GL_EXP2);
657: glFogfv(GL_FOG_COLOR, fogcolor);
658:
659: glFogf(GL_FOG_DENSITY, 0.01);
660:
661: calcposobs();
662:
663: initspherepos();
664:
665: inittextures();
666: initdlists();
667:
668: glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
669: }
670:
671:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>