rtsmap.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:11k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998.  */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. /* rtsmap.c - real-time generation and use of a sphere map with libglsmap */
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. #include <GL/glsmap.h>
  11. #if defined(GL_EXT_texture_object) && !defined(GL_VERSION_1_1)
  12. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  13. #endif
  14. enum {
  15. TO_NONE = 0,
  16. TO_FRONT, TO_TOP, TO_BOTTOM, TO_LEFT, TO_RIGHT,
  17. TO_BACK,
  18. TO_SPHERE_MAP
  19. };
  20. static GLuint texobjs[6] = {
  21. TO_FRONT, TO_TOP, TO_BOTTOM,
  22. TO_LEFT, TO_RIGHT, TO_BACK
  23. };
  24. SphereMap *smap;
  25. GLfloat up[3] = { 0, 1, 0 };
  26. GLfloat eye[3] = { 0, 0, -20 };
  27. GLfloat obj[3] = { 0, 0, 0 };
  28. int W, H;
  29. int showSphereMap = 0;
  30. int object = 0;
  31. int texdim = 64;
  32. int doubleBuffer = 1;
  33. int dynamicSmap = 1;
  34. int cullBackFaces = 1;
  35. int doSphereMap = 1;
  36. int multipass = 0;
  37. static char *pattern[] = {
  38.   "......xxxx......",
  39.   "......xxxx......",
  40.   "......xxxx......",
  41.   "......xxxx......",
  42.   "......xxxx......",
  43.   "......xxxx......",
  44.   "xxxxxxxxxxxxxxxx",
  45.   "xxxxxxxxxxxxxxxx",
  46.   "xxxxxxxxxxxxxxxx",
  47.   "xxxxxxxxxxxxxxxx",
  48.   "......xxxx......",
  49.   "......xxxx......",
  50.   "......xxxx......",
  51.   "......xxxx......",
  52.   "......xxxx......",
  53.   "......xxxx......",
  54. };
  55. static void
  56. makePatternTexture(void)
  57. {
  58.   GLubyte patternTexture[16][16][4];
  59.   GLubyte *loc;
  60.   int s, t;
  61.   /* Setup RGB image for the texture. */
  62.   loc = (GLubyte*) patternTexture;
  63.   for (t = 0; t < 16; t++) {
  64.     for (s = 0; s < 16; s++) {
  65.       if (pattern[t][s] == 'x') {
  66. /* Nice green. */
  67.         loc[0] = 0x1f;
  68.         loc[1] = 0x8f;
  69.         loc[2] = 0x1f;
  70.         loc[3] = 0x7f;  /* opaque */
  71.       } else {
  72. /* Light gray. */
  73.         loc[0] = 0x00;
  74.         loc[1] = 0x00;
  75.         loc[2] = 0x00;
  76.         loc[3] = 0x00;  /* transparent */
  77.       }
  78.       loc += 4;
  79.     }
  80.   }
  81.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  82.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  83.     GL_LINEAR_MIPMAP_LINEAR);
  84.   gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 16, 16,
  85.     GL_RGBA, GL_UNSIGNED_BYTE, patternTexture);
  86. }
  87. void
  88. reshape(int w, int h)
  89. {
  90. W = w;
  91. H = h;
  92. }
  93. void
  94. positionLights(int view, void *context)
  95. {
  96. static GLfloat light1Pos[4] = { -41.0, 41.0, -41.0, 1.0 };
  97. static GLfloat light2Pos[4] = { +41.0, 0.0, -41.0, 1.0 };
  98. static GLfloat light3Pos[4] = { -41.0, 0.0, +41.0, 1.0 };
  99. static GLfloat light4Pos[4] = { +41.0, 0.0, +41.0, 1.0 };
  100. glLightfv(GL_LIGHT0, GL_POSITION, light1Pos);
  101. glLightfv(GL_LIGHT1, GL_POSITION, light2Pos);
  102. glLightfv(GL_LIGHT2, GL_POSITION, light3Pos);
  103. glLightfv(GL_LIGHT3, GL_POSITION, light4Pos);
  104. }
  105. void
  106. drawView(int view, void *context)
  107. {
  108. /* right green small cube (+5,0,-8) */
  109. glPushMatrix();
  110.   glTranslatef(5.0, 0.0, -8.0);
  111.   glRotatef(-45, 1.0, 0.0, 1.0);
  112.   glColor3f(0.0, 1.0, 0.0);
  113.   glutSolidCube(2.0);
  114. glPopMatrix();
  115. /* left red cube (-5,0,-8) */
  116. glPushMatrix();
  117.   glTranslatef(-5.0, 0.0, -8.0);
  118.   glRotatef(45, 1.0, 0.0, 1.0);
  119.   glColor3f(1.0, 0.0, 0.0);
  120.   glutSolidCube(6.0);
  121. glPopMatrix();
  122. /* left blue cube (-7,0,0); */
  123. glPushMatrix();
  124.   glTranslatef(-7.0, 0.0, 0.0);
  125.   glColor3f(0.0, 0.0, 1.0);
  126.   glutSolidCube(5.0);
  127. glPopMatrix();
  128. /* right cyan big cube (+7,0,0) */
  129. glPushMatrix();
  130.   glTranslatef(7.0, 0.0, 0.0);
  131.   glRotatef(30, 1.0, 1.0, 0.0);
  132.   glColor3f(0.0, 1.0, 1.0);
  133.   glutSolidCube(5.0);
  134. glPopMatrix();
  135. /* distant yellow sphere (0,0,+10) */
  136. glPushMatrix();
  137.   glTranslatef(0.0, 0.0, 10.0);
  138.   glColor3f(1.0, 1.0, 0.0);
  139.   glutSolidSphere(7.0, 8, 8);
  140. glPopMatrix();
  141. /* top white sphere (0,+5,0) */
  142. glPushMatrix();
  143.   glTranslatef(0.0, 5.0, 0.0);
  144.   glColor3f(1.0, 1.0, 1.0);
  145.   glutSolidSphere(2.0, 8, 8);
  146. glPopMatrix();
  147. /* bottom magenta sphere (0,-7,0) */
  148. glPushMatrix();
  149.   glTranslatef(0.0, -7.0, 0.0);
  150.   glColor3f(1.0, 0.0, 1.0);
  151.   glutSolidSphere(3.0, 8, 8);
  152. glPopMatrix();
  153. }
  154. void
  155. drawObject(void *context)
  156. {
  157.         static GLfloat xplane[4] = { 1, 0, 0, 0 };
  158.         static GLfloat zplane[4] = { 0, 1, 0, 0 };
  159.         if (!cullBackFaces) {
  160.                 glEnable(GL_CULL_FACE);
  161.                 glCullFace(GL_FRONT);
  162.         }
  163. glPushMatrix();
  164.                 glTranslatef(obj[0], obj[1], obj[2]);
  165.                 if (doSphereMap) {
  166.         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  167.         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  168.         glEnable(GL_TEXTURE_GEN_S);
  169.         glEnable(GL_TEXTURE_GEN_T);
  170.         glEnable(GL_TEXTURE_2D);
  171.         glBindTexture(GL_TEXTURE_2D, 7);
  172.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
  173. GL_REPLACE);
  174.                 } else {
  175.                         glTexGenfv(GL_S, GL_OBJECT_PLANE, xplane);
  176.                         glTexGenfv(GL_T, GL_OBJECT_PLANE, zplane);
  177.                         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  178.                         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  179.                         glEnable(GL_TEXTURE_GEN_S);
  180.         glEnable(GL_TEXTURE_GEN_T);
  181.         glEnable(GL_TEXTURE_2D);
  182.                         glBindTexture(GL_TEXTURE_2D, 100);
  183.                         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
  184. GL_REPLACE);
  185.                 }
  186. glColor3f(1.0, 1.0, 1.0);
  187. switch (object) {
  188. case 0:
  189. glutSolidSphere(3.0, 20, 20);
  190. break;
  191. case 1:
  192. glScalef(3.0, 3.0, 3.0);
  193. glRotatef(30.0, 1.0, 1.0, 0.0);
  194. glutSolidIcosahedron();
  195. break;
  196. case 2:
  197. glFrontFace(GL_CW);
  198. glutSolidTeapot(3.0);
  199. glFrontFace(GL_CCW);
  200. break;
  201. }
  202.         glDisable(GL_TEXTURE_GEN_S);
  203.         glDisable(GL_TEXTURE_GEN_T);
  204. glPopMatrix();
  205.         if (!cullBackFaces) {
  206.                 glCullFace(GL_BACK);
  207.         }
  208. }
  209. void
  210. display(void)
  211. {
  212. glDisable(GL_TEXTURE_2D);
  213. glEnable(GL_DEPTH_TEST);
  214.         glEnable(GL_CULL_FACE);
  215.         if (dynamicSmap) {
  216.   smapGenSphereMap(smap);
  217.         }
  218. /* smapGenSphereMap leaves scissor enabled, disable it. */
  219. glDisable(GL_SCISSOR_TEST);
  220. glViewport(0, 0, W, H);
  221. if (showSphereMap) {
  222. glClear(GL_COLOR_BUFFER_BIT);
  223. glMatrixMode(GL_PROJECTION);
  224. glLoadIdentity();
  225. gluOrtho2D(0, 1, 0, 1);
  226. glMatrixMode(GL_MODELVIEW);
  227. glLoadIdentity();
  228. glEnable(GL_TEXTURE_2D);
  229. glDisable(GL_DEPTH_TEST);
  230. glBindTexture(GL_TEXTURE_2D, 7);
  231. glBegin(GL_QUADS);
  232. glTexCoord2f(0,0);
  233. glVertex2f(0,0);
  234. glTexCoord2f(1,0);
  235. glVertex2f(1,0);
  236. glTexCoord2f(1,1);
  237. glVertex2f(1,1);
  238. glTexCoord2f(0,1);
  239. glVertex2f(0,1);
  240. glEnd();
  241. } else {
  242. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  243. glDisable(GL_TEXTURE_2D);
  244. glEnable(GL_DEPTH_TEST);
  245. glMatrixMode(GL_PROJECTION);
  246. glLoadIdentity();
  247. gluPerspective(60.0, 1.0, 0.5, 40.0);
  248. glMatrixMode(GL_MODELVIEW);
  249. glLoadIdentity();
  250. gluLookAt(eye[0], eye[1], eye[2],  /* eye at eye */
  251.   obj[0], obj[1], obj[2],  /* looking at object */
  252.   up[0], up[1], up[2]);
  253. positionLights(-1, NULL);
  254. drawView(-1, NULL);
  255.                 if (multipass) {
  256.                   doSphereMap = 1;
  257.                 }
  258. drawObject(NULL);
  259.                 if (multipass) {
  260.                   doSphereMap = 0;
  261.                   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  262.                   glDepthFunc(GL_EQUAL);
  263.                   glEnable(GL_BLEND);
  264.   drawObject(NULL);
  265.                   glDisable(GL_BLEND);
  266.                   glDepthFunc(GL_LESS);
  267.                 }
  268. }
  269. if (doubleBuffer) {
  270. glutSwapBuffers();
  271. }
  272. }
  273. int angle = 0;
  274. int downx, downy;
  275. void
  276. motion(int x, int y)
  277. {
  278. angle += (x - downx);
  279. angle = angle % 360;
  280. eye[0] = sin(angle * 3.14159/180.0) * -20;
  281. eye[2] = cos(angle * 3.14159/180.0) * -20;
  282. eye[1] = eye[1] + 0.1 * (y - downy);
  283. if (eye[1] > +25) eye[1] = +25;
  284. if (eye[1] < -25) eye[1] = -25;
  285. smapSetEyeVector(smap, eye);
  286. glutPostRedisplay();
  287. downx = x;
  288. downy = y;
  289. }
  290. void
  291. mouse(int button, int state, int x, int y)
  292. {
  293. if (button == GLUT_LEFT_BUTTON) {
  294. if (state == GLUT_DOWN) {
  295. downx = x;
  296. downy = y;
  297. }
  298. }
  299. }
  300. void
  301. menu(int value)
  302. {
  303. switch (value) {
  304. case 0:
  305. showSphereMap = 0;
  306. break;
  307. case 1:
  308. showSphereMap = 1;
  309. break;
  310. case 4:
  311. object = (object + 1) % 3;
  312. break;
  313. case 5:
  314. smapSetSphereMapTexDim(smap, 64);
  315. smapSetViewTexDim(smap, 64);
  316. break;
  317. case 6:
  318. smapSetSphereMapTexDim(smap, 128);
  319. smapSetViewTexDim(smap, 128);
  320. break;
  321. case 7:
  322. smapSetSphereMapTexDim(smap, 256);
  323. smapSetViewTexDim(smap, 256);
  324. break;
  325. case 8:
  326. glDrawBuffer(GL_FRONT);
  327. glReadBuffer(GL_FRONT);
  328. doubleBuffer = 0;
  329. break;
  330. case 9:
  331. glDrawBuffer(GL_BACK);
  332. glReadBuffer(GL_BACK);
  333. doubleBuffer = 1;
  334. break;
  335.         case 10:
  336.                 dynamicSmap = 1;
  337.                 break;
  338.         case 11:
  339.                 dynamicSmap = 0;
  340.                 break;
  341.         case 12:
  342.                 cullBackFaces = 1;
  343.                 break;
  344.         case 13:
  345.                 cullBackFaces = 0;
  346.                 break;
  347.         case 14:
  348.                 doSphereMap = 1;
  349.                 multipass = 0;
  350.                 break;
  351.         case 15:
  352.                 doSphereMap = 0;
  353.                 multipass = 0;
  354.                 break;
  355.         case 16:
  356.                 multipass = 1;
  357.                 break;
  358. case 666:
  359. exit(0);
  360. break;
  361. }
  362. glutPostRedisplay();
  363. }
  364. void
  365. initGraphicsState(void)
  366. {
  367.     GLfloat lightColor[4] = { 0.6, 0.6, 0.6, 1.0 };  /* white */
  368. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
  369. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
  370. glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor);
  371. glLightfv(GL_LIGHT2, GL_DIFFUSE, lightColor);
  372. glLightfv(GL_LIGHT3, GL_DIFFUSE, lightColor);
  373. glEnable(GL_LIGHTING);
  374. glEnable(GL_LIGHT0);
  375. glEnable(GL_LIGHT1);
  376. glEnable(GL_LIGHT2);
  377. glEnable(GL_LIGHT3);
  378. glEnable(GL_DEPTH_TEST);
  379. glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  380. glEnable(GL_COLOR_MATERIAL);
  381. glEnable(GL_NORMALIZE);
  382. }
  383. int
  384. main(int argc, char **argv)
  385. {
  386. glutInitWindowSize(400, 400);
  387. glutInit(&argc, argv);
  388. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  389. glutCreateWindow("real-time dynamic sphere mapping");
  390. glutReshapeFunc(reshape);
  391. glutDisplayFunc(display);
  392. initGraphicsState();
  393. glutCreateMenu(menu);
  394. glutAddMenuEntry("eye view", 0);
  395. glutAddMenuEntry("show sphere map", 1);
  396. glutAddMenuEntry("outline", 2);
  397. glutAddMenuEntry("switch object", 4);
  398. glutAddMenuEntry("texdim = 64", 5);
  399. glutAddMenuEntry("texdim = 128", 6);
  400. glutAddMenuEntry("texdim = 256", 7);
  401. glutAddMenuEntry("single buffer", 8);
  402. glutAddMenuEntry("double buffer", 9);
  403.         glutAddMenuEntry("dynamic smap", 10);
  404.         glutAddMenuEntry("stop smap building", 11);
  405.         glutAddMenuEntry("cull back faces", 12);
  406.         glutAddMenuEntry("cull front faces", 13);
  407.         glutAddMenuEntry("sphere map", 14);
  408.         glutAddMenuEntry("texture", 15);
  409.         glutAddMenuEntry("multipass", 16);
  410. glutAddMenuEntry("quit", 666);
  411. glutAttachMenu(GLUT_RIGHT_BUTTON);
  412. glutMouseFunc(mouse);
  413. glutMotionFunc(motion);
  414. smap = smapCreateSphereMap(NULL);
  415. smapSetSphereMapTexObj    (smap, TO_SPHERE_MAP);
  416. smapSetViewTexObjs        (smap, texobjs);
  417. smapSetEyeVector          (smap, eye);
  418. smapSetUpVector           (smap, up);
  419. smapSetObjectVector       (smap, obj);
  420. smapSetNearFar            (smap, 0.5, 40.0);
  421. smapSetPositionLightsFunc (smap, positionLights);
  422. smapSetDrawViewFunc       (smap, drawView);
  423. smapSetViewTexDim         (smap, 64);
  424. smapSetSphereMapTexDim    (smap, 64);
  425.         glBindTexture(GL_TEXTURE_2D, 100);
  426.         makePatternTexture();
  427. glutMainLoop();
  428. return 0;
  429. }