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
40 changes: 13 additions & 27 deletions code/ai/aicode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2621,7 +2621,7 @@ void create_path_to_point(vec3d *curpos, vec3d *goalpos, object *curobjp, object
void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int count, int path_num, pnode *pnp, int randomize_pnt)
{
polymodel *pm;
int i, modelnum;
int i, modelnum, model_instance_num;
vec3d v1;
int pp_index; // index in Path_points at which to store point, if this is a modify-in-place (pnp ! NULL)
int start_index, finish_index;
Expand All @@ -2646,14 +2646,12 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou

// Goober5000 - check for rotating submodels
modelnum = Ship_info[Ships[objp->instance].ship_info_index].model_num;
model_instance_num = Ships[objp->instance].model_instance_num;
pm = model_get(modelnum);
if ((mp->parent_submodel >= 0) && (pm->submodel[mp->parent_submodel].movement_type >= 0))
{
rotating_submodel = true;

// start submodel calculation
ship_model_start(objp);

model_find_submodel_offset(&submodel_offset, modelnum, mp->parent_submodel);
}
else
Expand All @@ -2670,7 +2668,7 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
{
// movement... find location of point like with docking code and spark generation
vm_vec_sub(&local_vert, &mp->verts[i].pos, &submodel_offset);
model_find_world_point(&v1, &local_vert, modelnum, mp->parent_submodel, &objp->orient, &objp->pos);
model_instance_find_world_point(&v1, &local_vert, modelnum, model_instance_num, mp->parent_submodel, &objp->orient, &objp->pos);
}
else
{
Expand All @@ -2692,12 +2690,6 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
add_path_point(&v1, path_num, i, pp_index);
offset++;
}

// stop submodel calculation
if (!rotating_submodel)
{
ship_model_stop(objp);
}
}


Expand Down Expand Up @@ -6253,10 +6245,9 @@ void render_path_points(object *objp)
vec3d dock_point, global_dock_point;
vertex v;

ship_model_start(&Objects[aip->goal_objnum]);
if (pm->n_docks) {
dock_point = pm->docking_bays[0].pnt[0];
model_find_world_point(&global_dock_point, &dock_point, pm->id, 0, &dobjp->orient, &dobjp->pos );
model_instance_find_world_point(&global_dock_point, &dock_point, pm->id, shipp->model_instance_num, 0, &dobjp->orient, &dobjp->pos );
g3_rotate_vertex(&v, &global_dock_point);
gr_set_color(255, 255, 255);
g3_draw_sphere( &v, 1.5f);
Expand Down Expand Up @@ -6289,8 +6280,6 @@ void render_path_points(object *objp)
pp++;
}
}

ship_model_stop(&Objects[aip->goal_objnum]);
}

/**
Expand Down Expand Up @@ -9040,22 +9029,21 @@ void find_adjusted_dockpoint_info(vec3d *global_p0, vec3d *global_p1, vec3d *glo
{
vec3d submodel_offset;
vec3d local_p0, local_p1;
ship *shipp;

ship_model_start(objp);
shipp = &Ships[objp->instance];

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

// find the dynamic positions of the dockpoints
model_find_world_point(global_p0, &local_p0, modelnum, submodel, &objp->orient, &objp->pos);
model_find_world_point(global_p1, &local_p1, modelnum, submodel, &objp->orient, &objp->pos);
model_instance_find_world_point(global_p0, &local_p0, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
model_instance_find_world_point(global_p1, &local_p1, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);

// find the normal of the first dockpoint
model_find_world_dir(global_p0_norm, &pm->docking_bays[dock_index].norm[0], modelnum, submodel, &objp->orient, &objp->pos);

ship_model_stop(objp);
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);
}
// use the static dockpoints
else
Expand Down Expand Up @@ -9137,23 +9125,21 @@ float dock_orient_and_approach(object *docker_objp, int docker_index, object *do
vec3d submodel_offset;
vec3d dockpoint_temp;

ship_model_start(dockee_objp);

// get submodel center
model_find_submodel_offset(&submodel_offset, sip1->model_num, dockee_rotating_submodel);
vm_vec_add(&submodel_pos, &dockee_objp->pos, &submodel_offset);

polymodel_instance *pmi1 = model_get_instance(Ships[dockee_objp->instance].model_instance_num);

// get angular velocity of dockpoint
//WMC - hack(?) to fix bug where sii might not exist
if(pm1->submodel[dockee_rotating_submodel].sii != NULL) {
submodel_omega = pm1->submodel[dockee_rotating_submodel].sii->cur_turn_rate;
if ( pmi1->submodel[dockee_rotating_submodel].sii != NULL ) {
submodel_omega = pmi1->submodel[dockee_rotating_submodel].sii->cur_turn_rate;
}

// get radius to dockpoint
vm_vec_avg(&dockpoint_temp, &dockee_p0, &dockee_p1);
submodel_radius = vm_vec_dist(&submodel_pos, &dockpoint_temp);

ship_model_stop(dockee_objp);
}

// Goober5000
Expand Down
2 changes: 0 additions & 2 deletions code/debris/debris.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -900,8 +900,6 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
polymodel *pm;
polymodel_instance *pmi;

ship_model_start(pship_obj);

if (model_collide(&mc)) {

// Set earliest hit time
Expand Down
3 changes: 1 addition & 2 deletions code/hud/hudshield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,14 +680,14 @@ void HudGaugeShield::showShields(object *objp, int mode)
}

//We're ready to show stuff
ship_model_start(objp);
//if(!digitus_improbus)
{
model_render_params render_info;

render_info.set_flags(MR_NO_LIGHTING | MR_AUTOCENTER | MR_NO_FOGGING);
render_info.set_replacement_textures(sp->ship_replacement_textures);
render_info.set_detail_level_lock(1);
render_info.set_object_number(OBJ_INDEX(objp));

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

//We're done
if(!Cmdline_nohtl)
Expand Down
3 changes: 1 addition & 2 deletions code/hud/hudtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7146,8 +7146,8 @@ void HudGaugeHardpoints::render(float frametime)
render_info.set_color(gauge_color);
render_info.set_detail_level_lock(detail_level_lock);
render_info.set_flags(MR_NO_LIGHTING | MR_AUTOCENTER | MR_NO_FOGGING | MR_NO_TEXTURING | MR_NO_CULL);
render_info.set_object_number(OBJ_INDEX(objp));

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

gr_set_color_buffer(1);
Expand All @@ -7165,7 +7165,6 @@ void HudGaugeHardpoints::render(float frametime)
&object_orient,
&vmd_zero_vector
);
ship_model_stop( objp );

gr_stencil_set(GR_STENCIL_NONE);
gr_zbuffer_set(zbuffer);
Expand Down
8 changes: 2 additions & 6 deletions code/hud/hudtargetbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -568,8 +568,8 @@ void HudGaugeTargetBox::renderTargetShip(object *target_objp)
// IMPORTANT NOTE! Code handling the case 'missile_view == TRUE' in rendering section of renderTargetWeapon()
// is largely copied over from renderTargetShip(). To keep the codes similar please update
// both if and when needed
ship_model_start( target_objp );
model_render_params render_info;
render_info.set_object_number(OBJ_INDEX(target_objp));

switch (Targetbox_wire) {
case 0:
Expand Down Expand Up @@ -643,8 +643,6 @@ void HudGaugeTargetBox::renderTargetShip(object *target_objp)
Interp_desaturate = false;
Glowpoint_override = false;

ship_model_stop( target_objp );

if ( Monitor_mask >= 0 ) {
gr_stencil_set(GR_STENCIL_NONE);
}
Expand Down Expand Up @@ -918,7 +916,7 @@ void HudGaugeTargetBox::renderTargetWeapon(object *target_objp)
break;
}
} else {
ship_model_start( viewed_obj );
render_info.set_object_number(OBJ_INDEX(viewed_obj));

switch (Targetbox_wire) {
case 0:
Expand Down Expand Up @@ -1003,8 +1001,6 @@ void HudGaugeTargetBox::renderTargetWeapon(object *target_objp)

if (missile_view == TRUE) {
Glowpoint_override = false;

ship_model_stop( viewed_obj );
}

if ( Monitor_mask >= 0 ) {
Expand Down
1 change: 1 addition & 0 deletions code/model/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ typedef struct submodel_instance {
matrix mc_orient;
bool collision_checked;
bool blown_off;
submodel_instance_info *sii;
} submodel_instance;

// Data specific to a particular instance of a model.
Expand Down
4 changes: 3 additions & 1 deletion code/model/modelread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3339,7 +3339,7 @@ void model_get_rotating_submodel_axis(vec3d *model_axis, vec3d *world_axis, int
vm_vec_make(model_axis, 0.0f, 0.0f, 1.0f);
}

model_find_obj_dir(world_axis, model_axis, obj, submodel_num);
model_instance_find_obj_dir(world_axis, model_axis, obj, submodel_num);
}


Expand Down Expand Up @@ -4556,6 +4556,7 @@ void model_clear_submodel_instance( submodel_instance *sm_instance, bsp_info *sm
sm_instance->blown_off = sm->is_damaged ? true : false;

sm_instance->collision_checked = false;
sm_instance->sii = NULL;
}

void model_clear_submodel_instances( int model_instance_num )
Expand Down Expand Up @@ -4705,6 +4706,7 @@ void model_update_instance(int model_instance_num, int sub_model_num, submodel_i
// Set the angles
smi->angs = sii->angs;
smi->prev_angs = sii->prev_angs;
smi->sii = sii;

// For all the detail levels of this submodel, set them also.
for (i=0; i<sm->num_details; i++ ) {
Expand Down
66 changes: 32 additions & 34 deletions code/object/collideshipship.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -591,11 +591,14 @@ void calculate_ship_ship_collision_physics(collision_info_struct *ship_ship_hit_
vec3d local_vel_from_submodel;

if (ship_ship_hit_info->submodel_rot_hit == 1) {
bool set_model = false;

polymodel *pm;
polymodel_instance *pmi = NULL;
int model_instance_num = -1;

if (heavy->type == OBJ_SHIP) {
pm = model_get(heavy_sip->model_num);
model_instance_num = Ships[heavy->instance].model_instance_num;
pmi = model_get_instance(model_instance_num);
} else if (heavy->type == OBJ_ASTEROID) {
pm = Asteroid_info[Asteroids[heavy->instance].asteroid_type].modelp[Asteroids[heavy->instance].asteroid_subtype];
} else if (heavy->type == OBJ_DEBRIS) {
Expand All @@ -605,43 +608,38 @@ void calculate_ship_ship_collision_physics(collision_info_struct *ship_ship_hit_
Int3();
pm = NULL;
}

if ( pmi != NULL && pmi->submodel[ship_ship_hit_info->submodel_num].sii != NULL ) {
// set point on axis of rotating submodel if not already set.
if ( !pmi->submodel[ship_ship_hit_info->submodel_num].sii->axis_set ) {
model_init_submodel_axis_pt(pmi->submodel[ship_ship_hit_info->submodel_num].sii, pm->id, ship_ship_hit_info->submodel_num);
}

// be sure model is set
if (pm->submodel[ship_ship_hit_info->submodel_num].sii == NULL) {
set_model = true;
ship_model_start(heavy);
}

// set point on axis of rotating submodel if not already set.
if (!pm->submodel[ship_ship_hit_info->submodel_num].sii->axis_set) {
model_init_submodel_axis_pt(pm->submodel[ship_ship_hit_info->submodel_num].sii, pm->id, ship_ship_hit_info->submodel_num);
}

vec3d omega, axis, r_rot;
if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_X) {
axis = vmd_x_vector;
} else if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Y) {
axis = vmd_y_vector;
} else if (pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Z) {
axis = vmd_z_vector;
} else {
// must be one of these axes or submodel_rot_hit is incorrectly set
Int3();
}
vec3d omega, axis, r_rot;
if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_X ) {
axis = vmd_x_vector;
} else if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Y ) {
axis = vmd_y_vector;
} else if ( pm->submodel[ship_ship_hit_info->submodel_num].movement_axis == MOVEMENT_AXIS_Z ) {
axis = vmd_z_vector;
} else {
// must be one of these axes or submodel_rot_hit is incorrectly set
Int3();
}

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

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

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

if (set_model) {
ship_model_stop(heavy);
vm_vec_cross(&local_vel_from_submodel, &omega, &r_rot);
} else {
vm_vec_zero(&local_vel_from_submodel);
}
} else {
// didn't collide with submodel
Expand Down
2 changes: 2 additions & 0 deletions code/ship/ship.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19043,6 +19043,8 @@ void ship_render(object* obj, draw_list* scene)
}
}

model_clear_instance(sip->model_num);

// 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 Down
Loading