New level render order for better seperation and blending between transculent level geometry and sprites
This commit is contained in:
parent
94877bce5a
commit
b63f988d37
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
157
main/render.c
157
main/render.c
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue