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;
}