Use segment array for render visited[]
This commit is contained in:
parent
164001d977
commit
888f44336f
|
@ -278,9 +278,17 @@ protected:
|
||||||
struct base_maskproxy_t
|
struct base_maskproxy_t
|
||||||
{
|
{
|
||||||
unsigned m_shift;
|
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
|
typename array_t::value_type mask() const
|
||||||
{
|
{
|
||||||
return ((1 << bits) - 1) << (m_shift * bits);
|
return bitmask_low_aligned() << shift();
|
||||||
}
|
}
|
||||||
base_maskproxy_t(unsigned shift) :
|
base_maskproxy_t(unsigned shift) :
|
||||||
m_shift(shift)
|
m_shift(shift)
|
||||||
|
@ -358,6 +366,52 @@ public:
|
||||||
return make_maskproxy<const_bitproxy_t>(a, segnum);
|
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
|
||||||
|
|
||||||
#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];
|
char visited2[MAX_SEGMENTS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
unsigned char visited[MAX_SEGMENTS];
|
struct visited_twobit_array_t : visited_segment_multibit_array_t<2> {};
|
||||||
short Render_list[MAX_RENDER_SEGS];
|
short Render_list[MAX_RENDER_SEGS];
|
||||||
short Seg_depth[MAX_RENDER_SEGS]; //depth for each seg in Render_list
|
short Seg_depth[MAX_RENDER_SEGS]; //depth for each seg in Render_list
|
||||||
ubyte processed[MAX_RENDER_SEGS]; //whether each entry has been processed
|
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
|
//build a list of segments to be rendered
|
||||||
//fills in Render_list & N_render_segs
|
//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 lcnt,scnt,ecnt;
|
||||||
int l,c;
|
int l,c;
|
||||||
int ch;
|
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(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(no_render_flag, 0, sizeof(no_render_flag[0])*(MAX_RENDER_SEGS));
|
||||||
memset(processed, 0, sizeof(processed));
|
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();
|
render_start_frame();
|
||||||
|
|
||||||
|
visited_twobit_array_t visited;
|
||||||
|
|
||||||
#if defined(EDITOR)
|
#if defined(EDITOR)
|
||||||
if (Show_only_curside) {
|
if (Show_only_curside) {
|
||||||
|
@ -1988,7 +1988,7 @@ void render_mine(int start_seg_num,fix eye_offset, int window_num)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
//NOTE LINK TO ABOVE!!
|
//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
|
//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];
|
Current_seg_depth = Seg_depth[nn];
|
||||||
|
|
||||||
#if defined(DXX_BUILD_DESCENT_I)
|
#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)
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||||
#endif
|
#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
|
// Second Pass: Objects
|
||||||
for (nn=N_render_segs;nn--;)
|
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];
|
Current_seg_depth = Seg_depth[nn];
|
||||||
|
|
||||||
#if defined(DXX_BUILD_DESCENT_I)
|
#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)
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||||
#endif
|
#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
|
// Third Pass - Render Transculent level geometry with normal Alpha-Func
|
||||||
for (nn=N_render_segs;nn--;)
|
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];
|
Current_seg_depth = Seg_depth[nn];
|
||||||
|
|
||||||
#if defined(DXX_BUILD_DESCENT_I)
|
#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)
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
if (segnum!=-1 && (_search_mode || visited[segnum]!=3))
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue