/* 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;
}