Skip to content

Commit ed2bbc3

Browse files
committed
Merge pull request #501 from SamuelCho/kill_ship_model_start
Killed the last vestiges of ship_model_start/stop.
2 parents 23aa8cb + 1cfbc24 commit ed2bbc3

File tree

11 files changed

+70
-110
lines changed

11 files changed

+70
-110
lines changed

code/ai/aicode.cpp

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,7 +2621,7 @@ void create_path_to_point(vec3d *curpos, vec3d *goalpos, object *curobjp, object
26212621
void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int count, int path_num, pnode *pnp, int randomize_pnt)
26222622
{
26232623
polymodel *pm;
2624-
int i, modelnum;
2624+
int i, modelnum, model_instance_num;
26252625
vec3d v1;
26262626
int pp_index; // index in Path_points at which to store point, if this is a modify-in-place (pnp ! NULL)
26272627
int start_index, finish_index;
@@ -2646,14 +2646,12 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
26462646

26472647
// Goober5000 - check for rotating submodels
26482648
modelnum = Ship_info[Ships[objp->instance].ship_info_index].model_num;
2649+
model_instance_num = Ships[objp->instance].model_instance_num;
26492650
pm = model_get(modelnum);
26502651
if ((mp->parent_submodel >= 0) && (pm->submodel[mp->parent_submodel].movement_type >= 0))
26512652
{
26522653
rotating_submodel = true;
26532654

2654-
// start submodel calculation
2655-
ship_model_start(objp);
2656-
26572655
model_find_submodel_offset(&submodel_offset, modelnum, mp->parent_submodel);
26582656
}
26592657
else
@@ -2670,7 +2668,7 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
26702668
{
26712669
// movement... find location of point like with docking code and spark generation
26722670
vm_vec_sub(&local_vert, &mp->verts[i].pos, &submodel_offset);
2673-
model_find_world_point(&v1, &local_vert, modelnum, mp->parent_submodel, &objp->orient, &objp->pos);
2671+
model_instance_find_world_point(&v1, &local_vert, modelnum, model_instance_num, mp->parent_submodel, &objp->orient, &objp->pos);
26742672
}
26752673
else
26762674
{
@@ -2692,12 +2690,6 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
26922690
add_path_point(&v1, path_num, i, pp_index);
26932691
offset++;
26942692
}
2695-
2696-
// stop submodel calculation
2697-
if (!rotating_submodel)
2698-
{
2699-
ship_model_stop(objp);
2700-
}
27012693
}
27022694

27032695

@@ -6253,10 +6245,9 @@ void render_path_points(object *objp)
62536245
vec3d dock_point, global_dock_point;
62546246
vertex v;
62556247

6256-
ship_model_start(&Objects[aip->goal_objnum]);
62576248
if (pm->n_docks) {
62586249
dock_point = pm->docking_bays[0].pnt[0];
6259-
model_find_world_point(&global_dock_point, &dock_point, pm->id, 0, &dobjp->orient, &dobjp->pos );
6250+
model_instance_find_world_point(&global_dock_point, &dock_point, pm->id, shipp->model_instance_num, 0, &dobjp->orient, &dobjp->pos );
62606251
g3_rotate_vertex(&v, &global_dock_point);
62616252
gr_set_color(255, 255, 255);
62626253
g3_draw_sphere( &v, 1.5f);
@@ -6289,8 +6280,6 @@ void render_path_points(object *objp)
62896280
pp++;
62906281
}
62916282
}
6292-
6293-
ship_model_stop(&Objects[aip->goal_objnum]);
62946283
}
62956284

62966285
/**
@@ -9040,22 +9029,21 @@ void find_adjusted_dockpoint_info(vec3d *global_p0, vec3d *global_p1, vec3d *glo
90409029
{
90419030
vec3d submodel_offset;
90429031
vec3d local_p0, local_p1;
9032+
ship *shipp;
90439033

9044-
ship_model_start(objp);
9034+
shipp = &Ships[objp->instance];
90459035

90469036
// calculate the dockpoint locations relative to the unrotated submodel
90479037
model_find_submodel_offset(&submodel_offset, modelnum, submodel);
90489038
vm_vec_sub(&local_p0, &pm->docking_bays[dock_index].pnt[0], &submodel_offset);
90499039
vm_vec_sub(&local_p1, &pm->docking_bays[dock_index].pnt[1], &submodel_offset);
90509040

90519041
// find the dynamic positions of the dockpoints
9052-
model_find_world_point(global_p0, &local_p0, modelnum, submodel, &objp->orient, &objp->pos);
9053-
model_find_world_point(global_p1, &local_p1, modelnum, submodel, &objp->orient, &objp->pos);
9042+
model_instance_find_world_point(global_p0, &local_p0, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
9043+
model_instance_find_world_point(global_p1, &local_p1, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
90549044

90559045
// find the normal of the first dockpoint
9056-
model_find_world_dir(global_p0_norm, &pm->docking_bays[dock_index].norm[0], modelnum, submodel, &objp->orient, &objp->pos);
9057-
9058-
ship_model_stop(objp);
9046+
model_instance_find_world_dir(global_p0_norm, &pm->docking_bays[dock_index].norm[0], modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
90599047
}
90609048
// use the static dockpoints
90619049
else
@@ -9137,23 +9125,21 @@ float dock_orient_and_approach(object *docker_objp, int docker_index, object *do
91379125
vec3d submodel_offset;
91389126
vec3d dockpoint_temp;
91399127

9140-
ship_model_start(dockee_objp);
9141-
91429128
// get submodel center
91439129
model_find_submodel_offset(&submodel_offset, sip1->model_num, dockee_rotating_submodel);
91449130
vm_vec_add(&submodel_pos, &dockee_objp->pos, &submodel_offset);
91459131

9132+
polymodel_instance *pmi1 = model_get_instance(Ships[dockee_objp->instance].model_instance_num);
9133+
91469134
// get angular velocity of dockpoint
91479135
//WMC - hack(?) to fix bug where sii might not exist
9148-
if(pm1->submodel[dockee_rotating_submodel].sii != NULL) {
9149-
submodel_omega = pm1->submodel[dockee_rotating_submodel].sii->cur_turn_rate;
9136+
if ( pmi1->submodel[dockee_rotating_submodel].sii != NULL ) {
9137+
submodel_omega = pmi1->submodel[dockee_rotating_submodel].sii->cur_turn_rate;
91509138
}
91519139

91529140
// get radius to dockpoint
91539141
vm_vec_avg(&dockpoint_temp, &dockee_p0, &dockee_p1);
91549142
submodel_radius = vm_vec_dist(&submodel_pos, &dockpoint_temp);
9155-
9156-
ship_model_stop(dockee_objp);
91579143
}
91589144

91599145
// Goober5000

code/debris/debris.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,6 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
900900
polymodel *pm;
901901
polymodel_instance *pmi;
902902

903-
ship_model_start(pship_obj);
904-
905903
if (model_collide(&mc)) {
906904

907905
// Set earliest hit time

code/hud/hudshield.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,14 +680,14 @@ void HudGaugeShield::showShields(object *objp, int mode)
680680
}
681681

682682
//We're ready to show stuff
683-
ship_model_start(objp);
684683
//if(!digitus_improbus)
685684
{
686685
model_render_params render_info;
687686

688687
render_info.set_flags(MR_NO_LIGHTING | MR_AUTOCENTER | MR_NO_FOGGING);
689688
render_info.set_replacement_textures(sp->ship_replacement_textures);
690689
render_info.set_detail_level_lock(1);
690+
render_info.set_object_number(OBJ_INDEX(objp));
691691

692692
model_render_immediate( &render_info, sip->model_num, &object_orient, &vmd_zero_vector );
693693
}
@@ -704,7 +704,6 @@ void HudGaugeShield::showShields(object *objp, int mode)
704704
}
705705
model_render(fod_model, &object_orient, &vmd_zero_vector, MR_NO_LIGHTING | MR_LOCK_DETAIL | MR_AUTOCENTER | MR_NO_FOGGING, -1, -1);
706706
}*/
707-
ship_model_stop( objp );
708707

709708
//We're done
710709
if(!Cmdline_nohtl)

code/hud/hudtarget.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7146,8 +7146,8 @@ void HudGaugeHardpoints::render(float frametime)
71467146
render_info.set_color(gauge_color);
71477147
render_info.set_detail_level_lock(detail_level_lock);
71487148
render_info.set_flags(MR_NO_LIGHTING | MR_AUTOCENTER | MR_NO_FOGGING | MR_NO_TEXTURING | MR_NO_CULL);
7149+
render_info.set_object_number(OBJ_INDEX(objp));
71497150

7150-
ship_model_start(objp);
71517151
model_render_immediate( &render_info, sip->model_num, &object_orient, &vmd_zero_vector);
71527152

71537153
gr_set_color_buffer(1);
@@ -7165,7 +7165,6 @@ void HudGaugeHardpoints::render(float frametime)
71657165
&object_orient,
71667166
&vmd_zero_vector
71677167
);
7168-
ship_model_stop( objp );
71697168

71707169
gr_stencil_set(GR_STENCIL_NONE);
71717170
gr_zbuffer_set(zbuffer);

code/hud/hudtargetbox.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,8 @@ void HudGaugeTargetBox::renderTargetShip(object *target_objp)
568568
// IMPORTANT NOTE! Code handling the case 'missile_view == TRUE' in rendering section of renderTargetWeapon()
569569
// is largely copied over from renderTargetShip(). To keep the codes similar please update
570570
// both if and when needed
571-
ship_model_start( target_objp );
572571
model_render_params render_info;
572+
render_info.set_object_number(OBJ_INDEX(target_objp));
573573

574574
switch (Targetbox_wire) {
575575
case 0:
@@ -643,8 +643,6 @@ void HudGaugeTargetBox::renderTargetShip(object *target_objp)
643643
Interp_desaturate = false;
644644
Glowpoint_override = false;
645645

646-
ship_model_stop( target_objp );
647-
648646
if ( Monitor_mask >= 0 ) {
649647
gr_stencil_set(GR_STENCIL_NONE);
650648
}
@@ -918,7 +916,7 @@ void HudGaugeTargetBox::renderTargetWeapon(object *target_objp)
918916
break;
919917
}
920918
} else {
921-
ship_model_start( viewed_obj );
919+
render_info.set_object_number(OBJ_INDEX(viewed_obj));
922920

923921
switch (Targetbox_wire) {
924922
case 0:
@@ -1003,8 +1001,6 @@ void HudGaugeTargetBox::renderTargetWeapon(object *target_objp)
10031001

10041002
if (missile_view == TRUE) {
10051003
Glowpoint_override = false;
1006-
1007-
ship_model_stop( viewed_obj );
10081004
}
10091005

10101006
if ( Monitor_mask >= 0 ) {

code/model/model.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ typedef struct submodel_instance {
9090
matrix mc_orient;
9191
bool collision_checked;
9292
bool blown_off;
93+
submodel_instance_info *sii;
9394
} submodel_instance;
9495

9596
// Data specific to a particular instance of a model.

code/model/modelread.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3338,7 +3338,7 @@ void model_get_rotating_submodel_axis(vec3d *model_axis, vec3d *world_axis, int
33383338
vm_vec_make(model_axis, 0.0f, 0.0f, 1.0f);
33393339
}
33403340

3341-
model_find_obj_dir(world_axis, model_axis, obj, submodel_num);
3341+
model_instance_find_obj_dir(world_axis, model_axis, obj, submodel_num);
33423342
}
33433343

33443344

@@ -4555,6 +4555,7 @@ void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm
45554555
sm_instance->blown_off = sm->is_damaged ? true : false;
45564556

45574557
sm_instance->collision_checked = false;
4558+
sm_instance->sii = NULL;
45584559
}
45594560

45604561
void model_clear_submodel_instances( int model_instance_num )
@@ -4704,6 +4705,7 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i
47044705
// Set the angles
47054706
smi->angs = sii->angs;
47064707
smi->prev_angs = sii->prev_angs;
4708+
smi->sii = sii;
47074709

47084710
// For all the detail levels of this submodel, set them also.
47094711
for (i=0; i<sm->num_details; i++ ) {

code/object/collideshipship.cpp

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -591,11 +591,14 @@ void calculate_ship_ship_collision_physics(collision_info_struct *ship_ship_hit_
591591
vec3d local_vel_from_submodel;
592592

593593
if (ship_ship_hit_info->submodel_rot_hit == 1) {
594-
bool set_model = false;
595-
596594
polymodel *pm;
595+
polymodel_instance *pmi = NULL;
596+
int model_instance_num = -1;
597+
597598
if (heavy->type == OBJ_SHIP) {
598599
pm = model_get(heavy_sip->model_num);
600+
model_instance_num = Ships[heavy->instance].model_instance_num;
601+
pmi = model_get_instance(model_instance_num);
599602
} else if (heavy->type == OBJ_ASTEROID) {
600603
pm = Asteroid_info[Asteroids[heavy->instance].asteroid_type].modelp[Asteroids[heavy->instance].asteroid_subtype];
601604
} else if (heavy->type == OBJ_DEBRIS) {
@@ -605,43 +608,38 @@ void calculate_ship_ship_collision_physics(collision_info_struct *ship_ship_hit_
605608
Int3();
606609
pm = NULL;
607610
}
611+
612+
if ( pmi != NULL && pmi->submodel[ship_ship_hit_info->submodel_num].sii != NULL ) {
613+
// set point on axis of rotating submodel if not already set.
614+
if ( !pmi->submodel[ship_ship_hit_info->submodel_num].sii->axis_set ) {
615+
model_init_submodel_axis_pt(pmi->submodel[ship_ship_hit_info->submodel_num].sii, pm->id, ship_ship_hit_info->submodel_num);
616+
}
608617

609-
// be sure model is set
610-
if (pm->submodel[ship_ship_hit_info->submodel_num].sii == NULL) {
611-
set_model = true;
612-
ship_model_start(heavy);
613-
}
614-
615-
// set point on axis of rotating submodel if not already set.
616-
if (!pm->submodel[ship_ship_hit_info->submodel_num].sii->axis_set) {
617-
model_init_submodel_axis_pt(pm->submodel[ship_ship_hit_info->submodel_num].sii, pm->id, ship_ship_hit_info->submodel_num);
618-
}
619-
620-
vec3d omega, axis, r_rot;
621-
if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_X) {
622-
axis = vmd_x_vector;
623-
} else if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Y) {
624-
axis = vmd_y_vector;
625-
} else if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Z) {
626-
axis = vmd_z_vector;
627-
} else {
628-
// must be one of these axes or submodel_rot_hit is incorrectly set
629-
Int3();
630-
}
618+
vec3d omega, axis, r_rot;
619+
if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_X ) {
620+
axis = vmd_x_vector;
621+
} else if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Y ) {
622+
axis = vmd_y_vector;
623+
} else if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Z ) {
624+
axis = vmd_z_vector;
625+
} else {
626+
// must be one of these axes or submodel_rot_hit is incorrectly set
627+
Int3();
628+
}
631629

632-
// get world rotational velocity of rotating submodel
633-
model_find_obj_dir(&omega, &axis, heavy, ship_ship_hit_info->submodel_num);
634-
vm_vec_scale(&omega, pm->submodel[ship_ship_hit_info->submodel_num].sii->cur_turn_rate);
630+
// get world rotational velocity of rotating submodel
631+
model_instance_find_obj_dir(&omega, &axis, heavy, ship_ship_hit_info->submodel_num);
635632

636-
// world coords for r_rot
637-
vec3d temp;
638-
vm_vec_unrotate(&temp, &pm->submodel[ship_ship_hit_info->submodel_num].sii->pt_on_axis, &heavy->orient);
639-
vm_vec_sub(&r_rot, &ship_ship_hit_info->hit_pos, &temp);
633+
vm_vec_scale(&omega, pmi->submodel[ship_ship_hit_info->submodel_num].sii->cur_turn_rate);
640634

641-
vm_vec_cross(&local_vel_from_submodel, &omega, &r_rot);
635+
// world coords for r_rot
636+
vec3d temp;
637+
vm_vec_unrotate(&temp, &pmi->submodel[ship_ship_hit_info->submodel_num].sii->pt_on_axis, &heavy->orient);
638+
vm_vec_sub(&r_rot, &ship_ship_hit_info->hit_pos, &temp);
642639

643-
if (set_model) {
644-
ship_model_stop(heavy);
640+
vm_vec_cross(&local_vel_from_submodel, &omega, &r_rot);
641+
} else {
642+
vm_vec_zero(&local_vel_from_submodel);
645643
}
646644
} else {
647645
// didn't collide with submodel

code/ship/ship.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19043,6 +19043,8 @@ void ship_render(object* obj, draw_list* scene)
1904319043
}
1904419044
}
1904519045

19046+
model_clear_instance(sip->model_num);
19047+
1904619048
// Only render electrical arcs if within 500m of the eye (for a 10m piece)
1904719049
if ( vm_vec_dist_quick( &obj->pos, &Eye_position ) < obj->radius*50.0f && !Rendering_to_shadow_map ) {
1904819050
for ( int i = 0; i < MAX_SHIP_ARCS; i++ ) {

0 commit comments

Comments
 (0)