mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-02-23 20:31:06 +00:00
Merge branch 'master' of https://git.magicalgirl.moe/STJr/SRB2/ into udmf-base
This commit is contained in:
commit
2248e910a5
40 changed files with 2523 additions and 1369 deletions
|
@ -1193,6 +1193,13 @@ void D_SRB2Main(void)
|
||||||
CONS_Printf("I_StartupGraphics()...\n");
|
CONS_Printf("I_StartupGraphics()...\n");
|
||||||
I_StartupGraphics();
|
I_StartupGraphics();
|
||||||
|
|
||||||
|
#ifdef HWRENDER
|
||||||
|
// Lactozilla: Add every hardware mode CVAR and CCMD.
|
||||||
|
// Has to be done before the configuration file loads,
|
||||||
|
// but after the OpenGL library loads.
|
||||||
|
HWR_AddCommands();
|
||||||
|
#endif
|
||||||
|
|
||||||
//--------------------------------------------------------- CONSOLE
|
//--------------------------------------------------------- CONSOLE
|
||||||
// setup loading screen
|
// setup loading screen
|
||||||
SCR_Startup();
|
SCR_Startup();
|
||||||
|
|
|
@ -760,15 +760,15 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
|
||||||
// CACHING HANDLING
|
// CACHING HANDLING
|
||||||
// =================================================
|
// =================================================
|
||||||
|
|
||||||
static size_t gr_numtextures;
|
static size_t gr_numtextures; // Texture count
|
||||||
static GLTexture_t *gr_textures; // for ALL Doom textures
|
static GLTexture_t *gr_textures; // For all textures
|
||||||
static GLTexture_t *gr_textures2;
|
static GLTexture_t *gr_flats; // For all (texture) flats, as normal flats don't need to be cached
|
||||||
|
|
||||||
void HWR_InitTextureCache(void)
|
void HWR_InitTextureCache(void)
|
||||||
{
|
{
|
||||||
gr_numtextures = 0;
|
gr_numtextures = 0;
|
||||||
gr_textures = NULL;
|
gr_textures = NULL;
|
||||||
gr_textures2 = NULL;
|
gr_flats = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Callback function for HWR_FreeTextureCache.
|
// Callback function for HWR_FreeTextureCache.
|
||||||
|
@ -776,29 +776,45 @@ static void FreeMipmapColormap(INT32 patchnum, void *patch)
|
||||||
{
|
{
|
||||||
GLPatch_t* const pat = patch;
|
GLPatch_t* const pat = patch;
|
||||||
(void)patchnum; //unused
|
(void)patchnum; //unused
|
||||||
while (pat->mipmap && pat->mipmap->nextcolormap) // The mipmap must be valid, obviously
|
|
||||||
|
// The patch must be valid, obviously
|
||||||
|
if (!pat)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The mipmap must be valid, obviously
|
||||||
|
while (pat->mipmap)
|
||||||
{
|
{
|
||||||
// Confusing at first, but pat->mipmap->nextcolormap
|
// Confusing at first, but pat->mipmap->nextcolormap
|
||||||
// at the beginning of the loop is the first colormap
|
// at the beginning of the loop is the first colormap
|
||||||
// from the linked list of colormaps
|
// from the linked list of colormaps.
|
||||||
GLMipmap_t *next = pat->mipmap;
|
GLMipmap_t *next = NULL;
|
||||||
if (!next) // No mipmap in this patch, break out of loop.
|
|
||||||
|
// No mipmap in this patch, break out of the loop.
|
||||||
|
if (!pat->mipmap)
|
||||||
break;
|
break;
|
||||||
// Set the first colormap
|
|
||||||
// to the one that comes after it
|
// No colormap mipmap either.
|
||||||
next = next->nextcolormap;
|
if (!pat->mipmap->nextcolormap)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Set the first colormap to the one that comes after it.
|
||||||
|
next = pat->mipmap->nextcolormap;
|
||||||
pat->mipmap->nextcolormap = next->nextcolormap;
|
pat->mipmap->nextcolormap = next->nextcolormap;
|
||||||
// Free image data from memory
|
|
||||||
|
// Free image data from memory.
|
||||||
if (next->grInfo.data)
|
if (next->grInfo.data)
|
||||||
Z_Free(next->grInfo.data);
|
Z_Free(next->grInfo.data);
|
||||||
// Free the old colormap from memory
|
next->grInfo.data = NULL;
|
||||||
|
|
||||||
|
// Free the old colormap mipmap from memory.
|
||||||
free(next);
|
free(next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_FreeTextureCache(void)
|
void HWR_FreeMipmapCache(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
|
||||||
// free references to the textures
|
// free references to the textures
|
||||||
HWD.pfnClearMipMapCache();
|
HWD.pfnClearMipMapCache();
|
||||||
|
|
||||||
|
@ -808,51 +824,46 @@ void HWR_FreeTextureCache(void)
|
||||||
Z_FreeTag(PU_HWRCACHE_UNLOCKED);
|
Z_FreeTag(PU_HWRCACHE_UNLOCKED);
|
||||||
|
|
||||||
// Alam: free the Z_Blocks before freeing it's users
|
// Alam: free the Z_Blocks before freeing it's users
|
||||||
|
|
||||||
// free all patch colormaps after each level: must be done after ClearMipMapCache!
|
// free all patch colormaps after each level: must be done after ClearMipMapCache!
|
||||||
for (i = 0; i < numwadfiles; i++)
|
for (i = 0; i < numwadfiles; i++)
|
||||||
M_AATreeIterate(wadfiles[i]->hwrcache, FreeMipmapColormap);
|
M_AATreeIterate(wadfiles[i]->hwrcache, FreeMipmapColormap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HWR_FreeTextureCache(void)
|
||||||
|
{
|
||||||
|
// free references to the textures
|
||||||
|
HWR_FreeMipmapCache();
|
||||||
|
|
||||||
// now the heap don't have any 'user' pointing to our
|
// now the heap don't have any 'user' pointing to our
|
||||||
// texturecache info, we can free it
|
// texturecache info, we can free it
|
||||||
if (gr_textures)
|
if (gr_textures)
|
||||||
free(gr_textures);
|
free(gr_textures);
|
||||||
if (gr_textures2)
|
if (gr_flats)
|
||||||
free(gr_textures2);
|
free(gr_flats);
|
||||||
gr_textures = NULL;
|
gr_textures = NULL;
|
||||||
gr_textures2 = NULL;
|
gr_flats = NULL;
|
||||||
gr_numtextures = 0;
|
gr_numtextures = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_PrepLevelCache(size_t pnumtextures)
|
void HWR_LoadTextures(size_t pnumtextures)
|
||||||
{
|
{
|
||||||
// problem: the mipmap cache management hold a list of mipmaps.. but they are
|
|
||||||
// reallocated on each level..
|
|
||||||
//sub-optimal, but 1) just need re-download stuff in hardware cache VERY fast
|
|
||||||
// 2) sprite/menu stuff mixed with level textures so can't do anything else
|
|
||||||
|
|
||||||
// we must free it since numtextures changed
|
// we must free it since numtextures changed
|
||||||
HWR_FreeTextureCache();
|
HWR_FreeTextureCache();
|
||||||
|
|
||||||
|
// Why not Z_Malloc?
|
||||||
gr_numtextures = pnumtextures;
|
gr_numtextures = pnumtextures;
|
||||||
gr_textures = calloc(pnumtextures, sizeof (*gr_textures));
|
gr_textures = calloc(gr_numtextures, sizeof(*gr_textures));
|
||||||
if (gr_textures == NULL)
|
gr_flats = calloc(gr_numtextures, sizeof(*gr_flats));
|
||||||
I_Error("3D can't alloc gr_textures");
|
|
||||||
gr_textures2 = calloc(pnumtextures, sizeof (*gr_textures2));
|
// Doesn't tell you which it _is_, but hopefully
|
||||||
if (gr_textures2 == NULL)
|
// should never ever happen (right?!)
|
||||||
I_Error("3D can't alloc gr_textures2");
|
if ((gr_textures == NULL) || (gr_flats == NULL))
|
||||||
|
I_Error("HWR_LoadTextures: ran out of memory for OpenGL textures. Sad!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_SetPalette(RGBA_t *palette)
|
void HWR_SetPalette(RGBA_t *palette)
|
||||||
{
|
{
|
||||||
//Hudler: 16/10/99: added for OpenGL gamma correction
|
HWD.pfnSetPalette(palette);
|
||||||
RGBA_t gamma_correction = {0x7F7F7F7F};
|
|
||||||
|
|
||||||
//Hurdler 16/10/99: added for OpenGL gamma correction
|
|
||||||
gamma_correction.s.red = (UINT8)cv_grgammared.value;
|
|
||||||
gamma_correction.s.green = (UINT8)cv_grgammagreen.value;
|
|
||||||
gamma_correction.s.blue = (UINT8)cv_grgammablue.value;
|
|
||||||
HWD.pfnSetPalette(palette, &gamma_correction);
|
|
||||||
|
|
||||||
// hardware driver will flush there own cache if cache is non paletized
|
// hardware driver will flush there own cache if cache is non paletized
|
||||||
// now flush data texture cache so 32 bit texture are recomputed
|
// now flush data texture cache so 32 bit texture are recomputed
|
||||||
|
@ -873,11 +884,16 @@ GLTexture_t *HWR_GetTexture(INT32 tex)
|
||||||
if ((unsigned)tex >= gr_numtextures)
|
if ((unsigned)tex >= gr_numtextures)
|
||||||
I_Error("HWR_GetTexture: tex >= numtextures\n");
|
I_Error("HWR_GetTexture: tex >= numtextures\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Every texture in memory, stored in the
|
||||||
|
// hardware renderer's bit depth format. Wow!
|
||||||
grtex = &gr_textures[tex];
|
grtex = &gr_textures[tex];
|
||||||
|
|
||||||
|
// Generate texture if missing from the cache
|
||||||
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
|
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
|
||||||
HWR_GenerateTexture(tex, grtex);
|
HWR_GenerateTexture(tex, grtex);
|
||||||
|
|
||||||
|
// Tell the hardware driver to bind the current texture to the flat's mipmap
|
||||||
HWD.pfnSetTexture(&grtex->mipmap);
|
HWD.pfnSetTexture(&grtex->mipmap);
|
||||||
|
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
|
@ -989,13 +1005,19 @@ void HWR_GetLevelFlat(levelflat_t *levelflat)
|
||||||
if ((unsigned)texturenum >= gr_numtextures)
|
if ((unsigned)texturenum >= gr_numtextures)
|
||||||
I_Error("HWR_GetLevelFlat: texturenum >= numtextures\n");
|
I_Error("HWR_GetLevelFlat: texturenum >= numtextures\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Who knows?
|
||||||
if (texturenum == 0 || texturenum == -1)
|
if (texturenum == 0 || texturenum == -1)
|
||||||
return;
|
return;
|
||||||
grtex = &gr_textures2[texturenum];
|
|
||||||
|
|
||||||
|
// Every texture in memory, stored as a 8-bit flat. Wow!
|
||||||
|
grtex = &gr_flats[texturenum];
|
||||||
|
|
||||||
|
// Generate flat if missing from the cache
|
||||||
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
|
if (!grtex->mipmap.grInfo.data && !grtex->mipmap.downloaded)
|
||||||
HWR_CacheTextureAsFlat(&grtex->mipmap, texturenum);
|
HWR_CacheTextureAsFlat(&grtex->mipmap, texturenum);
|
||||||
|
|
||||||
|
// Tell the hardware driver to bind the current texture to the flat's mipmap
|
||||||
HWD.pfnSetTexture(&grtex->mipmap);
|
HWD.pfnSetTexture(&grtex->mipmap);
|
||||||
|
|
||||||
// The system-memory data can be purged now.
|
// The system-memory data can be purged now.
|
||||||
|
@ -1019,6 +1041,7 @@ static void HWR_LoadMappedPatch(GLMipmap_t *grmip, GLPatch_t *gpatch)
|
||||||
HWR_MakePatch(patch, gpatch, grmip, true);
|
HWR_MakePatch(patch, gpatch, grmip, true);
|
||||||
|
|
||||||
// You can't free rawpatch for some reason?
|
// You can't free rawpatch for some reason?
|
||||||
|
// (Obviously I can't, sprite rotation needs that...)
|
||||||
if (!gpatch->rawpatch)
|
if (!gpatch->rawpatch)
|
||||||
Z_Free(patch);
|
Z_Free(patch);
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1069,6 @@ void HWR_GetPatch(GLPatch_t *gpatch)
|
||||||
|
|
||||||
// this is inefficient.. but the hardware patch in heap is purgeable so it should
|
// this is inefficient.. but the hardware patch in heap is purgeable so it should
|
||||||
// not fragment memory, and besides the REAL cache here is the hardware memory
|
// not fragment memory, and besides the REAL cache here is the hardware memory
|
||||||
// You can't free rawpatch for some reason?
|
|
||||||
if (!gpatch->rawpatch)
|
if (!gpatch->rawpatch)
|
||||||
Z_Free(ptr);
|
Z_Free(ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ struct GLMipmap_s
|
||||||
|
|
||||||
struct GLMipmap_s *nextcolormap;
|
struct GLMipmap_s *nextcolormap;
|
||||||
const UINT8 *colormap;
|
const UINT8 *colormap;
|
||||||
|
INT32 tcindex;
|
||||||
|
|
||||||
// opengl
|
// opengl
|
||||||
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
|
||||||
|
|
|
@ -220,11 +220,10 @@ typedef struct FSurfaceInfo FSurfaceInfo;
|
||||||
//Hurdler: added for backward compatibility
|
//Hurdler: added for backward compatibility
|
||||||
enum hwdsetspecialstate
|
enum hwdsetspecialstate
|
||||||
{
|
{
|
||||||
HWD_SET_FOG_TABLE = 1,
|
HWD_SET_MODEL_LIGHTING = 1,
|
||||||
HWD_SET_FOG_MODE,
|
HWD_SET_FOG_MODE,
|
||||||
HWD_SET_FOG_COLOR,
|
HWD_SET_FOG_COLOR,
|
||||||
HWD_SET_FOG_DENSITY,
|
HWD_SET_FOG_DENSITY,
|
||||||
HWD_SET_FOV,
|
|
||||||
HWD_SET_TEXTUREFILTERMODE,
|
HWD_SET_TEXTUREFILTERMODE,
|
||||||
HWD_SET_TEXTUREANISOTROPICMODE,
|
HWD_SET_TEXTUREANISOTROPICMODE,
|
||||||
HWD_NUMSTATE
|
HWD_NUMSTATE
|
||||||
|
|
|
@ -39,11 +39,7 @@ EXPORT void HWRAPI(Shutdown) (void);
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
EXPORT void HWRAPI(GetModeList) (vmode_t **pvidmodes, INT32 *numvidmodes);
|
EXPORT void HWRAPI(GetModeList) (vmode_t **pvidmodes, INT32 *numvidmodes);
|
||||||
#endif
|
#endif
|
||||||
#if defined (PURESDL) || defined (macintosh)
|
EXPORT void HWRAPI(SetPalette) (RGBA_t *ppal);
|
||||||
EXPORT void HWRAPI(SetPalette) (INT32 *, RGBA_t *gamma);
|
|
||||||
#else
|
|
||||||
EXPORT void HWRAPI(SetPalette) (RGBA_t *ppal, RGBA_t *pgamma);
|
|
||||||
#endif
|
|
||||||
EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl);
|
EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl);
|
||||||
EXPORT void HWRAPI(Draw2DLine) (F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
EXPORT void HWRAPI(Draw2DLine) (F2DCoord *v1, F2DCoord *v2, RGBA_t Color);
|
||||||
EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
|
EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags);
|
||||||
|
|
|
@ -100,6 +100,7 @@ void HWR_FreePolyPool(void);
|
||||||
// --------
|
// --------
|
||||||
void HWR_InitTextureCache(void);
|
void HWR_InitTextureCache(void);
|
||||||
void HWR_FreeTextureCache(void);
|
void HWR_FreeTextureCache(void);
|
||||||
|
void HWR_FreeMipmapCache(void);
|
||||||
void HWR_FreeExtraSubsectors(void);
|
void HWR_FreeExtraSubsectors(void);
|
||||||
|
|
||||||
void HWR_GetLevelFlat(levelflat_t *levelflat);
|
void HWR_GetLevelFlat(levelflat_t *levelflat);
|
||||||
|
|
|
@ -85,62 +85,8 @@ static void HWR_RenderTransparentWalls(void);
|
||||||
static void HWR_FoggingOn(void);
|
static void HWR_FoggingOn(void);
|
||||||
static UINT32 atohex(const char *s);
|
static UINT32 atohex(const char *s);
|
||||||
|
|
||||||
static void CV_filtermode_ONChange(void);
|
|
||||||
static void CV_anisotropic_ONChange(void);
|
|
||||||
static void CV_FogDensity_ONChange(void);
|
|
||||||
static void CV_grFov_OnChange(void);
|
|
||||||
// ==========================================================================
|
|
||||||
// 3D ENGINE COMMANDS & CONSOLE VARS
|
|
||||||
// ==========================================================================
|
|
||||||
|
|
||||||
static CV_PossibleValue_t grfov_cons_t[] = {{0, "MIN"}, {179*FRACUNIT, "MAX"}, {0, NULL}};
|
|
||||||
static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
|
|
||||||
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
|
|
||||||
{HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"},
|
|
||||||
{HWD_SET_TEXTUREFILTER_MIXED2, "Nearest_Linear"},
|
|
||||||
{HWD_SET_TEXTUREFILTER_MIXED3, "Nearest_Mipmap"},
|
|
||||||
{0, NULL}};
|
|
||||||
CV_PossibleValue_t granisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
|
|
||||||
|
|
||||||
boolean drawsky = true;
|
boolean drawsky = true;
|
||||||
|
|
||||||
// needs fix: walls are incorrectly clipped one column less
|
|
||||||
#ifndef NEWCLIP
|
|
||||||
static consvar_t cv_grclipwalls = {"gr_clipwalls", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
#endif
|
|
||||||
//development variables for diverse uses
|
|
||||||
static consvar_t cv_gralpha = {"gr_alpha", "160", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
static consvar_t cv_grbeta = {"gr_beta", "0", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
|
|
||||||
consvar_t cv_grrounddown = {"gr_rounddown", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grfov = {"gr_fov", "90", CV_FLOAT|CV_CALL, grfov_cons_t, CV_grFov_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grfogdensity = {"gr_fogdensity", "150", CV_CALL|CV_NOINIT, CV_Unsigned,
|
|
||||||
CV_FogDensity_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
|
|
||||||
// Unfortunately, this can no longer be saved..
|
|
||||||
consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_CALL, grfiltermode_cons_t,
|
|
||||||
CV_filtermode_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
|
|
||||||
CV_anisotropic_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
//static consvar_t cv_grzbuffer = {"gr_zbuffer", "On", 0, CV_OnOff};
|
|
||||||
consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
|
|
||||||
static void CV_FogDensity_ONChange(void)
|
|
||||||
{
|
|
||||||
HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void CV_filtermode_ONChange(void)
|
|
||||||
{
|
|
||||||
HWD.pfnSetSpecialState(HWD_SET_TEXTUREFILTERMODE, cv_grfiltermode.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void CV_anisotropic_ONChange(void)
|
|
||||||
{
|
|
||||||
HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* lookuptable for lightvalues
|
* lookuptable for lightvalues
|
||||||
* calculated as follow:
|
* calculated as follow:
|
||||||
|
@ -2473,11 +2419,13 @@ static boolean CheckClip(seg_t * seg, sector_t * afrontsector, sector_t * abacks
|
||||||
static cliprange_t * hw_newend;
|
static cliprange_t * hw_newend;
|
||||||
static cliprange_t gr_solidsegs[MAXSEGS];
|
static cliprange_t gr_solidsegs[MAXSEGS];
|
||||||
|
|
||||||
|
// needs fix: walls are incorrectly clipped one column less
|
||||||
|
static consvar_t cv_grclipwalls = {"gr_clipwalls", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
static void printsolidsegs(void)
|
static void printsolidsegs(void)
|
||||||
{
|
{
|
||||||
cliprange_t * start;
|
cliprange_t * start;
|
||||||
if (!hw_newend || cv_grbeta.value != 2)
|
if (!hw_newend)
|
||||||
return;
|
return;
|
||||||
for (start = gr_solidsegs;start != hw_newend;start++)
|
for (start = gr_solidsegs;start != hw_newend;start++)
|
||||||
{
|
{
|
||||||
|
@ -3431,7 +3379,7 @@ static void HWR_AddPolyObjectPlanes(void)
|
||||||
{
|
{
|
||||||
HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic]);
|
HWR_GetLevelFlat(&levelflats[polyobjsector->ceilingpic]);
|
||||||
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
|
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
|
||||||
(light == -1 ? gr_frontsector->lightlevel : *gr_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->floorpic],
|
(light == -1 ? gr_frontsector->lightlevel : *gr_frontsector->lightlist[light].lightlevel), &levelflats[polyobjsector->ceilingpic],
|
||||||
polyobjsector, 255, (light == -1 ? gr_frontsector->extra_colormap : *gr_frontsector->lightlist[light].extra_colormap));
|
polyobjsector, 255, (light == -1 ? gr_frontsector->extra_colormap : *gr_frontsector->lightlist[light].extra_colormap));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5420,14 +5368,20 @@ static void HWR_DrawSprites(void)
|
||||||
if (!cv_grmodels.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f)
|
if (!cv_grmodels.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f)
|
||||||
HWR_DrawSprite(spr);
|
HWR_DrawSprite(spr);
|
||||||
else
|
else
|
||||||
HWR_DrawModel(spr);
|
{
|
||||||
|
if (!HWR_DrawModel(spr))
|
||||||
|
HWR_DrawSprite(spr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!cv_grmodels.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f)
|
if (!cv_grmodels.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f)
|
||||||
HWR_DrawSprite(spr);
|
HWR_DrawSprite(spr);
|
||||||
else
|
else
|
||||||
HWR_DrawModel(spr);
|
{
|
||||||
|
if (!HWR_DrawModel(spr))
|
||||||
|
HWR_DrawSprite(spr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5941,7 +5895,7 @@ static void HWR_DrawSkyBackground(player_t *player)
|
||||||
{
|
{
|
||||||
if (cv_grskydome.value)
|
if (cv_grskydome.value)
|
||||||
{
|
{
|
||||||
FTransform transform;
|
FTransform dometransform;
|
||||||
const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd);
|
const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd);
|
||||||
postimg_t *type;
|
postimg_t *type;
|
||||||
|
|
||||||
|
@ -5950,27 +5904,27 @@ static void HWR_DrawSkyBackground(player_t *player)
|
||||||
else
|
else
|
||||||
type = &postimgtype;
|
type = &postimgtype;
|
||||||
|
|
||||||
memset(&transform, 0x00, sizeof(FTransform));
|
memset(&dometransform, 0x00, sizeof(FTransform));
|
||||||
|
|
||||||
//04/01/2000: Hurdler: added for T&L
|
//04/01/2000: Hurdler: added for T&L
|
||||||
// It should replace all other gr_viewxxx when finished
|
// It should replace all other gr_viewxxx when finished
|
||||||
transform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
dometransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
transform.angley = (float)((viewangle-ANGLE_270)>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
dometransform.angley = (float)((viewangle-ANGLE_270)>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
|
|
||||||
if (*type == postimg_flip)
|
if (*type == postimg_flip)
|
||||||
transform.flip = true;
|
dometransform.flip = true;
|
||||||
else
|
else
|
||||||
transform.flip = false;
|
dometransform.flip = false;
|
||||||
|
|
||||||
transform.scalex = 1;
|
dometransform.scalex = 1;
|
||||||
transform.scaley = (float)vid.width/vid.height;
|
dometransform.scaley = (float)vid.width/vid.height;
|
||||||
transform.scalez = 1;
|
dometransform.scalez = 1;
|
||||||
transform.fovxangle = fpov; // Tails
|
dometransform.fovxangle = fpov; // Tails
|
||||||
transform.fovyangle = fpov; // Tails
|
dometransform.fovyangle = fpov; // Tails
|
||||||
transform.splitscreen = splitscreen;
|
dometransform.splitscreen = splitscreen;
|
||||||
|
|
||||||
HWR_GetTexture(texturetranslation[skytexture]);
|
HWR_GetTexture(texturetranslation[skytexture]);
|
||||||
HWD.pfnRenderSkyDome(skytexture, textures[skytexture]->width, textures[skytexture]->height, transform);
|
HWD.pfnRenderSkyDome(skytexture, textures[skytexture]->width, textures[skytexture]->height, dometransform);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -6172,6 +6126,8 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
|
||||||
|
|
||||||
//04/01/2000: Hurdler: added for T&L
|
//04/01/2000: Hurdler: added for T&L
|
||||||
// It should replace all other gr_viewxxx when finished
|
// It should replace all other gr_viewxxx when finished
|
||||||
|
memset(&atransform, 0x00, sizeof(FTransform));
|
||||||
|
|
||||||
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
|
|
||||||
|
@ -6390,6 +6346,8 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
|
||||||
|
|
||||||
//04/01/2000: Hurdler: added for T&L
|
//04/01/2000: Hurdler: added for T&L
|
||||||
// It should replace all other gr_viewxxx when finished
|
// It should replace all other gr_viewxxx when finished
|
||||||
|
memset(&atransform, 0x00, sizeof(FTransform));
|
||||||
|
|
||||||
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
|
||||||
|
|
||||||
|
@ -6584,59 +6542,125 @@ static void HWR_FoggingOn(void)
|
||||||
// 3D ENGINE COMMANDS
|
// 3D ENGINE COMMANDS
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
|
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
|
||||||
|
static CV_PossibleValue_t grmodelinterpolation_cons_t[] = {{0, "Off"}, {1, "Sometimes"}, {2, "Always"}, {0, NULL}};
|
||||||
|
|
||||||
static void CV_grFov_OnChange(void)
|
static void CV_grmodellighting_OnChange(void);
|
||||||
|
static void CV_grfiltermode_OnChange(void);
|
||||||
|
static void CV_granisotropic_OnChange(void);
|
||||||
|
static void CV_grfogdensity_OnChange(void);
|
||||||
|
static void CV_grfov_OnChange(void);
|
||||||
|
|
||||||
|
static CV_PossibleValue_t grfov_cons_t[] = {{0, "MIN"}, {179*FRACUNIT, "MAX"}, {0, NULL}};
|
||||||
|
static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
|
||||||
|
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
|
||||||
|
{HWD_SET_TEXTUREFILTER_MIXED1, "Linear_Nearest"},
|
||||||
|
{HWD_SET_TEXTUREFILTER_MIXED2, "Nearest_Linear"},
|
||||||
|
{HWD_SET_TEXTUREFILTER_MIXED3, "Nearest_Mipmap"},
|
||||||
|
{0, NULL}};
|
||||||
|
CV_PossibleValue_t granisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
|
||||||
|
|
||||||
|
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grsoftwarefog = {"gr_softwarefog", "Off", CV_SAVE, grsoftwarefog_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
#ifdef ALAM_LIGHTING
|
||||||
|
consvar_t cv_grdynamiclighting = {"gr_dynamiclighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grstaticlighting = {"gr_staticlighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE|CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
consvar_t cv_grmodels = {"gr_models", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grmodelinterpolation = {"gr_modelinterpolation", "Sometimes", CV_SAVE, grmodelinterpolation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grmodellighting = {"gr_modellighting", "Off", CV_SAVE|CV_CALL, CV_OnOff, CV_grmodellighting_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grskydome = {"gr_skydome", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_grrounddown = {"gr_rounddown", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grfov = {"gr_fov", "90", CV_FLOAT|CV_CALL, grfov_cons_t, CV_grfov_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grfogdensity = {"gr_fogdensity", "150", CV_CALL|CV_NOINIT, CV_Unsigned,
|
||||||
|
CV_grfogdensity_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_SAVE|CV_CALL, grfiltermode_cons_t,
|
||||||
|
CV_grfiltermode_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
|
||||||
|
CV_granisotropic_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
static void CV_grmodellighting_OnChange(void)
|
||||||
|
{
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWD.pfnSetSpecialState(HWD_SET_MODEL_LIGHTING, cv_grmodellighting.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CV_grfogdensity_OnChange(void)
|
||||||
|
{
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CV_grfiltermode_OnChange(void)
|
||||||
|
{
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWD.pfnSetSpecialState(HWD_SET_TEXTUREFILTERMODE, cv_grfiltermode.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CV_granisotropic_OnChange(void)
|
||||||
|
{
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CV_grfov_OnChange(void)
|
||||||
{
|
{
|
||||||
if ((netgame || multiplayer) && !cv_debug && cv_grfov.value != 90*FRACUNIT)
|
if ((netgame || multiplayer) && !cv_debug && cv_grfov.value != 90*FRACUNIT)
|
||||||
CV_Set(&cv_grfov, cv_grfov.defaultvalue);
|
CV_Set(&cv_grfov, cv_grfov.defaultvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Command_GrStats_f(void)
|
|
||||||
{
|
|
||||||
Z_CheckHeap(9875); // debug
|
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Patch info headers: %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPATCHINFO)>>10));
|
|
||||||
CONS_Printf(M_GetText("3D Texture cache : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
|
|
||||||
CONS_Printf(M_GetText("Plane polygon : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// 3D ENGINE SETUP
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
// Add hardware engine commands & consvars
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
//added by Hurdler: console varibale that are saved
|
//added by Hurdler: console varibale that are saved
|
||||||
void HWR_AddCommands(void)
|
void HWR_AddCommands(void)
|
||||||
{
|
{
|
||||||
CV_RegisterVar(&cv_grrounddown);
|
CV_RegisterVar(&cv_grfovchange);
|
||||||
CV_RegisterVar(&cv_grfov);
|
CV_RegisterVar(&cv_grfov);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_grfogdensity);
|
CV_RegisterVar(&cv_grfogdensity);
|
||||||
|
CV_RegisterVar(&cv_grfogcolor);
|
||||||
|
CV_RegisterVar(&cv_grfog);
|
||||||
|
CV_RegisterVar(&cv_grsoftwarefog);
|
||||||
|
|
||||||
|
#ifdef ALAM_LIGHTING
|
||||||
|
CV_RegisterVar(&cv_grstaticlighting);
|
||||||
|
CV_RegisterVar(&cv_grdynamiclighting);
|
||||||
|
CV_RegisterVar(&cv_grcoronasize);
|
||||||
|
CV_RegisterVar(&cv_grcoronas);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_grmodellighting);
|
||||||
|
CV_RegisterVar(&cv_grmodelinterpolation);
|
||||||
|
CV_RegisterVar(&cv_grmodels);
|
||||||
|
|
||||||
|
CV_RegisterVar(&cv_grskydome);
|
||||||
|
CV_RegisterVar(&cv_grspritebillboarding);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_grfiltermode);
|
CV_RegisterVar(&cv_grfiltermode);
|
||||||
CV_RegisterVar(&cv_granisotropicmode);
|
CV_RegisterVar(&cv_grrounddown);
|
||||||
CV_RegisterVar(&cv_grcorrecttricks);
|
CV_RegisterVar(&cv_grcorrecttricks);
|
||||||
CV_RegisterVar(&cv_grsolvetjoin);
|
CV_RegisterVar(&cv_grsolvetjoin);
|
||||||
}
|
|
||||||
|
|
||||||
static inline void HWR_AddEngineCommands(void)
|
|
||||||
{
|
|
||||||
// engine state variables
|
|
||||||
//CV_RegisterVar(&cv_grzbuffer);
|
|
||||||
#ifndef NEWCLIP
|
#ifndef NEWCLIP
|
||||||
CV_RegisterVar(&cv_grclipwalls);
|
CV_RegisterVar(&cv_grclipwalls);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// engine development mode variables
|
|
||||||
// - usage may vary from version to version..
|
|
||||||
CV_RegisterVar(&cv_gralpha);
|
|
||||||
CV_RegisterVar(&cv_grbeta);
|
|
||||||
|
|
||||||
// engine commands
|
|
||||||
COM_AddCommand("gr_stats", Command_GrStats_f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HWR_AddSessionCommands(void)
|
||||||
|
{
|
||||||
|
CV_RegisterVar(&cv_granisotropicmode);
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// Setup the hardware renderer
|
// Setup the hardware renderer
|
||||||
|
@ -6657,12 +6681,9 @@ void HWR_Startup(void)
|
||||||
{
|
{
|
||||||
CONS_Printf("HWR_Startup()...\n");
|
CONS_Printf("HWR_Startup()...\n");
|
||||||
HWR_InitPolyPool();
|
HWR_InitPolyPool();
|
||||||
// add console cmds & vars
|
HWR_AddSessionCommands();
|
||||||
HWR_AddEngineCommands();
|
|
||||||
HWR_InitTextureCache();
|
HWR_InitTextureCache();
|
||||||
|
|
||||||
HWR_InitModels();
|
HWR_InitModels();
|
||||||
|
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
HWR_InitLight();
|
HWR_InitLight();
|
||||||
#endif
|
#endif
|
||||||
|
@ -6683,6 +6704,7 @@ void HWR_Shutdown(void)
|
||||||
CONS_Printf("HWR_Shutdown()\n");
|
CONS_Printf("HWR_Shutdown()\n");
|
||||||
HWR_FreeExtraSubsectors();
|
HWR_FreeExtraSubsectors();
|
||||||
HWR_FreePolyPool();
|
HWR_FreePolyPool();
|
||||||
|
HWR_FreeMipmapCache();
|
||||||
HWR_FreeTextureCache();
|
HWR_FreeTextureCache();
|
||||||
HWD.pfnFlushScreenTextures();
|
HWD.pfnFlushScreenTextures();
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale
|
||||||
void HWR_MakePatch(const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
|
void HWR_MakePatch(const 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_PrepLevelCache(size_t pnumtextures);
|
void HWR_LoadTextures(size_t pnumtextures);
|
||||||
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);
|
||||||
void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 actualcolor, UINT8 strength);
|
void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 actualcolor, UINT8 strength);
|
||||||
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 actualcolor); // Lat: separate flags from color since color needs to be an uint to work right.
|
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 actualcolor); // Lat: separate flags from color since color needs to be an uint to work right.
|
||||||
|
@ -57,6 +57,7 @@ UINT8 *HWR_GetScreenshot(void);
|
||||||
boolean HWR_Screenshot(const char *pathname);
|
boolean HWR_Screenshot(const char *pathname);
|
||||||
|
|
||||||
void HWR_AddCommands(void);
|
void HWR_AddCommands(void);
|
||||||
|
void HWR_AddSessionCommands(void);
|
||||||
void HWR_CorrectSWTricks(void);
|
void HWR_CorrectSWTricks(void);
|
||||||
void transform(float *cx, float *cy, float *cz);
|
void transform(float *cx, float *cy, float *cz);
|
||||||
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
|
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
|
||||||
|
@ -85,13 +86,11 @@ extern consvar_t cv_grcoronasize;
|
||||||
extern consvar_t cv_grfov;
|
extern consvar_t cv_grfov;
|
||||||
extern consvar_t cv_grmodels;
|
extern consvar_t cv_grmodels;
|
||||||
extern consvar_t cv_grmodelinterpolation;
|
extern consvar_t cv_grmodelinterpolation;
|
||||||
|
extern consvar_t cv_grmodellighting;
|
||||||
extern consvar_t cv_grfog;
|
extern consvar_t cv_grfog;
|
||||||
extern consvar_t cv_grfogcolor;
|
extern consvar_t cv_grfogcolor;
|
||||||
extern consvar_t cv_grfogdensity;
|
extern consvar_t cv_grfogdensity;
|
||||||
extern consvar_t cv_grsoftwarefog;
|
extern consvar_t cv_grsoftwarefog;
|
||||||
extern consvar_t cv_grgammared;
|
|
||||||
extern consvar_t cv_grgammagreen;
|
|
||||||
extern consvar_t cv_grgammablue;
|
|
||||||
extern consvar_t cv_grfiltermode;
|
extern consvar_t cv_grfiltermode;
|
||||||
extern consvar_t cv_granisotropicmode;
|
extern consvar_t cv_granisotropicmode;
|
||||||
extern consvar_t cv_grcorrecttricks;
|
extern consvar_t cv_grcorrecttricks;
|
||||||
|
|
|
@ -239,7 +239,7 @@ static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_
|
||||||
|
|
||||||
{
|
{
|
||||||
png_uint_32 i, pitch = png_get_rowbytes(png_ptr, png_info_ptr);
|
png_uint_32 i, pitch = png_get_rowbytes(png_ptr, png_info_ptr);
|
||||||
png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRCACHE, &grpatch->mipmap->grInfo.data);
|
png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRMODELTEXTURE, &grpatch->mipmap->grInfo.data);
|
||||||
png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep));
|
png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep));
|
||||||
for (i = 0; i < height; i++)
|
for (i = 0; i < height; i++)
|
||||||
row_pointers[i] = PNG_image + i*pitch;
|
row_pointers[i] = PNG_image + i*pitch;
|
||||||
|
@ -313,7 +313,7 @@ static GrTextureFormat_t PCX_Load(const char *filename, int *w, int *h,
|
||||||
|
|
||||||
pw = *w = header.xmax - header.xmin + 1;
|
pw = *w = header.xmax - header.xmin + 1;
|
||||||
ph = *h = header.ymax - header.ymin + 1;
|
ph = *h = header.ymax - header.ymin + 1;
|
||||||
image = Z_Malloc(pw*ph*4, PU_HWRCACHE, &grpatch->mipmap->grInfo.data);
|
image = Z_Malloc(pw*ph*4, PU_HWRMODELTEXTURE, &grpatch->mipmap->grInfo.data);
|
||||||
|
|
||||||
if (fread(palette, sizeof (UINT8), PALSIZE, file) != PALSIZE)
|
if (fread(palette, sizeof (UINT8), PALSIZE, file) != PALSIZE)
|
||||||
{
|
{
|
||||||
|
@ -373,6 +373,9 @@ static void md2_loadTexture(md2_t *model)
|
||||||
if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data)
|
if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data)
|
||||||
{
|
{
|
||||||
int w = 0, h = 0;
|
int w = 0, h = 0;
|
||||||
|
UINT32 size;
|
||||||
|
RGBA_t *image;
|
||||||
|
|
||||||
#ifdef HAVE_PNG
|
#ifdef HAVE_PNG
|
||||||
grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch);
|
grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch);
|
||||||
if (grpatch->mipmap->grInfo.format == 0)
|
if (grpatch->mipmap->grInfo.format == 0)
|
||||||
|
@ -389,6 +392,15 @@ static void md2_loadTexture(md2_t *model)
|
||||||
grpatch->mipmap->width = (UINT16)w;
|
grpatch->mipmap->width = (UINT16)w;
|
||||||
grpatch->mipmap->height = (UINT16)h;
|
grpatch->mipmap->height = (UINT16)h;
|
||||||
|
|
||||||
|
// Lactozilla: Apply colour cube
|
||||||
|
image = grpatch->mipmap->grInfo.data;
|
||||||
|
size = w*h;
|
||||||
|
while (size--)
|
||||||
|
{
|
||||||
|
V_CubeApply(&image->s.red, &image->s.green, &image->s.blue);
|
||||||
|
image++;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef GLIDE_API_COMPATIBILITY
|
#ifdef GLIDE_API_COMPATIBILITY
|
||||||
// not correct!
|
// not correct!
|
||||||
grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256;
|
grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256;
|
||||||
|
@ -397,7 +409,6 @@ static void md2_loadTexture(md2_t *model)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
HWD.pfnSetTexture(grpatch->mipmap);
|
HWD.pfnSetTexture(grpatch->mipmap);
|
||||||
HWR_UnlockCachedPatch(grpatch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------+
|
// -----------------+
|
||||||
|
@ -453,7 +464,6 @@ static void md2_loadBlendTexture(md2_t *model)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary
|
HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary
|
||||||
HWR_UnlockCachedPatch(grpatch);
|
|
||||||
|
|
||||||
Z_Free(filename);
|
Z_Free(filename);
|
||||||
}
|
}
|
||||||
|
@ -637,18 +647,20 @@ spritemd2found:
|
||||||
// 0.7152 to green
|
// 0.7152 to green
|
||||||
// 0.0722 to blue
|
// 0.0722 to blue
|
||||||
#define SETBRIGHTNESS(brightness,r,g,b) \
|
#define SETBRIGHTNESS(brightness,r,g,b) \
|
||||||
brightness = (UINT8)(((1063*((UINT16)r)/5000) + (3576*((UINT16)g)/5000) + (361*((UINT16)b)/5000)) / 3)
|
brightness = (UINT8)(((1063*(UINT16)(r))/5000) + ((3576*(UINT16)(g))/5000) + ((361*(UINT16)(b))/5000))
|
||||||
|
|
||||||
static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, INT32 skinnum, skincolors_t color)
|
static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, GLMipmap_t *grmip, INT32 skinnum, skincolors_t color)
|
||||||
{
|
{
|
||||||
UINT8 i;
|
|
||||||
UINT16 w = gpatch->width, h = gpatch->height;
|
UINT16 w = gpatch->width, h = gpatch->height;
|
||||||
UINT32 size = w*h;
|
UINT32 size = w*h;
|
||||||
RGBA_t *image, *blendimage, *cur, blendcolor;
|
RGBA_t *image, *blendimage, *cur, blendcolor;
|
||||||
|
|
||||||
|
// vanilla port
|
||||||
|
UINT8 translation[16];
|
||||||
|
memset(translation, 0, sizeof(translation));
|
||||||
|
|
||||||
if (grmip->width == 0)
|
if (grmip->width == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
grmip->width = gpatch->width;
|
grmip->width = gpatch->width;
|
||||||
grmip->height = gpatch->height;
|
grmip->height = gpatch->height;
|
||||||
|
|
||||||
|
@ -658,80 +670,58 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
||||||
grmip->grInfo.format = GR_RGBA;
|
grmip->grInfo.format = GR_RGBA;
|
||||||
}
|
}
|
||||||
|
|
||||||
Z_Free(grmip->grInfo.data);
|
if (grmip->grInfo.data)
|
||||||
grmip->grInfo.data = NULL;
|
{
|
||||||
|
Z_Free(grmip->grInfo.data);
|
||||||
|
grmip->grInfo.data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data);
|
cur = Z_Malloc(size*4, PU_HWRMODELTEXTURE, &grmip->grInfo.data);
|
||||||
memset(cur, 0x00, size*4);
|
memset(cur, 0x00, size*4);
|
||||||
|
|
||||||
image = gpatch->mipmap->grInfo.data;
|
image = gpatch->mipmap->grInfo.data;
|
||||||
blendimage = blendgpatch->mipmap->grInfo.data;
|
blendimage = blendgpatch->mipmap->grInfo.data;
|
||||||
|
blendcolor = V_GetColor(0); // initialize
|
||||||
|
|
||||||
// Average all of the translation's colors
|
if (color != SKINCOLOR_NONE)
|
||||||
if (color == SKINCOLOR_NONE || color >= MAXTRANSLATIONS)
|
memcpy(&translation, &Color_Index[color - 1], 16);
|
||||||
blendcolor = V_GetColor(0xff);
|
|
||||||
else
|
while (size--)
|
||||||
{
|
{
|
||||||
const UINT8 div = 6;
|
if (skinnum == TC_BOSS)
|
||||||
const UINT8 start = 4;
|
|
||||||
UINT32 r, g, b;
|
|
||||||
|
|
||||||
blendcolor = V_GetColor(Color_Index[color-1][start]);
|
|
||||||
r = (UINT32)(blendcolor.s.red*blendcolor.s.red);
|
|
||||||
g = (UINT32)(blendcolor.s.green*blendcolor.s.green);
|
|
||||||
b = (UINT32)(blendcolor.s.blue*blendcolor.s.blue);
|
|
||||||
|
|
||||||
for (i = 1; i < div; i++)
|
|
||||||
{
|
{
|
||||||
RGBA_t nextcolor = V_GetColor(Color_Index[color-1][start+i]);
|
// Turn everything below a certain threshold white
|
||||||
r += (UINT32)(nextcolor.s.red*nextcolor.s.red);
|
if ((image->s.red == image->s.green) && (image->s.green == image->s.blue) && image->s.blue <= 82)
|
||||||
g += (UINT32)(nextcolor.s.green*nextcolor.s.green);
|
|
||||||
b += (UINT32)(nextcolor.s.blue*nextcolor.s.blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
blendcolor.s.red = (UINT8)(FixedSqrt((r/div)<<FRACBITS)>>FRACBITS);
|
|
||||||
blendcolor.s.green = (UINT8)(FixedSqrt((g/div)<<FRACBITS)>>FRACBITS);
|
|
||||||
blendcolor.s.blue = (UINT8)(FixedSqrt((b/div)<<FRACBITS)>>FRACBITS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// rainbow support, could theoretically support boss ones too
|
|
||||||
if (skinnum == TC_RAINBOW)
|
|
||||||
{
|
|
||||||
while (size--)
|
|
||||||
{
|
|
||||||
if (image->s.alpha == 0 && blendimage->s.alpha == 0)
|
|
||||||
{
|
{
|
||||||
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
// Lactozilla: Invert the colors
|
||||||
cur->rgba = image->rgba;
|
cur->s.red = cur->s.green = cur->s.blue = (255 - image->s.blue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UINT32 tempcolor;
|
cur->s.red = image->s.red;
|
||||||
UINT16 imagebright, blendbright, finalbright, colorbright;
|
cur->s.green = image->s.green;
|
||||||
SETBRIGHTNESS(imagebright,image->s.red,image->s.green,image->s.blue);
|
cur->s.blue = image->s.blue;
|
||||||
SETBRIGHTNESS(blendbright,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
|
|
||||||
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
|
|
||||||
finalbright = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
|
|
||||||
SETBRIGHTNESS(colorbright,blendcolor.s.red,blendcolor.s.green,blendcolor.s.blue);
|
|
||||||
|
|
||||||
tempcolor = (finalbright*blendcolor.s.red)/colorbright;
|
|
||||||
tempcolor = min(255, tempcolor);
|
|
||||||
cur->s.red = (UINT8)tempcolor;
|
|
||||||
tempcolor = (finalbright*blendcolor.s.green)/colorbright;
|
|
||||||
tempcolor = min(255, tempcolor);
|
|
||||||
cur->s.green = (UINT8)tempcolor;
|
|
||||||
tempcolor = (finalbright*blendcolor.s.blue)/colorbright;
|
|
||||||
tempcolor = min(255, tempcolor);
|
|
||||||
cur->s.blue = (UINT8)tempcolor;
|
|
||||||
cur->s.alpha = image->s.alpha;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur++; image++; blendimage++;
|
cur->s.alpha = image->s.alpha;
|
||||||
}
|
}
|
||||||
}
|
else if (skinnum == TC_METALSONIC)
|
||||||
else if (skinnum == TC_DASHMODE)
|
{
|
||||||
{
|
// Turn everything below a certain blue threshold white
|
||||||
while (size--)
|
if (image->s.red == 0 && image->s.green == 0 && image->s.blue <= 82)
|
||||||
|
{
|
||||||
|
cur->s.red = cur->s.green = cur->s.blue = 255;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur->s.red = image->s.red;
|
||||||
|
cur->s.green = image->s.green;
|
||||||
|
cur->s.blue = image->s.blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur->s.alpha = image->s.alpha;
|
||||||
|
}
|
||||||
|
else if (skinnum == TC_DASHMODE)
|
||||||
{
|
{
|
||||||
if (image->s.alpha == 0 && blendimage->s.alpha == 0)
|
if (image->s.alpha == 0 && blendimage->s.alpha == 0)
|
||||||
{
|
{
|
||||||
|
@ -761,45 +751,194 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch,
|
||||||
cur->s.blue = (ialpha * icolor.s.blue + balpha * bcolor.s.blue)/255;
|
cur->s.blue = (ialpha * icolor.s.blue + balpha * bcolor.s.blue)/255;
|
||||||
cur->s.alpha = image->s.alpha;
|
cur->s.alpha = image->s.alpha;
|
||||||
}
|
}
|
||||||
cur++; image++; blendimage++;
|
|
||||||
}
|
}
|
||||||
}
|
else if (skinnum == TC_ALLWHITE)
|
||||||
else
|
|
||||||
{
|
|
||||||
while (size--)
|
|
||||||
{
|
{
|
||||||
if (blendimage->s.alpha == 0)
|
// Turn everything white
|
||||||
|
cur->s.red = cur->s.green = cur->s.blue = 255;
|
||||||
|
cur->s.alpha = image->s.alpha;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UINT16 brightness;
|
||||||
|
|
||||||
|
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
||||||
|
if (skinnum == TC_RAINBOW)
|
||||||
{
|
{
|
||||||
// Don't bother with blending the pixel if the alpha of the blend pixel is 0
|
if (image->s.alpha == 0 && blendimage->s.alpha == 0)
|
||||||
cur->rgba = image->rgba;
|
{
|
||||||
|
cur->rgba = image->rgba;
|
||||||
|
cur++; image++; blendimage++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UINT16 imagebright, blendbright;
|
||||||
|
SETBRIGHTNESS(imagebright,image->s.red,image->s.green,image->s.blue);
|
||||||
|
SETBRIGHTNESS(blendbright,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
|
||||||
|
// slightly dumb average between the blend image color and base image colour, usually one or the other will be fully opaque anyway
|
||||||
|
brightness = (imagebright*(255-blendimage->s.alpha))/255 + (blendbright*blendimage->s.alpha)/255;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INT32 tempcolor;
|
if (blendimage->s.alpha == 0)
|
||||||
INT16 tempmult, tempalpha;
|
{
|
||||||
tempalpha = -(abs(blendimage->s.red-127)-127)*2;
|
cur->rgba = image->rgba;
|
||||||
if (tempalpha > 255)
|
cur++; image++; blendimage++;
|
||||||
tempalpha = 255;
|
continue;
|
||||||
else if (tempalpha < 0)
|
}
|
||||||
tempalpha = 0;
|
else
|
||||||
|
{
|
||||||
|
SETBRIGHTNESS(brightness,blendimage->s.red,blendimage->s.green,blendimage->s.blue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tempmult = (blendimage->s.red-127)*2;
|
// Calculate a sort of "gradient" for the skincolor
|
||||||
if (tempmult > 255)
|
// (Me splitting this into a function didn't work, so I had to ruin this entire function's groove...)
|
||||||
tempmult = 255;
|
{
|
||||||
else if (tempmult < 0)
|
RGBA_t nextcolor;
|
||||||
tempmult = 0;
|
UINT8 firsti, secondi, mul;
|
||||||
|
UINT32 r, g, b;
|
||||||
|
|
||||||
tempcolor = (image->s.red*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.red)/255)) * blendimage->s.alpha)/255;
|
// Rainbow needs to find the closest match to the textures themselves, instead of matching brightnesses to other colors.
|
||||||
|
// Ensue horrible mess.
|
||||||
|
if (skinnum == TC_RAINBOW)
|
||||||
|
{
|
||||||
|
UINT16 brightdif = 256;
|
||||||
|
UINT8 colorbrightnesses[16];
|
||||||
|
INT32 compare, m, d;
|
||||||
|
UINT8 i;
|
||||||
|
|
||||||
|
// Ignore pure white & pitch black
|
||||||
|
if (brightness > 253 || brightness < 2)
|
||||||
|
{
|
||||||
|
cur->rgba = image->rgba;
|
||||||
|
cur++; image++; blendimage++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
firsti = 0;
|
||||||
|
mul = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
RGBA_t tempc = V_GetColor(translation[i]);
|
||||||
|
SETBRIGHTNESS(colorbrightnesses[i], tempc.s.red, tempc.s.green, tempc.s.blue); // store brightnesses for comparison
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (brightness > colorbrightnesses[i]) // don't allow greater matches (because calculating a makeshift gradient for this is already a huge mess as is)
|
||||||
|
continue;
|
||||||
|
compare = abs((INT16)(colorbrightnesses[i]) - (INT16)(brightness));
|
||||||
|
if (compare < brightdif)
|
||||||
|
{
|
||||||
|
brightdif = (UINT16)compare;
|
||||||
|
firsti = i; // best matching color that's equal brightness or darker
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
secondi = firsti+1; // next color in line
|
||||||
|
if (secondi == 16)
|
||||||
|
{
|
||||||
|
m = (INT16)brightness; // - 0;
|
||||||
|
d = (INT16)colorbrightnesses[firsti]; // - 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m = (INT16)brightness - (INT16)colorbrightnesses[secondi];
|
||||||
|
d = (INT16)colorbrightnesses[firsti] - (INT16)colorbrightnesses[secondi];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m >= d)
|
||||||
|
m = d-1;
|
||||||
|
|
||||||
|
// calculate the "gradient" multiplier based on how close this color is to the one next in line
|
||||||
|
if (m <= 0 || d <= 0)
|
||||||
|
mul = 0;
|
||||||
|
else
|
||||||
|
mul = 15 - ((m * 16) / d);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Thankfully, it's normally way more simple.
|
||||||
|
// Just convert brightness to a skincolor value, use remainder to find the gradient multipler
|
||||||
|
firsti = ((UINT8)(255-brightness) / 16);
|
||||||
|
secondi = firsti+1;
|
||||||
|
mul = ((UINT8)(255-brightness) % 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
blendcolor = V_GetColor(translation[firsti]);
|
||||||
|
|
||||||
|
if (mul > 0 // If it's 0, then we only need the first color.
|
||||||
|
&& translation[firsti] != translation[secondi]) // Some colors have duplicate colors in a row, so let's just save the process
|
||||||
|
{
|
||||||
|
if (secondi == 16) // blend to black
|
||||||
|
nextcolor = V_GetColor(31);
|
||||||
|
else
|
||||||
|
nextcolor = V_GetColor(translation[secondi]);
|
||||||
|
|
||||||
|
// Find difference between points
|
||||||
|
r = (UINT32)(nextcolor.s.red - blendcolor.s.red);
|
||||||
|
g = (UINT32)(nextcolor.s.green - blendcolor.s.green);
|
||||||
|
b = (UINT32)(nextcolor.s.blue - blendcolor.s.blue);
|
||||||
|
|
||||||
|
// Find the gradient of the two points
|
||||||
|
r = ((mul * r) / 16);
|
||||||
|
g = ((mul * g) / 16);
|
||||||
|
b = ((mul * b) / 16);
|
||||||
|
|
||||||
|
// Add gradient value to color
|
||||||
|
blendcolor.s.red += r;
|
||||||
|
blendcolor.s.green += g;
|
||||||
|
blendcolor.s.blue += b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skinnum == TC_RAINBOW)
|
||||||
|
{
|
||||||
|
UINT32 tempcolor;
|
||||||
|
UINT16 colorbright;
|
||||||
|
|
||||||
|
SETBRIGHTNESS(colorbright,blendcolor.s.red,blendcolor.s.green,blendcolor.s.blue);
|
||||||
|
if (colorbright == 0)
|
||||||
|
colorbright = 1; // no dividing by 0 please
|
||||||
|
|
||||||
|
tempcolor = (brightness * blendcolor.s.red) / colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
cur->s.red = (UINT8)tempcolor;
|
cur->s.red = (UINT8)tempcolor;
|
||||||
tempcolor = (image->s.green*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.green)/255)) * blendimage->s.alpha)/255;
|
|
||||||
|
tempcolor = (brightness * blendcolor.s.green) / colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
cur->s.green = (UINT8)tempcolor;
|
cur->s.green = (UINT8)tempcolor;
|
||||||
tempcolor = (image->s.blue*(255-blendimage->s.alpha))/255 + ((tempmult + ((tempalpha*blendcolor.s.blue)/255)) * blendimage->s.alpha)/255;
|
|
||||||
|
tempcolor = (brightness * blendcolor.s.blue) / colorbright;
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
cur->s.blue = (UINT8)tempcolor;
|
cur->s.blue = (UINT8)tempcolor;
|
||||||
cur->s.alpha = image->s.alpha;
|
cur->s.alpha = image->s.alpha;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Color strength depends on image alpha
|
||||||
|
INT32 tempcolor;
|
||||||
|
|
||||||
cur++; image++; blendimage++;
|
tempcolor = ((image->s.red * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.red * blendimage->s.alpha) / 255);
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.red = (UINT8)tempcolor;
|
||||||
|
|
||||||
|
tempcolor = ((image->s.green * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.green * blendimage->s.alpha) / 255);
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.green = (UINT8)tempcolor;
|
||||||
|
|
||||||
|
tempcolor = ((image->s.blue * (255-blendimage->s.alpha)) / 255) + ((blendcolor.s.blue * blendimage->s.alpha) / 255);
|
||||||
|
tempcolor = min(255, tempcolor);
|
||||||
|
cur->s.blue = (UINT8)tempcolor;
|
||||||
|
cur->s.alpha = image->s.alpha;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cur++; image++; blendimage++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -812,24 +951,24 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
// mostly copied from HWR_GetMappedPatch, hence the similarities and comment
|
||||||
GLMipmap_t *grmip, *newmip;
|
GLMipmap_t *grmip, *newmip;
|
||||||
|
|
||||||
if (colormap == colormaps || colormap == NULL)
|
if ((colormap == colormaps || colormap == NULL) && (skinnum > TC_DEFAULT))
|
||||||
{
|
{
|
||||||
// Don't do any blending
|
// Don't do any blending
|
||||||
HWD.pfnSetTexture(gpatch->mipmap);
|
HWD.pfnSetTexture(gpatch->mipmap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// search for the mimmap
|
// search for the mipmap
|
||||||
// skip the first (no colormap translated)
|
// skip the first (no colormap translated)
|
||||||
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
for (grmip = gpatch->mipmap; grmip->nextcolormap; )
|
||||||
{
|
{
|
||||||
grmip = grmip->nextcolormap;
|
grmip = grmip->nextcolormap;
|
||||||
if (grmip->colormap == colormap)
|
if (grmip->colormap == colormap || grmip->tcindex == skinnum)
|
||||||
{
|
{
|
||||||
if (grmip->downloaded && grmip->grInfo.data)
|
if (grmip->downloaded && grmip->grInfo.data)
|
||||||
{
|
{
|
||||||
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
HWD.pfnSetTexture(grmip); // found the colormap, set it to the correct texture
|
||||||
Z_ChangeTag(grmip->grInfo.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(grmip->grInfo.data, PU_HWRMODELTEXTURE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -847,16 +986,27 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
|
||||||
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
I_Error("%s: Out of memory", "HWR_GetMappedPatch");
|
||||||
grmip->nextcolormap = newmip;
|
grmip->nextcolormap = newmip;
|
||||||
newmip->colormap = colormap;
|
newmip->colormap = colormap;
|
||||||
|
newmip->tcindex = skinnum;
|
||||||
|
|
||||||
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
HWR_CreateBlendedTexture(gpatch, blendgpatch, newmip, skinnum, color);
|
||||||
|
|
||||||
HWD.pfnSetTexture(newmip);
|
HWD.pfnSetTexture(newmip);
|
||||||
Z_ChangeTag(newmip->grInfo.data, PU_HWRCACHE_UNLOCKED);
|
Z_ChangeTag(newmip->grInfo.data, PU_HWRMODELTEXTURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NORMALFOG 0x00000000
|
#define NORMALFOG 0x00000000
|
||||||
#define FADEFOG 0x19000000
|
#define FADEFOG 0x19000000
|
||||||
|
|
||||||
|
static boolean HWR_AllowModel(mobj_t *mobj)
|
||||||
|
{
|
||||||
|
// Signpost overlay. Not needed.
|
||||||
|
if (mobj->state-states == S_PLAY_SIGN)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Otherwise, render the model.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static boolean HWR_CanInterpolateModel(mobj_t *mobj, model_t *model)
|
static boolean HWR_CanInterpolateModel(mobj_t *mobj, model_t *model)
|
||||||
{
|
{
|
||||||
if (cv_grmodelinterpolation.value == 2) // Always interpolate
|
if (cv_grmodelinterpolation.value == 2) // Always interpolate
|
||||||
|
@ -932,7 +1082,7 @@ static UINT8 HWR_GetModelSprite2(md2_t *md2, skin_t *skin, UINT8 spr2, player_t
|
||||||
// HWR_DrawModel
|
// HWR_DrawModel
|
||||||
//
|
//
|
||||||
|
|
||||||
void HWR_DrawModel(gr_vissprite_t *spr)
|
boolean HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
{
|
{
|
||||||
FSurfaceInfo Surf;
|
FSurfaceInfo Surf;
|
||||||
|
|
||||||
|
@ -945,10 +1095,12 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
UINT8 color[4];
|
UINT8 color[4];
|
||||||
|
|
||||||
if (!cv_grmodels.value)
|
if (!cv_grmodels.value)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
if (spr->precip)
|
if (spr->precip)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
|
memset(&p, 0x00, sizeof(FTransform));
|
||||||
|
|
||||||
// MD2 colormap fix
|
// MD2 colormap fix
|
||||||
// colormap test
|
// colormap test
|
||||||
|
@ -1036,7 +1188,7 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (md2->error)
|
if (md2->error)
|
||||||
return; // we already failed loading this before :(
|
return false; // we already failed loading this before :(
|
||||||
if (!md2->model)
|
if (!md2->model)
|
||||||
{
|
{
|
||||||
//CONS_Debug(DBG_RENDER, "Loading model... (%s)", sprnames[spr->mobj->sprite]);
|
//CONS_Debug(DBG_RENDER, "Loading model... (%s)", sprnames[spr->mobj->sprite]);
|
||||||
|
@ -1052,9 +1204,14 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
{
|
{
|
||||||
//CONS_Debug(DBG_RENDER, " FAILED\n");
|
//CONS_Debug(DBG_RENDER, " FAILED\n");
|
||||||
md2->error = true; // prevent endless fail
|
md2->error = true; // prevent endless fail
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lactozilla: Disallow certain models from rendering
|
||||||
|
if (!HWR_AllowModel(spr->mobj))
|
||||||
|
return false;
|
||||||
|
|
||||||
//HWD.pfnSetBlend(blend); // This seems to actually break translucency?
|
//HWD.pfnSetBlend(blend); // This seems to actually break translucency?
|
||||||
finalscale = md2->scale;
|
finalscale = md2->scale;
|
||||||
//Hurdler: arf, I don't like that implementation at all... too much crappy
|
//Hurdler: arf, I don't like that implementation at all... too much crappy
|
||||||
|
@ -1069,11 +1226,10 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
|
|
||||||
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture
|
||||||
{
|
{
|
||||||
if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE &&
|
if (md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format
|
||||||
md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format
|
|
||||||
&& gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height)
|
&& gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height)
|
||||||
{
|
{
|
||||||
INT32 skinnum = TC_DEFAULT;
|
INT32 skinnum = INT32_MAX;
|
||||||
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
if ((spr->mobj->flags & (MF_ENEMY|MF_BOSS)) && (spr->mobj->flags2 & MF2_FRET) && !(spr->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
if (spr->mobj->type == MT_CYBRAKDEMON || spr->mobj->colorized)
|
if (spr->mobj->type == MT_CYBRAKDEMON || spr->mobj->colorized)
|
||||||
|
@ -1083,7 +1239,7 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
else
|
else
|
||||||
skinnum = TC_BOSS;
|
skinnum = TC_BOSS;
|
||||||
}
|
}
|
||||||
else if (spr->mobj->color)
|
else if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE)
|
||||||
{
|
{
|
||||||
if (spr->mobj->colorized)
|
if (spr->mobj->colorized)
|
||||||
skinnum = TC_RAINBOW;
|
skinnum = TC_RAINBOW;
|
||||||
|
@ -1101,7 +1257,15 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
else
|
else
|
||||||
skinnum = TC_DEFAULT;
|
skinnum = TC_DEFAULT;
|
||||||
}
|
}
|
||||||
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
|
||||||
|
// Translation or skin number found
|
||||||
|
if (skinnum != INT32_MAX)
|
||||||
|
HWR_GetBlendedTexture(gpatch, (GLPatch_t *)md2->blendgrpatch, skinnum, spr->colormap, (skincolors_t)spr->mobj->color);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Sorry nothing
|
||||||
|
HWD.pfnSetTexture(gpatch->mipmap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1279,6 +1443,8 @@ void HWR_DrawModel(gr_vissprite_t *spr)
|
||||||
|
|
||||||
HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color);
|
HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //HWRENDER
|
#endif //HWRENDER
|
||||||
|
|
|
@ -45,8 +45,8 @@ extern md2_t md2_models[NUMSPRITES];
|
||||||
extern md2_t md2_playermodels[MAXSKINS];
|
extern md2_t md2_playermodels[MAXSKINS];
|
||||||
|
|
||||||
void HWR_InitModels(void);
|
void HWR_InitModels(void);
|
||||||
void HWR_DrawModel(gr_vissprite_t *spr);
|
|
||||||
void HWR_AddPlayerModel(INT32 skin);
|
void HWR_AddPlayerModel(INT32 skin);
|
||||||
void HWR_AddSpriteModel(size_t spritenum);
|
void HWR_AddSpriteModel(size_t spritenum);
|
||||||
|
boolean HWR_DrawModel(gr_vissprite_t *spr);
|
||||||
|
|
||||||
#endif // _HW_MD2_H_
|
#endif // _HW_MD2_H_
|
||||||
|
|
|
@ -564,20 +564,15 @@ EXPORT void HWRAPI(FinishUpdate) (INT32 waitvbl)
|
||||||
// : in OpenGL, we store values for conversion of paletted graphics when
|
// : in OpenGL, we store values for conversion of paletted graphics when
|
||||||
// : they are downloaded to the 3D card.
|
// : they are downloaded to the 3D card.
|
||||||
// -----------------+
|
// -----------------+
|
||||||
EXPORT void HWRAPI(SetPalette) (RGBA_t *pal, RGBA_t *gamma)
|
EXPORT void HWRAPI(SetPalette) (RGBA_t *pal)
|
||||||
{
|
{
|
||||||
INT32 i;
|
size_t palsize = (sizeof(RGBA_t) * 256);
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
myPaletteData[i].s.red = (UINT8)MIN((pal[i].s.red*gamma->s.red)/127, 255);
|
|
||||||
myPaletteData[i].s.green = (UINT8)MIN((pal[i].s.green*gamma->s.green)/127, 255);
|
|
||||||
myPaletteData[i].s.blue = (UINT8)MIN((pal[i].s.blue*gamma->s.blue)/127, 255);
|
|
||||||
myPaletteData[i].s.alpha = pal[i].s.alpha;
|
|
||||||
}
|
|
||||||
|
|
||||||
// on a palette change, you have to reload all of the textures
|
// on a palette change, you have to reload all of the textures
|
||||||
Flush();
|
if (memcmp(&myPaletteData, pal, palsize))
|
||||||
|
{
|
||||||
|
memcpy(&myPaletteData, pal, palsize);
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -85,7 +85,7 @@ static GLboolean MipMap = GL_FALSE;
|
||||||
static GLint min_filter = GL_LINEAR;
|
static GLint min_filter = GL_LINEAR;
|
||||||
static GLint mag_filter = GL_LINEAR;
|
static GLint mag_filter = GL_LINEAR;
|
||||||
static GLint anisotropic_filter = 0;
|
static GLint anisotropic_filter = 0;
|
||||||
static FTransform md2_transform;
|
static boolean model_lighting = true;
|
||||||
|
|
||||||
const GLubyte *gl_extensions = NULL;
|
const GLubyte *gl_extensions = NULL;
|
||||||
|
|
||||||
|
@ -723,8 +723,8 @@ void Flush(void)
|
||||||
|
|
||||||
while (gr_cachehead)
|
while (gr_cachehead)
|
||||||
{
|
{
|
||||||
// ceci n'est pas du tout necessaire vu que tu les a charger normalement et
|
// this is not necessary at all, because you have loaded them normally,
|
||||||
// donc il sont dans ta liste !
|
// and so they already are in your list!
|
||||||
#if 0
|
#if 0
|
||||||
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
//Hurdler: 25/04/2000: now support colormap in hardware mode
|
||||||
FTextureInfo *tmp = gr_cachehead->nextskin;
|
FTextureInfo *tmp = gr_cachehead->nextskin;
|
||||||
|
@ -1296,11 +1296,11 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
|
||||||
|
|
||||||
pTexInfo->nextmipmap = NULL;
|
pTexInfo->nextmipmap = NULL;
|
||||||
if (gr_cachetail)
|
if (gr_cachetail)
|
||||||
{ // insertion en fin de liste
|
{ // insertion at the tail
|
||||||
gr_cachetail->nextmipmap = pTexInfo;
|
gr_cachetail->nextmipmap = pTexInfo;
|
||||||
gr_cachetail = pTexInfo;
|
gr_cachetail = pTexInfo;
|
||||||
}
|
}
|
||||||
else // initialisation de la liste
|
else // initialization of the linked list
|
||||||
gr_cachetail = gr_cachehead = pTexInfo;
|
gr_cachetail = gr_cachehead = pTexInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1659,16 +1659,9 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
|
||||||
{
|
{
|
||||||
switch (IdState)
|
switch (IdState)
|
||||||
{
|
{
|
||||||
|
case HWD_SET_MODEL_LIGHTING:
|
||||||
#if 0
|
model_lighting = Value;
|
||||||
case 77:
|
|
||||||
{
|
|
||||||
//08/01/00: Hurdler this is a test for mirror
|
|
||||||
if (!Value)
|
|
||||||
ClearBuffer(false, true, 0); // clear depth buffer
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case HWD_SET_FOG_COLOR:
|
case HWD_SET_FOG_COLOR:
|
||||||
{
|
{
|
||||||
|
@ -1681,6 +1674,7 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
|
||||||
pglFogfv(GL_FOG_COLOR, fogcolor);
|
pglFogfv(GL_FOG_COLOR, fogcolor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case HWD_SET_FOG_DENSITY:
|
case HWD_SET_FOG_DENSITY:
|
||||||
pglFogf(GL_FOG_DENSITY, Value*1200/(500*1000000.0f));
|
pglFogf(GL_FOG_DENSITY, Value*1200/(500*1000000.0f));
|
||||||
break;
|
break;
|
||||||
|
@ -2045,16 +2039,25 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pglLightfv(GL_LIGHT0, GL_POSITION, LightPos);
|
if (model_lighting)
|
||||||
|
{
|
||||||
|
pglLightfv(GL_LIGHT0, GL_POSITION, LightPos);
|
||||||
|
pglShadeModel(GL_SMOOTH);
|
||||||
|
}
|
||||||
|
|
||||||
pglShadeModel(GL_SMOOTH);
|
|
||||||
if (color)
|
if (color)
|
||||||
{
|
{
|
||||||
#ifdef GL_LIGHT_MODEL_AMBIENT
|
#ifdef GL_LIGHT_MODEL_AMBIENT
|
||||||
pglEnable(GL_LIGHTING);
|
if (model_lighting)
|
||||||
pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
|
{
|
||||||
pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
|
pglEnable(GL_LIGHTING);
|
||||||
|
pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
|
||||||
|
pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
|
||||||
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
|
pglColor4ubv((GLubyte*)color);
|
||||||
|
|
||||||
if (color[3] < 255)
|
if (color[3] < 255)
|
||||||
SetBlend(PF_Translucent|PF_Modulated|PF_Clip);
|
SetBlend(PF_Translucent|PF_Modulated|PF_Clip);
|
||||||
else
|
else
|
||||||
|
@ -2225,8 +2228,6 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
|
||||||
if (stransform)
|
if (stransform)
|
||||||
{
|
{
|
||||||
boolean fovx90;
|
boolean fovx90;
|
||||||
// keep a trace of the transformation for md2
|
|
||||||
memcpy(&md2_transform, stransform, sizeof (md2_transform));
|
|
||||||
|
|
||||||
#ifdef USE_FTRANSFORM_MIRROR
|
#ifdef USE_FTRANSFORM_MIRROR
|
||||||
// mirroring from Kart
|
// mirroring from Kart
|
||||||
|
|
64
src/m_menu.c
64
src/m_menu.c
|
@ -309,7 +309,7 @@ static void M_ChangeControl(INT32 choice);
|
||||||
// Video & Sound
|
// Video & Sound
|
||||||
menu_t OP_VideoOptionsDef, OP_VideoModeDef, OP_ColorOptionsDef;
|
menu_t OP_VideoOptionsDef, OP_VideoModeDef, OP_ColorOptionsDef;
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
menu_t OP_OpenGLOptionsDef, OP_OpenGLFogDef, OP_OpenGLColorDef;
|
menu_t OP_OpenGLOptionsDef, OP_OpenGLFogDef;
|
||||||
#endif
|
#endif
|
||||||
menu_t OP_SoundOptionsDef;
|
menu_t OP_SoundOptionsDef;
|
||||||
menu_t OP_SoundAdvancedDef;
|
menu_t OP_SoundAdvancedDef;
|
||||||
|
@ -355,7 +355,6 @@ static void M_DrawScreenshotMenu(void);
|
||||||
static void M_DrawMonitorToggles(void);
|
static void M_DrawMonitorToggles(void);
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
static void M_OGL_DrawFogMenu(void);
|
static void M_OGL_DrawFogMenu(void);
|
||||||
static void M_OGL_DrawColorMenu(void);
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
static void M_DrawScreenshotMenu(void);
|
static void M_DrawScreenshotMenu(void);
|
||||||
|
@ -1300,21 +1299,25 @@ static menuitem_t OP_ColorOptionsMenu[] =
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
static menuitem_t OP_OpenGLOptionsMenu[] =
|
static menuitem_t OP_OpenGLOptionsMenu[] =
|
||||||
{
|
{
|
||||||
{IT_STRING|IT_CVAR, NULL, "Models", &cv_grmodels, 10},
|
{IT_HEADER, NULL, "3D Models", NULL, 0},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Model interpolation", &cv_grmodelinterpolation, 20},
|
{IT_STRING|IT_CVAR, NULL, "Models", &cv_grmodels, 12},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Model interpolation", &cv_grmodelinterpolation, 22},
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Model lighting", &cv_grmodellighting, 32},
|
||||||
|
|
||||||
{IT_STRING|IT_CVAR, NULL, "Field of view", &cv_grfov, 40},
|
{IT_HEADER, NULL, "General", NULL, 51},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 50},
|
{IT_STRING|IT_CVAR, NULL, "Field of view", &cv_grfov, 62},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 60},
|
{IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 72},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode,70},
|
{IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 82},
|
||||||
#if defined (_WINDOWS) && (!((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)))
|
{IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode,92},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 80},
|
|
||||||
#endif
|
{IT_HEADER, NULL, "Miscellaneous", NULL, 111},
|
||||||
|
{IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 123},
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 100},
|
{IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 133},
|
||||||
|
#endif
|
||||||
|
#if defined (_WINDOWS) && (!((defined (__unix__) && !defined (MSDOS)) || defined (UNIXCOMMON) || defined (HAVE_SDL)))
|
||||||
|
{IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 143},
|
||||||
#endif
|
#endif
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 110},
|
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 120},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
|
@ -1334,13 +1337,6 @@ static menuitem_t OP_OpenGLFogMenu[] =
|
||||||
{IT_STRING|IT_CVAR, NULL, "Fog density", &cv_grfogdensity, 30},
|
{IT_STRING|IT_CVAR, NULL, "Fog density", &cv_grfogdensity, 30},
|
||||||
{IT_STRING|IT_CVAR, NULL, "Software Fog",&cv_grsoftwarefog,40},
|
{IT_STRING|IT_CVAR, NULL, "Software Fog",&cv_grsoftwarefog,40},
|
||||||
};
|
};
|
||||||
|
|
||||||
static menuitem_t OP_OpenGLColorMenu[] =
|
|
||||||
{
|
|
||||||
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "red", &cv_grgammared, 10},
|
|
||||||
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "green", &cv_grgammagreen, 20},
|
|
||||||
{IT_STRING|IT_CVAR|IT_CV_SLIDER, NULL, "blue", &cv_grgammablue, 30},
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static menuitem_t OP_SoundOptionsMenu[] =
|
static menuitem_t OP_SoundOptionsMenu[] =
|
||||||
|
@ -2027,18 +2023,6 @@ menu_t OP_OpenGLFogDef =
|
||||||
0,
|
0,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
menu_t OP_OpenGLColorDef =
|
|
||||||
{
|
|
||||||
MN_OP_MAIN + (MN_OP_VIDEO << 6) + (MN_OP_OPENGL << 12) + (MN_OP_OPENGL_COLOR << 18),
|
|
||||||
"M_VIDEO",
|
|
||||||
sizeof (OP_OpenGLColorMenu)/sizeof (menuitem_t),
|
|
||||||
&OP_OpenGLOptionsDef,
|
|
||||||
OP_OpenGLColorMenu,
|
|
||||||
M_OGL_DrawColorMenu,
|
|
||||||
60, 40,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(
|
menu_t OP_DataOptionsDef = DEFAULTMENUSTYLE(
|
||||||
MN_OP_MAIN + (MN_OP_DATA << 6),
|
MN_OP_MAIN + (MN_OP_DATA << 6),
|
||||||
|
@ -11931,20 +11915,6 @@ static void M_OGL_DrawFogMenu(void)
|
||||||
my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, '_' | 0x80,false);
|
my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, '_' | 0x80,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =====================
|
|
||||||
// M_OGL_DrawColorMenu()
|
|
||||||
// =====================
|
|
||||||
static void M_OGL_DrawColorMenu(void)
|
|
||||||
{
|
|
||||||
INT32 mx, my;
|
|
||||||
|
|
||||||
mx = currentMenu->x;
|
|
||||||
my = currentMenu->y;
|
|
||||||
M_DrawGenericMenu(); // use generic drawer for cursor, items and title
|
|
||||||
V_DrawString(mx, my + currentMenu->menuitems[0].alphaKey - 10,
|
|
||||||
V_YELLOWMAP, "Gamma correction");
|
|
||||||
}
|
|
||||||
|
|
||||||
//===================
|
//===================
|
||||||
// M_HandleFogColor()
|
// M_HandleFogColor()
|
||||||
//===================
|
//===================
|
||||||
|
|
|
@ -3702,8 +3702,15 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
P_SpawnPrecipitation();
|
P_SpawnPrecipitation();
|
||||||
|
|
||||||
#ifdef HWRENDER // not win32 only 19990829 by Kin
|
#ifdef HWRENDER // not win32 only 19990829 by Kin
|
||||||
if (rendermode != render_soft && rendermode != render_none)
|
if (rendermode == render_opengl)
|
||||||
{
|
{
|
||||||
|
// Lactozilla (December 8, 2019)
|
||||||
|
// Level setup used to free EVERY mipmap from memory.
|
||||||
|
// Even mipmaps that aren't related to level textures.
|
||||||
|
// Presumably, the hardware render code used to store textures as level data.
|
||||||
|
// Meaning, they had memory allocated and marked with the PU_LEVEL tag.
|
||||||
|
// Level textures are only reloaded after R_LoadTextures, which is
|
||||||
|
// when the texture list is loaded.
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
// BP: reset light between levels (we draw preview frame lights on current frame)
|
// BP: reset light between levels (we draw preview frame lights on current frame)
|
||||||
HWR_ResetLights();
|
HWR_ResetLights();
|
||||||
|
@ -3858,11 +3865,6 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
if (!cv_analog2.changed)
|
if (!cv_analog2.changed)
|
||||||
CV_SetValue(&cv_analog2, 0);
|
CV_SetValue(&cv_analog2, 0);
|
||||||
|
|
||||||
#ifdef HWRENDER
|
|
||||||
if (rendermode != render_soft && rendermode != render_none)
|
|
||||||
CV_Set(&cv_grfov, cv_grfov.defaultvalue);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
displayplayer = consoleplayer; // Start with your OWN view, please!
|
displayplayer = consoleplayer; // Start with your OWN view, please!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3886,14 +3888,6 @@ boolean P_SetupLevel(boolean skipprecip)
|
||||||
// Fab : 19-07-98 : start cd music for this level (note: can be remapped)
|
// Fab : 19-07-98 : start cd music for this level (note: can be remapped)
|
||||||
I_PlayCD((UINT8)(gamemap), false);
|
I_PlayCD((UINT8)(gamemap), false);
|
||||||
|
|
||||||
// preload graphics
|
|
||||||
#ifdef HWRENDER // not win32 only 19990829 by Kin
|
|
||||||
if (rendermode != render_soft && rendermode != render_none)
|
|
||||||
{
|
|
||||||
HWR_PrepLevelCache(numtextures);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
P_MapEnd();
|
P_MapEnd();
|
||||||
|
|
||||||
// Remove the loading shit from the screen
|
// Remove the loading shit from the screen
|
||||||
|
|
|
@ -1386,5 +1386,13 @@ void R_RenderBSPNode(INT32 bspnum)
|
||||||
bspnum = bsp->children[side^1];
|
bspnum = bsp->children[side^1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PORTAL CULLING
|
||||||
|
if (portalcullsector) {
|
||||||
|
sector_t *sect = subsectors[bspnum & ~NF_SUBSECTOR].sector;
|
||||||
|
if (sect != portalcullsector)
|
||||||
|
return;
|
||||||
|
portalcullsector = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR);
|
R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,10 @@
|
||||||
#include <malloc.h> // alloca(sizeof)
|
#include <malloc.h> // alloca(sizeof)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HWRENDER
|
||||||
|
#include "hardware/hw_main.h" // HWR_LoadTextures
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
|
@ -872,6 +876,11 @@ void R_LoadTextures(void)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HWRENDER
|
||||||
|
if (rendermode == render_opengl)
|
||||||
|
HWR_LoadTextures(numtextures);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
static texpatch_t *R_ParsePatch(boolean actuallyLoadPatch)
|
||||||
|
|
|
@ -107,7 +107,8 @@ UINT8 *ds_transmap; // one of the translucency tables
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
pslope_t *ds_slope; // Current slope being used
|
pslope_t *ds_slope; // Current slope being used
|
||||||
floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff?
|
floatv3_t ds_su[MAXVIDHEIGHT], ds_sv[MAXVIDHEIGHT], ds_sz[MAXVIDHEIGHT]; // Vectors for... stuff?
|
||||||
|
floatv3_t *ds_sup, *ds_svp, *ds_szp;
|
||||||
float focallengthf, zeroheight;
|
float focallengthf, zeroheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -960,6 +961,7 @@ void R_DrawViewBorder(void)
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
#include "r_draw8.c"
|
#include "r_draw8.c"
|
||||||
|
#include "r_draw8_npo2.c"
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// INCLUDE 16bpp DRAWING CODE HERE
|
// INCLUDE 16bpp DRAWING CODE HERE
|
||||||
|
|
75
src/r_draw.h
75
src/r_draw.h
|
@ -68,7 +68,8 @@ typedef struct {
|
||||||
} floatv3_t;
|
} floatv3_t;
|
||||||
|
|
||||||
extern pslope_t *ds_slope; // Current slope being used
|
extern pslope_t *ds_slope; // Current slope being used
|
||||||
extern floatv3_t ds_su, ds_sv, ds_sz; // Vectors for... stuff?
|
extern floatv3_t ds_su[MAXVIDHEIGHT], ds_sv[MAXVIDHEIGHT], ds_sz[MAXVIDHEIGHT]; // Vectors for... stuff?
|
||||||
|
extern floatv3_t *ds_sup, *ds_svp, *ds_szp;
|
||||||
extern float focallengthf, zeroheight;
|
extern float focallengthf, zeroheight;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -138,49 +139,65 @@ void R_DrawViewBorder(void);
|
||||||
// -----------------
|
// -----------------
|
||||||
|
|
||||||
void R_DrawColumn_8(void);
|
void R_DrawColumn_8(void);
|
||||||
#define R_DrawWallColumn_8 R_DrawColumn_8
|
|
||||||
void R_DrawShadeColumn_8(void);
|
void R_DrawShadeColumn_8(void);
|
||||||
void R_DrawTranslucentColumn_8(void);
|
void R_DrawTranslucentColumn_8(void);
|
||||||
|
void R_DrawTranslatedColumn_8(void);
|
||||||
|
void R_DrawTranslatedTranslucentColumn_8(void);
|
||||||
|
void R_Draw2sMultiPatchColumn_8(void);
|
||||||
|
void R_Draw2sMultiPatchTranslucentColumn_8(void);
|
||||||
|
void R_DrawFogColumn_8(void);
|
||||||
|
void R_DrawColumnShadowed_8(void);
|
||||||
|
|
||||||
|
void R_DrawSpan_8(void);
|
||||||
|
void R_DrawSplat_8(void);
|
||||||
|
void R_DrawTranslucentSpan_8(void);
|
||||||
|
void R_DrawTranslucentSplat_8(void);
|
||||||
|
#ifdef ESLOPE
|
||||||
|
void R_DrawTiltedSpan_8(void);
|
||||||
|
void R_DrawTiltedTranslucentSpan_8(void);
|
||||||
|
#ifndef NOWATER
|
||||||
|
void R_DrawTiltedTranslucentWaterSpan_8(void);
|
||||||
|
#endif
|
||||||
|
void R_DrawTiltedSplat_8(void);
|
||||||
|
void R_CalcTiltedLighting(fixed_t start, fixed_t end);
|
||||||
|
extern INT32 tiltlighting[MAXVIDWIDTH];
|
||||||
|
#endif
|
||||||
|
#ifndef NOWATER
|
||||||
|
void R_DrawTranslucentWaterSpan_8(void);
|
||||||
|
extern INT32 ds_bgofs;
|
||||||
|
extern INT32 ds_waterofs;
|
||||||
|
#endif
|
||||||
|
void R_DrawFogSpan_8(void);
|
||||||
|
|
||||||
|
// Lactozilla: Non-powers-of-two
|
||||||
|
void R_DrawSpan_NPO2_8(void);
|
||||||
|
void R_DrawTranslucentSpan_NPO2_8(void);
|
||||||
|
void R_DrawSplat_NPO2_8(void);
|
||||||
|
void R_DrawTranslucentSplat_NPO2_8(void);
|
||||||
|
#ifdef ESLOPE
|
||||||
|
void R_DrawTiltedSpan_NPO2_8(void);
|
||||||
|
void R_DrawTiltedTranslucentSpan_NPO2_8(void);
|
||||||
|
#ifndef NOWATER
|
||||||
|
void R_DrawTiltedTranslucentWaterSpan_NPO2_8(void);
|
||||||
|
#endif
|
||||||
|
void R_DrawTiltedSplat_NPO2_8(void);
|
||||||
|
#endif
|
||||||
|
#ifndef NOWATER
|
||||||
|
void R_DrawTranslucentWaterSpan_NPO2_8(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USEASM
|
#ifdef USEASM
|
||||||
void ASMCALL R_DrawColumn_8_ASM(void);
|
void ASMCALL R_DrawColumn_8_ASM(void);
|
||||||
#define R_DrawWallColumn_8_ASM R_DrawColumn_8_ASM
|
|
||||||
void ASMCALL R_DrawShadeColumn_8_ASM(void);
|
void ASMCALL R_DrawShadeColumn_8_ASM(void);
|
||||||
void ASMCALL R_DrawTranslucentColumn_8_ASM(void);
|
void ASMCALL R_DrawTranslucentColumn_8_ASM(void);
|
||||||
void ASMCALL R_Draw2sMultiPatchColumn_8_ASM(void);
|
void ASMCALL R_Draw2sMultiPatchColumn_8_ASM(void);
|
||||||
|
|
||||||
void ASMCALL R_DrawColumn_8_MMX(void);
|
void ASMCALL R_DrawColumn_8_MMX(void);
|
||||||
#define R_DrawWallColumn_8_MMX R_DrawColumn_8_MMX
|
|
||||||
|
|
||||||
void ASMCALL R_Draw2sMultiPatchColumn_8_MMX(void);
|
void ASMCALL R_Draw2sMultiPatchColumn_8_MMX(void);
|
||||||
void ASMCALL R_DrawSpan_8_MMX(void);
|
void ASMCALL R_DrawSpan_8_MMX(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void R_DrawTranslatedColumn_8(void);
|
|
||||||
void R_DrawTranslatedTranslucentColumn_8(void);
|
|
||||||
void R_DrawSpan_8(void);
|
|
||||||
#ifdef ESLOPE
|
|
||||||
void R_CalcTiltedLighting(fixed_t start, fixed_t end);
|
|
||||||
void R_DrawTiltedSpan_8(void);
|
|
||||||
void R_DrawTiltedTranslucentSpan_8(void);
|
|
||||||
void R_DrawTiltedSplat_8(void);
|
|
||||||
#endif
|
|
||||||
void R_DrawSplat_8(void);
|
|
||||||
void R_DrawTranslucentSplat_8(void);
|
|
||||||
void R_DrawTranslucentSpan_8(void);
|
|
||||||
void R_Draw2sMultiPatchColumn_8(void);
|
|
||||||
void R_Draw2sMultiPatchTranslucentColumn_8(void);
|
|
||||||
void R_DrawFogSpan_8(void);
|
|
||||||
void R_DrawFogColumn_8(void);
|
|
||||||
void R_DrawColumnShadowed_8(void);
|
|
||||||
|
|
||||||
#ifndef NOWATER
|
|
||||||
void R_DrawTranslucentWaterSpan_8(void);
|
|
||||||
|
|
||||||
extern INT32 ds_bgofs;
|
|
||||||
extern INT32 ds_waterofs;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
// 16bpp DRAWING CODE
|
// 16bpp DRAWING CODE
|
||||||
// ------------------
|
// ------------------
|
||||||
|
|
1095
src/r_draw8.c
1095
src/r_draw8.c
File diff suppressed because it is too large
Load diff
1044
src/r_draw8_npo2.c
Normal file
1044
src/r_draw8_npo2.c
Normal file
File diff suppressed because it is too large
Load diff
28
src/r_main.c
28
src/r_main.c
|
@ -1008,11 +1008,13 @@ static void R_PortalFrame(portal_t *portal)
|
||||||
if (portal->clipline != -1)
|
if (portal->clipline != -1)
|
||||||
{
|
{
|
||||||
portalclipline = &lines[portal->clipline];
|
portalclipline = &lines[portal->clipline];
|
||||||
|
portalcullsector = portalclipline->frontsector;
|
||||||
viewsector = portalclipline->frontsector;
|
viewsector = portalclipline->frontsector;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
portalclipline = NULL;
|
portalclipline = NULL;
|
||||||
|
portalcullsector = NULL;
|
||||||
viewsector = R_PointInSubsector(viewx, viewy)->sector;
|
viewsector = R_PointInSubsector(viewx, viewy)->sector;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1208,30 +1210,4 @@ void R_RegisterEngineStuff(void)
|
||||||
CV_RegisterVar(&cv_maxportals);
|
CV_RegisterVar(&cv_maxportals);
|
||||||
|
|
||||||
CV_RegisterVar(&cv_movebob);
|
CV_RegisterVar(&cv_movebob);
|
||||||
|
|
||||||
#ifdef HWRENDER
|
|
||||||
// GL-specific Commands
|
|
||||||
CV_RegisterVar(&cv_grgammablue);
|
|
||||||
CV_RegisterVar(&cv_grgammagreen);
|
|
||||||
CV_RegisterVar(&cv_grgammared);
|
|
||||||
CV_RegisterVar(&cv_grfovchange);
|
|
||||||
CV_RegisterVar(&cv_grfog);
|
|
||||||
CV_RegisterVar(&cv_grfogcolor);
|
|
||||||
CV_RegisterVar(&cv_grsoftwarefog);
|
|
||||||
#ifdef ALAM_LIGHTING
|
|
||||||
CV_RegisterVar(&cv_grstaticlighting);
|
|
||||||
CV_RegisterVar(&cv_grdynamiclighting);
|
|
||||||
CV_RegisterVar(&cv_grcoronas);
|
|
||||||
CV_RegisterVar(&cv_grcoronasize);
|
|
||||||
#endif
|
|
||||||
CV_RegisterVar(&cv_grmodelinterpolation);
|
|
||||||
CV_RegisterVar(&cv_grmodels);
|
|
||||||
CV_RegisterVar(&cv_grspritebillboarding);
|
|
||||||
CV_RegisterVar(&cv_grskydome);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HWRENDER
|
|
||||||
if (rendermode != render_soft && rendermode != render_none)
|
|
||||||
HWR_AddCommands();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
338
src/r_plane.c
338
src/r_plane.c
|
@ -116,6 +116,35 @@ void R_InitPlanes(void)
|
||||||
// FIXME: unused
|
// FIXME: unused
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Water ripple effect!!
|
||||||
|
// Needs the height of the plane, and the vertical position of the span.
|
||||||
|
// Sets ripple_xfrac and ripple_yfrac, added to ds_xfrac and ds_yfrac, if the span is not tilted.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef NOWATER
|
||||||
|
INT32 ds_bgofs;
|
||||||
|
INT32 ds_waterofs;
|
||||||
|
|
||||||
|
static INT32 wtofs=0;
|
||||||
|
static boolean itswater;
|
||||||
|
static fixed_t ripple_xfrac;
|
||||||
|
static fixed_t ripple_yfrac;
|
||||||
|
|
||||||
|
static void R_PlaneRipple(visplane_t *plane, INT32 y, fixed_t plheight)
|
||||||
|
{
|
||||||
|
fixed_t distance = FixedMul(plheight, yslope[y]);
|
||||||
|
const INT32 yay = (wtofs + (distance>>9) ) & 8191;
|
||||||
|
// ripples da water texture
|
||||||
|
angle_t angle = (plane->viewangle + plane->plangle)>>ANGLETOFINESHIFT;
|
||||||
|
ds_bgofs = FixedDiv(FINESINE(yay), (1<<12) + (distance>>11))>>FRACBITS;
|
||||||
|
|
||||||
|
angle = (angle + 2048) & 8191; // 90 degrees
|
||||||
|
ripple_xfrac = FixedMul(FINECOSINE(angle), (ds_bgofs<<FRACBITS));
|
||||||
|
ripple_yfrac = FixedMul(FINESINE(angle), (ds_bgofs<<FRACBITS));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// R_MapPlane
|
// R_MapPlane
|
||||||
//
|
//
|
||||||
|
@ -129,14 +158,6 @@ void R_InitPlanes(void)
|
||||||
// viewcos
|
// viewcos
|
||||||
// viewheight
|
// viewheight
|
||||||
|
|
||||||
#ifndef NOWATER
|
|
||||||
INT32 ds_bgofs;
|
|
||||||
INT32 ds_waterofs;
|
|
||||||
|
|
||||||
static INT32 wtofs=0;
|
|
||||||
static boolean itswater;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
|
void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
|
||||||
{
|
{
|
||||||
angle_t angle, planecos, planesin;
|
angle_t angle, planecos, planesin;
|
||||||
|
@ -181,14 +202,22 @@ void R_MapPlane(INT32 y, INT32 x1, INT32 x2)
|
||||||
#ifndef NOWATER
|
#ifndef NOWATER
|
||||||
if (itswater)
|
if (itswater)
|
||||||
{
|
{
|
||||||
const INT32 yay = (wtofs + (distance>>9) ) & 8191;
|
// Needed for ds_bgofs
|
||||||
// ripples da water texture
|
R_PlaneRipple(currentplane, y, planeheight);
|
||||||
ds_bgofs = FixedDiv(FINESINE(yay), (1<<12) + (distance>>11))>>FRACBITS;
|
|
||||||
angle = (currentplane->viewangle + currentplane->plangle + xtoviewangle[x1])>>ANGLETOFINESHIFT;
|
|
||||||
|
|
||||||
angle = (angle + 2048) & 8191; // 90 degrees
|
#ifdef ESLOPE
|
||||||
ds_xfrac += FixedMul(FINECOSINE(angle), (ds_bgofs<<FRACBITS));
|
if (currentplane->slope)
|
||||||
ds_yfrac += FixedMul(FINESINE(angle), (ds_bgofs<<FRACBITS));
|
{
|
||||||
|
ds_sup = &ds_su[y];
|
||||||
|
ds_svp = &ds_sv[y];
|
||||||
|
ds_szp = &ds_sz[y];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ds_xfrac += ripple_xfrac;
|
||||||
|
ds_yfrac += ripple_yfrac;
|
||||||
|
}
|
||||||
|
|
||||||
if (y+ds_bgofs>=viewheight)
|
if (y+ds_bgofs>=viewheight)
|
||||||
ds_bgofs = viewheight-y-1;
|
ds_bgofs = viewheight-y-1;
|
||||||
|
@ -591,8 +620,7 @@ void R_DrawPlanes(void)
|
||||||
|
|
||||||
// Note: are these two lines really needed?
|
// Note: are these two lines really needed?
|
||||||
// R_DrawSinglePlane and R_DrawSkyPlane do span/column drawer resets themselves anyway
|
// R_DrawSinglePlane and R_DrawSkyPlane do span/column drawer resets themselves anyway
|
||||||
spanfunc = basespanfunc;
|
spanfunc = spanfuncs[BASEDRAWFUNC];
|
||||||
wallcolfunc = walldrawerfunc;
|
|
||||||
|
|
||||||
for (i = 0; i < MAXVISPLANES; i++, pl++)
|
for (i = 0; i < MAXVISPLANES; i++, pl++)
|
||||||
{
|
{
|
||||||
|
@ -626,7 +654,7 @@ static void R_DrawSkyPlane(visplane_t *pl)
|
||||||
|
|
||||||
// Reset column drawer function (note: couldn't we just call walldrawerfunc directly?)
|
// Reset column drawer function (note: couldn't we just call walldrawerfunc directly?)
|
||||||
// (that is, unless we'll need to switch drawers in future for some reason)
|
// (that is, unless we'll need to switch drawers in future for some reason)
|
||||||
wallcolfunc = walldrawerfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
// use correct aspect ratio scale
|
// use correct aspect ratio scale
|
||||||
dc_iscale = skyscale;
|
dc_iscale = skyscale;
|
||||||
|
@ -652,7 +680,7 @@ static void R_DrawSkyPlane(visplane_t *pl)
|
||||||
dc_source =
|
dc_source =
|
||||||
R_GetColumn(texturetranslation[skytexture],
|
R_GetColumn(texturetranslation[skytexture],
|
||||||
-angle); // get negative of angle for each column to display sky correct way round! --Monster Iestyn 27/01/18
|
-angle); // get negative of angle for each column to display sky correct way round! --Monster Iestyn 27/01/18
|
||||||
wallcolfunc();
|
colfunc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -837,6 +865,99 @@ static UINT8 *R_GetTextureFlat(levelflat_t *levelflat, boolean leveltexture, boo
|
||||||
return flat;
|
return flat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ESLOPE
|
||||||
|
static void R_SlopeVectors(visplane_t *pl, INT32 i, float fudge)
|
||||||
|
{
|
||||||
|
// Potentially override other stuff for now cus we're mean. :< But draw a slope plane!
|
||||||
|
// I copied ZDoom's code and adapted it to SRB2... -Red
|
||||||
|
floatv3_t p, m, n;
|
||||||
|
float ang;
|
||||||
|
float vx, vy, vz;
|
||||||
|
// compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly
|
||||||
|
// use this as a temp var to store P_GetZAt's return value each time
|
||||||
|
fixed_t temp;
|
||||||
|
|
||||||
|
vx = FIXED_TO_FLOAT(pl->viewx+xoffs);
|
||||||
|
vy = FIXED_TO_FLOAT(pl->viewy-yoffs);
|
||||||
|
vz = FIXED_TO_FLOAT(pl->viewz);
|
||||||
|
|
||||||
|
temp = P_GetZAt(pl->slope, pl->viewx, pl->viewy);
|
||||||
|
zeroheight = FIXED_TO_FLOAT(temp);
|
||||||
|
|
||||||
|
// p is the texture origin in view space
|
||||||
|
// Don't add in the offsets at this stage, because doing so can result in
|
||||||
|
// errors if the flat is rotated.
|
||||||
|
ang = ANG2RAD(ANGLE_270 - pl->viewangle);
|
||||||
|
p.x = vx * cos(ang) - vy * sin(ang);
|
||||||
|
p.z = vx * sin(ang) + vy * cos(ang);
|
||||||
|
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
|
||||||
|
p.y = FIXED_TO_FLOAT(temp) - vz;
|
||||||
|
|
||||||
|
// m is the v direction vector in view space
|
||||||
|
ang = ANG2RAD(ANGLE_180 - (pl->viewangle + pl->plangle));
|
||||||
|
m.x = cos(ang);
|
||||||
|
m.z = sin(ang);
|
||||||
|
|
||||||
|
// n is the u direction vector in view space
|
||||||
|
n.x = sin(ang);
|
||||||
|
n.z = -cos(ang);
|
||||||
|
|
||||||
|
ang = ANG2RAD(pl->plangle);
|
||||||
|
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(sin(ang)), pl->viewy + FLOAT_TO_FIXED(cos(ang)));
|
||||||
|
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
||||||
|
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(cos(ang)), pl->viewy - FLOAT_TO_FIXED(sin(ang)));
|
||||||
|
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
||||||
|
|
||||||
|
if (ds_powersoftwo)
|
||||||
|
{
|
||||||
|
m.x /= fudge;
|
||||||
|
m.y /= fudge;
|
||||||
|
m.z /= fudge;
|
||||||
|
|
||||||
|
n.x *= fudge;
|
||||||
|
n.y *= fudge;
|
||||||
|
n.z *= fudge;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Eh. I tried making this stuff fixed-point and it exploded on me. Here's a macro for the only floating-point vector function I recall using.
|
||||||
|
#define CROSS(d, v1, v2) \
|
||||||
|
d.x = (v1.y * v2.z) - (v1.z * v2.y);\
|
||||||
|
d.y = (v1.z * v2.x) - (v1.x * v2.z);\
|
||||||
|
d.z = (v1.x * v2.y) - (v1.y * v2.x)
|
||||||
|
CROSS(ds_su[i], p, m);
|
||||||
|
CROSS(ds_sv[i], p, n);
|
||||||
|
CROSS(ds_sz[i], m, n);
|
||||||
|
#undef CROSS
|
||||||
|
|
||||||
|
ds_su[i].z *= focallengthf;
|
||||||
|
ds_sv[i].z *= focallengthf;
|
||||||
|
ds_sz[i].z *= focallengthf;
|
||||||
|
|
||||||
|
// Premultiply the texture vectors with the scale factors
|
||||||
|
#define SFMULT 65536.f
|
||||||
|
if (ds_powersoftwo)
|
||||||
|
{
|
||||||
|
ds_su[i].x *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
ds_su[i].y *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
ds_su[i].z *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
ds_sv[i].x *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
ds_sv[i].y *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
ds_sv[i].z *= (SFMULT * (1<<nflatshiftup));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Lactozilla: I'm essentially multiplying the vectors by FRACUNIT...
|
||||||
|
ds_su[i].x *= SFMULT;
|
||||||
|
ds_su[i].y *= SFMULT;
|
||||||
|
ds_su[i].z *= SFMULT;
|
||||||
|
ds_sv[i].x *= SFMULT;
|
||||||
|
ds_sv[i].y *= SFMULT;
|
||||||
|
ds_sv[i].z *= SFMULT;
|
||||||
|
}
|
||||||
|
#undef SFMULT
|
||||||
|
}
|
||||||
|
#endif // ESLOPE
|
||||||
|
|
||||||
void R_DrawSinglePlane(visplane_t *pl)
|
void R_DrawSinglePlane(visplane_t *pl)
|
||||||
{
|
{
|
||||||
UINT8 *flat;
|
UINT8 *flat;
|
||||||
|
@ -846,6 +967,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
ffloor_t *rover;
|
ffloor_t *rover;
|
||||||
levelflat_t *levelflat;
|
levelflat_t *levelflat;
|
||||||
int type;
|
int type;
|
||||||
|
int spanfunctype = BASEDRAWFUNC;
|
||||||
|
|
||||||
if (!(pl->minx <= pl->maxx))
|
if (!(pl->minx <= pl->maxx))
|
||||||
return;
|
return;
|
||||||
|
@ -860,11 +982,12 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
#ifndef NOWATER
|
#ifndef NOWATER
|
||||||
itswater = false;
|
itswater = false;
|
||||||
#endif
|
#endif
|
||||||
spanfunc = basespanfunc;
|
spanfunc = spanfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
#ifdef POLYOBJECTS_PLANES
|
#ifdef POLYOBJECTS_PLANES
|
||||||
if (pl->polyobj && pl->polyobj->translucency != 0) {
|
if (pl->polyobj && pl->polyobj->translucency != 0)
|
||||||
spanfunc = R_DrawTranslucentSpan_8;
|
{
|
||||||
|
spanfunctype = SPANDRAWFUNC_TRANS;
|
||||||
|
|
||||||
// Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red)
|
// Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red)
|
||||||
if (pl->polyobj->translucency >= 10)
|
if (pl->polyobj->translucency >= 10)
|
||||||
|
@ -872,10 +995,10 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
else if (pl->polyobj->translucency > 0)
|
else if (pl->polyobj->translucency > 0)
|
||||||
ds_transmap = transtables + ((pl->polyobj->translucency-1)<<FF_TRANSSHIFT);
|
ds_transmap = transtables + ((pl->polyobj->translucency-1)<<FF_TRANSSHIFT);
|
||||||
else // Opaque, but allow transparent flat pixels
|
else // Opaque, but allow transparent flat pixels
|
||||||
spanfunc = splatfunc;
|
spanfunctype = SPANDRAWFUNC_SPLAT;
|
||||||
|
|
||||||
#ifdef SHITPLANESPARENCY
|
#ifdef SHITPLANESPARENCY
|
||||||
if ((spanfunc == splatfunc) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
||||||
#else
|
#else
|
||||||
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
||||||
#endif
|
#endif
|
||||||
|
@ -906,7 +1029,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
if (pl->ffloor->flags & FF_TRANSLUCENT)
|
if (pl->ffloor->flags & FF_TRANSLUCENT)
|
||||||
{
|
{
|
||||||
spanfunc = R_DrawTranslucentSpan_8;
|
spanfunctype = SPANDRAWFUNC_TRANS;
|
||||||
|
|
||||||
// Hacked up support for alpha value in software mode Tails 09-24-2002
|
// Hacked up support for alpha value in software mode Tails 09-24-2002
|
||||||
if (pl->ffloor->alpha < 12)
|
if (pl->ffloor->alpha < 12)
|
||||||
|
@ -930,10 +1053,10 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
else if (pl->ffloor->alpha < 243)
|
else if (pl->ffloor->alpha < 243)
|
||||||
ds_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT);
|
ds_transmap = transtables + ((tr_trans10-1)<<FF_TRANSSHIFT);
|
||||||
else // Opaque, but allow transparent flat pixels
|
else // Opaque, but allow transparent flat pixels
|
||||||
spanfunc = splatfunc;
|
spanfunctype = SPANDRAWFUNC_SPLAT;
|
||||||
|
|
||||||
#ifdef SHITPLANESPARENCY
|
#ifdef SHITPLANESPARENCY
|
||||||
if ((spanfunc == splatfunc) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
if ((spanfunctype == SPANDRAWFUNC_SPLAT) != (pl->extra_colormap && (pl->extra_colormap->fog & 4)))
|
||||||
#else
|
#else
|
||||||
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
if (!pl->extra_colormap || !(pl->extra_colormap->fog & 2))
|
||||||
#endif
|
#endif
|
||||||
|
@ -943,24 +1066,20 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
}
|
}
|
||||||
else if (pl->ffloor->flags & FF_FOG)
|
else if (pl->ffloor->flags & FF_FOG)
|
||||||
{
|
{
|
||||||
spanfunc = R_DrawFogSpan_8;
|
spanfunctype = SPANDRAWFUNC_FOG;
|
||||||
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
}
|
}
|
||||||
else light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
else light = (pl->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
|
||||||
#ifndef NOWATER
|
#ifndef NOWATER
|
||||||
if (pl->ffloor->flags & FF_RIPPLE
|
if (pl->ffloor->flags & FF_RIPPLE)
|
||||||
#ifdef ESLOPE
|
|
||||||
&& !pl->slope
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
INT32 top, bottom;
|
INT32 top, bottom;
|
||||||
|
|
||||||
itswater = true;
|
itswater = true;
|
||||||
if (spanfunc == R_DrawTranslucentSpan_8)
|
if (spanfunctype == SPANDRAWFUNC_TRANS)
|
||||||
{
|
{
|
||||||
spanfunc = R_DrawTranslucentWaterSpan_8;
|
spanfunctype = SPANDRAWFUNC_WATER;
|
||||||
|
|
||||||
// Copy the current scene, ugh
|
// Copy the current scene, ugh
|
||||||
top = pl->high-8;
|
top = pl->high-8;
|
||||||
|
@ -1011,8 +1130,6 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
R_CheckFlatLength(W_LumpLength(levelflat->u.flat.lumpnum));
|
R_CheckFlatLength(W_LumpLength(levelflat->u.flat.lumpnum));
|
||||||
// Raw flats always have dimensions that are powers-of-two numbers.
|
// Raw flats always have dimensions that are powers-of-two numbers.
|
||||||
ds_powersoftwo = true;
|
ds_powersoftwo = true;
|
||||||
if (spanfunc == basespanfunc)
|
|
||||||
spanfunc = mmxspanfunc;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -1035,11 +1152,7 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
}
|
}
|
||||||
// Check if this texture or patch has power-of-two dimensions.
|
// Check if this texture or patch has power-of-two dimensions.
|
||||||
if (R_CheckPowersOfTwo())
|
if (R_CheckPowersOfTwo())
|
||||||
{
|
|
||||||
R_CheckFlatLength(ds_flatwidth * ds_flatheight);
|
R_CheckFlatLength(ds_flatwidth * ds_flatheight);
|
||||||
if (spanfunc == basespanfunc)
|
|
||||||
spanfunc = mmxspanfunc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (light >= LIGHTLEVELS)
|
if (light >= LIGHTLEVELS)
|
||||||
|
@ -1049,25 +1162,18 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
light = 0;
|
light = 0;
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
if (pl->slope) {
|
if (pl->slope)
|
||||||
// Potentially override other stuff for now cus we're mean. :< But draw a slope plane!
|
{
|
||||||
// I copied ZDoom's code and adapted it to SRB2... -Red
|
float fudgecanyon = 0;
|
||||||
floatv3_t p, m, n;
|
|
||||||
float ang;
|
|
||||||
float vx, vy, vz;
|
|
||||||
float fudge = 0;
|
|
||||||
// compiler complains when P_GetZAt is used in FLOAT_TO_FIXED directly
|
|
||||||
// use this as a temp var to store P_GetZAt's return value each time
|
|
||||||
fixed_t temp;
|
|
||||||
|
|
||||||
angle_t hack = (pl->plangle & (ANGLE_90-1));
|
angle_t hack = (pl->plangle & (ANGLE_90-1));
|
||||||
|
|
||||||
yoffs *= 1;
|
yoffs *= 1;
|
||||||
|
|
||||||
if (ds_powersoftwo)
|
if (ds_powersoftwo)
|
||||||
{
|
{
|
||||||
|
fixed_t temp;
|
||||||
// Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red
|
// Okay, look, don't ask me why this works, but without this setup there's a disgusting-looking misalignment with the textures. -Red
|
||||||
fudge = ((1<<nflatshiftup)+1.0f)/(1<<nflatshiftup);
|
fudgecanyon = ((1<<nflatshiftup)+1.0f)/(1<<nflatshiftup);
|
||||||
if (hack)
|
if (hack)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -1109,95 +1215,50 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
|
xoffs -= (pl->slope->o.x + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
|
||||||
yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
|
yoffs += (pl->slope->o.y + (1 << (31-nflatshiftup))) & ~((1 << (32-nflatshiftup))-1);
|
||||||
}
|
}
|
||||||
xoffs = (fixed_t)(xoffs*fudge);
|
xoffs = (fixed_t)(xoffs*fudgecanyon);
|
||||||
yoffs = (fixed_t)(yoffs/fudge);
|
yoffs = (fixed_t)(yoffs/fudgecanyon);
|
||||||
}
|
}
|
||||||
|
|
||||||
vx = FIXED_TO_FLOAT(pl->viewx+xoffs);
|
ds_sup = &ds_su[0];
|
||||||
vy = FIXED_TO_FLOAT(pl->viewy-yoffs);
|
ds_svp = &ds_sv[0];
|
||||||
vz = FIXED_TO_FLOAT(pl->viewz);
|
ds_szp = &ds_sz[0];
|
||||||
|
|
||||||
temp = P_GetZAt(pl->slope, pl->viewx, pl->viewy);
|
#ifndef NOWATER
|
||||||
zeroheight = FIXED_TO_FLOAT(temp);
|
if (itswater)
|
||||||
|
|
||||||
// p is the texture origin in view space
|
|
||||||
// Don't add in the offsets at this stage, because doing so can result in
|
|
||||||
// errors if the flat is rotated.
|
|
||||||
ang = ANG2RAD(ANGLE_270 - pl->viewangle);
|
|
||||||
p.x = vx * cos(ang) - vy * sin(ang);
|
|
||||||
p.z = vx * sin(ang) + vy * cos(ang);
|
|
||||||
temp = P_GetZAt(pl->slope, -xoffs, yoffs);
|
|
||||||
p.y = FIXED_TO_FLOAT(temp) - vz;
|
|
||||||
|
|
||||||
// m is the v direction vector in view space
|
|
||||||
ang = ANG2RAD(ANGLE_180 - (pl->viewangle + pl->plangle));
|
|
||||||
m.x = cos(ang);
|
|
||||||
m.z = sin(ang);
|
|
||||||
|
|
||||||
// n is the u direction vector in view space
|
|
||||||
n.x = sin(ang);
|
|
||||||
n.z = -cos(ang);
|
|
||||||
|
|
||||||
ang = ANG2RAD(pl->plangle);
|
|
||||||
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(sin(ang)), pl->viewy + FLOAT_TO_FIXED(cos(ang)));
|
|
||||||
m.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
|
||||||
temp = P_GetZAt(pl->slope, pl->viewx + FLOAT_TO_FIXED(cos(ang)), pl->viewy - FLOAT_TO_FIXED(sin(ang)));
|
|
||||||
n.y = FIXED_TO_FLOAT(temp) - zeroheight;
|
|
||||||
|
|
||||||
if (ds_powersoftwo)
|
|
||||||
{
|
{
|
||||||
m.x /= fudge;
|
INT32 i;
|
||||||
m.y /= fudge;
|
fixed_t plheight = abs(P_GetZAt(pl->slope, pl->viewx, pl->viewy) - pl->viewz);
|
||||||
m.z /= fudge;
|
fixed_t rxoffs = xoffs;
|
||||||
|
fixed_t ryoffs = yoffs;
|
||||||
|
|
||||||
n.x *= fudge;
|
R_PlaneBounds(pl);
|
||||||
n.y *= fudge;
|
|
||||||
n.z *= fudge;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Eh. I tried making this stuff fixed-point and it exploded on me. Here's a macro for the only floating-point vector function I recall using.
|
for (i = pl->high; i < pl->low; i++)
|
||||||
#define CROSS(d, v1, v2) \
|
{
|
||||||
d.x = (v1.y * v2.z) - (v1.z * v2.y);\
|
R_PlaneRipple(pl, i, plheight);
|
||||||
d.y = (v1.z * v2.x) - (v1.x * v2.z);\
|
xoffs = rxoffs + ripple_xfrac;
|
||||||
d.z = (v1.x * v2.y) - (v1.y * v2.x)
|
yoffs = ryoffs + ripple_yfrac;
|
||||||
CROSS(ds_su, p, m);
|
R_SlopeVectors(pl, i, fudgecanyon);
|
||||||
CROSS(ds_sv, p, n);
|
}
|
||||||
CROSS(ds_sz, m, n);
|
|
||||||
#undef CROSS
|
|
||||||
|
|
||||||
ds_su.z *= focallengthf;
|
xoffs = rxoffs;
|
||||||
ds_sv.z *= focallengthf;
|
yoffs = ryoffs;
|
||||||
ds_sz.z *= focallengthf;
|
|
||||||
|
|
||||||
// Premultiply the texture vectors with the scale factors
|
|
||||||
#define SFMULT 65536.f
|
|
||||||
if (ds_powersoftwo)
|
|
||||||
{
|
|
||||||
ds_su.x *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
ds_su.y *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
ds_su.z *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
ds_sv.x *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
ds_sv.y *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
ds_sv.z *= (SFMULT * (1<<nflatshiftup));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
#endif
|
||||||
// I'm essentially multiplying the vectors by FRACUNIT...
|
R_SlopeVectors(pl, 0, fudgecanyon);
|
||||||
ds_su.x *= SFMULT;
|
|
||||||
ds_su.y *= SFMULT;
|
|
||||||
ds_su.z *= SFMULT;
|
|
||||||
ds_sv.x *= SFMULT;
|
|
||||||
ds_sv.y *= SFMULT;
|
|
||||||
ds_sv.z *= SFMULT;
|
|
||||||
}
|
|
||||||
#undef SFMULT
|
|
||||||
|
|
||||||
if (spanfunc == R_DrawTranslucentSpan_8)
|
#ifndef NOWATER
|
||||||
spanfunc = R_DrawTiltedTranslucentSpan_8;
|
if (itswater && (spanfunctype == SPANDRAWFUNC_WATER))
|
||||||
else if (spanfunc == splatfunc)
|
spanfunctype = SPANDRAWFUNC_TILTEDWATER;
|
||||||
spanfunc = R_DrawTiltedSplat_8;
|
|
||||||
else
|
else
|
||||||
spanfunc = R_DrawTiltedSpan_8;
|
#endif
|
||||||
|
if (spanfunctype == SPANDRAWFUNC_TRANS)
|
||||||
|
spanfunctype = SPANDRAWFUNC_TILTEDTRANS;
|
||||||
|
else if (spanfunctype == SPANDRAWFUNC_SPLAT)
|
||||||
|
spanfunctype = SPANDRAWFUNC_TILTEDSPLAT;
|
||||||
|
else
|
||||||
|
spanfunctype = SPANDRAWFUNC_TILTED;
|
||||||
|
|
||||||
planezlight = scalelight[light];
|
planezlight = scalelight[light];
|
||||||
} else
|
} else
|
||||||
|
@ -1205,6 +1266,17 @@ void R_DrawSinglePlane(visplane_t *pl)
|
||||||
|
|
||||||
planezlight = zlight[light];
|
planezlight = zlight[light];
|
||||||
|
|
||||||
|
// Use the correct span drawer depending on the powers-of-twoness
|
||||||
|
if (!ds_powersoftwo)
|
||||||
|
{
|
||||||
|
if (spanfuncs_npo2[spanfunctype])
|
||||||
|
spanfunc = spanfuncs_npo2[spanfunctype];
|
||||||
|
else
|
||||||
|
spanfunc = spanfuncs[spanfunctype];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
spanfunc = spanfuncs[spanfunctype];
|
||||||
|
|
||||||
// set the maximum value for unsigned
|
// set the maximum value for unsigned
|
||||||
pl->top[pl->maxx+1] = 0xffff;
|
pl->top[pl->maxx+1] = 0xffff;
|
||||||
pl->top[pl->minx-1] = 0xffff;
|
pl->top[pl->minx-1] = 0xffff;
|
||||||
|
@ -1244,11 +1316,11 @@ a 'smoothing' of the texture while
|
||||||
using the palette colors.
|
using the palette colors.
|
||||||
*/
|
*/
|
||||||
#ifdef QUINCUNX
|
#ifdef QUINCUNX
|
||||||
if (spanfunc == R_DrawSpan_8)
|
if (spanfunc == spanfuncs[BASEDRAWFUNC])
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
|
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
|
||||||
spanfunc = R_DrawTranslucentSpan_8;
|
spanfunc = spanfuncs[SPANDRAWFUNC_TRANS];
|
||||||
for (i=0; i<4; i++)
|
for (i=0; i<4; i++)
|
||||||
{
|
{
|
||||||
xoffs = pl->xoffs;
|
xoffs = pl->xoffs;
|
||||||
|
|
|
@ -26,6 +26,7 @@ UINT8 portalrender; /**< When rendering a portal, it establishes the depth of
|
||||||
portal_t *portal_base, *portal_cap;
|
portal_t *portal_base, *portal_cap;
|
||||||
|
|
||||||
line_t *portalclipline;
|
line_t *portalclipline;
|
||||||
|
sector_t *portalcullsector;
|
||||||
INT32 portalclipstart, portalclipend;
|
INT32 portalclipstart, portalclipend;
|
||||||
|
|
||||||
boolean portalline; // is curline a portal seg?
|
boolean portalline; // is curline a portal seg?
|
||||||
|
|
|
@ -45,6 +45,7 @@ extern portal_t* portal_cap;
|
||||||
extern UINT8 portalrender;
|
extern UINT8 portalrender;
|
||||||
|
|
||||||
extern line_t *portalclipline;
|
extern line_t *portalclipline;
|
||||||
|
extern sector_t *portalcullsector;
|
||||||
extern INT32 portalclipstart, portalclipend;
|
extern INT32 portalclipstart, portalclipend;
|
||||||
|
|
||||||
void Portal_InitList (void);
|
void Portal_InitList (void);
|
||||||
|
|
50
src/r_segs.c
50
src/r_segs.c
|
@ -186,20 +186,20 @@ static void R_DrawWallSplats(void)
|
||||||
switch (splat->flags & SPLATDRAWMODE_MASK)
|
switch (splat->flags & SPLATDRAWMODE_MASK)
|
||||||
{
|
{
|
||||||
case SPLATDRAWMODE_OPAQUE:
|
case SPLATDRAWMODE_OPAQUE:
|
||||||
colfunc = basecolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
break;
|
break;
|
||||||
case SPLATDRAWMODE_TRANS:
|
case SPLATDRAWMODE_TRANS:
|
||||||
if (!cv_translucency.value)
|
if (!cv_translucency.value)
|
||||||
colfunc = basecolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dc_transmap = transtables + ((tr_trans50 - 1)<<FF_TRANSSHIFT);
|
dc_transmap = transtables + ((tr_trans50 - 1)<<FF_TRANSSHIFT);
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SPLATDRAWMODE_SHADE:
|
case SPLATDRAWMODE_SHADE:
|
||||||
colfunc = shadecolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_SHADE];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ static void R_DrawWallSplats(void)
|
||||||
}
|
}
|
||||||
} // next splat
|
} // next splat
|
||||||
|
|
||||||
colfunc = basecolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //WALLSPLATS
|
#endif //WALLSPLATS
|
||||||
|
@ -279,10 +279,10 @@ static void R_Render2sidedMultiPatchColumn(column_t *column)
|
||||||
{
|
{
|
||||||
dc_source = (UINT8 *)column + 3;
|
dc_source = (UINT8 *)column + 3;
|
||||||
|
|
||||||
if (colfunc == wallcolfunc)
|
if (colfunc == colfuncs[BASEDRAWFUNC])
|
||||||
twosmultipatchfunc();
|
(colfuncs[COLDRAWFUNC_TWOSMULTIPATCH])();
|
||||||
else if (colfunc == fuzzcolfunc)
|
else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
twosmultipatchtransfunc();
|
(colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS])();
|
||||||
else
|
else
|
||||||
colfunc();
|
colfunc();
|
||||||
}
|
}
|
||||||
|
@ -340,15 +340,15 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
case 907:
|
case 907:
|
||||||
case 908:
|
case 908:
|
||||||
dc_transmap = transtables + ((ldef->special-900)<<FF_TRANSSHIFT);
|
dc_transmap = transtables + ((ldef->special-900)<<FF_TRANSSHIFT);
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
break;
|
break;
|
||||||
case 909:
|
case 909:
|
||||||
colfunc = R_DrawFogColumn_8;
|
colfunc = colfuncs[COLDRAWFUNC_FOG];
|
||||||
windowtop = frontsector->ceilingheight;
|
windowtop = frontsector->ceilingheight;
|
||||||
windowbottom = frontsector->floorheight;
|
windowbottom = frontsector->floorheight;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
colfunc = wallcolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dc_transmap = transtables + ((curline->polyseg->translucency-1)<<FF_TRANSSHIFT);
|
dc_transmap = transtables + ((curline->polyseg->translucency-1)<<FF_TRANSSHIFT);
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
|
@ -432,7 +432,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
|
|
||||||
if (rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog))
|
if (rlight->flags & FF_FOG || (rlight->extra_colormap && rlight->extra_colormap->fog))
|
||||||
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else if (colfunc == fuzzcolfunc)
|
else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
lightnum = LIGHTLEVELS - 1;
|
lightnum = LIGHTLEVELS - 1;
|
||||||
else
|
else
|
||||||
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
@ -449,7 +449,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (colfunc == fuzzcolfunc)
|
if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
{
|
{
|
||||||
if (frontsector->extra_colormap && frontsector->extra_colormap->fog)
|
if (frontsector->extra_colormap && frontsector->extra_colormap->fog)
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
@ -459,7 +459,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
else
|
else
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
|
|
||||||
if (colfunc == R_DrawFogColumn_8
|
if (colfunc == colfuncs[COLDRAWFUNC_FOG]
|
||||||
|| (frontsector->extra_colormap && frontsector->extra_colormap->fog))
|
|| (frontsector->extra_colormap && frontsector->extra_colormap->fog))
|
||||||
;
|
;
|
||||||
else if (curline->v1->y == curline->v2->y)
|
else if (curline->v1->y == curline->v2->y)
|
||||||
|
@ -731,7 +731,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2)
|
||||||
spryscale += rw_scalestep;
|
spryscale += rw_scalestep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
colfunc = wallcolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop through R_DrawMaskedColumn calls
|
// Loop through R_DrawMaskedColumn calls
|
||||||
|
@ -802,7 +802,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
|
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
|
||||||
texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture);
|
texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture);
|
||||||
|
|
||||||
colfunc = wallcolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
if (pfloor->master->flags & ML_TFERLINE)
|
if (pfloor->master->flags & ML_TFERLINE)
|
||||||
{
|
{
|
||||||
|
@ -840,10 +840,10 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
fuzzy = false; // Opaque
|
fuzzy = false; // Opaque
|
||||||
|
|
||||||
if (fuzzy)
|
if (fuzzy)
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
}
|
}
|
||||||
else if (pfloor->flags & FF_FOG)
|
else if (pfloor->flags & FF_FOG)
|
||||||
colfunc = R_DrawFogColumn_8;
|
colfunc = colfuncs[COLDRAWFUNC_FOG];
|
||||||
|
|
||||||
#ifdef ESLOPE
|
#ifdef ESLOPE
|
||||||
range = max(ds->x2-ds->x1, 1);
|
range = max(ds->x2-ds->x1, 1);
|
||||||
|
@ -978,7 +978,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else if (pfloor->flags & FF_FOG)
|
else if (pfloor->flags & FF_FOG)
|
||||||
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||||
else if (colfunc == fuzzcolfunc)
|
else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY])
|
||||||
lightnum = LIGHTLEVELS-1;
|
lightnum = LIGHTLEVELS-1;
|
||||||
else
|
else
|
||||||
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
|
lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)
|
||||||
|
@ -1310,7 +1310,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||||
spryscale += rw_scalestep;
|
spryscale += rw_scalestep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
colfunc = wallcolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
#undef CLAMPMAX
|
#undef CLAMPMAX
|
||||||
#undef CLAMPMIN
|
#undef CLAMPMIN
|
||||||
|
@ -1549,7 +1549,7 @@ static void R_RenderSegLoop (void)
|
||||||
else
|
else
|
||||||
dc_lightlist[i].rcolormap = xwalllights[pindex];
|
dc_lightlist[i].rcolormap = xwalllights[pindex];
|
||||||
|
|
||||||
colfunc = R_DrawColumnShadowed_8;
|
colfunc = colfuncs[COLDRAWFUNC_SHADOWED];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1758,6 +1758,8 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
memset(&segright, 0x00, sizeof(segright));
|
memset(&segright, 0x00, sizeof(segright));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
if (ds_p == drawsegs+maxdrawsegs)
|
if (ds_p == drawsegs+maxdrawsegs)
|
||||||
{
|
{
|
||||||
size_t curpos = curdrawsegs - drawsegs;
|
size_t curpos = curdrawsegs - drawsegs;
|
||||||
|
@ -3227,7 +3229,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
R_RenderSegLoop();
|
R_RenderSegLoop();
|
||||||
colfunc = wallcolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
if (portalline) // if curline is a portal, set portalrender for drawseg
|
if (portalline) // if curline is a portal, set portalrender for drawseg
|
||||||
ds_p->portalpass = portalrender+1;
|
ds_p->portalpass = portalrender+1;
|
||||||
|
|
|
@ -512,7 +512,7 @@ static void R_RenderFloorSplat(floorsplat_t *pSplat, vertex_t *verts, UINT8 *pTe
|
||||||
ds_x1 = x1;
|
ds_x1 = x1;
|
||||||
ds_x2 = x2;
|
ds_x2 = x2;
|
||||||
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
|
ds_transmap = transtables + ((tr_trans50-1)<<FF_TRANSSHIFT);
|
||||||
splatfunc();
|
(spanfuncs[SPANDRAWFUNC_SPLAT])();
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset for next calls to edge rasterizer
|
// reset for next calls to edge rasterizer
|
||||||
|
|
|
@ -653,11 +653,7 @@ void R_DrawMaskedColumn(column_t *column)
|
||||||
// quick fix... something more proper should be done!!!
|
// quick fix... something more proper should be done!!!
|
||||||
if (ylookup[dc_yl])
|
if (ylookup[dc_yl])
|
||||||
colfunc();
|
colfunc();
|
||||||
else if (colfunc == R_DrawColumn_8
|
else if (colfunc == colfuncs[COLDRAWFUNC_BASE])
|
||||||
#ifdef USEASM
|
|
||||||
|| colfunc == R_DrawColumn_8_ASM || colfunc == R_DrawColumn_8_MMX
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
static INT32 first = 1;
|
static INT32 first = 1;
|
||||||
if (first)
|
if (first)
|
||||||
|
@ -724,11 +720,7 @@ void R_DrawFlippedMaskedColumn(column_t *column, INT32 texheight)
|
||||||
// Still drawn by R_DrawColumn.
|
// Still drawn by R_DrawColumn.
|
||||||
if (ylookup[dc_yl])
|
if (ylookup[dc_yl])
|
||||||
colfunc();
|
colfunc();
|
||||||
else if (colfunc == R_DrawColumn_8
|
else if (colfunc == colfuncs[COLDRAWFUNC_BASE])
|
||||||
#ifdef USEASM
|
|
||||||
|| colfunc == R_DrawColumn_8_ASM || colfunc == R_DrawColumn_8_MMX
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
static INT32 first = 1;
|
static INT32 first = 1;
|
||||||
if (first)
|
if (first)
|
||||||
|
@ -776,12 +768,12 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // ditto
|
if ((UINT64)overflow_test&0xFFFFFFFF80000000ULL) return; // ditto
|
||||||
}
|
}
|
||||||
|
|
||||||
colfunc = basecolfunc; // hack: this isn't resetting properly somewhere.
|
colfunc = colfuncs[BASEDRAWFUNC]; // hack: this isn't resetting properly somewhere.
|
||||||
dc_colormap = vis->colormap;
|
dc_colormap = vis->colormap;
|
||||||
if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
if (!(vis->cut & SC_PRECIP) && (vis->mobj->flags & (MF_ENEMY|MF_BOSS)) && (vis->mobj->flags2 & MF2_FRET) && !(vis->mobj->flags & MF_GRENADEBOUNCE) && (leveltime & 1)) // Bosses "flash"
|
||||||
{
|
{
|
||||||
// translate certain pixels to white
|
// translate certain pixels to white
|
||||||
colfunc = transcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_TRANS];
|
||||||
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
|
if (vis->mobj->type == MT_CYBRAKDEMON || vis->mobj->colorized)
|
||||||
dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap(TC_ALLWHITE, 0, GTC_CACHE);
|
||||||
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
else if (vis->mobj->type == MT_METALSONIC_BATTLE)
|
||||||
|
@ -791,7 +783,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
}
|
}
|
||||||
else if (vis->mobj->color && vis->transmap) // Color mapping
|
else if (vis->mobj->color && vis->transmap) // Color mapping
|
||||||
{
|
{
|
||||||
colfunc = transtransfunc;
|
colfunc = colfuncs[COLDRAWFUNC_TRANSTRANS];
|
||||||
dc_transmap = vis->transmap;
|
dc_transmap = vis->transmap;
|
||||||
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
||||||
dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap(TC_RAINBOW, vis->mobj->color, GTC_CACHE);
|
||||||
|
@ -815,13 +807,13 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
}
|
}
|
||||||
else if (vis->transmap)
|
else if (vis->transmap)
|
||||||
{
|
{
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
||||||
}
|
}
|
||||||
else if (vis->mobj->color)
|
else if (vis->mobj->color)
|
||||||
{
|
{
|
||||||
// translate green skin to another color
|
// translate green skin to another color
|
||||||
colfunc = transcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_TRANS];
|
||||||
|
|
||||||
// New colormap stuff for skins Tails 06-07-2002
|
// New colormap stuff for skins Tails 06-07-2002
|
||||||
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
if (!(vis->cut & SC_PRECIP) && vis->mobj->colorized)
|
||||||
|
@ -846,7 +838,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
}
|
}
|
||||||
else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome.
|
else if (vis->mobj->sprite == SPR_PLAY) // Looks like a player, but doesn't have a color? Get rid of green sonic syndrome.
|
||||||
{
|
{
|
||||||
colfunc = transcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_TRANS];
|
||||||
dc_translation = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE);
|
dc_translation = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_BLUE, GTC_CACHE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -926,7 +918,7 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
||||||
spryscale += vis->scalestep;
|
spryscale += vis->scalestep;
|
||||||
}
|
}
|
||||||
|
|
||||||
colfunc = basecolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
dc_hires = 0;
|
dc_hires = 0;
|
||||||
|
|
||||||
vis->x1 = x1;
|
vis->x1 = x1;
|
||||||
|
@ -956,7 +948,7 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
|
||||||
|
|
||||||
if (vis->transmap)
|
if (vis->transmap)
|
||||||
{
|
{
|
||||||
colfunc = fuzzcolfunc;
|
colfunc = colfuncs[COLDRAWFUNC_FUZZY];
|
||||||
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
dc_transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -992,7 +984,7 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
|
||||||
R_DrawMaskedColumn(column);
|
R_DrawMaskedColumn(column);
|
||||||
}
|
}
|
||||||
|
|
||||||
colfunc = basecolfunc;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
98
src/screen.c
98
src/screen.c
|
@ -41,20 +41,12 @@
|
||||||
// --------------------------------------------
|
// --------------------------------------------
|
||||||
// assembly or c drawer routines for 8bpp/16bpp
|
// assembly or c drawer routines for 8bpp/16bpp
|
||||||
// --------------------------------------------
|
// --------------------------------------------
|
||||||
void (*wallcolfunc)(void); // new wall column drawer to draw posts >128 high
|
void (*colfunc)(void);
|
||||||
void (*colfunc)(void); // standard column, up to 128 high posts
|
void (*colfuncs[COLDRAWFUNC_MAX])(void);
|
||||||
|
|
||||||
void (*basecolfunc)(void);
|
void (*spanfunc)(void);
|
||||||
void (*fuzzcolfunc)(void); // standard fuzzy effect column drawer
|
void (*spanfuncs[SPANDRAWFUNC_MAX])(void);
|
||||||
void (*transcolfunc)(void); // translation column drawer
|
void (*spanfuncs_npo2[SPANDRAWFUNC_MAX])(void);
|
||||||
void (*shadecolfunc)(void); // smokie test..
|
|
||||||
void (*spanfunc)(void); // span drawer, use a 64x64 tile
|
|
||||||
void (*mmxspanfunc)(void); // span drawer in MMX assembly
|
|
||||||
void (*splatfunc)(void); // span drawer w/ transparency
|
|
||||||
void (*basespanfunc)(void); // default span func for color mode
|
|
||||||
void (*transtransfunc)(void); // translucent translated column drawer
|
|
||||||
void (*twosmultipatchfunc)(void); // for cols with transparent pixels
|
|
||||||
void (*twosmultipatchtransfunc)(void); // for cols with transparent pixels AND translucency
|
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
// global video state
|
// global video state
|
||||||
|
@ -113,36 +105,72 @@ void SCR_SetMode(void)
|
||||||
//
|
//
|
||||||
if (true)//vid.bpp == 1) //Always run in 8bpp. todo: remove all 16bpp code?
|
if (true)//vid.bpp == 1) //Always run in 8bpp. todo: remove all 16bpp code?
|
||||||
{
|
{
|
||||||
spanfunc = basespanfunc = mmxspanfunc = R_DrawSpan_8;
|
colfuncs[BASEDRAWFUNC] = R_DrawColumn_8;
|
||||||
splatfunc = R_DrawSplat_8;
|
spanfuncs[BASEDRAWFUNC] = R_DrawSpan_8;
|
||||||
transcolfunc = R_DrawTranslatedColumn_8;
|
|
||||||
transtransfunc = R_DrawTranslatedTranslucentColumn_8;
|
colfunc = colfuncs[BASEDRAWFUNC];
|
||||||
|
spanfunc = spanfuncs[BASEDRAWFUNC];
|
||||||
|
|
||||||
|
colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_TRANS] = R_DrawTranslatedColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_SHADOWED] = R_DrawColumnShadowed_8;
|
||||||
|
colfuncs[COLDRAWFUNC_TRANSTRANS] = R_DrawTranslatedTranslucentColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS] = R_Draw2sMultiPatchTranslucentColumn_8;
|
||||||
|
colfuncs[COLDRAWFUNC_FOG] = R_DrawFogColumn_8;
|
||||||
|
|
||||||
|
spanfuncs[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan_8;
|
||||||
|
spanfuncs[SPANDRAWFUNC_SPLAT] = R_DrawSplat_8;
|
||||||
|
spanfuncs[SPANDRAWFUNC_TRANSSPLAT] = R_DrawTranslucentSplat_8;
|
||||||
|
spanfuncs[SPANDRAWFUNC_FOG] = R_DrawFogSpan_8;
|
||||||
|
#ifndef NOWATER
|
||||||
|
spanfuncs[SPANDRAWFUNC_WATER] = R_DrawTranslucentWaterSpan_8;
|
||||||
|
#endif
|
||||||
|
#ifdef ESLOPE
|
||||||
|
spanfuncs[SPANDRAWFUNC_TILTED] = R_DrawTiltedSpan_8;
|
||||||
|
spanfuncs[SPANDRAWFUNC_TILTEDTRANS] = R_DrawTiltedTranslucentSpan_8;
|
||||||
|
#ifndef NOWATER
|
||||||
|
spanfuncs[SPANDRAWFUNC_TILTEDWATER] = R_DrawTiltedTranslucentWaterSpan_8;
|
||||||
|
#endif
|
||||||
|
spanfuncs[SPANDRAWFUNC_TILTEDSPLAT] = R_DrawTiltedSplat_8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Lactozilla: Non-powers-of-two
|
||||||
|
spanfuncs_npo2[BASEDRAWFUNC] = R_DrawSpan_NPO2_8;
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan_NPO2_8;
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_SPLAT] = R_DrawSplat_NPO2_8;
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TRANSSPLAT] = R_DrawTranslucentSplat_NPO2_8;
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_FOG] = NULL; // Not needed
|
||||||
|
#ifndef NOWATER
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_WATER] = R_DrawTranslucentWaterSpan_NPO2_8;
|
||||||
|
#endif
|
||||||
|
#ifdef ESLOPE
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TILTED] = R_DrawTiltedSpan_NPO2_8;
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TILTEDTRANS] = R_DrawTiltedTranslucentSpan_NPO2_8;
|
||||||
|
#ifndef NOWATER
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TILTEDWATER] = R_DrawTiltedTranslucentWaterSpan_NPO2_8;
|
||||||
|
#endif
|
||||||
|
spanfuncs_npo2[SPANDRAWFUNC_TILTEDSPLAT] = R_DrawTiltedSplat_NPO2_8;
|
||||||
|
#endif
|
||||||
|
|
||||||
colfunc = basecolfunc = R_DrawColumn_8;
|
|
||||||
shadecolfunc = R_DrawShadeColumn_8;
|
|
||||||
fuzzcolfunc = R_DrawTranslucentColumn_8;
|
|
||||||
walldrawerfunc = R_DrawWallColumn_8;
|
|
||||||
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8;
|
|
||||||
twosmultipatchtransfunc = R_Draw2sMultiPatchTranslucentColumn_8;
|
|
||||||
#ifdef RUSEASM
|
#ifdef RUSEASM
|
||||||
if (R_ASM)
|
if (R_ASM)
|
||||||
{
|
{
|
||||||
if (R_MMX)
|
if (R_MMX)
|
||||||
{
|
{
|
||||||
colfunc = basecolfunc = R_DrawColumn_8_MMX;
|
colfuncs[BASEDRAWFUNC] = R_DrawColumn_8_MMX;
|
||||||
//shadecolfunc = R_DrawShadeColumn_8_ASM;
|
//colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8_ASM;
|
||||||
//fuzzcolfunc = R_DrawTranslucentColumn_8_ASM;
|
//colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8_ASM;
|
||||||
walldrawerfunc = R_DrawWallColumn_8_MMX;
|
colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8_MMX;
|
||||||
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8_MMX;
|
spanfuncs[BASEDRAWFUNC] = R_DrawSpan_8_MMX;
|
||||||
mmxspanfunc = R_DrawSpan_8_MMX;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
colfunc = basecolfunc = R_DrawColumn_8_ASM;
|
colfuncs[BASEDRAWFUNC] = R_DrawColumn_8_ASM;
|
||||||
//shadecolfunc = R_DrawShadeColumn_8_ASM;
|
//colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8_ASM;
|
||||||
//fuzzcolfunc = R_DrawTranslucentColumn_8_ASM;
|
//colfuncs[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_8_ASM;
|
||||||
walldrawerfunc = R_DrawWallColumn_8_ASM;
|
colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8_ASM;
|
||||||
twosmultipatchfunc = R_Draw2sMultiPatchColumn_8_ASM;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -166,8 +194,6 @@ void SCR_SetMode(void)
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT);
|
CONS_Alert(CONS_WARNING, M_GetText("Resolution is not aspect-correct!\nUse a multiple of %dx%d\n"), BASEVIDWIDTH, BASEVIDHEIGHT);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wallcolfunc = walldrawerfunc;
|
|
||||||
|
|
||||||
// set the apprpriate drawer for the sky (tall or INT16)
|
// set the apprpriate drawer for the sky (tall or INT16)
|
||||||
setmodeneeded = 0;
|
setmodeneeded = 0;
|
||||||
}
|
}
|
||||||
|
|
57
src/screen.h
57
src/screen.h
|
@ -110,19 +110,51 @@ extern vmode_t specialmodes[NUMSPECIALMODES];
|
||||||
// color mode dependent drawer function pointers
|
// color mode dependent drawer function pointers
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
|
||||||
extern void (*wallcolfunc)(void);
|
#define BASEDRAWFUNC 0
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
COLDRAWFUNC_BASE = BASEDRAWFUNC,
|
||||||
|
COLDRAWFUNC_FUZZY,
|
||||||
|
COLDRAWFUNC_TRANS,
|
||||||
|
COLDRAWFUNC_SHADE,
|
||||||
|
COLDRAWFUNC_SHADOWED,
|
||||||
|
COLDRAWFUNC_TRANSTRANS,
|
||||||
|
COLDRAWFUNC_TWOSMULTIPATCH,
|
||||||
|
COLDRAWFUNC_TWOSMULTIPATCHTRANS,
|
||||||
|
COLDRAWFUNC_FOG,
|
||||||
|
|
||||||
|
COLDRAWFUNC_MAX
|
||||||
|
};
|
||||||
|
|
||||||
extern void (*colfunc)(void);
|
extern void (*colfunc)(void);
|
||||||
extern void (*basecolfunc)(void);
|
extern void (*colfuncs[COLDRAWFUNC_MAX])(void);
|
||||||
extern void (*fuzzcolfunc)(void);
|
|
||||||
extern void (*transcolfunc)(void);
|
enum
|
||||||
extern void (*shadecolfunc)(void);
|
{
|
||||||
|
SPANDRAWFUNC_BASE = BASEDRAWFUNC,
|
||||||
|
SPANDRAWFUNC_TRANS,
|
||||||
|
SPANDRAWFUNC_SPLAT,
|
||||||
|
SPANDRAWFUNC_TRANSSPLAT,
|
||||||
|
SPANDRAWFUNC_FOG,
|
||||||
|
#ifndef NOWATER
|
||||||
|
SPANDRAWFUNC_WATER,
|
||||||
|
#endif
|
||||||
|
#ifdef ESLOPE
|
||||||
|
SPANDRAWFUNC_TILTED,
|
||||||
|
SPANDRAWFUNC_TILTEDTRANS,
|
||||||
|
SPANDRAWFUNC_TILTEDSPLAT,
|
||||||
|
#ifndef NOWATER
|
||||||
|
SPANDRAWFUNC_TILTEDWATER,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SPANDRAWFUNC_MAX
|
||||||
|
};
|
||||||
|
|
||||||
extern void (*spanfunc)(void);
|
extern void (*spanfunc)(void);
|
||||||
extern void (*basespanfunc)(void);
|
extern void (*spanfuncs[SPANDRAWFUNC_MAX])(void);
|
||||||
extern void (*mmxspanfunc)(void);
|
extern void (*spanfuncs_npo2[SPANDRAWFUNC_MAX])(void);
|
||||||
extern void (*splatfunc)(void);
|
|
||||||
extern void (*transtransfunc)(void);
|
|
||||||
extern void (*twosmultipatchfunc)(void);
|
|
||||||
extern void (*twosmultipatchtransfunc)(void);
|
|
||||||
|
|
||||||
// -----
|
// -----
|
||||||
// CPUID
|
// CPUID
|
||||||
|
@ -148,9 +180,6 @@ extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_fu
|
||||||
// wait for page flipping to end or not
|
// wait for page flipping to end or not
|
||||||
extern consvar_t cv_vidwait;
|
extern consvar_t cv_vidwait;
|
||||||
|
|
||||||
// quick fix for tall/short skies, depending on bytesperpixel
|
|
||||||
extern void (*walldrawerfunc)(void);
|
|
||||||
|
|
||||||
// Change video mode, only at the start of a refresh.
|
// Change video mode, only at the start of a refresh.
|
||||||
void SCR_SetMode(void);
|
void SCR_SetMode(void);
|
||||||
// Recalc screen size dependent stuff
|
// Recalc screen size dependent stuff
|
||||||
|
|
|
@ -438,6 +438,9 @@
|
||||||
<ClCompile Include="..\r_draw8.c">
|
<ClCompile Include="..\r_draw8.c">
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\r_draw8_npo2.c">
|
||||||
|
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\r_main.c" />
|
<ClCompile Include="..\r_main.c" />
|
||||||
<ClCompile Include="..\r_plane.c" />
|
<ClCompile Include="..\r_plane.c" />
|
||||||
<ClCompile Include="..\r_patch.c" />
|
<ClCompile Include="..\r_patch.c" />
|
||||||
|
|
|
@ -837,6 +837,9 @@
|
||||||
<ClCompile Include="..\r_draw8.c">
|
<ClCompile Include="..\r_draw8.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\r_draw8_npo2.c">
|
||||||
|
<Filter>R_Rend</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\r_main.c">
|
<ClCompile Include="..\r_main.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -222,20 +222,15 @@ void OglSdlFinishUpdate(boolean waitvbl)
|
||||||
HWR_DrawScreenFinalTexture(realwidth, realheight);
|
HWR_DrawScreenFinalTexture(realwidth, realheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma)
|
EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette)
|
||||||
{
|
{
|
||||||
INT32 i = -1;
|
size_t palsize = (sizeof(RGBA_t) * 256);
|
||||||
UINT32 redgamma = pgamma->s.red, greengamma = pgamma->s.green,
|
// on a palette change, you have to reload all of the textures
|
||||||
bluegamma = pgamma->s.blue;
|
if (memcmp(&myPaletteData, palette, palsize))
|
||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
{
|
||||||
myPaletteData[i].s.red = (UINT8)MIN((palette[i].s.red * redgamma) /127, 255);
|
memcpy(&myPaletteData, palette, palsize);
|
||||||
myPaletteData[i].s.green = (UINT8)MIN((palette[i].s.green * greengamma)/127, 255);
|
Flush();
|
||||||
myPaletteData[i].s.blue = (UINT8)MIN((palette[i].s.blue * bluegamma) /127, 255);
|
|
||||||
myPaletteData[i].s.alpha = palette[i].s.alpha;
|
|
||||||
}
|
}
|
||||||
Flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //HWRENDER
|
#endif //HWRENDER
|
||||||
|
|
|
@ -31,5 +31,5 @@ extern Uint16 realwidth;
|
||||||
extern Uint16 realheight;
|
extern Uint16 realheight;
|
||||||
|
|
||||||
#ifdef _CREATE_DLL_
|
#ifdef _CREATE_DLL_
|
||||||
EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma);
|
EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette);
|
||||||
#endif
|
#endif
|
||||||
|
|
119
src/v_video.c
119
src/v_video.c
|
@ -84,39 +84,6 @@ static CV_PossibleValue_t constextsize_cons_t[] = {
|
||||||
static void CV_constextsize_OnChange(void);
|
static void CV_constextsize_OnChange(void);
|
||||||
consvar_t cv_constextsize = {"con_textsize", "Medium", CV_SAVE|CV_CALL, constextsize_cons_t, CV_constextsize_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_constextsize = {"con_textsize", "Medium", CV_SAVE|CV_CALL, constextsize_cons_t, CV_constextsize_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#ifdef HWRENDER
|
|
||||||
static void CV_Gammaxxx_ONChange(void);
|
|
||||||
// Saved hardware mode variables
|
|
||||||
// - You can change them in software,
|
|
||||||
// but they won't do anything.
|
|
||||||
static CV_PossibleValue_t grgamma_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
|
|
||||||
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
|
|
||||||
static CV_PossibleValue_t grmodelinterpolation_cons_t[] = {{0, "Off"}, {1, "Sometimes"}, {2, "Always"}, {0, NULL}};
|
|
||||||
|
|
||||||
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grsoftwarefog = {"gr_softwarefog", "Off", CV_SAVE, grsoftwarefog_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grgammared = {"gr_gammared", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
|
|
||||||
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grgammagreen = {"gr_gammagreen", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
|
|
||||||
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grgammablue = {"gr_gammablue", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
|
|
||||||
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
#ifdef ALAM_LIGHTING
|
|
||||||
consvar_t cv_grdynamiclighting = {"gr_dynamiclighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grstaticlighting = {"gr_staticlighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
consvar_t cv_grmodels = {"gr_models", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grmodelinterpolation = {"gr_modelinterpolation", "Sometimes", CV_SAVE, grmodelinterpolation_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
|
|
||||||
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grskydome = {"gr_skydome", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// local copy of the palette for V_GetColor()
|
// local copy of the palette for V_GetColor()
|
||||||
RGBA_t *pLocalPalette = NULL;
|
RGBA_t *pLocalPalette = NULL;
|
||||||
RGBA_t *pMasterPalette = NULL;
|
RGBA_t *pMasterPalette = NULL;
|
||||||
|
@ -128,6 +95,7 @@ Please check it out if you're trying to maintain this.
|
||||||
toast 18/04/17
|
toast 18/04/17
|
||||||
*/
|
*/
|
||||||
float Cubepal[2][2][2][3];
|
float Cubepal[2][2][2][3];
|
||||||
|
boolean Cubeapply = false;
|
||||||
|
|
||||||
// returns whether to apply cube, selectively avoiding expensive operations
|
// returns whether to apply cube, selectively avoiding expensive operations
|
||||||
static boolean InitCube(void)
|
static boolean InitCube(void)
|
||||||
|
@ -343,11 +311,12 @@ const UINT8 correctiontable[256] =
|
||||||
// keep a copy of the palette so that we can get the RGB value for a color index at any time.
|
// keep a copy of the palette so that we can get the RGB value for a color index at any time.
|
||||||
static void LoadPalette(const char *lumpname)
|
static void LoadPalette(const char *lumpname)
|
||||||
{
|
{
|
||||||
boolean cube = InitCube();
|
|
||||||
lumpnum_t lumpnum = W_GetNumForName(lumpname);
|
lumpnum_t lumpnum = W_GetNumForName(lumpname);
|
||||||
size_t i, palsize = W_LumpLength(lumpnum)/3;
|
size_t i, palsize = W_LumpLength(lumpnum)/3;
|
||||||
UINT8 *pal;
|
UINT8 *pal;
|
||||||
|
|
||||||
|
Cubeapply = InitCube();
|
||||||
|
|
||||||
Z_Free(pLocalPalette);
|
Z_Free(pLocalPalette);
|
||||||
Z_Free(pMasterPalette);
|
Z_Free(pMasterPalette);
|
||||||
|
|
||||||
|
@ -369,43 +338,49 @@ static void LoadPalette(const char *lumpname)
|
||||||
pMasterPalette[i].s.alpha = pLocalPalette[i].s.alpha = 0xFF;
|
pMasterPalette[i].s.alpha = pLocalPalette[i].s.alpha = 0xFF;
|
||||||
|
|
||||||
// lerp of colour cubing! if you want, make it smoother yourself
|
// lerp of colour cubing! if you want, make it smoother yourself
|
||||||
if (cube)
|
if (Cubeapply)
|
||||||
{
|
V_CubeApply(&pLocalPalette[i].s.red, &pLocalPalette[i].s.green, &pLocalPalette[i].s.blue);
|
||||||
float working[4][3];
|
}
|
||||||
float linear;
|
}
|
||||||
UINT8 q;
|
|
||||||
|
|
||||||
linear = (pLocalPalette[i].s.red/255.0);
|
void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue)
|
||||||
|
{
|
||||||
|
float working[4][3];
|
||||||
|
float linear;
|
||||||
|
UINT8 q;
|
||||||
|
|
||||||
|
if (!Cubeapply)
|
||||||
|
return;
|
||||||
|
|
||||||
|
linear = (*red/255.0);
|
||||||
#define dolerp(e1, e2) ((1 - linear)*e1 + linear*e2)
|
#define dolerp(e1, e2) ((1 - linear)*e1 + linear*e2)
|
||||||
for (q = 0; q < 3; q++)
|
for (q = 0; q < 3; q++)
|
||||||
{
|
{
|
||||||
working[0][q] = dolerp(Cubepal[0][0][0][q], Cubepal[1][0][0][q]);
|
working[0][q] = dolerp(Cubepal[0][0][0][q], Cubepal[1][0][0][q]);
|
||||||
working[1][q] = dolerp(Cubepal[0][1][0][q], Cubepal[1][1][0][q]);
|
working[1][q] = dolerp(Cubepal[0][1][0][q], Cubepal[1][1][0][q]);
|
||||||
working[2][q] = dolerp(Cubepal[0][0][1][q], Cubepal[1][0][1][q]);
|
working[2][q] = dolerp(Cubepal[0][0][1][q], Cubepal[1][0][1][q]);
|
||||||
working[3][q] = dolerp(Cubepal[0][1][1][q], Cubepal[1][1][1][q]);
|
working[3][q] = dolerp(Cubepal[0][1][1][q], Cubepal[1][1][1][q]);
|
||||||
}
|
}
|
||||||
linear = (pLocalPalette[i].s.green/255.0);
|
linear = (*green/255.0);
|
||||||
for (q = 0; q < 3; q++)
|
for (q = 0; q < 3; q++)
|
||||||
{
|
{
|
||||||
working[0][q] = dolerp(working[0][q], working[1][q]);
|
working[0][q] = dolerp(working[0][q], working[1][q]);
|
||||||
working[1][q] = dolerp(working[2][q], working[3][q]);
|
working[1][q] = dolerp(working[2][q], working[3][q]);
|
||||||
}
|
}
|
||||||
linear = (pLocalPalette[i].s.blue/255.0);
|
linear = (*blue/255.0);
|
||||||
for (q = 0; q < 3; q++)
|
for (q = 0; q < 3; q++)
|
||||||
{
|
{
|
||||||
working[0][q] = 255*dolerp(working[0][q], working[1][q]);
|
working[0][q] = 255*dolerp(working[0][q], working[1][q]);
|
||||||
if (working[0][q] > 255.0)
|
if (working[0][q] > 255.0)
|
||||||
working[0][q] = 255.0;
|
working[0][q] = 255.0;
|
||||||
else if (working[0][q] < 0.0)
|
else if (working[0][q] < 0.0)
|
||||||
working[0][q] = 0.0;
|
working[0][q] = 0.0;
|
||||||
}
|
}
|
||||||
#undef dolerp
|
#undef dolerp
|
||||||
|
|
||||||
pLocalPalette[i].s.red = (UINT8)(working[0][0]);
|
*red = (UINT8)(working[0][0]);
|
||||||
pLocalPalette[i].s.green = (UINT8)(working[0][1]);
|
*green = (UINT8)(working[0][1]);
|
||||||
pLocalPalette[i].s.blue = (UINT8)(working[0][2]);
|
*blue = (UINT8)(working[0][2]);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *R_GetPalname(UINT16 num)
|
const char *R_GetPalname(UINT16 num)
|
||||||
|
@ -473,16 +448,6 @@ static void CV_palette_OnChange(void)
|
||||||
V_SetPalette(0);
|
V_SetPalette(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// change the palette directly to see the change
|
|
||||||
#ifdef HWRENDER
|
|
||||||
static void CV_Gammaxxx_ONChange(void)
|
|
||||||
{
|
|
||||||
if (rendermode != render_soft && rendermode != render_none)
|
|
||||||
V_SetPalette(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if defined (__GNUC__) && defined (__i386__) && !defined (NOASM) && !defined (__APPLE__) && !defined (NORUSEASM)
|
#if defined (__GNUC__) && defined (__i386__) && !defined (NOASM) && !defined (__APPLE__) && !defined (NORUSEASM)
|
||||||
void VID_BlitLinearScreen_ASM(const UINT8 *srcptr, UINT8 *destptr, INT32 width, INT32 height, size_t srcrowbytes,
|
void VID_BlitLinearScreen_ASM(const UINT8 *srcptr, UINT8 *destptr, INT32 width, INT32 height, size_t srcrowbytes,
|
||||||
size_t destrowbytes);
|
size_t destrowbytes);
|
||||||
|
|
|
@ -48,6 +48,8 @@ const char *GetPalette(void);
|
||||||
extern RGBA_t *pLocalPalette;
|
extern RGBA_t *pLocalPalette;
|
||||||
extern RGBA_t *pMasterPalette;
|
extern RGBA_t *pMasterPalette;
|
||||||
|
|
||||||
|
void V_CubeApply(UINT8 *red, UINT8 *green, UINT8 *blue);
|
||||||
|
|
||||||
// Retrieve the ARGB value from a palette color index
|
// Retrieve the ARGB value from a palette color index
|
||||||
#define V_GetColor(color) (pLocalPalette[color&0xFF])
|
#define V_GetColor(color) (pLocalPalette[color&0xFF])
|
||||||
|
|
||||||
|
|
|
@ -1516,8 +1516,8 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
// Software-only compile cache the data without conversion
|
// Software-only compile cache the data without conversion
|
||||||
if (rendermode == render_soft || rendermode == render_none)
|
if (rendermode == render_soft || rendermode == render_none)
|
||||||
{
|
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
lumpcache_t *lumpcache = wadfiles[wad]->patchcache;
|
lumpcache_t *lumpcache = wadfiles[wad]->patchcache;
|
||||||
if (!lumpcache[lump])
|
if (!lumpcache[lump])
|
||||||
{
|
{
|
||||||
|
@ -1551,8 +1551,8 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag)
|
||||||
Z_ChangeTag(lumpcache[lump], tag);
|
Z_ChangeTag(lumpcache[lump], tag);
|
||||||
|
|
||||||
return lumpcache[lump];
|
return lumpcache[lump];
|
||||||
#ifdef HWRENDER
|
|
||||||
}
|
}
|
||||||
|
#ifdef HWRENDER
|
||||||
|
|
||||||
grPatch = HWR_GetCachedGLPatchPwad(wad, lump);
|
grPatch = HWR_GetCachedGLPatchPwad(wad, lump);
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,9 @@
|
||||||
<ClCompile Include="..\r_draw8.c">
|
<ClCompile Include="..\r_draw8.c">
|
||||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\r_draw8_npo2.c">
|
||||||
|
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\r_main.c" />
|
<ClCompile Include="..\r_main.c" />
|
||||||
<ClCompile Include="..\r_plane.c" />
|
<ClCompile Include="..\r_plane.c" />
|
||||||
<ClCompile Include="..\r_patch.c" />
|
<ClCompile Include="..\r_patch.c" />
|
||||||
|
|
|
@ -369,6 +369,9 @@
|
||||||
<ClCompile Include="..\r_draw16.c">
|
<ClCompile Include="..\r_draw16.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\r_draw8_npo2.c">
|
||||||
|
<Filter>R_Rend</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\r_main.c">
|
<ClCompile Include="..\r_main.c">
|
||||||
<Filter>R_Rend</Filter>
|
<Filter>R_Rend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -98,7 +98,7 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"Init@4", &hwdriver.pfnInit},
|
{"Init@4", &hwdriver.pfnInit},
|
||||||
{"Shutdown@0", &hwdriver.pfnShutdown},
|
{"Shutdown@0", &hwdriver.pfnShutdown},
|
||||||
{"GetModeList@8", &hwdriver.pfnGetModeList},
|
{"GetModeList@8", &hwdriver.pfnGetModeList},
|
||||||
{"SetPalette@8", &hwdriver.pfnSetPalette},
|
{"SetPalette@4", &hwdriver.pfnSetPalette},
|
||||||
{"FinishUpdate@4", &hwdriver.pfnFinishUpdate},
|
{"FinishUpdate@4", &hwdriver.pfnFinishUpdate},
|
||||||
{"Draw2DLine@12", &hwdriver.pfnDraw2DLine},
|
{"Draw2DLine@12", &hwdriver.pfnDraw2DLine},
|
||||||
{"DrawPolygon@16", &hwdriver.pfnDrawPolygon},
|
{"DrawPolygon@16", &hwdriver.pfnDrawPolygon},
|
||||||
|
@ -110,7 +110,7 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
||||||
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
||||||
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
||||||
{"DrawModel@16", &hwdriver.pfnDrawModel},
|
{"DrawModel@16", &hwdriver.pfnDrawModel},
|
||||||
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
||||||
{"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
|
{"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
|
||||||
{"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},
|
{"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},
|
||||||
|
|
|
@ -46,6 +46,7 @@ enum
|
||||||
|
|
||||||
PU_HWRPATCHINFO = 21, // Hardware GLPatch_t struct for OpenGL texture cache
|
PU_HWRPATCHINFO = 21, // Hardware GLPatch_t struct for OpenGL texture cache
|
||||||
PU_HWRPATCHCOLMIPMAP = 22, // Hardware GLMipmap_t struct colormap variation of patch
|
PU_HWRPATCHCOLMIPMAP = 22, // Hardware GLMipmap_t struct colormap variation of patch
|
||||||
|
PU_HWRMODELTEXTURE = 23, // Hardware model texture
|
||||||
|
|
||||||
PU_HWRCACHE = 48, // static until unlocked
|
PU_HWRCACHE = 48, // static until unlocked
|
||||||
PU_CACHE = 49, // static until unlocked
|
PU_CACHE = 49, // static until unlocked
|
||||||
|
|
Loading…
Reference in a new issue