Use vcobjidx_t for fvi ignore_obj_list

Enforce that callers provide vcobjidx_t, instead of permitting any type
compatible with objnum_t.
This commit is contained in:
Kp 2018-12-30 00:43:57 +00:00
parent aa9e6da297
commit 2f537133e8
3 changed files with 14 additions and 11 deletions

View file

@ -62,6 +62,7 @@ struct fvi_info : prohibit_void_ptr<fvi_info>
#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<fvi_query>
{
@ -69,7 +70,7 @@ struct fvi_query : prohibit_void_ptr<fvi_query>
segnum_t startseg;
objnum_t thisobjnum;
fix rad;
std::pair<const objnum_t *, const objnum_t *> ignore_obj_list;
std::pair<const vcobjidx_t *, const vcobjidx_t *> 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 {

View file

@ -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<const objnum_t *, const objnum_t *> 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<const vcobjidx_t *, const vcobjidx_t *> 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<const objnum_t *, const objnum_t *> obj_list)
static bool obj_in_list(const vcobjidx_t objnum, const std::pair<const vcobjidx_t *, const vcobjidx_t *> 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<const objnum_t *, const objnum_t *> 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<const vcobjidx_t *, const vcobjidx_t *> 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

View file

@ -270,22 +270,25 @@ namespace {
class ignore_objects_array_t
{
typedef array<objnum_t, MAX_IGNORE_OBJS> array_t;
array_t a;
using array_t = array<vcobjidx_t, MAX_IGNORE_OBJS>;
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 objnum_t *, const objnum_t *>() const
operator std::pair<const vcobjidx_t *, const vcobjidx_t *>() const
{
return {a.begin(), e};
}