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
|
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
|
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
|
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_ENABLE(TEXTURE_2D);
|
||||||
ogl_bindbmtex(bm);
|
ogl_bindbmtex(bm);
|
||||||
ogl_texwrap(bm->gltexture,GL_CLAMP_TO_EDGE);
|
ogl_texwrap(bm->gltexture,GL_CLAMP_TO_EDGE);
|
||||||
glDepthMask(GL_FALSE);
|
|
||||||
|
|
||||||
if (Endlevel_sequence)
|
if (Endlevel_sequence)
|
||||||
glDepthFunc(GL_ALWAYS);
|
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));
|
glVertex3f(f2glf(pv.x),f2glf(pv.y),-f2glf(pv.z));
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
glDepthMask(GL_TRUE);
|
|
||||||
|
|
||||||
return 0;
|
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--;) {
|
for (nn=N_render_segs;nn--;) {
|
||||||
int segnum;
|
int segnum;
|
||||||
int objnp;
|
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
|
#ifdef LASER_HACK
|
||||||
// Draw the hacked lasers last
|
// Draw the hacked lasers last
|
||||||
|
|
Loading…
Reference in a new issue