Annotation of OpenXM/src/cfep/glray3.c, Revision 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>