Refactor get_next_segment

This commit is contained in:
Kp 2015-05-09 17:38:58 +00:00
parent bac03fdfd9
commit 36ce989db6
2 changed files with 25 additions and 20 deletions

View file

@ -365,7 +365,6 @@ int med_find_closest_threshold_segment_side(vcsegptridx_t sp, int side, segptrid
// Select next segment. // Select next segment.
// If there is a connection on the current side, then choose that segment. // If there is a connection on the current side, then choose that segment.
// If there is no connecting segment on the current side, try any segment. // If there is no connecting segment on the current side, try any segment.
extern void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside);
// Copy texture maps in newseg to nsp. // Copy texture maps in newseg to nsp.
void copy_uvs_seg_to_seg(vsegptr_t nsp,vsegptr_t newseg); void copy_uvs_seg_to_seg(vsegptr_t nsp,vsegptr_t newseg);

View file

@ -73,23 +73,28 @@ static std::pair<vsegptridx_t, uint_fast32_t> get_previous_segment_side(const vs
// Select next segment. // Select next segment.
// If there is a connection on the current side, then choose that segment. // If there is a connection on the current side, then choose that segment.
// If there is no connecting segment on the current side, try any segment. // If there is no connecting segment on the current side, try any segment.
void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside) __attribute_warn_unused_result
static std::pair<vsegptridx_t, uint_fast32_t> get_next_segment_side(const vsegptridx_t curseg_num, uint_fast32_t curside)
{ {
if (IS_CHILD(Segments[curseg_num].children[curside])) { const auto side_child = curseg_num->children[curside];
if (IS_CHILD(side_child))
*newseg_num = Segments[curseg_num].children[Curside]; {
const auto newseg_num = vsegptridx(side_child);
// Find out what side we came in through and favor side opposite that // Find out what side we came in through and favor side opposite that
*newside = Side_opposite[find_connect_side(&Segments[curseg_num],&Segments[*newseg_num])]; const auto newside = Side_opposite[find_connect_side(curseg_num, newseg_num)];
// If there is nothing attached on the side opposite to what we came in (*newside), pick any other side // If there is nothing attached on the side opposite to what we came in (*newside), pick any other side
if (!IS_CHILD(Segments[*newseg_num].children[*newside])) if (!IS_CHILD(newseg_num->children[newside]))
for (int s=0; s<MAX_SIDES_PER_SEGMENT; s++) for (uint_fast32_t s = 0; s != MAX_SIDES_PER_SEGMENT; ++s)
if ((Segments[*newseg_num].children[s] != curseg_num) && IS_CHILD(Segments[*newseg_num].children[s])) {
*newside = s; const auto cseg = newseg_num->children[s];
} else { if (cseg != curseg_num && IS_CHILD(cseg))
*newseg_num = curseg_num; return {newseg_num, s};
*newside = curside; }
return {newseg_num, newside};
}
else
{
return {curseg_num, curside};
} }
} }
@ -97,12 +102,13 @@ void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside
// ---------- select current segment ---------- // ---------- select current segment ----------
int SelectCurrentSegForward() int SelectCurrentSegForward()
{ {
int newseg_num,newside; const auto p = get_next_segment_side(Cursegp,Curside);
const auto &newseg_num = p.first;
get_next_segment(Cursegp-Segments,Curside,&newseg_num,&newside); if (newseg_num != Cursegp)
{
if (newseg_num != Cursegp-Segments) { Cursegp = newseg_num;
Cursegp = &Segments[newseg_num]; const auto &newside = p.second;
Curside = newside; Curside = newside;
Update_flags |= UF_ED_STATE_CHANGED; Update_flags |= UF_ED_STATE_CHANGED;
if (Lock_view_to_cursegp) if (Lock_view_to_cursegp)