Main Page | Namespace List | Class Hierarchy | Compound List | File List | Compound Members | File Members

waveManager.cpp

Go to the documentation of this file.
00001 #include "waveManager.h"
00002 #include "common_vars_game.h"
00003 #include "sectorManager.h"
00004 #include "configuration.h"
00005 
00006 #define SWAP_BETWEEN_TRANSFORMS(old_i, new_i) { \
00007   ssgaWaveSystem2* _tws = active_ws[old_i]; \
00008   ws_transforms[old_i]->removeKid(0); \
00009   ws_transforms[new_i]->addKid(_tws); \
00010 }
00011 
00012 #define INDEX_TO_POLYGONCOUNT(i) ((i == 4) ? config->get_near_wp() : \
00013     config->get_next_wp())
00014 
00015 static int enableTexGen_WS2 ( ssgEntity *e )
00016 {
00017 #ifdef GL_ARB_multitexture
00018   int tx ;
00019   glGetIntegerv ( GL_TEXTURE_BINDING_2D, &tx ) ;
00020   glActiveTextureARB ( GL_TEXTURE1_ARB ) ;
00021 #endif
00022   glTexGeni ( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP ) ;
00023   glTexGeni ( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP ) ;
00024   glEnable ( GL_TEXTURE_GEN_S ) ;
00025   glEnable ( GL_TEXTURE_GEN_T ) ;
00026 #ifdef GL_ARB_multitexture
00027   glEnable ( GL_TEXTURE_2D ) ;  /* Enables the second texture map. */
00028   glBindTexture ( GL_TEXTURE_2D, tx ) ;
00029   glActiveTextureARB ( GL_TEXTURE0_ARB ) ;
00030 #endif
00031   return TRUE ;
00032 }
00033 
00034 static int disableTexGen_WS2 ( ssgEntity *e )
00035 {
00036 #ifdef GL_ARB_multitexture
00037   glActiveTextureARB ( GL_TEXTURE1_ARB ) ;
00038 #endif
00039   glDisable ( GL_TEXTURE_GEN_S ) ;
00040   glDisable ( GL_TEXTURE_GEN_T ) ;
00041 #ifdef GL_ARB_multitexture
00042   glDisable ( GL_TEXTURE_2D ) ; /* Disables the second texture map */
00043   glActiveTextureARB ( GL_TEXTURE0_ARB ) ;
00044 #endif
00045   ssgBranch* b = e->getParent(0);
00046   ssgaWaveSystem2* w = (ssgaWaveSystem2*)b;
00047   w->set_active();
00048   return TRUE ;
00049 }
00050 
00051 ssgaWaveSystem2* waveManager::make_ws(int which) {
00052   ssgaWaveSystem2* tmws;
00053   int poly;
00054   
00055   if (which == 4)
00056     poly = config->get_nearwp();
00057   else
00058     poly = config->get_nextwp();
00059   tmws = new ssgaWaveSystem2(poly);
00060   tmws->setSize(WM_WS_LENGTH);
00061   tmws->setWindDirn(0);
00062   tmws->setWindSpeed(0);
00063   tmws->setTexScale(WM_DEFAULT_TEXSCALE);
00064   tmws->setKidCallback ( SSG_CALLBACK_PREDRAW ,  enableTexGen_WS2 ) ;
00065   tmws->setKidCallback ( SSG_CALLBACK_POSTDRAW, disableTexGen_WS2 ) ;
00066   tmws->setKidState(sea_texture);
00067   return tmws;
00068 }
00069 
00070 waveManager::waveManager(int x, int y) {
00071   sea_state = new ssgSimpleState () ;
00072   sea_state -> setTexture        ( "ocean.rgb" ) ;
00073   sea_state -> setTranslucent    () ;
00074   sea_state -> enable            ( GL_TEXTURE_2D ) ;
00075   sea_state -> setShadeModel     ( GL_SMOOTH ) ;
00076   sea_state -> enable            ( GL_CULL_FACE ) ;
00077   sea_state -> enable            ( GL_BLEND ) ;
00078   sea_state -> enable            ( GL_LIGHTING ) ;
00079   sea_state -> setColourMaterial ( GL_AMBIENT_AND_DIFFUSE ) ;
00080   sea_state -> setMaterial       ( GL_EMISSION, 0, 0, 0, 1 ) ;
00081   sea_state -> setMaterial       ( GL_SPECULAR, 1, 1, 1, 1 ) ;
00082   sea_state -> setShininess      (  5 ) ;
00083   curr_x = x;
00084   curr_y = y;
00085 }
00086 
00087 void waveManager::first_init() {
00088   float ws;
00089   float wd;
00090   for (int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00091     sgCoord p;
00092     
00093     p.xyz[0] = p.xyz[1] = p.xyz[2] = p.hpr[0] = p.hpr[1] = p.hpr[2] = 0.0f;
00094     if (i < 3)
00095       p.xyz[1] = WM_WS_TRANSLOC;
00096     else if (i > 5)
00097       p.xyz[1] = -WM_WS_TRANSLOC;
00098     if (i % 3 == 0)
00099       p.xyz[0] = -WM_WS_TRANSLOC;
00100     else if (i % 3 == 2)
00101       p.xyz[0] = WM_WS_TRANSLOC;
00102     ws_transforms[i] = new ssgTransform(&p);
00103     
00104     scene->addKid(ws_transform[i]);
00105    
00106     ws = sMan->get_wind_speed(INDEX_TO_GLOBAL(i));
00107     wd = sMan->get_wind_heading(INDEX_TO_GLOBAL(i));
00108 
00109     ssgaWaveSystem2* tws = make_ws(i);
00110     fill_wavesystem(tws, ws, wd);
00111     tws->regenerate();
00112     active_ws[i] = tws;
00113     ws_transform[i]->addKid(tws);
00114   }
00115   _reset_prep_null();
00116 }
00117     
00118 void waveManager::_reset_prep_null() {
00119   for(int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00120     prepared_ws[i] = NULL;
00121   }
00122 }
00123 
00124 void waveManager::set_center(int x, int y) {
00125   int dx, dy;
00126   dx = curr_x - x;
00127   dy = curr_y - y;
00128   if (dx == -1) {
00129     // going north
00130   }
00131   else if (dx == 0) {
00132     // neither north nor south
00133     if (dy == -1) {
00134       // west
00135       for (int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00136         if (i % 3 == 0 || i % 3 == 1) {
00137           SWAP_BETWEEN_TRANSFORMS(i, i + 1);
00138           active_ws[i+1]->setNumTris(INDEX_TO_POLYGONCOUNT(i));
00139         }
00140       }
00141       for (int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00142         if (i % 3 == 0) {
00143           if (prepared_ws[i] == NULL) {
00144             fprintf(stderr, "ERROR: needed prepared waveSystem sector %i %i but was NULL, forcing creation now\n");
00145             
00146             prepared_ws[i] = make_ws(i);
00147             float ws, wd;
00148             ws = sMan->get_wind_speed(INDEX_TO_GLOBAL(i));
00149             wd = sMan->get_wind_heading(INDEX_TO_GLOBAL(i));
00150             fill_wavesystem(prepared_ws[i], ws, wd);
00151             prepared_ws[i]->regenerate();
00152           }
00153           ws_transforms[i]->removeKid(0);
00154           active_ws[i] = prepared_ws[i];
00155           prepared_ws[i] = NULL;
00156         }
00157       }
00158     }
00159     else if (dy == 1) {
00160       // east
00161       for (int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00162         if (i % 3 == 1 || i % 3 == 2) {
00163           SWAP_BETWEEN_TRANSFORMS(i, i - 1);
00164           active_ws[i-1]->setNumTris(INDEX_TO_POLYGONCOUNT(i));
00165         }
00166       }
00167       for (int i=0; i < WM_ACTIVE_WAVESYSTEMS; i++) {
00168         if (i % 3 == 2) {
00169           if (prepared_ws[i] == NULL) {
00170             fprintf(stderr, "ERROR: needed prepared waveSystem sector %i %i but was NULL, forcing creation now\n");
00171             
00172             prepared_ws[i] = make_ws(i);
00173             float ws, wd;
00174             ws = sMan->get_wind_speed(INDEX_TO_GLOBAL(i));
00175             wd = sMan->get_wind_heading(INDEX_TO_GLOBAL(i));
00176             fill_wavesystem(prepared_ws[i], ws, wd);
00177             prepared_ws[i]->regenerate();
00178           }
00179           ws_transforms[i]->removeKid(0);
00180           active_ws[i] = prepared_ws[i];
00181           prepared_ws[i] = NULL;
00182         }
00183       }
00184     }
00185   }
00186   else if (dx == 1) {
00187     // i always like going south ...
00188   }
00189   else {
00190     fprintf(stderr, "moving %i %i is not supported\n", dx, dy);
00191   }
00192 }
00193 
00194 void waveManager::prepare_move(int x, int y) {
00195   // make sure we have all data ready when calling set_center
00196   
00197 }
00198 
00199 void waveManager::update(float dt) {
00200   for (int i=0; i<WM_ACTIVE_WAVESYSTEMS; i++) {
00201     active_ws[i]->updateAnimation(dt);
00202   }
00203 }

Generated on Sat Jul 12 04:29:21 2003 for glPirates by doxygen 1.3.2