diff --git a/common/main/fwdsegment.h b/common/main/fwdsegment.h index fc85f77d6..127814c08 100644 --- a/common/main/fwdsegment.h +++ b/common/main/fwdsegment.h @@ -93,9 +93,9 @@ extern unsigned Num_vertices; const std::size_t MAX_EDGES = MAX_VERTICES * 4; -extern const sbyte Side_to_verts[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side. -extern const int Side_to_verts_int[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side. -extern const char Side_opposite[MAX_SIDES_PER_SEGMENT]; // Side_opposite[my_side] returns side opposite cube from my_side. +extern const array, MAX_SIDES_PER_SEGMENT> Side_to_verts; // Side_to_verts[my_side] is list of vertices forming side my_side. +extern const array, MAX_SIDES_PER_SEGMENT> Side_to_verts_int; // Side_to_verts[my_side] is list of vertices forming side my_side. +extern const array Side_opposite; // Side_opposite[my_side] returns side opposite cube from my_side. #if defined(DXX_BUILD_DESCENT_II) struct delta_light; diff --git a/similar/editor/segment.cpp b/similar/editor/segment.cpp index 3d189b4de..c09639c26 100644 --- a/similar/editor/segment.cpp +++ b/similar/editor/segment.cpp @@ -789,7 +789,6 @@ static void copy_tmap_ids(const vsegptr_t dseg, const vsegptr_t sseg) // 4 = already a face attached on destseg:destside static int med_attach_segment_rotated(const vsegptridx_t destseg, const vsegptr_t newseg, int destside, int newside,const vms_matrix &attmat) { - const sbyte *dvp; int side,v; vms_matrix rotmat,rotmat2,rotmat3; segnum_t segnum; @@ -833,7 +832,7 @@ static int med_attach_segment_rotated(const vsegptridx_t destseg, const vsegptr_ nsp->children[newside] = destseg; // Copy vertex indices of the four vertices forming the joint - dvp = Side_to_verts[destside]; + auto &dvp = Side_to_verts[destside]; // Set the vertex indices for the four vertices forming the front of the new side for (v=0; v<4; v++) @@ -1234,7 +1233,6 @@ next_side: ; // 2 unable to form joint because side1 is already used int med_form_joint(const vsegptridx_t seg1, int side1, const vsegptridx_t seg2, int side2) { - const sbyte *vp1,*vp2; int bfi,v,s1; int lost_vertices[4],remap_vertices[4]; int validation_list[MAX_VALIDATIONS]; @@ -1251,8 +1249,8 @@ int med_form_joint(const vsegptridx_t seg1, int side1, const vsegptridx_t seg2, // We can form the joint. Find the best orientation of vertices. bfi = get_index_of_best_fit(seg1, side1, seg2, side2); - vp1 = Side_to_verts[side1]; - vp2 = Side_to_verts[side2]; + auto &vp1 = Side_to_verts[side1]; + auto &vp2 = Side_to_verts[side2]; // Make a copy of the list of vertices in seg2 which will be deleted and set the // associated vertex number, so that all occurrences of the vertices can be replaced. @@ -1313,7 +1311,6 @@ int med_form_joint(const vsegptridx_t seg1, int side1, const vsegptridx_t seg2, // Note that no new vertices are created by this process. int med_form_bridge_segment(const vsegptridx_t seg1, int side1, const vsegptridx_t seg2, int side2) { - const sbyte *sv; int v,bfi,i; if (IS_CHILD(seg1->children[side1]) || IS_CHILD(seg2->children[side2])) @@ -1324,16 +1321,20 @@ int med_form_bridge_segment(const vsegptridx_t seg1, int side1, const vsegptridx bs->objects = object_none; // Copy vertices from seg2 into last 4 vertices of bridge segment. - sv = Side_to_verts[side2]; + { + auto &sv = Side_to_verts[side2]; for (v=0; v<4; v++) bs->verts[(3-v)+4] = seg2->verts[(int) sv[v]]; + } // Copy vertices from seg1 into first 4 vertices of bridge segment. bfi = get_index_of_best_fit(seg1, side1, seg2, side2); - sv = Side_to_verts[side1]; + { + auto &sv = Side_to_verts[side1]; for (v=0; v<4; v++) bs->verts[(v + bfi) % 4] = seg1->verts[(int) sv[v]]; + } // Form connections to children, first initialize all to unconnected. for (i=0; ichildren[sidenum])) { side *sidep = &segp->sides[sidenum]; - const sbyte *vp = Side_to_verts[sidenum]; - int v; - - for (v=0; v<4; v++) - if (*vp++ == relvnum) { + auto &vp = Side_to_verts[sidenum]; + const auto vb = std::begin(vp); + const auto ve = std::end(vp); + const auto vi = std::find(vb, ve, relvnum); + if (vi != ve) + { + const auto v = std::distance(vb, vi); total_light += sidep->uvls[v].l; num_occurrences++; } @@ -131,12 +133,15 @@ static void set_average_light_at_vertex(int vnum) for (sidenum=0; sidenum < MAX_SIDES_PER_SEGMENT; sidenum++) { if (!IS_CHILD(segp->children[sidenum])) { side *sidep = &segp->sides[sidenum]; - const sbyte *vp = Side_to_verts[sidenum]; - int v; - - for (v=0; v<4; v++) - if (*vp++ == relvnum) + auto &vp = Side_to_verts[sidenum]; + const auto vb = std::begin(vp); + const auto ve = std::end(vp); + const auto vi = std::find(vb, ve, relvnum); + if (vi != ve) + { + const auto v = std::distance(vb, vi); sidep->uvls[v].l = average_light; + } } // end if } // end sidenum } // end if @@ -432,13 +437,9 @@ int Vmag = VMAG; void assign_default_uvs_to_side(const vsegptridx_t segp,int side) { uvl uv0,uv1; - const sbyte *vp; - uv0.u = 0; uv0.v = 0; - - vp = Side_to_verts[side]; - + auto &vp = Side_to_verts[side]; uv1.u = 0; uv1.v = Num_tilings * fixmul(Vmag, vm_vec_dist(Vertices[segp->verts[vp[1]]],Vertices[segp->verts[vp[0]]])); @@ -629,7 +630,6 @@ void med_assign_uvs_to_side(const vsegptridx_t con_seg, int con_common_side, con // great confusion. static void get_side_ids(const vsegptr_t base_seg, const vsegptr_t con_seg, int base_side, int con_side, int abs_id1, int abs_id2, int *base_common_side, int *con_common_side) { - const sbyte *base_vp,*con_vp; int v0,side; *base_common_side = -1; @@ -637,7 +637,7 @@ static void get_side_ids(const vsegptr_t base_seg, const vsegptr_t con_seg, int // Find side in base segment which contains the two global vertex ids. for (side=0; sideverts[(int) base_vp[v0]] == abs_id1) && (base_seg->verts[(int) base_vp[(v0+1) % 4]] == abs_id2)) || ((base_seg->verts[(int) base_vp[v0]] == abs_id2) && (base_seg->verts[(int)base_vp[ (v0+1) % 4]] == abs_id1))) { Assert(*base_common_side == -1); // This means two different sides shared the same edge with base_side == impossible! @@ -652,7 +652,7 @@ static void get_side_ids(const vsegptr_t base_seg, const vsegptr_t con_seg, int // Find side in connecting segment which contains the two global vertex ids. for (side=0; sideverts[(int) con_vp[(v0 + 1) % 4]] == abs_id1) && (con_seg->verts[(int) con_vp[v0]] == abs_id2)) || ((con_seg->verts[(int) con_vp[(v0 + 1) % 4]] == abs_id2) && (con_seg->verts[(int) con_vp[v0]] == abs_id1))) { Assert(*con_common_side == -1); // This means two different sides shared the same edge with con_side == impossible! @@ -834,11 +834,10 @@ found1: ; // segment to get the wall in the connected segment which shares the edge, and get tmap_num from there. static void propagate_tmaps_to_segment_sides(const vsegptridx_t base_seg, int base_side, const vsegptridx_t con_seg, int con_side, int uv_only_flag) { - const sbyte *base_vp; int abs_id1,abs_id2; int v; - base_vp = Side_to_verts[base_side]; + auto &base_vp = Side_to_verts[base_side]; // Do for each edge on connecting face. for (v=0; v<4; v++) { diff --git a/similar/editor/texture.cpp b/similar/editor/texture.cpp index 317e1247d..f3658c9ca 100644 --- a/similar/editor/texture.cpp +++ b/similar/editor/texture.cpp @@ -88,8 +88,7 @@ static int DoTexSlideLeft(int value) side *sidep; uvl duvl03; fix dist; - const sbyte *vp; - vp = Side_to_verts[Curside]; + auto &vp = Side_to_verts[Curside]; sidep = &Cursegp->sides[Curside]; dist = vm_vec_dist(Vertices[Cursegp->verts[vp[3]]], Vertices[Cursegp->verts[vp[0]]]); @@ -126,8 +125,7 @@ static int DoTexSlideUp(int value) side *sidep; uvl duvl03; fix dist; - const sbyte *vp; - vp = Side_to_verts[Curside]; + auto &vp = Side_to_verts[Curside]; sidep = &Cursegp->sides[Curside]; dist = vm_vec_dist(Vertices[Cursegp->verts[vp[1]]], Vertices[Cursegp->verts[vp[0]]]); @@ -166,8 +164,7 @@ static int DoTexSlideDown(int value) side *sidep; uvl duvl03; fix dist; - const sbyte *vp; - vp = Side_to_verts[Curside]; + auto &vp = Side_to_verts[Curside]; sidep = &Cursegp->sides[Curside]; dist = vm_vec_dist(Vertices[Cursegp->verts[vp[1]]], Vertices[Cursegp->verts[vp[0]]]); @@ -290,8 +287,7 @@ static int DoTexSlideRight(int value) side *sidep; uvl duvl03; fix dist; - const sbyte *vp; - vp = Side_to_verts[Curside]; + auto &vp = Side_to_verts[Curside]; sidep = &Cursegp->sides[Curside]; dist = vm_vec_dist(Vertices[Cursegp->verts[vp[3]]], Vertices[Cursegp->verts[vp[0]]]); diff --git a/similar/main/gameseg.cpp b/similar/main/gameseg.cpp index 10c030dea..ce1fadd05 100644 --- a/similar/main/gameseg.cpp +++ b/similar/main/gameseg.cpp @@ -121,7 +121,7 @@ int get_num_faces(const side *sidep) // Fill in array with four absolute point numbers for a given side void get_side_verts(side_vertnum_list_t &vertlist,const vcsegptr_t segp,int sidenum) { - const sbyte *sv = Side_to_verts[sidenum]; + auto &sv = Side_to_verts[sidenum]; auto &vp = segp->verts; for (int i=4; i--;) @@ -144,7 +144,7 @@ void get_side_verts(side_vertnum_list_t &vertlist,const vcsegptr_t segp,int side uint_fast32_t create_all_vertex_lists(vertex_array_list_t &vertices, const vcsegptr_t segp, int sidenum) { auto sidep = &segp->sides[sidenum]; - const int *sv = Side_to_verts_int[sidenum]; + auto &sv = Side_to_verts_int[sidenum]; Assert((sidenum >= 0) && (sidenum < 6)); @@ -234,7 +234,7 @@ uint_fast32_t create_abs_vertex_lists(vertex_array_list_t &vertices, const vcseg { auto &vp = segp->verts; auto sidep = &segp->sides[sidenum]; - const int *sv = Side_to_verts_int[sidenum]; + auto &sv = Side_to_verts_int[sidenum]; switch (sidep->get_type()) { case SIDE_IS_QUAD: vertices[0] = vp[sv[0]]; @@ -1177,7 +1177,7 @@ void extract_up_vector_from_segment(const vcsegptr_t sp,vms_vector &vp) // A side is determined to be degenerate if the cross products of 3 consecutive points does not point outward. static int check_for_degenerate_side(const vcsegptr_t sp, int sidenum) { - const sbyte *vp = Side_to_verts[sidenum]; + auto &vp = Side_to_verts[sidenum]; vms_vector vec1, vec2; fix dot; int degeneracy_flag = 0; @@ -1314,7 +1314,7 @@ static void get_verts_for_normal(int va, int vb, int vc, int vd, int *v0, int *v // ------------------------------------------------------------------------------- static void add_side_as_2_triangles(const vsegptr_t sp, int sidenum) { - const sbyte *vs = Side_to_verts[sidenum]; + auto &vs = Side_to_verts[sidenum]; fix dot; side *sidep = &sp->sides[sidenum]; diff --git a/similar/main/mglobal.cpp b/similar/main/mglobal.cpp index b152d42fc..2bbced19a 100644 --- a/similar/main/mglobal.cpp +++ b/similar/main/mglobal.cpp @@ -54,7 +54,9 @@ unsigned Num_segments; unsigned Highest_vertex_index; // Translate table to get opposite side of a face on a segment. -const char Side_opposite[MAX_SIDES_PER_SEGMENT] = {WRIGHT, WBOTTOM, WLEFT, WTOP, WFRONT, WBACK}; +const array Side_opposite{{ + WRIGHT, WBOTTOM, WLEFT, WTOP, WFRONT, WBACK +}}; #define TOLOWER(c) ((((c)>='A') && ((c)<='Z'))?((c)+('a'-'A')):(c)) @@ -67,24 +69,24 @@ const char Side_opposite[MAX_SIDES_PER_SEGMENT] = {WRIGHT, WBOTTOM, WLEFT, WTOP, #define encrypt(a,b,c,d) a,b,c,d #endif -const sbyte Side_to_verts[MAX_SIDES_PER_SEGMENT][4] = { +const array, MAX_SIDES_PER_SEGMENT> Side_to_verts{{ { encrypt(7,6,2,3) }, // left { encrypt(0,4,7,3) }, // top { encrypt(0,1,5,4) }, // right { encrypt(2,6,5,1) }, // bottom { encrypt(4,5,6,7) }, // back { encrypt(3,2,1,0) }, // front -}; +}}; // Note, this MUST be the same as Side_to_verts, it is an int for speed reasons. -const int Side_to_verts_int[MAX_SIDES_PER_SEGMENT][4] = { +const array, MAX_SIDES_PER_SEGMENT> Side_to_verts_int{{ { encrypt(7,6,2,3) }, // left { encrypt(0,4,7,3) }, // top { encrypt(0,1,5,4) }, // right { encrypt(2,6,5,1) }, // bottom { encrypt(4,5,6,7) }, // back { encrypt(3,2,1,0) }, // front -}; +}}; // Texture map stuff