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

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. /* smap_buildsmap.c - automatically builds sphere map */
  6. #include <assert.h>
  7. #include <stdio.h>
  8. #include <GL/glsmap.h>
  9. #include <GL/glu.h>
  10. #include "glsmapint.h"
  11. #if defined(GL_EXT_texture_object) && !defined(GL_VERSION_1_1)
  12. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  13. #endif
  14. #if defined(GL_EXT_copy_texture) && !defined(GL_VERSION_1_1)
  15. #define glCopyTexImage2D(A, B, C, D, E, F, G, H)    glCopyTexImage2DEXT(A, B, C, D, E, F, G, H)
  16. #endif
  17. static void
  18. copyImageToTexture(SphereMap *smap,
  19.                    GLuint texobj, int origin[2], int texdim)
  20. {
  21.         int isSmapTexObj = (texobj == smap->smapTexObj) ? 1 : 0;
  22.         int genMipmapsFlag =
  23.                 isSmapTexObj ? SMAP_GENERATE_SMAP_MIPMAPS : SMAP_GENERATE_VIEW_MIPMAPS;
  24.         static GLubyte pixels[256][256][3];  /* XXX fix me. */
  25. glBindTexture(GL_TEXTURE_2D, texobj);
  26. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
  27. GL_LINEAR);
  28.         if (smap->flags & genMipmapsFlag) {
  29.          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  30.                         GL_LINEAR_MIPMAP_LINEAR);
  31.         } else {
  32.                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  33.            GL_LINEAR);
  34.         }
  35.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  36. /* Clamp to avoid artifacts from wrap around in texture. */
  37. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  38. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  39.         if (smap->flags & genMipmapsFlag) {
  40.         glPixelStorei(GL_PACK_ALIGNMENT, 1);
  41.                 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  42.                 glReadPixels(origin[X], origin[Y], texdim, texdim,
  43.                         GL_RGB, GL_UNSIGNED_BYTE, pixels);
  44.                 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texdim, texdim,
  45.                         GL_RGB, GL_UNSIGNED_BYTE, pixels);       
  46.         } else {
  47.                 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  48.         origin[X], origin[Y], texdim, texdim, 0);
  49.         }
  50. }
  51. static struct {
  52. GLfloat angle;
  53. GLfloat x, y, z;
  54. } faceInfo[6] = {
  55. {   0.0, +1.0,  0.0,  0.0 },  /* front */
  56. {  90.0, -1.0,  0.0,  0.0 },  /* top */
  57. {  90.0, +1.0,  0.0,  0.0 },  /* bottom */
  58. {  90.0,  0.0, -1.0,  0.0 },  /* left */
  59. {  90.0,  0.0, +1.0,  0.0 },  /* right */
  60. { 180.0, -1.0,  0.0,  0.0 }   /* back */
  61. };
  62. static void
  63. configFace(SphereMap *smap, int view)
  64. {
  65. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  66. glMatrixMode(GL_MODELVIEW);
  67. glLoadIdentity();
  68. glRotatef(faceInfo[view].angle,
  69. faceInfo[view].x, faceInfo[view].y, faceInfo[view].z);
  70. gluLookAt(smap->obj[X], smap->obj[Y], smap->obj[Z],  /* "eye" at object */
  71.       smap->eye[X], smap->eye[Y], smap->eye[Z],  /* looking at eye */
  72.   smap->up[X], smap->up[Y], smap->up[Z]);
  73. }
  74. static void
  75. initGenViewTex(SphereMap *smap)
  76. {
  77. glMatrixMode(GL_PROJECTION);
  78. glLoadIdentity();
  79. gluPerspective(90.0, 1.0, smap->viewNear, smap->viewFar);
  80.     glViewport(smap->viewOrigin[X], smap->viewOrigin[Y],
  81. smap->viewTexDim, smap->viewTexDim);
  82. glScissor(0, 0, smap->viewTexDim, smap->viewTexDim);
  83. glEnable(GL_SCISSOR_TEST);
  84. glEnable(GL_DEPTH_TEST);
  85. }
  86. static void
  87. genViewTex(SphereMap *smap, int view)
  88. {
  89. configFace(smap, view);
  90.         assert(smap->positionLights);
  91. smap->positionLights(view, smap->context);
  92.         assert(smap->drawView);
  93. smap->drawView(view, smap->context);
  94. }
  95. void
  96. smapGenViewTex(SphereMap *smap, int view)
  97. {
  98. initGenViewTex(smap);
  99. genViewTex(smap, view);
  100. copyImageToTexture(smap, smap->viewTexObjs[view],
  101. smap->viewOrigin, smap->viewTexDim);
  102. }
  103. void
  104. smapGenViewTexs(SphereMap *smap)
  105. {
  106. int view;
  107. initGenViewTex(smap);
  108. for (view=0; view<6; view++) {
  109. genViewTex(smap, view);
  110. copyImageToTexture(smap, smap->viewTexObjs[view],
  111. smap->viewOrigin, smap->viewTexDim);
  112. }
  113. }
  114. void
  115. drawSphereMapMesh(SphereMap *smap)
  116. {
  117. int side;
  118. /* Calculate sphere map mesh if needed. */
  119. __smapValidateSphereMapMesh(smap->mesh);
  120. /* Five front and side faces. */
  121. for (side=0; side<5; side++) {
  122. /* Bind to texture for given face of cube map. */
  123. glBindTexture(GL_TEXTURE_2D, smap->viewTexObjs[side]);
  124. __smapDrawSphereMapMeshSide(smap->mesh, side);
  125. }
  126. /* Bind to texture for back face of cube map. */
  127. glBindTexture(GL_TEXTURE_2D, smap->viewTexObjs[side]);
  128. __smapDrawSphereMapMeshBack(smap->mesh);
  129. }
  130. void
  131. initDrawSphereMapMesh(SphereMap *smap)
  132. {
  133. glMatrixMode(GL_PROJECTION);
  134. glLoadIdentity();
  135. gluOrtho2D(0, 1, 0, 1);
  136. glMatrixMode(GL_MODELVIEW);
  137. glLoadIdentity();
  138.         glViewport(smap->smapOrigin[X], smap->smapOrigin[Y],
  139. smap->smapTexDim, smap->smapTexDim);
  140.         if (smap->flags & SMAP_CLEAR_SMAP_TEXTURE) {
  141.         glClear(GL_COLOR_BUFFER_BIT);
  142.         }
  143. glDisable(GL_DEPTH_TEST);
  144. glEnable(GL_TEXTURE_2D);
  145. glDisable(GL_CULL_FACE);
  146. }
  147. void
  148. smapGenSphereMapFromViewTexs(SphereMap *smap)
  149. {
  150. initDrawSphereMapMesh(smap);
  151. drawSphereMapMesh(smap);
  152. copyImageToTexture(smap, smap->smapTexObj,
  153. smap->smapOrigin, smap->smapTexDim);
  154. }
  155. void
  156. smapGenSphereMap(SphereMap *smap)
  157. {
  158. smapGenViewTexs(smap);
  159. smapGenSphereMapFromViewTexs(smap);
  160. }
  161. void
  162. smapGenSphereMapWithOneViewTex(SphereMap *smap)
  163. {
  164. int side;
  165. /* Make sure viewports are not obviously overlapping. */
  166. assert(smap->viewOrigin[X] != smap->smapOrigin[X]);
  167. assert(smap->viewOrigin[Y] != smap->smapOrigin[Y]);
  168. /* Calculate sphere map mesh if needed. */
  169. __smapValidateSphereMapMesh(smap->mesh);
  170. /* Five front and side faces. */
  171. for (side=0; side<5; side++) {
  172. initGenViewTex(smap);
  173. genViewTex(smap, side);
  174. copyImageToTexture(smap, smap->viewTexObj,
  175. smap->viewOrigin, smap->viewTexDim);
  176. /* Preceeding copyImageToTexture does bind to smap->viewTexObj */
  177. initDrawSphereMapMesh(smap);
  178. __smapDrawSphereMapMeshSide(smap->mesh, side);
  179. }
  180. initGenViewTex(smap);
  181. genViewTex(smap, SMAP_BACK);
  182. copyImageToTexture(smap, smap->viewTexObj,
  183. smap->viewOrigin, smap->viewTexDim);
  184. /* Preceeding copyImageToTexture does bind to smap->viewTexObj */
  185. initDrawSphereMapMesh(smap);
  186. __smapDrawSphereMapMeshBack(smap->mesh);
  187. copyImageToTexture(smap, smap->smapTexObj,
  188. smap->smapOrigin, smap->smapTexDim);
  189. }