From 64ad950a802f8bae62a67c54b0e95e6f6271554b Mon Sep 17 00:00:00 2001 From: SamuelCho Date: Tue, 1 Dec 2015 23:53:24 -0800 Subject: [PATCH 1/2] Allow model rendering code to use polymodel_instance. Removes the reliance on ship_model_start/stop for rendering models. Also fix a bunch of oversights involving blown off models in the polymodel_instance code. --- code/model/model.h | 6 +++--- code/model/modelread.cpp | 27 +++++++++++++++++---------- code/model/modelrender.cpp | 24 ++++++++++++++++++------ code/ship/ship.cpp | 10 ++-------- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/code/model/model.h b/code/model/model.h index 98e26b905ec..c4e77a0dd8a 100644 --- a/code/model/model.h +++ b/code/model/model.h @@ -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 @@ -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 @@ -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 diff --git a/code/model/modelread.cpp b/code/model/modelread.cpp index 8ce6e873622..712a591ce63 100644 --- a/code/model/modelread.cpp +++ b/code/model/modelread.cpp @@ -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; @@ -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; @@ -4547,11 +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 = sm->is_damaged ? true : false; + sm_instance->blown_off = false; sm_instance->collision_checked = false; } @@ -4563,7 +4566,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]); } } @@ -4662,7 +4665,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; @@ -4680,11 +4683,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; @@ -4704,7 +4711,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; inum_details; i++ ) { - model_update_instance(model_instance_num, sm->details[i], sii ); + model_update_instance(model_instance_num, sm->details[i], sii, flags ); } } diff --git a/code/model/modelrender.cpp b/code/model/modelrender.cpp index 6fdadd50484..bfe5154ebc3 100644 --- a/code/model/modelrender.cpp +++ b/code/model/modelrender.cpp @@ -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; @@ -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(); @@ -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 ) { @@ -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; @@ -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); @@ -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); } } @@ -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; } @@ -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; @@ -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; } diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index 6c056a2e01f..3fc0294407e 100755 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -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 ); } } @@ -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++ ) { @@ -19019,8 +19017,6 @@ void ship_render(object* obj, draw_list* scene) shipp->warpout_effect->warpShipRender(); } - ship_model_stop(obj); - return; } @@ -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; From 59fa7bd544218ea370efa6049a7a8d8ddcc61cbc Mon Sep 17 00:00:00 2001 From: SamuelCho Date: Wed, 2 Dec 2015 19:08:59 -0800 Subject: [PATCH 2/2] Remove superfluous line. --- code/model/modelread.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/model/modelread.cpp b/code/model/modelread.cpp index 712a591ce63..ed4907e3248 100644 --- a/code/model/modelread.cpp +++ b/code/model/modelread.cpp @@ -4555,7 +4555,6 @@ void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm sm_instance->blown_off = sm->is_damaged ? true : false; - sm_instance->blown_off = false; sm_instance->collision_checked = false; }