New level render order for better seperation and blending between transculent level geometry and sprites

This commit is contained in:
zicodxx 2009-01-30 11:50:25 +00:00
parent 94877bce5a
commit b63f988d37
3 changed files with 165 additions and 2 deletions

View file

@ -1,5 +1,13 @@
D1X-Rebirth Changelog
20090130
--------
arch/ogl/ogl.c, main/render.c: New level render order for better seperation and blending between transculent level geometry and sprites
20090129
--------
main/netdrv_udp.c: Decreasing delay from timer_delay2 to timer_delay for sending/receiving packets when connecting to UDP host due to FPS-dependent inconsistencies in timer_delay2 causing packets possibly not received or sent frequently
20090126
--------
include/netdrv.h, main/network.c, main/menu.c, main/netdrv_udp.c, main/netdrv_udp.h, main/netpkt.c, main/netpkt.h, main/netdrv.c, arch/linux/netdrv_ipx.c, arch/linux/netdrv_kali.c, arch/win32/netdrv_ipx.c: Changed function naming convention in netdrv and below to general Descent code convention

View file

@ -822,7 +822,6 @@ bool g3_draw_bitmap(vms_vector *pos,fix width,fix height,grs_bitmap *bm, object
OGL_ENABLE(TEXTURE_2D);
ogl_bindbmtex(bm);
ogl_texwrap(bm->gltexture,GL_CLAMP_TO_EDGE);
glDepthMask(GL_FALSE);
if (Endlevel_sequence)
glDepthFunc(GL_ALWAYS);
@ -876,7 +875,6 @@ bool g3_draw_bitmap(vms_vector *pos,fix width,fix height,grs_bitmap *bm, object
glVertex3f(f2glf(pv.x),f2glf(pv.y),-f2glf(pv.z));
}
glEnd();
glDepthMask(GL_TRUE);
return 0;
}

View file

@ -1738,6 +1738,7 @@ void render_mine(int start_seg_num,fix eye_offset)
}
}
#ifndef OGL
for (nn=N_render_segs;nn--;) {
int segnum;
int objnp;
@ -1809,6 +1810,162 @@ void render_mine(int start_seg_num,fix eye_offset)
}
}
#else
// Sorting elements for Alpha - 3 passes
// First Pass: render opaque level geometry + transculent level geometry with high Alpha-Test func
for (nn=N_render_segs;nn--;)
{
int segnum;
segnum = Render_list[nn];
Current_seg_depth = Seg_depth[nn];
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=255))
{
//set global render window vars
if (window_check) {
Window_clip_left = render_windows[nn].left;
Window_clip_top = render_windows[nn].top;
Window_clip_right = render_windows[nn].right;
Window_clip_bot = render_windows[nn].bot;
}
// render segment
{
segment *seg = &Segments[segnum];
g3s_codes cc;
int sn;
Assert(segnum!=-1 && segnum<=Highest_segment_index);
cc=rotate_list(8,seg->verts);
if (! cc.and) { //all off screen?
if (Viewer->type!=OBJ_ROBOT)
Automap_visited[segnum]=1;
for (sn=0; sn<MAX_SIDES_PER_SEGMENT; sn++)
if (WALL_IS_DOORWAY(seg,sn) == WID_TRANSPARENT_WALL || WALL_IS_DOORWAY(seg,sn) == WID_TRANSILLUSORY_WALL)
{
glAlphaFunc(GL_GEQUAL,0.8);
render_side(seg, sn);
glAlphaFunc(GL_GEQUAL,0.02);
}
else
render_side(seg, sn);
}
}
visited[segnum]=255;
}
}
memset(visited, 0, sizeof(visited[0])*(Highest_segment_index+1));
// Second Pass: Objects
for (nn=N_render_segs;nn--;)
{
int segnum;
int objnp;
segnum = Render_list[nn];
Current_seg_depth = Seg_depth[nn];
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=255))
{
//set global render window vars
if (window_check) {
Window_clip_left = render_windows[nn].left;
Window_clip_top = render_windows[nn].top;
Window_clip_right = render_windows[nn].right;
Window_clip_bot = render_windows[nn].bot;
}
visited[segnum]=255;
if (window_check) { //reset for objects
Window_clip_left = Window_clip_top = 0;
Window_clip_right = grd_curcanv->cv_bitmap.bm_w-1;
Window_clip_bot = grd_curcanv->cv_bitmap.bm_h-1;
}
// render objects
{
int listnum;
int save_linear_depth = Max_linear_depth;
Max_linear_depth = Max_linear_depth_objects;
listnum = nn;
for (objnp=0;render_obj_list[listnum][objnp]!=-1;)
{
int ObjNumber = render_obj_list[listnum][objnp];
if (ObjNumber >= 0)
{
do_render_object(ObjNumber); // note link to above else
objnp++;
}
else
{
listnum = -ObjNumber;
objnp = 0;
}
}
Max_linear_depth = save_linear_depth;
}
}
}
memset(visited, 0, sizeof(visited[0])*(Highest_segment_index+1));
// Third Pass - Render Transculent level geometry with normal Alpha-Func
for (nn=N_render_segs;nn--;)
{
int segnum;
segnum = Render_list[nn];
Current_seg_depth = Seg_depth[nn];
if (segnum!=-1 && (_search_mode || eye_offset>0 || (unsigned char)visited[segnum]!=255))
{
//set global render window vars
if (window_check) {
Window_clip_left = render_windows[nn].left;
Window_clip_top = render_windows[nn].top;
Window_clip_right = render_windows[nn].right;
Window_clip_bot = render_windows[nn].bot;
}
// render segment
{
segment *seg = &Segments[segnum];
g3s_codes cc;
int sn;
Assert(segnum!=-1 && segnum<=Highest_segment_index);
cc=rotate_list(8,seg->verts);
if (! cc.and) { //all off screen?
if (Viewer->type!=OBJ_ROBOT)
Automap_visited[segnum]=1;
for (sn=0; sn<MAX_SIDES_PER_SEGMENT; sn++)
if (WALL_IS_DOORWAY(seg,sn) == WID_TRANSPARENT_WALL || WALL_IS_DOORWAY(seg,sn) == WID_TRANSILLUSORY_WALL)
render_side(seg, sn);
}
}
visited[segnum]=255;
}
}
#endif
#ifdef LASER_HACK
// Draw the hacked lasers last