Use sidenum_t in more places

This commit is contained in:
Kp 2022-02-19 14:52:17 +00:00
parent 91c9055c90
commit 68268e9a1f
17 changed files with 34 additions and 33 deletions

View file

@ -66,7 +66,7 @@ extern void digi_play_sample( int sndnum, fix max_volume );
extern void digi_play_sample_once( int sndnum, fix max_volume );
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
void digi_link_sound_to_object(unsigned soundnum, vcobjptridx_t objnum, uint8_t forever, fix max_volume, sound_stack once);
void digi_kill_sound_linked_to_segment(vmsegidx_t segnum, unsigned sidenum, int soundnum);
void digi_kill_sound_linked_to_segment(vmsegidx_t segnum, sidenum_t sidenum, int soundnum);
void digi_link_sound_to_pos(unsigned soundnum, vcsegptridx_t segnum, unsigned sidenum, const vms_vector &pos, int forever, fix max_volume);
// Same as above, but you pass the max distance sound can be heard. The old way uses f1_0*256 for max_distance.
void digi_link_sound_to_object2(unsigned soundnum, vcobjptridx_t objnum, uint8_t forever, fix max_volume, sound_stack once, vm_distance max_distance);

View file

@ -237,7 +237,7 @@ extern enumerated_array<game_marker_index, 2, gauge_inset_window_view> Marker_vi
#if DXX_USE_EDITOR
void dump_used_textures_all();
void move_player_2_segment(vmsegptridx_t seg, unsigned side);
void move_player_2_segment(vmsegptridx_t seg, sidenum_t side);
#endif
}

View file

@ -70,20 +70,12 @@ namespace dcx {
enum class materialization_center_number : uint8_t;
enum class station_number : uint8_t;
enum sidenum_t : uint8_t
{
WLEFT = 0,
WTOP = 1,
WRIGHT = 2,
WBOTTOM = 3,
WBACK = 4,
WFRONT = 5
};
enum sidenum_t : uint8_t;
[[nodiscard]]
std::optional<sidenum_t> build_sidenum_from_untrusted(uint8_t untrusted);
constexpr constant_xrange<sidenum_t, sidenum_t{0}, sidenum_t{6}> MAX_SIDES_PER_SEGMENT{};
constexpr std::integral_constant<sidenum_t, sidenum_t{MAX_SIDES_PER_SEGMENT.value}> side_none{};
constexpr std::integral_constant<sidenum_t, MAX_SIDES_PER_SEGMENT.value> side_none{};
using texture_index = uint16_t;
enum class texture1_value : uint16_t;
@ -148,8 +140,8 @@ struct d_level_shared_vertex_state;
struct d_level_shared_segment_state;
struct d_level_unique_segment_state;
extern const enumerated_array<enumerated_array<segment_relative_vertnum, 4, side_relative_vertnum>, MAX_SIDES_PER_SEGMENT, sidenum_t> Side_to_verts; // Side_to_verts[my_side] is list of vertices forming side my_side.
extern const enumerated_array<sidenum_t, MAX_SIDES_PER_SEGMENT, sidenum_t> Side_opposite; // Side_opposite[my_side] returns side opposite cube from my_side.
extern const enumerated_array<enumerated_array<segment_relative_vertnum, 4, side_relative_vertnum>, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value), sidenum_t> Side_to_verts; // Side_to_verts[my_side] is list of vertices forming side my_side.
extern const enumerated_array<sidenum_t, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value), sidenum_t> Side_opposite; // Side_opposite[my_side] returns side opposite cube from my_side.
void segment_side_wall_tmap_write(PHYSFS_File *fp, const shared_side &sside, const unique_side &uside);
}

View file

@ -61,8 +61,8 @@ using vertex_vertnum_array_list = std::array<vertex_vertnum_pair, 6>;
[[nodiscard]]
sidenum_t find_connect_side(vcsegidx_t base_seg, const shared_segment &con_seg);
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const shared_segment &sp, unsigned side);
static inline vms_vector compute_center_point_on_side(fvcvertptr &vcvertptr, const shared_segment &sp, const unsigned side)
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const shared_segment &sp, sidenum_t side);
static inline vms_vector compute_center_point_on_side(fvcvertptr &vcvertptr, const shared_segment &sp, const sidenum_t side)
{
vms_vector v;
return compute_center_point_on_side(vcvertptr, v, sp, side), v;

View file

@ -100,7 +100,7 @@ extern void newdemo_record_player_energy(int);
extern void newdemo_record_player_shields(int);
extern void newdemo_record_player_flags(unsigned);
extern void newdemo_record_player_weapon(int, int);
void newdemo_record_effect_blowup(segnum_t, int, const vms_vector &);
void newdemo_record_effect_blowup(segnum_t, sidenum_t, const vms_vector &);
extern void newdemo_record_homing_distance(fix);
extern void newdemo_record_letterbox(void);
extern void newdemo_record_rearview(void);

View file

@ -132,6 +132,16 @@ struct shared_side
std::array<vms_vector, 2> normals; // 2 normals, if quadrilateral, both the same.
};
enum sidenum_t : uint8_t
{
WLEFT = 0,
WTOP = 1,
WRIGHT = 2,
WBOTTOM = 3,
WBACK = 4,
WFRONT = 5
};
enum class sidemask_t : uint8_t
{
left = 1u << static_cast<uint8_t>(sidenum_t::WLEFT),
@ -257,7 +267,7 @@ struct shared_segment
segnum_t segnum; // segment number, not sure what it means
short group; // group number to which the segment belongs.
#endif
enumerated_array<segnum_t, MAX_SIDES_PER_SEGMENT, sidenum_t> children; // indices of 6 children segments, front, left, top, right, bottom, back
enumerated_array<segnum_t, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value), sidenum_t> children; // indices of 6 children segments, front, left, top, right, bottom, back
enumerated_array<vertnum_t, MAX_VERTICES_PER_SEGMENT, segment_relative_vertnum> verts; // vertex ids of 4 front and 4 back vertices
segment_special special; // what type of center this is
materialization_center_number matcen_num; // which center segment is associated with.
@ -265,7 +275,7 @@ struct shared_segment
/* if DXX_BUILD_DESCENT_II */
uint8_t s2_flags;
/* endif */
enumerated_array<shared_side, MAX_SIDES_PER_SEGMENT, sidenum_t> sides;
enumerated_array<shared_side, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value), sidenum_t> sides;
};
struct unique_segment
@ -277,7 +287,7 @@ struct unique_segment
sidemask_t slide_textures;
/* endif */
fix static_light;
enumerated_array<unique_side, MAX_SIDES_PER_SEGMENT, sidenum_t> sides;
enumerated_array<unique_side, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value), sidenum_t> sides;
};
struct segment : unique_segment, shared_segment

View file

@ -371,7 +371,7 @@ static inline vms_matrix med_create_group_rotation_matrix(const unsigned delta_f
// -----------------------------------------------------------------------------------------
// Rotate all vertices and objects in group.
static void med_rotate_group(const vms_matrix &rotmat, group::segment_array_type_t &group_seglist, const shared_segment &first_seg, const unsigned first_side)
static void med_rotate_group(const vms_matrix &rotmat, group::segment_array_type_t &group_seglist, const shared_segment &first_seg, const sidenum_t first_side)
{
auto &LevelSharedVertexState = LevelSharedSegmentState.get_vertex_state();
auto &Objects = LevelUniqueObjectState.Objects;

View file

@ -531,8 +531,7 @@ int fuelcen_delete_from_curseg() {
//determine how from from the center of the window the farthest point will be
#define SIDE_VIEW_FRAC (f1_0*8/10) //80%
static void move_player_2_segment_and_rotate(const vmsegptridx_t seg, const unsigned side)
static void move_player_2_segment_and_rotate(const vmsegptridx_t seg, const sidenum_t side)
{
auto &Objects = LevelUniqueObjectState.Objects;
auto &vmobjptr = Objects.vmptr;

View file

@ -314,7 +314,7 @@ std::pair<create_path_result, unsigned> create_path_points(const vmobjptridx_t o
auto &Walls = LevelUniqueWallSubsystemState.Walls;
auto &vcwallptr = Walls.vcptr;
std::array<sidenum_t, MAX_SIDES_PER_SEGMENT> side_traversal_translation;
std::array<sidenum_t, static_cast<std::size_t>(MAX_SIDES_PER_SEGMENT.value)> side_traversal_translation;
std::iota(side_traversal_translation.begin(), side_traversal_translation.end(), sidenum_t{});
#if defined(DXX_BUILD_DESCENT_I)
/* Descent 1 can only shuffle once, before the loop begins.

View file

@ -563,7 +563,7 @@ v1_control_center_triggers::v1_control_center_triggers(const control_center_trig
num_links(cct.num_links), seg(cct.seg)
{
for (auto &&[w, r] : zip(side, cct.side))
w = r;
w = underlying_value(r);
}
/*

View file

@ -796,7 +796,7 @@ static window_event_result collide_weapon_and_wall(
if (keyd_pressed[KEY_LAPOSTRO])
if (weapon->ctype.laser_info.parent_num == get_local_player().objnum) {
// MK: Real pain when you need to know a seg:side and you've got quad lasers.
HUD_init_message(HM_DEFAULT, "Hit at segment = %hu, side = %i", static_cast<vmsegptridx_t::integral_type>(hitseg), hitwall);
HUD_init_message(HM_DEFAULT, "Hit at segment = %hu, side = %i", static_cast<vmsegptridx_t::integral_type>(hitseg), underlying_value(hitwall));
#if defined(DXX_BUILD_DESCENT_II)
if (get_weapon_id(weapon) < 4)
subtract_light(LevelSharedDestructibleLightState, hitseg, hitwall);

View file

@ -498,7 +498,7 @@ void digi_link_sound_to_pos(const unsigned soundnum, const vcsegptridx_t segnum,
}
//if soundnum==-1, kill any sound
void digi_kill_sound_linked_to_segment(const vmsegidx_t segnum, const unsigned sidenum, int soundnum)
void digi_kill_sound_linked_to_segment(const vmsegidx_t segnum, const sidenum_t sidenum, int soundnum)
{
if (soundnum != -1)
soundnum = digi_xlat_sound(soundnum);

View file

@ -100,7 +100,7 @@ void do_special_effects()
ec.flags &= ~EF_ONE_SHOT;
unique_segment &seg = *vmsegptr(ec.segnum);
ec.segnum = segment_none; //done with this
assert(ec.sidenum < 6);
assert(seg.sides.valid_index(ec.sidenum));
auto &side = seg.sides[ec.sidenum];
assert(ec.dest_bm_num != 0 && side.tmap_num2 != texture2_value::None);
side.tmap_num2 = build_texture2_value(ec.dest_bm_num, get_texture_rotation_high(side.tmap_num2)); //replace with destroyed

View file

@ -301,7 +301,7 @@ static sidenum_t find_exit_side(const d_level_shared_segment_state &LevelSharedS
if (child != segment_none)
{
auto sidevec = compute_center_point_on_side(vcvertptr, pseg, static_cast<sidenum_t>(i));
auto sidevec = compute_center_point_on_side(vcvertptr, pseg, i);
vm_vec_normalized_dir_quick(sidevec,sidevec,segcenter);
d = vm_vec_dot(sidevec,prefvec);

View file

@ -647,7 +647,7 @@ void calc_frame_time()
namespace dsx {
#if DXX_USE_EDITOR
void move_player_2_segment(const vmsegptridx_t seg, const unsigned side)
void move_player_2_segment(const vmsegptridx_t seg, const sidenum_t side)
{
auto &LevelSharedVertexState = LevelSharedSegmentState.get_vertex_state();
auto &Objects = LevelUniqueObjectState.Objects;

View file

@ -152,9 +152,9 @@ static void get_side_verts(side_vertnum_list_t &vertlist, const enumerated_array
// ------------------------------------------------------------------------------------------
// Compute the center point of a side of a segment.
// The center point is defined to be the average of the 4 points defining the side.
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const shared_segment &sp, const unsigned side)
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const shared_segment &sp, const sidenum_t side)
{
compute_center_point_on_side(vcvertptr, vp, sp.verts, static_cast<sidenum_t>(side));
compute_center_point_on_side(vcvertptr, vp, sp.verts, side);
}
// ------------------------------------------------------------------------------------------

View file

@ -1426,7 +1426,7 @@ void newdemo_record_player_weapon(int weapon_type, int weapon_num)
);
}
void newdemo_record_effect_blowup(segnum_t segment, int side, const vms_vector &pnt)
void newdemo_record_effect_blowup(segnum_t segment, sidenum_t side, const vms_vector &pnt)
{
pause_game_world_time p;
nd_write_byte (ND_EVENT_EFFECT_BLOWUP);