Skip to content

Commit 64ad950

Browse files
committed
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.
1 parent cb8154a commit 64ad950

File tree

4 files changed

+40
-27
lines changed

4 files changed

+40
-27
lines changed

code/model/model.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ void model_instance_free_all();
827827
// Loads a model from disk and returns the model number it loaded into.
828828
int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, int ferror = 1, int duplicate = 0);
829829

830-
int model_create_instance(int model_num, int submodel_num = -1);
830+
int model_create_instance(int model_num);
831831
void model_delete_instance(int model_instance_num);
832832

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

1043-
void model_clear_submodel_instance( submodel_instance *sm_instance );
1043+
void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm );
10441044
void model_clear_submodel_instances( int model_instance_num );
10451045

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

1056-
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii);
1056+
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags);
10571057
void model_instance_dumb_rotation(int model_instance_num);
10581058

10591059
// Adds an electrical arcing effect to a submodel

code/model/modelread.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2710,7 +2710,7 @@ int model_load(char *filename, int n_subsystems, model_subsystem *subsystems, in
27102710
return pm->id;
27112711
}
27122712

2713-
int model_create_instance(int model_num, int submodel_num)
2713+
int model_create_instance(int model_num)
27142714
{
27152715
int i = 0;
27162716
int open_slot = -1;
@@ -2738,7 +2738,7 @@ int model_create_instance(int model_num, int submodel_num)
27382738
pmi->submodel = (submodel_instance*)vm_malloc( sizeof(submodel_instance)*pm->n_models );
27392739

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

27442744
pmi->model_num = model_num;
@@ -4547,11 +4547,14 @@ void model_clear_instance_info( submodel_instance_info * sii )
45474547
sii->turn_accel = 0.0f;
45484548
}
45494549

4550-
void model_clear_submodel_instance( submodel_instance *sm_instance )
4550+
void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm )
45514551
{
45524552
sm_instance->angs.p = 0.0f;
45534553
sm_instance->angs.b = 0.0f;
45544554
sm_instance->angs.h = 0.0f;
4555+
4556+
sm_instance->blown_off = sm->is_damaged ? true : false;
4557+
45554558
sm_instance->blown_off = false;
45564559
sm_instance->collision_checked = false;
45574560
}
@@ -4563,7 +4566,7 @@ void model_clear_submodel_instances( int model_instance_num )
45634566
polymodel *pm = model_get(pmi->model_num);
45644567

45654568
for ( i = 0; i < pm->n_models; i++ ) {
4566-
model_clear_submodel_instance(&pmi->submodel[i]);
4569+
model_clear_submodel_instance(&pmi->submodel[i], &pm->submodel[i]);
45674570
}
45684571
}
45694572

@@ -4662,7 +4665,7 @@ void model_set_instance_techroom(int model_num, int sub_model_num, float angle_1
46624665
sm->angs.h = angle_2;
46634666
}
46644667

4665-
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii)
4668+
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags)
46664669
{
46674670
int i;
46684671
polymodel *pm;
@@ -4680,11 +4683,15 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i
46804683

46814684
submodel_instance *smi = &pmi->submodel[sub_model_num];
46824685
bsp_info *sm = &pm->submodel[sub_model_num];
4686+
4687+
// Set the "blown out" flags
4688+
if ( flags & SSF_NO_DISAPPEAR ) {
4689+
smi->blown_off = false;
4690+
} else {
4691+
smi->blown_off = sii->blown_off ? true : false;
4692+
}
46834693

4684-
// Set the "blown out" flags
4685-
smi->blown_off = sii->blown_off ? true : false;
4686-
4687-
if ( smi->blown_off ) {
4694+
if ( smi->blown_off && !(flags & SSF_NO_REPLACE) ) {
46884695
if ( sm->my_replacement > -1 ) {
46894696
pmi->submodel[sm->my_replacement].blown_off = false;
46904697
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
47044711

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

code/model/modelrender.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1395,7 +1395,7 @@ void model_render_buffers(draw_list* scene, model_render_params* interp, vertex_
13951395
}
13961396
}
13971397

1398-
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)
1398+
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)
13991399
{
14001400
int i;
14011401

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

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

1409-
if (model->blown_off)
1410+
if ( pmi != NULL ) {
1411+
smi = &pmi->submodel[mn];
1412+
}
1413+
1414+
if ( (smi != NULL && smi->blown_off) || model->blown_off ) {
14101415
return;
1416+
}
14111417

14121418
const uint model_flags = interp->get_model_flags();
14131419

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

1439+
if ( smi != NULL ) {
1440+
ang = smi->angs;
1441+
}
1442+
14331443
// Add barrel rotation if needed
14341444
if ( model->gun_rotation ) {
14351445
if ( pm->gun_submodel_rotation > PI2 ) {
@@ -1477,7 +1487,7 @@ void model_render_children_buffers(draw_list* scene, model_render_params* interp
14771487

14781488
while ( i >= 0 ) {
14791489
if ( !pm->submodel[i].is_thruster ) {
1480-
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
1490+
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
14811491
}
14821492

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

26722682
polymodel *pm = model_get(model_num);
2683+
polymodel_instance *pmi = NULL;
26732684

26742685
model_do_dumb_rotation(model_num);
26752686

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

27152726
if (objp->type == OBJ_SHIP) {
27162727
shipp = &Ships[objp->instance];
2728+
pmi = model_get_instance(shipp->model_instance_num);
27172729
}
27182730
}
27192731

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

28502862
while( i >= 0 ) {
28512863
if ( !pm->submodel[i].is_thruster ) {
2852-
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
2864+
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
28532865
} else {
28542866
draw_thrusters = true;
28552867
}
@@ -2886,7 +2898,7 @@ void model_render_queue(model_render_params *interp, draw_list *scene, int model
28862898

28872899
while( i >= 0 ) {
28882900
if ( !pm->submodel[i].is_thruster ) {
2889-
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
2901+
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
28902902
}
28912903

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

29082920
while( i >= 0 ) {
29092921
if (pm->submodel[i].is_thruster) {
2910-
model_render_children_buffers( scene, interp, pm, i, detail_level, tmap_flags, trans_buffer );
2922+
model_render_children_buffers( scene, interp, pm, pmi, i, detail_level, tmap_flags, trans_buffer );
29112923
}
29122924
i = pm->submodel[i].next_sibling;
29132925
}

code/ship/ship.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13051,11 +13051,11 @@ void ship_model_update_instance(object *objp)
1305113051
}
1305213052

1305313053
if ( psub->subobj_num >= 0 ) {
13054-
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1 );
13054+
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1, pss->flags );
1305513055
}
1305613056

1305713057
if ( (psub->subobj_num != psub->turret_gun_sobj) && (psub->turret_gun_sobj >= 0) ) {
13058-
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2 );
13058+
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2, pss->flags );
1305913059
}
1306013060
}
1306113061

@@ -18993,8 +18993,6 @@ void ship_render(object* obj, draw_list* scene)
1899318993
}
1899418994
}
1899518995

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

19022-
ship_model_stop(obj);
19023-
1902419020
return;
1902519021
}
1902619022

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

19096-
ship_model_stop(obj);
19097-
1909819092
if (shipp->shield_hits && !Rendering_to_shadow_map) {
1909919093
create_shield_explosion_all(obj);
1910019094
shipp->shield_hits = 0;

0 commit comments

Comments
 (0)