/* * Copyright (C) 2007 Michael Lewis * Author: Mike Lewis * * This work is provide AS IS, and has no warranty. * The author is NOT responsible for anything that happens * due to use of this code, either using it or running it on * your system */ #ifdef __SSE2__ #include #include #endif #include #include #ifdef __APPLE__ #include #include #else #include #include #endif #include "types.h" #include "helpers.h" #include "block.h" #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE (!FALSE) #endif llife_world my_world; void reshape( int width, int height ) { height = height <= 0 ? 1 : height; float ratio = (float) width / (float) height * 2; float diagonal = sqrt( width * width + height * height ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glViewport(0, 0, width, height); glOrtho( 0, my_world->width * 128, my_world->height * BLOCK_HEIGHT, 0, -1.0, 1.0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawRow( __m128i A, int x, int y, int lines ) { int i, j; for( i = 0; i < 8; i++ ) { __m128i fin = unpack( A, i ); unsigned char *f = (unsigned char*)&fin; for( j = 0; j < 16; j++ ) { if( *f ) { int xx = x + i * 16 + j; if( !lines ) { glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); glColor4f(.5, .5, .8, .7 ); glBegin( GL_TRIANGLE_STRIP ); glVertex3f( 1 + xx, 1 + y, 0 ); glVertex3f( 0 + xx, 1 + y, 0 ); glVertex3f( 1 + xx, 0 + y, 0 ); glVertex3f( 0 + xx, 0 + y, 0 ); glEnd(); } else { glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); //glBlendFunc(GL_SRC_ALPHA,GL_ONE); glColor4f(.40, .40, .40, 1.0 ); glBegin( GL_POLYGON ); glVertex3f( 1 + xx, 1 + y, .10 ); glVertex3f( 0 + xx, 1 + y, .10 ); glVertex3f( 0 + xx, 0 + y, .10 ); glVertex3f( 1 + xx, 0 + y, .10 ); glEnd(); } } f++; } // printf( " " ); } } void renderBlock( llife_block block, int x, int y, int lines ) { int i; for( i = 0; i < 128; i++ ) { drawRow((*block->current)[i], x, y + i, lines ); } } void renderScene() { glClear( GL_COLOR_BUFFER_BIT ); int i, j; for( i = 0; i < my_world->width; i++ ) { for( j = 0; j < my_world->height; j++ ) { //printf( "%x\n", *my_world->blocks ); renderBlock( get_life_block( my_world, j, i ) , i*128, j*BLOCK_HEIGHT, FALSE ); } } for( i = 0; i < my_world->width; i++ ) { for( j = 0; j < my_world->height; j++ ) { //printf( "%x\n", *my_world->blocks ); renderBlock( get_life_block( my_world, j, i ) , i*128, j*BLOCK_HEIGHT, TRUE ); } } glFlush(); glutSwapBuffers(); } void myTimer(int value) { glutTimerFunc(1000/120,myTimer,1); worldCycle( my_world ); glutPostRedisplay(); } int main( int argc, char** argv) { int i, j; int width = 1, height = 1; int temp_dim; for( i = 0; i < argc; i++ ) { if( !strcmp( "-h", argv[i] ) && i + 1 < argc ){ temp_dim = atoi( argv[i+1] ); i++; if( temp_dim ) { height = temp_dim; } } else if( !strcmp( "-w", argv[i] ) && i + 1 < argc ){ temp_dim = atoi( argv[i+1] ); i++; if( temp_dim ) { width = temp_dim; } } } my_world = allocate_world( width, height ); *(my_world->blocks) = allocate_block(); printf( "%x\n", *my_world->blocks ); set_bit_in_world( my_world, 100-50, 100-50 ); set_bit_in_world( my_world, 100-51, 100-50 ); set_bit_in_world( my_world, 100-52, 100-50 ); set_bit_in_world( my_world, 100-54, 100-50 ); set_bit_in_world( my_world, 100-50, 100-51 ); set_bit_in_world( my_world, 100-53, 100-52 ); set_bit_in_world( my_world, 100-54, 100-52 ); set_bit_in_world( my_world, 100-51, 100-53 ); set_bit_in_world( my_world, 100-52, 100-53 ); set_bit_in_world( my_world, 100-54, 100-53 ); set_bit_in_world( my_world, 100-50, 100-54 ); set_bit_in_world( my_world, 100-52, 100-54 ); set_bit_in_world( my_world, 100-54, 100-54 ); glutInit( &argc, argv ); glutInitWindowPosition( -1, -1 ); glutInitWindowSize( 800, 800 ); glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow( "Conway's game of Life" ); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // glDisable(GL_DEPTH_TEST); //glEnable(GL_BLEND); glutDisplayFunc( renderScene ); glutReshapeFunc( reshape ); glutTimerFunc(1000.*5,myTimer,1); glutMainLoop(); printf( "meow\n"); return 0; }