Return vertex_array_list_t from create_abs_vertex_lists

This commit is contained in:
Kp 2014-12-14 05:23:00 +00:00
parent 601290e674
commit 1960a2ebad
4 changed files with 41 additions and 44 deletions

View file

@ -98,7 +98,14 @@ static inline std::pair<uint_fast32_t, vertex_array_list_t> create_all_vertex_li
#endif
//like create_all_vertex_lists(), but generate absolute point numbers
void create_abs_vertex_lists(int *num_faces, vertex_array_list_t &vertices, vcsegptr_t segnum, int sidenum);
uint_fast32_t create_abs_vertex_lists(vertex_array_list_t &vertices, vcsegptr_t segnum, int sidenum);
__attribute_warn_unused_result
static inline std::pair<uint_fast32_t, vertex_array_list_t> create_abs_vertex_lists(vcsegptr_t segnum, int sidenum)
{
vertex_array_list_t r;
auto n = create_abs_vertex_lists(r, segnum, sidenum);
return {n, r};
}
// -----------------------------------------------------------------------------------
// Like create all vertex lists, but returns the vertnums (relative to

View file

@ -238,14 +238,14 @@ static int check_line_to_face(vms_vector &newp,const vms_vector &p0,const vms_ve
{
int pli;
const struct side *s=&seg->sides[side];
vertex_array_list_t vertex_list;
int num_faces;
int vertnum;
vms_vector norm;
norm = seg->sides[side].normals[facenum];
create_abs_vertex_lists(&num_faces, vertex_list, seg, side);
const auto v = create_abs_vertex_lists(seg, side);
const auto &num_faces = v.first;
const auto &vertex_list = v.second;
//use lowest point number
if (num_faces==2) {
@ -314,14 +314,14 @@ static int special_check_line_to_face(vms_vector &newp,const vms_vector &p0,cons
{
fix edge_t=0,move_t=0,edge_t2=0,move_t2=0,closest_dist=0;
fix edge_len=0,move_len=0;
vertex_array_list_t vertex_list;
int num_faces,edgenum;
int edgenum;
uint edgemask;
const struct side *s=&seg->sides[side];
//calc some basic stuff
create_abs_vertex_lists(&num_faces, vertex_list, seg, side);
const auto v = create_abs_vertex_lists(seg, side);
const auto &vertex_list = v.second;
auto move_vec = vm_vec_sub(p1,p0);
//figure out which edge(s) to check against
@ -1094,7 +1094,7 @@ void find_hitpoint_uv(fix *u,fix *v,const vms_vector &pnt,const vcsegptridx_t se
{
int num_faces;
const side *side = &seg->sides[sidenum];
vertex_array_list_t vertex_list, vertnum_list;
vertex_array_list_t vertnum_list;
uvl uvls[3];
fix k0,k1;
int i;
@ -1109,7 +1109,8 @@ void find_hitpoint_uv(fix *u,fix *v,const vms_vector &pnt,const vcsegptridx_t se
return;
}
create_abs_vertex_lists(&num_faces, vertex_list, seg, sidenum);
const auto vx = create_abs_vertex_lists(seg, sidenum);
const auto &vertex_list = vx.second;
create_all_vertnum_lists(&num_faces,vertnum_list,seg,sidenum);
//now the hard work.
@ -1218,12 +1219,11 @@ static int sphere_intersects_wall(const vms_vector &pnt,const vcsegptridx_t segn
if (facemask & bit) { //on the back of this face
int face_hit_type; //in what way did we hit the face?
int num_faces;
vertex_array_list_t vertex_list;
//did we go through this wall/door?
create_abs_vertex_lists(&num_faces, vertex_list, seg, side);
const auto v = create_abs_vertex_lists(seg, side);
const auto &num_faces = v.first;
const auto &vertex_list = v.second;
face_hit_type = check_sphere_to_face( pnt,&seg->sides[side],
face,((num_faces==1)?4:3),rad,vertex_list);

View file

@ -239,53 +239,43 @@ void create_all_vertnum_lists(int *num_faces, vertex_array_list_t &vertnums, con
// -----
// like create_all_vertex_lists(), but generate absolute point numbers
void create_abs_vertex_lists(int *num_faces, vertex_array_list_t &vertices, const vcsegptr_t segp, int sidenum)
uint_fast32_t create_abs_vertex_lists(vertex_array_list_t &vertices, const vcsegptr_t segp, int sidenum)
{
auto &vp = segp->verts;
auto sidep = &segp->sides[sidenum];
const int *sv = Side_to_verts_int[sidenum];
switch (sidep->get_type()) {
case SIDE_IS_QUAD:
vertices[0] = vp[sv[0]];
vertices[1] = vp[sv[1]];
vertices[2] = vp[sv[2]];
vertices[3] = vp[sv[3]];
*num_faces = 1;
break;
return 1;
case SIDE_IS_TRI_02:
*num_faces = 2;
vertices[0] = vp[sv[0]];
vertices[1] = vp[sv[1]];
vertices[2] = vp[sv[2]];
vertices[3] = vp[sv[2]];
vertices[4] = vp[sv[3]];
vertices[5] = vp[sv[0]];
//IMPORTANT: DON'T CHANGE THIS CODE WITHOUT CHANGING GET_SEG_MASKS(),
//CREATE_ABS_VERTEX_LISTS(), CREATE_ALL_VERTEX_LISTS(), CREATE_ALL_VERTNUM_LISTS()
break;
return 2;
case SIDE_IS_TRI_13:
*num_faces = 2;
vertices[0] = vp[sv[3]];
vertices[1] = vp[sv[0]];
vertices[2] = vp[sv[1]];
vertices[3] = vp[sv[1]];
vertices[4] = vp[sv[2]];
vertices[5] = vp[sv[3]];
//IMPORTANT: DON'T CHANGE THIS CODE WITHOUT CHANGING GET_SEG_MASKS()
//CREATE_ABS_VERTEX_LISTS(), CREATE_ALL_VERTEX_LISTS(), CREATE_ALL_VERTNUM_LISTS()
break;
return 2;
default:
throw side::illegal_type(segp, sidep);
}
}
@ -295,8 +285,6 @@ segmasks get_seg_masks(const vms_vector &checkp, const vcsegptridx_t segnum, fix
{
int sn,facebit,sidebit;
segmasks masks;
int num_faces;
vertex_array_list_t vertex_list;
if (segnum < 0 || segnum > Highest_segment_index)
Error("segnum == %hu (%i) in get_seg_masks() \ncheckp: %i, %i, %i, rad: %i \nfrom file: %s, line: %i \nMission: %s (%i) \nPlease report this bug.\n", static_cast<vcsegptridx_t::integral_type>(segnum), Highest_segment_index, checkp.x, checkp.y, checkp.z, rad, calling_file, calling_linenum, Current_mission_filename, Current_level_num);
@ -317,7 +305,9 @@ segmasks get_seg_masks(const vms_vector &checkp, const vcsegptridx_t segnum, fix
// Get number of faces on this side, and at vertex_list, store vertices.
// If one face, then vertex_list indicates a quadrilateral.
// If two faces, then 0,1,2 define one triangle, 3,4,5 define the second.
create_abs_vertex_lists(&num_faces, vertex_list, segnum, sn);
const auto v = create_abs_vertex_lists(segnum, sn);
const auto &num_faces = v.first;
const auto &vertex_list = v.second;
//ok...this is important. If a side has 2 faces, we need to know if
//those faces form a concave or convex side. If the side pokes out,
@ -407,8 +397,6 @@ static ubyte get_side_dists(const vms_vector &checkp,const vsegptridx_t segnum,f
{
int sn,facebit,sidebit;
ubyte mask;
int num_faces;
vertex_array_list_t vertex_list;
auto &seg = segnum;
//check point against each side of segment. return bitmask
@ -423,7 +411,9 @@ static ubyte get_side_dists(const vms_vector &checkp,const vsegptridx_t segnum,f
// Get number of faces on this side, and at vertex_list, store vertices.
// If one face, then vertex_list indicates a quadrilateral.
// If two faces, then 0,1,2 define one triangle, 3,4,5 define the second.
create_abs_vertex_lists(&num_faces, vertex_list, segnum, sn);
const auto v = create_abs_vertex_lists(segnum, sn);
const auto &num_faces = v.first;
const auto &vertex_list = v.second;
//ok...this is important. If a side has 2 faces, we need to know if
//those faces form a concave or convex side. If the side pokes out,
@ -523,9 +513,9 @@ int check_segment_connections(void)
{
auto seg = vcsegptridx(segnum);
for (int sidenum=0;sidenum<6;sidenum++) {
int num_faces,con_num_faces;
vertex_array_list_t vertex_list, con_vertex_list;
create_abs_vertex_lists(&num_faces, vertex_list, seg, sidenum);
const auto v = create_abs_vertex_lists(seg, sidenum);
const auto &num_faces = v.first;
const auto &vertex_list = v.second;
auto csegnum = seg->children[sidenum];
if (IS_CHILD(csegnum)) {
auto cseg = vcsegptr(csegnum);
@ -536,7 +526,9 @@ int check_segment_connections(void)
continue;
}
create_abs_vertex_lists(&con_num_faces, con_vertex_list, cseg, csidenum);
const auto cv = create_abs_vertex_lists(cseg, csidenum);
const auto &con_num_faces = cv.first;
const auto &con_vertex_list = cv.second;
if (con_num_faces != num_faces) {
errors = 1;
@ -1433,16 +1425,15 @@ void create_walls_on_side(const vsegptridx_t sp, int sidenum)
//de-triangulates if we shouldn't be.
{
int num_faces;
vertex_array_list_t vertex_list;
fix dist0,dist1;
int s0,s1;
int vertnum;
side *s;
create_abs_vertex_lists(&num_faces, vertex_list, sp, sidenum);
const auto v = create_abs_vertex_lists(sp, sidenum);
const auto &vertex_list = v.second;
Assert(num_faces == 2);
Assert(v.first == 2);
s = &sp->sides[sidenum];

View file

@ -729,15 +729,14 @@ void do_physics_sim(const vobjptridx_t obj)
if (sidenum != -1) {
if (! (WALL_IS_DOORWAY(orig_segp,sidenum) & WID_FLY_FLAG)) {
int num_faces;
fix dist;
vertex_array_list_t vertex_list;
//bump object back
auto s = &orig_segp->sides[sidenum];
create_abs_vertex_lists(&num_faces, vertex_list, orig_segp, sidenum);
const auto v = create_abs_vertex_lists(orig_segp, sidenum);
const auto &vertex_list = v.second;
//let's pretend this wall is not triangulated
auto b = begin(vertex_list);