gsub.c
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:41k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #if defined(_WIN32)
  4. #include <windows.h>
  5. #include <string.h>
  6. #endif
  7. #ifndef __APPLE__
  8. #include <GL/gl.h>
  9. #else
  10. #include <OpenGL/gl.h>
  11. #endif
  12. #include "sdlut.h"
  13. #include <AR/config.h>
  14. #include <AR/param.h>
  15. #include <AR/ar.h>
  16. #include "gsub.h"
  17. #ifndef GL_ABGR
  18. #define GL_ABGR GL_ABGR_EXT
  19. #endif
  20. #ifndef GL_BGRA
  21. #define GL_BGRA GL_BGRA_EXT
  22. #endif
  23. #ifndef GL_BGR
  24. #define GL_BGR GL_BGR_EXT
  25. #endif
  26. #ifndef GL_RGBA
  27. #define GL_RGBA GL_RGBA_EXT
  28. #endif
  29. #ifndef GL_RGB
  30. #define GL_RGB GL_RGB_EXT
  31. #endif
  32. #define   MINIWIN_MAX    8
  33. #define   REVERSE_LR     1
  34. #define   LEFTEYE        1
  35. #define   RIGHTEYE       2
  36. #define   GMINI          2
  37. /*int  argDrawMode   = DEFAULT_DRAW_MODE;*/
  38. int  argDrawMode   = AR_DRAW_BY_GL_DRAW_PIXELS;
  39. int  argTexmapMode = DEFAULT_DRAW_TEXTURE_IMAGE;
  40. static ARParam  gCparam;
  41. static double   gl_cpara[16];
  42. static double   gl_lpara[16];
  43. static double   gl_rpara[16];
  44. static int      gl_hmd_flag      = 0;
  45. static int      gl_hmd_para_flag = 0;
  46. static double   gZoom;
  47. static int      gXsize, gYsize;
  48. static int      gMiniXnum,  gMiniYnum;
  49. static int      gMiniXsize, gMiniYsize;
  50. static int      gWinXsize, gWinYsize;
  51. static int      gImXsize, gImYsize;
  52. /*static int      win;*/
  53. static GLuint   glid[3];
  54. static void (*gMouseFunc)(int button, int state, int x, int y);
  55. static void (*gKeyFunc)(unsigned char key, int x, int y);
  56. static void (*gMainFunc)(void);
  57. /* static void argInit2( int fullFlag ); */
  58. static void argInitLoop(void);
  59. static void argInitStencil(void);
  60. static void argSetStencil( int flag );
  61. static void argConvGLcpara2( double cparam[3][4], int width, int height, double gnear, double gfar, double m[16] );
  62. static int    tex1Xsize1 = 1;
  63. static int    tex1Xsize2 = 1;
  64. static int    tex1Ysize  = 1;
  65. static int    tex2Xsize  = 1;
  66. static int    tex2Ysize  = 1;
  67. static void   argDispImageTex3( ARUint8 *image, int xwin, int ywin, int mode );
  68. static void   argDispImageTex4( ARUint8 *image, int xwin, int ywin, int mode );
  69. static void   argDispHalfImageTex( ARUint8 *image, int xwin, int ywin, int mode );
  70. static void   argDispImageDrawPixels( ARUint8 *image, int xwin, int ywin );
  71. static void   argDispHalfImageDrawPixels( ARUint8 *image, int xwin, int ywin );
  72. void argInqSetting( int *hmdMode,
  73.                     int *gMiniXnum2, int *gMiniYnum2,
  74.                     void (**mouseFunc)(int button, int state, int x, int y),
  75.                     void (**keyFunc)(unsigned char key, int x, int y),
  76.                     void (**mainFunc)(void) )
  77. {
  78.     *hmdMode    = gl_hmd_flag;
  79.     *gMiniXnum2 = gMiniXnum;
  80.     *gMiniYnum2 = gMiniYnum;
  81.     *mouseFunc = gMouseFunc;
  82.     *keyFunc   = gKeyFunc;
  83.     *mainFunc  = gMainFunc;
  84. }
  85. void argInit( ARParam *cparam, double zoom, /*int fullFlag,*/ int xwin, int ywin, int hmd_flag )
  86. {
  87.     int       i;
  88. #ifdef __APPLE__
  89.     {
  90.         static int initF = 0;
  91.         int        argc = 1;
  92.         char      *argv[1] = {"ARToolKit for MacOSX"};
  93. /*
  94.         if( initF == 0 ) { glutInit(&argc, argv); initF = 1; }
  95. */
  96.     }
  97. #endif
  98.     gl_hmd_flag = hmd_flag;
  99.     gZoom  = zoom;
  100.     gImXsize = cparam->xsize;
  101.     gImYsize = cparam->ysize;
  102.     if( gl_hmd_flag == 0 ) {
  103.         gXsize = (double)cparam->xsize * gZoom;
  104.         gYsize = (double)cparam->ysize * gZoom;
  105.     }
  106.     else {
  107.         gXsize = AR_HMD_XSIZE;
  108.         gYsize = AR_HMD_YSIZE;
  109.     }
  110.     gMiniXsize = (double)cparam->xsize * gZoom / GMINI;
  111.     gMiniYsize = (double)cparam->ysize * gZoom / GMINI;
  112.     if( xwin * ywin > MINIWIN_MAX ) {
  113.         if( xwin > MINIWIN_MAX ) xwin = MINIWIN_MAX;
  114.         ywin = MINIWIN_MAX / xwin;
  115.     }
  116.     gMiniXnum = xwin;
  117.     gMiniYnum = ywin;
  118.     gWinXsize = (gMiniXsize*gMiniXnum > gXsize)?
  119.                      gMiniXsize*gMiniXnum: gXsize;
  120.     gWinYsize = gYsize + gMiniYsize*gMiniYnum;
  121.     gCparam = *cparam;
  122.     for( i = 0; i < 4; i++ ) {
  123.         gCparam.mat[1][i] = (gCparam.ysize-1)*(gCparam.mat[2][i]) - gCparam.mat[1][i];
  124.     }
  125.     argConvGLcpara( &gCparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_cpara );
  126. /*    argInit2( fullFlag ); */
  127. }
  128. void argInitContext( int fullFlag, int fsaaFlag )
  129. {
  130. /*
  131.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
  132.     glutInitWindowPosition(0, 0);
  133.     glutInitWindowSize(gWinXsize, gWinYsize);
  134.     win = glutCreateWindow("");
  135.     if( fullFlag ) {
  136.         glutFullScreen();
  137.         gWinXsize = glutGet(GLUT_SCREEN_WIDTH);
  138.         gWinYsize = glutGet(GLUT_SCREEN_HEIGHT);
  139.     }
  140. */
  141.     sdlutInit();
  142.     if( fsaaFlag )
  143.       sdlutInitDisplayMode(SDLUT_DOUBLE | SDLUT_RGB | 
  144.                            SDLUT_DEPTH | SDLUT_STENCIL | SDLUT_FSAA);
  145.     else
  146.       sdlutInitDisplayMode(SDLUT_DOUBLE | SDLUT_RGB | 
  147.                            SDLUT_DEPTH | SDLUT_STENCIL);
  148.     if( fullFlag ) {
  149.       sdlutCreateWindow("", gWinXsize, gWinYsize, 24, SDLUT_FULLSCREEN);
  150.     } 
  151.     else {
  152.       sdlutCreateWindow("", gWinXsize, gWinYsize, 24, 0);
  153.     }
  154.     gMouseFunc = NULL;
  155.     gKeyFunc   = NULL;
  156.     gMainFunc  = NULL;
  157.     glGenTextures(3, glid);
  158.     glBindTexture( GL_TEXTURE_2D, glid[0] );
  159.     glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  160.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  161.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  162.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  163.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  164.     glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  165.     glBindTexture( GL_TEXTURE_2D, glid[1] );
  166.     glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  167.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  168.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  169.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  170.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  171.     glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  172.     glBindTexture( GL_TEXTURE_2D, glid[2] );
  173.     glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  174.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  175.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  176.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  177.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  178.     glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  179.     if( gImXsize > 512 ) {
  180.         tex1Xsize1 = 512;
  181.         tex1Xsize2 = 1;
  182.         while( tex1Xsize2 < gImXsize - tex1Xsize1 ) tex1Xsize2 *= 2;
  183.     }
  184.     else {
  185.         tex1Xsize1 = 1;
  186.         while( tex1Xsize1 < gImXsize ) tex1Xsize1 *= 2;
  187.     }
  188.     tex1Ysize  = 1;
  189.     while( tex1Ysize < gImYsize ) tex1Ysize *= 2;
  190.     tex2Xsize = 1;
  191.     while( tex2Xsize < gImXsize/2 ) tex2Xsize *= 2;
  192.     tex2Ysize = 1;
  193.     while( tex2Ysize < gImYsize/2 ) tex2Ysize *= 2;
  194. }
  195. void argCleanup( void )
  196. {
  197. /*
  198.     glutDestroyWindow( win );
  199. */
  200.     sdlutDestroyWindow();
  201. }
  202. void argSwapBuffers( void )
  203. {
  204. /*
  205.     glutSwapBuffers();
  206. */
  207.     sdlutSwapBuffers();
  208. }
  209. void argMainLoop( void (*mouseFunc)(int button, int state, int x, int y),
  210.                   void (*keyFunc)(unsigned char key, int x, int y),
  211.                   void (*mainFunc)(void) )
  212. {
  213.     gMouseFunc = mouseFunc;
  214.     gKeyFunc   = keyFunc;
  215.     gMainFunc  = mainFunc;
  216. /*
  217.     glutDisplayFunc( argInitLoop );
  218.     glutMainLoop();
  219. */
  220.     sdlutDisplayFunc( argInitLoop );
  221.     sdlutMainLoop();
  222. }
  223. static void argInitLoop(void)
  224. {
  225.     arUtilSleep( 500 );
  226.     argDrawMode2D();
  227.     if( gl_hmd_flag ) {
  228.         glClearColor( 0.0, 0.0, 0.0, 0.0 );
  229.         glClear(GL_COLOR_BUFFER_BIT);
  230.         argInitStencil();
  231.         argSwapBuffers();
  232.     }
  233.     glClearColor( 0.0, 0.0, 0.0, 0.0 );
  234.     glClear(GL_COLOR_BUFFER_BIT);
  235.     argSwapBuffers();
  236.     glClear(GL_COLOR_BUFFER_BIT);
  237.     argSwapBuffers();
  238. /*
  239.     glutKeyboardFunc( gKeyFunc );
  240.     glutMouseFunc( gMouseFunc );
  241.     glutDisplayFunc( gMainFunc );
  242.     glutIdleFunc( gMainFunc );
  243. */
  244.     sdlutGlutKeyboardFunc( gKeyFunc );
  245.     sdlutGlutMouseFunc( gMouseFunc );
  246.     sdlutDisplayFunc( gMainFunc );
  247.     sdlutIdleFunc( gMainFunc );
  248. }
  249. void argDrawMode2D( void )
  250. {
  251.     glMatrixMode(GL_MODELVIEW);
  252.     glLoadIdentity();
  253.     glMatrixMode(GL_PROJECTION);
  254.     glLoadIdentity();
  255.     glOrtho(-0.5, gWinXsize-0.5, -0.5, gWinYsize-0.5, -1.0, 1.0);
  256.     glViewport(0, 0, gWinXsize, gWinYsize);
  257.     argSetStencil( 0 );
  258. }
  259. void argDraw2dLeft( void )
  260. {
  261.     if( gl_hmd_flag == 0 ) return;
  262.     argSetStencil( LEFTEYE );
  263. }
  264. void argDraw2dRight( void )
  265. {
  266.     if( gl_hmd_flag == 0 ) return;
  267.     argSetStencil( RIGHTEYE );
  268. }
  269. void argDrawMode3D( void )
  270. {
  271.     glMatrixMode(GL_MODELVIEW);
  272.     glLoadIdentity();
  273.     glScalef( 1, -1, -1 );
  274. }
  275. void argDraw3dLeft( void )
  276. {
  277.     if( gl_hmd_flag == 0 || gl_hmd_para_flag == 0 ) return;
  278.     glViewport(0, gWinYsize-AR_HMD_YSIZE, AR_HMD_XSIZE, AR_HMD_YSIZE);
  279.     argSetStencil( LEFTEYE );
  280.     glMatrixMode(GL_PROJECTION);
  281.     glLoadMatrixd( gl_lpara );
  282. }
  283. void argDraw3dRight( void )
  284. {
  285.     if( gl_hmd_flag == 0 || gl_hmd_para_flag == 0 ) return;
  286.     glViewport(0, gWinYsize-AR_HMD_YSIZE, AR_HMD_XSIZE, AR_HMD_YSIZE);
  287.     argSetStencil( RIGHTEYE );
  288.     glMatrixMode(GL_PROJECTION);
  289.     glLoadMatrixd( gl_rpara );
  290. }
  291. void argDraw3dCamera( int xwin, int ywin )
  292. {
  293.     if( xwin == 0 && ywin == 0 ) {
  294.         glViewport(0, gWinYsize-(int)(gZoom*gImYsize),
  295.                    (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  296.     }
  297.     else {
  298.         glViewport((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  299. gMiniXsize, gMiniYsize);
  300.     }
  301.     argSetStencil( 0 );
  302.     
  303.     glMatrixMode(GL_PROJECTION);
  304.     glLoadMatrixd( gl_cpara );
  305.     glScalef( 1, -1, -1 );
  306. }
  307. void argMult3dCamera( int xwin, int ywin )
  308. {
  309.     if( xwin == 0 && ywin == 0 ) {
  310.         glViewport(0, gWinYsize-(int)(gZoom*gImYsize),
  311.                    (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  312.     }
  313.     else {
  314.         glViewport((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  315. gMiniXsize, gMiniYsize);
  316.     }
  317.     argSetStencil( 0 );
  318.     
  319.     glMatrixMode(GL_PROJECTION);
  320.     glMultMatrixd( gl_cpara );
  321.     glScalef( 1, -1, -1 );
  322. }
  323. void argConvGlparad( double para[3][4], double gl_para[16] )
  324. {
  325.     int     i, j;
  326.     for( j = 0; j < 3; j++ ) {
  327.         for( i = 0; i < 4; i++ ) {
  328.             gl_para[i*4+j] = para[j][i];
  329.         }
  330.     }
  331.     gl_para[0*4+3] = gl_para[1*4+3] = gl_para[2*4+3] = 0.0;
  332.     gl_para[3*4+3] = 1.0;
  333. }
  334. void argConvGlparaf( double para[3][4], float gl_para[16] )
  335. {
  336.     int     i, j;
  337.     for( j = 0; j < 3; j++ ) {
  338.         for( i = 0; i < 4; i++ ) {
  339.             gl_para[i*4+j] = para[j][i];
  340.         }
  341.     }
  342.     gl_para[0*4+3] = gl_para[1*4+3] = gl_para[2*4+3] = 0.0;
  343.     gl_para[3*4+3] = 1.0;
  344. }
  345. void argDispImage( ARUint8 *image, int xwin, int ywin )
  346. {
  347.     if( argDrawMode == AR_DRAW_BY_GL_DRAW_PIXELS ) {
  348.         argDispImageDrawPixels( image, xwin, ywin );
  349.     }
  350.     else {
  351.         if( xwin == 0 && ywin == 0 ) {
  352.             glScissor(0, gWinYsize-(int)(gZoom*gImYsize),
  353.                       (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  354.         }
  355.         else {
  356.             glScissor((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  357.                        gMiniXsize, gMiniYsize);
  358.         }
  359.         glEnable( GL_SCISSOR_TEST );
  360.         /* glDisable( GL_DEPTH_TEST ); */
  361.         if( gImXsize > tex1Xsize1 )
  362.             argDispImageTex3( image, xwin, ywin, 0 );
  363.         else
  364.             argDispImageTex4( image, xwin, ywin, 0 );
  365.         glDisable( GL_SCISSOR_TEST );
  366.     }
  367. }
  368. static void argDispImageDrawPixels( ARUint8 *image, int xwin, int ywin )
  369. {
  370.     int      sx, sy;
  371.     GLfloat  zoom;
  372.     if( xwin == 0 && ywin == 0 ) {
  373. zoom = gZoom;
  374.         sx = 0;
  375.         sy = gWinYsize - 1;
  376.     }
  377.     else if( xwin == 1 && ywin == 0 ) {
  378. zoom = gZoom;
  379.         sx = gXsize;
  380.         sy = gWinYsize - 1;
  381.     }
  382.     else {
  383.         zoom = gZoom / (double)GMINI;
  384.         sx = (xwin-1)*gMiniXsize;
  385.         sy = gWinYsize - gYsize - (ywin-1)*gMiniYsize - 1;
  386.     }
  387.     glPixelZoom( zoom, -zoom);
  388.     /* glRasterPos3i( sx, sy, 0 ); */
  389.     glRasterPos3i( sx, sy, -1 );
  390. #ifdef  AR_PIX_FORMAT_ABGR
  391.     glDrawPixels( gImXsize, gImYsize, GL_ABGR, GL_UNSIGNED_BYTE, image );
  392. #endif
  393. #ifdef  AR_PIX_FORMAT_BGRA
  394.     glDrawPixels( gImXsize, gImYsize, GL_BGRA, GL_UNSIGNED_BYTE, image );
  395. #endif
  396. #ifdef  AR_PIX_FORMAT_BGR
  397.     glDrawPixels( gImXsize, gImYsize, GL_BGR, GL_UNSIGNED_BYTE, image );
  398. #endif
  399. #ifdef  AR_PIX_FORMAT_RGBA
  400.     glDrawPixels( gImXsize, gImYsize, GL_RGBA, GL_UNSIGNED_BYTE, image );
  401. #endif
  402. #ifdef  AR_PIX_FORMAT_RGB
  403.     glDrawPixels( gImXsize, gImYsize, GL_RGB, GL_UNSIGNED_BYTE, image );
  404. #endif
  405. }
  406. #ifndef _WIN32
  407. static void argDispImageTex4( ARUint8 *image, int xwin, int ywin, int mode )
  408. #else
  409. static void argDispImageTex4( ARUint8 *wimage, int xwin, int ywin, int mode )
  410. #endif
  411. {
  412.     static int      initf = 1;
  413.     static int      flag[3][MINIWIN_MAX+2][2];
  414.     static int      listIndex[3][MINIWIN_MAX+2][2];
  415. #ifdef _WIN32
  416.     static ARUint8  *image = NULL;
  417. #endif
  418.     double   *dist_factor = NULL;
  419.     double   tsx, tsy, tex, tey;
  420.     double   px, py, qx, qy, z;
  421.     double   x1, x2, x3, x4;
  422.     double   y1, y2, y3, y4;
  423.     double   xx1, xx2, xx3, xx4;
  424.     double   yy1, yy2, yy3, yy4;
  425.     int      size_adjust_factor;
  426.     int      list, win;
  427.     int      i, j;
  428.     switch( mode ) {
  429.       case 0: dist_factor = &(gCparam.dist_factor[0]);   break;
  430.     }
  431. #ifdef _WIN32
  432.     if( image == NULL ) {
  433.         arMalloc(image,ARUint8,gImXsize*tex1Ysize*AR_PIX_SIZE);
  434.     }
  435.     memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE);
  436. #endif
  437.     if( initf ) {
  438.         for(j=0;j<3;j++) {
  439.             for(i=0;i<MINIWIN_MAX+2;i++) flag[j][i][0] = flag[j][i][1] = 1;
  440.         }
  441.         initf = 0;
  442.     }
  443.     if( argTexmapMode == AR_DRAW_TEXTURE_HALF_IMAGE ) {
  444.         size_adjust_factor = 2;
  445.         list = 1;
  446.     }
  447.     else {
  448.         size_adjust_factor = 1;
  449.         list = 0;
  450.     }
  451.     if( xwin == 0 && ywin == 0 )      win = 0;
  452.     else if( xwin == 1 && ywin == 0 ) win = 1;
  453.     else win = gMiniXnum * (ywin-1) + xwin + 1;
  454.     glEnable( GL_TEXTURE_2D );
  455.     glMatrixMode(GL_TEXTURE);
  456.     glLoadIdentity();
  457.     glMatrixMode(GL_MODELVIEW);
  458.     glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize*size_adjust_factor );
  459. #ifndef _WIN32
  460.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, gImYsize/size_adjust_factor );
  461. #endif
  462.     glBindTexture( GL_TEXTURE_2D, glid[0] );
  463. #ifdef  AR_PIX_FORMAT_ABGR
  464.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  465. #endif
  466. #ifdef  AR_PIX_FORMAT_BGRA
  467.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  468. #endif
  469. #ifdef  AR_PIX_FORMAT_BGR
  470.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  471. #endif
  472. #ifdef  AR_PIX_FORMAT_RGBA
  473.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  474. #endif
  475. #ifdef  AR_PIX_FORMAT_RGB
  476.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  477. #endif
  478.     if( flag[mode][win][list] ) {
  479.         listIndex[mode][win][list] = glGenLists(1);
  480.         glNewList(listIndex[mode][win][list], GL_COMPILE_AND_EXECUTE);
  481.         z = -1.0;
  482.         qy = gImYsize   * 0 / 20.0;
  483.         tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  484.         for( j = 1; j <= 20; j++ ) {
  485.             py = qy;
  486.             tsy = tey;
  487.             qy = gImYsize   * j / 20.0;
  488.             tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  489.             qx = gImXsize * 0 / 20.0;
  490.             tex = ((double)gImXsize / (double)(tex1Xsize1)) * (double)0 / 20.0;
  491.             for( i = 1; i <= 20; i++ ) {
  492.                 px = qx;
  493.                 tsx = tex;
  494.                 qx = gImXsize * i / 20.0;
  495.                 tex = ((double)gImXsize / (double)(tex1Xsize1)) * (double)i / 20.0;
  496.                 arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  497.                 arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  498.                 arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  499.                 arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  500.                 if( xwin == 0 && ywin == 0 ) {
  501.                     xx1 = x1 * gZoom - 1.0;
  502.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  503.                     xx2 = x2 * gZoom - 1.0;
  504.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  505.                     xx3 = x3 * gZoom - 1.0;
  506.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  507.                     xx4 = x4 * gZoom - 1.0;
  508.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  509.                 }
  510.                 else if( xwin == 1 && ywin == 0 ) {
  511.                     xx1 = gXsize + x1 * gZoom - 1.0;
  512.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  513.                     xx2 = gXsize + x2 * gZoom - 1.0;
  514.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  515.                     xx3 = gXsize + x3 * gZoom - 1.0;
  516.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  517.                     xx4 = gXsize + x4 * gZoom - 1.0;
  518.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  519.                 }
  520.                 else {
  521.                     xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI - 1.0;
  522.                     xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI - 1.0;
  523.                     xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI - 1.0;
  524.                     xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI - 1.0;
  525.                     yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI - 1.0;
  526.                     yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI - 1.0;
  527.                     yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI - 1.0;
  528.                     yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI - 1.0;
  529.                 }
  530.                 glBegin( GL_QUADS );
  531.                 glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  532.                 glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  533.                 glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  534.                 glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  535.                 glEnd();
  536.             }
  537.         }
  538.         glEndList();
  539.         flag[mode][win][list] = 0;
  540.     }
  541.     else {
  542.         glCallList( listIndex[mode][win][list] );
  543.     }
  544.     glBindTexture( GL_TEXTURE_2D, 0 );
  545.     glDisable( GL_TEXTURE_2D );
  546.     glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  547. #ifndef _WIN32
  548.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, 0 );
  549. #endif
  550. }
  551. #ifndef _WIN32
  552. static void argDispImageTex3( ARUint8 *image, int xwin, int ywin, int mode )
  553. #else
  554. static void argDispImageTex3( ARUint8 *wimage, int xwin, int ywin, int mode )
  555. #endif
  556. {
  557.     static int      initf = 1;
  558.     static int      flag[3][MINIWIN_MAX+2][2];
  559.     static int      listIndex[3][MINIWIN_MAX+2][2];
  560. #ifdef _WIN32
  561.     static ARUint8  *image = NULL;
  562. #endif
  563.     double   *dist_factor = NULL;
  564.     double   tsx, tsy, tex, tey;
  565.     double   px, py, qx, qy, z;
  566.     double   x1, x2, x3, x4;
  567.     double   y1, y2, y3, y4;
  568.     double   xx1, xx2, xx3, xx4;
  569.     double   yy1, yy2, yy3, yy4;
  570.     int      size_adjust_factor;
  571.     int      win, list;
  572.     int      i, j;
  573.     switch( mode ) {
  574.       case 0: dist_factor = &(gCparam.dist_factor[0]);   break;
  575.     }
  576. #ifdef _WIN32
  577.     if( image == NULL ) {
  578.         arMalloc(image,ARUint8,gImXsize*tex1Ysize*AR_PIX_SIZE);
  579.     }
  580.     memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE);
  581. #endif
  582.     if( initf ) {
  583.         for(j=0;j<3;j++) {
  584.             for(i=0;i<=MINIWIN_MAX;i++) flag[j][i][0] = flag[j][i][1] = 1;
  585.         }
  586.         initf = 0;
  587.     }
  588.     if( argTexmapMode == AR_DRAW_TEXTURE_HALF_IMAGE ) {
  589.         size_adjust_factor = 2;
  590.         list = 1;
  591.     }
  592.     else {
  593.         size_adjust_factor = 1;
  594.         list = 0;
  595.     }
  596.     if( xwin == 0 && ywin == 0 )      win = 0;
  597.     else if( xwin == 1 && ywin == 0 ) win = 1;
  598.     else win = gMiniXnum * (ywin-1) + xwin + 1;
  599.     glEnable( GL_TEXTURE_2D );
  600.     glMatrixMode(GL_TEXTURE);
  601.     glLoadIdentity();
  602.     glMatrixMode(GL_MODELVIEW);
  603.     glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize*size_adjust_factor );
  604. #ifndef _WIN32
  605.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, gImYsize/size_adjust_factor );
  606. #endif
  607.     glBindTexture( GL_TEXTURE_2D, glid[0] );
  608. #ifdef  AR_PIX_FORMAT_ABGR
  609.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  610. #endif
  611. #ifdef  AR_PIX_FORMAT_BGRA
  612.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  613. #endif
  614. #ifdef  AR_PIX_FORMAT_BGR
  615.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  616. #endif
  617. #ifdef  AR_PIX_FORMAT_RGBA
  618.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  619. #endif
  620. #ifdef  AR_PIX_FORMAT_RGB
  621.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  622. #endif
  623.     if( flag[mode][win][list] ) {
  624.         listIndex[mode][win][list] = glGenLists(2);
  625.         glNewList(listIndex[mode][win][list], GL_COMPILE_AND_EXECUTE);
  626.         z = -1.0;
  627.         qy = gImYsize   * 0 / 20.0;
  628.         tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  629.         for( j = 1; j <= 20; j++ ) {
  630.             py = qy;
  631.             tsy = tey;
  632.             qy = gImYsize   * j / 20.0;
  633.             tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  634.             qx = tex1Xsize1 * 0 / 16.0;
  635.             tex = (double)0 / 16.0;
  636.             for( i = 1; i <= 16; i++ ) {
  637.                 px = qx;
  638.                 tsx = tex;
  639.                 qx = tex1Xsize1 * i / 16.0;
  640.                 tex = (double)i / 16.0;
  641.                 arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  642.                 arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  643.                 arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  644.                 arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  645.                 if( x2 < x1 ) continue;
  646.                 if( x4 > x3 ) continue;
  647.                 if( y4 < y1 ) continue;
  648.                 if( y3 < y2 ) continue;
  649.                 if( x2 < 0 || x3 < 0 ) continue;
  650.                 if( x1 > gImXsize || x4 > gImXsize ) continue;
  651.                 if( y4 < 0 || y3 < 0 ) continue;
  652.                 if( y1 > gImYsize || y2 > gImXsize ) continue;
  653.                 if( xwin == 0 && ywin == 0 ) {
  654.                     xx1 = x1 * gZoom - 1.0;
  655.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  656.                     xx2 = x2 * gZoom - 1.0;
  657.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  658.                     xx3 = x3 * gZoom - 1.0;
  659.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  660.                     xx4 = x4 * gZoom - 1.0;
  661.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  662.                 }
  663.                 else if( xwin == 1 && ywin == 0 ) {
  664.                     xx1 = gXsize + x1 * gZoom - 1.0;
  665.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  666.                     xx2 = gXsize + x2 * gZoom - 1.0;
  667.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  668.                     xx3 = gXsize + x3 * gZoom - 1.0;
  669.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  670.                     xx4 = gXsize + x4 * gZoom - 1.0;
  671.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  672.                 }
  673.                 else {
  674.                     xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI - 1.0;
  675.                     xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI - 1.0;
  676.                     xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI - 1.0;
  677.                     xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI - 1.0;
  678.                     yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI - 1.0;
  679.                     yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI - 1.0;
  680.                     yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI - 1.0;
  681.                     yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI - 1.0;
  682.                 }
  683.                 glBegin( GL_QUADS );
  684.                 glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  685.                 glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  686.                 glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  687.                 glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  688.                 glEnd();
  689.             }
  690.         }
  691.         glEndList();
  692.     }
  693.     else {
  694.         glCallList( listIndex[mode][win][list] );
  695.     }
  696.     glBindTexture( GL_TEXTURE_2D, glid[1] );
  697. #ifdef  AR_PIX_FORMAT_ABGR
  698.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE );
  699. #endif
  700. #ifdef  AR_PIX_FORMAT_BGRA
  701.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE );
  702. #endif
  703. #ifdef  AR_PIX_FORMAT_BGR
  704.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE );
  705. #endif
  706. #ifdef  AR_PIX_FORMAT_RGBA
  707.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE );
  708. #endif
  709. #ifdef  AR_PIX_FORMAT_RGB
  710.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE );
  711. #endif
  712.     if( flag[mode][win][list] ) {
  713.         glNewList(listIndex[mode][win][list]+1, GL_COMPILE_AND_EXECUTE);
  714.         z = -1.0;
  715.         qy = gImYsize   * 0 / 20.0;
  716.         tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  717.         for( j = 1; j <= 20; j++ ) {
  718.             py = qy;
  719.             tsy = tey;
  720.             qy = gImYsize   * j / 20.0;
  721.             tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  722.             qx = tex1Xsize1 + (gImXsize-tex1Xsize1) * 0 / 4.0;
  723.             tex = ((double)(gImXsize-tex1Xsize1) / (double)tex1Xsize2) * 0 / 4.0;
  724.             for( i = 1; i <= 4; i++ ) {
  725.                 px = qx;
  726.                 tsx = tex;
  727.                 qx = tex1Xsize1 + (gImXsize-tex1Xsize1) * i / 4.0;
  728.                 tex = ((double)(gImXsize-tex1Xsize1) / (double)tex1Xsize2) * i / 4.0;
  729.                 arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  730.                 arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  731.                 arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  732.                 arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  733.                 if( x2 < x1 ) continue;
  734.                 if( x4 > x3 ) continue;
  735.                 if( y4 < y1 ) continue;
  736.                 if( y3 < y2 ) continue;
  737.                 if( x2 < 0 || x3 < 0 ) continue;
  738.                 if( x1 > gImXsize || x4 > gImXsize ) continue;
  739.                 if( y4 < 0 || y3 < 0 ) continue;
  740.                 if( y1 > gImYsize || y2 > gImXsize ) continue;
  741.                 if( xwin == 0 && ywin == 0 ) {
  742.                     xx1 = x1 * gZoom - 1.0;
  743.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  744.                     xx2 = x2 * gZoom - 1.0;
  745.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  746.                     xx3 = x3 * gZoom - 1.0;
  747.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  748.                     xx4 = x4 * gZoom - 1.0;
  749.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  750.                 }
  751.                 else if( xwin == 1 && ywin == 0 ) {
  752.                     xx1 = gXsize + x1 * gZoom - 1.0;
  753.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  754.                     xx2 = gXsize + x2 * gZoom - 1.0;
  755.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  756.                     xx3 = gXsize + x3 * gZoom - 1.0;
  757.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  758.                     xx4 = gXsize + x4 * gZoom - 1.0;
  759.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  760.                 }
  761.                 else {
  762.                     xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI - 1.0;
  763.                     xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI - 1.0;
  764.                     xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI - 1.0;
  765.                     xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI - 1.0;
  766.                     yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI - 1.0;
  767.                     yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI - 1.0;
  768.                     yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI - 1.0;
  769.                     yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI - 1.0;
  770.                 }
  771.                 glBegin( GL_QUADS );
  772.                 glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  773.                 glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  774.                 glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  775.                 glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  776.                 glEnd();
  777.             }
  778.         }
  779.         glEndList();
  780.         flag[mode][win][list] = 0;
  781.     }
  782.     else {
  783.         glCallList( listIndex[mode][win][list]+1 );
  784.     }
  785.     glBindTexture( GL_TEXTURE_2D, 0 );
  786.     glDisable( GL_TEXTURE_2D );
  787.     glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  788. #ifndef _WIN32
  789.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, 0 );
  790. #endif
  791. }
  792. void argDispHalfImage( ARUint8 *image, int xwin, int ywin )
  793. {
  794.     if( argDrawMode == AR_DRAW_BY_GL_DRAW_PIXELS ) {
  795.         argDispHalfImageDrawPixels( image, xwin, ywin );
  796.     }
  797.     else {
  798.         if( xwin == 0 && ywin == 0 ) {
  799.             glScissor(0, gWinYsize-(int)(gZoom*gImYsize),
  800.                       (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  801.         }
  802.         else {
  803.             glScissor((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  804.                        gMiniXsize, gMiniYsize);
  805.         }
  806.         glEnable( GL_SCISSOR_TEST );
  807.         /* glDisable( GL_DEPTH_TEST ); */
  808.         argDispHalfImageTex( image, xwin, ywin, 0 );
  809.         glDisable( GL_SCISSOR_TEST );
  810.     }
  811. }
  812. static void argDispHalfImageDrawPixels( ARUint8 *image, int xwin, int ywin )
  813. {
  814.     int      sx, sy;
  815.     GLfloat  zoom;
  816.     if( xwin == 0 && ywin == 0 ) {
  817. zoom = gZoom * 2.0;
  818.         sx = 0;
  819.         sy = gWinYsize - 1;
  820.     }
  821.     if( xwin == 1 && ywin == 0 ) {
  822. zoom = gZoom * 2.0;
  823.         sx = gXsize;
  824.         sy = gWinYsize - 1;
  825.     }
  826.     else {
  827.         zoom = gZoom / (double)GMINI * 2.0;
  828.         sx = (xwin-1)*gMiniXsize;
  829.         sy = gWinYsize - gYsize - (ywin-1)*gMiniYsize - 1;
  830.     }
  831.     glPixelZoom( zoom, -zoom);
  832.     /* glRasterPos3i( sx, sy, 0 ); */
  833.     glRasterPos3i( sx, sy, -1 );
  834. #ifdef  AR_PIX_FORMAT_ABGR
  835.     glDrawPixels( gImXsize/2, gImYsize/2, GL_ABGR, GL_UNSIGNED_BYTE, image );
  836. #endif
  837. #ifdef  AR_PIX_FORMAT_BGRA
  838.     glDrawPixels( gImXsize/2, gImYsize/2, GL_BGRA, GL_UNSIGNED_BYTE, image );
  839. #endif
  840. #ifdef  AR_PIX_FORMAT_BGR
  841.     glDrawPixels( gImXsize/2, gImYsize/2, GL_BGR, GL_UNSIGNED_BYTE, image );
  842. #endif
  843. #ifdef  AR_PIX_FORMAT_RGBA
  844.     glDrawPixels( gImXsize/2, gImYsize/2, GL_RGBA, GL_UNSIGNED_BYTE, image );
  845. #endif
  846. #ifdef  AR_PIX_FORMAT_RGB
  847.     glDrawPixels( gImXsize/2, gImYsize/2, GL_RGB, GL_UNSIGNED_BYTE, image );
  848. #endif
  849. }
  850. #ifndef _WIN32
  851. static void argDispHalfImageTex( ARUint8 *image, int xwin, int ywin, int mode )
  852. #else
  853. static void argDispHalfImageTex( ARUint8 *wimage, int xwin, int ywin, int mode )
  854. #endif
  855. {
  856.     static int      initf = 1;
  857.     static int      flag[3][MINIWIN_MAX+2];
  858.     static int      listIndex[3][MINIWIN_MAX+2];
  859. #ifdef _WIN32
  860.     static ARUint8  *image = NULL;
  861. #endif
  862.     double   *dist_factor = NULL;
  863.     double   tsx, tsy, tex, tey;
  864.     double   px, py, qx, qy, z;
  865.     double   x1, x2, x3, x4;
  866.     double   y1, y2, y3, y4;
  867.     double   xx1, xx2, xx3, xx4;
  868.     double   yy1, yy2, yy3, yy4;
  869.     int      win;
  870.     int      i, j;
  871.     switch( mode ) {
  872.       case 0: dist_factor = &(gCparam.dist_factor[0]);   break;
  873.     }
  874. #ifdef _WIN32
  875.     if( image == NULL ) {
  876. arMalloc(image,ARUint8,tex2Xsize*tex2Ysize*AR_PIX_SIZE);
  877.     }
  878. memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE/4);
  879. #endif
  880.     if( initf ) {
  881.         for(j=0;j<3;j++) {
  882.             for(i=0;i<=MINIWIN_MAX;i++) flag[j][i] = 1;
  883.         }
  884.         initf = 0;
  885.     }
  886.     if( xwin == 0 && ywin == 0 )      win = 0;
  887.     else if( xwin == 1 && ywin == 0 ) win = 1;
  888.     else win = gMiniXnum * (ywin-1) + xwin + 1;
  889.     glEnable( GL_TEXTURE_2D );
  890.     glMatrixMode(GL_TEXTURE);
  891.     glLoadIdentity();
  892.     glMatrixMode(GL_MODELVIEW);
  893.     glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize/2 );
  894. #ifndef _WIN32
  895.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, gImYsize/2 );
  896. #endif
  897.     glBindTexture( GL_TEXTURE_2D, glid[2] );
  898. #ifdef  AR_PIX_FORMAT_ABGR
  899.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2Xsize, tex2Ysize, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  900. #endif
  901. #ifdef  AR_PIX_FORMAT_BGRA
  902.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2Xsize, tex2Ysize, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  903. #endif
  904. #ifdef  AR_PIX_FORMAT_BGR
  905.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2Xsize, tex2Ysize, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  906. #endif
  907. #ifdef  AR_PIX_FORMAT_RGBA
  908.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2Xsize, tex2Ysize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  909. #endif
  910. #ifdef  AR_PIX_FORMAT_RGB
  911.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2Xsize, tex2Ysize, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  912. #endif
  913.     if( flag[mode][win] ) {
  914.         listIndex[mode][win] = glGenLists(1);
  915.         glNewList(listIndex[mode][win], GL_COMPILE_AND_EXECUTE);
  916.         z = -1.0;
  917.         qy = gImYsize * 0 / 20.0;
  918.         tey = ((double)gImYsize / (double)(tex2Ysize*2.0)) * (double)0 / 20.0;
  919.         for( j = 1; j <= 20; j++ ) {
  920.             py = qy;
  921.             tsy = tey;
  922.             qy = gImYsize * j / 20.0;
  923.             tey = ((double)gImYsize / (double)(tex2Ysize*2.0)) * (double)j / 20.0;
  924.             qx = gImXsize * 0 / 20.0;
  925.             tex = ((double)gImXsize / (double)(tex2Xsize*2.0)) * (double)0 / 20.0;
  926.             for( i = 1; i <= 20; i++ ) {
  927.                 px = qx;
  928.                 tsx = tex;
  929.                 qx = gImXsize * i / 20.0;
  930.                 tex = ((double)gImXsize / (double)(tex2Xsize*2.0)) * (double)i / 20.0;
  931.                 arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  932.                 arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  933.                 arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  934.                 arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  935.                 if( xwin == 0 && ywin == 0 ) {
  936.                     xx1 = x1 * gZoom - 1.0;
  937.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  938.                     xx2 = x2 * gZoom - 1.0;
  939.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  940.                     xx3 = x3 * gZoom - 1.0;
  941.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  942.                     xx4 = x4 * gZoom - 1.0;
  943.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  944.                 }
  945.                 else if( xwin == 1 && ywin == 0 ) {
  946.                     xx1 = gXsize + x1 * gZoom - 1.0;
  947.                     yy1 = (gWinYsize - 1) - y1 * gZoom;
  948.                     xx2 = gXsize + x2 * gZoom - 1.0;
  949.                     yy2 = (gWinYsize - 1) - y2 * gZoom;
  950.                     xx3 = gXsize + x3 * gZoom - 1.0;
  951.                     yy3 = (gWinYsize - 1) - y3 * gZoom;
  952.                     xx4 = gXsize + x4 * gZoom - 1.0;
  953.                     yy4 = (gWinYsize - 1) - y4 * gZoom;
  954.                 }
  955.                 else {
  956.                     xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI - 1.0;
  957.                     xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI - 1.0;
  958.                     xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI - 1.0;
  959.                     xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI - 1.0;
  960.                     yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI - 1.0;
  961.                     yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI - 1.0;
  962.                     yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI - 1.0;
  963.                     yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI - 1.0;
  964.                 }
  965.                 glBegin( GL_QUADS );
  966.                 glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  967.                 glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  968.                 glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  969.                 glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  970.                 glEnd();
  971.             }
  972.         }
  973.         glEndList();
  974.         flag[mode][win] = 0;
  975.     }
  976.     else {
  977.         glCallList( listIndex[mode][win] );
  978.     }
  979.     glBindTexture( GL_TEXTURE_2D, 0 );
  980.     glDisable( GL_TEXTURE_2D );
  981.     glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  982. #ifndef _WIN32
  983.     glPixelStorei( GL_UNPACK_IMAGE_HEIGHT, 0 );
  984. #endif
  985. }
  986. void argDrawSquare( double  vertex[4][2], int xwin, int ywin )
  987. {
  988.     argLineSeg( vertex[0][0], vertex[0][1],
  989.                 vertex[1][0], vertex[1][1], xwin, ywin );
  990.     argLineSeg( vertex[1][0], vertex[1][1],
  991.                 vertex[2][0], vertex[2][1], xwin, ywin );
  992.     argLineSeg( vertex[2][0], vertex[2][1],
  993.                 vertex[3][0], vertex[3][1], xwin, ywin );
  994.     argLineSeg( vertex[3][0], vertex[3][1],
  995.                 vertex[0][0], vertex[0][1], xwin, ywin );
  996. }
  997. void argLineSeg( double x1, double y1, double x2, double y2, int xwin, int ywin )
  998. {
  999.     float   ox, oy;
  1000.     double  xx1, yy1, xx2, yy2;
  1001.     if( argDrawMode == AR_DRAW_BY_TEXTURE_MAPPING ) {
  1002.         xx1 = x1;  yy1 = y1;
  1003.         xx2 = x2;  yy2 = y2;
  1004.     }
  1005.     else {
  1006.         arParamIdeal2Observ( gCparam.dist_factor, x1, y1, &xx1, &yy1 );
  1007.         arParamIdeal2Observ( gCparam.dist_factor, x2, y2, &xx2, &yy2 );
  1008.     }
  1009.     xx1 *= gZoom; yy1 *= gZoom;
  1010.     xx2 *= gZoom; yy2 *= gZoom;
  1011.     if( xwin == 0 && ywin == 0 ) {
  1012.         ox = 0;
  1013.         oy = gWinYsize-1;
  1014.         glBegin(GL_LINES);
  1015.           glVertex2f( ox+xx1, oy-yy1 );
  1016.           glVertex2f( ox+xx2, oy-yy2 );
  1017.         glEnd();
  1018.     }
  1019.     else {
  1020.         ox = (xwin-1)*gMiniXsize;
  1021.         oy = gWinYsize - gYsize -(ywin-1)*gMiniYsize - 1;
  1022.         glBegin(GL_LINES);
  1023.           glVertex2f( ox+xx1/GMINI, oy-yy1/GMINI );
  1024.           glVertex2f( ox+xx2/GMINI, oy-yy2/GMINI );
  1025.         glEnd();
  1026.     }
  1027.     glFlush();
  1028. }
  1029. void argLineSegHMD( double x1, double y1, double x2, double y2 )
  1030. {
  1031.     float   ox, oy;
  1032.     ox = 0;
  1033.     oy = gWinYsize - gYsize;
  1034.     glBegin(GL_LINES);
  1035.       glVertex2f( ox+x1, oy+y1 );
  1036.       glVertex2f( ox+x2, oy+y2 );
  1037.     glEnd();
  1038. }
  1039. static void argInitStencil(void)
  1040. {
  1041.     int     offset;
  1042.     int     i;
  1043.     glEnable(GL_STENCIL_TEST);
  1044.     glClearStencil(0);
  1045.     glClear(GL_STENCIL_BUFFER_BIT);
  1046.     glLineWidth(1.0);
  1047.     offset = gWinYsize - gYsize;
  1048. #if REVERSE_LR
  1049.     glStencilFunc(GL_ALWAYS, LEFTEYE, LEFTEYE);
  1050.     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1051.     glBegin(GL_LINES);
  1052.     for( i = 0; i < gYsize; i+=2 ) {
  1053.         glVertex2f( 0.0,       (float)(i+offset) );
  1054.         glVertex2f( gWinXsize, (float)(i+offset) );
  1055.     }
  1056.     glEnd();
  1057.     glStencilFunc(GL_ALWAYS, RIGHTEYE, RIGHTEYE);
  1058.     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1059.     glBegin(GL_LINES);
  1060.     for( i = 1; i < gYsize; i+=2 ) {
  1061.         glVertex2f( 0.0,       (float)(i+offset) );
  1062.         glVertex2f( gWinXsize, (float)(i+offset) );
  1063.     }
  1064.     glEnd();
  1065. #else
  1066.     glStencilFunc(GL_ALWAYS, LEFTEYE, LEFTEYE);
  1067.     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1068.     glBegin(GL_LINES);
  1069.     for( i = 1; i < gYsize; i+=2 ) {
  1070.         glVertex2f( 0.0,       (float)(i+offset) );
  1071.         glVertex2f( gWinXsize, (float)(i+offset) );
  1072.     }
  1073.     glEnd();
  1074.     glStencilFunc(GL_ALWAYS, RIGHTEYE, RIGHTEYE);
  1075.     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1076.     glBegin(GL_LINES);
  1077.     for( i = 0; i < gYsize; i+=2 ) {
  1078.         glVertex2f( 0.0,       (float)(i+offset) );
  1079.         glVertex2f( gWinXsize, (float)(i+offset) );
  1080.     }
  1081.     glEnd();
  1082. #endif
  1083.     glStencilFunc (GL_ALWAYS, 0, 0);
  1084.     glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1085.     glDisable(GL_STENCIL_TEST);
  1086. }
  1087. void argLoadHMDparam( ARParam *lparam, ARParam *rparam )
  1088. {
  1089.     argConvGLcpara( lparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_lpara );
  1090.     argConvGLcpara( rparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_rpara );
  1091.     gl_hmd_para_flag = 1;
  1092. }
  1093. static void argSetStencil( int flag )
  1094. {
  1095.     if( flag == 0 ) {
  1096.         glDisable(GL_STENCIL_TEST);
  1097.         glStencilFunc (GL_ALWAYS, 0, 0);
  1098.         glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1099.     }
  1100.     else {
  1101.         glEnable(GL_STENCIL_TEST);
  1102.         glStencilFunc (GL_EQUAL, flag, flag);
  1103.         glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1104.     }
  1105. }
  1106. void argConvGLcpara( ARParam *param, double gnear, double gfar, double m[16] )
  1107. {
  1108.     argConvGLcpara2( param->mat, param->xsize, param->ysize, gnear, gfar, m );
  1109. }
  1110. static void argConvGLcpara2( double cparam[3][4], int width, int height, double gnear, double gfar, double m[16] )
  1111. {
  1112.     double   icpara[3][4];
  1113.     double   trans[3][4];
  1114.     double   p[3][3], q[4][4];
  1115.     int      i, j;
  1116.     if( arParamDecompMat(cparam, icpara, trans) < 0 ) {
  1117.         printf("gConvGLcpara: Parameter error!!n");
  1118.         exit(0);
  1119.     }
  1120.     for( i = 0; i < 3; i++ ) {
  1121.         for( j = 0; j < 3; j++ ) {
  1122.             p[i][j] = icpara[i][j] / icpara[2][2];
  1123.         }
  1124.     }
  1125.     q[0][0] = (2.0 * p[0][0] / width);
  1126.     q[0][1] = (2.0 * p[0][1] / width);
  1127.     q[0][2] = ((2.0 * p[0][2] / width)  - 1.0);
  1128.     q[0][3] = 0.0;
  1129.     q[1][0] = 0.0;
  1130.     q[1][1] = (2.0 * p[1][1] / height);
  1131.     q[1][2] = ((2.0 * p[1][2] / height) - 1.0);
  1132.     q[1][3] = 0.0;
  1133.     q[2][0] = 0.0;
  1134.     q[2][1] = 0.0;
  1135.     q[2][2] = (gfar + gnear)/(gfar - gnear);
  1136.     q[2][3] = -2.0 * gfar * gnear / (gfar - gnear);
  1137.     q[3][0] = 0.0;
  1138.     q[3][1] = 0.0;
  1139.     q[3][2] = 1.0;
  1140.     q[3][3] = 0.0;
  1141.     for( i = 0; i < 4; i++ ) {
  1142.         for( j = 0; j < 3; j++ ) {
  1143.             m[i+j*4] = q[i][0] * trans[0][j]
  1144.                      + q[i][1] * trans[1][j]
  1145.                      + q[i][2] * trans[2][j];
  1146.         }
  1147.         m[i+3*4] = q[i][0] * trans[0][3]
  1148.                  + q[i][1] * trans[1][3]
  1149.                  + q[i][2] * trans[2][3]
  1150.                  + q[i][3];
  1151.     }
  1152. }