/* Sets the 'act' flag for pieces which will undergo the rotation. */ static void flag_pieces(piece_t pieces[27], int axis, int side) { int i, j; float q[4]; for(i = 0; i < 27; i++) { q[0] = 0; q[1] = pieces[i].pos[0]; q[2] = pieces[i].pos[1]; q[3] = pieces[i].pos[2]; mult_quat(pieces[i].qr, q); for(j = 1; j < 4; j++) q[j] = -q[j]; mult_quat(pieces[i].qr, q); for(j = 1; j < 4; j++) q[j] = -q[j]; if(fabs(q[axis] - side) < 0.1) pieces[i].act = True; else pieces[i].act = False; } }
static Bool draw_main(ModeInfo *mi, rubikblocks_conf *cp) { int i; double x, y, z; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); get_position(cp->rot, &x, &y, &z, !cp->button_down); glTranslatef((x-0.5)*6, (y-0.5)*6, -20); gltrackball_rotate(cp->trackball); get_rotation(cp->rot, &x, &y, &z, !cp->button_down); glRotatef(x*360, 1, 0, 0); glRotatef(y*360, 0, 1, 0); glRotatef(z*360, 0, 0, 1); glScalef(size, size, size); # 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 if(cp->wire) glColor3f(0.7, 0.7, 0.7); if(!cp->pause) for(i = 0; i < 27; i++) if(cp->pieces[i].act) mult_quat(cp->qfram, cp->pieces[i].qr); for(i = 0; i < 27; i++) { glPushMatrix(); if(fabs(cp->pieces[i].qr[0]) < 1) glRotatef(360/M_PI*acos(cp->pieces[i].qr[0]), cp->pieces[i].qr[1], cp->pieces[i].qr[2], cp->pieces[i].qr[3]); glCallList(cp->list_base + i); glPopMatrix(); } if((cp->t += tspeed) > cp->tmax) finish(cp); return True; }
static void randomize(rubikblocks_conf *cp) { int axis, side; int i, j; for(i = 0; i < SHUFFLE; i++) { axis = (random()%3)+1; side = rnd01()*2-1; flag_pieces(cp->pieces, axis, side); for(j = 1; j < 4; j++) cp->qfram[j] = 0; cp->qfram[0] = M_SQRT1_2; cp->qfram[axis] = M_SQRT1_2; for(j = 0; j < 27; j++) { if(cp->pieces[j].act) mult_quat(cp->qfram, cp->pieces[j].qr); } } }
static Bool draw_main(ModeInfo *mi, rubikblocks_conf *cp) { int i; double x, y, z; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); get_position(cp->rot, &x, &y, &z, !cp->button_down); glTranslatef((x-0.5)*6, (y-0.5)*6, -20); /* Do it twice because we don't track the device's orientation. */ glRotatef( current_device_rotation(), 0, 0, 1); gltrackball_rotate(cp->trackball); glRotatef(-current_device_rotation(), 0, 0, 1); get_rotation(cp->rot, &x, &y, &z, !cp->button_down); glRotatef(x*360, 1, 0, 0); glRotatef(y*360, 0, 1, 0); glRotatef(z*360, 0, 0, 1); glScalef(size, size, size); if(cp->wire) glColor3f(0.7, 0.7, 0.7); if(!cp->pause) for(i = 0; i < 27; i++) if(cp->pieces[i].act) mult_quat(cp->qfram, cp->pieces[i].qr); for(i = 0; i < 27; i++) { glPushMatrix(); if(fabs(cp->pieces[i].qr[0]) < 1) glRotatef(360/M_PI*acos(cp->pieces[i].qr[0]), cp->pieces[i].qr[1], cp->pieces[i].qr[2], cp->pieces[i].qr[3]); glCallList(cp->list_base + i); glPopMatrix(); } if((cp->t += tspeed) > cp->tmax) finish(cp); return True; }