Use array<> for Side_to_verts
This commit is contained in:
parent
ddd81962b7
commit
8f5e6df9a5
|
@ -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;
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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]]]);
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue