diff --git a/code/ai/aicode.cpp b/code/ai/aicode.cpp index b97aea92758..e65c58938c7 100644 --- a/code/ai/aicode.cpp +++ b/code/ai/aicode.cpp @@ -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; @@ -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 @@ -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 { @@ -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); - } } @@ -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); @@ -6289,8 +6280,6 @@ void render_path_points(object *objp) pp++; } } - - ship_model_stop(&Objects[aip->goal_objnum]); } /** @@ -9040,8 +9029,9 @@ 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); @@ -9049,13 +9039,11 @@ void find_adjusted_dockpoint_info(vec3d *global_p0, vec3d *global_p1, vec3d *glo 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 @@ -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 diff --git a/code/debris/debris.cpp b/code/debris/debris.cpp index fc6cac2d2ba..3582b53cce9 100644 --- a/code/debris/debris.cpp +++ b/code/debris/debris.cpp @@ -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 diff --git a/code/hud/hudshield.cpp b/code/hud/hudshield.cpp index 477c35507c1..062ceca2fcf 100644 --- a/code/hud/hudshield.cpp +++ b/code/hud/hudshield.cpp @@ -680,7 +680,6 @@ 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; @@ -688,6 +687,7 @@ void HudGaugeShield::showShields(object *objp, int mode) 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 ); } @@ -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) diff --git a/code/hud/hudtarget.cpp b/code/hud/hudtarget.cpp index 1811653e1aa..16b987a185b 100644 --- a/code/hud/hudtarget.cpp +++ b/code/hud/hudtarget.cpp @@ -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); @@ -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); diff --git a/code/hud/hudtargetbox.cpp b/code/hud/hudtargetbox.cpp index 494895f2b75..a4618ac4b77 100644 --- a/code/hud/hudtargetbox.cpp +++ b/code/hud/hudtargetbox.cpp @@ -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: @@ -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); } @@ -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: @@ -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 ) { diff --git a/code/model/model.h b/code/model/model.h index b2e35672ad2..50745e89f0f 100644 --- a/code/model/model.h +++ b/code/model/model.h @@ -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. diff --git a/code/model/modelread.cpp b/code/model/modelread.cpp index 90b2bc7f6be..ad8430edc3e 100644 --- a/code/model/modelread.cpp +++ b/code/model/modelread.cpp @@ -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); } @@ -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 ) @@ -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; inum_details; i++ ) { diff --git a/code/object/collideshipship.cpp b/code/object/collideshipship.cpp index 1d45077be56..25195b1a594 100644 --- a/code/object/collideshipship.cpp +++ b/code/object/collideshipship.cpp @@ -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) { @@ -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 diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index d4009a1d8bf..c0a3683569c 100755 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -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++ ) { diff --git a/code/ship/shipfx.cpp b/code/ship/shipfx.cpp index d8530b56077..a558c43faab 100644 --- a/code/ship/shipfx.cpp +++ b/code/ship/shipfx.cpp @@ -80,7 +80,9 @@ void shipfx_remove_submodel_ship_sparks(ship *shipp, int submodel_num) void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, ship_subsys *subsys, vec3d *exp_center, float exp_mag) { // initializations + ship *shipp = &Ships[ship_objp->instance]; polymodel *pm = model_get(Ship_info[ship_p->ship_info_index].model_num); + polymodel_instance *pmi = model_get_instance(shipp->model_instance_num); int submodel_num = subsys->system_info->subobj_num; submodel_instance_info *sii = &subsys->submodel_info_1; @@ -93,8 +95,6 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, return; } - ship_model_start(ship_objp); - // copy angles angles copy_angs = pm->submodel[submodel_num].angs; angles zero_angs = {0.0f, 0.0f, 0.0f}; @@ -113,7 +113,7 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, model_get_rotating_submodel_axis(&model_axis, &world_axis, pm->id, submodel_num, ship_objp); vm_vec_copy_scale(&rotvel, &world_axis, sii->cur_turn_rate); - model_find_world_point(&world_axis_pt, &sii->pt_on_axis, pm->id, submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&world_axis_pt, &sii->pt_on_axis, pm->id, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); vm_quaternion_rotate(&m_rot, vm_vec_mag((vec3d*)&sii->angs), &model_axis); } else { @@ -130,17 +130,17 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, // get start world pos vm_vec_zero(&start_world_pos); - model_find_world_point(&start_world_pos, &pm->submodel[live_debris_submodel].offset, pm->id, live_debris_submodel, &ship_objp->orient, &ship_objp->pos ); + model_instance_find_world_point(&start_world_pos, &pm->submodel[live_debris_submodel].offset, pm->id, shipp->model_instance_num, live_debris_submodel, &ship_objp->orient, &ship_objp->pos ); // convert to model coord of underlying submodel // set angle to zero pm->submodel[submodel_num].angs = zero_angs; - world_find_model_point(&start_model_pos, &start_world_pos, pm, submodel_num, &ship_objp->orient, &ship_objp->pos); + world_find_model_instance_point(&start_model_pos, &start_world_pos, pm, pmi, submodel_num, &ship_objp->orient, &ship_objp->pos); // rotate from submodel coord to world coords // reset angle to current angle pm->submodel[submodel_num].angs = copy_angs; - model_find_world_point(&end_world_pos, &start_model_pos, pm->id, submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&end_world_pos, &start_model_pos, pm->id, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); int fireball_type = fireball_ship_explosion_type(&Ship_info[ship_p->ship_info_index]); if(fireball_type < 0) { @@ -209,8 +209,6 @@ void shipfx_subsystem_maybe_create_live_debris(object *ship_objp, ship *ship_p, shipfx_debris_limit_speed(&Debris[live_debris_obj->instance], ship_p); } } - - ship_model_stop(ship_objp); } void set_ship_submodel_as_blown_off(ship *shipp, char *name) @@ -245,6 +243,7 @@ void shipfx_maybe_create_live_debris_at_ship_death( object *ship_objp ) ship *shipp = &Ships[ship_objp->instance]; polymodel *pm = model_get(Ship_info[shipp->ship_info_index].model_num); + polymodel_instance *pmi = model_get_instance(shipp->model_instance_num); // no subsystems -> no live debris. if (Ship_info[shipp->ship_info_index].n_subsystems == 0) { @@ -261,11 +260,8 @@ void shipfx_maybe_create_live_debris_at_ship_death( object *ship_objp ) int parent = model_get_parent_submodel_for_live_debris(pm->id, live_debris_submodel); Assert(parent != -1); - // set model values only once (esp blown off) - ship_model_start(ship_objp); - // check if already blown off (ship model set) - if ( !pm->submodel[parent].blown_off ) { + if ( !pmi->submodel[parent].blown_off ) { // get ship_subsys for live_debris // Go through all subsystems and look for submodel the subsystems with "parent" submodel. @@ -280,7 +276,7 @@ void shipfx_maybe_create_live_debris_at_ship_death( object *ship_objp ) if (pss != NULL) { if (pss->system_info != NULL) { vec3d exp_center, tmp = ZERO_VECTOR; - model_find_world_point(&exp_center, &tmp, pm->id, parent, &ship_objp->orient, &ship_objp->pos ); + model_instance_find_world_point(&exp_center, &tmp, pm->id, shipp->model_instance_num, parent, &ship_objp->orient, &ship_objp->pos ); // if not blown off, blow it off shipfx_subsystem_maybe_create_live_debris(ship_objp, shipp, pss, &exp_center, 3.0f); @@ -293,10 +289,6 @@ void shipfx_maybe_create_live_debris_at_ship_death( object *ship_objp ) } } } - - // clean up - ship_model_stop(ship_objp); - } void shipfx_blow_off_subsystem(object *ship_objp, ship *ship_p,ship_subsys *subsys, vec3d *exp_center, bool no_explosion) @@ -1481,9 +1473,7 @@ void shipfx_emit_spark( int n, int sn ) // get spark position if (shipp->sparks[spark_num].submodel_num != -1) { - ship_model_start(obj); - model_find_world_point(&outpnt, &shipp->sparks[spark_num].pos, sip->model_num, shipp->sparks[spark_num].submodel_num, &obj->orient, &obj->pos); - ship_model_stop(obj); + model_instance_find_world_point(&outpnt, &shipp->sparks[spark_num].pos, sip->model_num, shipp->model_instance_num, shipp->sparks[spark_num].submodel_num, &obj->orient, &obj->pos); } else { // rotate sparks correctly with current ship orient vm_vec_unrotate(&outpnt, &shipp->sparks[spark_num].pos, &obj->orient); diff --git a/code/ship/shiphit.cpp b/code/ship/shiphit.cpp index e23011644c6..20a8c69d622 100755 --- a/code/ship/shiphit.cpp +++ b/code/ship/shiphit.cpp @@ -1110,14 +1110,9 @@ int choose_next_spark(object *ship_objp, vec3d *hitpos) num_spark_pairs = (num_sparks * num_sparks - num_sparks) / 2; // get the world hitpos for all sparks - bool model_started = false; for (spark_num=0; spark_numsparks[spark_num].submodel_num != -1) { - if ( !model_started) { - model_started = true; - ship_model_start(ship_objp); - } - model_find_world_point(&world_hitpos[spark_num], &shipp->sparks[spark_num].pos, sip->model_num, shipp->sparks[spark_num].submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&world_hitpos[spark_num], &shipp->sparks[spark_num].pos, sip->model_num, shipp->model_instance_num, shipp->sparks[spark_num].submodel_num, &ship_objp->orient, &ship_objp->pos); } else { // rotate sparks correctly with current ship orient vm_vec_unrotate(&world_hitpos[spark_num], &shipp->sparks[spark_num].pos, &ship_objp->orient); @@ -1125,10 +1120,6 @@ int choose_next_spark(object *ship_objp, vec3d *hitpos) } } - if (model_started) { - ship_model_stop(ship_objp); - } - // check we're not making a spark in the same location as a current one for (i=0; imodel_num, submodel_num, &ship_objp->orient, &ship_objp->pos); - model_find_world_point(&temp_x, &vmd_x_vector, sip->model_num, submodel_num, &ship_objp->orient, &ship_objp->pos); - model_find_world_point(&temp_y, &vmd_y_vector, sip->model_num, submodel_num, &ship_objp->orient, &ship_objp->pos); - model_find_world_point(&temp_z, &vmd_z_vector, sip->model_num, submodel_num, &ship_objp->orient, &ship_objp->pos); - ship_model_stop(ship_objp); + model_instance_find_world_point(&temp_zero, &vmd_zero_vector, sip->model_num, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&temp_x, &vmd_x_vector, sip->model_num, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&temp_y, &vmd_y_vector, sip->model_num, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); + model_instance_find_world_point(&temp_z, &vmd_z_vector, sip->model_num, shipp->model_instance_num, submodel_num, &ship_objp->orient, &ship_objp->pos); // find submodel x,y,z axes vm_vec_sub2(&temp_x, &temp_zero);