void MakeGameOfLife( unsigned int texture ) { int i; gameOfLife = new GLubyte[ 3 * LIFE_WIDTH * LIFE_HEIGHT ]; tempLife = new GLubyte[ 3 * LIFE_WIDTH * LIFE_HEIGHT ]; // empty out game for( i=0; i< 3*LIFE_WIDTH*LIFE_HEIGHT; i+=3 ) { gameOfLife[i] = tempLife[i] = NULL_RED; // no red gameOfLife[i+1] = tempLife[i+1] = NULL_GREEN; // no green gameOfLife[i+2] = tempLife[i+2] = NULL_BLUE; // no blue } // set up initial life gameOfLife[ 3*(15*LIFE_WIDTH + 17) ] = LIVE_RED; gameOfLife[ 3*(15*LIFE_WIDTH + 16) ] = LIVE_RED; gameOfLife[ 3*(16*LIFE_WIDTH + 15) ] = LIVE_RED; gameOfLife[ 3*(16*LIFE_WIDTH + 16) ] = LIVE_RED; gameOfLife[ 3*(17*LIFE_WIDTH + 16) ] = LIVE_RED; // set up texture lifeTexture = texture; glBindTexture( GL_TEXTURE_2D, lifeTexture ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, LIFE_WIDTH, LIFE_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, gameOfLife ); } void PlayGameOfLife() { GLubyte *tempPtr; int i, j, neighbors, index; // set "tempLife" to be next iteration of life for( i=0; i0 ) { if(j>0) if( gameOfLife[ index - 3*LIFE_WIDTH - 3 ] != NULL_RED ) neighbors++; if( gameOfLife[ index - 3*LIFE_WIDTH ] != NULL_RED ) neighbors++; if(j0) if( gameOfLife[ index - 3 ] != NULL_RED ) neighbors++; if(j0) if( gameOfLife[ index + 3*LIFE_WIDTH - 3 ] != NULL_RED ) neighbors++; if( gameOfLife[ index + 3*LIFE_WIDTH ] != NULL_RED ) neighbors++; if(j3) ) { tempLife[index] = NULL_RED; tempLife[index+1] = NULL_GREEN; tempLife[index+2] = NULL_BLUE; } else { tempLife[index] = LIVE_RED; tempLife[index+1] = LIVE_GREEN; tempLife[index+2] = LIVE_BLUE; } } else { // empty cell if( neighbors == 3 ) { tempLife[index] = LIVE_RED; tempLife[index+1] = LIVE_GREEN; tempLife[index+2] = LIVE_BLUE; } else { tempLife[index] = NULL_RED; tempLife[index+1] = NULL_GREEN; tempLife[index+2] = NULL_BLUE; } } // advance to next index index +=3; } } // swap life buffers tempPtr = tempLife; tempLife = gameOfLife; gameOfLife = tempPtr; // reset the texture glBindTexture( GL_TEXTURE_2D, lifeTexture ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, LIFE_WIDTH, LIFE_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, gameOfLife ); }