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 ) ;
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 ) ;
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
00130 }
00131 else if (dx == 0) {
00132
00133 if (dy == -1) {
00134
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
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
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
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 }