Use array<> for Side_to_verts

This commit is contained in:
Kp 2015-02-05 03:03:50 +00:00
parent ddd81962b7
commit 8f5e6df9a5
6 changed files with 47 additions and 49 deletions

View file

@ -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<array<sbyte, 4>, MAX_SIDES_PER_SEGMENT> Side_to_verts; // Side_to_verts[my_side] is list of vertices forming side my_side.
extern const array<array<int, 4>, MAX_SIDES_PER_SEGMENT> Side_to_verts_int; // Side_to_verts[my_side] is list of vertices forming side my_side.
extern const array<char, MAX_SIDES_PER_SEGMENT> Side_opposite; // Side_opposite[my_side] returns side opposite cube from my_side.
#if defined(DXX_BUILD_DESCENT_II)
struct delta_light;

View file

@ -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; i<MAX_SIDES_PER_SEGMENT; i++) {

View file

@ -82,11 +82,13 @@ static fix get_average_light_at_vertex(int vnum, segnum_t *segs)
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);
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; side<MAX_SIDES_PER_SEGMENT; side++) {
if (side != base_side) {
base_vp = Side_to_verts[side];
auto &base_vp = Side_to_verts[side];
for (v0=0; v0<4; v0++)
if (((base_seg->verts[(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; side<MAX_SIDES_PER_SEGMENT; side++) {
if (side != con_side) {
con_vp = Side_to_verts[side];
auto &con_vp = Side_to_verts[side];
for (v0=0; v0<4; v0++)
if (((con_seg->verts[(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++) {

View file

@ -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]]]);

View file

@ -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];

View file

@ -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<char, MAX_SIDES_PER_SEGMENT> 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<array<sbyte, 4>, 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<array<int, 4>, 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