From 32d73f2e1ef4c7f22b283c21c99eaf6abf223304 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 5 Aug 2002 10:58:27 +0000 Subject: [PATCH] removed support for r_ser (also known as R_Clip or "Hidden Surface Removal") as it was a slowdown for everyone I know of git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2197 d7cf8633-e32d-0410-b094-e92efae38249 --- darkplaces.dsp | 8 - gl_rmain.c | 18 +- gl_rsurf.c | 163 +++------- makefile | 2 +- makefile.mingw | 2 +- menu.c | 42 ++- model_alias.c | 8 - model_brush.c | 6 - model_shared.h | 3 - model_sprite.c | 11 +- r_clip.c | 820 ------------------------------------------------- r_clip.h | 18 -- r_sprites.c | 74 +---- render.h | 6 - 14 files changed, 62 insertions(+), 1119 deletions(-) delete mode 100644 r_clip.c delete mode 100644 r_clip.h diff --git a/darkplaces.dsp b/darkplaces.dsp index 37bc5142..b5a7c99c 100644 --- a/darkplaces.dsp +++ b/darkplaces.dsp @@ -320,10 +320,6 @@ SOURCE=.\quakeio.c # End Source File # Begin Source File -SOURCE=.\r_clip.c -# End Source File -# Begin Source File - SOURCE=.\r_crosshairs.c # End Source File # Begin Source File @@ -632,10 +628,6 @@ SOURCE=.\quakeio.h # End Source File # Begin Source File -SOURCE=.\r_clip.h -# End Source File -# Begin Source File - SOURCE=.\r_lerpanim.h # End Source File # Begin Source File diff --git a/gl_rmain.c b/gl_rmain.c index 064bda61..8ec79d52 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -65,8 +65,6 @@ cvar_t gl_fogblue = {0, "gl_fogblue","0.3"}; cvar_t gl_fogstart = {0, "gl_fogstart", "0"}; cvar_t gl_fogend = {0, "gl_fogend","0"}; -cvar_t r_ser = {CVAR_SAVE, "r_ser", "0"}; - cvar_t r_multitexture = {0, "r_multitexture", "1"}; /* @@ -241,7 +239,6 @@ void GL_Main_Init(void) Cvar_RegisterVariable (&r_dynamic); Cvar_RegisterVariable (&r_waterripple); Cvar_RegisterVariable (&r_fullbright); - Cvar_RegisterVariable (&r_ser); Cvar_RegisterVariable (&r_multitexture); if (gamemode == GAME_NEHAHRA) Cvar_SetValue("r_fullbrights", 0); @@ -278,7 +275,6 @@ extern void R_Crosshairs_Init(void); extern void R_Light_Init(void); extern void R_Particles_Init(void); extern void R_Explosion_Init(void); -extern void R_Clip_Init(void); extern void ui_init(void); extern void gl_backend_init(void); @@ -288,7 +284,6 @@ void Render_Init(void) R_Textures_Init(); Mod_RenderInit(); gl_backend_init(); - R_Clip_Init(); GL_Draw_Init(); GL_Main_Init(); GL_Models_Init(); @@ -373,10 +368,7 @@ static void R_MarkEntities (void) continue; R_LerpAnimation(currentrenderentity); - if (r_ser.integer) - currentrenderentity->model->SERAddEntity(); - else - currentrenderentity->visframe = r_framecount; + currentrenderentity->visframe = r_framecount; } } @@ -550,8 +542,6 @@ void R_RenderView (void) R_SetFrustum(); R_SetupFog(); R_SkyStartFrame(); - if (r_ser.integer) - R_Clip_StartFrame(); R_BuildLightList(); R_Mesh_Start(); @@ -564,12 +554,6 @@ void R_RenderView (void) R_MarkEntities(); R_TimeReport("markentity"); - if (r_ser.integer) - { - R_Clip_EndFrame(); - R_TimeReport("hiddensurf"); - } - R_MarkWorldLights(); R_TimeReport("marklights"); diff --git a/gl_rsurf.c b/gl_rsurf.c index 7e7a3b93..a9a6cb55 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -1752,11 +1752,6 @@ static void RSurfShader_Wall_Lightmap(msurface_t *firstsurf) ============================================================= */ -static void RSurf_Callback(void *data, void *junk) -{ - ((msurface_t *)data)->visframe = r_framecount; -} - static void R_SolidWorldNode (void) { if (r_viewleaf->contents != CONTENTS_SOLID) @@ -1765,7 +1760,6 @@ static void R_SolidWorldNode (void) mportal_t *p, *pstack[8192]; msurface_t *surf, **mark, **endmark; mleaf_t *leaf; - tinyplane_t plane; // LordHavoc: portal-passage worldnode; follows portals leading // outward from viewleaf, if a portal leads offscreen it is not // followed, in indoor maps this can often cull a great deal of @@ -1783,54 +1777,25 @@ static void R_SolidWorldNode (void) { mark = leaf->firstmarksurface; endmark = mark + leaf->nummarksurfaces; - if (r_ser.integer) + do { - do + surf = *mark++; + // make sure surfaces are only processed once + if (surf->worldnodeframe == r_framecount) + continue; + surf->worldnodeframe = r_framecount; + if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) { - surf = *mark++; - // make sure surfaces are only processed once - if (surf->worldnodeframe == r_framecount) - continue; - surf->worldnodeframe = r_framecount; - if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) - { - if (surf->flags & SURF_PLANEBACK) - { - VectorNegate(surf->plane->normal, plane.normal); - plane.dist = -surf->plane->dist; - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane); - } - } - else - { - if (!(surf->flags & SURF_PLANEBACK)) - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane); - } + if (surf->flags & SURF_PLANEBACK) + surf->visframe = r_framecount; } - while (mark < endmark); - } - else - { - do + else { - surf = *mark++; - // make sure surfaces are only processed once - if (surf->worldnodeframe == r_framecount) - continue; - surf->worldnodeframe = r_framecount; - if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) - { - if (surf->flags & SURF_PLANEBACK) - surf->visframe = r_framecount; - } - else - { - if (!(surf->flags & SURF_PLANEBACK)) - surf->visframe = r_framecount; - } + if (!(surf->flags & SURF_PLANEBACK)) + surf->visframe = r_framecount; } - while (mark < endmark); } + while (mark < endmark); } // follow portals into other leafs @@ -1876,49 +1841,21 @@ loc2: { if (node->numsurfaces) { - if (r_ser.integer) + msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces; + if (PlaneDiff (r_origin, node->plane) < 0) { - msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces; - tinyplane_t plane; - if (PlaneDiff (r_origin, node->plane) < 0) - { - for (;surf < surfend;surf++) - { - if (surf->flags & SURF_PLANEBACK) - { - VectorNegate(surf->plane->normal, plane.normal); - plane.dist = -surf->plane->dist; - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, &plane); - } - } - } - else + for (;surf < surfend;surf++) { - for (;surf < surfend;surf++) - { - if (!(surf->flags & SURF_PLANEBACK)) - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), surf->flags & SURF_CLIPSOLID, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane); - } + if (surf->flags & SURF_PLANEBACK) + surf->visframe = r_framecount; } } else { - msurface_t *surf = cl.worldmodel->surfaces + node->firstsurface, *surfend = surf + node->numsurfaces; - if (PlaneDiff (r_origin, node->plane) < 0) + for (;surf < surfend;surf++) { - for (;surf < surfend;surf++) - { - if (surf->flags & SURF_PLANEBACK) - surf->visframe = r_framecount; - } - } - else - { - for (;surf < surfend;surf++) - { - if (!(surf->flags & SURF_PLANEBACK)) - surf->visframe = r_framecount; - } + if (!(surf->flags & SURF_PLANEBACK)) + surf->visframe = r_framecount; } } } @@ -1970,7 +1907,6 @@ static void R_PVSWorldNode() mportal_t *p, *pstack[8192]; msurface_t *surf, **mark, **endmark; mleaf_t *leaf; - tinyplane_t plane; qbyte *worldvis; worldvis = Mod_LeafPVS (r_viewleaf, cl.worldmodel); @@ -1987,54 +1923,25 @@ loc0: { mark = leaf->firstmarksurface; endmark = mark + leaf->nummarksurfaces; - if (r_ser.integer) - { - do + do + { + surf = *mark++; + // make sure surfaces are only processed once + if (surf->worldnodeframe == r_framecount) + continue; + surf->worldnodeframe = r_framecount; + if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) { - surf = *mark++; - // make sure surfaces are only processed once - if (surf->worldnodeframe == r_framecount) - continue; - surf->worldnodeframe = r_framecount; - if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) - { - if (surf->flags & SURF_PLANEBACK) - { - VectorNegate(surf->plane->normal, plane.normal); - plane.dist = -surf->plane->dist; - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, &plane); - } - } - else - { - if (!(surf->flags & SURF_PLANEBACK)) - R_Clip_AddPolygon((float *)surf->poly_verts, surf->poly_numverts, sizeof(float[3]), (surf->flags & SURF_CLIPSOLID) != 0, RSurf_Callback, surf, NULL, (tinyplane_t *)surf->plane); - } + if (surf->flags & SURF_PLANEBACK) + surf->visframe = r_framecount; } - while (mark < endmark); - } - else - { - do + else { - surf = *mark++; - // make sure surfaces are only processed once - if (surf->worldnodeframe == r_framecount) - continue; - surf->worldnodeframe = r_framecount; - if (PlaneDist(r_origin, surf->plane) < surf->plane->dist) - { - if (surf->flags & SURF_PLANEBACK) - surf->visframe = r_framecount; - } - else - { - if (!(surf->flags & SURF_PLANEBACK)) - surf->visframe = r_framecount; - } + if (!(surf->flags & SURF_PLANEBACK)) + surf->visframe = r_framecount; } - while (mark < endmark); } + while (mark < endmark); } // follow portals into other leafs diff --git a/makefile b/makefile index 2aacb9a6..d650fbf0 100644 --- a/makefile +++ b/makefile @@ -22,7 +22,7 @@ SOUNDLIB= #if you want no CD audio CD=cd_null.o -OBJECTS= builddate.o $(CD) $(SND) chase.o cl_demo.o cl_input.o cl_main.o cl_parse.o cl_tent.o cmd.o common.o console.o crc.o cvar.o fractalnoise.o gl_draw.o r_sky.o gl_rmain.o gl_rsurf.o host.o host_cmd.o image.o keys.o mathlib.o menu.o model_alias.o model_brush.o model_shared.o model_sprite.o net_bsd.o net_udp.o net_dgrm.o net_loop.o net_main.o pr_cmds.o pr_edict.o pr_exec.o r_light.o r_explosion.o sbar.o sv_main.o sv_move.o sv_phys.o sv_user.o sv_light.o sys_linux.o transform.o view.o wad.o world.o zone.o vid_shared.o palette.o r_crosshairs.o gl_textures.o gl_models.o r_sprites.o r_modules.o r_explosion.o r_lerpanim.o protocol.o quakeio.o r_clip.o ui.o portals.o sys_shared.o cl_light.o gl_backend.o cl_particles.o cl_screen.o cgamevm.o cgame.o filematch.o collision.o cl_collision.o matrixlib.o cl_video.o dpvsimpledecode.o wavefile.o meshqueue.o +OBJECTS= builddate.o $(CD) $(SND) chase.o cl_demo.o cl_input.o cl_main.o cl_parse.o cl_tent.o cmd.o common.o console.o crc.o cvar.o fractalnoise.o gl_draw.o r_sky.o gl_rmain.o gl_rsurf.o host.o host_cmd.o image.o keys.o mathlib.o menu.o model_alias.o model_brush.o model_shared.o model_sprite.o net_bsd.o net_udp.o net_dgrm.o net_loop.o net_main.o pr_cmds.o pr_edict.o pr_exec.o r_light.o r_explosion.o sbar.o sv_main.o sv_move.o sv_phys.o sv_user.o sv_light.o sys_linux.o transform.o view.o wad.o world.o zone.o vid_shared.o palette.o r_crosshairs.o gl_textures.o gl_models.o r_sprites.o r_modules.o r_explosion.o r_lerpanim.o protocol.o quakeio.o ui.o portals.o sys_shared.o cl_light.o gl_backend.o cl_particles.o cl_screen.o cgamevm.o cgame.o filematch.o collision.o cl_collision.o matrixlib.o cl_video.o dpvsimpledecode.o wavefile.o meshqueue.o #K6/athlon optimizations CPUOPTIMIZATIONS=-march=k6 diff --git a/makefile.mingw b/makefile.mingw index d306b4f9..6c14afc3 100644 --- a/makefile.mingw +++ b/makefile.mingw @@ -1,5 +1,5 @@ -OBJECTS= builddate.o chase.o cl_demo.o cl_input.o cl_main.o cl_parse.o cl_tent.o cmd.o common.o console.o crc.o cvar.o fractalnoise.o gl_draw.o r_sky.o gl_rmain.o gl_rsurf.o host.o host_cmd.o image.o keys.o mathlib.o menu.o model_alias.o model_brush.o model_shared.o model_sprite.o net_dgrm.o net_loop.o net_main.o pr_cmds.o pr_edict.o pr_exec.o r_light.o r_explosion.o sbar.o snd_dma.o snd_mem.o snd_mix.o sv_main.o sv_move.o sv_phys.o sv_user.o sv_light.o transform.o view.o wad.o world.o zone.o vid_shared.o palette.o r_crosshairs.o gl_textures.o gl_models.o r_sprites.o r_modules.o r_explosion.o r_lerpanim.o protocol.o quakeio.o r_clip.o ui.o portals.o sys_shared.o cl_light.o gl_backend.o cl_particles.o cl_screen.o cgamevm.o cgame.o filematch.o collision.o cl_collision.o matrixlib.o cl_video.o dpvsimpledecode.o wavefile.o meshqueue.o +OBJECTS= builddate.o chase.o cl_demo.o cl_input.o cl_main.o cl_parse.o cl_tent.o cmd.o common.o console.o crc.o cvar.o fractalnoise.o gl_draw.o r_sky.o gl_rmain.o gl_rsurf.o host.o host_cmd.o image.o keys.o mathlib.o menu.o model_alias.o model_brush.o model_shared.o model_sprite.o net_dgrm.o net_loop.o net_main.o pr_cmds.o pr_edict.o pr_exec.o r_light.o r_explosion.o sbar.o snd_dma.o snd_mem.o snd_mix.o sv_main.o sv_move.o sv_phys.o sv_user.o sv_light.o transform.o view.o wad.o world.o zone.o vid_shared.o palette.o r_crosshairs.o gl_textures.o gl_models.o r_sprites.o r_modules.o r_explosion.o r_lerpanim.o protocol.o quakeio.o ui.o portals.o sys_shared.o cl_light.o gl_backend.o cl_particles.o cl_screen.o cgamevm.o cgame.o filematch.o collision.o cl_collision.o matrixlib.o cl_video.o dpvsimpledecode.o wavefile.o meshqueue.o #K6/athlon optimizations #CPUOPTIMIZATIONS=-march=k6 diff --git a/menu.c b/menu.c index 103c3568..6f69c712 100644 --- a/menu.c +++ b/menu.c @@ -1250,7 +1250,7 @@ void M_DrawCheckbox (int x, int y, int on) } -#define OPTIONS_ITEMS 28 +#define OPTIONS_ITEMS 27 int options_cursor; @@ -1278,49 +1278,46 @@ void M_Menu_Options_AdjustSliders (int dir) Cvar_SetValueQuick (&r_skyquality, bound(0, r_skyquality.integer + dir, 2)); break; case 8: - Cvar_SetValueQuick (&r_ser, !r_ser.integer); - break; - case 9: Cvar_SetValueQuick (&v_overbrightbits, bound(0, v_overbrightbits.integer + dir, 4)); break; - case 10: + case 9: Cvar_SetValueQuick (&gl_combine, !gl_combine.integer); break; - case 11: + case 10: Cvar_SetValueQuick (&gl_dither, !gl_dither.integer); break; - case 12: + case 11: Cvar_SetValueQuick (&v_hwgamma, !v_hwgamma.integer); break; - case 13: + case 12: Cvar_SetValueQuick (&v_gamma, bound(1, v_gamma.value + dir * 0.25, 5)); break; - case 14: + case 13: Cvar_SetValueQuick (&v_contrast, bound(0.5, v_contrast.value + dir * 0.25, 5)); break; - case 15: + case 14: Cvar_SetValueQuick (&v_brightness, bound(0, v_brightness.value + dir * 0.05, 0.8)); break; - case 16: // music volume + case 15: // music volume #ifdef _WIN32 Cvar_SetValueQuick (&bgmvolume, bound(0, bgmvolume.value + dir * 1.0, 1)); #else Cvar_SetValueQuick (&bgmvolume, bound(0, bgmvolume.value + dir * 0.1, 1)); #endif break; - case 17: // sfx volume + case 16: // sfx volume Cvar_SetValueQuick (&volume, bound(0, volume.value + dir * 0.1, 1)); break; - case 18: + case 17: Cvar_SetValueQuick (&crosshair, bound(0, crosshair.integer + dir, 5)); break; - case 19: + case 18: Cvar_SetValueQuick (&crosshair_size, bound(1, crosshair_size.value + dir, 5)); break; - case 20: // show framerate + case 19: // show framerate Cvar_SetValueQuick (&showfps, !showfps.integer); break; - case 21: // always run + case 20: // always run if (cl_forwardspeed.value > 200) { Cvar_SetValueQuick (&cl_forwardspeed, 200); @@ -1332,22 +1329,22 @@ void M_Menu_Options_AdjustSliders (int dir) Cvar_SetValueQuick (&cl_backspeed, 400); } break; - case 22: // lookspring + case 21: // lookspring Cvar_SetValueQuick (&lookspring, !lookspring.integer); break; - case 23: // lookstrafe + case 22: // lookstrafe Cvar_SetValueQuick (&lookstrafe, !lookstrafe.integer); break; - case 24: // mouse speed + case 23: // mouse speed Cvar_SetValueQuick (&sensitivity, bound(1, sensitivity.value + dir * 0.5, 50)); break; - case 25: // mouse look + case 24: // mouse look Cvar_SetValueQuick (&freelook, !freelook.integer); break; - case 26: // invert mouse + case 25: // invert mouse Cvar_SetValueQuick (&m_pitch, -m_pitch.value); break; - case 27: // windowed mouse + case 26: // windowed mouse Cvar_SetValueQuick (&vid_mouse, !vid_mouse.integer); break; } @@ -1371,7 +1368,6 @@ void M_Options_Draw (void) M_Print(16, y, " 2D Resolution");M_DrawSlider(220, y, scr_2dresolution.value);y += 8; M_Print(16, y, " Screen size");M_DrawSlider(220, y, (scr_viewsize.value - 30) /(120 - 30));y += 8; M_Print(16, y, " Sky Quality");M_DrawSlider(220, y, r_skyquality.value / 2);y += 8; - M_Print(16, y, "Hidden Surface Removal");M_DrawCheckbox(220, y, r_ser.integer);y += 8; M_Print(16, y, " Overbright Bits");M_DrawSlider(220, y, (v_overbrightbits.value) / 4);y += 8; M_Print(16, y, " Texture Combine");M_DrawCheckbox(220, y, gl_combine.integer);y += 8; M_Print(16, y, " Dithering");M_DrawCheckbox(220, y, gl_dither.integer);y += 8; diff --git a/model_alias.c b/model_alias.c index 5bdf6f96..6247e5b6 100644 --- a/model_alias.c +++ b/model_alias.c @@ -27,11 +27,6 @@ void Mod_AliasInit (void) Cvar_RegisterVariable(&r_mipskins); } -static void Mod_Alias_SERAddEntity(void) -{ - R_Clip_AddBox(currentrenderentity->mins, currentrenderentity->maxs, R_Entity_Callback, currentrenderentity, NULL); -} - // LordHavoc: proper bounding box considerations static float aliasbboxmin[3], aliasbboxmax[3], modelyawradius, modelradius; @@ -497,7 +492,6 @@ void Mod_LoadAliasModel (model_t *mod, void *buffer) loadmodel->yawmins[2] = loadmodel->normalmins[2]; loadmodel->yawmaxs[2] = loadmodel->normalmaxs[2]; - loadmodel->SERAddEntity = Mod_Alias_SERAddEntity; loadmodel->Draw = R_DrawAliasModel; loadmodel->DrawSky = NULL; loadmodel->DrawShadow = NULL; @@ -572,7 +566,6 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer) loadmodel->type = mod_alias; loadmodel->aliastype = ALIASTYPE_MDLMD2; - loadmodel->SERAddEntity = Mod_Alias_SERAddEntity; loadmodel->Draw = R_DrawAliasModel; loadmodel->DrawSky = NULL; loadmodel->DrawShadow = NULL; @@ -959,7 +952,6 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer) loadmodel->yawmins[2] = loadmodel->normalmins[2]; loadmodel->yawmaxs[2] = loadmodel->normalmaxs[2]; - loadmodel->SERAddEntity = Mod_Alias_SERAddEntity; loadmodel->Draw = R_DrawAliasModel; loadmodel->DrawSky = NULL; loadmodel->DrawShadow = NULL; diff --git a/model_brush.c b/model_brush.c index feab7d7e..c5c8336d 100644 --- a/model_brush.c +++ b/model_brush.c @@ -49,11 +49,6 @@ void Mod_BrushInit (void) memset(mod_novis, 0xff, sizeof(mod_novis)); } -void Mod_Brush_SERAddEntity(void) -{ - R_Clip_AddBox(currentrenderentity->mins, currentrenderentity->maxs, R_Entity_Callback, currentrenderentity, NULL); -} - /* =============== Mod_PointInLeaf @@ -2522,7 +2517,6 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer) mod->numleafs = bm->visleafs; - mod->SERAddEntity = Mod_Brush_SERAddEntity; mod->Draw = R_DrawBrushModelNormal; mod->DrawShadow = NULL; diff --git a/model_shared.h b/model_shared.h index 6d7cb0c2..21deb6a2 100644 --- a/model_shared.h +++ b/model_shared.h @@ -192,9 +192,6 @@ typedef struct model_s int sprnum_type; mspriteframe_t *sprdata_frames; - // adds a box (or individual polygons) to the clipping engine, - // which will mark the entity visible if seen - void(*SERAddEntity)(void); // draw the model void(*Draw)(void); // draw the model's sky polygons (only used by brush models) diff --git a/model_sprite.c b/model_sprite.c index 7af45a9a..3c01af14 100644 --- a/model_sprite.c +++ b/model_sprite.c @@ -36,7 +36,7 @@ void Mod_SpriteInit (void) Cvar_RegisterVariable(&r_mipsprites); } -void Mod_Sprite_StripExtension(char *in, char *out) +static void Mod_Sprite_StripExtension(char *in, char *out) { char *end; end = in + strlen(in); @@ -51,7 +51,7 @@ void Mod_Sprite_StripExtension(char *in, char *out) *out++ = 0; } -void Mod_Sprite_SharedSetup(qbyte *datapointer, int version, int *palette) +static void Mod_Sprite_SharedSetup(qbyte *datapointer, int version, int *palette) { int i, j, k, groupframes, realframes, x, y, origin[2], width, height; dspriteframetype_t *pinframetype; @@ -227,12 +227,6 @@ void Mod_Sprite_SharedSetup(qbyte *datapointer, int version, int *palette) } } -void Mod_Sprite_SERAddEntity(void) -{ - R_ClipSprite(); -} - - /* ================= Mod_LoadSpriteModel @@ -248,7 +242,6 @@ void Mod_LoadSpriteModel (model_t *mod, void *buffer) datapointer = buffer; - loadmodel->SERAddEntity = Mod_Sprite_SERAddEntity; loadmodel->Draw = R_DrawSpriteModel; loadmodel->DrawSky = NULL; loadmodel->DrawShadow = NULL; diff --git a/r_clip.c b/r_clip.c deleted file mode 100644 index 362268c4..00000000 --- a/r_clip.c +++ /dev/null @@ -1,820 +0,0 @@ - -#include "quakedef.h" - -typedef struct clipsurf_s -{ - struct clipsurf_s *next, *prev; - int state; - int visible; - int solid; - int removed; - void (*callback)(void *nativedata, void *nativedata2); - void *nativedata; - void *nativedata2; - float wstepx, wstepy, w00; - // wcurrent is a cached copy of w00 + wstepy * y, - // updated each time the surface is added to the stack, - // for quicker comparisons. - float wcurrent; -} -clipsurf_t; - -typedef struct clipedge_s -{ - float x, realx, realxstep; - struct clipedge_s *next, *prev, *nextremove; - clipsurf_t *psurf; - int leading; - int pad; -} -clipedge_t; - -clipsurf_t *pavailsurf, *clipsurfs, *clipsurfsend; -clipedge_t *pavailedge, *clipedges, *clipedgesend, *newedges, **removeedges; - -clipsurf_t surfstack; -clipedge_t edgehead, edgetail; -clipedge_t maxedge = {2000000000.0f}; - -cvar_t r_clipwidth = {0, "r_clipwidth", "800"}; -cvar_t r_clipheight = {0, "r_clipheight", "600"}; -cvar_t r_clipedges = {CVAR_SAVE, "r_clipedges", "32768"}; -cvar_t r_clipsurfaces = {CVAR_SAVE, "r_clipsurfaces", "8192"}; - -int clipwidth = 0, clipheight = 0; -int maxclipsurfs = 0, maxclipedges = 0; -int needededges, neededsurfs; - -#if CLIPTEST -typedef struct -{ - float w; // inverse depth (1/z) -} -clippixel_t; - -clippixel_t *clipbuffer; -#endif - -float r_clip_viewmatrix[3][3], r_clip_viewmulx, r_clip_viewmuly, r_clip_viewcenterx, r_clip_viewcentery; -tinyplane_t r_clip_viewplane[5]; - -mempool_t *r_clip_mempool; - -void R_Clip_MakeViewMatrix(void) -{ - float pixelaspect, screenaspect, horizontalfieldofview, verticalfieldofview; - pixelaspect = (float) clipheight / (float) clipwidth * 320 / 240.0; - horizontalfieldofview = 2.0 * tan (r_refdef.fov_x/360*M_PI); - screenaspect = clipwidth * pixelaspect / clipheight; - verticalfieldofview = horizontalfieldofview / screenaspect; - r_clip_viewcenterx = clipwidth * 0.5 - 0.5; - r_clip_viewcentery = clipheight * 0.5 - 0.5; - r_clip_viewmulx = clipwidth / horizontalfieldofview; - r_clip_viewmuly = r_clip_viewmulx * pixelaspect; - // this constructs a transposed rotation matrix for the view (transposed matrices do the opposite of their normal behavior) - VectorCopy (vright, r_clip_viewmatrix[0]); - VectorNegate (vup, r_clip_viewmatrix[1]); - VectorCopy (vpn, r_clip_viewmatrix[2]); - VectorCopy (vpn, r_clip_viewplane[0].normal); - r_clip_viewplane[0].dist = DotProduct(r_origin, vpn); - memcpy(&r_clip_viewplane[1], &frustum[0], sizeof(tinyplane_t)); - memcpy(&r_clip_viewplane[2], &frustum[1], sizeof(tinyplane_t)); - memcpy(&r_clip_viewplane[3], &frustum[2], sizeof(tinyplane_t)); - memcpy(&r_clip_viewplane[4], &frustum[3], sizeof(tinyplane_t)); -} - -void R_Clip_StartFrame(void) -{ - int i; - int newwidth, newheight, newmaxedges, newmaxsurfs; - newwidth = bound(80, r_clipwidth.integer, vid.realwidth * 2); - newheight = bound(60, r_clipheight.integer, vid.realheight * 2); - newmaxedges = bound(128, r_clipedges.integer, 262144); - newmaxsurfs = bound(32, r_clipsurfaces.integer, 65536); - if (newwidth != clipwidth || newheight != clipheight || maxclipedges != newmaxedges || maxclipsurfs != newmaxsurfs) - { -#if CLIPTEST - if (clipbuffer) - Mem_Free(clipbuffer); -#endif - if (clipedges) - Mem_Free(clipedges); - if (clipsurfs) - Mem_Free(clipsurfs); - if (newedges) - Mem_Free(newedges); - if (removeedges) - Mem_Free(removeedges); - clipwidth = newwidth; - clipheight = newheight; - maxclipedges = newmaxedges; - maxclipsurfs = newmaxsurfs; -#if CLIPTEST - clipbuffer = Mem_Alloc(r_clip_mempool, clipwidth * clipheight * sizeof(clippixel_t)); -#endif - clipedges = Mem_Alloc(r_clip_mempool, maxclipedges * sizeof(clipedge_t)); - clipsurfs = Mem_Alloc(r_clip_mempool, maxclipsurfs * sizeof(clipsurf_t)); - newedges = Mem_Alloc(r_clip_mempool, clipheight * sizeof(clipedge_t)); - removeedges = Mem_Alloc(r_clip_mempool, clipheight * sizeof(clipedge_t *)); - clipedgesend = clipedges + maxclipedges; - clipsurfsend = clipsurfs + maxclipsurfs; - } -#if CLIPTEST - memset(clipbuffer, 0, clipwidth * clipheight * sizeof(clippixel_t)); -#endif - pavailedge = clipedges; - pavailsurf = clipsurfs; - // Clear the lists of edges to add and remove on each scan line. - - needededges = 0; - neededsurfs = 0; - for (i = 0;i < clipheight;i++) - { - newedges[i].next = &maxedge; - removeedges[i] = NULL; - } - - R_Clip_MakeViewMatrix(); -} - -void ScanEdges (void); - -void R_Clip_EndFrame(void) -{ - ScanEdges(); - if (maxclipedges < needededges) - { - Con_Printf("R_Clip: ran out of edges, increasing limit from %d to %d\n", maxclipedges, needededges); - Cvar_SetValue("r_clipedges", needededges); - } - if (maxclipsurfs < neededsurfs) - { - Con_Printf("R_Clip: ran out of surfaces, increasing limit from %d to %d\n", maxclipsurfs, neededsurfs); - Cvar_SetValue("r_clipsurfaces", neededsurfs); - } -} - -void r_clip_start(void) -{ - r_clip_mempool = Mem_AllocPool("R_Clip"); -} - -void r_clip_shutdown(void) -{ - Mem_FreePool(&r_clip_mempool); -#if CLIPTEST - clipbuffer = NULL; -#endif - clipsurfs = NULL; - clipedges = NULL; - newedges = NULL; - removeedges = NULL; - clipwidth = -1; - clipheight = -1; -} - -void r_clip_newmap(void) -{ -} - -void R_Clip_Init(void) -{ - Cvar_RegisterVariable(&r_clipwidth); - Cvar_RegisterVariable(&r_clipheight); - Cvar_RegisterVariable(&r_clipedges); - Cvar_RegisterVariable(&r_clipsurfaces); - R_RegisterModule("R_Clip", r_clip_start, r_clip_shutdown, r_clip_newmap); -} - -int R_Clip_TriangleToPlane(vec3_t point1, vec3_t point2, vec3_t point3, tinyplane_t *p) -{ - float y, number; - vec3_t v1, v2; - VectorSubtract(point1, point2, v1); - VectorSubtract(point3, point2, v2); - CrossProduct(v1, v2, p->normal); - number = DotProduct(p->normal, p->normal); - if (number >= 0.1f) - { - *((int *)&y) = 0x5f3759df - ((* (int *) &number) >> 1); - y = y * (1.5f - (number * 0.5f * y * y)); - VectorScale(p->normal, y, p->normal); - p->dist = DotProduct(point1, p->normal); - return true; - } - else - return false; -} - - -int R_Clip_ClipPolygonToPlane(float *in, float *out, int inpoints, int stride, tinyplane_t *plane) -{ - int i, outpoints, prevside, side; - float *prevpoint, prevdist, dist, dot; - - // begin with the last point, then enter the loop with the first point as current - prevpoint = (float *) ((qbyte *)in + stride * (inpoints - 1)); - prevdist = DotProduct(prevpoint, plane->normal) - plane->dist; - prevside = prevdist >= 0 ? SIDE_FRONT : SIDE_BACK; - i = 0; - outpoints = 0; - goto begin; - for (;i < inpoints;i++) - { - prevpoint = in; - prevdist = dist; - prevside = side; - (qbyte *)in += stride; - -begin: - dist = DotProduct(in, plane->normal) - plane->dist; - side = dist >= 0 ? SIDE_FRONT : SIDE_BACK; - - if (prevside == SIDE_FRONT) - { - VectorCopy(prevpoint, out); - out += 3; - outpoints++; - if (side == SIDE_FRONT) - continue; - } - else if (side == SIDE_BACK) - continue; - - // generate a split point - dot = prevdist / (prevdist - dist); - out[0] = prevpoint[0] + dot * (in[0] - prevpoint[0]); - out[1] = prevpoint[1] + dot * (in[1] - prevpoint[1]); - out[2] = prevpoint[2] + dot * (in[2] - prevpoint[2]); - out += 3; - outpoints++; - } - - return outpoints; -} - -float tempverts[256][3]; -float tempverts2[256][3]; -float screenverts[256][3]; - -// LordHavoc: this code is based primarily on the ddjzsort code - -// Clips polygon to view frustum and nearclip, transforms polygon to viewspace, perspective projects polygon to screenspace, -// and adds polygon's edges to the global edge table. -void R_Clip_AddPolygon (vec_t *points, int numverts, int stride, int solid, void (*callback)(void *nativedata, void *nativedata2), void *nativedata, void *nativedata2, tinyplane_t *polyplane) -{ - float deltax, deltay, vx, vy, vz, fx; - int i, j, k, nextvert, temp, topy, bottomy, height, addededges; - clipedge_t *pedge; - tinyplane_t localplane; - float distinv; - - if (polyplane == NULL) - { - polyplane = &localplane; - // calculate the plane for the polygon - if (!R_Clip_TriangleToPlane((float *) points, (float *) ((qbyte *)points + stride), (float *) ((qbyte *)points + 2 * stride), polyplane)) - { - for (i = 0;i < numverts;i++) - for (j = i + 1;j < numverts;j++) - for (k = j + 1;k < numverts;k++) - if (R_Clip_TriangleToPlane((float *) ((qbyte *)points + i * stride), (float *) ((qbyte *)points + j * stride), (float *) ((qbyte *)points + k * stride), polyplane)) - goto valid1; - return; // gave up - valid1:; - } - - // caller hasn't checked if this polygon faces the view, so we have to check - if (DotProduct(r_origin, polyplane->normal) < (polyplane->dist + 0.5f)) - return; - } - - // for adaptive limits - needededges += numverts; - neededsurfs++; - - if (pavailsurf >= clipsurfsend) - return; - - // clip to view frustum and nearclip - if (numverts < 3) return;numverts = R_Clip_ClipPolygonToPlane(points , tempverts2[0], numverts, stride, &r_clip_viewplane[0]); - if (numverts < 3) return;numverts = R_Clip_ClipPolygonToPlane(tempverts2[0], tempverts[0], numverts, sizeof(float) * 3, &r_clip_viewplane[1]); - if (numverts < 3) return;numverts = R_Clip_ClipPolygonToPlane(tempverts[0], tempverts2[0], numverts, sizeof(float) * 3, &r_clip_viewplane[2]); - if (numverts < 3) return;numverts = R_Clip_ClipPolygonToPlane(tempverts2[0], tempverts[0], numverts, sizeof(float) * 3, &r_clip_viewplane[3]); - if (numverts < 3) return;numverts = R_Clip_ClipPolygonToPlane(tempverts[0], tempverts2[0], numverts, sizeof(float) * 3, &r_clip_viewplane[4]); - if (numverts < 3) - return; - if (numverts > 256) - Sys_Error("R_Clip_AddPolygon: polygon exceeded 256 vertex buffer\n"); - - // it survived the clipping, transform to viewspace and project to screenspace - - if (pavailedge + numverts > clipedgesend) - return; - - for (i = 0;i < numverts;i++) - { - vx = tempverts2[i][0] - r_origin[0]; - vy = tempverts2[i][1] - r_origin[1]; - vz = tempverts2[i][2] - r_origin[2]; - screenverts[i][2] = 1.0f / (r_clip_viewmatrix[2][0] * vx + r_clip_viewmatrix[2][1] * vy + r_clip_viewmatrix[2][2] * vz); - screenverts[i][0] = (r_clip_viewmatrix[0][0] * vx + r_clip_viewmatrix[0][1] * vy + r_clip_viewmatrix[0][2] * vz) * r_clip_viewmulx * screenverts[i][2] + r_clip_viewcenterx; - screenverts[i][1] = (r_clip_viewmatrix[1][0] * vx + r_clip_viewmatrix[1][1] * vy + r_clip_viewmatrix[1][2] * vz) * r_clip_viewmuly * screenverts[i][2] + r_clip_viewcentery; - } - - // calculate the plane for the polygon - if (!R_Clip_TriangleToPlane(screenverts[0], screenverts[1], screenverts[2], &localplane)) - { - for (i = 0;i < numverts;i++) - for (j = i + 1;j < numverts;j++) - for (k = j + 1;k < numverts;k++) - if (R_Clip_TriangleToPlane(screenverts[i], screenverts[j], screenverts[k], &localplane)) - goto valid; - return; // gave up -valid:; - } - - // Set up the 1/z gradients from the polygon, calculating the - // base value at screen coordinate 0,0 so we can use screen - // coordinates directly when calculating 1/z from the gradients - distinv = 1.0f / localplane.normal[2]; - pavailsurf->wstepx = -(localplane.normal[0] * distinv); - pavailsurf->wstepy = -(localplane.normal[1] * distinv); - pavailsurf->w00 = localplane.dist * distinv; - - addededges = false; - - // Add each edge in turn - for (i = 0;i < numverts;i++) - { - nextvert = i + 1; - if (nextvert >= numverts) - nextvert = 0; - - topy = (int)ceil(screenverts[i][1]); - bottomy = (int)ceil(screenverts[nextvert][1]); - height = bottomy - topy; - if (height == 0) - continue; // doesn't cross any scan lines - if (height < 0) - { - // Leading edge - temp = topy; - topy = bottomy; - bottomy = temp; - if (topy < 0) - topy = 0; - if (bottomy > clipheight) - bottomy = clipheight; - if (topy >= bottomy) - continue; - - pavailedge->leading = 1; - - deltax = screenverts[i][0] - screenverts[nextvert][0]; - deltay = screenverts[i][1] - screenverts[nextvert][1]; - - pavailedge->realxstep = deltax / deltay; - pavailedge->realx = screenverts[nextvert][0] + ((float)topy - screenverts[nextvert][1]) * pavailedge->realxstep; - } - else - { - // Trailing edge - if (topy < 0) - topy = 0; - if (bottomy > clipheight) - bottomy = clipheight; - if (topy >= bottomy) - continue; - - pavailedge->leading = 0; - - deltax = screenverts[nextvert][0] - screenverts[i][0]; - deltay = screenverts[nextvert][1] - screenverts[i][1]; - - pavailedge->realxstep = deltax / deltay; - pavailedge->realx = screenverts[i][0] + ((float)topy - screenverts[i][1]) * pavailedge->realxstep; - } - - // Put the edge on the list to be added on top scan - fx = pavailedge->x = bound(0.0f, pavailedge->realx, clipwidth - 0.5f); - pedge = &newedges[topy]; - while (fx > pedge->next->x) - pedge = pedge->next; - pavailedge->next = pedge->next; - pedge->next = pavailedge; - - // Put the edge on the list to be removed after final scan - pavailedge->nextremove = removeedges[bottomy - 1]; - removeedges[bottomy - 1] = pavailedge; - - // Associate the edge with the surface - pavailedge->psurf = pavailsurf; - - pavailedge++; - - addededges = true; - } - - if (!addededges) - return; - - // Create the surface, so we'll know how to sort and draw from the edges - pavailsurf->next = NULL; - pavailsurf->prev = NULL; - pavailsurf->state = 0; - pavailsurf->visible = false; - pavailsurf->callback = callback; - pavailsurf->nativedata = nativedata; - pavailsurf->nativedata2 = nativedata2; - pavailsurf->solid = solid; - pavailsurf->removed = false; - pavailsurf++; -} - -// Scan all the edges in the global edge table into spans. -void ScanEdges (void) -{ - int y, rescan; - float fx, fy, w, w2, clipwidthf = clipwidth - 0.5f; - clipedge_t *pedge, *pedge2, *ptemp; - clipsurf_t *psurf, *psurf2; -#if CLIPTEST - int x, x2; - float zi; - clippixel_t *cb; -#endif - float cx; - - // Set up the active edge list as initially empty, containing - // only the sentinels (which are also the background fill). Most - // of these fields could be set up just once at start-up - edgehead.next = &edgetail; - edgehead.prev = NULL; - edgehead.x = edgehead.realx = -0.9999f; // left edge of screen - edgehead.realxstep = 0; - edgehead.leading = 1; - edgehead.psurf = &surfstack; - - edgetail.next = NULL; // mark end of list - edgetail.prev = &edgehead; - edgetail.x = edgetail.realx = clipwidth + 0.5f; // right edge of screen - edgetail.realxstep = 0; - edgetail.leading = 0; - edgetail.psurf = &surfstack; - - // The background surface is the entire stack initially, and - // is infinitely far away, so everything sorts in front of it. - // This could be set just once at start-up - surfstack.solid = true; - surfstack.visible = true; // no callback - surfstack.next = surfstack.prev = &surfstack; - surfstack.wcurrent = surfstack.w00 = -999999.0; - surfstack.wstepx = surfstack.wstepy = 0.0; - surfstack.removed = false; - - // rescan causes the edges to be compared at the span level - // it is false if the scanline will be identical to the previous - rescan = true; - for (y = 0;y < clipheight;y++) - { - fy = y; -#if CLIPTEST - cb = clipbuffer + y * clipwidth; -#endif - - // Sort in any edges that start on this scan - if (newedges[y].next != &maxedge) - { - rescan = true; - pedge = newedges[y].next; - pedge2 = &edgehead; - while (pedge != &maxedge) - { - if (pedge->psurf->removed) - { - pedge = pedge->next; - continue; - } - - while (pedge->x > pedge2->next->x) - pedge2 = pedge2->next; - - ptemp = pedge->next; - pedge->next = pedge2->next; - pedge->prev = pedge2; - pedge2->next->prev = pedge; - pedge2->next = pedge; - - pedge2 = pedge; - pedge = ptemp; - } - } - - // Scan out the active edges into spans - - // Start out with the left background edge already inserted, and the surface stack containing only the background - surfstack.state = 1; - cx = 0; - - // must always rescan if rendering to wbuffer -#ifndef CLIPTEST -// if (rescan) -#endif - { - for (pedge = edgehead.next;pedge;pedge = pedge->next) - { - edgeremoved: - psurf = pedge->psurf; - if (psurf->removed) - { - pedge2 = pedge->next; - pedge->prev->next = pedge->next; - pedge->next->prev = pedge->prev; - pedge->next = pedge->prev = pedge; - pedge = pedge2; - if (pedge) - goto edgeremoved; - else - break; - } - - if (pedge->leading) - { - // It's a leading edge. Figure out where it is - // relative to the current surfaces and insert in - // the surface stack; if it's on top, emit the span - // for the current top. - // First, make sure the edges don't cross - if (++psurf->state == 1) - { - fx = pedge->x; - // Calculate the surface's 1/z value at this pixel, and cache the y depth for quick compares later - w = (psurf->wcurrent = psurf->w00 + psurf->wstepy * fy) + psurf->wstepx * fx; - - // See if that makes it a new top surface - psurf2 = surfstack.next; - w2 = psurf2->wcurrent + psurf2->wstepx * fx; - - if (w >= w2) - { - // It's a new top surface - // emit the span for the current top - if (fx > cx && !psurf2->visible) - { - psurf2->visible = true; - psurf2->callback(psurf2->nativedata, psurf2->nativedata2); - } - -#if CLIPTEST - for (x = ceil(cx), x2 = ceil(fx) >= clipwidth ? clipwidth : ceil(fx), zi = psurf2->wcurrent + psurf2->wstepx * x;x < x2;x++, zi += psurf2->wstepx) - cb[x].w = zi; -#endif - - cx = fx; - - // Add the edge to the stack - psurf->next = psurf2; - psurf2->prev = psurf; - surfstack.next = psurf; - psurf->prev = &surfstack; - } - else - { - // Not a new top; sort into the surface stack. - // Guaranteed to terminate due to sentinel background surface - do - { - psurf2 = psurf2->next; - w2 = psurf2->wcurrent + psurf2->wstepx * fx; - } - while (w < w2); - - // Insert the surface into the stack - psurf->next = psurf2; - psurf->prev = psurf2->prev; - psurf2->prev->next = psurf; - psurf2->prev = psurf; - } - } - } - else - { - // It's a trailing edge; if this was the top surface, - // emit the span and remove it. - // First, make sure the edges didn't cross - if (--psurf->state == 0) - { - if (surfstack.next == psurf) - { - fx = pedge->x; - - // It's on top, emit the span - if (fx > cx && !psurf->visible) - { - psurf->visible = true; - psurf->callback(psurf->nativedata, psurf->nativedata2); - } - -#if CLIPTEST - fx = pedge->x; - for (x = ceil(cx), x2 = ceil(fx) >= clipwidth ? clipwidth : ceil(fx), zi = psurf->w00 + psurf->wstepx * x + psurf->wstepy * fy;x < x2;x++, zi += psurf->wstepx) - cb[x].w = zi; -#endif - - cx = fx; - } - - // Remove the surface from the stack - psurf->next->prev = psurf->prev; - psurf->prev->next = psurf->next; - } - } - - // mark and remove all non-solid surfaces that are ontop - while (!surfstack.next->solid) - { - psurf = surfstack.next; - if (!psurf->visible) - { - psurf->visible = true; - psurf->callback(psurf->nativedata, psurf->nativedata2); - } - psurf->removed = true; - psurf->next->prev = psurf->prev; - psurf->prev->next = psurf->next; - // isolate the surface - psurf->next = psurf->prev = psurf; - } - } - rescan = false; - } - - // Remove edges that are done - pedge = removeedges[y]; - if (pedge) - { - while (pedge) - { - if (!pedge->psurf->removed) - { - pedge->prev->next = pedge->next; - pedge->next->prev = pedge->prev; - if (pedge->psurf->visible) - rescan = true; - } - pedge = pedge->nextremove; - } - } - - // Step the remaining edges one scan line, and re-sort - for (pedge = edgehead.next;pedge != &edgetail;) - { - ptemp = pedge->next; - if (pedge->psurf->removed) - { - pedge->next->prev = pedge->prev; - pedge->prev->next = pedge->next; - pedge->next = pedge->prev = pedge; - pedge = ptemp; - continue; - } - - // Step the edge - if (pedge->realxstep) - { - pedge->realx += pedge->realxstep; - pedge->x = bound(0.0f, pedge->realx, clipwidthf); - } - fx = pedge->x; - - // Move the edge back to the proper sorted location, if necessary - while (fx < pedge->prev->x) - { - if (!rescan && (pedge->psurf->solid || pedge->prev->psurf->solid)) - rescan = true; - pedge2 = pedge->prev; - pedge2->next = pedge->next; - pedge->next->prev = pedge2; - pedge2->prev->next = pedge; - pedge->prev = pedge2->prev; - pedge->next = pedge2; - pedge2->prev = pedge; - } - - pedge = ptemp; - } - } -} - -void R_Clip_DisplayBuffer(void) -{ -} - -float boxpoints[4*3]; - -#define R_Clip_MinsBoxPolygon(axis, axisvalue, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, callback, nativedata, nativedata2, plane) \ -{\ - if (r_origin[(axis)] < ((axisvalue) - 0.5f))\ - {\ - (plane)->dist = -axisvalue;\ - boxpoints[ 0] = x1;boxpoints[ 1] = y1;boxpoints[ 2] = z1;\ - boxpoints[ 3] = x2;boxpoints[ 4] = y2;boxpoints[ 5] = z2;\ - boxpoints[ 6] = x3;boxpoints[ 7] = y3;boxpoints[ 8] = z3;\ - boxpoints[ 9] = x4;boxpoints[10] = y4;boxpoints[11] = z4;\ - R_Clip_AddPolygon (boxpoints, 4, sizeof(float[3]), false, callback, nativedata, nativedata2, plane);\ - }\ -} - -#define R_Clip_MaxsBoxPolygon(axis, axisvalue, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, callback, nativedata, nativedata2, plane) \ -{\ - if (r_origin[(axis)] > ((axisvalue) + 0.5f))\ - {\ - (plane)->dist = axisvalue;\ - boxpoints[ 0] = x1;boxpoints[ 1] = y1;boxpoints[ 2] = z1;\ - boxpoints[ 3] = x2;boxpoints[ 4] = y2;boxpoints[ 5] = z2;\ - boxpoints[ 6] = x3;boxpoints[ 7] = y3;boxpoints[ 8] = z3;\ - boxpoints[ 9] = x4;boxpoints[10] = y4;boxpoints[11] = z4;\ - R_Clip_AddPolygon (boxpoints, 4, sizeof(float[3]), false, callback, nativedata, nativedata2, plane);\ - }\ -} - -tinyplane_t clipboxplane[6] = -{ - {{-1, 0, 0}, 0}, - {{ 1, 0, 0}, 0}, - {{ 0, -1, 0}, 0}, - {{ 0, 1, 0}, 0}, - {{ 0, 0, -1}, 0}, - {{ 0, 0, 1}, 0}, -}; - -void R_Clip_AddBox(float *a, float *b, void (*callback)(void *nativedata, void *nativedata2), void *nativedata, void *nativedata2) -{ - if (r_origin[0] >= (a[0] - 5.0f) && r_origin[0] < (b[0] + 5.0f) - && r_origin[1] >= (a[1] - 5.0f) && r_origin[1] < (b[1] + 5.0f) - && r_origin[2] >= (a[2] - 5.0f) && r_origin[2] < (b[2] + 5.0f)) - { - callback(nativedata, nativedata2); - return; - } - - if (R_CullBox(a, b)) - return; - - R_Clip_MinsBoxPolygon - ( - 0, a[0], - a[0], a[1], a[2], - a[0], b[1], a[2], - a[0], b[1], b[2], - a[0], a[1], b[2], - callback, nativedata, nativedata2, &clipboxplane[0] - ); - R_Clip_MaxsBoxPolygon - ( - 0, b[0], - b[0], b[1], a[2], - b[0], a[1], a[2], - b[0], a[1], b[2], - b[0], b[1], b[2], - callback, nativedata, nativedata2, &clipboxplane[1] - ); - R_Clip_MinsBoxPolygon - ( - 1, a[1], - b[0], a[1], a[2], - a[0], a[1], a[2], - a[0], a[1], b[2], - b[0], a[1], b[2], - callback, nativedata, nativedata2, &clipboxplane[2] - ); - R_Clip_MaxsBoxPolygon - ( - 1, b[1], - a[0], b[1], a[2], - b[0], b[1], a[2], - b[0], b[1], b[2], - a[0], b[1], b[2], - callback, nativedata, nativedata2, &clipboxplane[3] - ); - R_Clip_MinsBoxPolygon - ( - 2, a[2], - a[0], a[1], a[2], - b[0], a[1], a[2], - b[0], b[1], a[2], - a[0], b[1], a[2], - callback, nativedata, nativedata2, &clipboxplane[4] - ); - R_Clip_MaxsBoxPolygon - ( - 2, b[2], - b[0], a[1], b[2], - a[0], a[1], b[2], - a[0], b[1], b[2], - b[0], b[1], b[2], - callback, nativedata, nativedata2, &clipboxplane[5] - ); -} - diff --git a/r_clip.h b/r_clip.h deleted file mode 100644 index d9457034..00000000 --- a/r_clip.h +++ /dev/null @@ -1,18 +0,0 @@ - -#ifndef R_CLIP_H -#define R_CLIP_H - -void R_Clip_StartFrame(void); -void R_Clip_EndFrame(void); -// This takes a polygon in the form of vec_t triplets, at a caller specified -// stride (structure size), it can be solid (obscures other geometry) or not, -// a callback and two parameters must be provided (will be called if it is -// determined visible), and a plane can be provided (this also indicates that -// the surface is not a backface, so if a plane is provided, the caller must -// check that it is not a backface, it is not likely to be fatal if the caller -// does not, but it is inadvisable) -void R_Clip_AddPolygon (vec_t *points, int numverts, int stride, int solid, void (*callback)(void *nativedata, void *nativedata2), void *nativedata, void *nativedata2, tinyplane_t *polyplane); -void R_Clip_AddBox(float *mins, float *maxs, void (*callback)(void *nativedata, void *nativedata2), void *nativedata, void *nativedata2); - -#endif - diff --git a/r_sprites.c b/r_sprites.c index 37d870c2..f7e8a8e2 100644 --- a/r_sprites.c +++ b/r_sprites.c @@ -3,61 +3,7 @@ #define LERPSPRITES -#ifdef LERPSPRITES -void R_ClipSpriteImage (vec3_t origin, vec3_t left, vec3_t up) -{ - int i; - mspriteframe_t *frame; - vec3_t points[4]; - float fleft, fright, fdown, fup; - frame = currentrenderentity->model->sprdata_frames + currentrenderentity->frameblend[0].frame; - fleft = frame->left; - fdown = frame->down; - fright = frame->right; - fup = frame->up; - for (i = 1;i < 4 && currentrenderentity->frameblend[i].lerp;i++) - { - frame = currentrenderentity->model->sprdata_frames + currentrenderentity->frameblend[i].frame; - fleft = min(fleft , frame->left ); - fdown = min(fdown , frame->down ); - fright = max(fright, frame->right); - fup = max(fup , frame->up ); - } - // FIXME: reverse these in loader to save time - fleft = -fleft; - fright = -fright; - points[0][0] = origin[0] + fdown * up[0] + fleft * left[0];points[0][1] = origin[1] + fdown * up[1] + fleft * left[1];points[0][2] = origin[2] + fdown * up[2] + fleft * left[2]; - points[1][0] = origin[0] + fup * up[0] + fleft * left[0];points[1][1] = origin[1] + fup * up[1] + fleft * left[1];points[1][2] = origin[2] + fup * up[2] + fleft * left[2]; - points[2][0] = origin[0] + fup * up[0] + fright * left[0];points[2][1] = origin[1] + fup * up[1] + fright * left[1];points[2][2] = origin[2] + fup * up[2] + fright * left[2]; - points[3][0] = origin[0] + fdown * up[0] + fright * left[0];points[3][1] = origin[1] + fdown * up[1] + fright * left[1];points[3][2] = origin[2] + fdown * up[2] + fright * left[2]; - R_Clip_AddPolygon(&points[0][0], 4, sizeof(float[3]), false, R_Entity_Callback, currentrenderentity, NULL, NULL); -} -#else -void R_ClipSpriteImage (vec3_t origin, vec3_t left, vec3_t up) -{ - int i; - mspriteframe_t *frame; - vec3_t points[4]; - float fleft, fright, fdown, fup; - frame = NULL; - for (i = 0;i < 4 && currentrenderentity->frameblend[i].lerp;i++) - frame = currentrenderentity->model->sprdata_frames + currentrenderentity->frameblend[i].frame; - fleft = frame->left; - fdown = frame->down; - fright = frame->right; - fup = frame->up; - // FIXME: reverse these in loader to save time - fleft = -fleft; - fright = -fright; - points[0][0] = origin[0] + fdown * up[0] + fleft * left[0];points[0][1] = origin[1] + fdown * up[1] + fleft * left[1];points[0][2] = origin[2] + fdown * up[2] + fleft * left[2]; - points[1][0] = origin[0] + fup * up[0] + fleft * left[0];points[1][1] = origin[1] + fup * up[1] + fleft * left[1];points[1][2] = origin[2] + fup * up[2] + fleft * left[2]; - points[2][0] = origin[0] + fup * up[0] + fright * left[0];points[2][1] = origin[1] + fup * up[1] + fright * left[1];points[2][2] = origin[2] + fup * up[2] + fright * left[2]; - points[3][0] = origin[0] + fdown * up[0] + fright * left[0];points[3][1] = origin[1] + fdown * up[1] + fright * left[1];points[3][2] = origin[2] + fdown * up[2] + fright * left[2]; - R_Clip_AddPolygon(&points[0][0], 4, sizeof(float[3]), false, R_Entity_Callback, currentrenderentity, NULL, NULL); -} -#endif - -int R_SpriteSetup (int type, float org[3], float left[3], float up[3]) +static int R_SpriteSetup (int type, float org[3], float left[3], float up[3]) { float matrix1[3][3], matrix2[3][3], matrix3[3][3]; @@ -132,23 +78,9 @@ int R_SpriteSetup (int type, float org[3], float left[3], float up[3]) return false; } -void R_ClipSprite (void) -{ - vec3_t org, left, up; - - if (currentrenderentity->frameblend[0].frame < 0) - return; - - if (R_SpriteSetup(currentrenderentity->model->sprnum_type, org, left, up)) - return; - - // LordHavoc: interpolated sprite rendering - R_ClipSpriteImage(org, left, up); -} - -int spritepolyindex[6] = {0, 1, 2, 0, 2, 3}; +static int spritepolyindex[6] = {0, 1, 2, 0, 2, 3}; -void GL_DrawSpriteImage (int fog, mspriteframe_t *frame, int texture, vec3_t origin, vec3_t up, vec3_t left, float red, float green, float blue, float alpha) +static void GL_DrawSpriteImage (int fog, mspriteframe_t *frame, int texture, vec3_t origin, vec3_t up, vec3_t left, float red, float green, float blue, float alpha) { rmeshinfo_t m; float v[4][4], st[4][2]; diff --git a/render.h b/render.h index a98e07d3..a1f175a1 100644 --- a/render.h +++ b/render.h @@ -114,8 +114,6 @@ void R_DrawPortals(void); void R_DrawParticles(void); void R_DrawExplosions(void); -#include "r_clip.h" - // LordHavoc: vertex transform #include "transform.h" @@ -145,11 +143,7 @@ void R_DrawBrushModelNormal (void); void R_DrawAliasModel (void); void R_DrawSpriteModel (void); -void R_ClipSprite (void); -void R_Entity_Callback(void *data, void *junk); - extern cvar_t r_render; -extern cvar_t r_ser; #include "image.h" extern cvar_t r_multitexture; -- 2.39.2