Inline effect of object_rw_swap into multi_object_rw_to_object

Change from rewriting the object in place to byte-swap it, then copying
the byte-swapped values into the long term object to instead copy the
values into the object and perform byte-swapping as needed during the
copy.
This commit is contained in:
Kp 2022-10-23 23:00:24 +00:00
parent 23e75f3a45
commit 04af38638c
2 changed files with 80 additions and 63 deletions

View File

@ -146,6 +146,33 @@ static const char *prepare_kill_name(fvcplayerptr &vcplayerptr, const game_mode_
return callsign;
}
constexpr vms_angvec build_native_endian_angvec_from_little_endian(const vms_angvec &v)
{
return vms_angvec{
.p = INTEL_SHORT(v.p),
.b = INTEL_SHORT(v.b),
.h = INTEL_SHORT(v.h),
};
}
constexpr vms_vector build_native_endian_vector_from_little_endian(const vms_vector &v)
{
return vms_vector{
.x = INTEL_INT(v.x),
.y = INTEL_INT(v.y),
.z = INTEL_INT(v.z),
};
}
constexpr vms_matrix build_native_endian_matrix_from_little_endian(const vms_matrix &v)
{
return vms_matrix{
.rvec = build_native_endian_vector_from_little_endian(v.rvec),
.uvec = build_native_endian_vector_from_little_endian(v.uvec),
.fvec = build_native_endian_vector_from_little_endian(v.fvec),
};
}
}
DEFINE_SERIAL_UDT_TO_MESSAGE(shortpos, s, (s.bytemat, s.xo, s.yo, s.zo, s.segment, s.velx, s.vely, s.velz));
@ -6040,7 +6067,7 @@ void multi_object_rw_to_object(const object_rw *const obj_rw, object &obj)
set_object_type(obj, obj_rw->type);
if (obj.type == OBJ_NONE)
return;
obj.signature = object_signature_t{static_cast<uint16_t>(obj_rw->signature)};
obj.signature = object_signature_t{static_cast<uint16_t>(INTEL_INT(obj_rw->signature))};
obj.id = obj_rw->id;
/* obj->next,obj->prev handled by caller based on segment */
obj.control_source = typename object::control_type{obj_rw->control_source};
@ -6055,75 +6082,65 @@ void multi_object_rw_to_object(const object_rw *const obj_rw, object &obj)
}
obj.flags = obj_rw->flags;
{
const auto s = segnum_t{obj_rw->segnum};
const auto s = segnum_t{INTEL_SHORT(obj_rw->segnum)};
obj.segnum = vmsegidx_t::check_nothrow_index(s) ? s : segment_none;
}
/* obj->attached_obj cleared by caller */
obj.pos = obj_rw->pos;
obj.orient = obj_rw->orient;
obj.size = obj_rw->size;
obj.shields = obj_rw->shields;
obj.attached_obj = object_none;
obj.pos = build_native_endian_vector_from_little_endian(obj_rw->pos);
obj.orient = build_native_endian_matrix_from_little_endian(obj_rw->orient);
obj.size = INTEL_INT(obj_rw->size);
obj.shields = INTEL_INT(obj_rw->shields);
obj.contains_type = obj_rw->contains_type;
obj.contains_id = obj_rw->contains_id;
obj.contains_count= obj_rw->contains_count;
obj.matcen_creator= obj_rw->matcen_creator;
obj.lifeleft = obj_rw->lifeleft;
obj.lifeleft = INTEL_INT(obj_rw->lifeleft);
switch (obj.movement_source)
{
case object::movement_type::None:
break;
case object::movement_type::physics:
obj.mtype.phys_info.velocity.x = obj_rw->mtype.phys_info.velocity.x;
obj.mtype.phys_info.velocity.y = obj_rw->mtype.phys_info.velocity.y;
obj.mtype.phys_info.velocity.z = obj_rw->mtype.phys_info.velocity.z;
obj.mtype.phys_info.thrust.x = obj_rw->mtype.phys_info.thrust.x;
obj.mtype.phys_info.thrust.y = obj_rw->mtype.phys_info.thrust.y;
obj.mtype.phys_info.thrust.z = obj_rw->mtype.phys_info.thrust.z;
obj.mtype.phys_info.mass = obj_rw->mtype.phys_info.mass;
obj.mtype.phys_info.drag = obj_rw->mtype.phys_info.drag;
obj.mtype.phys_info.rotvel.x = obj_rw->mtype.phys_info.rotvel.x;
obj.mtype.phys_info.rotvel.y = obj_rw->mtype.phys_info.rotvel.y;
obj.mtype.phys_info.rotvel.z = obj_rw->mtype.phys_info.rotvel.z;
obj.mtype.phys_info.rotthrust.x = obj_rw->mtype.phys_info.rotthrust.x;
obj.mtype.phys_info.rotthrust.y = obj_rw->mtype.phys_info.rotthrust.y;
obj.mtype.phys_info.rotthrust.z = obj_rw->mtype.phys_info.rotthrust.z;
obj.mtype.phys_info.turnroll = obj_rw->mtype.phys_info.turnroll;
obj.mtype.phys_info.flags = obj_rw->mtype.phys_info.flags;
obj.mtype.phys_info.velocity = build_native_endian_vector_from_little_endian(obj_rw->mtype.phys_info.velocity);
obj.mtype.phys_info.thrust = build_native_endian_vector_from_little_endian(obj_rw->mtype.phys_info.thrust);
obj.mtype.phys_info.mass = INTEL_INT(obj_rw->mtype.phys_info.mass);
obj.mtype.phys_info.drag = INTEL_INT(obj_rw->mtype.phys_info.drag);
obj.mtype.phys_info.rotvel = build_native_endian_vector_from_little_endian(obj_rw->mtype.phys_info.rotvel);
obj.mtype.phys_info.rotthrust = build_native_endian_vector_from_little_endian(obj_rw->mtype.phys_info.rotthrust);
obj.mtype.phys_info.turnroll = INTEL_INT(obj_rw->mtype.phys_info.turnroll);
obj.mtype.phys_info.flags = INTEL_INT(obj_rw->mtype.phys_info.flags);
break;
case object::movement_type::spinning:
obj.mtype.spin_rate.x = obj_rw->mtype.spin_rate.x;
obj.mtype.spin_rate.y = obj_rw->mtype.spin_rate.y;
obj.mtype.spin_rate.z = obj_rw->mtype.spin_rate.z;
obj.mtype.spin_rate = build_native_endian_vector_from_little_endian(obj_rw->mtype.spin_rate);
break;
}
switch (obj.control_source)
{
case object::control_type::weapon:
obj.ctype.laser_info.parent_type = obj_rw->ctype.laser_info.parent_type;
obj.ctype.laser_info.parent_num = obj_rw->ctype.laser_info.parent_num;
obj.ctype.laser_info.parent_signature = object_signature_t{static_cast<uint16_t>(obj_rw->ctype.laser_info.parent_signature)};
obj.ctype.laser_info.creation_time = obj_rw->ctype.laser_info.creation_time;
obj.ctype.laser_info.parent_type = INTEL_SHORT(obj_rw->ctype.laser_info.parent_type);
obj.ctype.laser_info.parent_num = INTEL_SHORT(obj_rw->ctype.laser_info.parent_num);
obj.ctype.laser_info.parent_signature = object_signature_t{static_cast<uint16_t>(INTEL_INT(obj_rw->ctype.laser_info.parent_signature))};
obj.ctype.laser_info.creation_time = INTEL_INT(obj_rw->ctype.laser_info.creation_time);
{
const auto last_hitobj = obj_rw->ctype.laser_info.last_hitobj;
const auto last_hitobj = INTEL_SHORT(obj_rw->ctype.laser_info.last_hitobj);
obj.ctype.laser_info.reset_hitobj(last_hitobj);
}
obj.ctype.laser_info.track_goal = obj_rw->ctype.laser_info.track_goal;
obj.ctype.laser_info.multiplier = obj_rw->ctype.laser_info.multiplier;
obj.ctype.laser_info.track_goal = INTEL_SHORT(obj_rw->ctype.laser_info.track_goal);
obj.ctype.laser_info.multiplier = INTEL_INT(obj_rw->ctype.laser_info.multiplier);
#if defined(DXX_BUILD_DESCENT_II)
obj.ctype.laser_info.last_afterburner_time = 0;
#endif
break;
case object::control_type::explosion:
obj.ctype.expl_info.spawn_time = obj_rw->ctype.expl_info.spawn_time;
obj.ctype.expl_info.delete_time = obj_rw->ctype.expl_info.delete_time;
obj.ctype.expl_info.delete_objnum = obj_rw->ctype.expl_info.delete_objnum;
obj.ctype.expl_info.attach_parent = obj_rw->ctype.expl_info.attach_parent;
obj.ctype.expl_info.prev_attach = obj_rw->ctype.expl_info.prev_attach;
obj.ctype.expl_info.next_attach = obj_rw->ctype.expl_info.next_attach;
obj.ctype.expl_info.spawn_time = INTEL_INT(obj_rw->ctype.expl_info.spawn_time);
obj.ctype.expl_info.delete_time = INTEL_INT(obj_rw->ctype.expl_info.delete_time);
obj.ctype.expl_info.delete_objnum = INTEL_SHORT(obj_rw->ctype.expl_info.delete_objnum);
obj.ctype.expl_info.attach_parent = INTEL_SHORT(obj_rw->ctype.expl_info.attach_parent);
obj.ctype.expl_info.prev_attach = INTEL_SHORT(obj_rw->ctype.expl_info.prev_attach);
obj.ctype.expl_info.next_attach = INTEL_SHORT(obj_rw->ctype.expl_info.next_attach);
break;
case object::control_type::ai:
@ -6147,35 +6164,40 @@ void multi_object_rw_to_object(const object_rw *const obj_rw, object &obj)
obj.ctype.ai_info.REMOTE_OWNER = obj_rw->ctype.ai_info.flags[8];
obj.ctype.ai_info.REMOTE_SLOT_NUM = obj_rw->ctype.ai_info.flags[9];
{
const auto s = segnum_t{obj_rw->ctype.ai_info.hide_segment};
const auto s = segnum_t{INTEL_SHORT(obj_rw->ctype.ai_info.hide_segment)};
obj.ctype.ai_info.hide_segment = vmsegidx_t::check_nothrow_index(s) ? s : segment_none;
}
obj.ctype.ai_info.hide_index = obj_rw->ctype.ai_info.hide_index;
obj.ctype.ai_info.path_length = obj_rw->ctype.ai_info.path_length;
obj.ctype.ai_info.cur_path_index = obj_rw->ctype.ai_info.cur_path_index;
obj.ctype.ai_info.danger_laser_num = obj_rw->ctype.ai_info.danger_laser_num;
obj.ctype.ai_info.hide_index = INTEL_SHORT(obj_rw->ctype.ai_info.hide_index);
obj.ctype.ai_info.path_length = INTEL_SHORT(obj_rw->ctype.ai_info.path_length);
obj.ctype.ai_info.cur_path_index =
#if defined(DXX_BUILD_DESCENT_I)
INTEL_SHORT(obj_rw->ctype.ai_info.cur_path_index);
#elif defined(DXX_BUILD_DESCENT_II)
obj_rw->ctype.ai_info.cur_path_index;
#endif
obj.ctype.ai_info.danger_laser_num = INTEL_SHORT(obj_rw->ctype.ai_info.danger_laser_num);
if (obj.ctype.ai_info.danger_laser_num != object_none)
obj.ctype.ai_info.danger_laser_signature = object_signature_t{static_cast<uint16_t>(obj_rw->ctype.ai_info.danger_laser_signature)};
obj.ctype.ai_info.danger_laser_signature = object_signature_t{static_cast<uint16_t>(INTEL_INT(obj_rw->ctype.ai_info.danger_laser_signature))};
#if defined(DXX_BUILD_DESCENT_I)
#elif defined(DXX_BUILD_DESCENT_II)
obj.ctype.ai_info.dying_sound_playing = obj_rw->ctype.ai_info.dying_sound_playing;
obj.ctype.ai_info.dying_start_time = obj_rw->ctype.ai_info.dying_start_time;
obj.ctype.ai_info.dying_start_time = INTEL_INT(obj_rw->ctype.ai_info.dying_start_time);
#endif
break;
}
case object::control_type::light:
obj.ctype.light_info.intensity = obj_rw->ctype.light_info.intensity;
obj.ctype.light_info.intensity = INTEL_INT(obj_rw->ctype.light_info.intensity);
break;
case object::control_type::powerup:
obj.ctype.powerup_info.count = obj_rw->ctype.powerup_info.count;
obj.ctype.powerup_info.count = INTEL_INT(obj_rw->ctype.powerup_info.count);
#if defined(DXX_BUILD_DESCENT_I)
obj.ctype.powerup_info.creation_time = 0;
obj.ctype.powerup_info.flags = 0;
#elif defined(DXX_BUILD_DESCENT_II)
obj.ctype.powerup_info.creation_time = obj_rw->ctype.powerup_info.creation_time;
obj.ctype.powerup_info.flags = obj_rw->ctype.powerup_info.flags;
obj.ctype.powerup_info.creation_time = INTEL_INT(obj_rw->ctype.powerup_info.creation_time);
obj.ctype.powerup_info.flags = INTEL_INT(obj_rw->ctype.powerup_info.flags);
#endif
break;
case object::control_type::cntrlcen:
@ -6205,16 +6227,14 @@ void multi_object_rw_to_object(const object_rw *const obj_rw, object &obj)
int i;
if (obj.render_type == RT_NONE && obj.type != OBJ_GHOST) // HACK: when a player is dead or not connected yet, clients still expect to get polyobj data - even if render_type == RT_NONE at this time.
break;
obj.rtype.pobj_info.model_num = obj_rw->rtype.pobj_info.model_num;
obj.rtype.pobj_info.model_num = INTEL_INT(obj_rw->rtype.pobj_info.model_num);
for (i=0;i<MAX_SUBMODELS;i++)
{
obj.rtype.pobj_info.anim_angles[i].p = obj_rw->rtype.pobj_info.anim_angles[i].p;
obj.rtype.pobj_info.anim_angles[i].b = obj_rw->rtype.pobj_info.anim_angles[i].b;
obj.rtype.pobj_info.anim_angles[i].h = obj_rw->rtype.pobj_info.anim_angles[i].h;
obj.rtype.pobj_info.anim_angles[i] = build_native_endian_angvec_from_little_endian(obj_rw->rtype.pobj_info.anim_angles[i]);
}
obj.rtype.pobj_info.subobj_flags = obj_rw->rtype.pobj_info.subobj_flags;
obj.rtype.pobj_info.tmap_override = obj_rw->rtype.pobj_info.tmap_override;
obj.rtype.pobj_info.alt_textures = obj_rw->rtype.pobj_info.alt_textures;
obj.rtype.pobj_info.subobj_flags = INTEL_INT(obj_rw->rtype.pobj_info.subobj_flags);
obj.rtype.pobj_info.tmap_override = INTEL_INT(obj_rw->rtype.pobj_info.tmap_override);
obj.rtype.pobj_info.alt_textures = INTEL_INT(obj_rw->rtype.pobj_info.alt_textures);
break;
}
@ -6222,8 +6242,8 @@ void multi_object_rw_to_object(const object_rw *const obj_rw, object &obj)
case RT_HOSTAGE:
case RT_POWERUP:
case RT_FIREBALL:
obj.rtype.vclip_info.vclip_num = obj_rw->rtype.vclip_info.vclip_num;
obj.rtype.vclip_info.frametime = obj_rw->rtype.vclip_info.frametime;
obj.rtype.vclip_info.vclip_num = INTEL_INT(obj_rw->rtype.vclip_info.vclip_num);
obj.rtype.vclip_info.frametime = INTEL_INT(obj_rw->rtype.vclip_info.frametime);
obj.rtype.vclip_info.framenum = obj_rw->rtype.vclip_info.framenum;
break;

View File

@ -2516,12 +2516,9 @@ static void net_udp_read_object_packet(uint8_t *const data)
Assert(obj->segnum == segment_none);
}
Assert(objnum < MAX_OBJECTS);
if constexpr (words_bigendian)
object_rw_swap(reinterpret_cast<object_rw *>(&data[loc]), 1);
multi_object_rw_to_object(reinterpret_cast<const object_rw *>(&data[loc]), obj);
loc += sizeof(object_rw);
auto segnum = obj->segnum;
obj->attached_obj = object_none;
if (segnum != segment_none)
{
obj_link_unchecked(Objects.vmptr, obj, Segments.vmptridx(segnum));