static int display(Queenscreen *qs) { int polys = 0; glClear(clearbits); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* setup light attenuation */ glEnable(GL_COLOR_MATERIAL); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha(qs))); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.06); /** setup perspective */ glTranslatef(0.0, 0.0, -1.5*qs->BOARDSIZE); glRotatef(30.0, 1.0, 0.0, 0.0); gltrackball_rotate (qs->trackball); glRotatef(qs->theta*100, 0.0, 1.0, 0.0); glTranslatef(-0.5*qs->BOARDSIZE, 0.0, -0.5*qs->BOARDSIZE); /* find light positions */ qs->position[0] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*-sin(qs->theta*100*M_PI/180.0); qs->position[2] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*cos(qs->theta*100*M_PI/180.0); qs->position[1] = 6.0; if(!wire) { glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_POSITION, qs->position); glEnable(GL_LIGHT0); } /* draw reflections */ if(!wire) { polys += draw_reflections(qs); glEnable(GL_BLEND); } polys += drawBoard(qs); if(!wire) glDisable(GL_BLEND); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1); glTranslatef(0.5, 0.0, 0.5); polys += drawPieces(qs); /* rotate camera */ if(!qs->button_down_p) qs->theta += .002; /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */ if(++qs->steps == 1024) { qs->steps = 0; blank(qs); qs->BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1)); qs->colorset = (qs->colorset+1)%COLORSETS; go(qs); } return polys; }
// sifting methods Token* BinaryTree::treeIterate(Token* currentToken) { // idea here is to be able to call one method from print to go to the next alphabetical member of the tree // will need to keep track of the token family members in order to go in the right order // some interesting cases will come up when the tree is incomplete in some ways // also need to avoid calling the same token more than once // perhaps some sort of deallocate/shrink functionality that makes the remaining children "jump" up a generation or something /* Alphabetical Iterate Logic 1. Have a "case" integer that designates what family member was just pulled (0 for leftChild, 1 for parent, etc.) 2. Move-> bottom left child, parent, bottom left child of right child, parent (right child), etc. 3. Return token with each iterate */ Token* returnToken = root; if (currentToken->getLeftChild() != NULL && currentToken->hasLeftCalled() == false) { returnToken = findAlpha(currentToken); // make sure to have condition for if already in the far left currentToken->setLeftCalled(true); return returnToken; } else if (currentToken->getRightChild() != NULL && currentToken->hasLeftCalled() == true) { currentToken = currentToken->getRightChild(); if (currentToken->getLeftChild() != NULL) { // needs to seek far left inside first, then will loop back through anyhow returnToken = findAlpha(currentToken); } return returnToken; } else if (currentToken->getLeftChild() == NULL && currentToken->getRightChild() == NULL) { // at the end of a leaf currentToken = root; // start at root and find where first unused parent is if (root->hasLeftCalled() == false) { do { currentToken = currentToken->getLeftChild(); // increments through unused parents } while (currentToken->hasLeftCalled() == false && currentToken->getLeftChild() != NULL); } else if (root->hasRightCalled()) { // may have some bugs in here return root; } else { currentToken = root->getRightChild(); } } else { returnToken = currentToken->getParent(); return returnToken; } return returnToken; }
static int display(Queenscreen *qs) { int max = 1024; int polys = 0; glClear(clearbits); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(current_device_rotation(), 0, 0, 1); /* setup light attenuation */ /* #### apparently this does nothing */ glEnable(GL_COLOR_MATERIAL); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha(qs))); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.06); /** setup perspective */ glTranslatef(0.0, 0.0, -1.5*qs->BOARDSIZE); glRotatef(30.0, 1.0, 0.0, 0.0); gltrackball_rotate (qs->trackball); glRotatef(qs->theta*100, 0.0, 1.0, 0.0); glTranslatef(-0.5*qs->BOARDSIZE, 0.0, -0.5*qs->BOARDSIZE); /* find light positions */ qs->position[0] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*-sin(qs->theta*100*M_PI/180.0); qs->position[2] = qs->BOARDSIZE/2.0 + qs->BOARDSIZE/1.4*cos(qs->theta*100*M_PI/180.0); qs->position[1] = 6.0; if(!wire) { glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_POSITION, qs->position); glEnable(GL_LIGHT0); } /* Since the lighting attenuation trick up there doesn't seem to be working, let's drop the old board down and drop the new board in. */ if (qs->steps < (max/8.0)) { GLfloat y = qs->steps / (max/8.0); y = sin (M_PI/2 * y); glTranslatef (0, 10 - (y * 10), 0); } else if (qs->steps > max-(max/8.0)) { GLfloat y = (qs->steps - (max-(max/8.0))) / (GLfloat) (max/8.0); y = 1 - sin (M_PI/2 * (1-y)); glTranslatef (0, -y * 15, 0); } /* draw reflections */ if(!wire) { polys += draw_reflections(qs); glEnable(GL_BLEND); } polys += drawBoard(qs); if(!wire) glDisable(GL_BLEND); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.1); glTranslatef(0.5, 0.0, 0.5); polys += drawPieces(qs); /* rotate camera */ if(!qs->button_down_p) qs->theta += .002; /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */ if(++qs->steps == max) { qs->steps = 0; blank(qs); qs->BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1)); qs->colorset = (qs->colorset+1)%COLORSETS; go(qs); } return polys; }