/*
- * screenflip - takes snapshots of the screen and flips it around
+ * flipscreen3d - takes snapshots of the screen and flips it around
*
* version 1.0 - Oct 24, 2001
*
* implied warranty.
*/
-#include <X11/Intrinsic.h>
-
-
#ifdef STANDALONE
-# define PROGCLASS "Screenflip"
-# define HACK_INIT init_screenflip
-# define HACK_DRAW draw_screenflip
-# define HACK_RESHAPE reshape_screenflip
-# define screenflip_opts xlockmore_opts
-/* insert defaults here */
-
-#define DEFAULTS "*delay: 20000 \n" \
- "*showFPS: False \n" \
- "*rotate: True \n" \
-
+#define DEFAULTS "*delay: 20000 \n" \
+ "*showFPS: False \n" \
+ "*wireframe: False \n" \
+ "*useSHM: True \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_screenflip 0
+# define release_screenflip 0
# include "xlockmore.h" /* from the xscreensaver distribution */
+# include "gltrackball.h"
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
#ifdef USE_GL
-#include <GL/glu.h>
+/* Should be in <GL/glext.h> */
+# ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+# endif
+# ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+# define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+# endif
-int rotate;
-
-int winw, winh;
-int tw, th; /* texture width, height */
-int tx, ty;
-GLfloat max_tx, max_ty;
+#define DEF_ROTATE "True"
+static int rotate;
#define QW 12
#define QH 12
-GLfloat qw = QW, qh = QH; /* q? are for the quad we'll draw */
-GLfloat qx = -6 , qy = 6;
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
static XrmOptionDescRec opts[] = {
- {"+rotate", ".screenflip.rotate", XrmoptionNoArg, (caddr_t) "false" },
- {"-rotate", ".screenflip.rotate", XrmoptionNoArg, (caddr_t) "true" },
+ {"+rotate", ".screenflip.rotate", XrmoptionNoArg, "false" },
+ {"-rotate", ".screenflip.rotate", XrmoptionNoArg, "true" },
};
static argtype vars[] = {
- {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
+ {&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
};
-ModeSpecOpt screenflip_opts = {countof(opts), opts, countof(vars), vars, NULL};
+ENTRYPOINT ModeSpecOpt screenflip_opts = {countof(opts), opts, countof(vars), vars, NULL};
#ifdef USE_MODULES
ModStruct screenflip_description =
-{"screenflip", "init_screenflip", "draw_screenflip", "release_screenflip",
+{"screenflip", "init_screenflip", "draw_screenflip", NULL,
"draw_screenflip", "init_screenflip", NULL, &screenflip_opts,
1000, 1, 2, 1, 4, 1.0, "",
"Screenflips", 0, NULL};
typedef struct {
GLXContext *glx_context;
Window window;
+
+ int winw, winh;
+ int tw, th; /* texture width, height */
+ GLfloat min_tx, min_ty;
+ GLfloat max_tx, max_ty;
+ GLfloat qx, qy, qw, qh; /* the quad we'll draw */
+
+ int regrab;
+ int fadetime; /* fade before regrab */
+
+ trackball_state *trackball;
+ Bool button_down_p;
+
+ GLfloat show_colors[4];
+ GLfloat stretch_val_x, stretch_val_y;
+ GLfloat stretch_val_dx, stretch_val_dy;
+
+ GLfloat curx, cury, curz;
+
+ GLfloat rx, ry, rz;
+ GLfloat rot, drot, odrot, ddrot, orot;
+ float theta, rho, dtheta, drho, gamma, dgamma;
+
+ GLuint texid;
+ Bool mipmap_p;
+ Bool waiting_for_image_p;
+ Bool first_image_p;
+
+ GLfloat anisotropic;
+
} Screenflip;
static Screenflip *screenflip = NULL;
-#include <math.h>
-#include <sys/time.h>
-#include <stdio.h>
-#include <stdlib.h>
#include "grab-ximage.h"
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
+static const GLfloat viewer[] = {0.0, 0.0, 15.0};
+
-static GLfloat viewer[] = {0.0, 0.0, 15.0};
+static void getSnapshot (ModeInfo *);
-int regrab = 0;
-int fadetime = 0; /* fade before regrab */
+
+ENTRYPOINT Bool
+screenflip_handle_event (ModeInfo *mi, XEvent *event)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
+
+ if (gltrackball_event_handler (event, c->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &c->button_down_p))
+ return True;
+ else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ if (!c->waiting_for_image_p)
+ {
+ getSnapshot (mi);
+ return True;
+ }
+ }
+
+ return False;
+}
/* draw the texture mapped quad (actually two back to back)*/
-void showscreen(int frozen)
+static void showscreen(Screenflip *c, int frozen, int wire)
{
- static GLfloat r = 1, g = 1, b = 1, a = 1;
- GLfloat qxw, qyh;
GLfloat x, y, w, h;
- /* static int stretch; */
- static GLfloat stretch_val_x = 0, stretch_val_y = 0;
- static GLfloat stretch_val_dx = 0, stretch_val_dy = 0;
- /* static int stretch_x = 0, stretch_y = 0; */
- if (fadetime) {
+ if (c->fadetime) {
/* r -= 0.02; g -= 0.02; b -= 0.02; */
- a -= 0.02;
- if (a < 0) {
- regrab = 1;
- fadetime = 0;
+ c->show_colors[3] -= 0.02;
+ if (c->show_colors[3] < 0) {
+ c->regrab = 1;
+ c->fadetime = 0;
}
- } else if (a < 0) {
- r = g = b = a = 1;
- stretch_val_x = stretch_val_y = stretch_val_dx = stretch_val_dy = 0;
+ } else if (c->show_colors[3] < 0) {
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+ c->stretch_val_x = c->stretch_val_y =
+ c->stretch_val_dx = c->stretch_val_dy = 0;
}
- if (stretch_val_dx == 0 && !frozen && !(random() % 25))
- stretch_val_dx = (float)(random() % 100) / 5000;
- if (stretch_val_dy == 0 && !frozen && !(random() % 25))
- stretch_val_dy = (float)(random() % 100) / 5000;
+ if (c->stretch_val_dx == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
+ if (c->stretch_val_dy == 0 && !frozen && !(random() % 25))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
- qxw = qx+qw;
- qyh = qy-qh;
- x = qx; y = qy;
- w = qxw; h = qyh;
+ x = c->qx;
+ y = c->qy;
+ w = c->qx+c->qw;
+ h = c->qy-c->qh;
if (!frozen) {
- w *= sin (stretch_val_x) + 1;
- x *= sin (stretch_val_x) + 1;
- if (!fadetime) stretch_val_x += stretch_val_dx;
- if (stretch_val_x > 2*M_PI && !(random() % 5))
- stretch_val_dx = (float)(random() % 100) / 5000;
+ w *= sin (c->stretch_val_x) + 1;
+ x *= sin (c->stretch_val_x) + 1;
+ if (!c->button_down_p) {
+ if (!c->fadetime) c->stretch_val_x += c->stretch_val_dx;
+ if (c->stretch_val_x > 2*M_PI && !(random() % 5))
+ c->stretch_val_dx = (float)(random() % 100) / 5000;
else
- stretch_val_x -= 2*M_PI;
-
- if (!fadetime) stretch_val_y += stretch_val_dy;
- h *= sin (stretch_val_y) / 2 + 1;
- y *= sin (stretch_val_y) / 2 + 1;
- if (stretch_val_y > 2*M_PI && !(random() % 5))
- stretch_val_dy = (float)(random() % 100) / 5000;
+ c->stretch_val_x -= 2*M_PI;
+ }
+
+ if (!c->button_down_p && !c->fadetime) c->stretch_val_y += c->stretch_val_dy;
+ h *= sin (c->stretch_val_y) / 2 + 1;
+ y *= sin (c->stretch_val_y) / 2 + 1;
+ if (!c->button_down_p) {
+ if (c->stretch_val_y > 2*M_PI && !(random() % 5))
+ c->stretch_val_dy = (float)(random() % 100) / 5000;
else
- stretch_val_y -= 2*M_PI;
+ c->stretch_val_y -= 2*M_PI;
+ }
}
- glColor4f(r, g, b, a);
+ glColor4f(c->show_colors[0], c->show_colors[1],
+ c->show_colors[2], c->show_colors[3]);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDepthMask(GL_FALSE);
+ if (!wire)
+ {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDepthMask(GL_FALSE);
+ }
- glBegin(GL_QUADS);
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
glNormal3f(0, 0, 1);
-
- glTexCoord2f(0, max_ty);
- glVertex3f(x, y, 0);
-
- glTexCoord2f(max_tx, max_ty);
- glVertex3f(w, y, 0);
-
- glTexCoord2f(max_tx, 0);
- glVertex3f(w, h, 0);
-
- glTexCoord2f(0, 0);
- glVertex3f(x, h, 0);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, 0);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, 0);
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, 0);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, 0);
glNormal3f(0, 0, -1);
-
- glTexCoord2f(0, max_ty);
- glVertex3f(x, y, -0.05);
-
- glTexCoord2f(0, 0);
- glVertex3f(x, h, -0.05);
-
- glTexCoord2f(max_tx, 0);
- glVertex3f(w, h, -0.05);
-
- glTexCoord2f(max_tx, max_ty);
- glVertex3f(w, y, -0.05);
-
+ glTexCoord2f(c->min_tx, c->min_ty); glVertex3f(x, y, -0.05);
+ glTexCoord2f(c->max_tx, c->min_ty); glVertex3f(w, y, -0.05);
+ glTexCoord2f(c->max_tx, c->max_ty); glVertex3f(w, h, -0.05);
+ glTexCoord2f(c->min_tx, c->max_ty); glVertex3f(x, h, -0.05);
glEnd();
* it just does a glTranslatef() and returns 1
*/
-int inposition(void)
+static int inposition(Screenflip *c)
{
- static GLfloat curx, cury, curz = 0;
GLfloat wx;
GLfloat wy;
- wx = 0 - (qw/2);
- wy = (qh/2);
-
- if (curx == 0) curx = qx;
- if (cury == 0) cury = qy;
- if (regrab) {
- curz = 0;
- curx = qx;
- cury = qy;
- regrab = 0;
+ wx = 0 - (c->qw/2);
+ wy = (c->qh/2);
+
+ if (c->curx == 0) c->curx = c->qx;
+ if (c->cury == 0) c->cury = c->qy;
+ if (c->regrab) {
+ c->curz = 0;
+ c->curx = c->qx;
+ c->cury = c->qy;
+ c->regrab = 0;
}
- if (curz > -10 || curx > wx + 0.1 || curx < wx - 0.1 ||
- cury > wy + 0.1 || cury < wy - 0.1) {
- if (curz > -10)
- curz -= 0.05;
- if (curx > wx) {
- qx -= 0.02;
- curx -= 0.02;
+ if (c->curz > -10 || c->curx > wx + 0.1 || c->curx < wx - 0.1 ||
+ c->cury > wy + 0.1 || c->cury < wy - 0.1) {
+ if (c->curz > -10)
+ c->curz -= 0.05;
+ if (c->curx > wx) {
+ c->qx -= 0.02;
+ c->curx -= 0.02;
}
- if (curx < wx) {
- qx += 0.02;
- curx += 0.02;
+ if (c->curx < wx) {
+ c->qx += 0.02;
+ c->curx += 0.02;
}
- if (cury > wy) {
- qy -= 0.02;
- cury -= 0.02;
+ if (c->cury > wy) {
+ c->qy -= 0.02;
+ c->cury -= 0.02;
}
- if (cury < wy) {
- qy += 0.02;
- cury += 0.02;
+ if (c->cury < wy) {
+ c->qy += 0.02;
+ c->cury += 0.02;
}
- glTranslatef(0, 0, curz);
+ glTranslatef(0, 0, c->curz);
return 0;
}
- glTranslatef(0, 0, curz);
+ glTranslatef(0, 0, c->curz);
return 1;
}
-void drawgrid(void)
+#if 0
+static void drawgrid(void)
{
int i;
}
glEnd();
}
+#endif
+
-void display(void)
+static void display(Screenflip *c, int wire)
{
- static GLfloat rx=1, ry=1, rz=0;
- static GLfloat rot = 0;
- static GLfloat drot = 0;
- static GLfloat odrot = 1;
- static GLfloat ddrot = 0;
- static float theta = 0, rho = 0, dtheta = 0, drho = 0, gamma = 0, dgamma = 0;
- static GLfloat orot;
int frozen;
+ GLfloat rot = current_device_rotation();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
- if (inposition()) {
+/*
+ glRotatef(rot, 0, 0, 1);
+ if ((rot > 45 && rot < 135) ||
+ (rot < -45 && rot > -135))
+ {
+ GLfloat s = c->winw / (GLfloat) c->winh;
+ glScalef (s, 1/s, 1);
+ }
+*/
+
+ if (inposition(c)) {
frozen = 0;
- glTranslatef(5 * sin(theta), 5 * sin(rho), 10 * cos(gamma) - 10);
+ glTranslatef(5 * sin(c->theta), 5 * sin(c->rho), 10 * cos(c->gamma) - 10);
/* randomly change the speed */
- if (!(random() % 300)) {
+ if (!c->button_down_p && !(random() % 300)) {
if (random() % 2)
- drho = 1/60 - (float)(random() % 100)/3000;
+ c->drho = 1/60 - (float)(random() % 100)/3000;
if (random() % 2)
- dtheta = 1/60 - (float)(random() % 100)/3000;
+ c->dtheta = 1/60 - (float)(random() % 100)/3000;
if (random() % 2)
- dgamma = 1/60 - (float)(random() % 100)/3000;
+ c->dgamma = 1/60 - (float)(random() % 100)/3000;
}
- if (rotate) glRotatef(rot, rx, ry, rz);
+ glRotatef(rot, 0, 0, 1);
+ gltrackball_rotate (c->trackball);
+ glRotatef(-rot, 0, 0, 1);
+ if (rotate) glRotatef(c->rot, c->rx, c->ry, c->rz);
/* update variables with each frame */
- if (!fadetime) {
- theta += dtheta;
- rho += drho;
- gamma += dgamma;
- rot += drot;
- drot += ddrot;
+ if(!c->button_down_p && !c->fadetime) {
+ c->theta += c->dtheta;
+ c->rho += c->drho;
+ c->gamma += c->dgamma;
+ c->rot += c->drot;
+ c->drot += c->ddrot;
}
/* dont let our rotation speed get too high */
- if (drot > 5 && ddrot > 0)
- ddrot = 0 - (GLfloat)(random() % 100) / 1000;
- else if (drot < -5 && ddrot < 0)
- ddrot = (GLfloat)(random() % 100) / 1000;
+ if (c->drot > 5 && c->ddrot > 0)
+ c->ddrot = 0 - (GLfloat)(random() % 100) / 1000;
+ else if (c->drot < -5 && c->ddrot < 0)
+ c->ddrot = (GLfloat)(random() % 100) / 1000;
} else { /* reset some paramaters */
- ddrot = 0.05 - (GLfloat)(random() % 100) / 1000;
- theta = rho = gamma = 0;
- rot = 0;
+ c->ddrot = 0.05 - (GLfloat)(random() % 100) / 1000;
+ c->theta = c->rho = c->gamma = 0;
+ c->rot = 0;
frozen = 1;
}
- if (!fadetime && (rot >= 360 || rot <= -360) && !(random() % 7)) { /* rotate change */
- rx = (GLfloat)(random() % 100) / 100;
- ry = (GLfloat)(random() % 100) / 100;
- rz = (GLfloat)(random() % 100) / 100;
+ if (!c->button_down_p && !c->fadetime && (c->rot >= 360 || c->rot <= -360) && !(random() % 7)) { /* rotate change */
+ c->rx = (GLfloat)(random() % 100) / 100;
+ c->ry = (GLfloat)(random() % 100) / 100;
+ c->rz = (GLfloat)(random() % 100) / 100;
}
- if (odrot * drot < 0 && tw < winw && !(random() % 10)) {
- fadetime = 1; /* randomly fade and get new snapshot */
+ if (c->odrot * c->drot < 0 && c->tw < c->winw && !(random() % 10)) {
+ c->fadetime = 1; /* randomly fade and get new snapshot */
}
- orot = rot;
- odrot = drot;
- if (rot > 360 || rot < -360) /* dont overflow rotation! */
- rot -= rot;
- showscreen(frozen);
+ c->orot = c->rot;
+ c->odrot = c->drot;
+ if (c->rot > 360 || c->rot < -360) /* dont overflow rotation! */
+ c->rot -= c->rot;
+ showscreen(c, frozen, wire);
glPopMatrix();
glFlush();
}
-void reshape_screenflip(ModeInfo *mi, int width, int height)
+ENTRYPOINT void reshape_screenflip(ModeInfo *mi, int width, int height)
{
+ Screenflip *c = &screenflip[MI_SCREEN(mi)];
glViewport(0,0,(GLint)width, (GLint) height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 1, 2.0, 85);
glMatrixMode(GL_MODELVIEW);
- winw = width;
- winh = height;
+ c->winw = width;
+ c->winh = height;
}
-void getSnapshot (ModeInfo *modeinfo)
+static void
+image_loaded_cb (const char *filename, XRectangle *geometry,
+ int image_width, int image_height,
+ int texture_width, int texture_height,
+ void *closure)
{
- XImage *ximage;
-
- ximage = screen_to_ximage (modeinfo->xgwa.screen, modeinfo->window);
-
- qw = QW; qh = QH;
- tw = modeinfo->xgwa.width;
- th = modeinfo->xgwa.height;
-
- qx += (qw*tw/winw);
- qy -= (qh*th/winh);
+ Screenflip *c = (Screenflip *) closure;
+
+ c->tw = texture_width;
+ c->th = texture_height;
+ c->min_tx = (GLfloat) geometry->x / c->tw;
+ c->min_ty = (GLfloat) geometry->y / c->th;
+ c->max_tx = (GLfloat) (geometry->x + geometry->width) / c->tw;
+ c->max_ty = (GLfloat) (geometry->y + geometry->height) / c->th;
+
+ c->qx = -QW/2 + ((GLfloat) geometry->x * QW / image_width);
+ c->qy = QH/2 - ((GLfloat) geometry->y * QH / image_height);
+ c->qw = QW * ((GLfloat) geometry->width / image_width);
+ c->qh = QH * ((GLfloat) geometry->height / image_height);
+
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ (c->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
+
+ if (c->anisotropic >= 1.0)
+ glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,
+ c->anisotropic);
+
+ c->waiting_for_image_p = False;
+ c->first_image_p = False;
+}
- qw *= (GLfloat)tw/winw;
- qh *= (GLfloat)th/winh;
- max_tx = (GLfloat) tw / (GLfloat) ximage->width;
- max_ty = (GLfloat) th / (GLfloat) ximage->height;
+static void getSnapshot (ModeInfo *modeinfo)
+{
+ Screenflip *c = &screenflip[MI_SCREEN(modeinfo)];
+ if (MI_IS_WIREFRAME(modeinfo))
+ return;
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_LINEAR_MIPMAP_LINEAR);
- if (gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
- ximage->width, ximage->height,
- GL_RGBA, GL_UNSIGNED_BYTE, ximage->data)) {
- printf("Error!\n");
- exit(1);
- }
- free(ximage->data);
- ximage->data = 0;
- XDestroyImage (ximage);
+ c->waiting_for_image_p = True;
+ c->mipmap_p = True;
+ load_texture_async (modeinfo->xgwa.screen, modeinfo->window,
+ *c->glx_context, 0, 0, c->mipmap_p, c->texid,
+ image_loaded_cb, c);
}
-void init_screenflip(ModeInfo *mi)
+ENTRYPOINT void init_screenflip(ModeInfo *mi)
{
int screen = MI_SCREEN(mi);
Screenflip *c;
- if (screenflip == NULL) {
- if ((screenflip = (Screenflip *) calloc(MI_NUM_SCREENS(mi),
- sizeof(Screenflip))) == NULL)
- return;
- }
+ MI_INIT(mi, screenflip);
c = &screenflip[screen];
c->window = MI_WINDOW(mi);
+ c->trackball = gltrackball_init (False);
+
if ((c->glx_context = init_GL(mi)) != NULL) {
reshape_screenflip(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
} else {
MI_CLEARWINDOW(mi);
}
- winh = MI_WIN_HEIGHT(mi);
- winw = MI_WIN_WIDTH(mi);
- glClearColor(0.0,0.0,0.0,0.0);
- glShadeModel(GL_SMOOTH);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_FRONT);
- glDisable(GL_LIGHTING);
-
+ c->winh = MI_WIN_HEIGHT(mi);
+ c->winw = MI_WIN_WIDTH(mi);
+ c->qw = QW;
+ c->qh = QH;
+ c->qx = -6;
+ c->qy = 6;
+
+ c->rx = c->ry = 1;
+ c->odrot = 1;
+
+ c->show_colors[0] = c->show_colors[1] =
+ c->show_colors[2] = c->show_colors[3] = 1;
+
+ if (! MI_IS_WIREFRAME(mi))
+ {
+ glShadeModel(GL_SMOOTH);
+ glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glDisable(GL_LIGHTING);
+ }
+
+ if (strstr ((char *) glGetString(GL_EXTENSIONS),
+ "GL_EXT_texture_filter_anisotropic"))
+ glGetFloatv (GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &c->anisotropic);
+ else
+ c->anisotropic = 0.0;
+
+ glGenTextures(1, &c->texid);
+
+ c->first_image_p = True;
getSnapshot(mi);
}
-void draw_screenflip(ModeInfo *mi)
+ENTRYPOINT void draw_screenflip(ModeInfo *mi)
{
Screenflip *c = &screenflip[MI_SCREEN(mi)];
Window w = MI_WINDOW(mi);
if (!c->glx_context)
return;
- glXMakeCurrent(disp, w, *(c->glx_context));
+ /* Wait for the first image; for subsequent images, load them in the
+ background while animating. */
+ if (c->waiting_for_image_p && c->first_image_p)
+ return;
+
+ glXMakeCurrent(disp, w, *(c->glx_context));
+
+ glBindTexture(GL_TEXTURE_2D, c->texid);
- if (regrab)
+ if (c->regrab)
getSnapshot(mi);
- display();
+ display(c, MI_IS_WIREFRAME(mi));
if(mi->fps_p) do_fps(mi);
glFinish();
glXSwapBuffers(disp, w);
}
-void release_screenflip(ModeInfo *mi)
-{
- if (screenflip != NULL) {
- (void) free((void *) screenflip);
- screenflip = NULL;
- }
- FreeAllGL(MI);
-}
+XSCREENSAVER_MODULE_2 ("FlipScreen3D", flipscreen3d, screenflip)
#endif