Use segment array for render visited[]
This commit is contained in:
parent
164001d977
commit
888f44336f
|
@ -278,9 +278,17 @@ protected:
|
|||
struct base_maskproxy_t
|
||||
{
|
||||
unsigned m_shift;
|
||||
unsigned shift() const
|
||||
{
|
||||
return m_shift * bits;
|
||||
}
|
||||
static unsigned bitmask_low_aligned()
|
||||
{
|
||||
return (1 << bits) - 1;
|
||||
}
|
||||
typename array_t::value_type mask() const
|
||||
{
|
||||
return ((1 << bits) - 1) << (m_shift * bits);
|
||||
return bitmask_low_aligned() << shift();
|
||||
}
|
||||
base_maskproxy_t(unsigned shift) :
|
||||
m_shift(shift)
|
||||
|
@ -358,6 +366,52 @@ public:
|
|||
return make_maskproxy<const_bitproxy_t>(a, segnum);
|
||||
}
|
||||
};
|
||||
|
||||
template <unsigned bits>
|
||||
class visited_segment_multibit_array_t : public visited_segment_mask_t<unsigned, bits>
|
||||
{
|
||||
typedef typename visited_segment_mask_t<unsigned, bits>::array_t array_t;
|
||||
typedef typename visited_segment_mask_t<unsigned, bits>::size_type size_type;
|
||||
template <typename R>
|
||||
struct tmpl_multibit_proxy_t : public visited_segment_mask_t<unsigned, bits>::template tmpl_maskproxy_t<R>
|
||||
{
|
||||
tmpl_multibit_proxy_t(R byte, unsigned shift) :
|
||||
visited_segment_mask_t<unsigned, bits>::template tmpl_maskproxy_t<R>(byte, shift)
|
||||
{
|
||||
}
|
||||
dxx_explicit_operator_bool operator bool() const
|
||||
{
|
||||
return !!(this->m_byte & this->mask());
|
||||
}
|
||||
operator unsigned() const
|
||||
{
|
||||
return (this->m_byte >> this->shift()) & this->bitmask_low_aligned();
|
||||
}
|
||||
};
|
||||
struct bitproxy_t : public tmpl_multibit_proxy_t<typename array_t::reference>
|
||||
{
|
||||
bitproxy_t(typename array_t::reference byte, unsigned shift) :
|
||||
tmpl_multibit_proxy_t<typename array_t::reference>(byte, shift)
|
||||
{
|
||||
}
|
||||
bitproxy_t& operator=(unsigned u)
|
||||
{
|
||||
assert(!(u & ~this->bitmask_low_aligned()));
|
||||
this->m_byte = (this->m_byte & ~this->mask()) | (u << this->shift());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
typedef tmpl_multibit_proxy_t<typename array_t::const_reference> const_bitproxy_t;
|
||||
public:
|
||||
bitproxy_t operator[](size_type segnum)
|
||||
{
|
||||
return this->template make_maskproxy<bitproxy_t>(this->a, segnum);
|
||||
}
|
||||
const_bitproxy_t operator[](size_type segnum) const
|
||||
{
|
||||
return this->template make_maskproxy<const_bitproxy_t>(this->a, segnum);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -959,7 +959,7 @@ static void draw_window_box(int color,short left,short top,short right,short bot
|
|||
char visited2[MAX_SEGMENTS];
|
||||
#endif
|
||||
|
||||
unsigned char visited[MAX_SEGMENTS];
|
||||
struct visited_twobit_array_t : visited_segment_multibit_array_t<2> {};
|
||||
short Render_list[MAX_RENDER_SEGS];
|
||||
short Seg_depth[MAX_RENDER_SEGS]; //depth for each seg in Render_list
|
||||
ubyte processed[MAX_RENDER_SEGS]; //whether each entry has been processed
|
||||
|
@ -1706,13 +1706,12 @@ void update_rendered_data(int window_num, object *viewer, int rear_view_flag)
|
|||
|
||||
//build a list of segments to be rendered
|
||||
//fills in Render_list & N_render_segs
|
||||
static void build_segment_list(int start_seg_num, int window_num)
|
||||
static void build_segment_list(visited_twobit_array_t &visited, int start_seg_num, int window_num)
|
||||
{
|
||||
int lcnt,scnt,ecnt;
|
||||
int l,c;
|
||||
int ch;
|
||||
|
||||
memset(visited, 0, sizeof(visited[0])*(Highest_segment_index+1));
|
||||
memset(render_pos, -1, sizeof(render_pos[0])*(Highest_segment_index+1));
|
||||
//memset(no_render_flag, 0, sizeof(no_render_flag[0])*(MAX_RENDER_SEGS));
|
||||
memset(processed, 0, sizeof(processed));
|
||||
|
@ -1965,6 +1964,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
|
||||
render_start_frame();
|
||||
|
||||
visited_twobit_array_t visited;
|
||||
|
||||
#if defined(EDITOR)
|
||||
if (Show_only_curside) {
|
||||
|
@ -1988,7 +1988,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
else
|
||||
#endif
|
||||
//NOTE LINK TO ABOVE!!
|
||||
build_segment_list(start_seg_num, window_num); //fills in Render_list & N_render_segs
|
||||
build_segment_list(visited, start_seg_num, window_num); //fills in Render_list & N_render_segs
|
||||
|
||||
//render away
|
||||
|
||||
|
@ -2125,7 +2125,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
Current_seg_depth = Seg_depth[nn];
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I)
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=3))
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || visited[segnum]!=3))
|
||||
#elif defined(DXX_BUILD_DESCENT_II)
|
||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||
#endif
|
||||
|
@ -2173,8 +2173,8 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
}
|
||||
}
|
||||
|
||||
memset(visited, 0, sizeof(visited[0])*(Highest_segment_index+1));
|
||||
|
||||
visited.clear();
|
||||
|
||||
// Second Pass: Objects
|
||||
for (nn=N_render_segs;nn--;)
|
||||
{
|
||||
|
@ -2185,7 +2185,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
Current_seg_depth = Seg_depth[nn];
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I)
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=3))
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || visited[segnum]!=3))
|
||||
#elif defined(DXX_BUILD_DESCENT_II)
|
||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||
#endif
|
||||
|
@ -2237,8 +2237,8 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
}
|
||||
}
|
||||
|
||||
memset(visited, 0, sizeof(visited[0])*(Highest_segment_index+1));
|
||||
|
||||
visited.clear();
|
||||
|
||||
// Third Pass - Render Transculent level geometry with normal Alpha-Func
|
||||
for (nn=N_render_segs;nn--;)
|
||||
{
|
||||
|
@ -2248,7 +2248,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
|||
Current_seg_depth = Seg_depth[nn];
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I)
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=3))
|
||||
if (segnum!=-1 && (_search_mode || eye_offset>0 || visited[segnum]!=3))
|
||||
#elif defined(DXX_BUILD_DESCENT_II)
|
||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue