X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Ftopblock.c;h=ddf1eb1cd113c2cb6a5cfcaf7ba2af36c1aa72cc;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=008882d3642c0b822cfbbcf9a7850163425f393d;hpb=f8cf5ac7b2f53510f80a0eaf286a25298be17bfe;p=xscreensaver diff --git a/hacks/glx/topblock.c b/hacks/glx/topblock.c index 008882d3..ddf1eb1c 100644 --- a/hacks/glx/topblock.c +++ b/hacks/glx/topblock.c @@ -29,6 +29,7 @@ History #include # define refresh_topBlock 0 +# define release_topBlock 0 #define DEFAULTS "*delay: 10000 \n" \ "*count: 30 \n" \ @@ -47,7 +48,7 @@ History #ifdef USE_GL /* whole file */ -#ifndef HAVE_COCOA +#ifndef HAVE_JWXYZ # include #endif @@ -55,6 +56,10 @@ typedef struct { GLXContext *glx_context; trackball_state *trackball; + GLfloat rotateSpeed; + GLfloat dropSpeed; + int maxFalling; + int resolution; Bool button_down_p; int numFallingBlocks; GLfloat highest,highestFalling; @@ -72,22 +77,22 @@ typedef struct } topBlockSTATE; /* parameter vars */ -Bool override; -Bool rotate; -Bool follow; -Bool drawCarpet; -Bool drawBlob; -Bool drawNipples; -GLfloat rotateSpeed; -GLfloat camX; -GLfloat camY; -GLfloat camZ; -GLfloat dropSpeed; -int maxFalling; -int maxColors; -int size; -int spawn; -int resolution; +static Bool override; +static Bool rotate; +static Bool follow; +static Bool drawCarpet; +static Bool drawBlob; +static Bool drawNipples; +static GLfloat rotateSpeed; +static GLfloat camX; +static GLfloat camY; +static GLfloat camZ; +static GLfloat dropSpeed; +static int maxFalling; +static int maxColors; +static int size; +static int spawn; +static int resolution; static XrmOptionDescRec opts[] = { { "-size", ".size", XrmoptionSepArg, 0 }, @@ -147,7 +152,7 @@ static argtype vars[] = { static topBlockSTATE *tbs = NULL; -ModeSpecOpt topBlock_opts = {countof(opts), opts, countof(vars), vars, NULL}; +static ModeSpecOpt topBlock_opts = {countof(opts), opts, countof(vars), vars, NULL}; /* Window management, etc */ ENTRYPOINT void @@ -164,8 +169,8 @@ reshape_topBlock (ModeInfo *mi, int width, int height) } /* clean up on exit, not required ... */ -ENTRYPOINT void -release_topBlock(ModeInfo *mi) +static void +free_topBlock(ModeInfo *mi) { topBlockSTATE *tb = &tbs[MI_SCREEN(mi)]; NODE *llCurrent, *llOld; @@ -184,11 +189,7 @@ init_topBlock (ModeInfo *mi) topBlockSTATE *tb; int wire = MI_IS_WIREFRAME(mi); - if (!tbs) { - tbs = (topBlockSTATE *) - calloc (MI_NUM_SCREENS(mi), sizeof (topBlockSTATE)); - if (!tbs) abort(); - } + MI_INIT (mi, tbs, free_topBlock); tb = &tbs[MI_SCREEN(mi)]; @@ -204,27 +205,31 @@ init_topBlock (ModeInfo *mi) tb->carpetWidth = 8 * size; tb->carpetLength = tb->carpetWidth; - maxFalling*=size; + tb->maxFalling = maxFalling; + tb->maxFalling*=size; if (spawn<4) { spawn=4; } if (spawn>1000) { spawn=1000; } - if (rotateSpeed<1) {rotateSpeed=1; } - if (rotateSpeed>1000) {rotateSpeed=1000;} - rotateSpeed /= 100; + tb->rotateSpeed = rotateSpeed; + if (tb->rotateSpeed<1) {tb->rotateSpeed=1; } + if (tb->rotateSpeed>1000) {tb->rotateSpeed=1000;} + tb->rotateSpeed /= 100; - if (resolution<4) {resolution=4;} - if (resolution>20) {resolution=20;} - resolution*=2; + tb->resolution = resolution; + if (tb->resolution<4) {tb->resolution=4;} + if (tb->resolution>20) {tb->resolution=20;} + tb->resolution*=2; if (maxColors<1) {maxColors=1;} if (maxColors>8) {maxColors=8;} - if (dropSpeed<1) {dropSpeed=1;} - if (dropSpeed>9) {dropSpeed=9;} /* 10+ produces blocks that can pass through each other */ + tb->dropSpeed = dropSpeed; + if (tb->dropSpeed<1) {tb->dropSpeed=1;} + if (tb->dropSpeed>9) {tb->dropSpeed=9;} /* 10+ produces blocks that can pass through each other */ - dropSpeed = 80/dropSpeed; - dropSpeed = (blockHeight/dropSpeed); + tb->dropSpeed = 80/tb->dropSpeed; + tb->dropSpeed = (blockHeight/tb->dropSpeed); reshape_topBlock (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); glClearDepth(1.0f); @@ -279,7 +284,7 @@ init_topBlock (ModeInfo *mi) tb->eyeY=20; tb->eyeZ=0; } - tb->trackball = gltrackball_init (); + tb->trackball = gltrackball_init (False); } /* provides the per frame entertainment */ @@ -303,7 +308,7 @@ draw_topBlock (ModeInfo *mi) generateNewBlock(mi); - if (rotate && (!tb->button_down_p)) { tb->rotation += rotateSpeed; } + if (rotate && (!tb->button_down_p)) { tb->rotation += tb->rotateSpeed; } if (tb->rotation>=360) { tb->rotation=tb->rotation-360; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* clear current */ @@ -319,17 +324,23 @@ draw_topBlock (ModeInfo *mi) followBlock(mi); } - glScalef (-1, 1, 1); - glTranslatef (0, 0, -10); - glRotatef(-current_device_rotation(), 0, 0, 1); + /* Rotate the scene around a point that's a little higher up. */ + glTranslatef (0, 0, -5); gltrackball_rotate (tb->trackball); - glRotatef(current_device_rotation(), 0, 0, 1); - glTranslatef (0, 0, 10); - glScalef (-1, 1, 1); + glTranslatef (0, 0, 5); /* rotate the world */ glRotatef(tb->rotation, 0.0, 0.0, 1.0); +# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */ + { + GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi); + int o = (int) current_device_rotation(); + if (o != 0 && o != 180 && o != -180) + glScalef (1/h, 1/h, 1/h); + } +# endif + llCurrent = tb->blockNodeRoot; if (drawCarpet) { /* center carpet */ @@ -403,7 +414,7 @@ draw_topBlock (ModeInfo *mi) spcN2y = 0; if (llCurrent->height>tb->highestFalling) {tb->highestFalling=llCurrent->height;} /* all blocks fall at the same rate to avoid mid air collisions */ - llCurrent->height-=dropSpeed; + llCurrent->height-=tb->dropSpeed; if (llCurrent->height<=0) { llCurrent->falling=0; if (tb->highest==0) { @@ -492,7 +503,7 @@ draw_topBlock (ModeInfo *mi) if (mi->fps_p) do_fps (mi); glFinish(); - if (tb->highest>(5*maxFalling)) { drawCarpet=False; } + if (tb->highest>(5*tb->maxFalling)) { drawCarpet=False; } glXSwapBuffers(dpy, window); } @@ -578,7 +589,7 @@ static void generateNewBlock(ModeInfo *mi) llTail = llCurrent; tb->blockNodeRoot = llCurrent; } else { - if (tb->numFallingBlocks>=maxFalling) { + if (tb->numFallingBlocks>=tb->maxFalling) { /* recycle */ llCurrent=llTail->next; tb->blockNodeRoot=llCurrent->next; @@ -616,7 +627,7 @@ static void generateNewBlock(ModeInfo *mi) llCurrent->y=(startOffy-(tb->carpetLength/2)) + getLocation(random() % ((tb->carpetLength/2)+endOffy) ); llCurrent->color=(random() % maxColors); llCurrent->height=getHeight(tb->plusheight+tb->highest); - if (tb->numFallingBlocks>=maxFalling) { + if (tb->numFallingBlocks>=tb->maxFalling) { tb->numFallingBlocks--; tb->numFallingBlocks--; } @@ -696,7 +707,7 @@ static void buildCarpet(ModeInfo *mi) tb->carpet_polys += tube(0, 0, -0.1, 0, 0, 0.26, cylSize, 0, - resolution, True, True, + tb->resolution, True, True, wire); glRotatef(180, 0.0f, 1.0f, 0.0f); /* they are upside down */ glRotatef(180, 0.0f, 1.0f, 0.0f); /* recover */ @@ -752,7 +763,7 @@ static void buildBlock(ModeInfo *mi) tb->block_polys += tube(0, 0, 0, 0, 0, 0.25, cylSize, 0, - resolution, True, True, + tb->resolution, True, True, wire); glTranslatef(0.0f,0.0f,0.25f); /* move to the cylinder cap */ glTranslatef(0.0f,0.0f,-0.25f); /* move back from the cylinder cap */ @@ -772,7 +783,7 @@ static void buildBlock(ModeInfo *mi) tb->block_polys += tube(0, 0, 0.1, 0, 0, 1.4, uddSize, 0, - resolution, True, True, wire); + tb->resolution, True, True, wire); glTranslatef(0.0f,-1.0f,0.0f); /* move to the center */ } } @@ -792,11 +803,11 @@ static void buildBlobBlock(ModeInfo *mi) glNewList(tb->block,GL_COMPILE); glPushMatrix(); glScalef(1.4,1.4,1.4); - unit_sphere (resolution/2,resolution, wire); + unit_sphere (tb->resolution/2,tb->resolution, wire); glPopMatrix(); glTranslatef(0.0f,-2.0f,0.0f); glScalef(1.4,1.4,1.4); - unit_sphere (resolution/2,resolution, wire); + unit_sphere (tb->resolution/2,tb->resolution, wire); glEndList(); } @@ -806,7 +817,12 @@ ENTRYPOINT Bool topBlock_handle_event (ModeInfo *mi, XEvent *event) { topBlockSTATE *tb = &tbs[MI_SCREEN(mi)]; - if (event->xany.type == KeyPress) { + + if (gltrackball_event_handler (event, tb->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &tb->button_down_p)) + return True; + else if (event->xany.type == KeyPress) { KeySym keysym; char c = 0; XLookupString (&event->xkey, &c, 1, &keysym, 0); @@ -851,40 +867,8 @@ topBlock_handle_event (ModeInfo *mi, XEvent *event) return True; } } - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - tb->button_down_p = True; - gltrackball_start (tb->trackball, - event->xbutton.x, event->xbutton.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - else if (event->xany.type == ButtonRelease && - event->xbutton.button == Button1) - { - tb->button_down_p = False; - return True; - } - else if (event->xany.type == ButtonPress && - (event->xbutton.button == Button4 || - event->xbutton.button == Button5 || - event->xbutton.button == Button6 || - event->xbutton.button == Button7)) - { - gltrackball_mousewheel (tb->trackball, event->xbutton.button, 10, - !!event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - tb->button_down_p) - { - gltrackball_track (tb->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - return False; + + return False; } /* this is tha main change for v5 compatability and acompanying ENTRYPOINTS */