diff --git a/code/model/model.h b/code/model/model.h index 8c5e8e7073..8e1603412f 100644 --- a/code/model/model.h +++ b/code/model/model.h @@ -95,9 +95,6 @@ struct submodel_instance // These fields are the true standard reference for submodel rotation. They should seldom be read directly // and should almost never be written directly. In most cases, coders should prefer cur_angle and prev_angle. - // NOTE: IF THE ANGLES ARE MODIFIED, THE ORIENT SHOULD BE MODIFIED TOO! - - angles canonical_angs = vmd_zero_angles; matrix canonical_orient = vmd_identity_matrix; matrix canonical_prev_orient = vmd_identity_matrix; diff --git a/code/model/modelanim.cpp b/code/model/modelanim.cpp index 99cdb3532e..b382bfa425 100644 --- a/code/model/modelanim.cpp +++ b/code/model/modelanim.cpp @@ -537,7 +537,6 @@ void model_anim_submodel_trigger_rotate(model_subsystem *psub, ship_subsys *ss) else if (angs.b < 0.0f) angs.b += PI2; - smi->canonical_angs = angs; vm_angles_2_matrix(&smi->canonical_orient, &angs); } @@ -599,8 +598,10 @@ bool model_anim_start_type(ship_subsys *pss, AnimationTriggerType animation_type // rotate instantly; don't use the queue if (instant) { trigger->set_to_final(&psub->triggers[i]); - trigger->apply_trigger_angles(&pss->submodel_instance_1->canonical_angs); - vm_angles_2_matrix(&pss->submodel_instance_1->canonical_orient, &pss->submodel_instance_1->canonical_angs); + + angles angs; + trigger->apply_trigger_angles(&angs); + vm_angles_2_matrix(&pss->submodel_instance_1->canonical_orient, &angs); retval = true; } @@ -892,8 +893,10 @@ void model_anim_set_initial_states(ship *shipp) triggered_rotation *tr = &Triggered_rotations[pss->triggered_rotation_index]; tr->set_to_initial(&psub->triggers[i]); - tr->apply_trigger_angles(&pss->submodel_instance_1->canonical_angs); - vm_angles_2_matrix(&pss->submodel_instance_1->canonical_orient, &pss->submodel_instance_1->canonical_angs); + + angles angs; + tr->apply_trigger_angles(&angs); + vm_angles_2_matrix(&pss->submodel_instance_1->canonical_orient, &angs); } } } diff --git a/code/model/modelread.cpp b/code/model/modelread.cpp index 3c2895e845..dca8cc0b68 100644 --- a/code/model/modelread.cpp +++ b/code/model/modelread.cpp @@ -1470,18 +1470,18 @@ int read_model_file(polymodel * pm, const char *filename, int n_subsystems, mode pm->submodel[n].movement_axis = vmd_z_vector; } else if (movement_axis_id == MOVEMENT_AXIS_OTHER) { - if ((p = strstr(props, "$movement_axis_point")) != nullptr) { + if ((p = strstr(props, "$rotation_axis")) != nullptr) { if (get_user_vec3d_value(p + 20, &pm->submodel[n].movement_axis, true)) { vm_vec_normalize(&pm->submodel[n].movement_axis); } else { - Warning(LOCATION, "Failed to parse $movement_axis_point on subsystem '%s' on ship %s!", pm->submodel[n].name, pm->filename); + Warning(LOCATION, "Failed to parse $rotation_axis on subsystem '%s' on ship %s!", pm->submodel[n].name, pm->filename); pm->submodel[n].movement_type = MOVEMENT_TYPE_NONE; movement_axis_id = MOVEMENT_AXIS_NONE; } } else { - Warning(LOCATION, "A $movement_axis_point was not specified for subsystem '%s' on ship %s!", pm->submodel[n].name, pm->filename); + Warning(LOCATION, "A $rotation_axis was not specified for subsystem '%s' on ship %s!", pm->submodel[n].name, pm->filename); pm->submodel[n].movement_type = MOVEMENT_TYPE_NONE; movement_axis_id = MOVEMENT_AXIS_NONE; } @@ -3498,23 +3498,31 @@ void submodel_canonicalize(bsp_info *sm, submodel_instance *smi, bool clamp) switch (sm->movement_axis_id) { case MOVEMENT_AXIS_X: - smi->canonical_angs.p = smi->cur_angle; - vm_angles_2_matrix(&smi->canonical_orient, &smi->canonical_angs); + { + angles angs = vmd_zero_angles; + angs.p = smi->cur_angle; + vm_angles_2_matrix(&smi->canonical_orient, &angs); break; + } case MOVEMENT_AXIS_Y: - smi->canonical_angs.h = smi->cur_angle; - vm_angles_2_matrix(&smi->canonical_orient, &smi->canonical_angs); + { + angles angs = vmd_zero_angles; + angs.h = smi->cur_angle; + vm_angles_2_matrix(&smi->canonical_orient, &angs); break; + } case MOVEMENT_AXIS_Z: - smi->canonical_angs.b = smi->cur_angle; - vm_angles_2_matrix(&smi->canonical_orient, &smi->canonical_angs); + { + angles angs = vmd_zero_angles; + angs.b = smi->cur_angle; + vm_angles_2_matrix(&smi->canonical_orient, &angs); break; + } default: vm_quaternion_rotate(&smi->canonical_orient, smi->cur_angle, &sm->movement_axis); - vm_extract_angles_matrix_alternate(&smi->canonical_angs, &smi->canonical_orient); break; } } @@ -3790,8 +3798,6 @@ void model_make_turret_matrix(polymodel *pm, polymodel_instance *pmi, model_subs auto save_base_angle = base->cur_angle; auto save_gun_angle = gun->cur_angle; - auto save_base_angs = base->canonical_angs; - auto save_gun_angs = gun->canonical_angs; auto save_base_orient = base->canonical_orient; auto save_gun_orient = gun->canonical_orient; @@ -3835,8 +3841,6 @@ void model_make_turret_matrix(polymodel *pm, polymodel_instance *pmi, model_subs // restore the position of the turret before we entered this function base->cur_angle = save_base_angle; gun->cur_angle = save_gun_angle; - base->canonical_angs = save_base_angs; - gun->canonical_angs = save_gun_angs; base->canonical_orient = save_base_orient; gun->canonical_orient = save_gun_orient; } @@ -4494,12 +4498,10 @@ void model_update_instance(polymodel *pm, polymodel_instance *pmi, const submode r_smi->blown_off = false; if ( copy_from ) { r_smi->cur_angle = copy_from->cur_angle; - r_smi->canonical_angs = copy_from->canonical_angs; r_smi->canonical_orient = copy_from->canonical_orient; r_smi->canonical_prev_orient = copy_from->canonical_prev_orient; } else { r_smi->cur_angle = smi->cur_angle; - r_smi->canonical_angs = smi->canonical_angs; r_smi->canonical_orient = smi->canonical_orient; r_smi->canonical_prev_orient = smi->canonical_prev_orient; } @@ -4516,7 +4518,6 @@ void model_update_instance(polymodel *pm, polymodel_instance *pmi, const submode // Set the angles. if ( copy_from ) { smi->cur_angle = copy_from->cur_angle; - smi->canonical_angs = copy_from->canonical_angs; smi->canonical_orient = copy_from->canonical_orient; smi->canonical_prev_orient = copy_from->canonical_prev_orient; } @@ -4665,7 +4666,6 @@ void model_init_submodel_axis_pt(polymodel *pm, polymodel_instance *pmi, int sub // copy submodel angs float save_angle = smi->cur_angle; - angles save_angs = smi->canonical_angs; matrix save_orient = smi->canonical_orient; // find two points rotated into model RF when angs set to 0 @@ -4682,7 +4682,6 @@ void model_init_submodel_axis_pt(polymodel *pm, polymodel_instance *pmi, int sub // reset submodel angs smi->cur_angle = save_angle; - smi->canonical_angs = save_angs; smi->canonical_orient = save_orient; // find direction vectors of the two lines diff --git a/code/network/multi_obj.cpp b/code/network/multi_obj.cpp index fb2621057d..caa606f05f 100644 --- a/code/network/multi_obj.cpp +++ b/code/network/multi_obj.cpp @@ -1314,10 +1314,14 @@ int multi_oo_pack_data(net_player *pl, object *objp, ushort oo_flags, ubyte *dat if (subsystem->system_info->flags[Model::Subsystem_Flags::Rotates, Model::Subsystem_Flags::Dum_rotates]) { angles *angs_1 = nullptr; angles *angs_2 = nullptr; - if (subsystem->submodel_instance_1) - angs_1 = &subsystem->submodel_instance_1->canonical_angs; - if (subsystem->submodel_instance_2) - angs_2 = &subsystem->submodel_instance_2->canonical_angs; + if (subsystem->submodel_instance_1) { + angs_1 = new angles; + vm_extract_angles_matrix_alternate(angs_1, &subsystem->submodel_instance_1->canonical_orient); + } + if (subsystem->submodel_instance_2) { + angs_2 = new angles; + vm_extract_angles_matrix_alternate(angs_2, &subsystem->submodel_instance_2->canonical_orient); + } // here we're checking to see if the subsystems rotated enough to send. if (angs_1 != nullptr && angs_1->b != Oo_info.player_frame_info[pl->player_id].last_sent[objp->net_signature].subsystem_1b[i]) { @@ -1349,6 +1353,10 @@ int multi_oo_pack_data(net_player *pl, object *objp, ushort oo_flags, ubyte *dat flags[i] |= OO_SUBSYS_ROTATION_2p; subsys_data.push_back(angs_2->p / PI2); } + + // clang says deleting null pointer has no effect + delete angs_1; + delete angs_2; } i++; } @@ -1925,11 +1933,15 @@ int multi_oo_unpack_data(net_player* pl, ubyte* data, int seq_num) angles *angs_2 = nullptr; if (subsysp->submodel_instance_1) { prev_angs_1 = new angles; - angs_1 = &subsysp->submodel_instance_1->canonical_angs; + angs_1 = new angles; + vm_extract_angles_matrix_alternate(prev_angs_1, &subsysp->submodel_instance_1->canonical_prev_orient); + vm_extract_angles_matrix_alternate(angs_1, &subsysp->submodel_instance_1->canonical_orient); } if (subsysp->submodel_instance_2) { prev_angs_2 = new angles; - angs_2 = &subsysp->submodel_instance_2->canonical_angs; + angs_2 = new angles; + vm_extract_angles_matrix_alternate(prev_angs_2, &subsysp->submodel_instance_2->canonical_prev_orient); + vm_extract_angles_matrix_alternate(angs_2, &subsysp->submodel_instance_2->canonical_orient); } if (flags[i] & OO_SUBSYS_ROTATION_1b) { @@ -1973,11 +1985,13 @@ int multi_oo_unpack_data(net_player* pl, ubyte* data, int seq_num) vm_angles_2_matrix(&subsysp->submodel_instance_1->canonical_prev_orient, prev_angs_1); vm_angles_2_matrix(&subsysp->submodel_instance_1->canonical_orient, angs_1); delete prev_angs_1; + delete angs_1; } if (flags[i] & OO_SUBSYS_ROTATION_2) { vm_angles_2_matrix(&subsysp->submodel_instance_2->canonical_prev_orient, prev_angs_2); vm_angles_2_matrix(&subsysp->submodel_instance_2->canonical_orient, angs_2); delete prev_angs_2; + delete angs_2; } subsysp = GET_NEXT(subsysp); diff --git a/code/scripting/api/objs/subsystem.cpp b/code/scripting/api/objs/subsystem.cpp index 8cd883df49..8763a8111d 100644 --- a/code/scripting/api/objs/subsystem.cpp +++ b/code/scripting/api/objs/subsystem.cpp @@ -119,7 +119,6 @@ ADE_VIRTVAR(Orientation, l_Subsystem, "orientation", "Orientation of subobject o { smi->canonical_prev_orient = smi->canonical_orient; smi->canonical_orient = *mh->GetMatrix(); - smi->canonical_angs = *mh->GetAngles(); } return ade_set_args(L, "o", l_Matrix.Set(matrix_h(&smi->canonical_orient))); @@ -143,7 +142,6 @@ ADE_VIRTVAR(GunOrientation, l_Subsystem, "orientation", "Orientation of turret g { smi->canonical_prev_orient = smi->canonical_orient; smi->canonical_orient = *mh->GetMatrix(); - smi->canonical_angs = *mh->GetAngles(); } return ade_set_args(L, "o", l_Matrix.Set(matrix_h(&smi->canonical_orient))); diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index 543753a047..d5841cc580 100644 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -19252,8 +19252,9 @@ void ship_render_weapon_models(model_render_params *ship_render_info, model_draw { if (pm->submodel[mn].gun_rotation) { - pmi->submodel[mn].canonical_angs.b = shipp->primary_rotate_ang[i]; - vm_angles_2_matrix(&pmi->submodel[mn].canonical_orient, &pmi->submodel[mn].canonical_angs); + angles angs = vmd_zero_angles; + angs.b = shipp->primary_rotate_ang[i]; + vm_angles_2_matrix(&pmi->submodel[mn].canonical_orient, &angs); } } }