Hard Light Productions Forums
Modding, Mission Design, and Coding => FS2 Open Coding - The Source Code Project (SCP) => Topic started by: Valathil on July 13, 2011, 02:45:18 pm
-
Lots of people here don't seem to know how std::vectors and iterators work. I started a little code cleanup and fixing of some illogical coding but its just too much to do alone. Ill post the work i have done so far.
Theres also a little gem in there where i replaced the 1.0f/sqrt function for the quick inverse vector magnitude with the faster rsqrt sse instruction which calculates a aproximation of the inverse square root in a much faster fashion then inverting the normal sqrt. The comment for the function where the sse intruction is called says this should be only an approximation so there should be no accuracy problems cause the function is only used where low accuracy shouldnt be a problem.
Index: code/fireball/fireballs.cpp
===================================================================
--- code/fireball/fireballs.cpp (Revision 7347)
+++ code/fireball/fireballs.cpp (Arbeitskopie)
@@ -239,7 +239,7 @@
void fireball_parse_tbl()
{
- int i, j;
+ int i = 0 , j;
memset( &Fireball_info, 0, sizeof(fireball_info) * MAX_FIREBALL_TYPES );
@@ -251,10 +251,10 @@
// we've got our list so pass it off for final checking and loading.
// we assume that entries in fireball.tbl are in the correct order
- for (i = 0; i < (int)LOD_checker.size(); i++) {
- if ( (i < MAX_FIREBALL_TYPES) && (LOD_checker[i].override < 0) ) {
- strcpy_s( Fireball_info[i].lod[0].filename, LOD_checker[i].filename );
- Fireball_info[i].lod_count = LOD_checker[i].num_lods;
+ for (SCP_vector<lod_checker>::iterator lod = LOD_checker.begin(); lod != LOD_checker.end(); lod++) {
+ if ( (i < MAX_FIREBALL_TYPES) && (lod->override < 0) ) {
+ strcpy_s( Fireball_info[i].lod[0].filename, lod->filename );
+ Fireball_info[i].lod_count = lod->num_lods;
Num_fireball_types++;
if (LOD_color[i].alpha == 255) {
@@ -265,22 +265,24 @@
fireball_set_default_color(i);
}
}
+ i++;
}
// having to do this twice is less than optimal, but less error prone too.
// this handles (and should only have to handle) TBM related entries
- for (i = 0; i < (int)LOD_checker.size(); i++) {
+ i = 0;
+ for (SCP_vector<lod_checker>::iterator lod = LOD_checker.begin(); lod != LOD_checker.end(); lod++) {
// try entry replacement
- if ( (LOD_checker[i].override >= 0) && (LOD_checker[i].override < Num_fireball_types) ) {
- strcpy_s( Fireball_info[LOD_checker[i].override].lod[0].filename, LOD_checker[i].filename );
- Fireball_info[LOD_checker[i].override].lod_count = LOD_checker[i].num_lods;
+ if ( (lod->override >= 0) && (lod->override < Num_fireball_types) ) {
+ strcpy_s( Fireball_info[lod->override].lod[0].filename, lod->filename );
+ Fireball_info[lod->override].lod_count = lod->num_lods;
if (LOD_color[i].alpha == 255) {
- Fireball_info[LOD_checker[i].override].exp_color[0] = (LOD_color[i].red / 255.0f);
- Fireball_info[LOD_checker[i].override].exp_color[1] = (LOD_color[i].green / 255.0f);
- Fireball_info[LOD_checker[i].override].exp_color[2] = (LOD_color[i].blue / 255.0f);
+ Fireball_info[lod->override].exp_color[0] = (LOD_color[i].red / 255.0f);
+ Fireball_info[lod->override].exp_color[1] = (LOD_color[i].green / 255.0f);
+ Fireball_info[lod->override].exp_color[2] = (LOD_color[i].blue / 255.0f);
} else {
- fireball_set_default_color(LOD_checker[i].override);
+ fireball_set_default_color(lod->override);
}
}
}
Index: code/cfile/cfilesystem.cpp
===================================================================
--- code/cfile/cfilesystem.cpp (Revision 7347)
+++ code/cfile/cfilesystem.cpp (Arbeitskopie)
@@ -1213,17 +1213,10 @@
file_list_index.push_back( f );
}
- size_t file_list_size = file_list_index.size();
-
- // quick exit test
- if (file_list_size < 1)
- goto Bail;
-
-
// now try and find our preferred match
for (cur_ext = 0; cur_ext < ext_num; cur_ext++) {
- for (size_t i = 0; i < file_list_size; i++) {
- cf_file *f = file_list_index[i];
+ for (SCP_vector<cf_file*>::iterator fli = file_list_index.begin(); fli != file_list_index.end(); fli++) {
+ cf_file *f = *fli;
strcat_s( filespec, ext_list[cur_ext] );
@@ -1302,10 +1295,6 @@
}
}
-Bail:
- // didn't find anything, bail...
- file_list_index.clear();
-
return -1;
}
Index: code/fs2netd/fs2netd_client.cpp
===================================================================
--- code/fs2netd/fs2netd_client.cpp (Revision 7347)
+++ code/fs2netd/fs2netd_client.cpp (Arbeitskopie)
@@ -1183,8 +1183,8 @@
CFILE *banlist_cfg = cfopen("banlist.cfg", "wt", CFILE_NORMAL, CF_TYPE_DATA);
if (banlist_cfg != NULL) {
- for (uint i = 0; i < FS2NetD_ban_list.size(); i++) {
- cfputs( const_cast<char*>(FS2NetD_ban_list[i].c_str()), banlist_cfg );
+ for (SCP_vector<std::string>::iterator bl = FS2NetD_ban_list.begin(); bl != FS2NetD_ban_list.end(); bl++) {
+ cfputs( const_cast<char*>(bl->c_str()), banlist_cfg );
}
cfclose(banlist_cfg);
@@ -1267,7 +1267,6 @@
char valid_status = MVALID_STATUS_UNKNOWN;
char full_name[MAX_FILENAME_LEN], wild_card[10];
char val_text[MAX_FILENAME_LEN+15];
- int i;
uint checksum = 0;
if (file_names == NULL) {
@@ -1332,9 +1331,9 @@
found = false;
if (file_index >= 0) {
- for (i = 0; (i < (int)FS2NetD_file_list.size()) && (!found); i++) {
- if ( !stricmp(full_name, FS2NetD_file_list[i].name) ) {
- if (FS2NetD_file_list[i].crc32 == checksum) {
+ for (SCP_vector<file_record>::iterator fr = FS2NetD_file_list.begin(); fr != FS2NetD_file_list.end() && !found; fr++) {
+ if ( !stricmp(full_name, fr->name) ) {
+ if (fr->crc32 == checksum) {
found = true;
valid_status = MVALID_STATUS_VALID;
} else {
@@ -1512,11 +1511,11 @@
}
// output the status of table validity to multi.log
- for (uint i = 0; i < Table_valid_status.size(); i++) {
- if (Table_valid_status[i].valid) {
- ml_printf("FS2NetD Table Check: '%s' -- Valid!", Table_valid_status[i].name);
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
+ if (tvs->valid) {
+ ml_printf("FS2NetD Table Check: '%s' -- Valid!", tvs->name);
} else {
- ml_printf("FS2NetD Table Check: '%s' -- INVALID (0x%x)!", Table_valid_status[i].name, Table_valid_status[i].crc32);
+ ml_printf("FS2NetD Table Check: '%s' -- INVALID (0x%x)!", tvs->name, tvs->crc32);
hacked = 1;
}
}
@@ -1645,7 +1644,7 @@
void fs2netd_spew_table_checksums(char *outfile)
{
char full_name[MAX_PATH_LEN];
- int count, idx;
+ int count;
FILE *out = NULL;
char description[512] = { 0 };
char filename[65] = { 0 };
@@ -1684,9 +1683,9 @@
count = (int)Table_valid_status.size();
// do all the checksums
- for (idx = 0; idx < count; idx++) {
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
offset = 0;
- p = Table_valid_status[idx].name;
+ p = tvs->name;
while (*p && (offset < sizeof(filename))) {
if (*p == '"') {
@@ -1701,7 +1700,7 @@
filename[offset] = '\0';
- fprintf(out, "\"%s\",%u,\"%s\"\r\n", filename, Table_valid_status[idx].crc32, description);
+ fprintf(out, "\"%s\",%u,\"%s\"\r\n", filename, tvs->crc32, description);
}
fflush(out);
Index: code/fs2netd/tcp_client.cpp
===================================================================
--- code/fs2netd/tcp_client.cpp (Revision 7347)
+++ code/fs2netd/tcp_client.cpp (Arbeitskopie)
@@ -686,7 +686,6 @@
int buffer_size, buffer_offset;
bool my_packet = false;
char buffer[4096];
- uint i;
ushort num_tables = 0;
if (do_send) {
@@ -697,9 +696,9 @@
PXO_ADD_USHORT( num_tables );
- for (i = 0; i < Table_valid_status.size(); i++) {
- PXO_ADD_STRING( Table_valid_status[i].name );
- PXO_ADD_UINT( Table_valid_status[i].crc32 );
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
+ PXO_ADD_STRING(tvs->name );
+ PXO_ADD_UINT( tvs->crc32 );
}
DONE_PACKET();
@@ -761,11 +760,11 @@
return -1;
}
- for (i = 0; i < Table_valid_status.size(); i++) {
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
PXO_GET_DATA( tbl_valid_status );
Assert( (tbl_valid_status == 0) || (tbl_valid_status == 1) );
- Table_valid_status[i].valid = tbl_valid_status;
+ tvs->valid = tbl_valid_status;
}
return 2;
Index: code/asteroid/asteroid.cpp
===================================================================
--- code/asteroid/asteroid.cpp (Revision 7347)
+++ code/asteroid/asteroid.cpp (Arbeitskopie)
@@ -607,8 +607,9 @@
Num_asteroids = 0;
Next_asteroid_throw = timestamp(1);
asteroid_obj_list_init();
- for (size_t t=0; t<Asteroid_info.size(); t++)
- Asteroid_info[t].damage_type_idx = Asteroid_info[t].damage_type_idx_sav;
+ SCP_vector<asteroid_info>::iterator ast;
+ for (ast = Asteroid_info.begin(); ast != Asteroid_info.end(); ++ast)
+ ast->damage_type_idx = ast->damage_type_idx_sav;
}
// return !0 if asteroid should be wrapped, 0 otherwise. Multiplayer clients will always return
Index: code/gamesnd/gamesnd.cpp
===================================================================
--- code/gamesnd/gamesnd.cpp (Revision 7347)
+++ code/gamesnd/gamesnd.cpp (Arbeitskopie)
@@ -39,20 +39,22 @@
int gamesnd_get_by_name(char* name)
{
Assert( Snds.size() <= INT_MAX );
- for(int i = 0; i < (int)Snds.size(); i++)
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++)
{
- char *p = strrchr( Snds[i].filename, '.' );
+ char *p = strrchr( snd->filename, '.' );
if(p == NULL)
{
- if(!stricmp(Snds[i].filename, name))
+ if(!stricmp(snd->filename, name))
{
return i;
}
}
- else if(!strnicmp(Snds[i].filename, name, p-Snds[i].filename))
+ else if(!strnicmp(snd->filename, name, p-snd->filename))
{
return i;
}
+ i++;
}
return -1;
}
@@ -63,11 +65,13 @@
if (index == -1)
return -1;
Assert( Snds.size() <= INT_MAX );
- for(int i = 0; i < (int)Snds.size(); i++) {
- if ( Snds[i].sig == index )
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++) {
+ if ( snd->sig == index )
{
return i;
}
+ i++;
}
return -1;
}
@@ -76,11 +80,13 @@
{
Assert( Snds_iface.size() <= INT_MAX );
Assert( Snds_iface.size() == Snds_iface_handle.size() );
- for(int i = 0; i < (int)Snds_iface.size(); i++) {
- if ( Snds_iface[i].sig == index )
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++) {
+ if ( snd->sig == index )
{
return i;
}
+ i++;
}
return -1;
}
@@ -125,19 +131,15 @@
// fly (too slow).
void gamesnd_preload_common_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
if ( gs->preload ) {
game_busy( NOX("** preloading common game sounds **") ); // Animate loading cursor... does nothing if loading screen not active.
- gs->id = snd_load(gs);
+ gs->id = snd_load(&(*gs));
}
}
}
@@ -150,19 +152,15 @@
//
void gamesnd_load_gameplay_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
if ( !gs->preload ) { // don't try to load anything that's already preloaded
game_busy( NOX("** preloading gameplay sounds **") ); // Animate loading cursor... does nothing if loading screen not active.
- gs->id = snd_load(gs);
+ gs->id = snd_load(&(*gs));
}
}
}
@@ -175,12 +173,8 @@
//
void gamesnd_unload_gameplay_sounds()
{
- int i;
- game_snd *gs;
-
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->id != -1 ) {
snd_unload( gs->id );
gs->id = -1;
@@ -195,17 +189,13 @@
//
void gamesnd_load_interface_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds_iface.size() < INT_MAX );
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gs = &Snds_iface[i];
- if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
- gs->id = snd_load(gs);
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ if ( si->filename[0] != 0 && strnicmp(si->filename, NOX("none.wav"), 4) ) {
+ si->id = snd_load(&(*si));
}
}
}
@@ -217,16 +207,12 @@
//
void gamesnd_unload_interface_sounds()
{
- int i;
- game_snd *gs;
-
Assert( Snds_iface.size() < INT_MAX );
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gs = &Snds_iface[i];
- if ( gs->id != -1 ) {
- snd_unload( gs->id );
- gs->id = -1;
- gs->id_sig = -1;
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ if ( si->id != -1 ) {
+ snd_unload( si->id );
+ si->id = -1;
+ si->id_sig = -1;
}
}
}
@@ -522,7 +508,7 @@
//
void gamesnd_init_sounds()
{
- int i;
+ int i = 0;
Snds.clear();
Snds.resize(MIN_GAME_SOUNDS);
@@ -531,8 +517,8 @@
Assert( Snds.size() <= INT_MAX );
// init the gameplay sounds
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gamesnd_init_struct(&Snds[i]);
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
+ gamesnd_init_struct(&(*gs));
}
Snds_iface.clear();
@@ -543,9 +529,11 @@
Assert( Snds_iface.size() < INT_MAX );
// init the interface sounds
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gamesnd_init_struct(&Snds_iface[i]);
+
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ gamesnd_init_struct(&(*si));
Snds_iface_handle[i] = -1;
+ i++;
}
}
Index: code/camera/camera.cpp
===================================================================
--- code/camera/camera.cpp (Revision 7347)
+++ code/camera/camera.cpp (Arbeitskopie)
@@ -791,9 +791,10 @@
int x = text_pos.x;
int y = text_pos.y;
- for(unsigned int i = 0; i < text_lines.size(); i++)
+
+ for(SCP_vector<std::string>::iterator line = text_lines.begin(); line != text_lines.end(); line++)
{
- gr_string(x, y, (char*)text_lines[i].c_str(), false);
+ gr_string(x, y, (char*)line->c_str(), false);
y += font_height;
}
@@ -843,11 +844,8 @@
void subtitle::clone(const subtitle &sub)
{
- uint i = 0;
- for (i = 0; i < sub.text_lines.size(); i++) {
- text_lines.push_back(sub.text_lines[i]);
- }
+ text_lines = sub.text_lines;
text_fontnum = sub.text_fontnum;
// copy the structs
@@ -944,14 +942,6 @@
{
//Set Current_camera to nothing
Current_camera = camid();
- for(unsigned int i = 0; i < Cameras.size(); i++)
- {
- if(Cameras[i] != NULL)
- {
- delete Cameras[i];
- Cameras[i] = NULL;
- }
- }
Cameras.clear();
}
@@ -984,29 +974,9 @@
strncpy(buf, n_name, NAME_LENGTH-1);
//Find a free slot
- for(uint i = 0; i < Cameras.size(); i++)
- {
- if(Cameras[i] == NULL)
- {
- cam = new camera(buf, sig);
- cid = camid(i, sig);
- Cameras[i] = cam;
- break;
- }
- else if(Cameras[i]->is_empty())
- {
- delete Cameras[i];
- cam = new camera(buf, sig);
- cid = camid(i, sig);
- Cameras[i] = cam;
- }
- }
- if(cam == NULL)
- {
- cam = new camera(buf, sig);
- cid = camid(Cameras.size(), sig);
- Cameras.push_back(cam);
- }
+ cam = new camera(buf, sig);
+ cid = camid(Cameras.size(), sig);
+ Cameras.push_back(cam);
//Set attributes
if(n_pos != NULL)
@@ -1134,20 +1104,20 @@
void subtitles_do_frame(float frametime)
{
- unsigned int i,size=Subtitles.size();
- for(i = 0; i < size; i++)
+ SCP_vector<subtitle>::iterator sub;
+ for(sub = Subtitles.begin(); sub != Subtitles.end(); sub++)
{
- if ( !Subtitles[i].is_post_shaded( ) )
- Subtitles[i].do_frame(frametime);
+ if ( !sub->is_post_shaded( ) )
+ sub->do_frame(frametime);
}
}
void subtitles_do_frame_post_shaded(float frametime)
{
- unsigned int i,size=Subtitles.size();
- for(i = 0; i < size; i++)
+ SCP_vector<subtitle>::iterator sub;
+ for(sub = Subtitles.begin(); sub != Subtitles.end(); sub++)
{
- if ( Subtitles[i].is_post_shaded( ) )
- Subtitles[i].do_frame(frametime);
+ if ( sub->is_post_shaded( ) )
+ sub->do_frame(frametime);
}
}
\ No newline at end of file
Index: code/object/collideshipship.cpp
===================================================================
--- code/object/collideshipship.cpp (Revision 7347)
+++ code/object/collideshipship.cpp (Arbeitskopie)
@@ -271,34 +271,34 @@
pmi = model_get_instance(heavy_shipp->model_instance_num);
// turn off all rotating submodels and test for collision
- for (size_t j=0; j<submodel_vector.size(); j++) {
- pmi->submodel[submodel_vector[j]].collision_checked = true;
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
+ pmi->submodel[*smv].collision_checked = true;
}
// reset flags to check MC_CHECK_MODEL | MC_CHECK_SPHERELINE and maybe MC_CHECK_INVISIBLE_FACES and MC_SUBMODEL_INSTANCE
mc.flags = copy_flags | MC_SUBMODEL_INSTANCE;
// check each submodel in turn
- for (size_t i=0; i<submodel_vector.size(); i++) {
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
// turn on submodel for collision test
- pmi->submodel[submodel_vector[i]].collision_checked = false;
+ pmi->submodel[*smv].collision_checked = false;
// set angles for last frame
- angles copy_angles = pmi->submodel[submodel_vector[i]].angs;
+ angles copy_angles = pmi->submodel[*smv].angs;
// find the start and end positions of the sphere in submodel RF
- pmi->submodel[submodel_vector[i]].angs = pmi->submodel[submodel_vector[i]].prev_angs;
- world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
+ pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
+ world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
- pmi->submodel[submodel_vector[i]].angs = copy_angles;
- world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
+ pmi->submodel[*smv].angs = copy_angles;
+ world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
mc.p0 = &p0;
mc.p1 = &p1;
// mc.pos = zero // in submodel RF
mc.orient = &vmd_identity_matrix;
- mc.submodel_num = submodel_vector[i];
+ mc.submodel_num = *smv;
if ( model_collide(&mc) ) {
if (mc.hit_dist < ship_ship_hit_info->hit_time ) {
@@ -342,17 +342,17 @@
// set submodel angle at time of collision
// TODO: generalize... what happens when angle passes 0 or 2PI
angles temp_angs;
- vm_vec_sub(&diff, (vec3d*)&pm->submodel[submodel_vector[i]].angs, (vec3d*)&pm->submodel[submodel_vector[i]].sii->prev_angs);
- vm_vec_scale_add((vec3d*)&temp_angs, (vec3d *)&pm->submodel[submodel_vector[i]].sii->prev_angs, &diff, mc.hit_dist);
- pm->submodel[submodel_vector[i]].angs = temp_angs;
+ vm_vec_sub(&diff, (vec3d*)&pm->submodel[*smv].angs, (vec3d*)&pm->submodel[*smv].sii->prev_angs);
+ vm_vec_scale_add((vec3d*)&temp_angs, (vec3d *)&pm->submodel[*smv].sii->prev_angs, &diff, mc.hit_dist);
+ pm->submodel[*smv].angs = temp_angs;
// find intersection point in submodel RF - THEN advance to end of frametime.
vec3d temp = int_light_pos;
- world_find_model_point(&int_submodel_pos, &int_light_pos, pm, submodel_vector[i], &int_heavy_orient, &int_heavy_pos);
+ world_find_model_point(&int_submodel_pos, &int_light_pos, pm, *smv, &int_heavy_orient, &int_heavy_pos);
vec3d temp2;
// Advance to end of frametime
- pm->submodel[submodel_vector[i]].angs = copy_angles;
+ pm->submodel[*smv].angs = copy_angles;
model_find_world_point(&ship_ship_hit_info->light_collision_cm_pos, &int_submodel_pos, mc.model_num, mc.hit_submodel, mc.orient, &zero);
vm_vec_sub(&temp2, &ship_ship_hit_info->light_collision_cm_pos, &ship_ship_hit_info->hit_pos);
*/
@@ -362,7 +362,7 @@
}
}
// Don't look at this submodel again
- pmi->submodel[submodel_vector[i]].collision_checked = true;
+ pmi->submodel[*smv].collision_checked = true;
}
}
Index: code/sound/sound.cpp
===================================================================
--- code/sound/sound.cpp (Revision 7347)
+++ code/sound/sound.cpp (Arbeitskopie)
@@ -197,7 +197,6 @@
int message_sounds = 0;
int interface_sounds = 0;
int done = 0;
- size_t s_idx;
if(!Sound_spew){
return;
@@ -212,16 +211,16 @@
done = 0;
// what kind of sound is this
- for(s_idx=0; s_idx < Snds.size(); s_idx++){
- if(!stricmp(Snds[s_idx].filename, Sounds[idx].filename)){
+ for(SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++){
+ if(!stricmp(gs->filename, Sounds[idx].filename)){
game_sounds++;
done = 1;
}
}
if(!done){
- for(s_idx=0; s_idx < Snds.size(); s_idx++){
- if(!stricmp(Snds_iface[s_idx].filename, Sounds[idx].filename)){
+ for(SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++){
+ if(!stricmp(gs->filename, Sounds[idx].filename)){
interface_sounds++;
done = 1;
}
Index: code/math/vecmat.cpp
===================================================================
--- code/math/vecmat.cpp (Revision 7347)
+++ code/math/vecmat.cpp (Arbeitskopie)
@@ -341,12 +341,7 @@
mag1 = x+y+z;
- if ( mag1 < 0.0 )
- return 0;
-
mag2 = fl_sqrt(mag1);
- if ( mag2 < 0.0 )
- Int3();
return mag2;
}
@@ -510,8 +505,16 @@
//returns approximation of 1/magnitude of a vector
float vm_vec_imag(vec3d *v)
{
-// return 1.0f / sqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
- return fl_isqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
+#if _M_IX86_FP < 1
+ return 1.0f / sqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
+#else
+ float x = (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z);
+ __m128 xx = _mm_load_ss( & x );
+ xx = _mm_rsqrt_ss( xx );
+ _mm_store_ss( & x, xx );
+
+ return x;
+#endif
}
//normalize a vector. returns 1/mag of source vec. uses approx 1/mag
@@ -809,7 +812,32 @@
return t;
}
+//generate the vectors for the vm_vector_2_matrix() an vm_vector_2_matrix_norm() functions so we can avoid goto
+void vm_vector_2_matrix_gen_vectors(matrix *m)
+{
+ vec3d *xvec=&m->vec.rvec;
+ vec3d *yvec=&m->vec.uvec;
+ vec3d *zvec=&m->vec.fvec;
+
+ if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
+ m->vec.rvec.xyz.x = 1.0f;
+ m->vec.uvec.xyz.z = (zvec->xyz.y<0.0f)?1.0f:-1.0f;
+ m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
+ }
+ else { //not straight up or down
+
+ xvec->xyz.x = zvec->xyz.z;
+ xvec->xyz.y = 0.0f;
+ xvec->xyz.z = -zvec->xyz.x;
+
+ vm_vec_normalize(xvec);
+
+ vm_vec_crossprod(yvec,zvec,xvec);
+
+ }
+}
+
//computes a matrix from one or more vectors. The forward vector is required,
//with the other two being optional. If both up & right vectors are passed,
//the up vector is used. If only the forward vector is passed, a bank of
@@ -819,72 +847,44 @@
{
vec3d *xvec=&m->vec.rvec,*yvec=&m->vec.uvec,*zvec=&m->vec.fvec;
-
Assert(fvec != NULL);
- // This had been commented out, but that's bogus. Code below relies on a valid zvec.
+ // This had been commented out, but that's bogus. Code below relies on a valid zvec.
if (vm_vec_copy_normalize(zvec,fvec) == 0.0f) {
Assert(0);
return m;
}
if (uvec == NULL) {
-
- if (rvec == NULL) { //just forward vec
-
-bad_vector2:
- ;
-
- if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
-
- m->vec.rvec.xyz.x = 1.0f;
- m->vec.uvec.xyz.z = (zvec->xyz.y<0.0)?1.0f:-1.0f;
-
- m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
- }
- else { //not straight up or down
-
- xvec->xyz.x = zvec->xyz.z;
- xvec->xyz.y = 0.0f;
- xvec->xyz.z = -zvec->xyz.x;
-
- vm_vec_normalize(xvec);
-
- vm_vec_crossprod(yvec,zvec,xvec);
-
- }
-
+ if (rvec == NULL) { //just forward vec
+ vm_vector_2_matrix_gen_vectors(m);
}
- else { //use right vec
-
+ else { //use right vec
if (vm_vec_copy_normalize(xvec,rvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
vm_vec_crossprod(yvec,zvec,xvec);
//normalize new perpendicular vector
if (vm_vec_normalize(yvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute right vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(xvec,yvec,zvec);
-
}
}
- else { //use up vec
-
+ else { //use up vec
if (vm_vec_copy_normalize(yvec,uvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
vm_vec_crossprod(xvec,yvec,zvec);
-
+
//normalize new perpendicular vector
if (vm_vec_normalize(xvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute up vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(yvec,zvec,xvec);
-
}
return m;
}
@@ -896,65 +896,35 @@
vec3d *yvec=&m->vec.uvec;
vec3d *zvec=&m->vec.fvec;
-
Assert(fvec != NULL);
*zvec = *fvec;
if (uvec == NULL) {
-
- if (rvec == NULL) { //just forward vec
-
-bad_vector2:
- ;
-
- if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
-
- m->vec.rvec.xyz.x = 1.0f;
- m->vec.uvec.xyz.z = (zvec->xyz.y<0.0f)?1.0f:-1.0f;
-
- m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
- }
- else { //not straight up or down
-
- xvec->xyz.x = zvec->xyz.z;
- xvec->xyz.y = 0.0f;
- xvec->xyz.z = -zvec->xyz.x;
-
- vm_vec_normalize(xvec);
-
- vm_vec_crossprod(yvec,zvec,xvec);
-
- }
-
+ if (rvec == NULL) { //just forward vec
+ vm_vector_2_matrix_gen_vectors(m);
}
- else { //use right vec
-
+ else { //use right vec
vm_vec_crossprod(yvec,zvec,xvec);
//normalize new perpendicular vector
if (vm_vec_normalize(yvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute right vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(xvec,yvec,zvec);
-
}
}
- else { //use up vec
-
+ else { //use up vec
vm_vec_crossprod(xvec,yvec,zvec);
-
+
//normalize new perpendicular vector
if (vm_vec_normalize(xvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute up vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(yvec,zvec,xvec);
-
}
-
-
return m;
}
Index: code/math/fvi.cpp
===================================================================
--- code/math/fvi.cpp (Revision 7347)
+++ code/math/fvi.cpp (Arbeitskopie)
@@ -1010,8 +1010,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
// sort root1 and root2
@@ -1056,8 +1057,9 @@
}
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
// given sphere position, find which edge time (position) allows a valid solution
if ( (root1 >= 0) && (root1 <= 1) ) {
@@ -1104,8 +1106,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
if (root1 > root2) {
temp = root1;
@@ -1137,8 +1140,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
if (root1 > root2) {
temp = root1;
Index: code/debris/debris.cpp
===================================================================
--- code/debris/debris.cpp (Revision 7347)
+++ code/debris/debris.cpp (Arbeitskopie)
@@ -941,34 +941,34 @@
pmi = model_get_instance(Ships[heavy_obj->instance].model_instance_num);
// turn off all rotating submodels and test for collision
- for (size_t j=0; j<submodel_vector.size(); j++) {
- pmi->submodel[submodel_vector[j]].collision_checked = true;
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
+ pmi->submodel[*smv].collision_checked = true;
}
// reset flags to check MC_CHECK_MODEL | MC_CHECK_SPHERELINE and maybe MC_CHECK_INVISIBLE_FACES and MC_SUBMODEL_INSTANCE
mc.flags = copy_flags | MC_SUBMODEL_INSTANCE;
// check each submodel in turn
- for (size_t i=0; i<submodel_vector.size(); i++) {
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
// turn on submodel for collision test
- pmi->submodel[submodel_vector[i]].collision_checked = false;
+ pmi->submodel[*smv].collision_checked = false;
// set angles for last frame (need to set to prev to get p0)
- angles copy_angles = pmi->submodel[submodel_vector[i]].angs;
+ angles copy_angles = pmi->submodel[*smv].angs;
// find the start and end positions of the sphere in submodel RF
- pmi->submodel[submodel_vector[i]].angs = pmi->submodel[submodel_vector[i]].prev_angs;
- world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
+ pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
+ world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
- pmi->submodel[submodel_vector[i]].angs = copy_angles;
- world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
+ pmi->submodel[*smv].angs = copy_angles;
+ world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
mc.p0 = &p0;
mc.p1 = &p1;
// mc.pos = zero // in submodel RF
mc.orient = &vmd_identity_matrix;
- mc.submodel_num = submodel_vector[i];
+ mc.submodel_num = *smv;
if ( model_collide(&mc) ) {
if ( mc.hit_dist < debris_hit_info->hit_time ) {
@@ -991,7 +991,7 @@
}
}
// Don't look at this submodel again
- pmi->submodel[submodel_vector[i]].collision_checked = true;
+ pmi->submodel[*smv].collision_checked = true;
}
}
Index: code/cutscene/cutscenes.cpp
===================================================================
--- code/cutscene/cutscenes.cpp (Revision 7347)
+++ code/cutscene/cutscenes.cpp (Arbeitskopie)
@@ -42,13 +42,9 @@
//extern int All_movies_enabled; // If set, all movies may be viewed. Keyed off cheat code.
void cutscene_close()
{
- for(size_t i = 0; i < Cutscenes.size(); i++)
- {
- if(Cutscenes[i].description)
- {
- vm_free(Cutscenes[i].description);
- }
- }
+ for(SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++)
+ if(cut->description)
+ vm_free(cut->description);
}
// initialization stuff for cutscenes
@@ -114,9 +110,9 @@
return 0; // only 1 cd for OEM
#else
- for (size_t i = 0; i < Cutscenes.size(); i++ ) {
- if ( !stricmp(Cutscenes[i].filename, filename) ) {
- return (Cutscenes[i].cd - 1);
+ for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++) {
+ if ( !stricmp(cut->filename, filename) ) {
+ return (cut->cd - 1);
}
}
@@ -141,10 +137,10 @@
// change to lower case
strlwr(file);
-
- for (size_t i = 0; i < Cutscenes.size(); i++ ) {
+ int i = 0;
+ for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++) {
// change the cutscene file name to lower case
- strcpy_s(cut_file, Cutscenes[i].filename);
+ strcpy_s(cut_file, cut->filename);
strlwr(cut_file);
// see if the stripped filename matches the cutscene filename
@@ -152,6 +148,7 @@
Cutscenes_viewable |= (1<<i);
return;
}
+ i++;
}
}
@@ -507,7 +504,9 @@
// Cutscenes_viewable = 0xffffffff; // Cheat code enables all movies.
Cutscene_list.clear();
- for (size_t j = 0; j < Cutscenes.size(); j++ ) {
+
+ int size = Cutscenes.size();
+ for (int j=0;j < size;j++) {
if ( Cutscenes_viewable & (1<<j) ) {
Cutscene_list.push_back((int)j);
}
@@ -568,7 +567,8 @@
case KEY_CTRLED | KEY_SHIFTED | KEY_S:
{
Cutscene_list.clear();
- for (size_t t = 0; t < Cutscenes.size(); t++) {
+ unsigned int size = Cutscenes.size();
+ for (size_t t = 0; t < size; t++) {
Cutscene_list.push_back((int)t);
}
Index: code/parse/lua.cpp
===================================================================
--- code/parse/lua.cpp (Revision 7347)
+++ code/parse/lua.cpp (Arbeitskopie)
@@ -13135,6 +13135,7 @@
char *type_name = NULL;
uint ade_id = UINT_MAX;
int mtb_ldx = INT_MAX;
+ ade_table_entry* entry = 0;
//*****STEP 1: Check for user-defined objects
if(lua_istable(L, obj_ldx) && !ADE_SETTING_VAR)
@@ -13154,7 +13155,7 @@
lua_pushcfunction(L, ade_friendly_error);
int err_ldx = lua_gettop(L);
int i;
-
+
//*****WMC - go for the type name
lua_pushstring(L, "__adeid");
lua_rawget(L, mtb_ldx);
@@ -13162,7 +13163,10 @@
{
ade_id = (uint) lua_tonumber(L, -1);
if(ade_id < Ade_table_entries.size())
- type_name = Ade_table_entries[ade_id].Name;
+ {
+ entry = &Ade_table_entries[ade_id];
+ type_name = entry->Name;
+ }
}
lua_pop(L, 1);
@@ -13174,7 +13178,7 @@
//Get userdata sig
char *ud = (char *)lua_touserdata(L, obj_ldx);
- ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + Ade_table_entries[ade_id].Value.Object.size);
+ ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + entry->Value.Object.size);
//Now use it to index the table with that #
lua_pushnumber(L, sig);
@@ -13297,7 +13301,7 @@
//Get userdata sig
char *ud = (char *)lua_touserdata(L, obj_ldx);
- ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + Ade_table_entries[ade_id].Value.Object.size);
+ ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + entry->Value.Object.size);
//Now use it to index the table with that #
lua_pushnumber(L, sig);
Index: code/parse/scripting.cpp
===================================================================
--- code/parse/scripting.cpp (Revision 7347)
+++ code/parse/scripting.cpp (Arbeitskopie)
@@ -398,10 +398,8 @@
Assert(sys != NULL);
//Do the actions
- script_action *sap;
- for(uint i = 0; i < Actions.size(); i++)
+ for(SCP_vector<script_action>::iterator sap = Actions.begin(); sap != Actions.end(); sap++)
{
- sap = &Actions[i];
if(sap->action_type == action)
sys->RunBytecode(sap->hook, format, data);
}
@@ -415,10 +413,8 @@
//bool b = false;
//Do the actions
- script_action *sap;
- for(uint i = 0; i < Actions.size(); i++)
+ for(SCP_vector<script_action>::iterator sap = Actions.begin(); sap != Actions.end(); sap++)
{
- sap = &Actions[i];
if(sap->action_type == action)
{
if(sys->IsOverride(sap->hook))
@@ -805,11 +801,9 @@
int script_state::RunCondition(int action, char format, void *data, object *objp)
{
- ConditionedHook *chp = NULL;
int num = 0;
- for(uint i= 0; i < ConditionalHooks.size(); i++)
+ for(SCP_vector<ConditionedHook>::iterator chp = ConditionalHooks.begin(); chp != ConditionalHooks.end(); chp++)
{
- chp = &ConditionalHooks[i];
if(chp->ConditionsValid(action, objp))
{
chp->Run(this, action, format, data);
@@ -821,11 +815,9 @@
bool script_state::IsConditionOverride(int action, object *objp)
{
- ConditionedHook *chp = NULL;
//bool b = false;
- for(uint i= 0; i < ConditionalHooks.size(); i++)
+ for(SCP_vector<ConditionedHook>::iterator chp = ConditionalHooks.begin(); chp != ConditionalHooks.end(); chp++)
{
- chp = &ConditionalHooks[i];
if(chp->ConditionsValid(action, objp))
{
if(chp->IsOverride(this, action))
Index: code/autopilot/autopilot.cpp
===================================================================
--- code/autopilot/autopilot.cpp (Revision 7347)
+++ code/autopilot/autopilot.cpp (Arbeitskopie)
@@ -372,8 +372,7 @@
{
capshipPresent = true;
- capIndexes.resize(capIndexes.size()+1);
- capIndexes[capIndexes.size()-1] = i;
+ capIndexes.push_back(i);
// ok.. what size class
if (Ship_info[Ships[i].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
@@ -559,13 +558,13 @@
// position capships
vec3d right, front, up, offset;
- for (i = 0; i < (int)capIndexes.size(); i++)
+ for (SCP_vector<int>::iterator idx = capIndexes.begin(); idx != capIndexes.end(); idx++)
{
vm_vec_add(&right, &Autopilot_flight_leader->orient.vec.rvec, &zero);
vm_vec_add(&front, &Autopilot_flight_leader->orient.vec.fvec, &zero);
vm_vec_add(&up, &Autopilot_flight_leader->orient.vec.uvec, &zero);
vm_vec_add(&offset, &zero, &zero);
- if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
+ if (Ship_info[Ships[*idx].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
{
//0 - below - three lines of position
@@ -599,7 +598,7 @@
capship_placed[0]++;
}
- else if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & SIF_CORVETTE)
+ else if (Ship_info[Ships[*idx].ship_info_index].flags & SIF_CORVETTE)
{
//1 above - 3 lines of position
// front/back to zero
@@ -708,7 +707,7 @@
// global scale the position by 50%
//vm_vec_scale(&offset, 1.5);
- vm_vec_add(&Objects[Ships[capIndexes[i]].objnum].pos, &Autopilot_flight_leader->pos, &offset);
+ vm_vec_add(&Objects[Ships[*idx].objnum].pos, &Autopilot_flight_leader->pos, &offset);
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos) > distance)
{
Index: code/ai/aicode.cpp
===================================================================
--- code/ai/aicode.cpp (Revision 7347)
+++ code/ai/aicode.cpp (Arbeitskopie)
@@ -359,20 +359,18 @@
// which can be fired on target_objp
int is_preferred_weapon(int weapon_num, object *firer_objp, object *target_objp)
{
- int i, firer_team, target_signature;
+ int firer_team, target_signature;
ship *firer_ship;
- huge_fire_info *hfi = NULL;
-
+ SCP_vector<huge_fire_info>::iterator hfi;
Assert( firer_objp->type == OBJ_SHIP );
firer_ship = &Ships[firer_objp->instance];
firer_team = firer_ship->team;
// get target object's signature and try to find it in the list.
target_signature = target_objp->signature;
- for ( i = 0; i < (int)Ai_huge_fire_info.size(); i++ ) {
+ for (hfi = Ai_huge_fire_info.begin();hfi != Ai_huge_fire_info.end(); ++hfi ) {
int ship_index, signature;
- hfi = &Ai_huge_fire_info[i];
if ( hfi->weapon_index == -1 )
continue;
@@ -388,7 +386,7 @@
}
// return -1 if not found
- if ( i == (int)Ai_huge_fire_info.size() )
+ if ( hfi == Ai_huge_fire_info.end() )
return -1;
// otherwise, we can return the max number of weapons we can fire against target_objps
-
Man I wished I knew how to code. All this talk about codes and whatnots and all the stuff that it makes possible is so sexy.
-
Code cleanup is good, as is fixing bad usage of std::vector and iterators, but Valathil, it looks like the vast majority of your changes there are simply paper-shuffling. You've replaced the array index access method with an iterator method. That isn't wrong, but it's also not necessary, since the array index accessor works perfectly fine.
-
Isn't array indexing slower on a std::vector than using iterators?
-
As I understand it array access has to iterate from the beginning to the requested index. which mean when traversing a 10 size vector by int i about 50 iterations. Thats what i heard at least, if this is not the case fine i did the work uselessly, whatever. Its still the right way to do it.
-
STL vector element access using [ ] is constant O(1) time according to the Bjarne Stroustrup C++ book.
-
@Swifty: An O(1) access can still be faster than another O(1) access!
-
2010 doesn't seem to care, but for 2008 and earlier, it seems that vecmat.cpp needs "#include <xmmintrin.h>" in order to be happy.
(According to MSDN, 2010 should also have this include, but it seems to be handling it automagically somehow)
-
Applying this patch yielded minimal performance increase when running WiH's Artemis Station cutscene. Which is good enough for me.
-
@Swifty: An O(1) access can still be faster than another O(1) access!
And I'm not precluding that fact. But I had to make sure for the record that element access using [ ] for STL vector is definitely not O(n) complexity.
-
Oops wrong thread
I just know that in debug without optimizations it was the call that cost the most cpu time about 15% or so and now its down to 10% so whatever, take it or leave it. Its the right way to do it even if its just "Paper-Shuffling".
-
I think 5% increase on the CPU performance for such a tiny bit of code is just awesome. Keep it up Valathil!
-
Vala, I have high hopes for you :yes:
-
thank you :)
-
Applying this patch yielded minimal performance increase when running WiH's Artemis Station cutscene. Which is good enough for me.
I just know that in debug without optimizations it was the call that cost the most cpu time about 15% or so and now its down to 10%
These are valid reasons to apply the patch. :yes:
Valathil, what I refer to as "paper shuffling" is merely the doing of unnecessary work for appearances' sake or because you want things done a certain way. This is disadvantageous for two reasons. First, it is spending time that yields no net benefit, whereas that time could be more productively used in another area of the code. Second, any time the code is changed there is a risk of introducing bugs. So there's a possibility that code that worked fine previously will no longer work, which then causes lost time in the future as other coders must diagnose and then fix the problem.
Now that turned out not to be the case here. In the initial evaluation, both iterator access and array access are O(1), so they were thought to be equivalent. In the subsequent evaluation, there was a small but measurable speed improvement with the new code. Given that we are always looking for ways to make the code faster and more robust, this patch will be a net improvement.
Does all that make sense?
-
The reason for a lot of the bad Vector code is simply that this used to be code using fixed arrays and when it was converted to using Vectors people simply left the existing code in place rather than using iterators because it worked.
-
Changing these where speed improvements can be noted is probably good, but Goober's right that any change has the potential to create unintended consequences, but it sounds like these are being evaluated for their potential benefit already. I'm glad to see that took place.
-
- Compiles cleanly on recent Mac.
- No additional valgrind (http://valgrind.org/) warnings from Valathil's code cleanup patch.
To note that because valgrind actually runs the program in an instrumented fashion, it is very slow. So I've only tested the initial parsing, GL shader compile and player file parsing. i.e. up to the main lobby screen
-
In cutscenes.cpp, I'm not quite clear on this change:
- for (size_t j = 0; j < Cutscenes.size(); j++ ) {
+
+ int size = Cutscenes.size();
+ for (int j=0;j < size;j++) {
Shouldn't the type returned by a .size() call be size_t (i.e. unsigned int on most platforms), not an int?
-
good catch yes it should
-
I guess another way to write it might be
for (size_t j = 0, size = Cutscenes.size(); j < size; j++) {
since that way, you avoid making multiple calls to Cutscenes.size() while minimizing the scope of size. Not that I actually advocate making such a change in this case, mind you.
-
Index: code/fireball/fireballs.cpp
===================================================================
--- code/fireball/fireballs.cpp (Revision 7362)
+++ code/fireball/fireballs.cpp (Arbeitskopie)
@@ -239,7 +239,7 @@
void fireball_parse_tbl()
{
- int i, j;
+ int i = 0 , j;
memset( &Fireball_info, 0, sizeof(fireball_info) * MAX_FIREBALL_TYPES );
@@ -251,10 +251,10 @@
// we've got our list so pass it off for final checking and loading.
// we assume that entries in fireball.tbl are in the correct order
- for (i = 0; i < (int)LOD_checker.size(); i++) {
- if ( (i < MAX_FIREBALL_TYPES) && (LOD_checker[i].override < 0) ) {
- strcpy_s( Fireball_info[i].lod[0].filename, LOD_checker[i].filename );
- Fireball_info[i].lod_count = LOD_checker[i].num_lods;
+ for (SCP_vector<lod_checker>::iterator lod = LOD_checker.begin(); lod != LOD_checker.end(); lod++) {
+ if ( (i < MAX_FIREBALL_TYPES) && (lod->override < 0) ) {
+ strcpy_s( Fireball_info[i].lod[0].filename, lod->filename );
+ Fireball_info[i].lod_count = lod->num_lods;
Num_fireball_types++;
if (LOD_color[i].alpha == 255) {
@@ -265,22 +265,24 @@
fireball_set_default_color(i);
}
}
+ i++;
}
// having to do this twice is less than optimal, but less error prone too.
// this handles (and should only have to handle) TBM related entries
- for (i = 0; i < (int)LOD_checker.size(); i++) {
+ i = 0;
+ for (SCP_vector<lod_checker>::iterator lod = LOD_checker.begin(); lod != LOD_checker.end(); lod++) {
// try entry replacement
- if ( (LOD_checker[i].override >= 0) && (LOD_checker[i].override < Num_fireball_types) ) {
- strcpy_s( Fireball_info[LOD_checker[i].override].lod[0].filename, LOD_checker[i].filename );
- Fireball_info[LOD_checker[i].override].lod_count = LOD_checker[i].num_lods;
+ if ( (lod->override >= 0) && (lod->override < Num_fireball_types) ) {
+ strcpy_s( Fireball_info[lod->override].lod[0].filename, lod->filename );
+ Fireball_info[lod->override].lod_count = lod->num_lods;
if (LOD_color[i].alpha == 255) {
- Fireball_info[LOD_checker[i].override].exp_color[0] = (LOD_color[i].red / 255.0f);
- Fireball_info[LOD_checker[i].override].exp_color[1] = (LOD_color[i].green / 255.0f);
- Fireball_info[LOD_checker[i].override].exp_color[2] = (LOD_color[i].blue / 255.0f);
+ Fireball_info[lod->override].exp_color[0] = (LOD_color[i].red / 255.0f);
+ Fireball_info[lod->override].exp_color[1] = (LOD_color[i].green / 255.0f);
+ Fireball_info[lod->override].exp_color[2] = (LOD_color[i].blue / 255.0f);
} else {
- fireball_set_default_color(LOD_checker[i].override);
+ fireball_set_default_color(lod->override);
}
}
}
Index: code/cfile/cfilesystem.cpp
===================================================================
--- code/cfile/cfilesystem.cpp (Revision 7362)
+++ code/cfile/cfilesystem.cpp (Arbeitskopie)
@@ -1213,17 +1213,10 @@
file_list_index.push_back( f );
}
- size_t file_list_size = file_list_index.size();
-
- // quick exit test
- if (file_list_size < 1)
- goto Bail;
-
-
// now try and find our preferred match
for (cur_ext = 0; cur_ext < ext_num; cur_ext++) {
- for (size_t i = 0; i < file_list_size; i++) {
- cf_file *f = file_list_index[i];
+ for (SCP_vector<cf_file*>::iterator fli = file_list_index.begin(); fli != file_list_index.end(); fli++) {
+ cf_file *f = *fli;
strcat_s( filespec, ext_list[cur_ext] );
@@ -1302,10 +1295,6 @@
}
}
-Bail:
- // didn't find anything, bail...
- file_list_index.clear();
-
return -1;
}
Index: code/fs2netd/fs2netd_client.cpp
===================================================================
--- code/fs2netd/fs2netd_client.cpp (Revision 7362)
+++ code/fs2netd/fs2netd_client.cpp (Arbeitskopie)
@@ -1183,8 +1183,8 @@
CFILE *banlist_cfg = cfopen("banlist.cfg", "wt", CFILE_NORMAL, CF_TYPE_DATA);
if (banlist_cfg != NULL) {
- for (uint i = 0; i < FS2NetD_ban_list.size(); i++) {
- cfputs( const_cast<char*>(FS2NetD_ban_list[i].c_str()), banlist_cfg );
+ for (SCP_vector<std::string>::iterator bl = FS2NetD_ban_list.begin(); bl != FS2NetD_ban_list.end(); bl++) {
+ cfputs( const_cast<char*>(bl->c_str()), banlist_cfg );
}
cfclose(banlist_cfg);
@@ -1267,7 +1267,6 @@
char valid_status = MVALID_STATUS_UNKNOWN;
char full_name[MAX_FILENAME_LEN], wild_card[10];
char val_text[MAX_FILENAME_LEN+15];
- int i;
uint checksum = 0;
if (file_names == NULL) {
@@ -1332,9 +1331,9 @@
found = false;
if (file_index >= 0) {
- for (i = 0; (i < (int)FS2NetD_file_list.size()) && (!found); i++) {
- if ( !stricmp(full_name, FS2NetD_file_list[i].name) ) {
- if (FS2NetD_file_list[i].crc32 == checksum) {
+ for (SCP_vector<file_record>::iterator fr = FS2NetD_file_list.begin(); fr != FS2NetD_file_list.end() && !found; fr++) {
+ if ( !stricmp(full_name, fr->name) ) {
+ if (fr->crc32 == checksum) {
found = true;
valid_status = MVALID_STATUS_VALID;
} else {
@@ -1512,11 +1511,11 @@
}
// output the status of table validity to multi.log
- for (uint i = 0; i < Table_valid_status.size(); i++) {
- if (Table_valid_status[i].valid) {
- ml_printf("FS2NetD Table Check: '%s' -- Valid!", Table_valid_status[i].name);
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
+ if (tvs->valid) {
+ ml_printf("FS2NetD Table Check: '%s' -- Valid!", tvs->name);
} else {
- ml_printf("FS2NetD Table Check: '%s' -- INVALID (0x%x)!", Table_valid_status[i].name, Table_valid_status[i].crc32);
+ ml_printf("FS2NetD Table Check: '%s' -- INVALID (0x%x)!", tvs->name, tvs->crc32);
hacked = 1;
}
}
@@ -1645,7 +1644,7 @@
void fs2netd_spew_table_checksums(char *outfile)
{
char full_name[MAX_PATH_LEN];
- int count, idx;
+ int count;
FILE *out = NULL;
char description[512] = { 0 };
char filename[65] = { 0 };
@@ -1684,9 +1683,9 @@
count = (int)Table_valid_status.size();
// do all the checksums
- for (idx = 0; idx < count; idx++) {
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
offset = 0;
- p = Table_valid_status[idx].name;
+ p = tvs->name;
while (*p && (offset < sizeof(filename))) {
if (*p == '"') {
@@ -1701,7 +1700,7 @@
filename[offset] = '\0';
- fprintf(out, "\"%s\",%u,\"%s\"\r\n", filename, Table_valid_status[idx].crc32, description);
+ fprintf(out, "\"%s\",%u,\"%s\"\r\n", filename, tvs->crc32, description);
}
fflush(out);
Index: code/fs2netd/tcp_client.cpp
===================================================================
--- code/fs2netd/tcp_client.cpp (Revision 7362)
+++ code/fs2netd/tcp_client.cpp (Arbeitskopie)
@@ -686,7 +686,6 @@
int buffer_size, buffer_offset;
bool my_packet = false;
char buffer[4096];
- uint i;
ushort num_tables = 0;
if (do_send) {
@@ -697,9 +696,9 @@
PXO_ADD_USHORT( num_tables );
- for (i = 0; i < Table_valid_status.size(); i++) {
- PXO_ADD_STRING( Table_valid_status[i].name );
- PXO_ADD_UINT( Table_valid_status[i].crc32 );
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
+ PXO_ADD_STRING(tvs->name );
+ PXO_ADD_UINT( tvs->crc32 );
}
DONE_PACKET();
@@ -761,11 +760,11 @@
return -1;
}
- for (i = 0; i < Table_valid_status.size(); i++) {
+ for (SCP_vector<crc_valid_status>::iterator tvs = Table_valid_status.begin(); tvs != Table_valid_status.end(); tvs++) {
PXO_GET_DATA( tbl_valid_status );
Assert( (tbl_valid_status == 0) || (tbl_valid_status == 1) );
- Table_valid_status[i].valid = tbl_valid_status;
+ tvs->valid = tbl_valid_status;
}
return 2;
Index: code/asteroid/asteroid.cpp
===================================================================
--- code/asteroid/asteroid.cpp (Revision 7362)
+++ code/asteroid/asteroid.cpp (Arbeitskopie)
@@ -607,8 +607,9 @@
Num_asteroids = 0;
Next_asteroid_throw = timestamp(1);
asteroid_obj_list_init();
- for (size_t t=0; t<Asteroid_info.size(); t++)
- Asteroid_info[t].damage_type_idx = Asteroid_info[t].damage_type_idx_sav;
+ SCP_vector<asteroid_info>::iterator ast;
+ for (ast = Asteroid_info.begin(); ast != Asteroid_info.end(); ++ast)
+ ast->damage_type_idx = ast->damage_type_idx_sav;
}
// return !0 if asteroid should be wrapped, 0 otherwise. Multiplayer clients will always return
Index: code/gamesnd/gamesnd.cpp
===================================================================
--- code/gamesnd/gamesnd.cpp (Revision 7362)
+++ code/gamesnd/gamesnd.cpp (Arbeitskopie)
@@ -39,20 +39,22 @@
int gamesnd_get_by_name(char* name)
{
Assert( Snds.size() <= INT_MAX );
- for(int i = 0; i < (int)Snds.size(); i++)
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++)
{
- char *p = strrchr( Snds[i].filename, '.' );
+ char *p = strrchr( snd->filename, '.' );
if(p == NULL)
{
- if(!stricmp(Snds[i].filename, name))
+ if(!stricmp(snd->filename, name))
{
return i;
}
}
- else if(!strnicmp(Snds[i].filename, name, p-Snds[i].filename))
+ else if(!strnicmp(snd->filename, name, p-snd->filename))
{
return i;
}
+ i++;
}
return -1;
}
@@ -63,11 +65,13 @@
if (index == -1)
return -1;
Assert( Snds.size() <= INT_MAX );
- for(int i = 0; i < (int)Snds.size(); i++) {
- if ( Snds[i].sig == index )
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++) {
+ if ( snd->sig == index )
{
return i;
}
+ i++;
}
return -1;
}
@@ -76,11 +80,13 @@
{
Assert( Snds_iface.size() <= INT_MAX );
Assert( Snds_iface.size() == Snds_iface_handle.size() );
- for(int i = 0; i < (int)Snds_iface.size(); i++) {
- if ( Snds_iface[i].sig == index )
+ int i = 0;
+ for(SCP_vector<game_snd>::iterator snd = Snds.begin(); snd != Snds.end(); snd++) {
+ if ( snd->sig == index )
{
return i;
}
+ i++;
}
return -1;
}
@@ -125,19 +131,15 @@
// fly (too slow).
void gamesnd_preload_common_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
if ( gs->preload ) {
game_busy( NOX("** preloading common game sounds **") ); // Animate loading cursor... does nothing if loading screen not active.
- gs->id = snd_load(gs);
+ gs->id = snd_load(&(*gs));
}
}
}
@@ -150,19 +152,15 @@
//
void gamesnd_load_gameplay_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
if ( !gs->preload ) { // don't try to load anything that's already preloaded
game_busy( NOX("** preloading gameplay sounds **") ); // Animate loading cursor... does nothing if loading screen not active.
- gs->id = snd_load(gs);
+ gs->id = snd_load(&(*gs));
}
}
}
@@ -175,12 +173,8 @@
//
void gamesnd_unload_gameplay_sounds()
{
- int i;
- game_snd *gs;
-
Assert( Snds.size() <= INT_MAX );
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gs = &Snds[i];
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
if ( gs->id != -1 ) {
snd_unload( gs->id );
gs->id = -1;
@@ -195,17 +189,13 @@
//
void gamesnd_load_interface_sounds()
{
- int i;
- game_snd *gs;
-
if ( !Sound_enabled )
return;
Assert( Snds_iface.size() < INT_MAX );
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gs = &Snds_iface[i];
- if ( gs->filename[0] != 0 && strnicmp(gs->filename, NOX("none.wav"), 4) ) {
- gs->id = snd_load(gs);
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ if ( si->filename[0] != 0 && strnicmp(si->filename, NOX("none.wav"), 4) ) {
+ si->id = snd_load(&(*si));
}
}
}
@@ -217,16 +207,12 @@
//
void gamesnd_unload_interface_sounds()
{
- int i;
- game_snd *gs;
-
Assert( Snds_iface.size() < INT_MAX );
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gs = &Snds_iface[i];
- if ( gs->id != -1 ) {
- snd_unload( gs->id );
- gs->id = -1;
- gs->id_sig = -1;
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ if ( si->id != -1 ) {
+ snd_unload( si->id );
+ si->id = -1;
+ si->id_sig = -1;
}
}
}
@@ -522,7 +508,7 @@
//
void gamesnd_init_sounds()
{
- int i;
+ int i = 0;
Snds.clear();
Snds.resize(MIN_GAME_SOUNDS);
@@ -531,8 +517,8 @@
Assert( Snds.size() <= INT_MAX );
// init the gameplay sounds
- for ( i = 0; i < (int)Snds.size(); i++ ) {
- gamesnd_init_struct(&Snds[i]);
+ for (SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++) {
+ gamesnd_init_struct(&(*gs));
}
Snds_iface.clear();
@@ -543,9 +529,11 @@
Assert( Snds_iface.size() < INT_MAX );
// init the interface sounds
- for ( i = 0; i < (int)Snds_iface.size(); i++ ) {
- gamesnd_init_struct(&Snds_iface[i]);
+
+ for (SCP_vector<game_snd>::iterator si = Snds_iface.begin(); si != Snds_iface.end(); si++) {
+ gamesnd_init_struct(&(*si));
Snds_iface_handle[i] = -1;
+ i++;
}
}
Index: code/camera/camera.cpp
===================================================================
--- code/camera/camera.cpp (Revision 7362)
+++ code/camera/camera.cpp (Arbeitskopie)
@@ -791,9 +791,10 @@
int x = text_pos.x;
int y = text_pos.y;
- for(unsigned int i = 0; i < text_lines.size(); i++)
+
+ for(SCP_vector<std::string>::iterator line = text_lines.begin(); line != text_lines.end(); line++)
{
- gr_string(x, y, (char*)text_lines[i].c_str(), false);
+ gr_string(x, y, (char*)line->c_str(), false);
y += font_height;
}
@@ -843,11 +844,8 @@
void subtitle::clone(const subtitle &sub)
{
- uint i = 0;
- for (i = 0; i < sub.text_lines.size(); i++) {
- text_lines.push_back(sub.text_lines[i]);
- }
+ text_lines = sub.text_lines;
text_fontnum = sub.text_fontnum;
// copy the structs
@@ -944,14 +942,6 @@
{
//Set Current_camera to nothing
Current_camera = camid();
- for(unsigned int i = 0; i < Cameras.size(); i++)
- {
- if(Cameras[i] != NULL)
- {
- delete Cameras[i];
- Cameras[i] = NULL;
- }
- }
Cameras.clear();
}
@@ -984,29 +974,9 @@
strncpy(buf, n_name, NAME_LENGTH-1);
//Find a free slot
- for(uint i = 0; i < Cameras.size(); i++)
- {
- if(Cameras[i] == NULL)
- {
- cam = new camera(buf, sig);
- cid = camid(i, sig);
- Cameras[i] = cam;
- break;
- }
- else if(Cameras[i]->is_empty())
- {
- delete Cameras[i];
- cam = new camera(buf, sig);
- cid = camid(i, sig);
- Cameras[i] = cam;
- }
- }
- if(cam == NULL)
- {
- cam = new camera(buf, sig);
- cid = camid(Cameras.size(), sig);
- Cameras.push_back(cam);
- }
+ cam = new camera(buf, sig);
+ cid = camid(Cameras.size(), sig);
+ Cameras.push_back(cam);
//Set attributes
if(n_pos != NULL)
@@ -1134,20 +1104,20 @@
void subtitles_do_frame(float frametime)
{
- unsigned int i,size=Subtitles.size();
- for(i = 0; i < size; i++)
+ SCP_vector<subtitle>::iterator sub;
+ for(sub = Subtitles.begin(); sub != Subtitles.end(); sub++)
{
- if ( !Subtitles[i].is_post_shaded( ) )
- Subtitles[i].do_frame(frametime);
+ if ( !sub->is_post_shaded( ) )
+ sub->do_frame(frametime);
}
}
void subtitles_do_frame_post_shaded(float frametime)
{
- unsigned int i,size=Subtitles.size();
- for(i = 0; i < size; i++)
+ SCP_vector<subtitle>::iterator sub;
+ for(sub = Subtitles.begin(); sub != Subtitles.end(); sub++)
{
- if ( Subtitles[i].is_post_shaded( ) )
- Subtitles[i].do_frame(frametime);
+ if ( sub->is_post_shaded( ) )
+ sub->do_frame(frametime);
}
}
\ No newline at end of file
Index: code/object/collideshipship.cpp
===================================================================
--- code/object/collideshipship.cpp (Revision 7362)
+++ code/object/collideshipship.cpp (Arbeitskopie)
@@ -271,34 +271,34 @@
pmi = model_get_instance(heavy_shipp->model_instance_num);
// turn off all rotating submodels and test for collision
- for (size_t j=0; j<submodel_vector.size(); j++) {
- pmi->submodel[submodel_vector[j]].collision_checked = true;
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
+ pmi->submodel[*smv].collision_checked = true;
}
// reset flags to check MC_CHECK_MODEL | MC_CHECK_SPHERELINE and maybe MC_CHECK_INVISIBLE_FACES and MC_SUBMODEL_INSTANCE
mc.flags = copy_flags | MC_SUBMODEL_INSTANCE;
// check each submodel in turn
- for (size_t i=0; i<submodel_vector.size(); i++) {
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
// turn on submodel for collision test
- pmi->submodel[submodel_vector[i]].collision_checked = false;
+ pmi->submodel[*smv].collision_checked = false;
// set angles for last frame
- angles copy_angles = pmi->submodel[submodel_vector[i]].angs;
+ angles copy_angles = pmi->submodel[*smv].angs;
// find the start and end positions of the sphere in submodel RF
- pmi->submodel[submodel_vector[i]].angs = pmi->submodel[submodel_vector[i]].prev_angs;
- world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
+ pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
+ world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
- pmi->submodel[submodel_vector[i]].angs = copy_angles;
- world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
+ pmi->submodel[*smv].angs = copy_angles;
+ world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
mc.p0 = &p0;
mc.p1 = &p1;
// mc.pos = zero // in submodel RF
mc.orient = &vmd_identity_matrix;
- mc.submodel_num = submodel_vector[i];
+ mc.submodel_num = *smv;
if ( model_collide(&mc) ) {
if (mc.hit_dist < ship_ship_hit_info->hit_time ) {
@@ -342,17 +342,17 @@
// set submodel angle at time of collision
// TODO: generalize... what happens when angle passes 0 or 2PI
angles temp_angs;
- vm_vec_sub(&diff, (vec3d*)&pm->submodel[submodel_vector[i]].angs, (vec3d*)&pm->submodel[submodel_vector[i]].sii->prev_angs);
- vm_vec_scale_add((vec3d*)&temp_angs, (vec3d *)&pm->submodel[submodel_vector[i]].sii->prev_angs, &diff, mc.hit_dist);
- pm->submodel[submodel_vector[i]].angs = temp_angs;
+ vm_vec_sub(&diff, (vec3d*)&pm->submodel[*smv].angs, (vec3d*)&pm->submodel[*smv].sii->prev_angs);
+ vm_vec_scale_add((vec3d*)&temp_angs, (vec3d *)&pm->submodel[*smv].sii->prev_angs, &diff, mc.hit_dist);
+ pm->submodel[*smv].angs = temp_angs;
// find intersection point in submodel RF - THEN advance to end of frametime.
vec3d temp = int_light_pos;
- world_find_model_point(&int_submodel_pos, &int_light_pos, pm, submodel_vector[i], &int_heavy_orient, &int_heavy_pos);
+ world_find_model_point(&int_submodel_pos, &int_light_pos, pm, *smv, &int_heavy_orient, &int_heavy_pos);
vec3d temp2;
// Advance to end of frametime
- pm->submodel[submodel_vector[i]].angs = copy_angles;
+ pm->submodel[*smv].angs = copy_angles;
model_find_world_point(&ship_ship_hit_info->light_collision_cm_pos, &int_submodel_pos, mc.model_num, mc.hit_submodel, mc.orient, &zero);
vm_vec_sub(&temp2, &ship_ship_hit_info->light_collision_cm_pos, &ship_ship_hit_info->hit_pos);
*/
@@ -362,7 +362,7 @@
}
}
// Don't look at this submodel again
- pmi->submodel[submodel_vector[i]].collision_checked = true;
+ pmi->submodel[*smv].collision_checked = true;
}
}
Index: code/sound/sound.cpp
===================================================================
--- code/sound/sound.cpp (Revision 7362)
+++ code/sound/sound.cpp (Arbeitskopie)
@@ -197,7 +197,6 @@
int message_sounds = 0;
int interface_sounds = 0;
int done = 0;
- size_t s_idx;
if(!Sound_spew){
return;
@@ -212,16 +211,16 @@
done = 0;
// what kind of sound is this
- for(s_idx=0; s_idx < Snds.size(); s_idx++){
- if(!stricmp(Snds[s_idx].filename, Sounds[idx].filename)){
+ for(SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++){
+ if(!stricmp(gs->filename, Sounds[idx].filename)){
game_sounds++;
done = 1;
}
}
if(!done){
- for(s_idx=0; s_idx < Snds.size(); s_idx++){
- if(!stricmp(Snds_iface[s_idx].filename, Sounds[idx].filename)){
+ for(SCP_vector<game_snd>::iterator gs = Snds.begin(); gs != Snds.end(); gs++){
+ if(!stricmp(gs->filename, Sounds[idx].filename)){
interface_sounds++;
done = 1;
}
Index: code/math/vecmat.cpp
===================================================================
--- code/math/vecmat.cpp (Revision 7362)
+++ code/math/vecmat.cpp (Arbeitskopie)
@@ -14,9 +14,9 @@
#include "math/vecmat.h"
#include "math/floating.h"
+#include <xmmintrin.h>
-
#define SMALL_NUM 1e-7
#define SMALLER_NUM 1e-20
#define CONVERT_RADIANS 0.017453 // conversion factor from degrees to radians
@@ -341,12 +341,7 @@
mag1 = x+y+z;
- if ( mag1 < 0.0 )
- return 0;
-
mag2 = fl_sqrt(mag1);
- if ( mag2 < 0.0 )
- Int3();
return mag2;
}
@@ -510,8 +505,16 @@
//returns approximation of 1/magnitude of a vector
float vm_vec_imag(vec3d *v)
{
-// return 1.0f / sqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
- return fl_isqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
+#if _M_IX86_FP < 1
+ return 1.0f / sqrt( (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z) );
+#else
+ float x = (v->xyz.x*v->xyz.x)+(v->xyz.y*v->xyz.y)+(v->xyz.z*v->xyz.z);
+ __m128 xx = _mm_load_ss( & x );
+ xx = _mm_rsqrt_ss( xx );
+ _mm_store_ss( & x, xx );
+
+ return x;
+#endif
}
//normalize a vector. returns 1/mag of source vec. uses approx 1/mag
@@ -809,7 +812,32 @@
return t;
}
+//generate the vectors for the vm_vector_2_matrix() an vm_vector_2_matrix_norm() functions so we can avoid goto
+void vm_vector_2_matrix_gen_vectors(matrix *m)
+{
+ vec3d *xvec=&m->vec.rvec;
+ vec3d *yvec=&m->vec.uvec;
+ vec3d *zvec=&m->vec.fvec;
+
+ if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
+ m->vec.rvec.xyz.x = 1.0f;
+ m->vec.uvec.xyz.z = (zvec->xyz.y<0.0f)?1.0f:-1.0f;
+ m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
+ }
+ else { //not straight up or down
+
+ xvec->xyz.x = zvec->xyz.z;
+ xvec->xyz.y = 0.0f;
+ xvec->xyz.z = -zvec->xyz.x;
+
+ vm_vec_normalize(xvec);
+
+ vm_vec_crossprod(yvec,zvec,xvec);
+
+ }
+}
+
//computes a matrix from one or more vectors. The forward vector is required,
//with the other two being optional. If both up & right vectors are passed,
//the up vector is used. If only the forward vector is passed, a bank of
@@ -819,72 +847,44 @@
{
vec3d *xvec=&m->vec.rvec,*yvec=&m->vec.uvec,*zvec=&m->vec.fvec;
-
Assert(fvec != NULL);
- // This had been commented out, but that's bogus. Code below relies on a valid zvec.
+ // This had been commented out, but that's bogus. Code below relies on a valid zvec.
if (vm_vec_copy_normalize(zvec,fvec) == 0.0f) {
Assert(0);
return m;
}
if (uvec == NULL) {
-
- if (rvec == NULL) { //just forward vec
-
-bad_vector2:
- ;
-
- if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
-
- m->vec.rvec.xyz.x = 1.0f;
- m->vec.uvec.xyz.z = (zvec->xyz.y<0.0)?1.0f:-1.0f;
-
- m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
- }
- else { //not straight up or down
-
- xvec->xyz.x = zvec->xyz.z;
- xvec->xyz.y = 0.0f;
- xvec->xyz.z = -zvec->xyz.x;
-
- vm_vec_normalize(xvec);
-
- vm_vec_crossprod(yvec,zvec,xvec);
-
- }
-
+ if (rvec == NULL) { //just forward vec
+ vm_vector_2_matrix_gen_vectors(m);
}
- else { //use right vec
-
+ else { //use right vec
if (vm_vec_copy_normalize(xvec,rvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
vm_vec_crossprod(yvec,zvec,xvec);
//normalize new perpendicular vector
if (vm_vec_normalize(yvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute right vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(xvec,yvec,zvec);
-
}
}
- else { //use up vec
-
+ else { //use up vec
if (vm_vec_copy_normalize(yvec,uvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
vm_vec_crossprod(xvec,yvec,zvec);
-
+
//normalize new perpendicular vector
if (vm_vec_normalize(xvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute up vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(yvec,zvec,xvec);
-
}
return m;
}
@@ -896,65 +896,35 @@
vec3d *yvec=&m->vec.uvec;
vec3d *zvec=&m->vec.fvec;
-
Assert(fvec != NULL);
*zvec = *fvec;
if (uvec == NULL) {
-
- if (rvec == NULL) { //just forward vec
-
-bad_vector2:
- ;
-
- if ((zvec->xyz.x==0.0f) && (zvec->xyz.z==0.0f)) { //forward vec is straight up or down
-
- m->vec.rvec.xyz.x = 1.0f;
- m->vec.uvec.xyz.z = (zvec->xyz.y<0.0f)?1.0f:-1.0f;
-
- m->vec.rvec.xyz.y = m->vec.rvec.xyz.z = m->vec.uvec.xyz.x = m->vec.uvec.xyz.y = 0.0f;
- }
- else { //not straight up or down
-
- xvec->xyz.x = zvec->xyz.z;
- xvec->xyz.y = 0.0f;
- xvec->xyz.z = -zvec->xyz.x;
-
- vm_vec_normalize(xvec);
-
- vm_vec_crossprod(yvec,zvec,xvec);
-
- }
-
+ if (rvec == NULL) { //just forward vec
+ vm_vector_2_matrix_gen_vectors(m);
}
- else { //use right vec
-
+ else { //use right vec
vm_vec_crossprod(yvec,zvec,xvec);
//normalize new perpendicular vector
if (vm_vec_normalize(yvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute right vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(xvec,yvec,zvec);
-
}
}
- else { //use up vec
-
+ else { //use up vec
vm_vec_crossprod(xvec,yvec,zvec);
-
+
//normalize new perpendicular vector
if (vm_vec_normalize(xvec) == 0.0f)
- goto bad_vector2;
+ vm_vector_2_matrix_gen_vectors(m);
//now recompute up vector, in case it wasn't entirely perpendiclar
vm_vec_crossprod(yvec,zvec,xvec);
-
}
-
-
return m;
}
Index: code/math/fvi.cpp
===================================================================
--- code/math/fvi.cpp (Revision 7362)
+++ code/math/fvi.cpp (Arbeitskopie)
@@ -1010,8 +1010,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
// sort root1 and root2
@@ -1056,8 +1057,9 @@
}
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
// given sphere position, find which edge time (position) allows a valid solution
if ( (root1 >= 0) && (root1 <= 1) ) {
@@ -1104,8 +1106,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
if (root1 > root2) {
temp = root1;
@@ -1137,8 +1140,9 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- root1 = (float) ((-B + root)/(2*A));
- root2 = (float) ((-B - root)/(2*A));
+ float inv2A = 1.0f/(2*A);
+ root1 = (float) ((-B + root)*inv2A);
+ root2 = (float) ((-B - root)*inv2A);
if (root1 > root2) {
temp = root1;
Index: code/debris/debris.cpp
===================================================================
--- code/debris/debris.cpp (Revision 7362)
+++ code/debris/debris.cpp (Arbeitskopie)
@@ -941,34 +941,34 @@
pmi = model_get_instance(Ships[heavy_obj->instance].model_instance_num);
// turn off all rotating submodels and test for collision
- for (size_t j=0; j<submodel_vector.size(); j++) {
- pmi->submodel[submodel_vector[j]].collision_checked = true;
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
+ pmi->submodel[*smv].collision_checked = true;
}
// reset flags to check MC_CHECK_MODEL | MC_CHECK_SPHERELINE and maybe MC_CHECK_INVISIBLE_FACES and MC_SUBMODEL_INSTANCE
mc.flags = copy_flags | MC_SUBMODEL_INSTANCE;
// check each submodel in turn
- for (size_t i=0; i<submodel_vector.size(); i++) {
+ for (SCP_vector<int>::iterator smv = submodel_vector.begin(); smv != submodel_vector.end(); smv++) {
// turn on submodel for collision test
- pmi->submodel[submodel_vector[i]].collision_checked = false;
+ pmi->submodel[*smv].collision_checked = false;
// set angles for last frame (need to set to prev to get p0)
- angles copy_angles = pmi->submodel[submodel_vector[i]].angs;
+ angles copy_angles = pmi->submodel[*smv].angs;
// find the start and end positions of the sphere in submodel RF
- pmi->submodel[submodel_vector[i]].angs = pmi->submodel[submodel_vector[i]].prev_angs;
- world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
+ pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
+ world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
- pmi->submodel[submodel_vector[i]].angs = copy_angles;
- world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
+ pmi->submodel[*smv].angs = copy_angles;
+ world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
mc.p0 = &p0;
mc.p1 = &p1;
// mc.pos = zero // in submodel RF
mc.orient = &vmd_identity_matrix;
- mc.submodel_num = submodel_vector[i];
+ mc.submodel_num = *smv;
if ( model_collide(&mc) ) {
if ( mc.hit_dist < debris_hit_info->hit_time ) {
@@ -991,7 +991,7 @@
}
}
// Don't look at this submodel again
- pmi->submodel[submodel_vector[i]].collision_checked = true;
+ pmi->submodel[*smv].collision_checked = true;
}
}
Index: code/cutscene/cutscenes.cpp
===================================================================
--- code/cutscene/cutscenes.cpp (Revision 7362)
+++ code/cutscene/cutscenes.cpp (Arbeitskopie)
@@ -42,13 +42,9 @@
//extern int All_movies_enabled; // If set, all movies may be viewed. Keyed off cheat code.
void cutscene_close()
{
- for(size_t i = 0; i < Cutscenes.size(); i++)
- {
- if(Cutscenes[i].description)
- {
- vm_free(Cutscenes[i].description);
- }
- }
+ for(SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++)
+ if(cut->description)
+ vm_free(cut->description);
}
// initialization stuff for cutscenes
@@ -114,9 +110,9 @@
return 0; // only 1 cd for OEM
#else
- for (size_t i = 0; i < Cutscenes.size(); i++ ) {
- if ( !stricmp(Cutscenes[i].filename, filename) ) {
- return (Cutscenes[i].cd - 1);
+ for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++) {
+ if ( !stricmp(cut->filename, filename) ) {
+ return (cut->cd - 1);
}
}
@@ -141,10 +137,10 @@
// change to lower case
strlwr(file);
-
- for (size_t i = 0; i < Cutscenes.size(); i++ ) {
+ int i = 0;
+ for (SCP_vector<cutscene_info>::iterator cut = Cutscenes.begin(); cut != Cutscenes.end(); cut++) {
// change the cutscene file name to lower case
- strcpy_s(cut_file, Cutscenes[i].filename);
+ strcpy_s(cut_file, cut->filename);
strlwr(cut_file);
// see if the stripped filename matches the cutscene filename
@@ -152,6 +148,7 @@
Cutscenes_viewable |= (1<<i);
return;
}
+ i++;
}
}
@@ -507,7 +504,9 @@
// Cutscenes_viewable = 0xffffffff; // Cheat code enables all movies.
Cutscene_list.clear();
- for (size_t j = 0; j < Cutscenes.size(); j++ ) {
+
+ size_t size = Cutscenes.size();
+ for (size_t j=0;j < size;j++) {
if ( Cutscenes_viewable & (1<<j) ) {
Cutscene_list.push_back((int)j);
}
@@ -568,7 +567,8 @@
case KEY_CTRLED | KEY_SHIFTED | KEY_S:
{
Cutscene_list.clear();
- for (size_t t = 0; t < Cutscenes.size(); t++) {
+ size_t size = Cutscenes.size();
+ for (size_t t = 0; t < size; t++) {
Cutscene_list.push_back((int)t);
}
Index: code/parse/lua.cpp
===================================================================
--- code/parse/lua.cpp (Revision 7362)
+++ code/parse/lua.cpp (Arbeitskopie)
@@ -13157,6 +13157,7 @@
char *type_name = NULL;
uint ade_id = UINT_MAX;
int mtb_ldx = INT_MAX;
+ ade_table_entry* entry = 0;
//*****STEP 1: Check for user-defined objects
if(lua_istable(L, obj_ldx) && !ADE_SETTING_VAR)
@@ -13176,7 +13177,7 @@
lua_pushcfunction(L, ade_friendly_error);
int err_ldx = lua_gettop(L);
int i;
-
+
//*****WMC - go for the type name
lua_pushstring(L, "__adeid");
lua_rawget(L, mtb_ldx);
@@ -13184,7 +13185,10 @@
{
ade_id = (uint) lua_tonumber(L, -1);
if(ade_id < Ade_table_entries.size())
- type_name = Ade_table_entries[ade_id].Name;
+ {
+ entry = &Ade_table_entries[ade_id];
+ type_name = entry->Name;
+ }
}
lua_pop(L, 1);
@@ -13196,7 +13200,7 @@
//Get userdata sig
char *ud = (char *)lua_touserdata(L, obj_ldx);
- ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + Ade_table_entries[ade_id].Value.Object.size);
+ ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + entry->Value.Object.size);
//Now use it to index the table with that #
lua_pushnumber(L, sig);
@@ -13319,7 +13323,7 @@
//Get userdata sig
char *ud = (char *)lua_touserdata(L, obj_ldx);
- ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + Ade_table_entries[ade_id].Value.Object.size);
+ ODATA_SIG_TYPE sig = *(ODATA_SIG_TYPE*)(ud + entry->Value.Object.size);
//Now use it to index the table with that #
lua_pushnumber(L, sig);
Index: code/parse/scripting.cpp
===================================================================
--- code/parse/scripting.cpp (Revision 7362)
+++ code/parse/scripting.cpp (Arbeitskopie)
@@ -398,10 +398,8 @@
Assert(sys != NULL);
//Do the actions
- script_action *sap;
- for(uint i = 0; i < Actions.size(); i++)
+ for(SCP_vector<script_action>::iterator sap = Actions.begin(); sap != Actions.end(); sap++)
{
- sap = &Actions[i];
if(sap->action_type == action)
sys->RunBytecode(sap->hook, format, data);
}
@@ -415,10 +413,8 @@
//bool b = false;
//Do the actions
- script_action *sap;
- for(uint i = 0; i < Actions.size(); i++)
+ for(SCP_vector<script_action>::iterator sap = Actions.begin(); sap != Actions.end(); sap++)
{
- sap = &Actions[i];
if(sap->action_type == action)
{
if(sys->IsOverride(sap->hook))
@@ -805,11 +801,9 @@
int script_state::RunCondition(int action, char format, void *data, object *objp)
{
- ConditionedHook *chp = NULL;
int num = 0;
- for(uint i= 0; i < ConditionalHooks.size(); i++)
+ for(SCP_vector<ConditionedHook>::iterator chp = ConditionalHooks.begin(); chp != ConditionalHooks.end(); chp++)
{
- chp = &ConditionalHooks[i];
if(chp->ConditionsValid(action, objp))
{
chp->Run(this, action, format, data);
@@ -821,11 +815,9 @@
bool script_state::IsConditionOverride(int action, object *objp)
{
- ConditionedHook *chp = NULL;
//bool b = false;
- for(uint i= 0; i < ConditionalHooks.size(); i++)
+ for(SCP_vector<ConditionedHook>::iterator chp = ConditionalHooks.begin(); chp != ConditionalHooks.end(); chp++)
{
- chp = &ConditionalHooks[i];
if(chp->ConditionsValid(action, objp))
{
if(chp->IsOverride(this, action))
Index: code/autopilot/autopilot.cpp
===================================================================
--- code/autopilot/autopilot.cpp (Revision 7362)
+++ code/autopilot/autopilot.cpp (Arbeitskopie)
@@ -372,8 +372,7 @@
{
capshipPresent = true;
- capIndexes.resize(capIndexes.size()+1);
- capIndexes[capIndexes.size()-1] = i;
+ capIndexes.push_back(i);
// ok.. what size class
if (Ship_info[Ships[i].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
@@ -559,13 +558,13 @@
// position capships
vec3d right, front, up, offset;
- for (i = 0; i < (int)capIndexes.size(); i++)
+ for (SCP_vector<int>::iterator idx = capIndexes.begin(); idx != capIndexes.end(); idx++)
{
vm_vec_add(&right, &Autopilot_flight_leader->orient.vec.rvec, &zero);
vm_vec_add(&front, &Autopilot_flight_leader->orient.vec.fvec, &zero);
vm_vec_add(&up, &Autopilot_flight_leader->orient.vec.uvec, &zero);
vm_vec_add(&offset, &zero, &zero);
- if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
+ if (Ship_info[Ships[*idx].ship_info_index].flags & (SIF_CAPITAL | SIF_SUPERCAP))
{
//0 - below - three lines of position
@@ -599,7 +598,7 @@
capship_placed[0]++;
}
- else if (Ship_info[Ships[capIndexes[i]].ship_info_index].flags & SIF_CORVETTE)
+ else if (Ship_info[Ships[*idx].ship_info_index].flags & SIF_CORVETTE)
{
//1 above - 3 lines of position
// front/back to zero
@@ -708,7 +707,7 @@
// global scale the position by 50%
//vm_vec_scale(&offset, 1.5);
- vm_vec_add(&Objects[Ships[capIndexes[i]].objnum].pos, &Autopilot_flight_leader->pos, &offset);
+ vm_vec_add(&Objects[Ships[*idx].objnum].pos, &Autopilot_flight_leader->pos, &offset);
if (vm_vec_dist_quick(&Autopilot_flight_leader->pos, &Objects[Ships[i].objnum].pos) > distance)
{
Index: code/ai/aicode.cpp
===================================================================
--- code/ai/aicode.cpp (Revision 7362)
+++ code/ai/aicode.cpp (Arbeitskopie)
@@ -359,20 +359,18 @@
// which can be fired on target_objp
int is_preferred_weapon(int weapon_num, object *firer_objp, object *target_objp)
{
- int i, firer_team, target_signature;
+ int firer_team, target_signature;
ship *firer_ship;
- huge_fire_info *hfi = NULL;
-
+ SCP_vector<huge_fire_info>::iterator hfi;
Assert( firer_objp->type == OBJ_SHIP );
firer_ship = &Ships[firer_objp->instance];
firer_team = firer_ship->team;
// get target object's signature and try to find it in the list.
target_signature = target_objp->signature;
- for ( i = 0; i < (int)Ai_huge_fire_info.size(); i++ ) {
+ for (hfi = Ai_huge_fire_info.begin();hfi != Ai_huge_fire_info.end(); ++hfi ) {
int ship_index, signature;
- hfi = &Ai_huge_fire_info[i];
if ( hfi->weapon_index == -1 )
continue;
@@ -388,7 +386,7 @@
}
// return -1 if not found
- if ( i == (int)Ai_huge_fire_info.size() )
+ if ( hfi == Ai_huge_fire_info.end() )
return -1;
// otherwise, we can return the max number of weapons we can fire against target_objps
-
Committed in revision 7363
-
Committed in revision 7363
Revision 7363 breaks the build on my Linux machine using g++:
plombo@laptop:~/src/fs2_open$ make
Making all in code
make[1]: Entering directory `/home/bryan/src/fs2_open/code'
g++ -DPACKAGE_NAME=\"fs2_open\" -DPACKAGE_TARNAME=\"fs2_open\" -DPACKAGE_VERSION=\"3.6.13\" -DPACKAGE_STRING=\"fs2_open\ 3.6.13\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DNO_CD_CHECK=1 -DINF_BUILD=1 -D_DEBUG=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSCP_UNIX=1 -DNO_DIRECT3D=1 -I. -DLUA_USE_LINUX -O0 -g -Wall -Wextra -Wno-unused-parameter -Wno-write-strings -Wshadow -funroll-loops -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/libpng12 -I/usr/include/lua5.1 -fsigned-char -Wno-unknown-pragmas -Wno-deprecated -Wno-char-subscripts -MT fvi.o -MD -MP -MF .deps/fvi.Tpo -c -o fvi.o `test -f 'math/fvi.cpp' || echo './'`math/fvi.cpp
math/fvi.cpp: In function ‘int fvi_polyedge_sphereline(vec3d*, vec3d*, vec3d*, float, int, vec3d**, float*)’:
math/fvi.cpp:1094: error: jump to label ‘TryVertex’
math/fvi.cpp:1033: error: from here
math/fvi.cpp:1060: error: crosses initialization of ‘float inv2A’
math/fvi.cpp:1109: warning: declaration of ‘inv2A’ shadows a previous local
math/fvi.cpp:1060: warning: shadowed declaration is here
math/fvi.cpp:1143: warning: declaration of ‘inv2A’ shadows a previous local
math/fvi.cpp:1060: warning: shadowed declaration is here
make[1]: *** [fvi.o] Error 1
make[1]: Leaving directory `/home/bryan/src/fs2_open/code'
make: *** [all-recursive] Error 1
-
Curious. No idea if this would be a solution or not, but a little something I came up with in about 20 seconds (and 2 attempts):
Index: fvi.cpp
===================================================================
--- fvi.cpp (revision 7364)
+++ fvi.cpp (working copy)
@@ -970,7 +970,7 @@
vec3d ve; // edge velocity
float best_sphere_time; // earliest time sphere hits edge
vec3d delta_x;
- float delta_x_dot_ve, delta_x_dot_vs, ve_dot_vs, ve_sqr, vs_sqr, delta_x_sqr;
+ float delta_x_dot_ve, delta_x_dot_vs, ve_dot_vs, ve_sqr, vs_sqr, delta_x_sqr, inv2A;
vec3d temp_edge_hit, temp_sphere_hit;
best_sphere_time = FLT_MAX;
@@ -1010,7 +1010,7 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- float inv2A = 1.0f/(2*A);
+ inv2A = 1.0f/(2*A);
root1 = (float) ((-B + root)*inv2A);
root2 = (float) ((-B - root)*inv2A);
@@ -1057,7 +1057,7 @@
}
root = fl_sqrt(discriminant);
- float inv2A = 1.0f/(2*A);
+ inv2A = 1.0f/(2*A);
root1 = (float) ((-B + root)*inv2A);
root2 = (float) ((-B - root)*inv2A);
@@ -1106,7 +1106,7 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- float inv2A = 1.0f/(2*A);
+ inv2A = 1.0f/(2*A);
root1 = (float) ((-B + root)*inv2A);
root2 = (float) ((-B - root)*inv2A);
@@ -1140,7 +1140,7 @@
discriminant = B*B - 4*A*C;
if (discriminant > 0) {
root = fl_sqrt(discriminant);
- float inv2A = 1.0f/(2*A);
+ inv2A = 1.0f/(2*A);
root1 = (float) ((-B + root)*inv2A);
root2 = (float) ((-B - root)*inv2A);
-
wtf gcc
-
GCC on Apple isn't liking that latest addition for SIMD instructions:
code/math/vecmat.cpp:17:23: error: xmmintrin.h: No such file or directory
-
are you compiling with sse enabled or not ? cause if it only happens with sse disabled an #ifdef (the same like around the intrinsic) around the include should fix that. If it happens on both that would be strange the file should be availiable on every system.
-
I don't believe OS X is set up to optimize for SSE yet, so probably not.
-
its an x86 processor opcode it has nothing to do with the os this should not be happening i dont get it he should have the header file. Is this happening to other apple users as well or just echelon?
-
#include <xmmintrin.h> fails for me too, on MSVC6. So it looks like the #ifdef needs to be added.
-
#include <xmmintrin.h> fails for me too, on MSVC6. So it looks like the #ifdef needs to be added.
Fix? Works for Xcode, but that's to be given as it's just switching it right off.
Index: code/math/vecmat.cpp
===================================================================
--- code/math/vecmat.cpp (revision 7372)
+++ code/math/vecmat.cpp (working copy)
@@ -14,9 +14,10 @@
#include "math/vecmat.h"
#include "math/floating.h"
-#include <xmmintrin.h>
+#if _M_IX86_FP >= 1
+ #include <xmmintrin.h>
+#endif
#define SMALL_NUM 1e-7
#define SMALLER_NUM 1e-20
#define CONVERT_RADIANS 0.017453 // conversion factor from degrees to radians