polys that should be culled are drawn when they were clipped before.. or
something like that..
would it be better to cull and then to clip ?
sample proggi attached
draws nothing with mesa 2.6
-- 
ralf willenbacher ([EMAIL PROTECTED])
*~<:)=-   *ching* *ching* *ching*
/* $Id: glxdemo.c,v 1.1.1.1 1999/08/19 00:55:43 jtg Exp $ */


/*
 * A demonstration of using the GLX functions.  This program is in the
 * public domain.
 *
 * Brian Paul
 */


/*
 * $Log: glxdemo.c,v $
 * Revision 1.1.1.1  1999/08/19 00:55:43  jtg
 * Imported sources
 *
 * Revision 3.0  1998/02/21 02:16:54  brianp
 * initial rev
 *
 */

#define LEFT    -3.0
#define RIGHT   3.0
#define TOP     3.0
#define BOTTOM  -3.0

#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>
#include <stdlib.h>

/* 4x4 texture */
unsigned char texture[] =
{
  0x19,0x19,0x19, 0x39,0x39,0x39, 0x59,0x59,0x59, 0x7f,0x7f,0x7f,
  0x19,0x0,0x19, 0x39,0x0,0x39, 0x59,0x0,0x59, 0x7f,0x0,0x7f,
  0x19,0x19,0x0, 0x39,0x39,0x0, 0x59,0x59,0x0, 0x7f,0x7f,0x0,
  0x19,0x0,0x0, 0x39,0x0,0x0, 0x59,0x0,0x0, 0x7f,0x0,0x0
};

void draw_poly4(float x, float y)
{
  glBegin(GL_POLYGON);
  glTexCoord2f(0.0,0.0);
  glVertex2f(-1.0+x, 1.0+y);

  glTexCoord2f(1.0,0.0);
  glVertex2f(1.0+x, 1.0+y);

  glTexCoord2f(1.0,1.0);
  glVertex2f(1.0+x, -1.0+y);

  glTexCoord2f(0.0,0.1);
  glVertex2f(-1.0+x, -1.0+y);
  glEnd();
}

void draw_poly8(float x, float y)
{
  glBegin(GL_POLYGON);

  glTexCoord2f(0.25,0.0);
  glVertex2f(-0.5+x, 1.0+y);

  glTexCoord2f(0.75,0.0);
  glVertex2f(0.5+x, 1.0+y);

  glTexCoord2f(1.0,0.25);
  glVertex2f(1.0+x, 0.5+y);

  glTexCoord2f(1.0,0.75);
  glVertex2f(1.0+x, -0.5+y);

  glTexCoord2f(0.75,1.0);
  glVertex2f(0.5+x, -1.0+y);

  glTexCoord2f(0.25,1.0);
  glVertex2f(-0.5+x, -1.0+y);

  glTexCoord2f(0.0,0.75);
  glVertex2f(-1.0+x, -0.5+y);

  glTexCoord2f(0.0,0.25);
  glVertex2f(-1.0+x, 0.5+y);

  glEnd();
}

static void redraw( Display *dpy, Window w )
{
   
   printf("Redraw event\n");

   glClear( GL_COLOR_BUFFER_BIT );
   glTexImage2D(GL_TEXTURE_2D,0,3,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,&texture[0]);

   glColor3f( 1.0, 1.0, 1.0 );

   glDepthFunc(GL_LESS);
   glEnable(GL_DEPTH_TEST);
   glFrontFace(GL_CW);
      
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
           
   glEnable(GL_CULL_FACE);
                       
   glShadeModel(GL_NONE);
   glEnable(GL_TEXTURE_2D);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glDisable(GL_LIGHTING);
   glDisable(GL_DITHER);
   glDepthFunc(GL_LESS),
   glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );

   glCullFace(GL_FRONT_AND_BACK);
   draw_poly8(0.0,0.0);
   draw_poly8(-2.4,2.5);
   draw_poly4(-2.5,-2.5);
   glXSwapBuffers( dpy, w );
}



static void resize( unsigned int width, unsigned int height )
{
   printf("Resize event\n");
   glViewport( 0, 0, width, height );
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho( LEFT, RIGHT, BOTTOM, TOP, -1.0, 1.0 );
}



static Window make_rgb_db_window( Display *dpy,
                                  unsigned int width, unsigned int height )
{
   int attrib[] = { GLX_RGBA,
                    GLX_RED_SIZE, 1,
                    GLX_GREEN_SIZE, 1,
                    GLX_BLUE_SIZE, 1,
                    GLX_DOUBLEBUFFER,
                    None };
   int scrnum;
   XSetWindowAttributes attr;
   unsigned long mask;
   Window root;
   Window win;
   GLXContext ctx;
   XVisualInfo *visinfo;

   scrnum = DefaultScreen( dpy );
   root = RootWindow( dpy, scrnum );

   visinfo = glXChooseVisual( dpy, scrnum, attrib );
   if (!visinfo) {
      printf("Error: couldn't get an RGB, Double-buffered visual\n");
      exit(1);
   }

   /* window attributes */
   attr.background_pixel = 0;
   attr.border_pixel = 0;
   attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
   attr.event_mask = StructureNotifyMask | ExposureMask;
   mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;

   win = XCreateWindow( dpy, root, 0, 0, width, height,
                        0, visinfo->depth, InputOutput,
                        visinfo->visual, mask, &attr );

   ctx = glXCreateContext( dpy, visinfo, NULL, 0 );

   glXMakeCurrent( dpy, win, ctx );

   return win;
}


static void event_loop( Display *dpy )
{
   XEvent event;

   while (1) {
      XNextEvent( dpy, &event );

      switch (event.type) {
         case Expose:
            redraw( dpy, event.xany.window );
            break;
         case ConfigureNotify:
            resize( event.xconfigure.width, event.xconfigure.height );
            break;
      }
   }
}



int main( int argc, char *argv[] )
{
   Display *dpy;
   Window win;

   dpy = XOpenDisplay(NULL);

   win = make_rgb_db_window( dpy, 300, 300 );

   glShadeModel( GL_NONE );
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK);
   glClearColor( 1.0, 1.0, 1.0, 1.0 );

   XMapWindow( dpy, win );

   event_loop( dpy );
   return 0;
}

Reply via email to