Skip to content

Commit aaa80df

Browse files
committed
Merge pull request #486 from SamuelCho/model_instance_rendering
Allow model rendering code to use polymodel_instance.
2 parents 3c8b47c + 59fa7bd commit aaa80df

File tree

4 files changed

+40
-28
lines changed

4 files changed

+40
-28
lines changed

code/model/model.h

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

832-
int model_create_instance(int model_num, int submodel_num = -1);
832+
int model_create_instance(int model_num);
833833
void model_delete_instance(int model_instance_num);
834834

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

1045-
void model_clear_submodel_instance( submodel_instance *sm_instance );
1045+
void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm );
10461046
void model_clear_submodel_instances( int model_instance_num );
10471047

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

1058-
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii);
1058+
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags);
10591059
void model_instance_dumb_rotation(int model_instance_num);
10601060

10611061
// Adds an electrical arcing effect to a submodel

code/model/modelread.cpp

Lines changed: 17 additions & 11 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,12 +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-
sm_instance->blown_off = false;
4555+
4556+
sm_instance->blown_off = sm->is_damaged ? true : false;
4557+
45564558
sm_instance->collision_checked = false;
45574559
}
45584560

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

45654567
for ( i = 0; i < pm->n_models; i++ ) {
4566-
model_clear_submodel_instance(&pmi->submodel[i]);
4568+
model_clear_submodel_instance(&pmi->submodel[i], &pm->submodel[i]);
45674569
}
45684570
}
45694571

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

4665-
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii)
4667+
void model_update_instance(int model_instance_num, int sub_model_num, submodel_instance_info *sii, int flags)
46664668
{
46674669
int i;
46684670
polymodel *pm;
@@ -4680,11 +4682,15 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i
46804682

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

4684-
// Set the "blown out" flags
4685-
smi->blown_off = sii->blown_off ? true : false;
4686-
4687-
if ( smi->blown_off ) {
4693+
if ( smi->blown_off && !(flags & SSF_NO_REPLACE) ) {
46884694
if ( sm->my_replacement > -1 ) {
46894695
pmi->submodel[sm->my_replacement].blown_off = false;
46904696
pmi->submodel[sm->my_replacement].angs = sii->angs;
@@ -4704,7 +4710,7 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i
47044710

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

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
@@ -13084,11 +13084,11 @@ void ship_model_update_instance(object *objp)
1308413084
}
1308513085

1308613086
if ( psub->subobj_num >= 0 ) {
13087-
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1 );
13087+
model_update_instance(model_instance_num, psub->subobj_num, &pss->submodel_info_1, pss->flags );
1308813088
}
1308913089

1309013090
if ( (psub->subobj_num != psub->turret_gun_sobj) && (psub->turret_gun_sobj >= 0) ) {
13091-
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2 );
13091+
model_update_instance(model_instance_num, psub->turret_gun_sobj, &pss->submodel_info_2, pss->flags );
1309213092
}
1309313093
}
1309413094

@@ -19026,8 +19026,6 @@ void ship_render(object* obj, draw_list* scene)
1902619026
}
1902719027
}
1902819028

19029-
ship_model_start(obj);
19030-
1903119029
// Only render electrical arcs if within 500m of the eye (for a 10m piece)
1903219030
if ( vm_vec_dist_quick( &obj->pos, &Eye_position ) < obj->radius*50.0f && !Rendering_to_shadow_map ) {
1903319031
for ( int i = 0; i < MAX_SHIP_ARCS; i++ ) {
@@ -19052,8 +19050,6 @@ void ship_render(object* obj, draw_list* scene)
1905219050
shipp->warpout_effect->warpShipRender();
1905319051
}
1905419052

19055-
ship_model_stop(obj);
19056-
1905719053
return;
1905819054
}
1905919055

@@ -19126,8 +19122,6 @@ void ship_render(object* obj, draw_list* scene)
1912619122
model_render_queue(&render_info, scene, sip->model_num, &obj->orient, &obj->pos);
1912719123
}
1912819124

19129-
ship_model_stop(obj);
19130-
1913119125
if (shipp->shield_hits && !Rendering_to_shadow_map) {
1913219126
create_shield_explosion_all(obj);
1913319127
shipp->shield_hits = 0;

0 commit comments

Comments
 (0)