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;
}
Beispiel #2
0
    // 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;
}
Beispiel #3
0
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;
}