mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-15 17:01:28 +00:00
glsurface.h/.cpp: change how the palette is handled and fix tinting/fading
git-svn-id: https://svn.eduke32.com/eduke32@6932 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
a0faeaf8f6
commit
9e90b0633b
4 changed files with 24 additions and 32 deletions
|
@ -9,7 +9,6 @@
|
||||||
#define GLSURFACE_H_
|
#define GLSURFACE_H_
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "palette.h"
|
|
||||||
|
|
||||||
// Initialize the glsurface with the Software renderer's buffer resolution.
|
// Initialize the glsurface with the Software renderer's buffer resolution.
|
||||||
// If the Software renderer's resolution and the actual resolution don't match,
|
// If the Software renderer's resolution and the actual resolution don't match,
|
||||||
|
@ -21,9 +20,9 @@ bool glsurface_initialize(vec2_t inputBufferResolution);
|
||||||
// Destroy an existing surface.
|
// Destroy an existing surface.
|
||||||
void glsurface_destroy();
|
void glsurface_destroy();
|
||||||
|
|
||||||
// Sets the palette at paletteID to contain the byte buffer pointed to by pPalette.
|
// Sets the palette to contain the RGBA byte buffer pointed to by pPalette.
|
||||||
// If the surface is not initialized, the function returns immediately.
|
// If the surface is not initialized, the function returns immediately.
|
||||||
void glsurface_setPalette(int32_t paletteID, void* pPalette);
|
void glsurface_setPalette(void* pPalette);
|
||||||
|
|
||||||
// Returns a pointer to the start of the surface's pixel buffer
|
// Returns a pointer to the start of the surface's pixel buffer
|
||||||
// Returns NULL if the surface is not initialized.
|
// Returns NULL if the surface is not initialized.
|
||||||
|
@ -32,10 +31,9 @@ void* glsurface_getBuffer();
|
||||||
// Returns the resolution of the surface's buffer
|
// Returns the resolution of the surface's buffer
|
||||||
vec2_t glsurface_getBufferResolution();
|
vec2_t glsurface_getBufferResolution();
|
||||||
|
|
||||||
// Blit the surface's pixel buffer to the screen.
|
// Blit the surface's pixel buffer to the screen using the palette set with glsurface_setPalette().
|
||||||
// paletteID is the id of a palette previously set with glsurface_setPalette().
|
|
||||||
// Renders as soon as the data has been uploaded.
|
// Renders as soon as the data has been uploaded.
|
||||||
// If the surface is not initialized, the function returns immediately.
|
// If the surface is not initialized, the function returns immediately.
|
||||||
void glsurface_blitBuffer(int32_t paletteID);
|
void glsurface_blitBuffer();
|
||||||
|
|
||||||
#endif /* GLSURFACE_H_ */
|
#endif /* GLSURFACE_H_ */
|
||||||
|
|
|
@ -15,7 +15,7 @@ static void* buffer;
|
||||||
static GLuint bufferTexID;
|
static GLuint bufferTexID;
|
||||||
static vec2_t bufferRes;
|
static vec2_t bufferRes;
|
||||||
|
|
||||||
static GLuint paletteTexIDs[MAXBASEPALS];
|
static GLuint paletteTexID;
|
||||||
|
|
||||||
static GLuint quadVertsID = 0;
|
static GLuint quadVertsID = 0;
|
||||||
|
|
||||||
|
@ -97,6 +97,8 @@ bool glsurface_initialize(vec2_t inputBufferResolution)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, bufferRes.x, bufferRes.y, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, bufferRes.x, bufferRes.y, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
|
||||||
|
|
||||||
|
glsurface_setPalette(curpalettefaded);
|
||||||
|
|
||||||
const char* const VERTEX_SHADER_CODE =
|
const char* const VERTEX_SHADER_CODE =
|
||||||
"#version 110\n\
|
"#version 110\n\
|
||||||
\n\
|
\n\
|
||||||
|
@ -127,7 +129,7 @@ bool glsurface_initialize(vec2_t inputBufferResolution)
|
||||||
{\n\
|
{\n\
|
||||||
vec4 color = texture2D(s_texture, v_texCoord.xy);\n\
|
vec4 color = texture2D(s_texture, v_texCoord.xy);\n\
|
||||||
color.r = c_paletteOffset + c_paletteScale*color.r;\n\
|
color.r = c_paletteOffset + c_paletteScale*color.r;\n\
|
||||||
color = texture2D(s_palette, color.rg);\n\
|
color.rgb = texture2D(s_palette, color.rg).rgb;\n\
|
||||||
\n\
|
\n\
|
||||||
// DEBUG \n\
|
// DEBUG \n\
|
||||||
//color = texture2D(s_palette, v_texCoord.xy);\n\
|
//color = texture2D(s_palette, v_texCoord.xy);\n\
|
||||||
|
@ -156,11 +158,6 @@ bool glsurface_initialize(vec2_t inputBufferResolution)
|
||||||
glUniform1i(texSamplerLoc, 0);
|
glUniform1i(texSamplerLoc, 0);
|
||||||
glUniform1i(paletteSamplerLoc, 1);
|
glUniform1i(paletteSamplerLoc, 1);
|
||||||
|
|
||||||
for (int basepalnum = 0; basepalnum < MAXBASEPALS; ++basepalnum)
|
|
||||||
{
|
|
||||||
glsurface_setPalette(basepalnum, basepaltable[basepalnum]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,14 +173,14 @@ void glsurface_destroy()
|
||||||
|
|
||||||
glDeleteTextures(1, &bufferTexID);
|
glDeleteTextures(1, &bufferTexID);
|
||||||
bufferTexID = 0;
|
bufferTexID = 0;
|
||||||
glDeleteTextures(MAXBASEPALS, paletteTexIDs);
|
glDeleteTextures(1, &paletteTexID);
|
||||||
memset(paletteTexIDs, 0, sizeof(paletteTexIDs));
|
paletteTexID = 0;
|
||||||
|
|
||||||
glDeleteProgram(shaderProgramID);
|
glDeleteProgram(shaderProgramID);
|
||||||
shaderProgramID = 0;
|
shaderProgramID = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void glsurface_setPalette(int32_t paletteID, void* pPalette)
|
void glsurface_setPalette(void* pPalette)
|
||||||
{
|
{
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return;
|
return;
|
||||||
|
@ -191,15 +188,15 @@ void glsurface_setPalette(int32_t paletteID, void* pPalette)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
if (paletteTexIDs[paletteID])
|
if (paletteTexID)
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexIDs[paletteID]);
|
// assume the texture is already bound to GL_TEXTURE1
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGB, GL_UNSIGNED_BYTE, (void*) buffer);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*) pPalette);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glGenTextures(1, paletteTexIDs+paletteID);
|
glGenTextures(1, &paletteTexID);
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexIDs[paletteID]);
|
glBindTexture(GL_TEXTURE_2D, paletteTexID);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
@ -207,7 +204,7 @@ void glsurface_setPalette(int32_t paletteID, void* pPalette)
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 256, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, pPalette);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pPalette);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,14 +218,11 @@ vec2_t glsurface_getBufferResolution()
|
||||||
return bufferRes;
|
return bufferRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void glsurface_blitBuffer(int32_t paletteID)
|
void glsurface_blitBuffer()
|
||||||
{
|
{
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE1);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, paletteTexIDs[paletteID]);
|
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bufferRes.x, bufferRes.y, GL_RED, GL_UNSIGNED_BYTE, (void*) buffer);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bufferRes.x, bufferRes.y, GL_RED, GL_UNSIGNED_BYTE, (void*) buffer);
|
||||||
|
|
||||||
|
|
|
@ -660,11 +660,7 @@ void paletteSetColorTable(int32_t id, uint8_t const * const table)
|
||||||
Bmemcpy(basepaltable[id], table, 768);
|
Bmemcpy(basepaltable[id], table, 768);
|
||||||
|
|
||||||
#ifdef USE_OPENGL
|
#ifdef USE_OPENGL
|
||||||
if (videoGetRenderMode() == REND_CLASSIC)
|
if (videoGetRenderMode() >= REND_POLYMOST)
|
||||||
{
|
|
||||||
glsurface_setPalette(id, basepaltable[id]);
|
|
||||||
}
|
|
||||||
else if (videoGetRenderMode() >= REND_POLYMOST)
|
|
||||||
{
|
{
|
||||||
uploadbasepalette(id);
|
uploadbasepalette(id);
|
||||||
}
|
}
|
||||||
|
@ -746,6 +742,7 @@ void videoSetPalette(char dabrightness, uint8_t dapalid, uint8_t flags)
|
||||||
|
|
||||||
if (palsumdidchange || newpalettesum != g_lastpalettesum)
|
if (palsumdidchange || newpalettesum != g_lastpalettesum)
|
||||||
{
|
{
|
||||||
|
glsurface_setPalette(curpalettefaded);
|
||||||
// if ((flags&1) == 0)
|
// if ((flags&1) == 0)
|
||||||
videoUpdatePalette(0, 256);
|
videoUpdatePalette(0, 256);
|
||||||
}
|
}
|
||||||
|
@ -828,7 +825,10 @@ void videoFadePalette(uint8_t r, uint8_t g, uint8_t b, uint8_t offset)
|
||||||
uint32_t newpalettesum = XXH32((uint8_t *) curpalettefaded, sizeof(curpalettefaded), sizeof(curpalettefaded));
|
uint32_t newpalettesum = XXH32((uint8_t *) curpalettefaded, sizeof(curpalettefaded), sizeof(curpalettefaded));
|
||||||
|
|
||||||
if (newpalettesum != lastpalettesum || newpalettesum != g_lastpalettesum)
|
if (newpalettesum != lastpalettesum || newpalettesum != g_lastpalettesum)
|
||||||
|
{
|
||||||
|
glsurface_setPalette(curpalettefaded);
|
||||||
videoUpdatePalette(0, 256);
|
videoUpdatePalette(0, 256);
|
||||||
|
}
|
||||||
|
|
||||||
g_lastpalettesum = lastpalettesum = newpalettesum;
|
g_lastpalettesum = lastpalettesum = newpalettesum;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1820,7 +1820,7 @@ void videoShowFrame(int32_t w)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glsurface_blitBuffer(curbasepal);
|
glsurface_blitBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t lastSwapTime = 0;
|
static uint32_t lastSwapTime = 0;
|
||||||
|
|
Loading…
Reference in a new issue