Skip to content

Commit

Permalink
add ship class texture replacement using a simplified method that doe…
Browse files Browse the repository at this point in the history
…sn't require the texture_set code

git-svn-id: svn://svn.icculus.org/fs2open/trunk/fs2_open@11204 387891d4-d844-0410-90c0-e4c51a9137d3
  • Loading branch information
Goober5000 authored and niffiwan committed Dec 23, 2014
1 parent b23aea5 commit 7250cd1
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 69 deletions.
89 changes: 47 additions & 42 deletions code/mission/missionparse.cpp
Expand Up @@ -1938,7 +1938,7 @@ int parse_create_object_sub(p_object *p_objp)
shipp->base_texture_anim_frametime = game_get_overall_frametime();

// handle the replacement textures
if (p_objp->num_texture_replacements > 0)
if (!p_objp->replacement_textures.empty())
{
shipp->ship_replacement_textures = (int *) vm_malloc( MAX_REPLACEMENT_TEXTURES * sizeof(int));

Expand All @@ -1947,7 +1947,7 @@ int parse_create_object_sub(p_object *p_objp)
}

// now fill them in
for (i = 0; i < p_objp->num_texture_replacements; i++)
for (SCP_vector<texture_replace>::iterator tr = p_objp->replacement_textures.begin(); tr != p_objp->replacement_textures.end(); ++tr)
{
pm = model_get(sip->model_num);

Expand All @@ -1956,9 +1956,9 @@ int parse_create_object_sub(p_object *p_objp)
{
texture_map *tmap = &pm->maps[j];

int tnum = tmap->FindTexture(p_objp->replacement_textures[i].old_texture);
int tnum = tmap->FindTexture(tr->old_texture);
if(tnum > -1)
shipp->ship_replacement_textures[j * TM_NUM_TYPES + tnum] = p_objp->replacement_textures[i].new_texture_id;
shipp->ship_replacement_textures[j * TM_NUM_TYPES + tnum] = tr->new_texture_id;
}
}

Expand Down Expand Up @@ -3235,64 +3235,69 @@ int parse_object(mission *pm, int flag, p_object *p_objp)
stuff_int(&p_objp->persona_index);

// texture replacement - Goober5000
p_objp->num_texture_replacements = 0;
p_objp->replacement_textures = Ship_info[p_objp->ship_class].replacement_textures; // initialize our set with the ship class set, which may be empty
if (optional_string("$Texture Replace:") || optional_string("$Duplicate Model Texture Replace:"))
{
texture_replace tr;
char *p;

while ((p_objp->num_texture_replacements < MAX_REPLACEMENT_TEXTURES) && (optional_string("+old:")))
while (optional_string("+old:"))
{
stuff_string(p_objp->replacement_textures[p_objp->num_texture_replacements].old_texture, F_NAME, MAX_FILENAME_LEN);
strcpy_s(tr.ship_name, p_objp->name);
tr.new_texture_id = -1;

stuff_string(tr.old_texture, F_NAME, MAX_FILENAME_LEN);
required_string("+new:");
stuff_string(p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture, F_NAME, MAX_FILENAME_LEN);
stuff_string(tr.new_texture, F_NAME, MAX_FILENAME_LEN);

// get rid of extensions
p = strchr(p_objp->replacement_textures[p_objp->num_texture_replacements].old_texture, '.');
p = strchr(tr.old_texture, '.');
if (p)
{
mprintf(("Extraneous extension found on replacement texture %s!\n", p_objp->replacement_textures[p_objp->num_texture_replacements].old_texture));
mprintf(("Extraneous extension found on replacement texture %s!\n", tr.old_texture));
*p = 0;
}
p = strchr(p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture, '.');
p = strchr(tr.new_texture, '.');
if (p)
{
mprintf(("Extraneous extension found on replacement texture %s!\n", p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture));
mprintf(("Extraneous extension found on replacement texture %s!\n", tr.new_texture));
*p = 0;
}

// load the texture
if (!stricmp(p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture, "invisible"))
{
// invisible is a special case
p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture_id = REPLACE_WITH_INVISIBLE;
}
// add it if we aren't over the limit
if (p_objp->replacement_textures.size() < MAX_MODEL_TEXTURES)
p_objp->replacement_textures.push_back(tr);
else
{
// try to load texture or anim as normal
p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture_id = bm_load_either(p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture);
}

// not found?
if (p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture_id < 0)
{
mprintf(("Could not load replacement texture %s for ship %s\n", p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture, p_objp->name));
}

// *** account for FRED
if (Fred_running)
{
texture_replace tr;
mprintf(("Too many replacement textures specified for ship '%s'!\n", p_objp->name));
}
}

strcpy_s(tr.ship_name, p_objp->name);
strcpy_s(tr.old_texture, p_objp->replacement_textures[p_objp->num_texture_replacements].old_texture);
strcpy_s(tr.new_texture, p_objp->replacement_textures[p_objp->num_texture_replacements].new_texture);
tr.new_texture_id = -1;
// now load the textures (do this outside the parse loop because we may have ship class replacements too)
for (SCP_vector<texture_replace>::iterator tr = p_objp->replacement_textures.begin(); tr != p_objp->replacement_textures.end(); ++tr)
{
// load the texture
if (!stricmp(tr->new_texture, "invisible"))
{
// invisible is a special case
tr->new_texture_id = REPLACE_WITH_INVISIBLE;
}
else
{
// try to load texture or anim as normal
tr->new_texture_id = bm_load_either(tr->new_texture);
}

Fred_texture_replacements.push_back(tr);
}
// not found?
if (tr->new_texture_id < 0)
{
mprintf(("Could not load replacement texture %s for ship %s\n", tr->new_texture, p_objp->name));
}

// increment
p_objp->num_texture_replacements++;
// account for FRED
if (Fred_running)
{
Fred_texture_replacements.push_back(*tr);
Fred_texture_replacements.back().new_texture_id = -1;
}
}

Expand Down Expand Up @@ -7633,7 +7638,7 @@ void mission_bring_in_support_ship( object *requester_objp )
pobj->respawn_count = 0;
pobj->alt_type_index = -1;
pobj->callsign_index = -1;
pobj->num_texture_replacements = 0;
pobj->replacement_textures.clear();
}

/**
Expand Down
3 changes: 1 addition & 2 deletions code/mission/missionparse.h
Expand Up @@ -431,8 +431,7 @@ class p_object
float ship_max_shield_strength;

// Goober5000
int num_texture_replacements;
texture_replace replacement_textures[MAX_REPLACEMENT_TEXTURES]; // replacement textures - Goober5000
SCP_vector<texture_replace> replacement_textures;

SCP_vector<alt_class> alt_classes;

Expand Down
48 changes: 23 additions & 25 deletions code/ship/ship.cpp
Expand Up @@ -951,6 +951,8 @@ void init_ship_entry(ship_info *sip)
sip->splodeing_texture = -1;
strcpy_s(sip->splodeing_texture_name, "boom");

sip->replacement_textures.clear();

sip->armor_type_idx = -1;
sip->shield_armor_type_idx = -1;

Expand Down Expand Up @@ -1538,45 +1540,41 @@ int parse_ship_values(ship_info* sip, bool first_time, bool replace)
WarningEx(LOCATION, "Ship %s\nPOF file \"%s\" invalid!", sip->name, temp);
}

// ship class texture replacement - Goober5000 and taylor
int PLACEHOLDER_num_texture_replacements = 0;
char PLACEHOLDER_old_texture[MAX_FILENAME_LEN];
char PLACEHOLDER_new_texture[MAX_FILENAME_LEN];
int PLACEHOLDER_new_texture_id;
// ship class texture replacement - Goober5000
// don't clear the vector because we could be parsing a TBM
if (optional_string("$Texture Replace:"))
{
texture_replace tr;
char *p;

while ((PLACEHOLDER_num_texture_replacements < MAX_REPLACEMENT_TEXTURES) && (optional_string("+old:")))
while (optional_string("+old:"))
{
stuff_string(PLACEHOLDER_old_texture, F_NAME, MAX_FILENAME_LEN);
strcpy_s(tr.ship_name, sip->name);
tr.new_texture_id = -1;

stuff_string(tr.old_texture, F_NAME, MAX_FILENAME_LEN);
required_string("+new:");
stuff_string(PLACEHOLDER_new_texture, F_NAME, MAX_FILENAME_LEN);
stuff_string(tr.new_texture, F_NAME, MAX_FILENAME_LEN);

// get rid of extensions
p = strchr(PLACEHOLDER_old_texture, '.');
p = strchr(tr.old_texture, '.');
if (p)
{
mprintf(("Extraneous extension found on replacement texture %s!\n", PLACEHOLDER_old_texture));
mprintf(("Extraneous extension found on replacement texture %s!\n", tr.old_texture));
*p = 0;
}
p = strchr(PLACEHOLDER_new_texture, '.');
p = strchr(tr.new_texture, '.');
if (p)
{
mprintf(("Extraneous extension found on replacement texture %s!\n", PLACEHOLDER_new_texture));
mprintf(("Extraneous extension found on replacement texture %s!\n", tr.new_texture));
*p = 0;
}

// load the texture
PLACEHOLDER_new_texture_id = bm_load(PLACEHOLDER_new_texture);

if (PLACEHOLDER_new_texture_id < 0)
{
mprintf(("Could not load replacement texture %s for ship %s\n", PLACEHOLDER_new_texture, sip->name));
}

// increment
PLACEHOLDER_num_texture_replacements++;
// add it if we aren't over the limit
if (sip->replacement_textures.size() < MAX_MODEL_TEXTURES)
sip->replacement_textures.push_back(tr);
else
mprintf(("Too many replacement textures specified for ship '%s'!\n", sip->name));
}
}

Expand Down Expand Up @@ -9527,7 +9525,7 @@ void change_ship_type(int n, int ship_type, int by_sexp)
sp->ship_replacement_textures[i] = -1;

// now fill them in according to texture name
for (i = 0; i < p_objp->num_texture_replacements; i++)
for (SCP_vector<texture_replace>::iterator tr = p_objp->replacement_textures.begin(); tr != p_objp->replacement_textures.end(); ++tr)
{
int j;
polymodel *pm = model_get(sip->model_num);
Expand All @@ -9537,9 +9535,9 @@ void change_ship_type(int n, int ship_type, int by_sexp)
{
texture_map *tmap = &pm->maps[j];

int tnum = tmap->FindTexture(p_objp->replacement_textures[i].old_texture);
int tnum = tmap->FindTexture(tr->old_texture);
if(tnum > -1)
sp->ship_replacement_textures[j * TM_NUM_TYPES + tnum] = p_objp->replacement_textures[i].new_texture_id;
sp->ship_replacement_textures[j * TM_NUM_TYPES + tnum] = tr->new_texture_id;
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions code/ship/ship.h
Expand Up @@ -1378,6 +1378,9 @@ class ship_info
int splodeing_texture;
char splodeing_texture_name[MAX_FILENAME_LEN];

// Goober5000
SCP_vector<texture_replace> replacement_textures;


int armor_type_idx;
int shield_armor_type_idx;
Expand Down

0 comments on commit 7250cd1

Please sign in to comment.