From 2f537133e8b7be73e952ad59fc083e93fd8acdcc Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 30 Dec 2018 00:43:57 +0000 Subject: [PATCH] Use vcobjidx_t for fvi ignore_obj_list Enforce that callers provide vcobjidx_t, instead of permitting any type compatible with objnum_t. --- common/main/fvi.h | 4 ++-- similar/main/fvi.cpp | 6 +++--- similar/main/physics.cpp | 15 +++++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/common/main/fvi.h b/common/main/fvi.h index a16fa8b48..6ba29db7d 100644 --- a/common/main/fvi.h +++ b/common/main/fvi.h @@ -62,6 +62,7 @@ struct fvi_info : prohibit_void_ptr #define FQ_GET_SEGLIST 8 //build a list of segments #define FQ_IGNORE_POWERUPS 16 //ignore powerups +#ifdef dsx //this data contains the parms to fvi() struct fvi_query : prohibit_void_ptr { @@ -69,7 +70,7 @@ struct fvi_query : prohibit_void_ptr segnum_t startseg; objnum_t thisobjnum; fix rad; - std::pair ignore_obj_list; + std::pair ignore_obj_list; int flags; }; @@ -90,7 +91,6 @@ struct fvi_hitpoint //Returns the hit_data->hit_type int find_vector_intersection(const fvi_query &fq, fvi_info &hit_data); -#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II) //finds the uv coords of the given point on the given seg & side //fills in u & v. if l is non-NULL fills it in also namespace dsx { diff --git a/similar/main/fvi.cpp b/similar/main/fvi.cpp index c8d220c1f..3f849e6c1 100644 --- a/similar/main/fvi.cpp +++ b/similar/main/fvi.cpp @@ -607,7 +607,7 @@ struct fvi_segments_visited_t : public fvi_segment_visit_count_t, public visited } namespace dsx { -static int fvi_sub(vms_vector &intp, segnum_t &ints, const vms_vector &p0, const vcsegptridx_t startseg, const vms_vector &p1, fix rad, const icobjptridx_t thisobjnum, const std::pair ignore_obj_list, int flags, fvi_info::segment_array_t &seglist, segnum_t entry_seg, fvi_segments_visited_t &visited, unsigned &fvi_hit_side, icsegidx_t &fvi_hit_side_seg, unsigned &fvi_nest_count, icsegidx_t &fvi_hit_pt_seg, const vms_vector *&wall_norm, icobjidx_t &fvi_hit_object); +static int fvi_sub(vms_vector &intp, segnum_t &ints, const vms_vector &p0, const vcsegptridx_t startseg, const vms_vector &p1, fix rad, const icobjptridx_t thisobjnum, const std::pair ignore_obj_list, int flags, fvi_info::segment_array_t &seglist, segnum_t entry_seg, fvi_segments_visited_t &visited, unsigned &fvi_hit_side, icsegidx_t &fvi_hit_side_seg, unsigned &fvi_nest_count, icsegidx_t &fvi_hit_pt_seg, const vms_vector *&wall_norm, icobjidx_t &fvi_hit_object); //What the hell is fvi_hit_seg for??? @@ -762,7 +762,7 @@ int find_vector_intersection(const fvi_query &fq, fvi_info &hit_data) } __attribute_warn_unused_result -static bool obj_in_list(objnum_t objnum,const std::pair obj_list) +static bool obj_in_list(const vcobjidx_t objnum, const std::pair obj_list) { if (unlikely(!obj_list.first)) return false; @@ -783,7 +783,7 @@ static void append_segments(fvi_info::segment_array_t &dst, const fvi_info::segm } namespace dsx { -static int fvi_sub(vms_vector &intp, segnum_t &ints, const vms_vector &p0, const vcsegptridx_t startseg, const vms_vector &p1, fix rad, icobjptridx_t thisobjnum, const std::pair ignore_obj_list, int flags, fvi_info::segment_array_t &seglist, segnum_t entry_seg, fvi_segments_visited_t &visited, unsigned &fvi_hit_side, icsegidx_t &fvi_hit_side_seg, unsigned &fvi_nest_count, icsegidx_t &fvi_hit_pt_seg, const vms_vector *&wall_norm, icobjidx_t &fvi_hit_object) +static int fvi_sub(vms_vector &intp, segnum_t &ints, const vms_vector &p0, const vcsegptridx_t startseg, const vms_vector &p1, fix rad, icobjptridx_t thisobjnum, const std::pair ignore_obj_list, int flags, fvi_info::segment_array_t &seglist, segnum_t entry_seg, fvi_segments_visited_t &visited, unsigned &fvi_hit_side, icsegidx_t &fvi_hit_side_seg, unsigned &fvi_nest_count, icsegidx_t &fvi_hit_pt_seg, const vms_vector *&wall_norm, icobjidx_t &fvi_hit_object) { int startmask,endmask; //mask of faces //@@int sidemask; //mask of sides - can be on back of face but not side diff --git a/similar/main/physics.cpp b/similar/main/physics.cpp index 8b8d40e67..98aa64ce9 100644 --- a/similar/main/physics.cpp +++ b/similar/main/physics.cpp @@ -270,22 +270,25 @@ namespace { class ignore_objects_array_t { - typedef array array_t; - array_t a; + using array_t = array; array_t::iterator e; + union { + array_t a; + }; public: ignore_objects_array_t() : e(a.begin()) { } - bool push_back(objnum_t o) + bool push_back(const vcobjidx_t o) { - if (e == a.end()) + if (unlikely(e == a.end())) return false; - *e++ = o; + std::uninitialized_fill_n(e, 1, o); + ++e; return true; } - operator std::pair() const + operator std::pair() const { return {a.begin(), e}; }