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

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. /* cview2smap.c - warp 6 cube views into sphere map */
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <GL/glut.h>
  9. #include "smapmesh.h"
  10. #if defined(GL_EXT_texture_object) && !defined(GL_VERSION_1_1)
  11. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  12. #endif
  13. #if defined(GL_EXT_copy_texture) && !defined(GL_VERSION_1_1)
  14. #define glCopyTexImage2D(A, B, C, D, E, F, G, H)    glCopyTexImage2DEXT(A, B, C, D, E, F, G, H)
  15. #endif
  16. GLfloat up[3] = { 0, 1, 0 };
  17. GLfloat eye[3] = { 0, 0, -20 };
  18. GLfloat obj[3] = { 0, 0, 0 };
  19. int outline = 0;
  20. int bufswap = 1;
  21. int texdim = 128;
  22. static int W, H;
  23. int angle = 0;
  24. int downx, downy;
  25. void
  26. reshape(int w, int h)
  27. {
  28. W = w;
  29. H = h;
  30. }
  31. void
  32. drawView(int drawCenterObject)
  33. {
  34. /* right green small cube (+5,0,-8) */
  35. glPushMatrix();
  36.   glTranslatef(5.0, 0.0, -8.0);
  37.   glRotatef(-45, 1.0, 0.0, 1.0);
  38.   glColor3f(0.0, 1.0, 0.0);
  39.   glutSolidCube(2.0);
  40. glPopMatrix();
  41. /* left red cube (-5,0,-8) */
  42. glPushMatrix();
  43.   glTranslatef(-5.0, 0.0, -8.0);
  44.   glRotatef(45, 1.0, 0.0, 1.0);
  45.   glColor3f(1.0, 0.0, 0.0);
  46.   glutSolidCube(6.0);
  47. glPopMatrix();
  48. /* left blue cube (-7,0,0); */
  49. glPushMatrix();
  50.   glTranslatef(-7.0, 0.0, 0.0);
  51.   glColor3f(0.0, 0.0, 1.0);
  52.   glutSolidCube(5.0);
  53. glPopMatrix();
  54. /* right cyan big cube (+7,0,0) */
  55. glPushMatrix();
  56.   glTranslatef(7.0, 0.0, 0.0);
  57.   glRotatef(30, 1.0, 1.0, 0.0);
  58.   glColor3f(0.0, 1.0, 1.0);
  59.   glutSolidCube(5.0);
  60. glPopMatrix();
  61. /* distant yellow sphere (0,0,+10) */
  62. glPushMatrix();
  63.   glTranslatef(0.0, 0.0, 10.0);
  64.   glColor3f(1.0, 1.0, 0.0);
  65.   glutSolidSphere(7.0, 8, 8);
  66. glPopMatrix();
  67. /* top white sphere (0,+5,0) */
  68. glPushMatrix();
  69.   glTranslatef(0.0, 5.0, 0.0);
  70.   glColor3f(1.0, 1.0, 1.0);
  71.   glutSolidSphere(2.0, 8, 8);
  72. glPopMatrix();
  73. /* bottom magenta big sphere (0,-6,0) */
  74. glPushMatrix();
  75.   glTranslatef(0.0, -6.0, 0.0);
  76.   glColor3f(1.0, 0.0, 1.0);
  77.   glutSolidSphere(4.0, 8, 8);
  78. glPopMatrix();
  79. if (drawCenterObject) {
  80. glPushMatrix();
  81. glScalef(3.0, 3.0, 3.0);
  82. glColor3f(1.0, 1.0, 1.0);
  83. glutSolidIcosahedron();
  84. glPopMatrix();
  85. }
  86. }
  87. void
  88. setAreaAndClear(GLint x, GLint y, GLsizei w, GLsizei h)
  89. {
  90.     glViewport(x, y, w, h);
  91. glScissor(x, y, w, h);
  92. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  93. }
  94. /* You need to reposition the lights everytime view */
  95. /* transformation changes. */
  96. void
  97. positionLights(void)
  98. {
  99. static GLfloat light1Pos[4] = { -41.0, 41.0, -41.0, 1.0 };
  100. static GLfloat light2Pos[4] = { +41.0, 0.0, -41.0, 1.0 };
  101. static GLfloat light3Pos[4] = { -41.0, 0.0, +41.0, 1.0 };
  102. static GLfloat light4Pos[4] = { +41.0, 0.0, +41.0, 1.0 };
  103. glLightfv(GL_LIGHT0, GL_POSITION, light1Pos);
  104. glLightfv(GL_LIGHT1, GL_POSITION, light2Pos);
  105. glLightfv(GL_LIGHT2, GL_POSITION, light3Pos);
  106. glLightfv(GL_LIGHT3, GL_POSITION, light4Pos);
  107. }
  108. void
  109. snagImageAsTexture(GLuint texobj)
  110. {
  111. glBindTexture(GL_TEXTURE_2D, texobj);
  112. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
  113. GL_LINEAR);
  114. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  115. GL_LINEAR);
  116. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  117. /* Clamp to avoid artifacts from wrap around in texture. */
  118. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  119. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  120. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0,
  121. texdim, texdim, 0);
  122. }
  123. struct {
  124. GLfloat angle;
  125. GLfloat x, y, z;
  126. } faceInfo[6] = {
  127. {   0.0, +1.0,  0.0,  0.0 },  /* front */
  128. {  90.0, -1.0,  0.0,  0.0 },  /* top */
  129. {  90.0, +1.0,  0.0,  0.0 },  /* bottom */
  130. {  90.0,  0.0, -1.0,  0.0 },  /* left */
  131. {  90.0,  0.0, +1.0,  0.0 },  /* right */
  132. { 180.0, -1.0,  0.0,  0.0 }   /* back */
  133. };
  134. void
  135. configFace(int i)
  136. {
  137. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  138. glMatrixMode(GL_MODELVIEW);
  139. glLoadIdentity();
  140. glRotatef(faceInfo[i].angle,
  141. faceInfo[i].x, faceInfo[i].y, faceInfo[i].z);
  142. gluLookAt(obj[0], obj[1], obj[2],  /* "eye" at object */
  143.       eye[0], eye[1], eye[2],  /* looking at eye */
  144.   up[0], up[1], up[2]);
  145. positionLights();
  146. }
  147. void
  148. display(void)
  149. {
  150. static GLuint texobjs[6] = { 1, 2 ,3, 4, 5, 6 };
  151. int i;
  152. glMatrixMode(GL_PROJECTION);
  153. glLoadIdentity();
  154. gluPerspective(90.0, 1.0, 0.5, 40.0);
  155.     glViewport(0, 0, texdim, texdim);
  156. glScissor(0, 0, texdim, texdim);
  157. glEnable(GL_SCISSOR_TEST);
  158. glEnable(GL_DEPTH_TEST);
  159. /* front view (center) */
  160. for (i=0; i<6; i++) {
  161. configFace(i);
  162. drawView(0);
  163. snagImageAsTexture(1+i);
  164. }
  165. glDisable(GL_SCISSOR_TEST);
  166. glClear(GL_COLOR_BUFFER_BIT);
  167. glViewport(0, 0, W, H);
  168. glMatrixMode(GL_PROJECTION);
  169. glLoadIdentity();
  170. gluOrtho2D(0, 1, 0, 1);
  171. glMatrixMode(GL_MODELVIEW);
  172. glLoadIdentity();
  173. glDisable(GL_DEPTH_TEST);
  174. glEnable(GL_TEXTURE_2D);
  175. drawSphereMapMesh(texobjs);
  176. glDisable(GL_TEXTURE_2D);
  177. if (outline) {
  178. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  179. glDisable(GL_LIGHTING);
  180. glColor3f(1.0, 1.0, 1.0);
  181. drawSphereMapMesh(texobjs);
  182. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  183. glEnable(GL_LIGHTING);
  184. }
  185. glDisable(GL_SCISSOR_TEST);
  186. /* initial clear */
  187. glViewport(0, 0, W, H);
  188. if (bufswap) {
  189. glutSwapBuffers();
  190. }
  191. }
  192. void
  193. menu(int value)
  194. {
  195. switch (value) {
  196. case 1:
  197. glEnable(GL_LIGHTING);
  198. printf("enablen");
  199. break;
  200. case 2:
  201. glDisable(GL_LIGHTING);
  202. printf("disablen");
  203. break;
  204. case 3:
  205. outline = 1;
  206. break;
  207. case 4:
  208. outline = 0;
  209. break;
  210. case 5:
  211. glDrawBuffer(GL_FRONT);
  212. glReadBuffer(GL_FRONT);
  213. bufswap = 0;
  214. break;
  215. case 6:
  216. glDrawBuffer(GL_BACK);
  217. glReadBuffer(GL_BACK);
  218. bufswap = 1;
  219. break;
  220. case 7:
  221. texdim = 64;
  222. break;
  223. case 8:
  224. texdim = 128;
  225. break;
  226. case 9:
  227. texdim = 256;
  228. break;
  229. }
  230. glutPostRedisplay();
  231. }
  232. void
  233. motion(int x, int y)
  234. {
  235. angle += (x - downx);
  236. angle = angle % 360;
  237. eye[0] = sin(angle * 3.14159/180.0) * -20;
  238. eye[2] = cos(angle * 3.14159/180.0) * -20;
  239. eye[1] = eye[1] + 0.1 * (y - downy);
  240. if (eye[1] > +25) eye[1] = +25;
  241. if (eye[1] < -25) eye[1] = -25;
  242. glutPostRedisplay();
  243. downx = x;
  244. downy = y;
  245. }
  246. void
  247. mouse(int button, int state, int x, int y)
  248. {
  249. if (button == GLUT_LEFT_BUTTON) {
  250. if (state == GLUT_DOWN) {
  251. downx = x;
  252. downy = y;
  253. }
  254. }
  255. }
  256. void
  257. initGraphicsState(void)
  258. {
  259.     GLfloat lightColor[4] = { 0.6, 0.6, 0.6, 1.0 };  /* white */
  260. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
  261. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
  262. glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor);
  263. glLightfv(GL_LIGHT2, GL_DIFFUSE, lightColor);
  264. glLightfv(GL_LIGHT3, GL_DIFFUSE, lightColor);
  265. glEnable(GL_LIGHTING);
  266. glEnable(GL_LIGHT0);
  267. glEnable(GL_LIGHT1);
  268. glEnable(GL_LIGHT2);
  269. glEnable(GL_LIGHT3);
  270. glEnable(GL_DEPTH_TEST);
  271. glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
  272. glEnable(GL_COLOR_MATERIAL);
  273. glEnable(GL_NORMALIZE);
  274. }
  275. int
  276. main(int argc, char **argv)
  277. {
  278. makeSphereMapMesh();
  279. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  280. glutCreateWindow("cview2smap");
  281. glutDisplayFunc(display);
  282. glutReshapeFunc(reshape);
  283. initGraphicsState();
  284. glutCreateMenu(menu);
  285. glutAddMenuEntry("light on", 1);
  286. glutAddMenuEntry("light off", 2);
  287. glutAddMenuEntry("outline", 3);
  288. glutAddMenuEntry("no outline", 4);
  289. glutAddMenuEntry("single buffer", 5);
  290. glutAddMenuEntry("double buffer", 6);
  291. glutAddMenuEntry("face tex dim = 64", 7);
  292. glutAddMenuEntry("face tex dim = 128", 8);
  293. glutAddMenuEntry("face tex dim = 256", 9);
  294. glutAttachMenu(GLUT_RIGHT_BUTTON);
  295. glutMouseFunc(mouse);
  296. glutMotionFunc(motion);
  297. glutMainLoop();
  298. return 0;
  299. }