mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 00:41:55 +00:00
- hictinting cleanup.
This needs to be moved into the backend, and partially into the shader. So far this only removes the code from the main rendering logic, the final implementation is not done yet. It had to go because it required the main rendering code to look deep into the texture data which would be a major blocker for refactoring.
This commit is contained in:
parent
304a906aa7
commit
bef8c9ae76
14 changed files with 122 additions and 216 deletions
|
@ -36,9 +36,10 @@ if( APPLE )
|
|||
option( OSX_COCOA_BACKEND "Use native Cocoa backend instead of SDL" ON )
|
||||
endif()
|
||||
|
||||
if( ${DEMOLITION_TARGET_ARCH} MATCHES "x86_64" )
|
||||
# Right now only 64 bit is supported.
|
||||
#if( ${DEMOLITION_TARGET_ARCH} MATCHES "x86_64" )
|
||||
set( X64 64 )
|
||||
endif()
|
||||
#endif()
|
||||
|
||||
if( X64 OR ${DEMOLITION_TARGET_ARCH} MATCHES "i386" )
|
||||
add_definitions( -DARCH_IA32 )
|
||||
|
@ -60,52 +61,7 @@ if( WIN32 )
|
|||
add_definitions( -D_WIN32 )
|
||||
|
||||
|
||||
if( ( MSVC14 AND NOT CMAKE_GENERATOR_TOOLSET STREQUAL "v140_xp" ) OR # For VS 2015.
|
||||
( MSVC15 AND NOT CMAKE_GENERATOR_TOOLSET STREQUAL "v141_xp" ) ) # For VS 2017.
|
||||
# for modern Windows SDKs the DirectX headers should be available by default.
|
||||
set( DX_dinput8_LIBRARY dinput8 )
|
||||
else()
|
||||
|
||||
find_path( XINPUT_INCLUDE_DIR xinput.h
|
||||
PATHS ENV DXSDK_DIR
|
||||
PATH_SUFFIXES Include )
|
||||
if( NOT XINPUT_INCLUDE_DIR )
|
||||
# Modern versions of the Windows SDK include xinput.h. Unfortunately,
|
||||
# CMake cannot find this file via find_path, so we check for it using
|
||||
# CHECK_INCLUDE_FILES. windows.h must be included before xinput.h.
|
||||
CHECK_INCLUDE_FILES( "windows.h;xinput.h" XINPUT_H_FOUND )
|
||||
if( NOT XINPUT_H_FOUND )
|
||||
message( WARNING "Could not find xinput.h. XInput will be disabled." )
|
||||
add_definitions( -DNO_XINPUT )
|
||||
endif()
|
||||
else()
|
||||
include_directories( ${XINPUT_INCLUDE_DIR} )
|
||||
endif()
|
||||
|
||||
find_library( DX_dinput8_LIBRARY dinput8
|
||||
PATHS ENV DXSDK_DIR
|
||||
PATH_SUFFIXES Lib Lib/${XBITS} )
|
||||
if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
|
||||
find_library( DX_dxguid_LIBRARY dxguid
|
||||
PATHS ENV DXSDK_DIR
|
||||
PATH_SUFFIXES Lib Lib/${XBITS} )
|
||||
endif()
|
||||
|
||||
# Modern versions of the Windows SDK include dinput8. Unfortunately,
|
||||
# CMake cannot find these libraries via find_library.
|
||||
if( NOT DX_dinput8_LIBRARY )
|
||||
# If we got this far, assume dinput8 is in the system library path.
|
||||
set( DX_dinput8_LIBRARY dinput8 )
|
||||
endif()
|
||||
|
||||
if( DEM_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE )
|
||||
# Modern versions of the Windows SDK do NOT include dxguid. Its contents
|
||||
# were moved to dinput8.
|
||||
if( NOT DX_dxguid_LIBRARY )
|
||||
message( STATUS "Could not find dxguid. Build may fail on old Windows SDKs.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
set( DX_dinput8_LIBRARY dinput8 )
|
||||
|
||||
if( X64 )
|
||||
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../platform/Windows/lib/64)
|
||||
|
|
|
@ -9,30 +9,6 @@ typedef struct {
|
|||
|
||||
extern polytint_t hictinting[MAXPALOOKUPS];
|
||||
|
||||
static inline int have_basepal_tint(void)
|
||||
{
|
||||
polytint_t const & tint = hictinting[MAXPALOOKUPS-1];
|
||||
return (tint.r != 255 ||
|
||||
tint.g != 255 ||
|
||||
tint.b != 255);
|
||||
}
|
||||
|
||||
static inline void hictinting_apply(float *color, int32_t palnum)
|
||||
{
|
||||
polytint_t const & tint = hictinting[palnum];
|
||||
color[0] *= (float)tint.r * (1.f/255.f);
|
||||
color[1] *= (float)tint.g * (1.f/255.f);
|
||||
color[2] *= (float)tint.b * (1.f/255.f);
|
||||
}
|
||||
|
||||
static inline void hictinting_apply_ub(uint8_t *color, int32_t palnum)
|
||||
{
|
||||
polytint_t const & tint = hictinting[palnum];
|
||||
color[0] = (uint8_t)(color[0] * (float)tint.r * (1.f/255.f));
|
||||
color[1] = (uint8_t)(color[1] * (float)tint.g * (1.f/255.f));
|
||||
color[2] = (uint8_t)(color[2] * (float)tint.b * (1.f/255.f));
|
||||
}
|
||||
|
||||
static inline void globaltinting_apply(float *color)
|
||||
{
|
||||
color[0] *= (float)globalr * (1.f/255.f);
|
||||
|
@ -40,13 +16,6 @@ static inline void globaltinting_apply(float *color)
|
|||
color[2] *= (float)globalb * (1.f/255.f);
|
||||
}
|
||||
|
||||
static inline void globaltinting_apply_ub(uint8_t *color)
|
||||
{
|
||||
color[0] = (uint8_t)(color[0] * (float)globalr * (1.f/255.f));
|
||||
color[1] = (uint8_t)(color[1] * (float)globalg * (1.f/255.f));
|
||||
color[2] = (uint8_t)(color[2] * (float)globalb * (1.f/255.f));
|
||||
}
|
||||
|
||||
|
||||
// replacement flags
|
||||
enum
|
||||
|
@ -71,9 +40,6 @@ enum
|
|||
|
||||
HICTINT_BLENDMASK = 64|128,
|
||||
|
||||
HICTINT_ALWAYSUSEART = 256,
|
||||
HICTINT_NOFOGSHADE = 512,
|
||||
|
||||
HICTINT_PRECOMPUTED = HICTINT_COLORIZE | HICTINT_BLENDMASK,
|
||||
HICTINT_IN_MEMORY = HICTINT_PRECOMPUTED | HICTINT_GRAYSCALE | HICTINT_INVERT,
|
||||
|
||||
|
|
|
@ -23,14 +23,11 @@
|
|||
#define GLOWPAL (MAXPALOOKUPS - 2)
|
||||
#define SPECULARPAL (MAXPALOOKUPS - 3)
|
||||
#define NORMALPAL (MAXPALOOKUPS - 4)
|
||||
#define BRIGHTPAL (MAXPALOOKUPS)
|
||||
|
||||
extern uint8_t curbasepal;
|
||||
|
||||
#ifdef LUNATIC
|
||||
extern const char *(paletteGetBlendTable) (int32_t blend);
|
||||
#else
|
||||
#define paletteGetBlendTable(blend) (blendtable[blend])
|
||||
#endif
|
||||
|
||||
extern uint32_t PaletteIndexFullbrights[8];
|
||||
|
||||
|
|
|
@ -88,8 +88,7 @@ static FORCE_INLINE int32_t get_ceiling_fogpal(usectorptr_t const sec)
|
|||
}
|
||||
static FORCE_INLINE int32_t fogshade(int32_t const shade, int32_t const pal)
|
||||
{
|
||||
polytintflags_t const tintflags = hictinting[pal].f;
|
||||
return (globalflags & GLOBAL_NO_GL_FOGSHADE || tintflags & HICTINT_NOFOGSHADE) ? 0 : shade;
|
||||
return (globalflags & GLOBAL_NO_GL_FOGSHADE) ? 0 : shade;
|
||||
}
|
||||
|
||||
static FORCE_INLINE int check_nonpow2(int32_t const x)
|
||||
|
@ -178,7 +177,4 @@ extern hitdata_t polymost_hitdata;
|
|||
|
||||
#include "texcache.h"
|
||||
|
||||
extern void polymost_setupglowtexture(int32_t texunits, FHardwareTexture *tex);
|
||||
extern void polymost_setupdetailtexture(int32_t texunits, FHardwareTexture* tex);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1780,19 +1780,8 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
|
|||
|
||||
// tinting
|
||||
pc[0] = pc[1] = pc[2] = ((float)numshades - min(max((globalshade * shadescale) + m->shadeoff, 0.f), (float)numshades)) / (float)numshades;
|
||||
auto& h = hictinting[globalpal];
|
||||
polytintflags_t const tintflags = h.f;
|
||||
if (!(tintflags & HICTINT_PRECOMPUTED))
|
||||
{
|
||||
if (!(m->flags&1))
|
||||
hictinting_apply(pc, globalpal);
|
||||
else globalnoeffect=1;
|
||||
}
|
||||
GLInterface.SetTinting(tintflags, PalEntry(h.sr, h.sg, h.sb));
|
||||
|
||||
// global tinting
|
||||
if (have_basepal_tint())
|
||||
hictinting_apply(pc, MAXPALOOKUPS-1);
|
||||
auto h = hictinting[globalpal];
|
||||
GLInterface.SetTinting(h.f, PalEntry(h.sr, h.sg, h.sb), PalEntry(h.r, h.g, h.b));
|
||||
|
||||
pc[3] = (tspr->cstat&2) ? glblend[tspr->blend].def[!!(tspr->cstat&512)].alpha : 1.0f;
|
||||
pc[3] *= 1.0f - sext->alpha;
|
||||
|
@ -1914,7 +1903,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
|
|||
if (!(tspr->extra&TSPR_EXTRA_MDHACK))
|
||||
{
|
||||
//POGOTODO: if we add support for palette indexing on model skins, the texture for the palswap could be setup here
|
||||
|
||||
#if 0 // FIXME: This shouls use the HightileReplacement structure inside the texture so that it can use the same code as world textures.
|
||||
tex = r_detailmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, DETAILPAL, surfi) : nullptr;
|
||||
|
||||
if (tex)
|
||||
|
@ -1922,7 +1911,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
|
|||
mdskinmap_t *sk;
|
||||
|
||||
GLInterface.UseDetailMapping(true);
|
||||
polymost_setupdetailtexture(3, tex);
|
||||
//polymost_setupdetailtexture(3, tex);
|
||||
|
||||
for (sk = m->skinmap; sk; sk = sk->next)
|
||||
if ((int32_t) sk->palette == DETAILPAL && sk->skinnum == tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum && sk->surfnum == surfi)
|
||||
|
@ -1939,13 +1928,13 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
|
|||
if (i)
|
||||
{
|
||||
GLInterface.UseGlowMapping(true);
|
||||
polymost_setupglowtexture(4, tex);
|
||||
//polymost_setupglowtexture(4, tex);
|
||||
|
||||
texmat.loadIdentity();
|
||||
texmat.translate(xpanning, ypanning, 1.0f);
|
||||
GLInterface.SetMatrix(Matrix_Glow, &texmat);
|
||||
}
|
||||
|
||||
#endif
|
||||
indexhandle = m->vindexes;
|
||||
|
||||
//PLAG: delayed polygon-level sorted rendering
|
||||
|
@ -2009,7 +1998,7 @@ static int32_t polymost_md3draw(md3model_t *m, tspriteptr_t tspr)
|
|||
VSMatrix identity(0);
|
||||
GLInterface.SetMatrix(Matrix_ModelView, &identity);
|
||||
|
||||
GLInterface.SetTinting(0, 0);
|
||||
GLInterface.SetTinting(0, 0, PalEntry(255, 255, 255));
|
||||
GLInterface.SetClamp(prevClamp);
|
||||
GLInterface.SetPolymostShader();
|
||||
|
||||
|
|
|
@ -479,20 +479,6 @@ void uploadpalswaps(int count, int32_t* swaps)
|
|||
}
|
||||
|
||||
|
||||
|
||||
#ifdef USE_GLEXT
|
||||
void polymost_setupdetailtexture(const int32_t texunits, FHardwareTexture *tex)
|
||||
{
|
||||
GLInterface.BindTexture(texunits, tex, SamplerRepeat);
|
||||
}
|
||||
|
||||
void polymost_setupglowtexture(const int32_t texunits, FHardwareTexture* tex)
|
||||
{
|
||||
GLInterface.BindTexture(texunits, tex, SamplerRepeat);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//(dpx,dpy) specifies an n-sided polygon. The polygon must be a convex clockwise loop.
|
||||
// n must be <= 8 (assume clipping can double number of vertices)
|
||||
//method: 0:solid, 1:masked(255 is transparent), 2:transluscent #1, 3:transluscent #2
|
||||
|
@ -516,6 +502,7 @@ int32_t polymost_maskWallHasTranslucency(uwalltype const * const wall)
|
|||
auto tex = TileFiles.tiles[wall->picnum];
|
||||
auto si = tex->FindReplacement(wall->pal);
|
||||
if (si && usehightile) tex = si->faces[0];
|
||||
if (tex->Get8BitPixels()) return false;
|
||||
return tex && tex->GetTranslucency();
|
||||
}
|
||||
|
||||
|
@ -526,8 +513,9 @@ int32_t polymost_spriteHasTranslucency(uspritetype const * const tspr)
|
|||
return true;
|
||||
|
||||
auto tex = TileFiles.tiles[tspr->picnum];
|
||||
auto si = tex->FindReplacement(tspr->shade, hictinting[tspr->shade].f & HICTINT_ALWAYSUSEART);
|
||||
auto si = tex->FindReplacement(tspr->shade, 0);
|
||||
if (si && usehightile) tex = si->faces[0];
|
||||
if (tex->Get8BitPixels()) return false;
|
||||
return tex && tex->GetTranslucency();
|
||||
}
|
||||
|
||||
|
@ -755,8 +743,12 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
|
|||
{
|
||||
// Fixme: Alpha test on shaders must be done differently.
|
||||
// Also: Consider a texture's alpha threshold.
|
||||
#ifdef HICR
|
||||
float const al = alphahackarray[globalpicnum] != 0 ? alphahackarray[globalpicnum] * (1.f/255.f) :
|
||||
(pth->hicr && pth->hicr->alphacut >= 0.f ? pth->hicr->alphacut : 0.f);
|
||||
#else
|
||||
float al = 0;
|
||||
#endif
|
||||
|
||||
GLInterface.SetAlphaThreshold(al);
|
||||
handle_blend((method & DAMETH_MASKPROPS) > DAMETH_MASK, drawpoly_blend, (method & DAMETH_MASKPROPS) == DAMETH_TRANS2);
|
||||
|
@ -774,22 +766,8 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
|
|||
|
||||
// tinting
|
||||
auto& h = hictinting[globalpal];
|
||||
polytintflags_t const tintflags = h.f;
|
||||
if (!(tintflags & HICTINT_PRECOMPUTED))
|
||||
{
|
||||
if (pth->flags & PTH_HIGHTILE)
|
||||
{
|
||||
if (pth->palnum != globalpal || (pth->effects & HICTINT_IN_MEMORY) || (tintflags & HICTINT_APPLYOVERALTPAL))
|
||||
hictinting_apply(pc, globalpal);
|
||||
}
|
||||
else if (tintflags & (HICTINT_USEONART|HICTINT_ALWAYSUSEART))
|
||||
hictinting_apply(pc, globalpal);
|
||||
}
|
||||
GLInterface.SetTinting(tintflags, PalEntry(h.sr, h.sg, h.sb));
|
||||
|
||||
// global tinting
|
||||
if ((pth->flags & PTH_HIGHTILE) && have_basepal_tint())
|
||||
hictinting_apply(pc, MAXPALOOKUPS-1);
|
||||
GLInterface.SetTinting(h.f, PalEntry(h.sr, h.sg, h.sb), PalEntry(h.r, h.g, h.b));
|
||||
|
||||
globaltinting_apply(pc);
|
||||
|
||||
|
@ -819,7 +797,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
|
|||
}
|
||||
GLInterface.Draw(DT_TRIANGLE_FAN, data.first, npoints);
|
||||
|
||||
GLInterface.SetTinting(0,0);
|
||||
GLInterface.SetTinting(0, 0, PalEntry(255, 255, 255));
|
||||
GLInterface.UseDetailMapping(false);
|
||||
GLInterface.UseGlowMapping(false);
|
||||
GLInterface.SetNpotEmulation(false, 1.f, 0.f);
|
||||
|
@ -2486,7 +2464,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
|
||||
skyzbufferhack = 1;
|
||||
|
||||
if (!usehightile || !hicfindskybox(globalpicnum, globalpal))
|
||||
//if (!usehightile || !hicfindskybox(globalpicnum, globalpal))
|
||||
{
|
||||
float const ghorizbak = ghoriz;
|
||||
pow2xsplit = 0;
|
||||
|
@ -2498,6 +2476,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
flatskyrender = 0;
|
||||
ghoriz = ghorizbak;
|
||||
}
|
||||
#if 0
|
||||
else //NOTE: code copied from ceiling code... lots of duplicated stuff :/
|
||||
{
|
||||
//Skybox code for parallax floor!
|
||||
|
@ -2676,6 +2655,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
skyclamphack = 0;
|
||||
drawingskybox = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
skyclamphack = 0;
|
||||
skyzbufferhack = 0;
|
||||
|
@ -2746,7 +2726,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
|
||||
skyzbufferhack = 1;
|
||||
|
||||
if (!usehightile || !hicfindskybox(globalpicnum, globalpal))
|
||||
//if (!usehightile || !hicfindskybox(globalpicnum, globalpal))
|
||||
{
|
||||
float const ghorizbak = ghoriz;
|
||||
pow2xsplit = 0;
|
||||
|
@ -2758,6 +2738,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
flatskyrender = 0;
|
||||
ghoriz = ghorizbak;
|
||||
}
|
||||
#if 0
|
||||
else
|
||||
{
|
||||
//Skybox code for parallax ceiling!
|
||||
|
@ -2936,6 +2917,7 @@ static void polymost_drawalls(int32_t const bunch)
|
|||
skyclamphack = 0;
|
||||
drawingskybox = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
skyclamphack = 0;
|
||||
skyzbufferhack = 0;
|
||||
|
@ -3440,6 +3422,12 @@ void polymost_drawrooms()
|
|||
{
|
||||
if (videoGetRenderMode() == REND_CLASSIC) return;
|
||||
|
||||
// This is a global setting for the entire scene, so let's do it here, right at the start.
|
||||
auto& hh = hictinting[MAXPALOOKUPS - 1];
|
||||
// This sets a tinting color for global palettes, e.g. water or slime - only used for hires replacements (also an option for low-resource hardware where duplicating the textures may be problematic.)
|
||||
GLInterface.SetBasepalTint(PalEntry(hh.sr, hh.sg, hh.sb));
|
||||
|
||||
|
||||
polymost_outputGLDebugMessage(3, "polymost_drawrooms()");
|
||||
|
||||
videoBeginDrawing();
|
||||
|
@ -5703,4 +5691,6 @@ void PrecacheHardwareTextures(int nTile)
|
|||
if (r_glowmapping)
|
||||
polymost_precache(nTile, GLOWPAL, 1);
|
||||
|
||||
polymost_precache(nTile, BRIGHTPAL, 1);
|
||||
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@ void gltexinvalidate(int32_t dapicnum, int32_t dapalnum, int32_t dameth)
|
|||
//Use this for palette effects ... but not ones that change every frame!
|
||||
void gltexinvalidatetype(int32_t type)
|
||||
{
|
||||
#if 0
|
||||
for (bssize_t j = 0; j <= GLTEXCACHEADSIZ - 1; j++)
|
||||
{
|
||||
for (pthtyp* pth = texcache.list[j]; pth; pth = pth->next)
|
||||
|
@ -48,6 +49,7 @@ void gltexinvalidatetype(int32_t type)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
clearskins(type);
|
||||
|
||||
|
@ -147,11 +149,12 @@ void gloadtile_art(int32_t dapic, int32_t dameth, pthtyp* pth, int32_t doalloc)
|
|||
pth->shade = 0;
|
||||
pth->effects = 0;
|
||||
pth->flags = PTH_HASALPHA | PTH_ONEBITALPHA | PTH_INDEXED;
|
||||
pth->hicr = NULL;
|
||||
//pth->hicr = NULL;
|
||||
pth->siz = ssiz;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
int32_t gloadtile_hi(int32_t dapic, int32_t dapalnum, int32_t facen, hicreplctyp* hicr,
|
||||
int32_t dameth, pthtyp* pth, int32_t doalloc, polytintflags_t effect)
|
||||
{
|
||||
|
@ -213,11 +216,12 @@ int32_t gloadtile_hi(int32_t dapic, int32_t dapalnum, int32_t facen, hicreplctyp
|
|||
(hasalpha ? PTH_HASALPHA : 0) |
|
||||
((hicr->flags & HICR_FORCEFILTER) ? PTH_FORCEFILTER : 0);
|
||||
pth->skyface = facen;
|
||||
pth->hicr = hicr;
|
||||
//pth->hicr = hicr;
|
||||
|
||||
if (facen > 0) pth->siz = { 64, 64 }; else pth->siz = { tilesiz[dapic].x, tilesiz[dapic].y };
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define TEXCACHE_FREEBUFS() { Xfree(pic), Xfree(packbuf), Xfree(midbuf); }
|
||||
|
||||
|
@ -231,7 +235,7 @@ static pthtyp *texcache_tryart(int32_t const dapicnum, int32_t const dapalnum, i
|
|||
int32_t searchpalnum = dapalnum;
|
||||
polytintflags_t const tintflags = hictinting[dapalnum].f;
|
||||
|
||||
if (tintflags & (HICTINT_USEONART|HICTINT_ALWAYSUSEART))
|
||||
if (tintflags & (HICTINT_USEONART))
|
||||
{
|
||||
tintpalnum = dapalnum;
|
||||
if (!(tintflags & HICTINT_APPLYOVERPALSWAP))
|
||||
|
@ -263,6 +267,7 @@ static pthtyp *texcache_tryart(int32_t const dapicnum, int32_t const dapalnum, i
|
|||
return pth;
|
||||
}
|
||||
|
||||
#if 0
|
||||
pthtyp *texcache_fetchmulti(pthtyp *pth, hicreplctyp *si, int32_t dapicnum, int32_t dameth)
|
||||
{
|
||||
const int32_t j = dapicnum&(GLTEXCACHEADSIZ-1);
|
||||
|
@ -290,15 +295,16 @@ pthtyp *texcache_fetchmulti(pthtyp *pth, hicreplctyp *si, int32_t dapicnum, int3
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
// <dashade>: ignored if not in Polymost+r_usetileshades
|
||||
pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int32_t dameth)
|
||||
{
|
||||
#if 0
|
||||
const int32_t j = dapicnum & (GLTEXCACHEADSIZ - 1);
|
||||
hicreplctyp *si = usehightile ? hicfindsubst(dapicnum, dapalnum, hictinting[dapalnum].f & HICTINT_ALWAYSUSEART) : NULL;
|
||||
hicreplctyp *si = usehightile ? hicfindsubst(dapicnum, dapalnum) : NULL;
|
||||
|
||||
if (drawingskybox && usehightile)
|
||||
{
|
||||
|
@ -308,11 +314,12 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
|
|||
}
|
||||
|
||||
if (!si)
|
||||
{
|
||||
#endif
|
||||
{
|
||||
return (dapalnum >= (MAXPALOOKUPS - RESERVEDPALS) || hicprecaching) ?
|
||||
NULL : texcache_tryart(dapicnum, dapalnum, dashade, dameth);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* if palette > 0 && replacement found
|
||||
* no effects are applied to the texture
|
||||
* else if palette > 0 && no replacement found
|
||||
|
@ -366,6 +373,8 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
|
|||
Xfree(pth);
|
||||
|
||||
return (drawingskybox || hicprecaching) ? NULL : texcache_tryart(dapicnum, dapalnum, dashade, dameth);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1088,7 +1088,9 @@ int32_t polymost_voxdraw(voxmodel_t *m, tspriteptr_t const tspr)
|
|||
float pc[4];
|
||||
|
||||
pc[0] = pc[1] = pc[2] = ((float)numshades - min(max((globalshade * shadescale) + m->shadeoff, 0.f), (float)numshades)) / (float)numshades;
|
||||
hictinting_apply(pc, globalpal);
|
||||
|
||||
auto& h = hictinting[globalpal];
|
||||
GLInterface.SetTinting(h.f, PalEntry(h.sr, h.sg, h.sb), PalEntry(h.r, h.g, h.b));
|
||||
|
||||
if (!shadowHack)
|
||||
{
|
||||
|
|
|
@ -549,7 +549,7 @@ void tileDelete(int tile)
|
|||
|
||||
void tileRemoveReplacement(int tile)
|
||||
{
|
||||
if ((unsigned)tileNum >= MAXTILES) return false;
|
||||
if ((unsigned)tile >= MAXTILES) return;
|
||||
FTexture *tex = TileFiles.tiles[tile];
|
||||
tex->DeleteReplacements();
|
||||
}
|
||||
|
@ -715,7 +715,7 @@ int tileSetHightileReplacement(int picnum, int palnum, const char *filename, flo
|
|||
replace.specpower = specpower; // currently unused
|
||||
replace.specfactor = specfactor; // currently unused
|
||||
replace.flags = flags;
|
||||
replace.palnum = (uint8_t)palnum;
|
||||
replace.palnum = (uint16_t)palnum;
|
||||
tex->AddReplacement(replace);
|
||||
return 0;
|
||||
}
|
||||
|
@ -732,6 +732,7 @@ int tileSetSkybox(int picnum, int palnum, const char **facenames, int flags )
|
|||
if ((uint32_t)picnum >= (uint32_t)MAXTILES) return -1;
|
||||
if ((uint32_t)palnum >= (uint32_t)MAXPALOOKUPS) return -1;
|
||||
|
||||
auto tex = TileFiles.tiles[picnum];
|
||||
if (tex->GetWidth() <= 0 || tex->GetHeight() <= 0)
|
||||
{
|
||||
initprintf("Warning: defined skybox replacement for empty tile %d.", picnum);
|
||||
|
@ -749,7 +750,7 @@ int tileSetSkybox(int picnum, int palnum, const char **facenames, int flags )
|
|||
}
|
||||
}
|
||||
replace.flags = flags;
|
||||
replace.palnum = (uint8_t)palnum;
|
||||
replace.palnum = (uint16_t)palnum;
|
||||
tex->AddReplacement(replace);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -433,17 +433,12 @@ void FTexture::DeleteReplacement(int palnum)
|
|||
//
|
||||
//===========================================================================
|
||||
|
||||
HightileReplacement *FTexture::FindReplacement(int palnum, int nozero, bool skybox)
|
||||
HightileReplacement *FTexture::FindReplacement(int palnum, bool skybox)
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
for (auto &rep : Hightiles)
|
||||
{
|
||||
if (rep.palnum == palnum && (rep.faces[1] != nullptr) == skybox) return &rep;
|
||||
}
|
||||
if (!palnum || nozero) break;
|
||||
palnum = 0;
|
||||
}
|
||||
for (auto &rep : Hightiles)
|
||||
{
|
||||
if (rep.palnum == palnum && (rep.faces[1] != nullptr) == skybox) return &rep;
|
||||
}
|
||||
return nullptr; // no replacement found
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "palentry.h"
|
||||
|
||||
class FImageSource;
|
||||
class FTexture;
|
||||
|
||||
// picanm[].sf:
|
||||
// |bit(1<<7)
|
||||
|
@ -105,7 +106,7 @@ struct HightileReplacement
|
|||
FTexture *faces[6]; // only one gets used by a texture, the other 5 are for skyboxes only
|
||||
vec2f_t scale;
|
||||
float alphacut, specpower, specfactor;
|
||||
uint8_t palnum, flags;
|
||||
uint16_t palnum, flags;
|
||||
};
|
||||
|
||||
class FBitmap;
|
||||
|
@ -248,7 +249,7 @@ public:
|
|||
Hightiles.Clear();
|
||||
}
|
||||
|
||||
HightileReplacement * FindReplacement(int palnum, int nozero = 0, bool skybox = false);
|
||||
HightileReplacement * FindReplacement(int palnum, bool skybox = false);
|
||||
|
||||
int alphaThreshold = 128;
|
||||
picanm_t PicAnim = {};
|
||||
|
|
|
@ -920,20 +920,11 @@ void G_DisplayRest(int32_t smoothratio)
|
|||
}
|
||||
}
|
||||
#endif // USE_OPENGL
|
||||
|
||||
palaccum_add(&tint, &pp->pals, pp->pals.f);
|
||||
#ifdef SPLITSCREEN_MOD_HACKS
|
||||
if (pp2)
|
||||
palaccum_add(&tint, &pp2->pals, pp2->pals.f);
|
||||
#endif
|
||||
{
|
||||
static const palette_t loogiepal = { 0, 63, 0, 0 };
|
||||
|
||||
palaccum_add(&tint, &loogiepal, pp->loogcnt>>1);
|
||||
#ifdef SPLITSCREEN_MOD_HACKS
|
||||
if (pp2)
|
||||
palaccum_add(&tint, &loogiepal, pp2->loogcnt>>1);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (g_restorePalette)
|
||||
|
@ -944,21 +935,9 @@ void G_DisplayRest(int32_t smoothratio)
|
|||
if (g_restorePalette < 2 || omovethingscnt+1 == g_moveThingsCount)
|
||||
{
|
||||
int32_t pal = pp->palette;
|
||||
#ifdef SPLITSCREEN_MOD_HACKS
|
||||
const int32_t opal = pal;
|
||||
|
||||
if (pp2) // splitscreen HACK: BASEPAL trumps all, then it's arbitrary.
|
||||
pal = min(pal, pp2->palette);
|
||||
#endif
|
||||
|
||||
// g_restorePalette < 0: reset tinting, too (e.g. when loading new game)
|
||||
P_SetGamePalette(pp, pal, 2 + (g_restorePalette>0)*16);
|
||||
|
||||
#ifdef SPLITSCREEN_MOD_HACKS
|
||||
if (pp2) // keep first player's pal as its member!
|
||||
pp->palette = opal;
|
||||
#endif
|
||||
|
||||
g_restorePalette = 0;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#include "glbackend.h"
|
||||
#include "gl_samplers.h"
|
||||
#include "gl_shader.h"
|
||||
#include "textures.h"
|
||||
#include "palette.h"
|
||||
|
||||
#include "baselayer.h"
|
||||
#include "resourcefile.h"
|
||||
|
@ -201,56 +203,71 @@ std::pair<size_t, BaseVertex *> GLInstance::AllocVertices(size_t num)
|
|||
return std::make_pair((size_t)0, Buffer.data());
|
||||
}
|
||||
|
||||
void GLInstance::ApplyTextureProps()
|
||||
extern int r_detailmapping, r_glowmapping, usehightile;
|
||||
|
||||
bool GLInstance::ApplyTextureProps()
|
||||
{
|
||||
|
||||
int pal = palmanager.ActivePalswap();
|
||||
if (currentTexture == nullptr) return false;
|
||||
auto rep = currentTexture->FindReplacement(pal);
|
||||
VSMatrix texmat;
|
||||
// texture scale by parkar request
|
||||
if (pth->hicr && !drawingskybox && ((pth->hicr->scale.x != 1.0f) || (pth->hicr->scale.y != 1.0f)))
|
||||
bool changed = false;
|
||||
|
||||
// texture scale
|
||||
if (rep && ((rep->scale.x != 1.0f) || (rep->scale.y != 1.0f)))
|
||||
{
|
||||
texmat.loadIdentity();
|
||||
texmat.scale(pth->hicr->scale.x, pth->hicr->scale.y, 1.0f);
|
||||
texmat.scale(rep->scale.x, rep->scale.y, 1.0f);
|
||||
GLInterface.SetMatrix(Matrix_Texture, &texmat);
|
||||
}
|
||||
|
||||
// detail texture
|
||||
if (r_detailmapping)
|
||||
{
|
||||
pthtyp *detailpth = NULL;
|
||||
|
||||
if (usehightile && !drawingskybox && hicfindsubst(globalpicnum, DETAILPAL, 1) &&
|
||||
(detailpth = texcache_fetch(globalpicnum, DETAILPAL, 0, method & ~DAMETH_MASKPROPS)) &&
|
||||
detailpth->hicr && detailpth->hicr->palnum == DETAILPAL)
|
||||
auto detailrep = currentTexture->FindReplacement(DETAILPAL);
|
||||
if (detailrep)
|
||||
{
|
||||
GLInterface.UseDetailMapping(true);
|
||||
polymost_setupdetailtexture(3, detailpth->glpic);
|
||||
UseDetailMapping(true);
|
||||
//BindTexture(3, detailrep->faces[0], SamplerRepeat);
|
||||
|
||||
texmat.loadIdentity();
|
||||
bool scaled = false;
|
||||
|
||||
if (pth->hicr && ((pth->hicr->scale.x != 1.0f) || (pth->hicr->scale.y != 1.0f)))
|
||||
texmat.scale(pth->hicr->scale.x, pth->hicr->scale.y, 1.0f);
|
||||
if (rep && ((rep->scale.x != 1.0f) || (rep->scale.y != 1.0f)))
|
||||
{
|
||||
texmat.scale(rep->scale.x, rep->scale.y, 1.0f);
|
||||
scaled = true;
|
||||
}
|
||||
|
||||
if ((detailpth->hicr->scale.x != 1.0f) || (detailpth->hicr->scale.y != 1.0f))
|
||||
texmat.scale(detailpth->hicr->scale.x, detailpth->hicr->scale.y, 1.0f);
|
||||
if ((detailrep->scale.x != 1.0f) || (detailrep->scale.y != 1.0f))
|
||||
{
|
||||
texmat.scale(detailrep->scale.x, detailrep->scale.y, 1.0f);
|
||||
scaled = true;
|
||||
}
|
||||
|
||||
GLInterface.SetMatrix(Matrix_Detail, &texmat);
|
||||
if (scaled) GLInterface.SetMatrix(Matrix_Detail, &texmat);
|
||||
changed |= scaled;
|
||||
}
|
||||
}
|
||||
|
||||
// glow texture
|
||||
if (r_glowmapping)
|
||||
{
|
||||
pthtyp *glowpth = NULL;
|
||||
|
||||
if (usehightile && !drawingskybox && hicfindsubst(globalpicnum, GLOWPAL, 1) &&
|
||||
(glowpth = texcache_fetch(globalpicnum, GLOWPAL, 0, (method & ~DAMETH_MASKPROPS) | DAMETH_MASK)) &&
|
||||
glowpth->hicr && (glowpth->hicr->palnum == GLOWPAL))
|
||||
{
|
||||
GLInterface.UseGlowMapping(true);
|
||||
polymost_setupglowtexture(4, glowpth->glpic);
|
||||
}
|
||||
auto glowrep = currentTexture->FindReplacement(GLOWPAL);
|
||||
if (glowrep)
|
||||
{
|
||||
UseGlowMapping(true);
|
||||
//BindTexture(4, glowrep->faces[0], SamplerRepeat);
|
||||
}
|
||||
}
|
||||
return true; // true if the matrices were changed, false otherwise
|
||||
|
||||
auto brightrep = currentTexture->FindReplacement(BRIGHTPAL);
|
||||
if (brightrep)
|
||||
{
|
||||
//UseGlowMapping(true);
|
||||
//BindTexture(5, glowrep->faces[0], SamplerRepeat);
|
||||
}
|
||||
|
||||
return false; // true if the matrices were changed, false otherwise
|
||||
}
|
||||
|
||||
void GLInstance::RestoreTextureProps()
|
||||
|
|
|
@ -80,6 +80,7 @@ public:
|
|||
|
||||
void BindPalette(int index);
|
||||
void BindPalswap(int index);
|
||||
int ActivePalswap() const { return lastsindex; }
|
||||
};
|
||||
|
||||
|
||||
|
@ -200,6 +201,7 @@ class GLInstance
|
|||
PaletteManager palmanager;
|
||||
int lastPalswapIndex = -1;
|
||||
FHardwareTexture* texv;
|
||||
FTexture* currentTexture = nullptr;
|
||||
|
||||
|
||||
VSMatrix matrices[NUMMATRICES];
|
||||
|
@ -277,7 +279,8 @@ public:
|
|||
void SetSurfaceShader();
|
||||
void SetVPXShader();
|
||||
void SetPalette(int palette);
|
||||
void ApplyTextureProps();
|
||||
bool ApplyTextureProps();
|
||||
void RestoreTextureProps();
|
||||
|
||||
void ReadPixels(int w, int h, uint8_t* buffer);
|
||||
|
||||
|
@ -352,10 +355,15 @@ public:
|
|||
renderState.Brightness = 8.f / (brightness + 8.f);
|
||||
}
|
||||
|
||||
void SetTinting(int flags, PalEntry color)
|
||||
void SetTinting(int flags, PalEntry color, PalEntry modulateColor)
|
||||
{
|
||||
// not yet implemented.
|
||||
}
|
||||
|
||||
void SetBasepalTint(PalEntry color)
|
||||
{
|
||||
// not yet implemented - only relevant for hires replacements.
|
||||
}
|
||||
|
||||
FTexture *GetTexture(const char *filename);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue