newrender.cpp
上传用户:zbjingming
上传日期:2010-01-02
资源大小:2436k
文件大小:7k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include "radio.h"
  2. #include <string.h>
  3. #include <math.h>
  4. #include <time.h>
  5. int WinWidth, WinHeigth;
  6. TEXTURE_2D    **TextureList;
  7. OBJECT       *ObjectList; /* ObjectList[0]:isolated surfaces*/
  8. bmphead  *bmp;
  9. INT4S         ObjectNum; 
  10. char          gEnergyFile[30];
  11. char       sLookAtFN[100];
  12. char       ImageName[30];
  13.  
  14. void  ReadData()
  15.     int     i,j,l;
  16.     FILE    *fp;
  17.     char    stemp[100];
  18.     POINT3D   *plist; 
  19.     INT4U   nAllVertexNum; 
  20.     INT4U   *pchlist; 
  21.     char ch[30];
  22.  
  23.     fp = fopen( gEnergyFile, "r" );
  24.     if ( fp == NULL ) 
  25.     {  
  26.           printf( "n Can not open energy data file:%sn", gEnergyFile);
  27.           exit(0);
  28.     }   
  29.     fseek( fp, 0, SEEK_SET);
  30.     
  31.     /******  read texture list   ******/
  32.     fscanf( fp, "%s", stemp);
  33.     while( strcmp( stemp,"texnum" ) != 0)  fscanf( fp, "%s", stemp);
  34.     fscanf( fp, "%d", &texnum );
  35.     TextureList = (TEXTURE_2D **)malloc( sizeof(TEXTURE_2D)*(texnum+1));
  36.     for(i=1; i<=texnum; i++)
  37.     {
  38. TextureList[i] = (TEXTURE_2D *)malloc( sizeof(TEXTURE_2D));
  39. fscanf( fp, "%s%s", TextureList[i]->fname, stemp );
  40. if ( strcmp( stemp,"REPEAT_TEXTURE" ) == 0)
  41.       TextureList[i]->type = 1;
  42. else  if ( strcmp( stemp,"CLAMP_TEXTURE" ) == 0)
  43.           TextureList[i]->type = 0;
  44.     }
  45.     /******   Read object list   ******/
  46.     fscanf( fp, "%s", stemp);
  47.     while( strcmp( stemp,"ObjectNum" ) != 0) fscanf(fp,"%s",stemp);
  48.     fscanf( fp, "%ld", &ObjectNum);
  49.     ObjectList = (OBJECT *)malloc( sizeof(OBJECT ) * ObjectNum);
  50.     for(i = 0; i < ObjectNum; i ++ )
  51.     {
  52.      fscanf( fp, "%s", stemp);
  53.      while( strcmp( stemp,"SurfaceNum" ) != 0) fscanf(fp,"%s",stemp);
  54.      fscanf( fp, "%ld", &(ObjectList[i].SurfNum) );
  55. ObjectList[i].surflist = (SURFACE *)malloc( sizeof(SURFACE) * ObjectList[i].SurfNum); 
  56. for(j = 0; j < ObjectList[i].SurfNum; j ++ )
  57. {
  58. /******   Read surface infor   ******/
  59. fscanf( fp, "%s", stemp);
  60.      while( strcmp( stemp,"TextureId" ) != 0) fscanf(fp,"%s",stemp);
  61.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].texId) );
  62. fscanf( fp, "%s", stemp);
  63.      while( strcmp( stemp,"pointnum" ) != 0) fscanf(fp,"%s",stemp);
  64.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].pointn) );
  65. fscanf( fp, "%s", stemp);
  66.      while( strcmp( stemp,"triangle" ) != 0) fscanf(fp,"%s",stemp);
  67.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].triangle) );
  68. fscanf( fp, "%s", stemp);
  69.      while( strcmp( stemp,"quadrangle" ) != 0) fscanf(fp,"%s",stemp);
  70.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].quadric) );
  71. /******   Read point list    ******/
  72. ObjectList[i].surflist[j].pointlist = (POINT3D*)malloc(sizeof(POINT3D) * 
  73.                                      ObjectList[i].surflist[j].pointn);
  74. plist = ObjectList[i].surflist[j].pointlist;
  75. for( l = 0; l < ObjectList[i].surflist[j].pointn ; l ++ )
  76. fscanf( fp, "%f%f%f%f%f%f%f%f", 
  77.         &(plist[l].r), &(plist[l].g), &(plist[l].b),     
  78. &(plist[l].u), &(plist[l].v),
  79. &(plist[l].x), &(plist[l].y), &(plist[l].z) );
  80. /******    Read patchlist    ******/
  81. nAllVertexNum = ObjectList[i].surflist[j].triangle * 3 + 
  82. ObjectList[i].surflist[j].quadric *4 ;
  83. ObjectList[i].surflist[j].patchlist = (INT4U *)malloc( sizeof(INT4U) * nAllVertexNum);
  84. pchlist =  ObjectList[i].surflist[j].patchlist;
  85. for( l = 0; l <  nAllVertexNum; l ++ )
  86. fscanf( fp, "%ld", &(pchlist[l]) );
  87. }
  88.     }
  89.     
  90.     
  91.     fclose(fp);    
  92. }
  93. void InitRenderWin()
  94. {
  95.   float angle, Near, ex, ey, ez, cx, cy, cz;
  96.   FILE *fp;
  97.   fp = fopen(sLookAtFN, "rb");
  98.   if (fp == NULL)
  99.   {
  100. ex = ey = ez =1.0f;
  101. cx = cy = cz =0.0f;
  102. Near = 0.1;
  103. angle = 30.0f;
  104.   }
  105.   else fscanf(fp, "%f%f%f%f%f%f%f%f", &angle, &Near, &ex, &ey, &ez, &cx, &cy, &cz);
  106.   fclose(fp);
  107.   glShadeModel ( GL_SMOOTH );
  108.   glDepthFunc ( GL_LESS );
  109.   glEnable ( GL_DEPTH_TEST );
  110.   glViewport(0, 0, WinWidth, WinHeigth);
  111.   glMatrixMode ( GL_PROJECTION );
  112.   glLoadIdentity();
  113.   gluPerspective ( angle, (float)WinWidth/(float)WinHeigth, Near, 1000000000.0);
  114.   glMatrixMode ( GL_MODELVIEW );
  115.   glLoadIdentity();
  116.   gluLookAt( ex, ey, ez, cx, cy, cz, 0.0, 1.0, 0.0); 
  117.   /*  DrawBkGroundPic();   */
  118. }
  119. void Render(void)
  120. {
  121.   int      i, j, k, l, m, TexIndex;
  122.   POINT3D    *plist; 
  123.   INT4U    *pchlist;
  124.    
  125.    
  126.   
  127.   glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT);
  128.   for(i = 0; i < ObjectNum; i ++ )
  129. for(j = 0; j < ObjectList[i].SurfNum; j ++ )
  130. {
  131. TexIndex = ObjectList[i].surflist[j].texId;
  132. if( TexIndex > 0 )
  133. InitTex( TexIndex );
  134. plist = ObjectList[i].surflist[j].pointlist;
  135. pchlist =  ObjectList[i].surflist[j].patchlist;
  136. l = 0;
  137. for ( k = 0; k < ObjectList[i].surflist[j].triangle; k ++)
  138. {
  139. glBegin( GL_TRIANGLES );
  140. for( m = 0; m < 3; m ++ )
  141. {
  142.     glColor3f ( plist[pchlist[l]].r,
  143.      plist[pchlist[l]].g,
  144.      plist[pchlist[l]].b );
  145.     glTexCoord2f( plist[pchlist[l]].u,
  146.   plist[pchlist[l]].v );
  147.     glVertex3f( plist[pchlist[l]].x,
  148. plist[pchlist[l]].y,
  149. plist[pchlist[l]].z );
  150.     l ++;
  151. }/* m */
  152. glEnd();
  153. }/* k */
  154. for ( k = 0; k < ObjectList[i].surflist[j].quadric; k ++)
  155. {
  156. glBegin( GL_QUADS );
  157. for( m = 0; m < 4; m ++ )
  158. {
  159.     glColor3f ( plist[pchlist[l]].r,
  160.                             plist[pchlist[l]].g,
  161.          plist[pchlist[l]].b );
  162.     glTexCoord2f( plist[pchlist[l]].u,
  163.           plist[pchlist[l]].v );
  164.     glVertex3f( plist[pchlist[l]].x,
  165.         plist[pchlist[l]].y,
  166.         plist[pchlist[l]].z );
  167.     l ++;
  168. }/* m */
  169. glEnd();
  170. }/* k */
  171. glFlush();
  172. CloseTex();
  173. }
  174. auxSwapBuffers();
  175. }
  176. void freelist()
  177. {
  178. int i, j;
  179. for( i=0; i<ObjectNum; i++)
  180. {
  181. for( j=0; j<ObjectList[i].SurfNum; j++)
  182. {
  183. free(ObjectList[i].surflist[j].pointlist);
  184. free(ObjectList[i].surflist[j].patchlist);
  185. }
  186. free( ObjectList[i].surflist );
  187. }
  188.     free(ObjectList);
  189.     for(i=1; i<=texnum; i++)
  190.    free(TextureList[i]);
  191. free(TextureList);
  192. }
  193. /****************************************/
  194. /* function : Shoot */
  195. /* calculate the Fij, */
  196. /* (i=0,pindex-1; j=0,pindex-1) */
  197. /****************************************/
  198. void CALLBACK Shoot(void) 
  199. {    
  200.     time_t ltime;
  201. struct tm *today;
  202.     time( &ltime );
  203.     today = localtime( &ltime );
  204. printf("Start at: %dn", today->tm_sec);
  205.     Render();
  206.     time( &ltime );
  207.     today = localtime( &ltime );
  208. printf("End at: %dn", today->tm_sec);
  209. }
  210. /****************************************/
  211. /*   function: myReshape */
  212. /****************************************/
  213. void CALLBACK myReshape(int w, int h)
  214. InitRenderWin();
  215. }
  216. /****************************************/
  217. /*   function: Hemi_mode */
  218. /****************************************/
  219. void Hemi_mode()
  220. {  
  221.   auxInitDisplayMode ( AUX_DOUBLE | AUX_RGBA | AUX_DEPTH );
  222.   auxInitPosition (0, 0, WinWidth, WinHeigth);
  223.   auxInitWindow ( "Windows" );
  224.   auxReshapeFunc (myReshape);
  225.   auxMainLoop(Shoot);
  226. }