Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Hanicef/SRB2Classic
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Jisk/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
118 results
Select Git revision
Show changes
Commits on Source (5)
...@@ -8,10 +8,11 @@ ...@@ -8,10 +8,11 @@
#include "utils/Log.h" #include "utils/Log.h"
rendermode_t rendermode = render_soft; rendermode_t rendermode = render_software;
rendermode_t chosenrendermode = render_none; rendermode_t chosenrendermode = render_none;
boolean highcolor = false; boolean highcolor = false;
boolean truecolor = false;
boolean allow_fullscreen = false; boolean allow_fullscreen = false;
...@@ -53,6 +54,16 @@ INT32 VID_SetMode(INT32 modenum) ...@@ -53,6 +54,16 @@ INT32 VID_SetMode(INT32 modenum)
return 0; return 0;
} }
boolean VID_IsASoftwareRenderer(rendermode_t mode)
{
return (mode == render_software);
}
boolean VID_InSoftwareRenderer(void)
{
return VID_IsASoftwareRenderer(rendermode);
}
boolean VID_CheckRenderer(void) boolean VID_CheckRenderer(void)
{ {
return false; return false;
......
...@@ -333,7 +333,7 @@ static void D_Display(void) ...@@ -333,7 +333,7 @@ static void D_Display(void)
SCR_Recalc(); // NOTE! setsizeneeded is set by SCR_Recalc() SCR_Recalc(); // NOTE! setsizeneeded is set by SCR_Recalc()
// View morph // View morph
if (rendermode == render_soft && !splitscreen) if (VID_InSoftwareRenderer() && !splitscreen)
R_CheckViewMorph(); R_CheckViewMorph();
// Change the view size if needed // Change the view size if needed
...@@ -475,20 +475,28 @@ static void D_Display(void) ...@@ -475,20 +475,28 @@ static void D_Display(void)
if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide && (!hidetitlemap))) if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide && (!hidetitlemap)))
{ {
// draw the view directly // draw the view directly
if (!automapactive && !dedicated && cv_renderview.value) if (!automapactive && !dedicated && cv_renderview.value)
{ {
SCR_SetSoftwareTranslucency(); // Set translucency method
if (!usetranstables)
R_InitAlphaLUT();
R_ApplyLevelInterpolators(R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT); R_ApplyLevelInterpolators(R_UsingFrameInterpolation() ? rendertimefrac : FRACUNIT);
PS_START_TIMING(ps_rendercalltime); PS_START_TIMING(ps_rendercalltime);
if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD) if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
{ {
topleft = screens[0] + viewwindowy*vid.width + viewwindowx; topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
#ifdef TRUECOLOR
if (truecolor)
topleft_u32 = (UINT32 *)screens[0] + viewwindowy*vid.width + viewwindowx;
#endif
objectsdrawn = 0; objectsdrawn = 0;
#ifdef HWRENDER #ifdef HWRENDER
if (rendermode != render_soft) if (!VID_InSoftwareRenderer())
HWR_RenderPlayerView(0, &players[displayplayer]); HWR_RenderPlayerView(0, &players[displayplayer]);
else else
#endif #endif
if (rendermode != render_none) if (rendermode != render_none)
R_RenderPlayerView(&players[displayplayer]); R_RenderPlayerView(&players[displayplayer]);
} }
...@@ -496,17 +504,21 @@ static void D_Display(void) ...@@ -496,17 +504,21 @@ static void D_Display(void)
// render the second screen // render the second screen
if (splitscreen && players[secondarydisplayplayer].mo) if (splitscreen && players[secondarydisplayplayer].mo)
{ {
#ifdef HWRENDER #ifdef HWRENDER
if (rendermode != render_soft) if (!VID_InSoftwareRenderer())
HWR_RenderPlayerView(1, &players[secondarydisplayplayer]); HWR_RenderPlayerView(1, &players[secondarydisplayplayer]);
else else
#endif #endif
if (rendermode != render_none) if (rendermode != render_none)
{ {
viewwindowy = vid.height / 2; viewwindowy = vid.height / 2;
M_Memcpy(ylookup, ylookup2, viewheight*sizeof (ylookup[0])); M_Memcpy(ylookup, ylookup2, viewheight*sizeof (ylookup[0]));
topleft = screens[0] + viewwindowy*vid.width + viewwindowx; topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
#ifdef TRUECOLOR
if (truecolor)
topleft_u32 = (UINT32 *)screens[0] + viewwindowy*vid.width + viewwindowx;
#endif
R_RenderPlayerView(&players[secondarydisplayplayer]); R_RenderPlayerView(&players[secondarydisplayplayer]);
...@@ -516,7 +528,7 @@ static void D_Display(void) ...@@ -516,7 +528,7 @@ static void D_Display(void)
} }
// Image postprocessing effect // Image postprocessing effect
if (rendermode == render_soft) if (VID_InSoftwareRenderer())
{ {
if (!splitscreen) if (!splitscreen)
R_ApplyViewMorph(); R_ApplyViewMorph();
...@@ -532,7 +544,7 @@ static void D_Display(void) ...@@ -532,7 +544,7 @@ static void D_Display(void)
if (lastdraw) if (lastdraw)
{ {
if (rendermode == render_soft) if (VID_InSoftwareRenderer())
{ {
VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes);
Y_ConsiderScreenBuffer(); Y_ConsiderScreenBuffer();
...@@ -688,6 +700,26 @@ static void D_Display(void) ...@@ -688,6 +700,26 @@ static void D_Display(void)
} }
} }
void D_CheckColorDepth(INT32 newbitdepth, INT32 oldbitdepth)
{
#ifdef TRUECOLOR
if (oldbitdepth == 0) // Video init
return;
if (newbitdepth != oldbitdepth)
{
// Reload every texture.
R_FlushTextureCache();
// Also free levelflat pictures.
R_ClearLevelFlats();
}
#else
(void)newbitdepth;
(void)oldbitdepth;
#endif
}
// ========================================================================= // =========================================================================
// D_SRB2Loop // D_SRB2Loop
// ========================================================================= // =========================================================================
......
...@@ -47,6 +47,12 @@ const char *D_Home(void); ...@@ -47,6 +47,12 @@ const char *D_Home(void);
boolean D_IsPathAllowed(const char *path); boolean D_IsPathAllowed(const char *path);
boolean D_CheckPathAllowed(const char *path, const char *why); boolean D_CheckPathAllowed(const char *path, const char *why);
//
// RENDERER STATE
//
void D_CheckRendererState(void);
void D_CheckColorDepth(INT32 newbitdepth, INT32 oldbitdepth);
// //
// BASE LEVEL // BASE LEVEL
// //
......
...@@ -2837,7 +2837,6 @@ void readsound(MYFILE *f, INT32 num) ...@@ -2837,7 +2837,6 @@ void readsound(MYFILE *f, INT32 num)
tmp = strchr(s, '\n'); tmp = strchr(s, '\n');
if (tmp) if (tmp)
*tmp = '\0'; *tmp = '\0';
tmp = strchr(s, '#'); tmp = strchr(s, '#');
if (tmp) if (tmp)
*tmp = '\0'; *tmp = '\0';
......
...@@ -659,6 +659,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch; ...@@ -659,6 +659,12 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
/// Render flats on walls /// Render flats on walls
#define WALLFLATS #define WALLFLATS
/// Software true color mode rendering
#ifndef NO_TRUECOLOR
#define TRUECOLOR
#endif
/// Maintain compatibility with older 2.2 demos /// Maintain compatibility with older 2.2 demos
#define OLD22DEMOCOMPAT #define OLD22DEMOCOMPAT
......
...@@ -6,6 +6,7 @@ rendermode_t rendermode = render_none; ...@@ -6,6 +6,7 @@ rendermode_t rendermode = render_none;
rendermode_t chosenrendermode = render_none; rendermode_t chosenrendermode = render_none;
boolean highcolor = false; boolean highcolor = false;
boolean truecolor = false;
boolean allow_fullscreen = false; boolean allow_fullscreen = false;
...@@ -41,6 +42,17 @@ INT32 VID_SetMode(INT32 modenum) ...@@ -41,6 +42,17 @@ INT32 VID_SetMode(INT32 modenum)
return 0; return 0;
} }
boolean VID_IsASoftwareRenderer(rendermode_t mode)
{
(void)mode;
return false;
}
boolean VID_InSoftwareRenderer(void)
{
return false;
}
boolean VID_CheckRenderer(void) boolean VID_CheckRenderer(void)
{ {
return false; return false;
......
This diff is collapsed.
...@@ -2501,7 +2501,7 @@ static inline void G_PlayerFinishLevel(INT32 player) ...@@ -2501,7 +2501,7 @@ static inline void G_PlayerFinishLevel(INT32 player)
p->starpostz = 0; p->starpostz = 0;
p->starpostnum = 0; p->starpostnum = 0;
if (rendermode == render_soft) if (VID_InSoftwareRenderer())
V_SetPaletteLump(GetPalette()); // Reset the palette V_SetPaletteLump(GetPalette()); // Reset the palette
} }
......
This diff is collapsed.
...@@ -84,6 +84,7 @@ typedef struct GLMapTexture_s GLMapTexture_t; ...@@ -84,6 +84,7 @@ typedef struct GLMapTexture_s GLMapTexture_t;
struct GLPatch_s struct GLPatch_s
{ {
GLMipmap_t *mipmap; // Texture data. Allocated whenever the patch is. GLMipmap_t *mipmap; // Texture data. Allocated whenever the patch is.
int picfmt;
float max_s, max_t; float max_s, max_t;
}; };
typedef struct GLPatch_s GLPatch_t; typedef struct GLPatch_s GLPatch_t;
......
...@@ -82,7 +82,7 @@ typedef struct gl_vissprite_s ...@@ -82,7 +82,7 @@ typedef struct gl_vissprite_s
boolean flip, vflip; boolean flip, vflip;
boolean precip; // Tails 08-25-2002 boolean precip; // Tails 08-25-2002
boolean rotated; boolean rotated;
UINT8 translucency; //alpha level 0-255 boolean translucent;
angle_t angle; // for splats angle_t angle; // for splats
...@@ -92,6 +92,9 @@ typedef struct gl_vissprite_s ...@@ -92,6 +92,9 @@ typedef struct gl_vissprite_s
patch_t *gpatch; patch_t *gpatch;
mobj_t *mobj; // NOTE: This is a precipmobj_t if precip is true !!! Watch out. mobj_t *mobj; // NOTE: This is a precipmobj_t if precip is true !!! Watch out.
INT32 blendmode;
INT32 alpha;
} gl_vissprite_t; } gl_vissprite_t;
// -------- // --------
......
...@@ -704,36 +704,15 @@ FBITFIELD HWR_GetBlendModeFlag(INT32 style) ...@@ -704,36 +704,15 @@ FBITFIELD HWR_GetBlendModeFlag(INT32 style)
} }
} }
UINT8 HWR_GetTranstableAlpha(INT32 transtablenum) FBITFIELD HWR_SurfaceBlend(INT32 style, INT32 alpha, FSurfaceInfo *pSurf)
{ {
transtablenum = max(min(transtablenum, tr_trans90), 0); if (style <= AST_COPY || style >= AST_OVERLAY)
switch (transtablenum)
{
case 0 : return 0xff;
case tr_trans10 : return 0xe6;
case tr_trans20 : return 0xcc;
case tr_trans30 : return 0xb3;
case tr_trans40 : return 0x99;
case tr_trans50 : return 0x80;
case tr_trans60 : return 0x66;
case tr_trans70 : return 0x4c;
case tr_trans80 : return 0x33;
case tr_trans90 : return 0x19;
}
return 0xff;
}
FBITFIELD HWR_SurfaceBlend(INT32 style, INT32 transtablenum, FSurfaceInfo *pSurf)
{
if (!transtablenum || style <= AST_COPY || style >= AST_OVERLAY)
{ {
pSurf->PolyColor.s.alpha = 0xff; pSurf->PolyColor.s.alpha = 0xff;
return PF_Masked; return PF_Masked;
} }
pSurf->PolyColor.s.alpha = HWR_GetTranstableAlpha(transtablenum); pSurf->PolyColor.s.alpha = alpha;
return HWR_GetBlendModeFlag(style); return HWR_GetBlendModeFlag(style);
} }
...@@ -745,7 +724,7 @@ FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf) ...@@ -745,7 +724,7 @@ FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf)
return PF_Masked; return PF_Masked;
} }
pSurf->PolyColor.s.alpha = HWR_GetTranstableAlpha(transtablenum); pSurf->PolyColor.s.alpha = R_TransnumToAlpha(transtablenum);
return PF_Translucent; return PF_Translucent;
} }
...@@ -3760,8 +3739,8 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) ...@@ -3760,8 +3739,8 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
FBITFIELD blend = 0; FBITFIELD blend = 0;
FBITFIELD occlusion; FBITFIELD occlusion;
INT32 shader = SHADER_DEFAULT; INT32 shader = SHADER_DEFAULT;
INT32 alpha;
boolean use_linkdraw_hack = false; boolean use_linkdraw_hack = false;
UINT8 alpha;
INT32 i; INT32 i;
float realtop, realbot, top, bot; float realtop, realbot, top, bot;
...@@ -3853,37 +3832,18 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) ...@@ -3853,37 +3832,18 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
else else
occlusion = PF_Occlude; occlusion = PF_Occlude;
INT32 blendmode; alpha = spr->alpha;
if (spr->mobj->frame & FF_BLENDMASK)
blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1;
else
blendmode = spr->mobj->blendmode;
if (!cv_translucency.value) // translucency disabled if (spr->translucent)
{
Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|occlusion;
if (!occlusion) use_linkdraw_hack = true;
}
else if (spr->mobj->flags2 & MF2_SHADOW)
{
Surf.PolyColor.s.alpha = 0x40;
blend = HWR_GetBlendModeFlag(blendmode);
}
else if (spr->mobj->frame & FF_TRANSMASK)
{ {
INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT; blend = HWR_SurfaceBlend(spr->blendmode, alpha, &Surf);
blend = HWR_SurfaceBlend(blendmode, trans, &Surf);
} }
else else
{ {
// BP: i agree that is little better in environement but it don't
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
Surf.PolyColor.s.alpha = 0xFF; Surf.PolyColor.s.alpha = 0xFF;
blend = HWR_GetBlendModeFlag(blendmode)|occlusion; blend = HWR_GetBlendModeFlag(spr->blendmode) | occlusion;
if (!occlusion) use_linkdraw_hack = true; if (!occlusion)
use_linkdraw_hack = true;
} }
if (HWR_UseShader()) if (HWR_UseShader())
...@@ -3892,8 +3852,6 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) ...@@ -3892,8 +3852,6 @@ static void HWR_SplitSprite(gl_vissprite_t *spr)
blend |= PF_ColorMapped; blend |= PF_ColorMapped;
} }
alpha = Surf.PolyColor.s.alpha;
// Start with the lightlevel and colormap from the top of the sprite // Start with the lightlevel and colormap from the top of the sprite
lightlevel = *list[sector->numlights - 1].lightlevel; lightlevel = *list[sector->numlights - 1].lightlevel;
if (!(spr->mobj->renderflags & RF_NOCOLORMAPS)) if (!(spr->mobj->renderflags & RF_NOCOLORMAPS))
...@@ -4297,49 +4255,16 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) ...@@ -4297,49 +4255,16 @@ static void HWR_DrawSprite(gl_vissprite_t *spr)
else else
occlusion = PF_Occlude; occlusion = PF_Occlude;
INT32 blendmode; if (spr->translucent)
if (spr->mobj->frame & FF_BLENDMASK)
blendmode = ((spr->mobj->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1;
else
blendmode = spr->mobj->blendmode;
if (!cv_translucency.value) // translucency disabled
{ {
Surf.PolyColor.s.alpha = 0xFF; blend = HWR_SurfaceBlend(spr->blendmode, spr->alpha, &Surf);
blend = PF_Translucent|occlusion;
if (!occlusion) use_linkdraw_hack = true;
}
else if (spr->mobj->flags2 & MF2_SHADOW)
{
Surf.PolyColor.s.alpha = 0x40;
blend = HWR_GetBlendModeFlag(blendmode);
}
else if (spr->mobj->frame & FF_TRANSMASK)
{
INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT;
blend = HWR_SurfaceBlend(blendmode, trans, &Surf);
} }
else else
{ {
// BP: i agree that is little better in environement but it don't
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
Surf.PolyColor.s.alpha = 0xFF; Surf.PolyColor.s.alpha = 0xFF;
blend = HWR_GetBlendModeFlag(blendmode)|occlusion; blend = HWR_GetBlendModeFlag(spr->blendmode) | occlusion;
if (!occlusion) use_linkdraw_hack = true; if (!occlusion)
} use_linkdraw_hack = true;
if (spr->renderflags & RF_SHADOWEFFECTS)
{
INT32 alpha = Surf.PolyColor.s.alpha;
alpha -= ((INT32)(spr->shadowheight / 4.0f)) + 75;
if (alpha < 1)
return;
Surf.PolyColor.s.alpha = (UINT8)(alpha);
blend = PF_Translucent|occlusion;
if (!occlusion) use_linkdraw_hack = true;
} }
if (HWR_UseShader()) if (HWR_UseShader())
...@@ -4433,19 +4358,14 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr) ...@@ -4433,19 +4358,14 @@ static inline void HWR_DrawPrecipitationSprite(gl_vissprite_t *spr)
HWR_Lighting(&Surf, lightlevel, colormap); HWR_Lighting(&Surf, lightlevel, colormap);
} }
if (spr->mobj->frame & FF_TRANSMASK) if (spr->translucent)
{ {
INT32 trans = (spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT; blend = HWR_SurfaceBlend(spr->blendmode, spr->alpha, &Surf);
blend = HWR_SurfaceBlend(AST_TRANSLUCENT, trans, &Surf);
} }
else else
{ {
// BP: i agree that is little better in environement but it don't
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
Surf.PolyColor.s.alpha = 0xFF; Surf.PolyColor.s.alpha = 0xFF;
blend = HWR_GetBlendModeFlag(spr->mobj->blendmode)|PF_Occlude; blend = HWR_GetBlendModeFlag(spr->blendmode);
} }
if (HWR_UseShader()) if (HWR_UseShader())
...@@ -4999,6 +4919,9 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -4999,6 +4919,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
boolean vflip = (!(thing->eflags & MFE_VERTICALFLIP) != !R_ThingVerticallyFlipped(thing)); boolean vflip = (!(thing->eflags & MFE_VERTICALFLIP) != !R_ThingVerticallyFlipped(thing));
boolean mirrored = thing->mirrored; boolean mirrored = thing->mirrored;
boolean hflip = (!R_ThingHorizontallyFlipped(thing) != !mirrored); boolean hflip = (!R_ThingHorizontallyFlipped(thing) != !mirrored);
INT32 blendmode, alpha = 255;
boolean translucent = false;
UINT32 trans;
INT32 dispoffset; INT32 dispoffset;
angle_t ang; angle_t ang;
...@@ -5020,22 +4943,32 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5020,22 +4943,32 @@ static void HWR_ProjectSprite(mobj_t *thing)
if (!thing) if (!thing)
return; return;
INT32 blendmode; // Get the blend mode
if (thing->frame & FF_BLENDMASK) if (thing->frame & FF_BLENDMASK)
blendmode = ((thing->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1; blendmode = ((thing->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1;
else else
blendmode = thing->blendmode; blendmode = min(max(AST_COPY, thing->blendmode), AST_OVERLAY);
// Visibility check by the blend mode. // Determine the translucency value.
if (thing->frame & FF_TRANSMASK) if (thing->flags2 & MF2_SHADOW) // actually only the player should use this (temporary invisibility)
trans = tr_trans80; // because now the translucency is set through FF_TRANSMASK
else if (thing->frame & FF_TRANSMASK)
trans = (thing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT;
else
trans = 0;
if (cv_translucency.value && blendmode != AST_COPY && blendmode != AST_OVERLAY)
{ {
if (!R_BlendLevelVisible(blendmode, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT)) alpha = thing->alpha - (0xFF - R_BlendModeTransnumToAlpha(blendmode, trans));
if (!R_BlendLevelVisible(blendmode, alpha))
return; return;
translucent = true;
} }
dispoffset = thing->dispoffset; dispoffset = thing->dispoffset;
if (R_UsingFrameInterpolation() && !paused) if (R_UsingFrameInterpolation() && !paused)
{ {
R_InterpolateMobjState(thing, rendertimefrac, &interp); R_InterpolateMobjState(thing, rendertimefrac, &interp);
...@@ -5261,12 +5194,22 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5261,12 +5194,22 @@ static void HWR_ProjectSprite(mobj_t *thing)
shadowheight = FIXED_TO_FLOAT(floordiff); shadowheight = FIXED_TO_FLOAT(floordiff);
shadowscale = FIXED_TO_FLOAT(FixedMul(FRACUNIT - floordiff/640, casterinterp.scale)); shadowscale = FIXED_TO_FLOAT(FixedMul(FRACUNIT - floordiff/640, casterinterp.scale));
if (translucent)
{
alpha -= ((INT32)(shadowheight / 4.0f)) + 75;
if (!R_BlendLevelVisible(blendmode, alpha))
return;
}
if (splat) if (splat)
spritexscale *= shadowscale; spritexscale *= shadowscale;
spriteyscale *= shadowscale; spriteyscale *= shadowscale;
} }
} }
translucent = !(blendmode == AST_TRANSLUCENT && alpha >= 255);
this_xscale = spritexscale * this_scale; this_xscale = spritexscale * this_scale;
this_yscale = spriteyscale * this_scale; this_yscale = spriteyscale * this_scale;
...@@ -5289,18 +5232,6 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5289,18 +5232,6 @@ static void HWR_ProjectSprite(mobj_t *thing)
x2 = (FIXED_TO_FLOAT(spr_width - spr_offset) * this_xscale); x2 = (FIXED_TO_FLOAT(spr_width - spr_offset) * this_xscale);
} }
// test if too close
/*
if (papersprite)
{
z1 = tz - x1 * angle_scalez;
z2 = tz + x2 * angle_scalez;
if (max(z1, z2) < ZCLIP_PLANE)
return;
}
*/
z1 = tr_y + x1 * rightsin; z1 = tr_y + x1 * rightsin;
z2 = tr_y - x2 * rightsin; z2 = tr_y - x2 * rightsin;
x1 = tr_x + x1 * rightcos; x1 = tr_x + x1 * rightcos;
...@@ -5473,6 +5404,9 @@ static void HWR_ProjectSprite(mobj_t *thing) ...@@ -5473,6 +5404,9 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->precip = false; vis->precip = false;
vis->translucent = translucent;
vis->blendmode = blendmode;
vis->alpha = alpha;
vis->angle = interp.angle; vis->angle = interp.angle;
} }
...@@ -5491,15 +5425,33 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) ...@@ -5491,15 +5425,33 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
size_t lumpoff; size_t lumpoff;
unsigned rot = 0; unsigned rot = 0;
UINT8 flip; UINT8 flip;
INT32 blendmode, alpha = 255;
boolean translucent = false;
UINT32 trans;
if (!thing) if (!thing)
return; return;
// Visibility check by the blend mode. // Get the blend mode
if (thing->frame & FF_BLENDMASK)
blendmode = ((thing->frame & FF_BLENDMASK) >> FF_BLENDSHIFT) + 1;
else
blendmode = min(max(AST_COPY, thing->blendmode), AST_OVERLAY);
// Determine the translucency value.
if (thing->frame & FF_TRANSMASK) if (thing->frame & FF_TRANSMASK)
trans = (thing->frame & FF_TRANSMASK) >> FF_TRANSSHIFT;
else
trans = 0;
if (cv_translucency.value && blendmode != AST_COPY && blendmode != AST_OVERLAY)
{ {
if (!R_BlendLevelVisible(thing->blendmode, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT)) alpha = thing->alpha - (0xFF - R_BlendModeTransnumToAlpha(blendmode, trans));
if (!R_BlendLevelVisible(blendmode, alpha))
return; return;
translucent = !(blendmode == AST_TRANSLUCENT && alpha >= 255);
} }
// uncapped/interpolation // uncapped/interpolation
...@@ -5595,6 +5547,10 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) ...@@ -5595,6 +5547,10 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
vis->precip = true; vis->precip = true;
vis->translucent = translucent;
vis->blendmode = blendmode;
vis->alpha = alpha;
// okay... this is a hack, but weather isn't networked, so it should be ok // okay... this is a hack, but weather isn't networked, so it should be ok
if (!(thing->precipflags & PCF_THUNK)) if (!(thing->precipflags & PCF_THUNK))
{ {
......
...@@ -42,7 +42,7 @@ void HWR_SetViewSize(void); ...@@ -42,7 +42,7 @@ void HWR_SetViewSize(void);
void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option); void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option);
void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap); void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap);
void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h); void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, fixed_t vscale, INT32 option, const UINT8 *colormap, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h);
void HWR_MakePatch(const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap); void HWR_MakePatch(patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
void HWR_CreatePlanePolygons(INT32 bspnum); void HWR_CreatePlanePolygons(INT32 bspnum);
void HWR_CreateStaticLightmaps(INT32 bspnum); void HWR_CreateStaticLightmaps(INT32 bspnum);
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color); void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color);
...@@ -70,9 +70,8 @@ void HWR_DrawScreenFinalTexture(int width, int height); ...@@ -70,9 +70,8 @@ void HWR_DrawScreenFinalTexture(int width, int height);
void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *colormap); void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *colormap);
UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap); // Let's see if this can work UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap); // Let's see if this can work
UINT8 HWR_GetTranstableAlpha(INT32 transtablenum);
FBITFIELD HWR_GetBlendModeFlag(INT32 style); FBITFIELD HWR_GetBlendModeFlag(INT32 style);
FBITFIELD HWR_SurfaceBlend(INT32 style, INT32 transtablenum, FSurfaceInfo *pSurf); FBITFIELD HWR_SurfaceBlend(INT32 style, INT32 alpha, FSurfaceInfo *pSurf);
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf); FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
boolean HWR_CompileShaders(void); boolean HWR_CompileShaders(void);
......
...@@ -415,7 +415,7 @@ static void md2_loadTexture(md2_t *model) ...@@ -415,7 +415,7 @@ static void md2_loadTexture(md2_t *model)
size = w*h; size = w*h;
while (size--) while (size--)
{ {
V_CubeApply(&image->s.red, &image->s.green, &image->s.blue); ColorCube_Apply(&image->s.red, &image->s.green, &image->s.blue);
image++; image++;
} }
} }
......
...@@ -2095,7 +2095,7 @@ void HU_Erase(void) ...@@ -2095,7 +2095,7 @@ void HU_Erase(void)
return; return;
// software mode copies view border pattern & beveled edges from the backbuffer // software mode copies view border pattern & beveled edges from the backbuffer
if (rendermode == render_soft) if (VID_InSoftwareRenderer())
{ {
topline = 0; topline = 0;
for (y = topline, yoffset = y*vid.width; y < bottomline; y++, yoffset += vid.width) for (y = topline, yoffset = y*vid.width; y < bottomline; y++, yoffset += vid.width)
......
...@@ -22,14 +22,15 @@ ...@@ -22,14 +22,15 @@
typedef enum typedef enum
{ {
/// Software // Software renderers
render_soft = 1, render_software = 1,
render_software_truecolor,
/// OpenGL // OpenGL
render_opengl = 2, render_opengl,
/// Dedicated // Dedicated mode
render_none = 3 // for dedicated server render_none,
} rendermode_t; } rendermode_t;
/** \brief current render mode /** \brief current render mode
...@@ -44,6 +45,10 @@ extern rendermode_t chosenrendermode; ...@@ -44,6 +45,10 @@ extern rendermode_t chosenrendermode;
*/ */
extern boolean highcolor; extern boolean highcolor;
/** \brief use truecolor modes if true
*/
extern boolean truecolor;
/** \brief setup video mode /** \brief setup video mode
*/ */
void I_StartupGraphics(void); void I_StartupGraphics(void);
...@@ -101,6 +106,15 @@ void VID_StartupOpenGL(void); ...@@ -101,6 +106,15 @@ void VID_StartupOpenGL(void);
*/ */
void VID_CheckGLLoaded(rendermode_t oldrender); void VID_CheckGLLoaded(rendermode_t oldrender);
/** \brief Returns true if mode is a Software renderer.
\param mode A render mode.
*/
boolean VID_IsASoftwareRenderer(rendermode_t mode);
/** \brief Returns true if the current rendermode.
*/
boolean VID_InSoftwareRenderer(void);
/** \brief The VID_GetModeName function /** \brief The VID_GetModeName function
\param modenum video mode number \param modenum video mode number
......
...@@ -452,7 +452,7 @@ static int lib_pAproxDistance(lua_State *L) ...@@ -452,7 +452,7 @@ static int lib_pAproxDistance(lua_State *L)
fixed_t dx = luaL_checkfixed(L, 1); fixed_t dx = luaL_checkfixed(L, 1);
fixed_t dy = luaL_checkfixed(L, 2); fixed_t dy = luaL_checkfixed(L, 2);
//HUDSAFE //HUDSAFE
lua_pushfixed(L, P_AproxDistance(dx, dy)); lua_pushfixed(L, R_PointToDist2(0, 0, dx, dy));
return 1; return 1;
} }
......
...@@ -1226,11 +1226,24 @@ static int libd_dupy(lua_State *L) ...@@ -1226,11 +1226,24 @@ static int libd_dupy(lua_State *L)
static int libd_renderer(lua_State *L) static int libd_renderer(lua_State *L)
{ {
HUDONLY HUDONLY
switch (rendermode) {
case render_opengl: lua_pushliteral(L, "opengl"); break; // OpenGL renderer switch (rendermode)
case render_soft: lua_pushliteral(L, "software"); break; // Software renderer {
default: lua_pushliteral(L, "none"); break; // render_none (for dedicated), in case there's any reason this should be run // Software renderers
case render_software:
case render_software_truecolor:
lua_pushliteral(L, "software");
break;
// OpenGL renderer
case render_opengl:
lua_pushliteral(L, "opengl");
break;
// render_none (for dedicated), in case there's any reason this should be run
default:
lua_pushliteral(L, "none");
break;
} }
return 1; return 1;
} }
......
...@@ -63,6 +63,7 @@ enum mobj_e { ...@@ -63,6 +63,7 @@ enum mobj_e {
mobj_renderflags, mobj_renderflags,
mobj_skin, mobj_skin,
mobj_color, mobj_color,
mobj_alpha,
mobj_blendmode, mobj_blendmode,
mobj_bnext, mobj_bnext,
mobj_bprev, mobj_bprev,
...@@ -140,6 +141,7 @@ static const char *const mobj_opt[] = { ...@@ -140,6 +141,7 @@ static const char *const mobj_opt[] = {
"renderflags", "renderflags",
"skin", "skin",
"color", "color",
"alpha",
"blendmode", "blendmode",
"bnext", "bnext",
"bprev", "bprev",
...@@ -320,6 +322,9 @@ static int mobj_get(lua_State *L) ...@@ -320,6 +322,9 @@ static int mobj_get(lua_State *L)
case mobj_color: case mobj_color:
lua_pushinteger(L, mo->color); lua_pushinteger(L, mo->color);
break; break;
case mobj_alpha:
lua_pushinteger(L, mo->alpha);
break;
case mobj_blendmode: case mobj_blendmode:
lua_pushinteger(L, mo->blendmode); lua_pushinteger(L, mo->blendmode);
break; break;
...@@ -661,6 +666,14 @@ static int mobj_set(lua_State *L) ...@@ -661,6 +666,14 @@ static int mobj_set(lua_State *L)
mo->color = newcolor; mo->color = newcolor;
break; break;
} }
case mobj_alpha:
{
INT32 newalpha = (INT32)luaL_checkinteger(L,3);
if (newalpha < 0 || newalpha > 255)
return luaL_error(L, "mobj.alpha %d out of range (0 - 255).", newalpha);
mo->alpha = newalpha;
break;
}
case mobj_blendmode: case mobj_blendmode:
{ {
INT32 blendmode = (INT32)luaL_checkinteger(L, 3); INT32 blendmode = (INT32)luaL_checkinteger(L, 3);
......
...@@ -508,11 +508,11 @@ static size_t gifframe_size = 8192; ...@@ -508,11 +508,11 @@ static size_t gifframe_size = 8192;
#ifdef HWRENDER #ifdef HWRENDER
static colorlookup_t gif_colorlookup; static colorlookup_t gif_colorlookup;
static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr) static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr, size_t bpp)
{ {
UINT8 r, g, b; UINT8 r, g, b;
size_t src = 0, dest = 0; size_t src = 0, dest = 0;
size_t size = (vid.width * vid.height * 3); size_t size = (vid.width * vid.height * bpp);
InitColorLUT(&gif_colorlookup, (gif_localcolortable) ? gif_framepalette : gif_headerpalette, true); InitColorLUT(&gif_colorlookup, (gif_localcolortable) ? gif_framepalette : gif_headerpalette, true);
...@@ -522,11 +522,10 @@ static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr) ...@@ -522,11 +522,10 @@ static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr)
g = (UINT8)linear[src + 1]; g = (UINT8)linear[src + 1];
b = (UINT8)linear[src + 2]; b = (UINT8)linear[src + 2];
scr[dest] = GetColorLUTDirect(&gif_colorlookup, r, g, b); scr[dest] = GetColorLUTDirect(&gif_colorlookup, r, g, b);
src += (3 * scrbuf_downscaleamt); src += (bpp * scrbuf_downscaleamt);
dest += scrbuf_downscaleamt; dest += scrbuf_downscaleamt;
} }
} }
#endif
// //
// GIF_framewrite // GIF_framewrite
...@@ -561,17 +560,31 @@ static void GIF_framewrite(void) ...@@ -561,17 +560,31 @@ static void GIF_framewrite(void)
{ {
// before blit movie_screen points to last frame, cur_screen points to this frame // before blit movie_screen points to last frame, cur_screen points to this frame
UINT8 *cur_screen = screens[0]; UINT8 *cur_screen = screens[0];
#ifdef TRUECOLOR
if (VID_InSoftwareRenderer() && truecolor)
{
cur_screen = screens[2] + (vid.width * vid.height);
GIF_rgbconvert(screens[0], cur_screen, 4);
}
#endif
GIF_optimizeregion(cur_screen, movie_screen, &blitx, &blity, &blitw, &blith); GIF_optimizeregion(cur_screen, movie_screen, &blitx, &blity, &blitw, &blith);
// blit to temp screen // blit to temp screen
if (rendermode == render_soft) if (VID_InSoftwareRenderer())
I_ReadScreen(movie_screen); {
#ifdef TRUECOLOR
if (truecolor)
GIF_rgbconvert(screens[0], movie_screen, 4);
else
#endif
I_ReadScreen(movie_screen);
}
#ifdef HWRENDER #ifdef HWRENDER
else if (rendermode == render_opengl) else if (rendermode == render_opengl)
{ {
UINT8 *linear = HWR_GetScreenshot(); UINT8 *sshot = HWR_GetScreenshot();
GIF_rgbconvert(linear, movie_screen); GIF_rgbconvert(sshot, movie_screen, 3);
free(linear); free(sshot);
} }
#endif #endif
} }
...@@ -581,22 +594,43 @@ static void GIF_framewrite(void) ...@@ -581,22 +594,43 @@ static void GIF_framewrite(void)
blitw = vid.width; blitw = vid.width;
blith = vid.height; blith = vid.height;
#ifdef HWRENDER if (gif_frames == 0)
// Copy the current OpenGL frame into the base screen
if (rendermode == render_opengl)
{ {
UINT8 *linear = HWR_GetScreenshot(); #ifdef HWRENDER
GIF_rgbconvert(linear, screens[0]); if (rendermode == render_opengl)
free(linear); {
UINT8 *sshot = HWR_GetScreenshot();
GIF_rgbconvert(sshot, screens[0], 3);
free(sshot);
}
else
#endif
if (VID_InSoftwareRenderer())
{
#ifdef TRUECOLOR
if (truecolor)
GIF_rgbconvert(screens[0], movie_screen, 4);
else
#endif
I_ReadScreen(movie_screen);
}
} }
#endif #endif
// Copy the first frame into the movie screen // Copy the first frame into the movie screen
// OpenGL already does the same above. // OpenGL already does the same above.
if (gif_frames == 0 && rendermode == render_soft) if (gif_frames == 0 && VID_InSoftwareRenderer())
I_ReadScreen(movie_screen); I_ReadScreen(movie_screen);
movie_screen = screens[0]; movie_screen = screens[0];
#ifdef TRUECOLOR
if (VID_InSoftwareRenderer() && truecolor)
{
UINT8 *blit = screens[2] + (vid.width * vid.height);
GIF_rgbconvert(screens[0], blit, 4);
movie_screen = blit;
}
#endif
} }
// screen regions are handled in GIF_lzw // screen regions are handled in GIF_lzw
......