"*wireframe: False \n"
# define refresh_providence 0
+# define release_providence 0
#include "xlockmore.h"
#else
#include "xlock.h"
#ifdef USE_MODULES
ModStruct providence_description = {
"providence", "init_providence", "draw_providence",
- "release_providence", "draw_providence", "change_providence",
+ (char *) NULL, "draw_providence", "change_providence",
(char *) NULL, &providence_opts, 1000, 1, 1, 1, 4, 1.0, "",
"draws pyramid with glory", 0, NULL
};
#define EYE_PARTICLE_COUNT 2000
-#define LOOKUPSIZE 3600
+#define LOOKUPSIZE (3600/5) /* 3600 was way too much RAM on iOS */
#define EYELENGTH 300
#define EPSILON 0.0001
glGenTextures(1, &mp->bricktexture);
glBindTexture(GL_TEXTURE_2D, mp->bricktexture);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, 3, checkImageWidth,
checkImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE,
&mp->checkImage[0][0]);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
int x = mp->eyeparticles[i][1] + random()%(cos(mp->theta) < 0.0 ? 8 : 16);
/* reset if dead */
- if(x > EYELENGTH || random()%(cos(mp->theta) < 0.0 ? 40 : 10) == 0) {
+ if(x >= EYELENGTH || random()%(cos(mp->theta) < 0.0 ? 40 : 10) == 0) {
/* if(x > EYELENGTH || (x > EYELENGTH/(2/3.0) && random()%7 == 0)) { */
mp->eyeparticles[i][0] = random()%LOOKUPSIZE;
{
glClearDepth(1.0);
- /* setup twoside lighting */
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
- glLightfv(GL_LIGHT0, GL_POSITION, mp->position0);
-
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
- glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
-
mp->currenttime = 0.0;
init_particles(mp);
make_brick(mp);
build_eye(mp);
- glEnable(GL_NORMALIZE);
- glFrontFace(GL_CCW);
-/* glDisable(GL_CULL_FACE); */
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
-
/* build pyramid list */
mp->pyramidlist = glGenLists(1);
glNewList(mp->pyramidlist, GL_COMPILE);
glEndList();
}
-/* cleanup routine */
-ENTRYPOINT void release_providence(ModeInfo * mi)
-{
-
- if(providence) {
- free((void *) providence);
- providence = (providencestruct *) NULL;
- }
-
- FreeAllGL(mi);
-}
-
/* event handling */
ENTRYPOINT Bool providence_handle_event(ModeInfo *mi, XEvent *event)
{
switch(event->xany.type) {
case ButtonPress:
-
switch(event->xbutton.button) {
-
- case Button1:
- mp->button_down_p = True;
- gltrackball_start(mp->trackball,
- event->xbutton.x, event->xbutton.y,
- MI_WIDTH (mi), MI_HEIGHT (mi));
- break;
-
case Button4:
mp->camera_velocity += 1.0;
- break;
-
+ return True;
case Button5:
mp->camera_velocity -= 1.0;
+ return True;
+ default:
break;
}
-
break;
-
- case ButtonRelease:
-
- switch(event->xbutton.button) {
- case Button1:
- mp->button_down_p = False;
- break;
- }
-
- break;
-
- case MotionNotify:
- if(mp->button_down_p)
- gltrackball_track(mp->trackball,
- event->xmotion.x, event->xmotion.y,
- MI_WIDTH (mi), MI_HEIGHT (mi));
- break;
-
default:
- return False;
+ break;
}
- return True;
+ if (gltrackball_event_handler (event, mp->trackball,
+ MI_WIDTH (mi), MI_HEIGHT (mi),
+ &mp->button_down_p))
+ return True;
+
+ return False;
}
ENTRYPOINT void init_providence(ModeInfo *mi)
{
providencestruct *mp;
- if(!providence) {
- if((providence = (providencestruct *)
- calloc(MI_NUM_SCREENS(mi), sizeof (providencestruct))) == NULL)
- return;
- }
+ MI_INIT(mi, providence, NULL);
mp = &providence[MI_SCREEN(mi)];
- mp->trackball = gltrackball_init ();
+ mp->trackball = gltrackball_init (False);
mp->position0[0] = 1;
mp->position0[1] = 5;
mp->mono = MI_IS_MONO(mi);
mp->wire = MI_IS_WIREFRAME(mi);
+# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */
+ mp->wire = 0;
+# endif
+
/* make multiple screens rotate at slightly different rates. */
mp->theta_scale = 0.7 + frand(0.6);
if((mp->glx_context = init_GL(mi)) != NULL) {
reshape_providence(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
- glDrawBuffer(GL_BACK);
+ /* glDrawBuffer(GL_BACK); */
pinit(mp);
}
else
glXMakeCurrent(display, window, *(mp->glx_context));
+ /* setup twoside lighting */
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, mp->position0);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_NORMALIZE);
+ glFrontFace(GL_CCW);
+/* glDisable(GL_CULL_FACE); */
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
+ glRotatef(current_device_rotation(), 0, 0, 1);
/* modify camera */
if(fabs(mp->camera_velocity) > EPSILON) {
gltrackball_rotate(mp->trackball);
glRotatef(mp->theta * 180.0 / Pi, 0.0, -1.0, 0.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
+
/* draw providence */
draw_providence_strip(mi);
glPopMatrix();