PageRenderTime 41ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/AndAR/jni/AR/gsub.c

http://andar.googlecode.com/
C | 1714 lines | 1551 code | 155 blank | 8 comment | 381 complexity | fcd51adf1e176e76a91abd5380c2f53b MD5 | raw file
Possible License(s): GPL-3.0
  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 </usr/include/GL/glut.h>
  9. # ifdef GL_VERSION_1_2
  10. # include <GL/glext.h>
  11. # endif
  12. #else
  13. # include <GLUT/glut.h>
  14. # include <OpenGL/glext.h>
  15. #endif
  16. #include <AR/config.h>
  17. #include <AR/param.h>
  18. #include <AR/ar.h>
  19. #include <AR/gsub.h>
  20. #ifndef GL_ABGR
  21. # define GL_ABGR GL_ABGR_EXT
  22. #endif
  23. #ifndef GL_BGRA
  24. # define GL_BGRA GL_BGRA_EXT
  25. #endif
  26. #ifndef GL_BGR
  27. # define GL_BGR GL_BGR_EXT
  28. #endif
  29. #ifndef GL_RGBA
  30. # define GL_RGBA GL_RGBA_EXT
  31. #endif
  32. #ifndef GL_RGB
  33. # define GL_RGB GL_RGB_EXT
  34. #endif
  35. #ifdef AR_OPENGL_TEXTURE_RECTANGLE
  36. # if defined(GL_TEXTURE_RECTANGLE_EXT)
  37. # define AR_TEXTURE_RECTANGLE GL_TEXTURE_RECTANGLE_EXT
  38. # elif defined(GL_TEXTURE_RECTANGLE_NV)
  39. # define AR_TEXTURE_RECTANGLE GL_TEXTURE_RECTANGLE_NV
  40. # else
  41. # undef AR_OPENGL_TEXTURE_RECTANGLE
  42. # endif
  43. #endif
  44. #define MINIWIN_MAX 8
  45. #define REVERSE_LR 1
  46. #define LEFTEYE 1
  47. #define RIGHTEYE 2
  48. #define GMINI 2
  49. int argDrawMode = DEFAULT_DRAW_MODE;
  50. int argTexmapMode = DEFAULT_DRAW_TEXTURE_IMAGE;
  51. static ARParam gCparam;
  52. static ARSParam gsCparam;
  53. static double gl_cpara[16];
  54. //static double gl_cparaL[16];
  55. //static double gl_cparaR[16];
  56. static double gl_lpara[16];
  57. static double gl_rpara[16];
  58. static int gl_hmd_flag = 0;
  59. static int gl_hmd_para_flag = 0;
  60. static int gl_stereo_flag = 0;
  61. //static int gl_twin_flag = 0;
  62. static double gZoom;
  63. static int gXsize, gYsize;
  64. static int gMiniXnum, gMiniYnum;
  65. static int gMiniXsize, gMiniYsize;
  66. static int gWinXsize, gWinYsize;
  67. static int gImXsize, gImYsize;
  68. static int win;
  69. static GLuint glid[4];
  70. static void (*gMouseFunc)(int button, int state, int x, int y);
  71. static void (*gKeyFunc)(unsigned char key, int x, int y);
  72. static void (*gMainFunc)(void);
  73. static void argInit2( int fullFlag );
  74. static void argInitLoop(void);
  75. static void argInitStencil(void);
  76. static void argSetStencil( int flag );
  77. static void argConvGLcpara2( double cparam[3][4], int width, int height, double gnear, double gfar, double m[16] );
  78. static int useTextureRectangle = 0;
  79. static GLint maxRectangleTextureSize = 0;
  80. static int tex1Xsize1 = 1;
  81. static int tex1Xsize2 = 1;
  82. static int tex1Ysize = 1;
  83. static int tex2Xsize = 1;
  84. static int tex2Ysize = 1;
  85. #ifdef AR_OPENGL_TEXTURE_RECTANGLE
  86. static void argDispImageTexRectangle( ARUint8 *image, int xwin, int ywin, int mode );
  87. #endif
  88. static void argDispImageTex3( ARUint8 *image, int xwin, int ywin, int mode );
  89. static void argDispImageTex4( ARUint8 *image, int xwin, int ywin, int mode );
  90. static void argDispHalfImageTex( ARUint8 *image, int xwin, int ywin, int mode );
  91. static void argDispImageDrawPixels( ARUint8 *image, int xwin, int ywin );
  92. static void argDispHalfImageDrawPixels( ARUint8 *image, int xwin, int ywin );
  93. void argInqSetting( int *hmdMode,
  94. int *gMiniXnum2, int *gMiniYnum2,
  95. void (**mouseFunc)(int button, int state, int x, int y),
  96. void (**keyFunc)(unsigned char key, int x, int y),
  97. void (**mainFunc)(void) )
  98. {
  99. *hmdMode = gl_hmd_flag;
  100. *gMiniXnum2 = gMiniXnum;
  101. *gMiniYnum2 = gMiniYnum;
  102. *mouseFunc = gMouseFunc;
  103. *keyFunc = gKeyFunc;
  104. *mainFunc = gMainFunc;
  105. }
  106. void argInit( ARParam *cparam, double zoom, int fullFlag, int xwin, int ywin, int hmd_flag )
  107. {
  108. int i;
  109. gl_hmd_flag = hmd_flag;
  110. gZoom = zoom;
  111. gImXsize = cparam->xsize;
  112. gImYsize = cparam->ysize;
  113. if( gl_hmd_flag == 0 ) {
  114. gXsize = (double)cparam->xsize * gZoom;
  115. gYsize = (double)cparam->ysize * gZoom;
  116. }
  117. else {
  118. gXsize = AR_HMD_XSIZE;
  119. gYsize = AR_HMD_YSIZE;
  120. }
  121. gMiniXsize = (double)cparam->xsize * gZoom / GMINI;
  122. gMiniYsize = (double)cparam->ysize * gZoom / GMINI;
  123. if( xwin * ywin > MINIWIN_MAX ) {
  124. if( xwin > MINIWIN_MAX ) xwin = MINIWIN_MAX;
  125. ywin = MINIWIN_MAX / xwin;
  126. }
  127. gMiniXnum = xwin;
  128. gMiniYnum = ywin;
  129. gWinXsize = (gMiniXsize*gMiniXnum > gXsize)?
  130. gMiniXsize*gMiniXnum: gXsize;
  131. gWinYsize = gYsize + gMiniYsize*gMiniYnum;
  132. gCparam = *cparam;
  133. for( i = 0; i < 4; i++ ) {
  134. gCparam.mat[1][i] = (gCparam.ysize-1)*(gCparam.mat[2][i]) - gCparam.mat[1][i];
  135. }
  136. argConvGLcpara( &gCparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_cpara );
  137. argInit2( fullFlag );
  138. }
  139. static void argInit2( int fullFlag )
  140. {
  141. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
  142. glutInitWindowPosition(0, 0);
  143. glutInitWindowSize(gWinXsize, gWinYsize);
  144. win = glutCreateWindow("");
  145. if( fullFlag ) {
  146. glutFullScreen();
  147. gWinXsize = glutGet(GLUT_SCREEN_WIDTH);
  148. gWinYsize = glutGet(GLUT_SCREEN_HEIGHT);
  149. }
  150. #ifdef AR_OPENGL_TEXTURE_RECTANGLE
  151. #if defined(GL_TEXTURE_RECTANGLE_EXT)
  152. if( glutExtensionSupported("GL_EXT_texture_rectangle") ) {
  153. useTextureRectangle = 1;
  154. glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT, &maxRectangleTextureSize);
  155. }
  156. #elif defined(GL_TEXTURE_RECTANGLE_NV)
  157. if( glutExtensionSupported("GL_NV_texture_rectangle") ) {
  158. useTextureRectangle = 1;
  159. glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, &maxRectangleTextureSize);
  160. }
  161. #endif
  162. #endif
  163. gMouseFunc = NULL;
  164. gKeyFunc = NULL;
  165. gMainFunc = NULL;
  166. glGenTextures(4, glid);
  167. glBindTexture( GL_TEXTURE_2D, glid[0] );
  168. glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  169. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  170. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  171. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  172. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  173. glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  174. glBindTexture( GL_TEXTURE_2D, glid[1] );
  175. glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  176. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  177. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  178. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  179. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  180. glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  181. glBindTexture( GL_TEXTURE_2D, glid[2] );
  182. glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
  183. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  184. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  185. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
  186. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
  187. glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
  188. if( gImXsize > 512 ) {
  189. tex1Xsize1 = 512;
  190. tex1Xsize2 = 1;
  191. while( tex1Xsize2 < gImXsize - tex1Xsize1 ) tex1Xsize2 *= 2;
  192. }
  193. else {
  194. tex1Xsize1 = 1;
  195. while( tex1Xsize1 < gImXsize ) tex1Xsize1 *= 2;
  196. }
  197. tex1Ysize = 1;
  198. while( tex1Ysize < gImYsize ) tex1Ysize *= 2;
  199. tex2Xsize = 1;
  200. while( tex2Xsize < gImXsize/2 ) tex2Xsize *= 2;
  201. tex2Ysize = 1;
  202. while( tex2Ysize < gImYsize/2 ) tex2Ysize *= 2;
  203. }
  204. void argCleanup( void )
  205. {
  206. /*
  207. glutDestroyWindow( win );
  208. */
  209. }
  210. void argSwapBuffers( void )
  211. {
  212. glutSwapBuffers();
  213. }
  214. void argMainLoop( void (*mouseFunc)(int button, int state, int x, int y),
  215. void (*keyFunc)(unsigned char key, int x, int y),
  216. void (*mainFunc)(void) )
  217. {
  218. gMouseFunc = mouseFunc;
  219. gKeyFunc = keyFunc;
  220. gMainFunc = mainFunc;
  221. glutDisplayFunc( argInitLoop );
  222. glutMainLoop();
  223. }
  224. static void argInitLoop(void)
  225. {
  226. arUtilSleep( 500 );
  227. argDrawMode2D();
  228. if( gl_hmd_flag || gl_stereo_flag ) {
  229. glClearColor( 0.0, 0.0, 0.0, 0.0 );
  230. glClear(GL_COLOR_BUFFER_BIT);
  231. argInitStencil();
  232. argSwapBuffers();
  233. }
  234. glClearColor( 0.0, 0.0, 0.0, 0.0 );
  235. glClear(GL_COLOR_BUFFER_BIT);
  236. argSwapBuffers();
  237. glClear(GL_COLOR_BUFFER_BIT);
  238. argSwapBuffers();
  239. glutKeyboardFunc( gKeyFunc );
  240. glutMouseFunc( gMouseFunc );
  241. glutDisplayFunc( gMainFunc );
  242. glutIdleFunc( gMainFunc );
  243. }
  244. void argDrawMode2D( void )
  245. {
  246. glMatrixMode(GL_MODELVIEW);
  247. glLoadIdentity();
  248. glMatrixMode(GL_PROJECTION);
  249. glLoadIdentity();
  250. glOrtho(0, gWinXsize, 0, gWinYsize, -1.0, 1.0);
  251. glViewport(0, 0, gWinXsize, gWinYsize);
  252. argSetStencil( 0 );
  253. }
  254. void argDraw2dLeft( void )
  255. {
  256. if( gl_hmd_flag == 0 && gl_stereo_flag == 0 ) return;
  257. argSetStencil( LEFTEYE );
  258. }
  259. void argDraw2dRight( void )
  260. {
  261. if( gl_hmd_flag == 0 && gl_stereo_flag == 0 ) return;
  262. argSetStencil( RIGHTEYE );
  263. }
  264. void argDrawMode3D( void )
  265. {
  266. glMatrixMode(GL_MODELVIEW);
  267. glLoadIdentity();
  268. }
  269. void argDraw3dLeft( void )
  270. {
  271. if( gl_hmd_flag == 0 || gl_hmd_para_flag == 0 ) return;
  272. glViewport(0, gWinYsize-AR_HMD_YSIZE, AR_HMD_XSIZE, AR_HMD_YSIZE);
  273. argSetStencil( LEFTEYE );
  274. glMatrixMode(GL_PROJECTION);
  275. glLoadMatrixd( gl_lpara );
  276. }
  277. void argDraw3dRight( void )
  278. {
  279. if( gl_hmd_flag == 0 || gl_hmd_para_flag == 0 ) return;
  280. glViewport(0, gWinYsize-AR_HMD_YSIZE, AR_HMD_XSIZE, AR_HMD_YSIZE);
  281. argSetStencil( RIGHTEYE );
  282. glMatrixMode(GL_PROJECTION);
  283. glLoadMatrixd( gl_rpara );
  284. }
  285. void argDraw3dCamera( int xwin, int ywin )
  286. {
  287. if( xwin == 0 && ywin == 0 ) {
  288. glViewport(0, gWinYsize-(int)(gZoom*gImYsize),
  289. (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  290. }
  291. else {
  292. glViewport((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  293. gMiniXsize, gMiniYsize);
  294. }
  295. argSetStencil( 0 );
  296. glMatrixMode(GL_PROJECTION);
  297. glLoadMatrixd( gl_cpara );
  298. }
  299. void argConvGlpara( double para[3][4], double gl_para[16] )
  300. {
  301. int i, j;
  302. for( j = 0; j < 3; j++ ) {
  303. for( i = 0; i < 4; i++ ) {
  304. gl_para[i*4+j] = para[j][i];
  305. }
  306. }
  307. gl_para[0*4+3] = gl_para[1*4+3] = gl_para[2*4+3] = 0.0;
  308. gl_para[3*4+3] = 1.0;
  309. }
  310. void argDispImage( ARUint8 *image, int xwin, int ywin )
  311. {
  312. if( argDrawMode == AR_DRAW_BY_GL_DRAW_PIXELS ) {
  313. argDispImageDrawPixels( image, xwin, ywin );
  314. }
  315. else {
  316. if( xwin == 0 && ywin == 0 ) {
  317. glScissor(0, gWinYsize-(int)(gZoom*gImYsize),
  318. (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  319. }
  320. else {
  321. glScissor((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  322. gMiniXsize, gMiniYsize);
  323. }
  324. glEnable( GL_SCISSOR_TEST );
  325. /* glDisable( GL_DEPTH_TEST ); */
  326. if( useTextureRectangle
  327. && gImXsize < maxRectangleTextureSize
  328. && gImYsize < maxRectangleTextureSize ) {
  329. #ifdef AR_OPENGL_TEXTURE_RECTANGLE
  330. argDispImageTexRectangle( image, xwin, ywin, 0 );
  331. #endif
  332. }
  333. else {
  334. if( gImXsize > tex1Xsize1 )
  335. argDispImageTex3( image, xwin, ywin, 0 );
  336. else
  337. argDispImageTex4( image, xwin, ywin, 0 );
  338. }
  339. glDisable( GL_SCISSOR_TEST );
  340. }
  341. }
  342. static void argDispImageDrawPixels( ARUint8 *image, int xwin, int ywin )
  343. {
  344. float sx, sy;
  345. GLfloat zoom;
  346. if( xwin == 0 && ywin == 0 ) {
  347. zoom = gZoom;
  348. sx = 0;
  349. sy = gWinYsize - 0.5;
  350. }
  351. else if( xwin == 1 && ywin == 0 ) {
  352. zoom = gZoom;
  353. sx = gXsize;
  354. sy = gWinYsize - 0.5;
  355. }
  356. else {
  357. zoom = gZoom / (double)GMINI;
  358. sx = (xwin-1)*gMiniXsize;
  359. sy = gWinYsize - gYsize - (ywin-1)*gMiniYsize - 0.5;
  360. }
  361. glDisable(GL_TEXTURE_2D);
  362. glPixelZoom( zoom, -zoom);
  363. glRasterPos3f( sx, sy, -1.0 );
  364. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  365. # ifdef AR_BIG_ENDIAN
  366. glDrawPixels( gImXsize, gImYsize, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  367. # else
  368. glDrawPixels( gImXsize, gImYsize, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  369. # endif
  370. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  371. glDrawPixels( gImXsize, gImYsize, GL_ABGR, GL_UNSIGNED_BYTE, image );
  372. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  373. glDrawPixels( gImXsize, gImYsize, GL_BGRA, GL_UNSIGNED_BYTE, image );
  374. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  375. glDrawPixels( gImXsize, gImYsize, GL_BGR, GL_UNSIGNED_BYTE, image );
  376. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  377. glDrawPixels( gImXsize, gImYsize, GL_RGBA, GL_UNSIGNED_BYTE, image );
  378. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  379. glDrawPixels( gImXsize, gImYsize, GL_RGB, GL_UNSIGNED_BYTE, image );
  380. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  381. glDrawPixels( gImXsize, gImYsize, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  382. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  383. # ifdef AR_BIG_ENDIAN
  384. glDrawPixels( gImXsize, gImYsize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  385. # else
  386. glDrawPixels( gImXsize, gImYsize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  387. # endif
  388. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  389. # ifdef AR_BIG_ENDIAN
  390. glDrawPixels( gImXsize, gImYsize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  391. # else
  392. glDrawPixels( gImXsize, gImYsize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  393. # endif
  394. #else
  395. # error Unknown default pixel format defined in config.h
  396. #endif
  397. }
  398. #ifdef AR_OPENGL_TEXTURE_RECTANGLE
  399. static void argDispImageTexRectangle( ARUint8 *image, int xwin, int ywin, int mode )
  400. {
  401. static int initf = 1;
  402. static int flag[3][MINIWIN_MAX+2][2];
  403. static int listIndex[3][MINIWIN_MAX+2][2];
  404. static int old_size_adjust_factor = -1;
  405. double *dist_factor;
  406. double px, py, qy, z;
  407. double x1, x2;
  408. double y1, y2;
  409. double xx1, xx2;
  410. double yy1, yy2;
  411. int size_adjust_factor;
  412. int list, win;
  413. int i, j;
  414. switch( mode ) {
  415. case 0: dist_factor = &(gCparam.dist_factor[0]); break;
  416. case 1: dist_factor = &(gsCparam.dist_factorL[0]); break;
  417. case 2: dist_factor = &(gsCparam.dist_factorR[0]); break;
  418. default: return;
  419. }
  420. if( initf ) {
  421. for(j=0;j<3;j++) {
  422. for(i=0;i<MINIWIN_MAX+2;i++) flag[j][i][0] = flag[j][i][1] = 1;
  423. }
  424. initf = 0;
  425. }
  426. if( argTexmapMode == AR_DRAW_TEXTURE_HALF_IMAGE ) {
  427. size_adjust_factor = 2;
  428. list = 1;
  429. }
  430. else {
  431. size_adjust_factor = 1;
  432. list = 0;
  433. }
  434. if( xwin == 0 && ywin == 0 ) win = 0;
  435. else if( xwin == 1 && ywin == 0 ) win = 1;
  436. else win = gMiniXnum * (ywin-1) + xwin + 1;
  437. glEnable( AR_TEXTURE_RECTANGLE );
  438. glMatrixMode(GL_TEXTURE);
  439. glLoadIdentity();
  440. glMatrixMode(GL_MODELVIEW);
  441. glBindTexture( AR_TEXTURE_RECTANGLE, glid[3] );
  442. #ifdef APPLE_TEXTURE_FAST_TRANSFER
  443. glTexParameterf(AR_TEXTURE_RECTANGLE, GL_TEXTURE_PRIORITY, 0.0);
  444. glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
  445. #endif
  446. glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize*size_adjust_factor );
  447. if( size_adjust_factor == old_size_adjust_factor ) {
  448. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  449. # ifdef AR_BIG_ENDIAN
  450. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  451. # else
  452. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  453. # endif
  454. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  455. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_ABGR, GL_UNSIGNED_BYTE, image );
  456. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  457. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_BYTE, image );
  458. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  459. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_BGR, GL_UNSIGNED_BYTE, image );
  460. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  461. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_RGBA, GL_UNSIGNED_BYTE, image );
  462. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  463. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_RGB, GL_UNSIGNED_BYTE, image );
  464. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  465. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  466. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  467. # ifdef AR_BIG_ENDIAN
  468. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  469. # else
  470. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  471. # endif
  472. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  473. # ifdef AR_BIG_ENDIAN
  474. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  475. # else
  476. glTexSubImage2D( AR_TEXTURE_RECTANGLE, 0, 0, 0, gImXsize, gImYsize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_REV_8_8_APPLE, image );
  477. # endif
  478. #else
  479. # error Unknown default pixel format defined in config.h
  480. #endif
  481. }
  482. else {
  483. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  484. # ifdef AR_BIG_ENDIAN
  485. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGBA, gImXsize, gImYsize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  486. # else
  487. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGBA, gImXsize, gImYsize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  488. # endif
  489. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  490. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGBA, gImXsize, gImYsize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  491. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  492. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  493. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  494. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  495. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  496. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGBA, gImXsize, gImYsize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  497. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  498. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  499. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  500. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_LUMINANCE, gImXsize, gImYsize/size_adjust_factor, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  501. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  502. # ifdef AR_BIG_ENDIAN
  503. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  504. # else
  505. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  506. # endif
  507. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  508. # ifdef AR_BIG_ENDIAN
  509. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  510. # else
  511. glTexImage2D( AR_TEXTURE_RECTANGLE, 0, GL_RGB, gImXsize, gImYsize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  512. # endif
  513. #else
  514. # error Unknown default pixel format defined in config.h
  515. #endif
  516. old_size_adjust_factor = size_adjust_factor;
  517. }
  518. if( flag[mode][win][list] ) {
  519. listIndex[mode][win][list] = glGenLists(1);
  520. glNewList(listIndex[mode][win][list], GL_COMPILE_AND_EXECUTE);
  521. z = -1.0;
  522. qy = gImYsize * 0 / 20.0;
  523. for( j = 1; j <= 20; j++ ) {
  524. py = qy;
  525. qy = gImYsize * j / 20.0;
  526. glBegin( GL_QUAD_STRIP );
  527. for( i = 0; i <= 20; i++ ) {
  528. px = gImXsize * i / 20.0;
  529. arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  530. arParamObserv2Ideal( dist_factor, px, qy, &x2, &y2 );
  531. if( xwin == 0 && ywin == 0 ) {
  532. xx1 = x1 * gZoom;
  533. yy1 = gWinYsize - y1 * gZoom;
  534. xx2 = x2 * gZoom;
  535. yy2 = gWinYsize - y2 * gZoom;
  536. }
  537. else if( xwin == 1 && ywin == 0 ) {
  538. xx1 = gXsize + x1 * gZoom;
  539. yy1 = gWinYsize - y1 * gZoom;
  540. xx2 = gXsize + x2 * gZoom;
  541. yy2 = gWinYsize - y2 * gZoom;
  542. }
  543. else {
  544. xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI;
  545. xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI;
  546. yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI;
  547. yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI;
  548. }
  549. glTexCoord2d( px, py/size_adjust_factor ); glVertex3d( xx1, yy1, z );
  550. glTexCoord2d( px, qy/size_adjust_factor ); glVertex3d( xx2, yy2, z );
  551. }
  552. glEnd();
  553. }
  554. glEndList();
  555. flag[mode][win][list] = 0;
  556. }
  557. else {
  558. glCallList( listIndex[mode][win][list] );
  559. }
  560. glBindTexture( AR_TEXTURE_RECTANGLE, 0 );
  561. glDisable( AR_TEXTURE_RECTANGLE );
  562. glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  563. }
  564. #endif
  565. #ifndef _WIN32
  566. static void argDispImageTex4( ARUint8 *image, int xwin, int ywin, int mode )
  567. #else
  568. static void argDispImageTex4( ARUint8 *wimage, int xwin, int ywin, int mode )
  569. #endif
  570. {
  571. static int initf = 1;
  572. static int flag[3][MINIWIN_MAX+2][2];
  573. static int listIndex[3][MINIWIN_MAX+2][2];
  574. static int old_size_adjust_factor = -1;
  575. #ifdef _WIN32
  576. static ARUint8 *image = NULL;
  577. #endif
  578. double *dist_factor;
  579. double tsx, tsy, tex, tey;
  580. double px, py, qx, qy, z;
  581. double x1, x2, x3, x4;
  582. double y1, y2, y3, y4;
  583. double xx1, xx2, xx3, xx4;
  584. double yy1, yy2, yy3, yy4;
  585. int size_adjust_factor;
  586. int list, win;
  587. int i, j;
  588. switch( mode ) {
  589. case 0: dist_factor = &(gCparam.dist_factor[0]); break;
  590. case 1: dist_factor = &(gsCparam.dist_factorL[0]); break;
  591. case 2: dist_factor = &(gsCparam.dist_factorR[0]); break;
  592. default: return;
  593. }
  594. #ifdef _WIN32
  595. if( image == NULL ) {
  596. arMalloc(image,ARUint8,gImXsize*tex1Ysize*AR_PIX_SIZE_DEFAULT);
  597. }
  598. memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE_DEFAULT);
  599. #endif
  600. if( initf ) {
  601. for(j=0;j<3;j++) {
  602. for(i=0;i<MINIWIN_MAX+2;i++) flag[j][i][0] = flag[j][i][1] = 1;
  603. }
  604. initf = 0;
  605. }
  606. if( argTexmapMode == AR_DRAW_TEXTURE_HALF_IMAGE ) {
  607. size_adjust_factor = 2;
  608. list = 1;
  609. }
  610. else {
  611. size_adjust_factor = 1;
  612. list = 0;
  613. }
  614. if( xwin == 0 && ywin == 0 ) win = 0;
  615. else if( xwin == 1 && ywin == 0 ) win = 1;
  616. else win = gMiniXnum * (ywin-1) + xwin + 1;
  617. glEnable( GL_TEXTURE_2D );
  618. glMatrixMode(GL_TEXTURE);
  619. glLoadIdentity();
  620. glMatrixMode(GL_MODELVIEW);
  621. glBindTexture( GL_TEXTURE_2D, glid[0] );
  622. #ifdef APPLE_TEXTURE_FAST_TRANSFER
  623. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.0);
  624. glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
  625. #endif
  626. glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize*size_adjust_factor );
  627. if( size_adjust_factor == old_size_adjust_factor ) {
  628. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  629. # ifdef AR_BIG_ENDIAN
  630. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  631. # else
  632. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  633. # endif
  634. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  635. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_ABGR, GL_UNSIGNED_BYTE, image );
  636. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  637. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_BYTE, image );
  638. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  639. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGR, GL_UNSIGNED_BYTE, image );
  640. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  641. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_RGBA, GL_UNSIGNED_BYTE, image );
  642. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  643. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_RGB, GL_UNSIGNED_BYTE, image );
  644. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  645. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  646. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  647. # ifdef AR_BIG_ENDIAN
  648. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  649. # else
  650. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  651. # endif
  652. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  653. # ifdef AR_BIG_ENDIAN
  654. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  655. # else
  656. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  657. # endif
  658. #else
  659. # error Unknown default pixel format defined in config.h
  660. #endif
  661. }
  662. else {
  663. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  664. # ifdef AR_BIG_ENDIAN
  665. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  666. # else
  667. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  668. # endif
  669. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  670. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  671. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  672. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  673. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  674. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  675. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  676. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  677. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  678. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  679. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  680. glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  681. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  682. # ifdef AR_BIG_ENDIAN
  683. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  684. # else
  685. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  686. # endif
  687. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  688. # ifdef AR_BIG_ENDIAN
  689. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  690. # else
  691. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  692. # endif
  693. #else
  694. # error Unknown default pixel format defined in config.h
  695. #endif
  696. old_size_adjust_factor = size_adjust_factor;
  697. }
  698. if( flag[mode][win][list] ) {
  699. listIndex[mode][win][list] = glGenLists(1);
  700. glNewList(listIndex[mode][win][list], GL_COMPILE_AND_EXECUTE);
  701. z = -1.0;
  702. qy = gImYsize * 0 / 20.0;
  703. tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  704. for( j = 1; j <= 20; j++ ) {
  705. py = qy;
  706. tsy = tey;
  707. qy = gImYsize * j / 20.0;
  708. tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  709. qx = gImXsize * 0 / 20.0;
  710. tex = ((double)gImXsize / (double)(tex1Xsize1)) * (double)0 / 20.0;
  711. for( i = 1; i <= 20; i++ ) {
  712. px = qx;
  713. tsx = tex;
  714. qx = gImXsize * i / 20.0;
  715. tex = ((double)gImXsize / (double)(tex1Xsize1)) * (double)i / 20.0;
  716. arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  717. arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  718. arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  719. arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  720. if( xwin == 0 && ywin == 0 ) {
  721. xx1 = x1 * gZoom ;
  722. yy1 = gWinYsize - y1 * gZoom;
  723. xx2 = x2 * gZoom ;
  724. yy2 = gWinYsize - y2 * gZoom;
  725. xx3 = x3 * gZoom ;
  726. yy3 = gWinYsize - y3 * gZoom;
  727. xx4 = x4 * gZoom ;
  728. yy4 = gWinYsize - y4 * gZoom;
  729. }
  730. else if( xwin == 1 && ywin == 0 ) {
  731. xx1 = gXsize + x1 * gZoom;
  732. yy1 = gWinYsize - y1 * gZoom;
  733. xx2 = gXsize + x2 * gZoom;
  734. yy2 = gWinYsize - y2 * gZoom;
  735. xx3 = gXsize + x3 * gZoom;
  736. yy3 = gWinYsize - y3 * gZoom;
  737. xx4 = gXsize + x4 * gZoom;
  738. yy4 = gWinYsize - y4 * gZoom;
  739. }
  740. else {
  741. xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI;
  742. xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI;
  743. xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI;
  744. xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI;
  745. yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI;
  746. yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI;
  747. yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI;
  748. yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI;
  749. }
  750. glBegin( GL_QUADS );
  751. glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  752. glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  753. glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  754. glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  755. glEnd();
  756. }
  757. }
  758. glEndList();
  759. flag[mode][win][list] = 0;
  760. }
  761. else {
  762. glCallList( listIndex[mode][win][list] );
  763. }
  764. glBindTexture( GL_TEXTURE_2D, 0 );
  765. glDisable( GL_TEXTURE_2D );
  766. glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  767. }
  768. #ifndef _WIN32
  769. static void argDispImageTex3( ARUint8 *image, int xwin, int ywin, int mode )
  770. #else
  771. static void argDispImageTex3( ARUint8 *wimage, int xwin, int ywin, int mode )
  772. #endif
  773. {
  774. static int initf = 1;
  775. static int flag[3][MINIWIN_MAX+2][2];
  776. static int listIndex[3][MINIWIN_MAX+2][2];
  777. static int old_size_adjust_factor = -1;
  778. #ifdef _WIN32
  779. static ARUint8 *image = NULL;
  780. #endif
  781. double *dist_factor;
  782. double tsx, tsy, tex, tey;
  783. double px, py, qx, qy, z;
  784. double x1, x2, x3, x4;
  785. double y1, y2, y3, y4;
  786. double xx1, xx2, xx3, xx4;
  787. double yy1, yy2, yy3, yy4;
  788. int size_adjust_factor;
  789. int win, list;
  790. int i, j;
  791. switch( mode ) {
  792. case 0: dist_factor = &(gCparam.dist_factor[0]); break;
  793. case 1: dist_factor = &(gsCparam.dist_factorL[0]); break;
  794. case 2: dist_factor = &(gsCparam.dist_factorR[0]); break;
  795. default: return;
  796. }
  797. #ifdef _WIN32
  798. if( image == NULL ) {
  799. arMalloc(image,ARUint8,gImXsize*tex1Ysize*AR_PIX_SIZE_DEFAULT);
  800. }
  801. memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE_DEFAULT);
  802. #endif
  803. if( initf ) {
  804. for(j=0;j<3;j++) {
  805. for(i=0;i<=MINIWIN_MAX;i++) flag[j][i][0] = flag[j][i][1] = 1;
  806. }
  807. initf = 0;
  808. }
  809. if( argTexmapMode == AR_DRAW_TEXTURE_HALF_IMAGE ) {
  810. size_adjust_factor = 2;
  811. list = 1;
  812. }
  813. else {
  814. size_adjust_factor = 1;
  815. list = 0;
  816. }
  817. if( xwin == 0 && ywin == 0 ) win = 0;
  818. else if( xwin == 1 && ywin == 0 ) win = 1;
  819. else win = gMiniXnum * (ywin-1) + xwin + 1;
  820. glEnable( GL_TEXTURE_2D );
  821. glMatrixMode(GL_TEXTURE);
  822. glLoadIdentity();
  823. glMatrixMode(GL_MODELVIEW);
  824. glBindTexture( GL_TEXTURE_2D, glid[0] );
  825. #ifdef APPLE_TEXTURE_FAST_TRANSFER
  826. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.0);
  827. glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
  828. #endif
  829. glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize*size_adjust_factor );
  830. if( size_adjust_factor == old_size_adjust_factor ) {
  831. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  832. # ifdef AR_BIG_ENDIAN
  833. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  834. # else
  835. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  836. # endif
  837. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  838. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_ABGR, GL_UNSIGNED_BYTE, image );
  839. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  840. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_BYTE, image );
  841. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  842. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_BGR, GL_UNSIGNED_BYTE, image );
  843. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  844. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_RGBA, GL_UNSIGNED_BYTE, image );
  845. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  846. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_RGB, GL_UNSIGNED_BYTE, image );
  847. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  848. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  849. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  850. # ifdef AR_BIG_ENDIAN
  851. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  852. # else
  853. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  854. # endif
  855. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  856. # ifdef AR_BIG_ENDIAN
  857. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  858. # else
  859. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize1, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  860. # endif
  861. #else
  862. # error Unknown default pixel format defined in config.h
  863. #endif
  864. }
  865. else {
  866. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  867. # ifdef AR_BIG_ENDIAN
  868. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  869. # else
  870. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  871. # endif
  872. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  873. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  874. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  875. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  876. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  877. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  878. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  879. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  880. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  881. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  882. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  883. glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  884. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  885. # ifdef AR_BIG_ENDIAN
  886. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  887. # else
  888. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  889. # endif
  890. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  891. # ifdef AR_BIG_ENDIAN
  892. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  893. # else
  894. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize1, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  895. # endif
  896. #else
  897. # error Unknown default pixel format defined in config.h
  898. #endif
  899. }
  900. if( flag[mode][win][list] ) {
  901. listIndex[mode][win][list] = glGenLists(2);
  902. glNewList(listIndex[mode][win][list], GL_COMPILE_AND_EXECUTE);
  903. z = -1.0;
  904. qy = gImYsize * 0 / 20.0;
  905. tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  906. for( j = 1; j <= 20; j++ ) {
  907. py = qy;
  908. tsy = tey;
  909. qy = gImYsize * j / 20.0;
  910. tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  911. qx = tex1Xsize1 * 0 / 16.0;
  912. tex = (double)0 / 16.0;
  913. for( i = 1; i <= 16; i++ ) {
  914. px = qx;
  915. tsx = tex;
  916. qx = tex1Xsize1 * i / 16.0;
  917. tex = (double)i / 16.0;
  918. arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  919. arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  920. arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  921. arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  922. if( x2 < x1 ) continue;
  923. if( x4 > x3 ) continue;
  924. if( y4 < y1 ) continue;
  925. if( y3 < y2 ) continue;
  926. if( x2 < 0 || x3 < 0 ) continue;
  927. if( x1 > gImXsize || x4 > gImXsize ) continue;
  928. if( y4 < 0 || y3 < 0 ) continue;
  929. if( y1 > gImYsize || y2 > gImXsize ) continue;
  930. if( xwin == 0 && ywin == 0 ) {
  931. xx1 = x1 * gZoom;
  932. yy1 = gWinYsize - y1 * gZoom;
  933. xx2 = x2 * gZoom;
  934. yy2 = gWinYsize - y2 * gZoom;
  935. xx3 = x3 * gZoom;
  936. yy3 = gWinYsize - y3 * gZoom;
  937. xx4 = x4 * gZoom;
  938. yy4 = gWinYsize - y4 * gZoom;
  939. }
  940. else if( xwin == 1 && ywin == 0 ) {
  941. xx1 = gXsize + x1 * gZoom;
  942. yy1 = gWinYsize - y1 * gZoom;
  943. xx2 = gXsize + x2 * gZoom;
  944. yy2 = gWinYsize - y2 * gZoom;
  945. xx3 = gXsize + x3 * gZoom;
  946. yy3 = gWinYsize - y3 * gZoom;
  947. xx4 = gXsize + x4 * gZoom;
  948. yy4 = gWinYsize - y4 * gZoom;
  949. }
  950. else {
  951. xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI;
  952. xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI;
  953. xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI;
  954. xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI;
  955. yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI;
  956. yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI;
  957. yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI;
  958. yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI;
  959. }
  960. glBegin( GL_QUADS );
  961. glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  962. glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  963. glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  964. glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  965. glEnd();
  966. }
  967. }
  968. glEndList();
  969. }
  970. else {
  971. glCallList( listIndex[mode][win][list] );
  972. }
  973. glBindTexture( GL_TEXTURE_2D, glid[1] );
  974. #ifdef APPLE_TEXTURE_FAST_TRANSFER
  975. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.0);
  976. glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
  977. #endif
  978. if( size_adjust_factor == old_size_adjust_factor ) {
  979. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  980. # ifdef AR_BIG_ENDIAN
  981. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  982. # else
  983. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  984. # endif
  985. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  986. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_ABGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  987. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  988. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_BGRA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  989. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  990. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_BGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  991. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  992. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_RGBA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  993. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  994. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_RGB, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  995. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  996. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_LUMINANCE, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  997. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  998. # ifdef AR_BIG_ENDIAN
  999. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1000. # else
  1001. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1002. # endif
  1003. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  1004. # ifdef AR_BIG_ENDIAN
  1005. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1006. # else
  1007. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex1Xsize2, tex1Ysize/size_adjust_factor, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1008. # endif
  1009. #else
  1010. # error Unknown default pixel format defined in config.h
  1011. #endif
  1012. }
  1013. else {
  1014. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  1015. # ifdef AR_BIG_ENDIAN
  1016. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1017. # else
  1018. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1019. # endif
  1020. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  1021. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_ABGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1022. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  1023. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGRA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1024. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  1025. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_BGR, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1026. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  1027. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_RGBA, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1028. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  1029. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_RGB, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1030. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  1031. glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1032. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  1033. # ifdef AR_BIG_ENDIAN
  1034. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1035. # else
  1036. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1037. # endif
  1038. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  1039. # ifdef AR_BIG_ENDIAN
  1040. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1041. # else
  1042. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex1Xsize2, tex1Ysize/size_adjust_factor, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image+tex1Xsize1*AR_PIX_SIZE_DEFAULT );
  1043. # endif
  1044. #else
  1045. # error Unknown default pixel format defined in config.h
  1046. #endif
  1047. old_size_adjust_factor = size_adjust_factor;
  1048. }
  1049. if( flag[mode][win][list] ) {
  1050. glNewList(listIndex[mode][win][list]+1, GL_COMPILE_AND_EXECUTE);
  1051. z = -1.0;
  1052. qy = gImYsize * 0 / 20.0;
  1053. tey = ((double)gImYsize / (double)tex1Ysize) * (double)0 / 20.0;
  1054. for( j = 1; j <= 20; j++ ) {
  1055. py = qy;
  1056. tsy = tey;
  1057. qy = gImYsize * j / 20.0;
  1058. tey = ((double)gImYsize / (double)tex1Ysize) * (double)j / 20.0;
  1059. qx = tex1Xsize1 + (gImXsize-tex1Xsize1) * 0 / 4.0;
  1060. tex = ((double)(gImXsize-tex1Xsize1) / (double)tex1Xsize2) * 0 / 4.0;
  1061. for( i = 1; i <= 4; i++ ) {
  1062. px = qx;
  1063. tsx = tex;
  1064. qx = tex1Xsize1 + (gImXsize-tex1Xsize1) * i / 4.0;
  1065. tex = ((double)(gImXsize-tex1Xsize1) / (double)tex1Xsize2) * i / 4.0;
  1066. arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  1067. arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  1068. arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  1069. arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  1070. if( x2 < x1 ) continue;
  1071. if( x4 > x3 ) continue;
  1072. if( y4 < y1 ) continue;
  1073. if( y3 < y2 ) continue;
  1074. if( x2 < 0 || x3 < 0 ) continue;
  1075. if( x1 > gImXsize || x4 > gImXsize ) continue;
  1076. if( y4 < 0 || y3 < 0 ) continue;
  1077. if( y1 > gImYsize || y2 > gImXsize ) continue;
  1078. if( xwin == 0 && ywin == 0 ) {
  1079. xx1 = x1 * gZoom;
  1080. yy1 = gWinYsize - y1 * gZoom;
  1081. xx2 = x2 * gZoom;
  1082. yy2 = gWinYsize - y2 * gZoom;
  1083. xx3 = x3 * gZoom;
  1084. yy3 = gWinYsize - y3 * gZoom;
  1085. xx4 = x4 * gZoom;
  1086. yy4 = gWinYsize - y4 * gZoom;
  1087. }
  1088. else if( xwin == 1 && ywin == 0 ) {
  1089. xx1 = gXsize + x1 * gZoom;
  1090. yy1 = gWinYsize - y1 * gZoom;
  1091. xx2 = gXsize + x2 * gZoom;
  1092. yy2 = gWinYsize - y2 * gZoom;
  1093. xx3 = gXsize + x3 * gZoom;
  1094. yy3 = gWinYsize - y3 * gZoom;
  1095. xx4 = gXsize + x4 * gZoom;
  1096. yy4 = gWinYsize - y4 * gZoom;
  1097. }
  1098. else {
  1099. xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI;
  1100. xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI;
  1101. xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI;
  1102. xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI;
  1103. yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI;
  1104. yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI;
  1105. yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI;
  1106. yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI;
  1107. }
  1108. glBegin( GL_QUADS );
  1109. glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  1110. glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  1111. glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  1112. glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  1113. glEnd();
  1114. }
  1115. }
  1116. glEndList();
  1117. flag[mode][win][list] = 0;
  1118. }
  1119. else {
  1120. glCallList( listIndex[mode][win][list]+1 );
  1121. }
  1122. glBindTexture( GL_TEXTURE_2D, 0 );
  1123. glDisable( GL_TEXTURE_2D );
  1124. glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  1125. }
  1126. void argDispHalfImage( ARUint8 *image, int xwin, int ywin )
  1127. {
  1128. if( argDrawMode == AR_DRAW_BY_GL_DRAW_PIXELS ) {
  1129. argDispHalfImageDrawPixels( image, xwin, ywin );
  1130. }
  1131. else {
  1132. if( xwin == 0 && ywin == 0 ) {
  1133. glScissor(0, gWinYsize-(int)(gZoom*gImYsize),
  1134. (int)(gZoom*gImXsize), (int)(gZoom*gImYsize));
  1135. }
  1136. else {
  1137. glScissor((xwin-1)*gMiniXsize, gWinYsize-gYsize-ywin*gMiniYsize,
  1138. gMiniXsize, gMiniYsize);
  1139. }
  1140. glEnable( GL_SCISSOR_TEST );
  1141. /* glDisable( GL_DEPTH_TEST ); */
  1142. argDispHalfImageTex( image, xwin, ywin, 0 );
  1143. glDisable( GL_SCISSOR_TEST );
  1144. }
  1145. }
  1146. static void argDispHalfImageDrawPixels( ARUint8 *image, int xwin, int ywin )
  1147. {
  1148. float sx, sy;
  1149. GLfloat zoom;
  1150. if( xwin == 0 && ywin == 0 ) {
  1151. zoom = gZoom * 2.0;
  1152. sx = 0;
  1153. sy = gWinYsize - 0.5;
  1154. }
  1155. if( xwin == 1 && ywin == 0 ) {
  1156. zoom = gZoom * 2.0;
  1157. sx = gXsize;
  1158. sy = gWinYsize - 0.5;
  1159. }
  1160. else {
  1161. zoom = gZoom / (double)GMINI * 2.0;
  1162. sx = (xwin-1)*gMiniXsize;
  1163. sy = gWinYsize - gYsize - (ywin-1)*gMiniYsize - 0.5;
  1164. }
  1165. glPixelZoom( zoom, -zoom);
  1166. glRasterPos3f( sx, sy, -1.0 );
  1167. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  1168. # ifdef AR_BIG_ENDIAN
  1169. glDrawPixels( gImXsize/2, gImYsize/2, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  1170. # else
  1171. glDrawPixels( gImXsize/2, gImYsize/2, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  1172. # endif
  1173. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  1174. glDrawPixels( gImXsize/2, gImYsize/2, GL_ABGR, GL_UNSIGNED_BYTE, image );
  1175. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  1176. glDrawPixels( gImXsize/2, gImYsize/2, GL_BGRA, GL_UNSIGNED_BYTE, image );
  1177. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  1178. glDrawPixels( gImXsize/2, gImYsize/2, GL_BGR, GL_UNSIGNED_BYTE, image );
  1179. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  1180. glDrawPixels( gImXsize/2, gImYsize/2, GL_RGBA, GL_UNSIGNED_BYTE, image );
  1181. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  1182. glDrawPixels( gImXsize/2, gImYsize/2, GL_RGB, GL_UNSIGNED_BYTE, image );
  1183. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  1184. glDrawPixels( gImXsize/2, gImYsize/2, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  1185. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  1186. # ifdef AR_BIG_ENDIAN
  1187. glDrawPixels( gImXsize/2, gImYsize/2, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1188. # else
  1189. glDrawPixels( gImXsize/2, gImYsize/2, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1190. # endif
  1191. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  1192. # ifdef AR_BIG_ENDIAN
  1193. glDrawPixels( gImXsize/2, gImYsize/2, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1194. # else
  1195. glDrawPixels( gImXsize/2, gImYsize/2, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1196. # endif
  1197. #else
  1198. # error Unknown default pixel format defined in config.h
  1199. #endif
  1200. }
  1201. #ifndef _WIN32
  1202. static void argDispHalfImageTex( ARUint8 *image, int xwin, int ywin, int mode )
  1203. #else
  1204. static void argDispHalfImageTex( ARUint8 *wimage, int xwin, int ywin, int mode )
  1205. #endif
  1206. {
  1207. static int initf = 1;
  1208. static int flag[3][MINIWIN_MAX+2];
  1209. static int listIndex[3][MINIWIN_MAX+2];
  1210. #ifdef _WIN32
  1211. static ARUint8 *image = NULL;
  1212. #endif
  1213. double *dist_factor;
  1214. double tsx, tsy, tex, tey;
  1215. double px, py, qx, qy, z;
  1216. double x1, x2, x3, x4;
  1217. double y1, y2, y3, y4;
  1218. double xx1, xx2, xx3, xx4;
  1219. double yy1, yy2, yy3, yy4;
  1220. int win;
  1221. int i, j;
  1222. switch( mode ) {
  1223. case 0: dist_factor = &(gCparam.dist_factor[0]); break;
  1224. case 1: dist_factor = &(gsCparam.dist_factorL[0]); break;
  1225. case 2: dist_factor = &(gsCparam.dist_factorR[0]); break;
  1226. default: return;
  1227. }
  1228. #ifdef _WIN32
  1229. if( image == NULL ) {
  1230. arMalloc(image,ARUint8,tex2Xsize*tex2Ysize*AR_PIX_SIZE_DEFAULT);
  1231. }
  1232. memcpy(image, wimage, gImXsize*gImYsize*AR_PIX_SIZE_DEFAULT/4);
  1233. #endif
  1234. if( initf ) {
  1235. for(j=0;j<3;j++) {
  1236. for(i=0;i<=MINIWIN_MAX;i++) flag[j][i] = 1;
  1237. }
  1238. }
  1239. if( xwin == 0 && ywin == 0 ) win = 0;
  1240. else if( xwin == 1 && ywin == 0 ) win = 1;
  1241. else win = gMiniXnum * (ywin-1) + xwin + 1;
  1242. glEnable( GL_TEXTURE_2D );
  1243. glMatrixMode(GL_TEXTURE);
  1244. glLoadIdentity();
  1245. glMatrixMode(GL_MODELVIEW);
  1246. glBindTexture( GL_TEXTURE_2D, glid[2] );
  1247. #ifdef APPLE_TEXTURE_FAST_TRANSFER
  1248. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.0);
  1249. glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1);
  1250. #endif
  1251. glPixelStorei( GL_UNPACK_ROW_LENGTH, gImXsize/2 );
  1252. if( initf == 0 ) {
  1253. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  1254. # ifdef AR_BIG_ENDIAN
  1255. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  1256. # else
  1257. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  1258. # endif
  1259. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  1260. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_ABGR, GL_UNSIGNED_BYTE, image );
  1261. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  1262. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_BGRA, GL_UNSIGNED_BYTE, image );
  1263. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  1264. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_BGR, GL_UNSIGNED_BYTE, image );
  1265. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  1266. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_RGBA, GL_UNSIGNED_BYTE, image );
  1267. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  1268. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_RGB, GL_UNSIGNED_BYTE, image );
  1269. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  1270. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  1271. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  1272. # ifdef AR_BIG_ENDIAN
  1273. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1274. # else
  1275. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1276. # endif
  1277. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  1278. # ifdef AR_BIG_ENDIAN
  1279. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1280. # else
  1281. glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, tex2Xsize, tex2Ysize, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1282. # endif
  1283. #else
  1284. # error Unknown default pixel format defined in config.h
  1285. #endif
  1286. }
  1287. else {
  1288. #if (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ARGB)
  1289. # ifdef AR_BIG_ENDIAN
  1290. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex2Xsize, tex2Ysize, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image );
  1291. # else
  1292. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex2Xsize, tex2Ysize, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, image );
  1293. # endif
  1294. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_ABGR)
  1295. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex2Xsize, tex2Ysize, 0, GL_ABGR, GL_UNSIGNED_BYTE, image );
  1296. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGRA)
  1297. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_BGRA, GL_UNSIGNED_BYTE, image );
  1298. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_BGR)
  1299. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_BGR, GL_UNSIGNED_BYTE, image );
  1300. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGBA)
  1301. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tex2Xsize, tex2Ysize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
  1302. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_RGB)
  1303. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_RGB, GL_UNSIGNED_BYTE, image );
  1304. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_MONO)
  1305. glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, tex2Xsize, tex2Ysize, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image );
  1306. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_2vuy)
  1307. # ifdef AR_BIG_ENDIAN
  1308. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1309. # else
  1310. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1311. # endif
  1312. #elif (AR_DEFAULT_PIXEL_FORMAT == AR_PIXEL_FORMAT_yuvs)
  1313. # ifdef AR_BIG_ENDIAN
  1314. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE, image );
  1315. # else
  1316. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, tex2Xsize, tex2Ysize, 0, GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_REV_APPLE, image );
  1317. # endif
  1318. #else
  1319. # error Unknown default pixel format defined in config.h
  1320. #endif
  1321. }
  1322. if( flag[mode][win] ) {
  1323. listIndex[mode][win] = glGenLists(1);
  1324. glNewList(listIndex[mode][win], GL_COMPILE_AND_EXECUTE);
  1325. z = -1.0;
  1326. qy = gImYsize * 0 / 20.0;
  1327. tey = ((double)gImYsize / (double)(tex2Ysize*2.0)) * (double)0 / 20.0;
  1328. for( j = 1; j <= 20; j++ ) {
  1329. py = qy;
  1330. tsy = tey;
  1331. qy = gImYsize * j / 20.0;
  1332. tey = ((double)gImYsize / (double)(tex2Ysize*2.0)) * (double)j / 20.0;
  1333. qx = gImXsize * 0 / 20.0;
  1334. tex = ((double)gImXsize / (double)(tex2Xsize*2.0)) * (double)0 / 20.0;
  1335. for( i = 1; i <= 20; i++ ) {
  1336. px = qx;
  1337. tsx = tex;
  1338. qx = gImXsize * i / 20.0;
  1339. tex = ((double)gImXsize / (double)(tex2Xsize*2.0)) * (double)i / 20.0;
  1340. arParamObserv2Ideal( dist_factor, px, py, &x1, &y1 );
  1341. arParamObserv2Ideal( dist_factor, qx, py, &x2, &y2 );
  1342. arParamObserv2Ideal( dist_factor, qx, qy, &x3, &y3 );
  1343. arParamObserv2Ideal( dist_factor, px, qy, &x4, &y4 );
  1344. if( xwin == 0 && ywin == 0 ) {
  1345. xx1 = x1 * gZoom;
  1346. yy1 = gWinYsize - y1 * gZoom;
  1347. xx2 = x2 * gZoom;
  1348. yy2 = gWinYsize - y2 * gZoom;
  1349. xx3 = x3 * gZoom;
  1350. yy3 = gWinYsize - y3 * gZoom;
  1351. xx4 = x4 * gZoom;
  1352. yy4 = gWinYsize - y4 * gZoom;
  1353. }
  1354. else if( xwin == 1 && ywin == 0 ) {
  1355. xx1 = gXsize + x1 * gZoom;
  1356. yy1 = gWinYsize - y1 * gZoom;
  1357. xx2 = gXsize + x2 * gZoom;
  1358. yy2 = gWinYsize - y2 * gZoom;
  1359. xx3 = gXsize + x3 * gZoom;
  1360. yy3 = gWinYsize - y3 * gZoom;
  1361. xx4 = gXsize + x4 * gZoom;
  1362. yy4 = gWinYsize - y4 * gZoom;
  1363. }
  1364. else {
  1365. xx1 = (xwin-1)*gMiniXsize + x1*gZoom/(double)GMINI;
  1366. xx2 = (xwin-1)*gMiniXsize + x2*gZoom/(double)GMINI;
  1367. xx3 = (xwin-1)*gMiniXsize + x3*gZoom/(double)GMINI;
  1368. xx4 = (xwin-1)*gMiniXsize + x4*gZoom/(double)GMINI;
  1369. yy1 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y1*gZoom/(double)GMINI;
  1370. yy2 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y2*gZoom/(double)GMINI;
  1371. yy3 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y3*gZoom/(double)GMINI;
  1372. yy4 = gWinYsize-gYsize-(ywin-1)*gMiniYsize - y4*gZoom/(double)GMINI;
  1373. }
  1374. glBegin( GL_QUADS );
  1375. glTexCoord2d( tsx, tsy ); glVertex3d( xx1, yy1, z );
  1376. glTexCoord2d( tex, tsy ); glVertex3d( xx2, yy2, z );
  1377. glTexCoord2d( tex, tey ); glVertex3d( xx3, yy3, z );
  1378. glTexCoord2d( tsx, tey ); glVertex3d( xx4, yy4, z );
  1379. glEnd();
  1380. }
  1381. }
  1382. glEndList();
  1383. flag[mode][win] = 0;
  1384. }
  1385. else {
  1386. glCallList( listIndex[mode][win] );
  1387. }
  1388. initf = 0;
  1389. glBindTexture( GL_TEXTURE_2D, 0 );
  1390. glDisable( GL_TEXTURE_2D );
  1391. glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
  1392. }
  1393. void argDrawSquare( double vertex[4][2], int xwin, int ywin )
  1394. {
  1395. argLineSeg( vertex[0][0], vertex[0][1],
  1396. vertex[1][0], vertex[1][1], xwin, ywin );
  1397. argLineSeg( vertex[1][0], vertex[1][1],
  1398. vertex[2][0], vertex[2][1], xwin, ywin );
  1399. argLineSeg( vertex[2][0], vertex[2][1],
  1400. vertex[3][0], vertex[3][1], xwin, ywin );
  1401. argLineSeg( vertex[3][0], vertex[3][1],
  1402. vertex[0][0], vertex[0][1], xwin, ywin );
  1403. }
  1404. void argLineSeg( double x1, double y1, double x2, double y2, int xwin, int ywin )
  1405. {
  1406. float ox, oy;
  1407. double xx1, yy1, xx2, yy2;
  1408. if( argDrawMode == AR_DRAW_BY_TEXTURE_MAPPING ) {
  1409. xx1 = x1; yy1 = y1;
  1410. xx2 = x2; yy2 = y2;
  1411. }
  1412. else {
  1413. arParamIdeal2Observ( gCparam.dist_factor, x1, y1, &xx1, &yy1 );
  1414. arParamIdeal2Observ( gCparam.dist_factor, x2, y2, &xx2, &yy2 );
  1415. }
  1416. xx1 *= gZoom; yy1 *= gZoom;
  1417. xx2 *= gZoom; yy2 *= gZoom;
  1418. if( xwin == 0 && ywin == 0 ) {
  1419. ox = 0;
  1420. oy = gWinYsize-1;
  1421. glBegin(GL_LINES);
  1422. glVertex2f( ox+xx1, oy-yy1 );
  1423. glVertex2f( ox+xx2, oy-yy2 );
  1424. glEnd();
  1425. }
  1426. else {
  1427. ox = (xwin-1)*gMiniXsize;
  1428. oy = gWinYsize - gYsize -(ywin-1)*gMiniYsize - 1;
  1429. glBegin(GL_LINES);
  1430. glVertex2f( ox+xx1/GMINI, oy-yy1/GMINI );
  1431. glVertex2f( ox+xx2/GMINI, oy-yy2/GMINI );
  1432. glEnd();
  1433. }
  1434. glFlush();
  1435. }
  1436. void argLineSegHMD( double x1, double y1, double x2, double y2 )
  1437. {
  1438. float ox, oy;
  1439. ox = 0;
  1440. oy = gWinYsize - gYsize;
  1441. glBegin(GL_LINES);
  1442. glVertex2f( ox+x1, oy+y1 );
  1443. glVertex2f( ox+x2, oy+y2 );
  1444. glEnd();
  1445. }
  1446. static void argInitStencil(void)
  1447. {
  1448. int offset;
  1449. int i;
  1450. glEnable(GL_STENCIL_TEST);
  1451. glClearStencil(0);
  1452. glClear(GL_STENCIL_BUFFER_BIT);
  1453. glLineWidth(1.0);
  1454. offset = gWinYsize - gYsize;
  1455. #if REVERSE_LR
  1456. glStencilFunc(GL_ALWAYS, LEFTEYE, LEFTEYE);
  1457. glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1458. glBegin(GL_LINES);
  1459. for( i = 0; i < gYsize; i+=2 ) {
  1460. glVertex2f( 0.0, (float)(i+offset) );
  1461. glVertex2f( gWinXsize, (float)(i+offset) );
  1462. }
  1463. glEnd();
  1464. glStencilFunc(GL_ALWAYS, RIGHTEYE, RIGHTEYE);
  1465. glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1466. glBegin(GL_LINES);
  1467. for( i = 1; i < gYsize; i+=2 ) {
  1468. glVertex2f( 0.0, (float)(i+offset) );
  1469. glVertex2f( gWinXsize, (float)(i+offset) );
  1470. }
  1471. glEnd();
  1472. #else
  1473. glStencilFunc(GL_ALWAYS, LEFTEYE, LEFTEYE);
  1474. glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1475. glBegin(GL_LINES);
  1476. for( i = 1; i < gYsize; i+=2 ) {
  1477. glVertex2f( 0.0, (float)(i+offset) );
  1478. glVertex2f( gWinXsize, (float)(i+offset) );
  1479. }
  1480. glEnd();
  1481. glStencilFunc(GL_ALWAYS, RIGHTEYE, RIGHTEYE);
  1482. glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  1483. glBegin(GL_LINES);
  1484. for( i = 0; i < gYsize; i+=2 ) {
  1485. glVertex2f( 0.0, (float)(i+offset) );
  1486. glVertex2f( gWinXsize, (float)(i+offset) );
  1487. }
  1488. glEnd();
  1489. #endif
  1490. glStencilFunc (GL_ALWAYS, 0, 0);
  1491. glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1492. glDisable(GL_STENCIL_TEST);
  1493. }
  1494. void argLoadHMDparam( ARParam *lparam, ARParam *rparam )
  1495. {
  1496. argConvGLcpara( lparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_lpara );
  1497. argConvGLcpara( rparam, AR_GL_CLIP_NEAR, AR_GL_CLIP_FAR, gl_rpara );
  1498. gl_hmd_para_flag = 1;
  1499. }
  1500. static void argSetStencil( int flag )
  1501. {
  1502. if( flag == 0 ) {
  1503. glDisable(GL_STENCIL_TEST);
  1504. glStencilFunc (GL_ALWAYS, 0, 0);
  1505. glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1506. }
  1507. else {
  1508. glEnable(GL_STENCIL_TEST);
  1509. glStencilFunc (GL_EQUAL, flag, flag);
  1510. glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP);
  1511. }
  1512. }
  1513. void argConvGLcpara( ARParam *param, double gnear, double gfar, double m[16] )
  1514. {
  1515. argConvGLcpara2( param->mat, param->xsize, param->ysize, gnear, gfar, m );
  1516. }
  1517. static void argConvGLcpara2( double cparam[3][4], int width, int height, double gnear, double gfar, double m[16] )
  1518. {
  1519. double icpara[3][4];
  1520. double trans[3][4];
  1521. double p[3][3], q[4][4];
  1522. int i, j;
  1523. if( arParamDecompMat(cparam, icpara, trans) < 0 ) {
  1524. printf("gConvGLcpara: Parameter error!!\n");
  1525. exit(0);
  1526. }
  1527. for( i = 0; i < 3; i++ ) {
  1528. for( j = 0; j < 3; j++ ) {
  1529. p[i][j] = icpara[i][j] / icpara[2][2];
  1530. }
  1531. }
  1532. q[0][0] = (2.0 * p[0][0] / width);
  1533. q[0][1] = (2.0 * p[0][1] / width);
  1534. q[0][2] = ((2.0 * p[0][2] / width) - 1.0);
  1535. q[0][3] = 0.0;
  1536. q[1][0] = 0.0;
  1537. q[1][1] = (2.0 * p[1][1] / height);
  1538. q[1][2] = ((2.0 * p[1][2] / height) - 1.0);
  1539. q[1][3] = 0.0;
  1540. q[2][0] = 0.0;
  1541. q[2][1] = 0.0;
  1542. q[2][2] = (gfar + gnear)/(gfar - gnear);
  1543. q[2][3] = -2.0 * gfar * gnear / (gfar - gnear);
  1544. q[3][0] = 0.0;
  1545. q[3][1] = 0.0;
  1546. q[3][2] = 1.0;
  1547. q[3][3] = 0.0;
  1548. for( i = 0; i < 4; i++ ) {
  1549. for( j = 0; j < 3; j++ ) {
  1550. m[i+j*4] = q[i][0] * trans[0][j]
  1551. + q[i][1] * trans[1][j]
  1552. + q[i][2] * trans[2][j];
  1553. }
  1554. m[i+3*4] = q[i][0] * trans[0][3]
  1555. + q[i][1] * trans[1][3]
  1556. + q[i][2] * trans[2][3]
  1557. + q[i][3];
  1558. }
  1559. }