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

OpenGL

开发平台:

Visual C++

  1. #include "radio.h"
  2. #include <string.h>
  3. #include "math.h"
  4. #include "image.h"
  5. #include <time.h>
  6. int gWinWidth, gWinHeigth;
  7. TEXTURE_2D     **gTextureList;
  8. OBJECT        *gObjectList; /* ObjectList[0]:isolated surfaces*/
  9. INT4S          gObjectNum; 
  10. int         gTexnum;
  11. float gEx = 40.0, gEy = 1.0, gEz = 45.0,
  12.    gCx = -5.0, gCy = 1.0, gCz = 5.0;
  13.  
  14. char           gEnergyFile[30];
  15. char        gImageName[30];
  16. double   gMatrixVP[16]; 
  17. double   gMatrixC1[16];
  18. double   gProject[16];
  19. double   gModelview[16];
  20. double   gViewport[16];
  21. void  ReadData()
  22.     int     i,j,l;
  23.     FILE    *fp;
  24.     char    stemp[100];
  25.     POINT   *plist; 
  26.     INT4U   nAllVertexNum; 
  27.     INT4U   *pchlist; 
  28.  
  29.     fp = fopen( gEnergyFile, "r" );
  30.     if ( fp == NULL ) 
  31.     {  
  32.           printf( "n Can not open energy data file:%s", gEnergyFile);
  33.           exit(0);
  34.     }   
  35.     fseek( fp, 0, SEEK_SET);
  36.     
  37.     /******  read texture list   ******/
  38.     fscanf( fp, "%s", stemp);
  39.     while( strcmp( stemp,"texnum" ) != 0)  fscanf( fp, "%s", stemp);
  40.     fscanf( fp, "%d", &gTexnum );
  41.     gTextureList = (TEXTURE_2D **)malloc( sizeof(TEXTURE_2D)*(gTexnum+1));
  42.     for(i=1; i<=gTexnum; i++)
  43.     {
  44. gTextureList[i] = (TEXTURE_2D *)malloc( sizeof(TEXTURE_2D));
  45. fscanf( fp, "%s%s", gTextureList[i]->fname, stemp );
  46. if ( strcmp( stemp,"REPEAT_TEXTURE" ) == 0)
  47.       gTextureList[i]->type = 1;
  48. else  if ( strcmp( stemp,"CLAMP_TEXTURE" ) == 0)
  49.           gTextureList[i]->type = 0;
  50.     }
  51.     /******   Read object list   ******/
  52.     fscanf( fp, "%s", stemp);
  53.     while( strcmp( stemp,"ObjectNum" ) != 0) fscanf(fp,"%s",stemp);
  54.     fscanf( fp, "%ld", &gObjectNum);
  55.     gObjectList = (OBJECT *)malloc( sizeof(OBJECT ) * gObjectNum);
  56.     for(i = 0; i < gObjectNum; i ++ )
  57.     {
  58.      fscanf( fp, "%s", stemp);
  59.      while( strcmp( stemp,"SurfaceNum" ) != 0) fscanf(fp,"%s",stemp);
  60.      fscanf( fp, "%ld", &(gObjectList[i].SurfNum) );
  61. gObjectList[i].surflist = (SURFACE *)malloc( sizeof(SURFACE) * gObjectList[i].SurfNum); 
  62. for(j = 0; j < gObjectList[i].SurfNum; j ++ )
  63. {
  64. /******   Read surface infor   ******/
  65. fscanf( fp, "%s", stemp);
  66.      while( strcmp( stemp,"TextureId" ) != 0) fscanf(fp,"%s",stemp);
  67.      fscanf( fp, "%d", &(gObjectList[i].surflist[j].texId) );
  68. fscanf( fp, "%s", stemp);
  69.      while( strcmp( stemp,"pointnum" ) != 0) fscanf(fp,"%s",stemp);
  70.      fscanf( fp, "%d", &(gObjectList[i].surflist[j].pointn) );
  71. fscanf( fp, "%s", stemp);
  72.      while( strcmp( stemp,"triangle" ) != 0) fscanf(fp,"%s",stemp);
  73.      fscanf( fp, "%d", &(gObjectList[i].surflist[j].triangle) );
  74. fscanf( fp, "%s", stemp);
  75.      while( strcmp( stemp,"quadrangle" ) != 0) fscanf(fp,"%s",stemp);
  76.      fscanf( fp, "%d", &(gObjectList[i].surflist[j].quadric) );
  77. /******   Read point list    ******/
  78. gObjectList[i].surflist[j].pointlist = (POINT*)malloc(sizeof(POINT) * 
  79.                                      gObjectList[i].surflist[j].pointn);
  80. plist = gObjectList[i].surflist[j].pointlist;
  81. for( l = 0; l < gObjectList[i].surflist[j].pointn ; l ++ )
  82. fscanf( fp, "%f%f%f%f%f%f%f%f", 
  83.         &(plist[l].r), &(plist[l].g), &(plist[l].b),     
  84. &(plist[l].u), &(plist[l].v),
  85. &(plist[l].x), &(plist[l].y), &(plist[l].z) );
  86. /******    Read patchlist    ******/
  87. nAllVertexNum = gObjectList[i].surflist[j].triangle * 3 + 
  88. gObjectList[i].surflist[j].quadric *4 ;
  89. gObjectList[i].surflist[j].patchlist = (INT4U *)malloc( sizeof(INT4U) * nAllVertexNum);
  90. pchlist =  gObjectList[i].surflist[j].patchlist;
  91. for( l = 0; l <  nAllVertexNum; l ++ )
  92. fscanf( fp, "%ld", &(pchlist[l]) );
  93. }
  94.     }
  95.     
  96.     
  97.     fclose(fp);    
  98. }
  99. void InitRenderWin()
  100. {
  101.   static int  mark = 1;
  102.   FILE *fp;
  103. /*  fp = fopen(sLookAtFN, "rb");
  104.   if (fp == NULL)
  105.   {
  106. ex = ey = ez =1.0f;
  107. cx = cy = cz =0.0f;
  108. near = 0.1;
  109. angle = 30.0f;
  110.   }
  111.   else fscanf(fp, "%f%f%f%f%f%f%f%f", &angle, &near, &ex, &ey, &ez, &cx, &cy, &cz);
  112.   fclose(fp);*/
  113.   glShadeModel ( GL_SMOOTH );
  114.   glDepthFunc ( GL_LESS );
  115.   glEnable ( GL_DEPTH_TEST );
  116.   glViewport(0, 0, gWinWidth, gWinHeigth);
  117.   glMatrixMode ( GL_PROJECTION );
  118.   glLoadIdentity();
  119.   gluPerspective ( 30.0, (float)gWinWidth/(float)gWinHeigth, 10.0, 1000000000.0);
  120.   if (mark)
  121.   {
  122.    glGetDoublev( GL_PROJECTION_MATRIX, gProject );
  123.      gViewport[0] = gWinWidth / 2 ; gViewport[1] = 0.0;  gViewport[2] = 0.0; gViewport[3] = 0.0;
  124.      gViewport[4] = 0.0; gViewport[5] = gWinHeigth / 2 ;  gViewport[6] = 0.0; gViewport[7] = 0.0;
  125.      gViewport[8] = 0.0; gViewport[9] = 0.0; gViewport[10] = 1.0; gViewport[11] = 0.0;
  126.      gViewport[12] = gWinWidth / 2 ; gViewport[13] = gWinHeigth / 2; gViewport[14] = 0.0; gViewport[15] = 1.0;
  127.      glPushMatrix();
  128.      glLoadMatrixd(gViewport);
  129.      glMultMatrixd(gProject);
  130.      glGetDoublev( GL_PROJECTION_MATRIX , gMatrixVP );
  131.      glPopMatrix(); 
  132. mark = 0;
  133.   }
  134. }
  135. void Render(void)
  136. {
  137.   int      i, j, k, l, m, TexIndex;
  138.   POINT    *plist; 
  139.   INT4U    *pchlist;
  140.    
  141.    
  142.   glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT);
  143.    
  144.   for(i = 0; i < gObjectNum; i ++ )
  145. for(j = 0; j < gObjectList[i].SurfNum; j ++ )
  146. {
  147. TexIndex = gObjectList[i].surflist[j].texId;
  148. if( TexIndex > 0 )
  149. InitTex( TexIndex );
  150. plist = gObjectList[i].surflist[j].pointlist;
  151. pchlist =  gObjectList[i].surflist[j].patchlist;
  152. l = 0;
  153. for ( k = 0; k < gObjectList[i].surflist[j].triangle; k ++)
  154. {
  155. glBegin( GL_TRIANGLES );
  156. for( m = 0; m < 3; m ++ )
  157. {
  158.     glColor3f ( plist[pchlist[l]].r,
  159.      plist[pchlist[l]].g,
  160.      plist[pchlist[l]].b );
  161.     glTexCoord2f( plist[pchlist[l]].u,
  162.   plist[pchlist[l]].v );
  163.     glVertex3f( plist[pchlist[l]].x,
  164. plist[pchlist[l]].y,
  165. plist[pchlist[l]].z );
  166.     l ++;
  167. }/* m */
  168. glEnd();
  169. }/* k */
  170. for ( k = 0; k < gObjectList[i].surflist[j].quadric; k ++)
  171. {
  172. glBegin( GL_QUADS );
  173. for( m = 0; m < 4; m ++ )
  174. {
  175.     glColor3f ( plist[pchlist[l]].r,
  176.      plist[pchlist[l]].g,
  177.      plist[pchlist[l]].b );
  178.     glTexCoord2f( plist[pchlist[l]].u,
  179.   plist[pchlist[l]].v );
  180.     glVertex3f( plist[pchlist[l]].x,
  181. plist[pchlist[l]].y,
  182. plist[pchlist[l]].z );
  183.     l ++;
  184. }/* m */
  185. glEnd();
  186. }/* k */
  187. glFlush();
  188. CloseTex();
  189. }
  190. }
  191. void freelist()
  192. {
  193. int i, j;
  194. for( i=0; i<gObjectNum; i++)
  195. {
  196. for( j=0; j<gObjectList[i].SurfNum; j++)
  197. {
  198. free(gObjectList[i].surflist[j].pointlist);
  199. free(gObjectList[i].surflist[j].patchlist);
  200. }
  201. free( gObjectList[i].surflist );
  202. }
  203.      free(gObjectList);
  204.      for(i=1; i<=gTexnum; i++)
  205. free(gTextureList[i]);
  206. free(gTextureList);
  207.         
  208.         auxQuit();
  209. }
  210. void markDiscontinuous(short xlen, short ylen, float *depth, unsigned char **mark)
  211. {
  212. int   x,y,i,l,m, n;
  213. float  **buf, temp;
  214. static int index[]={1,0,1,1,0,1,-1,1};
  215. i = 0;
  216. buf = (float **) malloc (ylen * sizeof(float *));
  217. for( y=0; y<ylen; y++)
  218. {
  219. buf[y] = (float *) malloc (xlen * sizeof(float));
  220. for(x = 0; x < xlen; x ++)
  221. {
  222. buf[y][x] = depth[i];
  223. i ++;
  224.                       
  225. }
  226. /* if( y == 76) 
  227.   for(x = 0; x < xlen; x ++)
  228.   {
  229. if( x % 10 == 0) printf("n");
  230. printf("%f,", buf[y][x]);
  231.   }
  232. */ }
  233. for( y=0; y<ylen; y++)
  234. {
  235. for(x = 0; x < xlen; x ++)
  236. {
  237. for( i = 0; i < 4; i ++)
  238. {
  239. m = x + index[i << 1];
  240. n = y + index[(i << 1) + 1];
  241. if( (m >= 0) && (m < xlen) && (n >= 0) && (n < ylen) )
  242. { /*************/
  243. temp = buf[y][x] - buf[n][m]; /*  |3|2|1|  */
  244. if(temp > 0.007) /*  |4| |0|  */
  245. mark[y][x] = mark[y][x] |((char)1 << i) ; /*  |5|6|7|  */
  246. else if(temp < -0.007) /*************/
  247. mark[n][m] = mark[n][m] | ((char)1 << (4 + i)); 
  248. }
  249. }
  250. }
  251. }
  252. for(y=0; y<ylen; y++) free(buf[y]);
  253. free(buf);
  254. i = 0;
  255. for( y=0; y<ylen; y++)
  256.     for(x = 0; x < xlen; x ++)
  257. if(mark[y][x] )    
  258.   {
  259. if( i % 10 == 0) printf("n");
  260. printf("(%1d,%1d,%3x)",y, x, buf[y][x]);
  261. i ++;
  262.   }  
  263. }
  264. /****************************************/
  265. /* function :write_rgb */
  266. /****************************************/
  267. void write_rgb()
  268. {       
  269.   static int   num = 0;      
  270. short viewx,viewy;
  271.         short xx,y,x;
  272. int  i;
  273.         short Xlen, Ylen, colNum, rowNum;
  274. char    temp[4], imageFile[30], depthFile[30];
  275.         GLint port[4];
  276.         double begin, wx, wy, wz, w;
  277.         IMAGE *image;
  278. FILE    *fp;
  279.         unsigned short *rbuf;
  280.         unsigned short *gbuf;
  281.         unsigned short *bbuf;
  282.         short         *dbuf;
  283.         float    *depth;
  284. unsigned char *demo, **disMark;
  285. long     colNumAddress, rowNumAddress;
  286. num ++;
  287. temp[0] = '.';
  288. i = num / 10;
  289. temp[1] = (char)('0' + i);
  290. i = num % 10;
  291. temp[2] = (char)('0' + i);
  292.   temp[3] = '';
  293. strcpy(imageFile,gImageName);
  294. strcpy(&(imageFile[strlen(imageFile)]), temp);
  295. strcpy(depthFile,imageFile);
  296. strcpy(&(imageFile[strlen(imageFile)]), ".rgb");
  297. strcpy(&(depthFile[strlen(depthFile)]), ".depth");
  298.      glGetDoublev( GL_MODELVIEW_MATRIX, gModelview );
  299.      glPushMatrix();
  300.      glLoadMatrixd(gMatrixVP);
  301.      glMultMatrixd(gModelview);
  302.      glGetDoublev( GL_MODELVIEW_MATRIX, gMatrixC1 );
  303.      glPopMatrix();
  304.     gMatrixC1[2] = 0.0; gMatrixC1[6] = 0.0; gMatrixC1[10] = 1.0; gMatrixC1[14] = 14.737;
  305. glGetIntegerv(GL_VIEWPORT,port);
  306. viewx = port[2]-port[0];
  307. viewy = port[3]-port[1]; 
  308.         Xlen = viewx;
  309.         Ylen = viewy;
  310.   fp = fopen( depthFile, "wb");  /**************************************/
  311. fwrite( &colNumAddress, sizeof(long), 1, fp);
  312. fwrite( &Xlen, sizeof(short), 1, fp);                    /*   write viewx, viewy & matrix C^   */
  313. fwrite( &Ylen, sizeof(short), 1, fp);  /**************************************/
  314. fwrite(gMatrixC1, sizeof(double), 16, fp);
  315.         
  316.      depth  = (float *)malloc( viewx*viewy * sizeof(float) );
  317. demo = (unsigned char *)malloc(viewx*viewy*3);
  318. disMark = (unsigned char **)malloc(viewy * sizeof(unsigned char *));
  319. for(i = 0; i < viewy; i ++)
  320. {
  321. disMark[i] = (unsigned char *)malloc(viewx);
  322. for(x = 0 ; x < viewx; x ++)
  323. disMark[i][x] = 0; 
  324. }
  325. rbuf = (unsigned short*)malloc(Xlen*sizeof(short));
  326. gbuf = (unsigned short*)malloc(Xlen*sizeof(short));
  327. bbuf = (unsigned short*)malloc(Xlen*sizeof(short));
  328. dbuf = (short*)malloc(Xlen*sizeof(short));
  329. glReadPixels(0,0,viewx,viewy,GL_RGB,GL_UNSIGNED_BYTE,demo);
  330. glReadPixels( 0, 0, viewx, viewy, GL_DEPTH_COMPONENT, GL_FLOAT, depth );
  331. markDiscontinuous(viewx, viewy, depth, disMark);
  332. printf( "n end mark discontiniousn");
  333. colNum = 0;
  334. colNumAddress = ftell(fp);
  335. fwrite( &colNum, sizeof(short), 1, fp);     /*   Write length of colum    */
  336. for( y=0; y<Ylen; y++)
  337. {
  338. rowNum = 0;
  339. rowNumAddress = ftell(fp);
  340. fwrite( &rowNum, sizeof(short), 1, fp);    /*   Write length of row    */
  341. fwrite( &y, sizeof(short), 1, fp);      /*   Write row's No.    */  
  342. for(xx=0; xx<Xlen; xx++)
  343. {
  344. if(disMark[y][xx] != 0)
  345. {
  346. fwrite( &xx, sizeof(short), 1, fp); /*   Write col's No. and discontinuious Mark   */  
  347. fwrite( &disMark[y][xx], sizeof(char), 1, fp);
  348. rowNum ++;
  349. }
  350. }
  351. if( rowNum == 0)
  352. fseek(fp, rowNumAddress, SEEK_SET);
  353. else
  354. {
  355. fseek(fp, rowNumAddress, SEEK_SET);
  356. fwrite( &rowNum, sizeof(short), 1, fp);
  357. fseek(fp, 0, SEEK_END);
  358. colNum ++;
  359. }
  360. }
  361. fseek(fp, colNumAddress, SEEK_SET);
  362. fwrite( &colNum, sizeof(short), 1, fp);
  363. fseek(fp, 0, SEEK_END);
  364. printf( "n end Wriete discontinious mark ");
  365.  
  366. colNumAddress = ftell(fp);
  367. fseek(fp, 0, SEEK_SET);
  368. fwrite(&colNumAddress, sizeof(long), 1, fp);
  369. fseek(fp, 0, SEEK_END);
  370. i=0;
  371. for( y=0; y<Ylen; y++)
  372. {
  373. for(xx=0; xx<Xlen; xx++)
  374. {
  375. gluUnProject(xx ,y, depth[i+xx], gModelview, gProject, port, &wx, &wy, &wz);
  376.      w = gMatrixC1[3] * wx + gMatrixC1[7] * wy + gMatrixC1[11] * wz + gMatrixC1[15];
  377. depth[i+xx] = ( gMatrixC1[2] * wx + gMatrixC1[6] * wy
  378.  + gMatrixC1[10] * wz + gMatrixC1[14] ) / w;
  379. }
  380. i += Xlen;
  381. }
  382. image = iopen(imageFile , "w", RLE(1), 3, Xlen, Ylen, 3);
  383. i=0;
  384. for( y=0; y<Ylen; y++)
  385. {
  386. for(xx=0; xx<Xlen; xx++)
  387. {
  388. rbuf[xx] = (short)(demo[(i+xx)*3]);
  389. gbuf[xx] = (short)(demo[(i+xx)*3+1]);
  390. bbuf[xx] = (short)(demo[(i+xx)*3+2]);
  391. dbuf[xx] = (short)(depth[i+xx]*10000);
  392. }
  393. i += Xlen;
  394. putrow(image, rbuf,y,0);
  395. putrow(image, gbuf,y,1);
  396. putrow(image, bbuf,y,2);
  397. fwrite(dbuf, sizeof(short), Xlen, fp);
  398. }
  399. iclose(image);
  400. fclose(fp);
  401. printf( "n end write rgb ");
  402.   free(demo);
  403. for(i = 0; i < viewy; i ++) free(disMark[i]); 
  404. free(disMark);  
  405. free(depth);
  406. free(rbuf);
  407. free(gbuf);
  408. free(bbuf);
  409. free(dbuf); 
  410. }
  411. void    leftFunc(void)
  412. {
  413.   gEx -= 2.0;
  414. }
  415. void    rightFunc(void)
  416. {
  417.   gEx += 2.0;
  418. }
  419. void    upFunc(void)
  420. {
  421.   gEz -= 2.0;
  422. }
  423. void    downFunc(void)
  424. {
  425.   gEz += 2.0;
  426. }
  427. void    leftCFunc(void)
  428. {
  429.   gCx -= 2.0;
  430. }
  431. void    rightCFunc(void)
  432. {
  433.   gCx += 2.0;
  434. }
  435. void    upCFunc(void)
  436. {
  437.   gCz -= 2.0;
  438. }
  439. void    downCFunc(void)
  440. {
  441.   gEz += 2.0;
  442. }
  443. void inputEye(void)
  444. {
  445.   printf("nPlease input view point(x,y,z):");
  446.   scanf("%f%f%f",&gEx, &gEy, &gEz);
  447. }
  448. void inputCenter(void)
  449. {
  450.   printf("nPlease input center point(x,y,z):");
  451.   scanf("%f%f%f",&gCx, &gCy, &gCz);
  452. }
  453. void getXYZ(AUX_EVENTREC  *event)
  454. {
  455. GLint  i,j;
  456. double x,y,z;
  457.         GLint port[4];
  458. float  depth;
  459. i = event->data[AUX_MOUSEX];
  460. j = gWinHeigth - event->data[AUX_MOUSEY];
  461. glGetIntegerv(GL_VIEWPORT,port);
  462.      glGetDoublev( GL_MODELVIEW_MATRIX, gModelview );
  463. glReadPixels( i, j, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth );
  464. gluUnProject(i , j, depth, gModelview, gProject, port, &x, &y, &z); 
  465.         printf( "n the world coordination of (%1d, %1d, %f) is (%f, %f, %f)", i, j, depth, x, y, z);    
  466.  
  467. }
  468. /****************************************/
  469. /* function : Shoot */
  470. /* calculate the Fij, */
  471. /* (i=0,pindex-1; j=0,pindex-1) */
  472. /****************************************/
  473. void Shoot(void) 
  474. {    
  475.   system ("date");
  476.   glMatrixMode ( GL_MODELVIEW );
  477.   glLoadIdentity();
  478.   gluLookAt( gEx, gEy, gEz, gCx, gCy, gCz, 0.0, 1.0, 0.0); 
  479.   printf("Viewpoint(%3.1f, %3.1f, %3.1f), Centerpoint(%1.1f, %1.1f, %1.1f)",
  480.   gEx, gEy, gEz, gCx, gCy, gCz);
  481.   /*  DrawBkGroundPic();   */
  482.   Render();
  483.   printf("n****** Finish Render; Current time is:");
  484.   system ("date");
  485.  /* write_rgb(gImageName);  
  486.  /***************
  487.  PrintMessage(); 
  488.  ***************/ 
  489.  
  490. }
  491. /****************************************/
  492. /*   function: myReshape1 */
  493. /****************************************/
  494. void myReshape1(int w, int h)
  495. InitRenderWin();
  496. }
  497. /****************************************/
  498. /*   function: Hemi_mode */
  499. /****************************************/
  500. void Hemi_mode()
  501. {  
  502.   auxInitDisplayMode ( AUX_SINGLE | AUX_RGBA | AUX_DEPTH );
  503.   auxInitPosition (0, 0, gWinWidth, gWinHeigth);
  504.   auxInitWindow ( gImageName );
  505.   auxKeyFunc (AUX_LEFT, leftFunc);
  506.   auxKeyFunc (AUX_RIGHT, rightFunc);
  507.   auxKeyFunc (AUX_UP, upFunc);
  508.   auxKeyFunc (AUX_DOWN, downFunc);
  509.   auxKeyFunc (AUX_j, leftCFunc);
  510.   auxKeyFunc (AUX_l, rightCFunc);
  511.   auxKeyFunc (AUX_k, upCFunc);
  512.   auxKeyFunc (AUX_m, downCFunc);
  513.   auxKeyFunc (AUX_e, inputEye);
  514.   auxKeyFunc (AUX_c, inputCenter);
  515.   auxKeyFunc (AUX_ESCAPE, freelist);
  516.   auxKeyFunc (AUX_w, write_rgb);
  517.   auxMouseFunc( AUX_LEFTBUTTON, AUX_MOUSEDOWN, getXYZ);  
  518.   auxReshapeFunc (myReshape1);
  519.  
  520.   auxMainLoop(Shoot);
  521. }