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

OpenGL

开发平台:

Visual C++

  1. // RenderView.cpp
  2. #include "stdafx.h"
  3. #include "Tool.h"
  4. #include <string.h>
  5. #include <time.h>
  6. #include <math.h> 
  7. #include "ToolDoc.h"
  8. #include "RenderView.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. extern void Render(void);
  15. // This is the holding space for the landscape colours.
  16. int WinWidth, WinHeigth;
  17. unsigned short int comp = 32; // Scale modifier.
  18. unsigned short int temp, texture_mapping = FALSE,
  19.                    land_fogging = TRUE, flat_shading = TRUE;
  20. float angle, Near, ex, ey, ez, cx, cy, cz;
  21. // Initial eye position and vector of sight.
  22. static GLfloat speed = 0;
  23. // The following code for mouse routines was contributed.
  24. // These are used for the motion function.
  25. #define FORWARD 1
  26. #define UP 2
  27. #define TURNLEFT 3
  28. #define LOOKUP 5
  29. // Mouse position and button.
  30. int oldmx = 0, oldmy = 0, mb;
  31. // CRenderView
  32. IMPLEMENT_DYNCREATE(CRenderView, CView)
  33. BEGIN_MESSAGE_MAP(CRenderView, CView)
  34. //{{AFX_MSG_MAP(CRenderView)
  35. ON_WM_DESTROY()
  36. ON_WM_SIZE()
  37. ON_WM_LBUTTONDOWN()
  38. ON_WM_LBUTTONUP()
  39. ON_WM_MOUSEMOVE()
  40. ON_WM_PAINT()
  41. ON_WM_CREATE()
  42. //}}AFX_MSG_MAP
  43. // Standard printing commands
  44. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  45. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  46. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  47. END_MESSAGE_MAP()
  48. // CRenderView construction/destruction
  49. CRenderView::CRenderView()
  50. {
  51.   // OpenGL
  52.   m_hGLContext = NULL;
  53.   m_GLPixelIndex = 0;
  54.   
  55.   // Mouse
  56.   m_LeftButtonDown = FALSE;
  57.   m_RightButtonDown = FALSE;
  58.   m_CursorRotation = AfxGetApp()->LoadCursor(IDC_CURSOR_ROTATION);
  59.   // Colors
  60.   CToolApp *pApp = (CToolApp *)AfxGetApp();
  61.   m_ClearColorRed   = GetRValue(pApp->m_OptionColorGlBack);
  62.   m_ClearColorGreen = GetGValue(pApp->m_OptionColorGlBack);
  63.   m_ClearColorBlue  = GetBValue(pApp->m_OptionColorGlBack);
  64.   ReadData();
  65.   WinWidth=1000;
  66.   WinHeigth=800;
  67.   LoadAllTexture();
  68.   InitLookAt();
  69. }
  70. //============================================
  71. // InitGeometry
  72. //============================================
  73. void CRenderView::InitGeometry(void)
  74. {
  75.   GLfloat fogColor[4] = {0.75, 0.75, 1.0, 1.0};
  76.   speed = 0;
  77.   srand(224);
  78.   srand((unsigned)time(NULL));
  79.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  80.   glEnable(GL_DEPTH_TEST);
  81.   glShadeModel(GL_FLAT);
  82.   glFogi(GL_FOG_MODE, GL_LINEAR);
  83.   glFogfv(GL_FOG_COLOR, fogColor);
  84.   glFogf(GL_FOG_DENSITY, 0.8f);
  85.   glFogf(GL_FOG_START, 400.0f);
  86.   glFogf(GL_FOG_END, 500.0f);  
  87.   glClearColor(0.75f, 0.75f, 1.0f, 1.0f);
  88. }
  89. CRenderView::~CRenderView()
  90. {
  91. FreeAllTexture();
  92. freelist();
  93. }
  94. BOOL CRenderView::PreCreateWindow(CREATESTRUCT& cs)
  95. {
  96.   return CView::PreCreateWindow(cs);
  97. }
  98. // CRenderView drawing
  99. void CRenderView::OnDraw(CDC* pDC)
  100. {
  101. }
  102. BOOL CRenderView::OnPreparePrinting(CPrintInfo* pInfo)
  103. {
  104.   return DoPreparePrinting(pInfo);
  105. }
  106. void CRenderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  107. {
  108. }
  109. void CRenderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  110. {
  111. }
  112. // CRenderView diagnostics
  113. #ifdef _DEBUG
  114. void CRenderView::AssertValid() const
  115. {
  116.   CView::AssertValid();
  117. }
  118. void CRenderView::Dump(CDumpContext& dc) const
  119. {
  120.   CView::Dump(dc);
  121. }
  122. CToolDoc* CRenderView::GetDocument() // non-debug version is inline
  123. {
  124.   if (m_pDocument){
  125.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CToolDoc)));
  126.     return (CToolDoc*)m_pDocument;
  127.   }
  128.   else return NULL;
  129. }
  130. #endif //_DEBUG
  131. // Create OpenGL rendering context 
  132. int CRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  133. {
  134.   if (CView::OnCreate(lpCreateStruct) == -1)
  135.     return -1;
  136.   
  137.   HWND hWnd = GetSafeHwnd();
  138.   HDC hDC = ::GetDC(hWnd);
  139.   if(SetWindowPixelFormat(hDC)==FALSE)
  140.     return 0;
  141.   
  142.   if(CreateViewGLContext(hDC)==FALSE)
  143.     return 0;
  144.   
  145.   // Default mode
  146.   glPolygonMode(GL_FRONT,GL_FILL);
  147.   glPolygonMode(GL_BACK,GL_FILL);
  148.   glShadeModel(GL_FLAT);
  149.   
  150.   // light must be disabled 
  151.   // while rendering the terrain
  152.   // because it has no normal definition
  153.   InitGeometry();
  154.   glEnable(GL_TEXTURE_2D);
  155.   glDisable(GL_LIGHTING);  
  156.   return 0;
  157. }
  158. BOOL CRenderView::SetWindowPixelFormat(HDC hDC)
  159. {
  160.   PIXELFORMATDESCRIPTOR pixelDesc;
  161.   
  162.   pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
  163.   pixelDesc.nVersion = 1;
  164.   
  165.   pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
  166.     PFD_DOUBLEBUFFER | PFD_STEREO_DONTCARE;
  167.   
  168.   pixelDesc.iPixelType = PFD_TYPE_RGBA;
  169.   pixelDesc.cColorBits = 32;
  170.   pixelDesc.cRedBits = 8;
  171.   pixelDesc.cRedShift = 16;
  172.   pixelDesc.cGreenBits = 8;
  173.   pixelDesc.cGreenShift = 8;
  174.   pixelDesc.cBlueBits = 8;
  175.   pixelDesc.cBlueShift = 0;
  176.   pixelDesc.cAlphaBits = 0;
  177.   pixelDesc.cAlphaShift = 0;
  178.   pixelDesc.cAccumBits = 64;
  179.   pixelDesc.cAccumRedBits = 16;
  180.   pixelDesc.cAccumGreenBits = 16;
  181.   pixelDesc.cAccumBlueBits = 16;
  182.   pixelDesc.cAccumAlphaBits = 0;
  183.   pixelDesc.cDepthBits = 32;
  184.   pixelDesc.cStencilBits = 8;
  185.   pixelDesc.cAuxBuffers = 0;
  186.   pixelDesc.iLayerType = PFD_MAIN_PLANE;
  187.   pixelDesc.bReserved = 0;
  188.   pixelDesc.dwLayerMask = 0;
  189.   pixelDesc.dwVisibleMask = 0;
  190.   pixelDesc.dwDamageMask = 0;
  191.   
  192.   m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
  193.   if(m_GLPixelIndex == 0) // Choose default
  194.   {
  195.     m_GLPixelIndex = 1;
  196.     if(DescribePixelFormat(hDC,m_GLPixelIndex,
  197.       sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
  198.       return FALSE;
  199.   }
  200.   
  201.   if(!SetPixelFormat(hDC,m_GLPixelIndex,&pixelDesc))
  202.     return FALSE;
  203.   
  204.   return TRUE;
  205. }
  206. // Create an OpenGL rendering context
  207. BOOL CRenderView::CreateViewGLContext(HDC hDC)
  208. {
  209.   m_hGLContext = wglCreateContext(hDC);
  210.   
  211.   if(m_hGLContext==NULL)
  212.     return FALSE;
  213.   
  214.   if(wglMakeCurrent(hDC,m_hGLContext)==FALSE)
  215.     return FALSE;
  216.   
  217.   return TRUE;
  218. }
  219. // Cleanup every OpenGL rendering context
  220. void CRenderView::OnDestroy() 
  221. {
  222.   if(wglGetCurrentContext() != NULL)
  223.     wglMakeCurrent(NULL,NULL);
  224.   
  225.   if(m_hGLContext != NULL)
  226.   {
  227.     wglDeleteContext(m_hGLContext);
  228.     m_hGLContext = NULL;
  229.   }
  230.   CView::OnDestroy();
  231. }
  232. void CRenderView::OnSize(UINT nType, int cx, int cy) 
  233. {
  234.   CView::OnSize(nType, cx, cy);
  235.   
  236.   // Set OpenGL perspective, viewport and mode
  237.   CSize size(cx,cy);
  238.   double aspect;
  239.   aspect = (cy == 0) ? (double)size.cx : (double)size.cx/(double)size.cy;
  240.   glViewport(0, 0, (GLsizei) cx, (GLsizei) cy);
  241.   glMatrixMode(GL_PROJECTION);
  242.   glLoadIdentity();
  243.   gluPerspective(60.0, (GLfloat) cx/(GLfloat) cy, 1.0f, 500.0f);
  244.   glMatrixMode(GL_MODELVIEW);
  245.   glLoadIdentity();
  246.   gluLookAt (ex, ey, ez, cx, cy, cz, 0.0f, 1.0f, 0.0f);
  247. }
  248. void CRenderView::OnLButtonDown(UINT nFlags, CPoint point) 
  249. {
  250.   m_LeftButtonDown = TRUE;
  251.   m_LeftDownPos = point;
  252.   CView::OnLButtonDown(nFlags, point);
  253. }
  254. void CRenderView::OnLButtonUp(UINT nFlags, 
  255.                 CPoint point) 
  256. {
  257.   m_LeftButtonDown = FALSE;
  258.   CView::OnLButtonUp(nFlags, point);
  259. }
  260. void CRenderView::OnMouseMove(UINT nFlags, CPoint point) 
  261. {
  262.   switch(nFlags){
  263.     case(MK_LBUTTON):
  264.   MoveEye(FORWARD,(GLfloat)(oldmy-point.y)/5.0f,1);
  265. break;
  266.     case(MK_RBUTTON):
  267.       MoveEye(TURNLEFT, (GLfloat)(oldmx-point.x), 1);
  268.       break;
  269.   }
  270.   oldmy = point.y;
  271.   oldmx = point.x;    
  272.   Invalidate(FALSE);
  273.   CView::OnMouseMove(nFlags, point);
  274. }
  275. void CRenderView::OnPaint() 
  276. {
  277.   // Device context for painting  
  278.   CPaintDC dc(this); 
  279.   
  280.   // Useful in singledoc templates
  281.   HWND hWnd = GetSafeHwnd();
  282.   HDC hDC = ::GetDC(hWnd);
  283.   wglMakeCurrent(hDC,m_hGLContext);
  284.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  285.   glClearColor(m_ClearColorRed,m_ClearColorGreen,m_ClearColorBlue,1.0f);
  286.   glPushMatrix();  
  287.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  288.   InitRenderWin();
  289.   Render();
  290.   // Double buffers
  291.   SwapBuffers(hDC);
  292. }
  293. // Function that moves the eye or turns the angle of sight.
  294. // Updates scene if update != 0.
  295. void CRenderView::MoveEye(int type, GLfloat amount, int update)
  296. {
  297.   GLfloat a;
  298.     switch(type){
  299.     case FORWARD:
  300. a = sqrt((cx-ex)*(cx-ex)+(cz-ez)*(cz-ez));
  301. ex = (amount*(cx-ex)+a*ex) / a;
  302. ez = (amount*(cz-ez)+a*ez) / a;
  303. cx = (amount*(cx-ex)+a*cx) / a;
  304. cz = (amount*(cz-ez)+a*cz) / a;
  305.       break;
  306.     case TURNLEFT:
  307.       cx = (cx-ex)*(float)cos(amount/360.0f) + (cz-ez)*(float)sin(amount/360.0f)+ex;
  308.       cz = (cz-ez)*(float)cos(amount/360.0f) - (cx-ex)*(float)sin(amount/360.0f)+ez;
  309.       break;
  310.     case UP:
  311.       ey += amount;
  312.       break;
  313.     case LOOKUP:
  314.       cy += amount;
  315.       break;
  316.   }
  317.   if (update){
  318.     glMatrixMode(GL_MODELVIEW); 
  319.     glLoadIdentity();
  320.     gluLookAt(ex, ey, ez, cx, cy, cz, 0.0f,1.0f,0.0f);
  321.   }
  322. }
  323. TEXTURE_2D    **TextureList;
  324. OBJECT       *ObjectList; /* ObjectList[0]:isolated surfaces*/
  325. INT4S         ObjectNum; 
  326. char          gEnergyFile[30];
  327. char       sLookAtFN[100];
  328. char       ImageName[30];
  329.  
  330. void  CRenderView::ReadData()
  331.     int     i,j,l;
  332.     FILE    *fp;
  333.     char    stemp[100];
  334.     POINT3D   *plist; 
  335.     INT4U   nAllVertexNum; 
  336.     INT4U   *pchlist; 
  337.     strcpy(gEnergyFile,"room.ed");
  338.     fp = fopen( gEnergyFile, "r" );
  339.     if ( fp == NULL ) 
  340.     {  
  341.           printf( "n Can not open energy data file:%sn", gEnergyFile);
  342.           exit(0);
  343.     }   
  344.     fseek( fp, 0, SEEK_SET);
  345.     
  346.     /******  read texture list   ******/
  347.     fscanf( fp, "%s", stemp);
  348.     while( strcmp( stemp,"texnum" ) != 0)  fscanf( fp, "%s", stemp);
  349.     fscanf( fp, "%d", &texnum );
  350.     TextureList = (TEXTURE_2D **)malloc( sizeof(TEXTURE_2D)*(texnum+1));
  351.     for(i=1; i<=texnum; i++)
  352.     {
  353. TextureList[i] = (TEXTURE_2D *)malloc( sizeof(TEXTURE_2D));
  354. fscanf( fp, "%s%s", TextureList[i]->fname, stemp );
  355. if ( strcmp( stemp,"REPEAT_TEXTURE" ) == 0)
  356.       TextureList[i]->type = 1;
  357. else  if ( strcmp( stemp,"CLAMP_TEXTURE" ) == 0)
  358.           TextureList[i]->type = 0;
  359.     }
  360.     /******   Read object list   ******/
  361.     fscanf( fp, "%s", stemp);
  362.     while( strcmp( stemp,"ObjectNum" ) != 0) fscanf(fp,"%s",stemp);
  363.     fscanf( fp, "%ld", &ObjectNum);
  364.     ObjectList = (OBJECT *)malloc( sizeof(OBJECT ) * ObjectNum);
  365.     for(i = 0; i < ObjectNum; i ++ )
  366.     {
  367.      fscanf( fp, "%s", stemp);
  368.      while( strcmp( stemp,"SurfaceNum" ) != 0) fscanf(fp,"%s",stemp);
  369.      fscanf( fp, "%ld", &(ObjectList[i].SurfNum) );
  370. ObjectList[i].surflist = (SURFACE *)malloc( sizeof(SURFACE) * ObjectList[i].SurfNum); 
  371. for(j = 0; j < ObjectList[i].SurfNum; j ++ )
  372. {
  373. /******   Read surface infor   ******/
  374. fscanf( fp, "%s", stemp);
  375.      while( strcmp( stemp,"TextureId" ) != 0) fscanf(fp,"%s",stemp);
  376.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].texId) );
  377. fscanf( fp, "%s", stemp);
  378.      while( strcmp( stemp,"pointnum" ) != 0) fscanf(fp,"%s",stemp);
  379.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].pointn) );
  380. fscanf( fp, "%s", stemp);
  381.      while( strcmp( stemp,"triangle" ) != 0) fscanf(fp,"%s",stemp);
  382.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].triangle) );
  383. fscanf( fp, "%s", stemp);
  384.      while( strcmp( stemp,"quadrangle" ) != 0) fscanf(fp,"%s",stemp);
  385.      fscanf( fp, "%d", &(ObjectList[i].surflist[j].quadric) );
  386. /******   Read point list    ******/
  387. ObjectList[i].surflist[j].pointlist = (POINT3D*)malloc(sizeof(POINT3D) * 
  388.                                      ObjectList[i].surflist[j].pointn);
  389. plist = ObjectList[i].surflist[j].pointlist;
  390. for( l = 0; l < ObjectList[i].surflist[j].pointn ; l ++ )
  391. fscanf( fp, "%f%f%f%f%f%f%f%f", 
  392.         &(plist[l].r), &(plist[l].g), &(plist[l].b),     
  393. &(plist[l].u), &(plist[l].v),
  394. &(plist[l].x), &(plist[l].y), &(plist[l].z) );
  395. /******    Read patchlist    ******/
  396. nAllVertexNum = ObjectList[i].surflist[j].triangle * 3 + 
  397. ObjectList[i].surflist[j].quadric *4 ;
  398. ObjectList[i].surflist[j].patchlist = (INT4U *)malloc( sizeof(INT4U) * nAllVertexNum);
  399. pchlist =  ObjectList[i].surflist[j].patchlist;
  400. for( l = 0; l <  nAllVertexNum; l ++ )
  401. fscanf( fp, "%ld", &(pchlist[l]) );
  402. }
  403.     }       
  404.     fclose(fp);    
  405. }
  406. void CRenderView::InitLookAt()
  407. {
  408.   FILE *fp;
  409.   strcpy(sLookAtFN,"room.lk");
  410.   fp = fopen(sLookAtFN, "rb");
  411.   if (fp == NULL)
  412.   {
  413. ex = ey = ez =1.0f;
  414. cx = cy = cz =0.0f;
  415. Near = 0.1f;
  416. angle = 30.0f;
  417.   }
  418.   else fscanf(fp, "%f%f%f%f%f%f%f%f", &angle, &Near, &ex, &ey, &ez, &cx, &cy, &cz);
  419.   fclose(fp);
  420. }
  421. void CRenderView::InitRenderWin()
  422. {
  423.   glShadeModel ( GL_SMOOTH );
  424.   glDepthFunc ( GL_LESS );
  425.   glEnable ( GL_DEPTH_TEST );
  426.   glMatrixMode ( GL_PROJECTION );
  427.   glLoadIdentity();
  428.   glMatrixMode ( GL_MODELVIEW );
  429.   glLoadIdentity();
  430.   gluPerspective ( angle, (float)WinWidth/(float)WinHeigth, Near, 1000000000.0);
  431.   gluLookAt( ex, ey, ez, cx, cy, cz, 0.0, 1.0, 0.0); 
  432. }
  433. void CRenderView::Render(void)
  434. {
  435.   int      i, j, k, l, m, TexIndex;
  436.   POINT3D    *plist; 
  437.   INT4U    *pchlist;
  438.    
  439.   glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT);
  440.   for(i = 0; i < ObjectNum; i ++ )
  441. for(j = 0; j < ObjectList[i].SurfNum; j ++ )
  442. {
  443. TexIndex = ObjectList[i].surflist[j].texId;
  444. if( TexIndex > 0 )
  445. InitTex( TexIndex );
  446. plist = ObjectList[i].surflist[j].pointlist;
  447. pchlist =  ObjectList[i].surflist[j].patchlist;
  448. l = 0;
  449. for ( k = 0; k < ObjectList[i].surflist[j].triangle; k ++)
  450. {
  451. glBegin( GL_TRIANGLES );
  452. for( m = 0; m < 3; m ++ )
  453. {
  454.     glColor3f ( plist[pchlist[l]].r,
  455.      plist[pchlist[l]].g,
  456.      plist[pchlist[l]].b );
  457.     glTexCoord2f( plist[pchlist[l]].u,
  458.   plist[pchlist[l]].v );
  459.     glVertex3f( plist[pchlist[l]].x,
  460. plist[pchlist[l]].y,
  461. plist[pchlist[l]].z );
  462.     l ++;
  463. }/* m */
  464. glEnd();
  465. }/* k */
  466. for ( k = 0; k < ObjectList[i].surflist[j].quadric; k ++)
  467. {
  468. glBegin( GL_QUADS );
  469. for( m = 0; m < 4; m ++ )
  470. {
  471.     glColor3f ( plist[pchlist[l]].r,
  472.                             plist[pchlist[l]].g,
  473.          plist[pchlist[l]].b );
  474.     glTexCoord2f( plist[pchlist[l]].u,
  475.           plist[pchlist[l]].v );
  476.     glVertex3f( plist[pchlist[l]].x,
  477.         plist[pchlist[l]].y,
  478.         plist[pchlist[l]].z );
  479.     l ++;
  480. }/* m */
  481. glEnd();
  482. }/* k */
  483. glFlush();
  484. CloseTex();
  485. }
  486. }
  487. void CRenderView::freelist()
  488. {
  489. int i, j;
  490. for( i=0; i<ObjectNum; i++)
  491. {
  492. for( j=0; j<ObjectList[i].SurfNum; j++)
  493. {
  494. free(ObjectList[i].surflist[j].pointlist);
  495. free(ObjectList[i].surflist[j].patchlist);
  496. }
  497. free( ObjectList[i].surflist );
  498. }
  499.     free(ObjectList);
  500.     for(i=1; i<=texnum; i++)
  501.    free(TextureList[i]);
  502. free(TextureList);
  503. }
  504. extern TEXTURE_2D **TextureList;
  505. /********************************/
  506. /* function : OpenTexImage */     
  507. /********************************/
  508. unsigned char  *CRenderView::OpenTexImage( INT2U TexIndex, INT2U *rslx, INT2U *rsly )
  509. {
  510. unsigned char *image;
  511. FILE *fp;
  512. INT2U srcx, srcy;
  513. INT4U i, j;
  514. char ImageName[30];
  515. unsigned char *SImageData;
  516. int rc;
  517. int width, height;
  518. strcpy( ImageName, TextureList[TexIndex]->fname);
  519. /* load a image */ 
  520.     fp = fopen(ImageName,"rb");
  521.     if(!fp) return 0;
  522.     fseek(fp,18L,0);
  523.     rc=fread(&width,sizeof(long),1,fp);
  524.     rc=fread(&height,sizeof(long),1,fp);
  525. *rslx=srcx=width; *rsly=srcy=height;
  526. fseek(fp,54L,0);
  527.     image = (unsigned char *)malloc(width*height*3);
  528.     rc=fread(image,width*height*3,1,fp);
  529.     fclose(fp);
  530. SImageData = (unsigned char *)malloc(srcx*srcy*3);
  531.     for(i=0; i<srcx; i++) {
  532.        for(j=0; j<srcy; j++) {
  533.          (unsigned char)*(SImageData+i*srcx*3+j*3+0) = (unsigned char)*(image+i*srcx*3+j*3+2);
  534.          (unsigned char)*(SImageData+i*srcx*3+j*3+1) = (unsigned char)*(image+i*srcx*3+j*3+1);
  535.          (unsigned char)*(SImageData+i*srcx*3+j*3+2) = (unsigned char)*(image+i*srcx*3+j*3+0);
  536.    }
  537.     }
  538.     free(image);
  539. printf("%s : %ld=%ldn", ImageName, srcx*srcy*3,i*j*3);
  540. return( SImageData );
  541. }
  542. /********************************/
  543. /* function : InitTex */     
  544. /********************************/
  545. void CRenderView::InitTex( int TexIndex )
  546. {
  547. INT2U  TextType;
  548. unsigned char *ImageData;
  549. static int OldIndex = -1;
  550. if(TexIndex<=0) return;
  551. if(TexIndex == OldIndex)
  552. {
  553. glEnable(GL_TEXTURE_2D);
  554. return;
  555. }
  556. ImageData = ImageDatas[TexIndex-1];
  557. TextType = TextureList[TexIndex]->type;
  558. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  559. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  560. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  561. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  562. if( TextType == CLAMP_TEXTURE )
  563. {
  564. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  565. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  566. }
  567. else
  568. {
  569. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  570. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  571. }
  572. glTexImage2D( GL_TEXTURE_2D, 0, 3, rslxs[TexIndex-1], rslys[TexIndex-1],
  573.                  0,GL_RGB, GL_UNSIGNED_BYTE, ImageData );
  574. glEnable(GL_TEXTURE_2D);
  575. OldIndex = TexIndex;
  576. }
  577. /********************************/
  578. /* function : CloseTex */     
  579. /********************************/
  580. void CRenderView::CloseTex()
  581. {
  582. glDisable(GL_TEXTURE_2D);
  583. }
  584. void CRenderView::LoadAllTexture()
  585. {
  586.     int i;
  587.     
  588. for (i=0; i <texnum ; i++)
  589.   ImageDatas[i] = OpenTexImage( i+1, &rslxs[i], &rslys[i] );
  590. }
  591. void CRenderView::FreeAllTexture()
  592. {
  593.     int i;
  594.     
  595. for (i=0; i <texnum ; i++)
  596.   free(ImageDatas[i]);
  597. }