aboutsummaryrefslogtreecommitdiff
path: root/sons_of_sol/private_db/ApplicationInit.cpp
diff options
context:
space:
mode:
authorJoshua Rahm <joshua.rahm@colorado.edu>2013-12-10 19:19:26 -0700
committerJoshua Rahm <joshua.rahm@colorado.edu>2013-12-10 19:19:26 -0700
commit010f829485d570afb66c630026504fec63f93cdd (patch)
treed5e42e333178794377c05a99b5bf0c034485bcb6 /sons_of_sol/private_db/ApplicationInit.cpp
parent7be3bda2b664068bf47404278fa9ee1ce552ea0e (diff)
downloadSonsOfSol-010f829485d570afb66c630026504fec63f93cdd.tar.gz
SonsOfSol-010f829485d570afb66c630026504fec63f93cdd.tar.bz2
SonsOfSol-010f829485d570afb66c630026504fec63f93cdd.zip
Almost finished working commit
Diffstat (limited to 'sons_of_sol/private_db/ApplicationInit.cpp')
-rw-r--r--sons_of_sol/private_db/ApplicationInit.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/sons_of_sol/private_db/ApplicationInit.cpp b/sons_of_sol/private_db/ApplicationInit.cpp
new file mode 100644
index 0000000..1794fd5
--- /dev/null
+++ b/sons_of_sol/private_db/ApplicationInit.cpp
@@ -0,0 +1,218 @@
+#include "sons_of_sol/SonsOfSolApplication.hpp"
+
+#include "glox/GloxLightSource.hpp"
+#include "glox/GloxRotation.hpp"
+#include "glox/GloxScopedRotation.hpp"
+
+#include <iostream>
+
+using namespace slox;
+using namespace glox;
+using namespace std;
+
+bool SonsOfSolApplication::initialize( int argc, char** argv ) {
+ (void) argc;
+ (void) argv;
+ /* Use our texture factory to load textures */
+ m_object_loader.setTextureFactory( &m_texture_factory );
+ m_is_paused = false ;
+
+ setupControls();
+
+ SDL_Init( SDL_INIT_VIDEO );
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ const SDL_VideoInfo* info = SDL_GetVideoInfo(); //<-- calls SDL_GetVideoInfo();
+ m_screen_width = info->current_w;
+ m_screen_height = info->current_h;
+ m_screen = SDL_SetVideoMode( 600, 600, 0, SDL_OPENGL|SDL_RESIZABLE|SDL_DOUBLEBUF );
+
+ m_perspective.setPosition( GloxPoint<>( 0, 0, 10 ) );
+ m_perspective.setZFar ( FAR_DISTANCE_END );
+ m_perspective.setZNear( FAR_DISTANCE_START );
+ m_ship.setPerspective( m_perspective );
+ m_ship.setPosition( GloxPointf( 0, 10, -3 ) );
+
+
+ if( argv[1] == NULL || strcmp(argv[1],"nograb") ) {
+ SDL_ShowCursor( 0 );
+ SDL_WM_GrabInput(SDL_GRAB_ON);
+ }
+
+ if( glewInit() != GLEW_OK ) {
+ cerr << "Unable to initialize GLEW" << endl ;
+ exit( 122 ) ;
+ }
+
+ /* Add some listeners */
+ this->addQuitListener( this );
+ this->addKeyListener( this );
+
+ this->addResizeListener( this );
+
+ m_event_multiplexer.addControlMotionListener( & m_ship );
+
+ if( ! m_screen ) {
+ /* If the screen could not be initialized, print
+ * a useful video message */
+ this->setError( "Cannot set SDL video mode\n" );
+ return false;
+ }
+
+ SDL_WM_SetCaption( "Sons Of Sol", "" );
+ reshape( m_screen->w, m_screen->h );
+
+ /* Load the textures into memory */
+ if( ! loadTextures() ) return false;
+
+ GloxTextureRepeat texrep( &m_sky_tex, 1.8, 1.8 );
+ m_sky = new GloxTexturedCube( FAR_DISTANCE_END - 100, GloxColor( 255, 255, 255 ),
+ texrep, texrep, texrep, texrep, texrep, texrep );
+
+ texrep = GloxTextureRepeat( &m_crate_tex, 1, 1 );
+ m_crate = new GloxTexturedCube( 5.0f, GloxColor( 255, 255, 255 ),
+ texrep, texrep, texrep, texrep, texrep, texrep );
+
+ m_object_loader.addToPath( "objects" );
+ m_object_loader.addToPath( "objects/material" );
+ m_earth = new GloxTexturedSphere( FAR_DISTANCE_END / 4.0, 5.0f, m_earth_tex );
+ m_moon = new GloxTexturedSphere( FAR_DISTANCE_END / 24.0, 5.0f, m_moon_tex );
+ m_probe = m_object_loader.loadObjectFromFile( "probe.obj" );
+
+ m_script_ttl = 130 ;
+ if( ! m_probe ) {
+ cerr << "Unable to load probe: " << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ m_frigate_industrial = m_object_loader.loadObjectFromFile( "frigate_industrial.obj" );
+ if( ! m_frigate_industrial ) {
+ cerr << "Unable to load frigate_industrial\n" << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ m_other_ship = m_object_loader.loadObjectFromFile( "ship.obj" );
+ SloxModelObject* ship_med = m_object_loader.loadObjectFromFile( "ship_med.obj" ) ;
+ SloxModelObject* ship_low = m_object_loader.loadObjectFromFile( "ship_low.obj" ) ;
+ if( ! (m_other_ship && ship_med && ship_low) ) {
+ cerr << "Unable to load other ship\n" << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ m_test_cube = m_object_loader.loadObjectFromFile( "cube.obj" );
+ if( ! m_test_cube ) {
+ cerr << "Unable to load test cube\n" << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ m_deathstar = m_object_loader.loadObjectFromFile( "deathstar.obj" ) ;
+ if( ! m_deathstar ) {
+ cerr << "Unable to load deathstar\n" << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ m_acceleration_cannon = m_object_loader.loadObjectFromFile( "acceleration_cannon.obj" ) ;
+ if( ! m_acceleration_cannon ) {
+ cerr << "Unable to load acceleration cannon\n" << m_object_loader.getReason() << endl;
+ exit( 123 );
+ }
+
+ AIShip::setModel( m_other_ship, ship_med, ship_low ) ;
+
+ float xstart = 0.5*(- FAR_DISTANCE_END / 5.0f);
+ float xend = 0.5*(- xstart);
+ float ystart = 0.3*(FAR_DISTANCE_END / 3.0f - FAR_DISTANCE_END / 2);
+ float yend = 0.3*(ystart + 2*(FAR_DISTANCE_END / 5.0f));
+ /* Add the points for the sun */
+ m_star.add( GloxPointNormalTexture(
+ GloxPoint<>( xstart, ystart, -(FAR_DISTANCE_END) / 3 ), GloxNormal<>(0,0,0), GloxPoint<>( 0,0 ) ) );
+ m_star.add( GloxPointNormalTexture(
+ GloxPoint<>( xend, ystart, -(FAR_DISTANCE_END) / 3 ), GloxNormal<>(0,0,0), GloxPoint<>( 1,0 ) ) );
+ m_star.add( GloxPointNormalTexture(
+ GloxPoint<>( xend, yend, -(FAR_DISTANCE_END) / 3 ), GloxNormal<>(0,0,0), GloxPoint<>( 1,1 ) ) );
+ m_star.add( GloxPointNormalTexture(
+ GloxPoint<>( xstart, yend, -(FAR_DISTANCE_END) / 3 ), GloxNormal<>(0,0,0), GloxPoint<>( 0,1 ) ) );
+
+ /* Move the light souce to the sun */
+ GloxLightSource* source = m_light_manager.getLightSource( 0 );
+ source->setPosition( GloxPointf( 0, 200, -695 ) );
+
+ m_quit = false;
+
+ /* Starting ships */
+ for( int i = 0; i < 5; ++ i ) {
+ AIShip::Updater* updater = new EllipseUpdater( GloxPointf(0,-10,0), GloxPointf(0,10,10), GloxPointf(10,i*5,0), 0.01 );
+ m_updaters.push_back( updater );
+ AIShip tmp( updater );
+ tmp.setTimeOffset( 1000 * i ) ;
+ m_aiships.push_back( tmp ) ;
+ }
+
+ /* Frigate ships */
+ for ( int j = 0; j < 360; j += 72 ) {
+ for( int i = 0; i < 10; ++ i ) {
+ float pos = 10000 + 100 * i;
+ GloxPointf center( pos, pos, pos );
+ float cos = GloxCos(j) ;
+ float sin = GloxSin(j) ;
+ AIShip::Updater* updater =
+ new EllipseUpdater( center, GloxPointf(60*cos,-100*sin,2) , GloxPointf(50*cos,10*sin,50) * 2, 0.002 );
+ m_updaters.push_back( updater );
+ AIShip tmp( updater );
+ tmp.setTimeOffset( 100000 * i ) ;
+ m_aiships.push_back( tmp ) ;
+ }
+ }
+
+ /* Deathstar ships */
+ for ( int j = 0; j < 360; j += 72 ) {
+ for( int i = 0; i < 10; ++ i ) {
+ float pos = 100 * i;
+ GloxPointf center( 5000 + pos, -1000+pos, -20000+pos );
+ float cos = GloxCos(j) ;
+ float sin = GloxSin(j) ;
+ AIShip::Updater* updater =
+ new EllipseUpdater( center, GloxPointf(60*cos,-70*sin,2) , GloxPointf(50*cos,10*sin,40) * 2, 0.002 );
+ m_updaters.push_back( updater );
+ AIShip tmp( updater );
+ tmp.setTimeOffset( 10000 * i ) ;
+ m_aiships.push_back( tmp ) ;
+ }
+ }
+
+ m_earth_prog = new GloxProgram() ;
+ if( m_earth_prog->attachShaderFromFile( "shaders/earth.vp", GL_VERTEX_SHADER ) ||
+ m_earth_prog->attachShaderFromFile( "shaders/earth.fp", GL_FRAGMENT_SHADER ) ||
+ m_earth_prog->link() ) {
+ cerr << "Warning Unable to load shaders: " <<
+ GloxShader::getMessage() << endl;
+ }
+ m_earth_shader_light_pos = m_earth_prog->getUniformLocation( "lightPos" );
+ m_earth_shader_camera_pos = m_earth_prog->getUniformLocation( "cameraPos" );
+
+ cout << "Earth light " << m_earth_shader_light_pos << endl;
+ cout << "Earth camera " << m_earth_shader_camera_pos << endl;
+
+ m_moon_prog = new GloxProgram() ;
+ if( m_moon_prog->attachShaderFromFile( "shaders/moon.vp", GL_VERTEX_SHADER ) ||
+ m_moon_prog->attachShaderFromFile( "shaders/moon.fp", GL_FRAGMENT_SHADER ) ||
+ m_moon_prog->link() ) {
+ cerr << "Warning Unable to load shaders: " <<
+ GloxShader::getMessage() << endl;
+ }
+ m_moon_shader_light_pos = m_moon_prog->getUniformLocation( "lightPos" );
+ m_moon_shader_camera_pos = m_moon_prog->getUniformLocation( "cameraPos" );
+
+
+ // start the starting light
+ GloxLightSource* start = m_light_manager.getLightSource( 0 );
+ start->setLightModelAttribute( GL_LIGHT_MODEL_AMBIENT, GloxColor(50,50,50) );
+ start->setAmbient ( GloxColor(30,30,30) );
+ start->setDiffuse ( GloxColor(255,0,0) );
+ start->setPosition( GloxPoint<>( 0,0,0 ) );
+
+ start->setEnabled( false );
+
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.5);
+
+ return true;
+}