/* GameOfLife - Conway's Game of Life in 3D * * Copyright (c) 2008 by Sebastian Lohff, seba@seba-geek.de * http://www.seba-geek.de * * This file is part of GameOfLife. * * GameOfLife is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * GameOfLife is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GameOfLife. If not, see . */ #include #include #include #include #include #include "gameoflife.h" #include "glcamera.h" #include "fpsmanager.h" #include "glfontengine.h" void setVideo(bool view3d, int width, int height); void displayUsage(); int main(int argc, char **argv) { int width = 1024; int height= 768; bool view3d = true; bool renderosd = true; bool paused = false; bool editmode = false; // bool showcam2d = false; GameOfLife feld(20, 20, 1, 2); { std::string loadfile = ""; int feld_x = 20; int feld_y = 20; int rand_alife = 1; int rand_dead = 3; bool torus = true; for(int i=1; i=0.1f) { feld.setTickSec(feld.getTickSec()+0.1f); if(feld.getBuildSec()!=0.0f) feld.setBuildSec(feld.getBuildSec()+0.1f); } else { feld.setTickSec(feld.getTickSec()+0.01f); if(feld.getBuildSec()!=0.0f) feld.setBuildSec(feld.getBuildSec()+0.01f); } break; case SDLK_MINUS: if(feld.getTickSec()>0.1f) { feld.setTickSec(feld.getTickSec()-0.1f); if(feld.getBuildSec()!=0.0f) feld.setBuildSec(feld.getBuildSec()-0.1f); } else if(feld.getTickSec()>=0.01f) { feld.setTickSec(feld.getTickSec()-0.01f); if(feld.getBuildSec()!=0.0f) feld.setBuildSec(feld.getBuildSec()-0.01f); } break; case SDLK_e: editmode = !editmode; feld.setEditMode(editmode); if(editmode) paused = true; else paused = false; break; // Edit Mode Stuff case SDLK_SPACE: if(editmode) feld.toggle(); break; case SDLK_UP: if(editmode && (!view3d || event.key.keysym.mod&KMOD_SHIFT)) feld.move(-1, 0); break; case SDLK_DOWN: if(editmode && (!view3d || event.key.keysym.mod&KMOD_SHIFT)) feld.move(1, 0); break; case SDLK_RIGHT: if(editmode && (!view3d || event.key.keysym.mod&KMOD_SHIFT)) feld.move(0, 1); break; case SDLK_LEFT: if(editmode && (!view3d || event.key.keysym.mod&KMOD_SHIFT)) feld.move(0, -1); break; default: break; } break; case SDL_VIDEORESIZE: break; } } else { // Set scene stuff lastframe = thisframe; thisframe = SDL_GetTicks(); float sec = (thisframe-lastframe)/1000.0f; if(view3d) { Uint8 *keystate = SDL_GetKeyState(NULL); if(!keystate[SDLK_LSHIFT]&&!keystate[SDLK_RSHIFT]) camera.handleKeys(sec); } //Render scene glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); if(view3d) camera.setCamera(); glLightfv(GL_LIGHT1, GL_POSITION, light_position); // glLightfv(GL_LIGHT1, GL_POSITION, light1_position); feld.render(sec*(!paused)); if(renderosd) { if(view3d) { glDisable(GL_LIGHTING); fontengine.prepare2DbyPushingMatrix(); } std::stringstream txt; glEnable(GL_TEXTURE_2D); if(paused) fontengine.renderLine(" Paused...", width/2, 0, true); if(editmode) fontengine.renderLine("Edit mode", width/2, 21, true); txt << "Sec/Build: "; if(feld.getBuildSec()!=0.0f) txt << feld.getBuildSec(); else txt << "Off"; fontengine.renderLine(txt.str(), width/3, height-21, true); txt.str(""); txt.clear(); txt << "Sec/Tick: " << feld.getTickSec(); fontengine.renderLine(txt.str(), width*2/3, height-21, true); txt.str(""); txt << "Generation: " << feld.getGeneration(); if(!paused) fontengine.renderLine(txt.str(), width/2, 0, true); glDisable(GL_TEXTURE_2D); if(view3d) { glEnable(GL_LIGHTING); fontengine.regain3DbyPoppingMatrix(); } } SDL_GL_SwapBuffers(); fpsman.delay(); } } return 0; } void setVideo(bool view3d, int width, int height) { glViewport(0, 0, (GLsizei)width, (GLsizei)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(view3d) gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.2f, 100.0f); else glOrtho(0, width, height, 0, -1, 1); glMatrixMode(GL_MODELVIEW); } void displayUsage() { std::cout << "Usage: GameOfLife [options]" << std::endl << std::endl << "Options: " << std:: endl << " -fx, --field-x Set field width (Default: 20)" << std::endl << " -fy, --field-y Set field height (Default: 20)" << std::endl << " -t, --torus <1/0> Enable/Disable Torus (Default: 1)" << std::endl << " -l, --load Load field from textfile" << std::endl << " -rd, --rand-dead Defines dead-cellratio for random fill (Default: 3)" << std::endl << " -ra, --rand-alife Defines alife-cellratio for random fill (Default: 1)" << std::endl << " -h, --help Shows this help and exits" << std::endl << " -v, --version Displays versioninfo and exits" << std::endl << std::endl << "Read the readme.txt supplied with this program for further information" << std::endl; }