Changeset 483


Ignore:
Timestamp:
Jun 21, 2005, 3:28:51 PM (16 years ago)
Author:
Jean-Yves Lamoureux
Message:

OpenGL support.

Location:
libcaca/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/configure.ac

    r475 r483  
    3636AC_ARG_ENABLE(x11,
    3737  [  --enable-x11            X11 support (autodetected)])
     38AC_ARG_ENABLE(gl,
     39  [  --enable-gl             OpenGL support (autodetected)])
    3840
    3941dnl example programs features
     
    124126fi
    125127
     128if test "${enable_gl}" != "no"; then
     129  ac_cv_my_have_gl="no"
     130  AC_CHECK_HEADERS(GL/gl.h GL/glut.h,
     131   [AC_CHECK_LIB(glut, glutMainLoopEvent,
     132     [ac_cv_my_have_gl="yes"
     133      AC_DEFINE(USE_GL, 1, Define to activate the OpenGL backend driver)
     134      CACA_LIBS="${CACA_LIBS} -lGL -lglut"
     135      CACA_DRIVERS="${CACA_DRIVERS} gl"])])
     136  if test "${ac_cv_my_have_gl}" = "no" -a "${enable_gl}" = "yes"; then
     137    AC_MSG_ERROR([cannot find OpenGL+FreeGLUT development files])
     138  fi
     139fi
     140
    126141if test "${enable_ncurses}" != "no"; then
    127142  ac_cv_my_have_ncurses="no"
     
    156171CFLAGS="${CFLAGS} -g -O2 -fno-strength-reduce -fomit-frame-pointer"
    157172# Code qui fait des warnings == code de porc == deux baffes dans ta gueule
    158 CFLAGS="${CFLAGS} -Wall -Wpointer-arith -Wcast-align -Wcast-qual -Wstrict-prototypes -Wshadow -Waggregate-return -Wmissing-prototypes -Wnested-externs -Wsign-compare"
     173# [Jylam] Removed -Wshadow in order to avoid ncurses/gl conflict
     174# (Comme quoi on est pas les seuls porcs)
     175CFLAGS="${CFLAGS} -Wall -Wpointer-arith -Wcast-align -Wcast-qual -Wstrict-prototypes -Waggregate-return -Wmissing-prototypes -Wnested-externs -Wsign-compare"
    159176
    160177# Build the PIC library?
  • libcaca/trunk/src/caca.c

    r375 r483  
    5656#   include <windows.h>
    5757#endif
    58 
     58#if defined(USE_GL)
     59#   include <GL/gl.h>
     60#endif
    5961#include <stdlib.h>
    6062#include <string.h>
     
    193195
    194196        SetConsoleMode(win32_hout, ENABLE_MOUSE_INPUT);
     197    }
     198    else
     199#endif
     200#if defined(USE_GL)
     201    if(_caca_driver == CACA_DRIVER_GL)
     202    {
     203        /* Nothing to do */
    195204    }
    196205    else
     
    427436    else
    428437#endif
     438#if defined(USE_GL)
     439    if(_caca_driver == CACA_DRIVER_GL)
     440    {
     441        /* Nothing to do */
     442    }
     443    else
     444#endif
    429445    {
    430446        /* Dummy */
     
    459475        else
    460476#endif
     477#if defined(USE_GL)
     478        if(!strcasecmp(var, "gl"))
     479            _caca_driver = CACA_DRIVER_GL;
     480        else
     481#endif
    461482#if defined(USE_SLANG)
    462483        if(!strcasecmp(var, "slang"))
     
    491512        return;
    492513    }
     514#endif
     515#if defined(USE_GL)
     516    _caca_driver = CACA_DRIVER_GL;
     517    return;
    493518#endif
    494519#if defined(USE_SLANG)
  • libcaca/trunk/src/caca_internals.h

    r353 r483  
    4949    CACA_DRIVER_WIN32 = 5,
    5050#endif
     51#if defined(USE_GL)
     52    CACA_DRIVER_GL = 6,
     53#endif
    5154    CACA_DRIVER_NONE = 0
    5255};
     
    98101#endif
    99102
     103#if defined(USE_GL)
     104#include <GL/glut.h>
     105extern unsigned int gl_width, gl_height;
     106#endif
     107
     108
    100109#endif /* __CACA_INTERNALS_H__ */
  • libcaca/trunk/src/event.c

    r361 r483  
    5555#   include <windows.h>
    5656#endif
    57 
     57#if defined(USE_GL)
     58#include <GL/gl.h>
     59#include <GL/glut.h>
     60extern int gl_special_key;
     61extern unsigned char gl_key;
     62extern unsigned char gl_resized;
     63extern float gl_font_width;
     64extern float gl_font_height;
     65extern int gl_new_width;
     66extern int gl_new_height;
     67
     68#endif
    5869#include "caca.h"
    5970#include "caca_internals.h"
     
    720731    else
    721732#endif
     733#if defined(USE_GL)
     734      if(_caca_driver == CACA_DRIVER_GL)
     735        {
     736          glutMainLoopEvent();
     737
     738          if(gl_resized)
     739            {
     740              if(!_caca_resize)
     741                {
     742
     743
     744                  _caca_resize = 1;
     745                  gl_resized=0;
     746                  return CACA_EVENT_RESIZE;
     747                }
     748            }
     749
     750          if(gl_key!=0)
     751            {
     752              event |= CACA_EVENT_KEY_PRESS;
     753              event |= gl_key;
     754              gl_key = 0;
     755            }
     756
     757          if(gl_special_key != 0)
     758            {
     759              event |= CACA_EVENT_KEY_PRESS;
     760     
     761              switch(gl_special_key)
     762                {
     763                case GLUT_KEY_F1 : gl_special_key = 0; return event | CACA_KEY_F1;
     764                case GLUT_KEY_F2 : gl_special_key = 0; return event | CACA_KEY_F2;
     765                case GLUT_KEY_F3 : gl_special_key = 0; return event | CACA_KEY_F3;
     766                case GLUT_KEY_F4 : gl_special_key = 0; return event | CACA_KEY_F4;
     767                case GLUT_KEY_F5 : gl_special_key = 0; return event | CACA_KEY_F5;
     768                case GLUT_KEY_F6 : gl_special_key = 0; return event | CACA_KEY_F6;
     769                case GLUT_KEY_F7 : gl_special_key = 0; return event | CACA_KEY_F7;
     770                case GLUT_KEY_F8 : gl_special_key = 0; return event | CACA_KEY_F8;
     771                case GLUT_KEY_F9 : gl_special_key = 0; return event | CACA_KEY_F9;
     772                case GLUT_KEY_F10  : gl_special_key = 0; return event | CACA_KEY_F10;
     773                case GLUT_KEY_F11  : gl_special_key = 0; return event | CACA_KEY_F11;
     774                case GLUT_KEY_F12  : gl_special_key = 0; return event | CACA_KEY_F12;
     775                case GLUT_KEY_LEFT : gl_special_key = 0; return event | CACA_KEY_LEFT;
     776                case GLUT_KEY_RIGHT: gl_special_key = 0; return event | CACA_KEY_RIGHT;
     777                case GLUT_KEY_UP   : gl_special_key = 0; return event | CACA_KEY_UP;
     778                case GLUT_KEY_DOWN : gl_special_key = 0; return event | CACA_KEY_DOWN;
     779                default:       return CACA_EVENT_NONE;
     780                }
     781            }
     782          return event;
     783        }
     784      else
     785#endif
    722786    {
    723787        /* Dummy */
  • libcaca/trunk/src/graphics.c

    r466 r483  
    5959#   include <windows.h>
    6060#endif
    61 
     61#if defined(USE_GL)
     62#   include <GL/gl.h>
     63#   include <GL/glut.h>
     64#endif
    6265#if defined(HAVE_INTTYPES_H) || defined(_DOXYGEN_SKIP_ME)
    6366#   include <inttypes.h>
     
    233236};
    234237#endif
     238#if defined(USE_GL)
     239
     240static unsigned int const gl_bg_palette[] =
     241{
     242    0,
     243    0x0000007F,
     244    0x00007F00,
     245    0x00007F7F,
     246    0x007F0000,
     247    0x007F007F,
     248    0x007F7F00,
     249    0x007F7F7F,
     250    // + intensity
     251    0x00000000,
     252    0x000000FF,
     253    0x0000FF00,
     254    0x0000FFFF,
     255    0x00FF0000,
     256    0x00FF00FF,
     257    0x00FFFF00,
     258    0x00FFFFFF,
     259
     260};
     261
     262int gl_window;
     263unsigned int gl_width, gl_height;
     264float gl_font_width, gl_font_height;
     265float gl_incx, gl_incy;
     266int id[94];
     267unsigned char gl_resized=0, gl_bit=0;
     268#endif
     269
    235270
    236271static char *_caca_empty_line;
     
    262297static int x11_error_handler(Display *, XErrorEvent *);
    263298#endif
     299
     300#if defined(USE_GL)
     301unsigned char gl_key = 0;
     302int gl_special_key=0;
     303int gl_new_width;
     304int gl_new_height;
     305
     306
     307static void gl_handle_keyboard(unsigned char key, int x, int y)
     308{
     309  gl_key = key;
     310}
     311static void gl_handle_special_key(int key, int x, int y)
     312{
     313  gl_special_key = key;
     314}
     315static void gl_handle_reshape (int w, int h)
     316{
     317  if(gl_bit) /* Do not handle reshaping at the first time*/
     318    {
     319
     320      gl_new_width = w;
     321      gl_new_height = h;
     322     
     323      gl_resized = 1;
     324    }
     325  else
     326    gl_bit=1;
     327 
     328}
     329#endif
     330
     331
    264332
    265333/** \brief Set the default colour pair.
     
    331399        break;
    332400#endif
     401#if defined(USE_GL)
     402    case CACA_DRIVER_GL:
     403        /* Nothing to do */
     404        break;
     405#endif
    333406    default:
    334407        break;
     
    414487#if defined(USE_WIN32)
    415488    case CACA_DRIVER_WIN32:
     489        break;
     490#endif
     491#if defined(USE_GL)
     492    case CACA_DRIVER_GL:
    416493        break;
    417494#endif
     
    509586#if defined(USE_WIN32)
    510587    case CACA_DRIVER_WIN32:
     588        break;
     589#endif
     590#if defined(USE_GL)
     591    case CACA_DRIVER_GL:
    511592        break;
    512593#endif
     
    881962    else
    882963#endif
     964#if defined(USE_GL)
     965      if(_caca_driver == CACA_DRIVER_GL)
     966        {
     967          int i;
     968          char *empty;
     969
     970        if(!_caca_width)
     971            _caca_width = 80;
     972        if(!_caca_height)
     973            _caca_height = 32;
     974
     975          gl_font_width = 9;
     976          gl_font_height = 15;
     977
     978          gl_width =  _caca_width*gl_font_width;
     979          gl_height = _caca_height*gl_font_height;
     980
     981          glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
     982          glutInitWindowSize(gl_width, gl_height);
     983          gl_window = glutCreateWindow("caca for GL");
     984
     985          gluOrtho2D(0,gl_width, gl_height, 0);
     986
     987          glDisable(GL_CULL_FACE);
     988          glDisable(GL_DEPTH_TEST); 
     989
     990          glutKeyboardFunc(gl_handle_keyboard);
     991          glutSpecialFunc(gl_handle_special_key);
     992          glutReshapeFunc(gl_handle_reshape);
     993
     994          glLoadIdentity();
     995
     996          glMatrixMode(GL_PROJECTION);
     997          glPushMatrix();
     998          glLoadIdentity();
     999          gluOrtho2D(0, gl_width, gl_height, 0);
     1000
     1001          glMatrixMode(GL_MODELVIEW);
     1002
     1003
     1004          glClear(GL_COLOR_BUFFER_BIT);
     1005
     1006
     1007
     1008          empty = malloc(16*16*4);
     1009          if(empty == NULL)
     1010            return -1;
     1011
     1012          memset(empty, 255, 16*16*4);
     1013          glEnable(GL_TEXTURE_2D);
     1014         
     1015          for(i=0;i<94;i++)
     1016            {
     1017              glGenTextures(1,&id[i]);
     1018              glBindTexture(GL_TEXTURE_2D, id[i]);
     1019              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     1020              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     1021              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,
     1022                           16,16,
     1023                           0, GL_RGB, GL_UNSIGNED_BYTE, empty);
     1024            }
     1025          for(i=0;i<94;i++)
     1026            {
     1027             
     1028              glDisable(GL_TEXTURE_2D);
     1029              glClear(GL_COLOR_BUFFER_BIT);
     1030
     1031              glColor3f(1,1,1);
     1032              glRasterPos2f(0,15);
     1033              glutBitmapCharacter(GLUT_BITMAP_9_BY_15,i+32);
     1034             
     1035
     1036              glEnable(GL_TEXTURE_2D);
     1037              glBindTexture(GL_TEXTURE_2D,id[i]);                       
     1038              glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, gl_height-16, 16,16, 0);
     1039             
     1040              glutMainLoopEvent();
     1041              glutPostRedisplay();
     1042            }
     1043        }
     1044    else
     1045#endif
     1046
    8831047    {
    8841048        /* Dummy */
     
    9551119    else
    9561120#endif
     1121#if defined(USE_GL)
     1122      if(_caca_driver == CACA_DRIVER_GL)
     1123        {
     1124          glutDestroyWindow(gl_window);
     1125        }
     1126      else
     1127#endif
    9571128    {
    9581129        /* Dummy */
     
    9881159    }
    9891160    else
     1161#endif
     1162#if defined(USE_GL)
     1163      if(_caca_driver == CACA_DRIVER_GL)
     1164        {
     1165          glutSetWindowTitle(title);
     1166        }
     1167      else
    9901168#endif
    9911169    {
     
    10221200    else
    10231201#endif
     1202#if defined(USE_GL)
     1203      if(_caca_driver == CACA_DRIVER_GL)
     1204        {
     1205          return gl_width;
     1206        }
     1207      else
     1208#endif
    10241209    {
    10251210        /* Dummy */
     
    10541239    }
    10551240    else
     1241#endif
     1242#if defined(USE_GL)
     1243      if(_caca_driver == CACA_DRIVER_GL)
     1244        {
     1245          return gl_height;
     1246        }
     1247      else
    10561248#endif
    10571249    {
     
    12211413    }
    12221414    else
     1415#endif
     1416#if defined(USE_GL)
     1417      if(_caca_driver == CACA_DRIVER_GL)
     1418        {
     1419          unsigned int x, y, offsetx, offsety;
     1420         
     1421
     1422          glClear(GL_COLOR_BUFFER_BIT);
     1423         
     1424          offsety=0;
     1425          for(y=0;y<gl_height;y+=gl_font_height)
     1426            {
     1427              offsetx = 0;
     1428            for(x=0;x<gl_width;x+=gl_font_width)
     1429              {
     1430                uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
     1431                int offset;
     1432                float  br, bg, bb;
     1433                offset = attr[0]>>4;
     1434
     1435                br = ((gl_bg_palette[offset]&0x00FF0000)>>16)/255.0f;
     1436                bg = ((gl_bg_palette[offset]&0x0000FF00)>>8)/255.0f;
     1437                bb = ((gl_bg_palette[offset]&0x000000FF))/255.0f;
     1438       
     1439                glDisable(GL_TEXTURE_2D);
     1440                glColor3f(br, bg, bb);
     1441                glBegin(GL_QUADS);
     1442                glVertex2f(x,y);
     1443                glVertex2f(x+gl_font_width,y);
     1444                glVertex2f(x+gl_font_width,y+gl_font_height);
     1445                glVertex2f(x,y+gl_font_height);
     1446                glEnd();
     1447       
     1448
     1449                offsetx++;
     1450              }   
     1451
     1452            offsety++;
     1453            }
     1454
     1455
     1456
     1457          /* 2nd pass, avoids changing render state too much */
     1458          glEnable(GL_BLEND);
     1459          glEnable(GL_TEXTURE_2D);
     1460          glBlendFunc(GL_ONE, GL_ONE);
     1461               
     1462          offsety=0;
     1463          for(y=0;y<gl_height;y+=gl_font_height)
     1464            {
     1465              offsetx = 0;
     1466              for(x=0;x<gl_width;x+=gl_font_width)
     1467                {
     1468                  uint8_t *attr = cache_attr + offsetx + offsety * _caca_width;
     1469                  unsigned char *chr = cache_char + offsetx + offsety * _caca_width;
     1470                  float fr, fg, fb;
     1471       
     1472               
     1473                  fr = ((gl_bg_palette[attr[0] & 0xf]&0x00FF0000)>>16)/255.0f;
     1474                  fg = ((gl_bg_palette[attr[0] & 0xf]&0x0000FF00)>>8)/255.0f;
     1475                  fb = ((gl_bg_palette[attr[0] & 0xf]&0x000000FF))/255.0f;
     1476
     1477                  if(chr[0] != ' ')
     1478                    {
     1479                      glBindTexture(GL_TEXTURE_2D, id[chr[0]-32]);
     1480                   
     1481                      glColor3f(fr, fg, fb);
     1482                      glBegin(GL_QUADS);
     1483                      glTexCoord2f(0,1);
     1484                      glVertex2f(x,y);
     1485                      glTexCoord2f(0.5,1);
     1486                      glVertex2f(x+gl_font_width,y);
     1487                      glTexCoord2f(0.5,0);
     1488                      glVertex2f(x+gl_font_width,y+gl_font_height);
     1489                      glTexCoord2f(0,0);
     1490                      glVertex2f(x,y+gl_font_height);
     1491                      glEnd();   
     1492                    }
     1493                  offsetx++;
     1494                }
     1495              offsety++;
     1496            }
     1497          glDisable(GL_BLEND);
     1498          glDisable(GL_TEXTURE_2D);
     1499
     1500
     1501
     1502          glutMainLoopEvent();
     1503          glutSwapBuffers();
     1504          glutPostRedisplay();
     1505        }
     1506else
    12231507#endif
    12241508    {
     
    13201604    if(_caca_driver == CACA_DRIVER_WIN32)
    13211605    {
     1606    }
     1607    else
     1608#endif
     1609#if defined(USE_GL)
     1610    if(_caca_driver == CACA_DRIVER_GL)
     1611    {
     1612      gl_width = gl_new_width;
     1613      gl_height = gl_new_height;
     1614         
     1615      _caca_width = gl_width/gl_font_width;
     1616      _caca_height = (gl_height/gl_font_height)+1;
     1617     
     1618      glMatrixMode(GL_PROJECTION);
     1619      glPushMatrix();
     1620      glLoadIdentity();
     1621     
     1622      glViewport(0,0,gl_width, gl_height);
     1623      gluOrtho2D(0, gl_width, gl_height, 0);     
     1624      glMatrixMode(GL_MODELVIEW);
     1625
    13221626    }
    13231627    else
Note: See TracChangeset for help on using the changeset viewer.