Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions code/model/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -827,7 +827,7 @@ void model_instance_free_all();
// Loads a model from disk and returns the model number it loaded into.
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror = 1, int duplicate = 0);

int model_create_instance(int model_num, int submodel_num = -1);
int model_create_instance(int model_num);
void model_delete_instance(int model_instance_num);

// Goober5000
Expand Down Expand Up @@ -1040,7 +1040,7 @@ extern void model_instance_find_world_dir(vec3d * out_dir, vec3d *in_dir,int mod
// Clears all the submodel instances stored in a model to their defaults.
extern void model_clear_instance(int model_num);

void model_clear_submodel_instance( submodel_instance *sm_instance );
void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm );
void model_clear_submodel_instances( int model_instance_num );

// Sets rotating submodel turn info to that stored in model
Expand All @@ -1053,7 +1053,7 @@ extern void model_clear_instance_info(submodel_instance_info * sii);
extern void model_set_instance(int model_num, int sub_model_num, submodel_instance_info * sii, int flags = 0 );
extern void model_set_instance_techroom(int model_num, int sub_model_num, float angle_1, float angle_2 );

void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii);
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags);
void model_instance_dumb_rotation(int model_instance_num);

// Adds an electrical arcing effect to a submodel
Expand Down
28 changes: 17 additions & 11 deletions code/model/modelread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2710,7 +2710,7 @@ int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, in
return pm->id;
}

int model_create_instance(int model_num, int submodel_num)
int model_create_instance(int model_num)
{
int i = 0;
int open_slot = -1;
Expand Down Expand Up @@ -2738,7 +2738,7 @@ int model_create_instance(int model_num, int submodel_num)
pmi->submodel = (submodel_instance*)vm_malloc( sizeof(submodel_instance)*pm->n_models );

for ( i = 0; i < pm->n_models; i++ ) {
model_clear_submodel_instance( &pmi->submodel[i] );
model_clear_submodel_instance( &pmi->submodel[i], &pm->submodel[i] );
}

pmi->model_num = model_num;
Expand Down Expand Up @@ -4547,12 +4547,14 @@ void model_clear_instance_info( submodel_instance_info * sii )
sii->turn_accel = 0.0f;
}

void model_clear_submodel_instance( submodel_instance *sm_instance )
void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm )
{
sm_instance->angs.p = 0.0f;
sm_instance->angs.b = 0.0f;
sm_instance->angs.h = 0.0f;
sm_instance->blown_off = false;

sm_instance->blown_off = sm->is_damaged ? true : false;

sm_instance->collision_checked = false;
}

Expand All @@ -4563,7 +4565,7 @@ void model_clear_submodel_instances( int model_instance_num )
polymodel *pm = model_get(pmi->model_num);

for ( i = 0; i < pm->n_models; i++ ) {
model_clear_submodel_instance(&pmi->submodel[i]);
model_clear_submodel_instance(&pmi->submodel[i], &pm->submodel[i]);
}
}

Expand Down Expand Up @@ -4662,7 +4664,7 @@ void model_set_instance_techroom(int model_num, int sub_model_num, float angle_1
sm->angs.h = angle_2;
}

void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii)
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags)
{
int i;
polymodel *pm;
Expand All @@ -4680,11 +4682,15 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i

submodel_instance *smi = &pmi->submodel[sub_model_num];
bsp_info *sm = &pm->submodel[sub_model_num];

// Set the "blown out" flags
if ( flags & SSF_NO_DISAPPEAR ) {
smi->blown_off = false;
} else {
smi->blown_off = sii->blown_off ? true : false;
}

// Set the "blown out" flags
smi->blown_off = sii->blown_off ? true : false;

if ( smi->blown_off ) {
if ( smi->blown_off && !(flags & SSF_NO_REPLACE) ) {
if ( sm->my_replacement > -1 ) {
pmi->submodel[sm->my_replacement].blown_off = false;
pmi->submodel[sm->my_replacement].angs = sii->angs;
Expand All @@ -4704,7 +4710,7 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i

// For all the detail levels of this submodel, set them also.
for (i=0; i<sm->num_details; i++ ) {
model_update_instance(model_instance_num, sm->details[i], sii );
model_update_instance(model_instance_num, sm->details[i], sii, flags );
}
}

Expand Down
24 changes: 18 additions & 6 deletions code/model/modelrender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1395,7 +1395,7 @@ void model_render_buffers(draw_list* scene, model_render_params* interp, vertex_
}
}

void model_render_children_buffers(draw_list* scene, model_render_params* interp, polymodel* pm, int mn, int detail_level, uint tmap_flags, bool trans_buffer)
void model_render_children_buffers(draw_list* scene, model_render_params* interp, polymodel* pm, polymodel_instance *pmi, int mn, int detail_level, uint tmap_flags, bool trans_buffer)
{
int i;

Expand All @@ -1405,9 +1405,15 @@ void model_render_children_buffers(draw_list* scene, model_render_params* interp
}

bsp_info *model = &pm->submodel[mn];
submodel_instance *smi = NULL;

if (model->blown_off)
if ( pmi != NULL ) {
smi = &pmi->submodel[mn];
}

if ( (smi != NULL && smi->blown_off) || model->blown_off ) {
return;
}

const uint model_flags = interp->get_model_flags();

Expand All @@ -1430,6 +1436,10 @@ void model_render_children_buffers(draw_list* scene, model_render_params* interp
// the submodel relative to its parent
angles ang = model->angs;

if ( smi != NULL ) {
ang = smi->angs;
}

// Add barrel rotation if needed
if ( model->gun_rotation ) {
if ( pm->gun_submodel_rotation > PI2 ) {
Expand Down Expand Up @@ -1477,7 +1487,7 @@ void model_render_children_buffers(draw_list* scene, model_render_params* interp

while ( i >= 0 ) {
if ( !pm->submodel[i].is_thruster ) {
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
}

i = pm->submodel[i].next_sibling;
Expand Down Expand Up @@ -2670,6 +2680,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model
const int model_flags = interp->get_model_flags();

polymodel *pm = model_get(model_num);
polymodel_instance *pmi = NULL;

model_do_dumb_rotation(model_num);

Expand Down Expand Up @@ -2714,6 +2725,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model

if (objp->type == OBJ_SHIP) {
shipp = &Ships[objp->instance];
pmi = model_get_instance(shipp->model_instance_num);
}
}

Expand Down Expand Up @@ -2849,7 +2861,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model

while( i >= 0 ) {
if ( !pm->submodel[i].is_thruster ) {
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
} else {
draw_thrusters = true;
}
Expand Down Expand Up @@ -2886,7 +2898,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model

while( i >= 0 ) {
if ( !pm->submodel[i].is_thruster ) {
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
}

i = pm->submodel[i].next_sibling;
Expand All @@ -2907,7 +2919,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model

while( i >= 0 ) {
if (pm->submodel[i].is_thruster) {
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
}
i = pm->submodel[i].next_sibling;
}
Expand Down
10 changes: 2 additions & 8 deletions code/ship/ship.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13051,11 +13051,11 @@ void ship_model_update_instance(object *objp)
}

if ( psub->subobj_num >= 0 ) {
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1 );
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1, pss->flags );
}

if ( (psub->subobj_num != psub->turret_gun_sobj) && (psub->turret_gun_sobj >= 0) ) {
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2 );
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2, pss->flags );
}
}

Expand Down Expand Up @@ -18993,8 +18993,6 @@ void ship_render(object* obj, draw_list* scene)
}
}

ship_model_start(obj);

// Only render electrical arcs if within 500m of the eye (for a 10m piece)
if ( vm_vec_dist_quick( &obj->pos, &Eye_position ) < obj->radius*50.0f && !Rendering_to_shadow_map ) {
for ( int i = 0; i < MAX_SHIP_ARCS; i++ ) {
Expand All @@ -19019,8 +19017,6 @@ void ship_render(object* obj, draw_list* scene)
shipp->warpout_effect->warpShipRender();
}

ship_model_stop(obj);

return;
}

Expand Down Expand Up @@ -19093,8 +19089,6 @@ void ship_render(object* obj, draw_list* scene)
model_render_queue(&render_info, scene, sip->model_num, &obj->orient, &obj->pos);
}

ship_model_stop(obj);

if (shipp->shield_hits && !Rendering_to_shadow_map) {
create_shield_explosion_all(obj);
shipp->shield_hits = 0;
Expand Down