More fixes to try and build

This commit is contained in:
Simon 2022-09-19 23:22:36 +01:00
parent bdb808b3f8
commit c1cc1097f5
18 changed files with 361 additions and 127 deletions

View file

@ -26,7 +26,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "../rd-common/tr_public.h"
#include "../rd-common/tr_font.h"
extern refimport_t ri;
//extern refimport_t *ri;
/*
================================================================================

View file

@ -29,6 +29,9 @@
#ifdef HAVE_GLES
#include <GLES/gl.h>
#include <EGL/egl.h>
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
#else
#include <GL/gl.h>
#include <GL/glx.h>

View file

@ -483,7 +483,7 @@ static void RB_BeginDrawingView (void) {
clearBits |= GL_COLOR_BUFFER_BIT;
if (tr.world && tr.world->globalFog != -1)
{
const fog_t *fog = &tr.world->fogs[tr.world->globalFog];
const jk_fog_t *fog = &tr.world->fogs[tr.world->globalFog];
qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f );
}
else
@ -499,7 +499,7 @@ static void RB_BeginDrawingView (void) {
{
if (tr.world && tr.world->globalFog != -1)
{
const fog_t *fog = &tr.world->fogs[tr.world->globalFog];
const jk_fog_t *fog = &tr.world->fogs[tr.world->globalFog];
qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f );
}
else
@ -514,7 +514,7 @@ static void RB_BeginDrawingView (void) {
{
if (tr.world && tr.world->globalFog != -1)
{ //this is because of a bug in multiple scenes I think, it needs to clear for the second scene but it doesn't normally.
const fog_t *fog = &tr.world->fogs[tr.world->globalFog];
const jk_fog_t *fog = &tr.world->fogs[tr.world->globalFog];
qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f );
clearBits |= GL_COLOR_BUFFER_BIT;
@ -550,7 +550,11 @@ static void RB_BeginDrawingView (void) {
// clip to the plane of the portal
if ( backEnd.viewParms.isPortal ) {
float plane[4];
#ifdef HAVE_GLES
float plane2[4];
#else
double plane2[4];
#endif
plane[0] = backEnd.viewParms.portalPlane.normal[0];
plane[1] = backEnd.viewParms.portalPlane.normal[1];
@ -924,7 +928,11 @@ void RB_RenderDrawSurfList( drawSurf_t *drawSurfs, int numDrawSurfs ) {
}
//now copy a portion of the screen to this texture
#ifdef HAVE_GLES
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cX, cY, rad, rad, 0);
#else
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, cX, cY, rad, rad, 0);
#endif
lastPostEnt = pRender->entNum;
}
@ -1333,6 +1341,7 @@ const void *RB_DrawSurfs( const void *data ) {
combiner (pixel shader), I combine the adjacent pixels using a weighting factor. - Aurelio
*/
#ifndef HAVE_GLES
// Render dynamic glowing/flaring objects.
if ( !(backEnd.refdef.rdflags & RDF_NOWORLDMODEL) && g_bDynamicGlowSupported && r_DynamicGlow->integer )
{
@ -1389,6 +1398,7 @@ const void *RB_DrawSurfs( const void *data ) {
// Draw the glow additively over the screen.
RB_DrawGlowOverlay();
}
#endif
return (const void *)(cmd + 1);
}
@ -1405,19 +1415,21 @@ const void *RB_DrawBuffer( const void *data ) {
cmd = (const drawBufferCommand_t *)data;
#ifndef HAVE_GLES
qglDrawBuffer( cmd->buffer );
#endif
// clear screen for debugging
if (!( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) && tr.world && tr.refdef.rdflags & RDF_doLAGoggles)
{
const fog_t *fog = &tr.world->fogs[tr.world->numfogs];
const jk_fog_t *fog = &tr.world->fogs[tr.world->numfogs];
qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f );
qglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else if (!( backEnd.refdef.rdflags & RDF_NOWORLDMODEL ) && tr.world && tr.world->globalFog != -1 && tr.sceneCount)//don't clear during menus, wait for real scene
{
const fog_t *fog = &tr.world->fogs[tr.world->globalFog];
const jk_fog_t *fog = &tr.world->fogs[tr.world->globalFog];
qglClearColor(fog->parms.color[0], fog->parms.color[1], fog->parms.color[2], 1.0f );
qglClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
@ -1477,19 +1489,29 @@ Also called by RE_EndRegistration
void RB_ShowImages( void ) {
image_t *image;
float x, y, w, h;
//int start, end;
// int start, end;
if ( !backEnd.projection2D ) {
RB_SetGL2D();
}
qglClear( GL_COLOR_BUFFER_BIT );
qglFinish();
//start = ri.Milliseconds();
// start = ri->Milliseconds()*ri->Cvar_VariableValue( "timescale" );
#ifdef HAVE_GLES
GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
if (glcol)
qglDisableClientState(GL_COLOR_ARRAY);
if (!text)
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
#endif
int i=0;
// int iNumImages =
R_Images_StartIteration();
R_Images_StartIteration();
while ( (image = R_Images_GetNextIteration()) != NULL)
{
w = glConfig.vidWidth / 20;
@ -1504,23 +1526,48 @@ void RB_ShowImages( void ) {
}
GL_Bind( image );
#ifdef HAVE_GLES
GLfloat tex[] = {
0, 0,
1, 0,
1, 1,
0, 1
};
GLfloat vtx[] = {
x, y,
x + w, y,
x + w, y + h,
x, y + h
};
qglTexCoordPointer( 2, GL_FLOAT, 0, tex );
qglVertexPointer ( 2, GL_FLOAT, 0, vtx );
qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
#else
qglBegin (GL_QUADS);
qglTexCoord2f( 0, 0 );
qglVertex2f( x, y );
qglTexCoord2f( 1, 0 );
qglVertex2f( x + w, y );
qglTexCoord2f( 1, 1 );
qglVertex2f( x + w, y + h );
qglTexCoord2f( 0, 1 );
qglVertex2f( x, y + h );
qglTexCoord2f( 0, 0 );
qglVertex2f( x, y );
qglTexCoord2f( 1, 0 );
qglVertex2f( x + w, y );
qglTexCoord2f( 1, 1 );
qglVertex2f( x + w, y + h );
qglTexCoord2f( 0, 1 );
qglVertex2f( x, y + h );
qglEnd();
#endif
i++;
}
#ifdef HAVE_GLES
if (glcol)
qglEnableClientState(GL_COLOR_ARRAY);
if (!text)
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
#endif
qglFinish();
//end = ri.Milliseconds();
//ri.Printf( PRINT_ALL, "%i msec to draw all images\n", end - start );
// end = ri->Milliseconds()*ri->Cvar_VariableValue( "timescale" );
// ri->Printf( PRINT_ALL, "%i msec to draw all images\n", end - start );
}
@ -1548,12 +1595,13 @@ const void *RB_SwapBuffers( const void *data ) {
// we measure overdraw by reading back the stencil buffer and
// counting up the number of increments that have happened
#ifndef HAVE_GLES
if ( r_measureOverdraw->integer ) {
int i;
long sum = 0;
unsigned char *stencilReadback;
stencilReadback = (unsigned char *) R_Malloc( glConfig.vidWidth * glConfig.vidHeight, TAG_TEMP_WORKSPACE, qfalse );
stencilReadback = (unsigned char *)Hunk_AllocateTempMemory( glConfig.vidWidth * glConfig.vidHeight );
qglReadPixels( 0, 0, glConfig.vidWidth, glConfig.vidHeight, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, stencilReadback );
for ( i = 0; i < glConfig.vidWidth * glConfig.vidHeight; i++ ) {
@ -1561,8 +1609,9 @@ const void *RB_SwapBuffers( const void *data ) {
}
backEnd.pc.c_overDraw += sum;
R_Free( stencilReadback );
Hunk_FreeTempMemory( stencilReadback );
}
#endif
if ( !glState.finishCalled ) {
qglFinish();
@ -1650,6 +1699,7 @@ void RB_ExecuteRenderCommands( const void *data ) {
}
#ifndef HAVE_GLES
// What Pixel Shader type is currently active (regcoms or fragment programs).
GLuint g_uiCurrentPixelShaderType = 0x0;
@ -1671,9 +1721,9 @@ void BeginPixelShader( GLuint uiType, GLuint uiID )
g_uiCurrentPixelShaderType = GL_REGISTER_COMBINERS_NV;
}
return;
return;
// Using Fragment Programs, so call the program.
// Using Fragment Programs, so call the program.
case GL_FRAGMENT_PROGRAM_ARB:
{
// Just in case...
@ -1685,7 +1735,7 @@ void BeginPixelShader( GLuint uiType, GLuint uiID )
g_uiCurrentPixelShaderType = GL_FRAGMENT_PROGRAM_ARB;
}
return;
return;
}
}
@ -1706,6 +1756,7 @@ static inline void RB_BlurGlowTexture()
{
qglDisable (GL_CLIP_PLANE0);
GL_Cull( CT_TWO_SIDED );
qglDisable( GL_DEPTH_TEST );
// Go into orthographic 2d mode.
qglMatrixMode(GL_PROJECTION);
@ -1716,7 +1767,7 @@ static inline void RB_BlurGlowTexture()
qglPushMatrix();
qglLoadIdentity();
GL_State(GLS_DEPTHTEST_DISABLE);
GL_State(0);
/////////////////////////////////////////////////////////
// Setup vertex and pixel programs.
@ -1757,21 +1808,21 @@ static inline void RB_BlurGlowTexture()
GLuint uiTex = tr.screenGlow;
qglActiveTextureARB( GL_TEXTURE3_ARB );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB( GL_TEXTURE2_ARB );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB( GL_TEXTURE1_ARB );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB(GL_TEXTURE0_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
/////////////////////////////////////////////////////////
// Draw the blur passes (each pass blurs it more, increasing the blur radius ).
@ -1791,6 +1842,8 @@ static inline void RB_BlurGlowTexture()
// After first pass put the tex coords to the viewport size.
if ( iNumBlurPasses == 1 )
{
// OK, very weird, but dependent on which texture rectangle extension we're using, the
// texture either needs to be always texure correct or view correct...
if ( !g_bTextureRectangleHack )
{
iTexWidth = backEnd.viewParms.viewportWidth;
@ -1800,43 +1853,43 @@ static inline void RB_BlurGlowTexture()
uiTex = tr.blurImage;
qglActiveTextureARB( GL_TEXTURE3_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB( GL_TEXTURE2_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB( GL_TEXTURE1_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglActiveTextureARB(GL_TEXTURE0_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
// Copy the current image over.
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, uiTex );
qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, uiTex );
qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
}
// Draw the fullscreen quad.
qglBegin( GL_QUADS );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, iTexHeight );
qglVertex2f( 0, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, iTexHeight );
qglVertex2f( 0, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, 0 );
qglVertex2f( 0, backEnd.viewParms.viewportHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, 0 );
qglVertex2f( 0, backEnd.viewParms.viewportHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, 0 );
qglVertex2f( backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, 0 );
qglVertex2f( backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, iTexHeight );
qglVertex2f( backEnd.viewParms.viewportWidth, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, iTexWidth, iTexHeight );
qglVertex2f( backEnd.viewParms.viewportWidth, 0 );
qglEnd();
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage );
qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage );
qglCopyTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, 0, 0, backEnd.viewParms.viewportWidth, backEnd.viewParms.viewportHeight );
// Increase the texel offsets.
// NOTE: This is possibly the most important input to the effect. Even by using an exponential function I've been able to
@ -1849,16 +1902,16 @@ static inline void RB_BlurGlowTexture()
// Disable multi-texturing.
qglActiveTextureARB( GL_TEXTURE3_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglActiveTextureARB( GL_TEXTURE2_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglActiveTextureARB( GL_TEXTURE1_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglActiveTextureARB(GL_TEXTURE0_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglEnable( GL_TEXTURE_2D );
qglDisable( GL_VERTEX_PROGRAM_ARB );
@ -1870,6 +1923,8 @@ static inline void RB_BlurGlowTexture()
qglPopMatrix();
qglDisable( GL_BLEND );
qglEnable( GL_DEPTH_TEST );
glState.currenttmu = 0; //this matches the last one we activated
}
@ -1878,6 +1933,7 @@ static inline void RB_DrawGlowOverlay()
{
qglDisable (GL_CLIP_PLANE0);
GL_Cull( CT_TWO_SIDED );
qglDisable( GL_DEPTH_TEST );
// Go into orthographic 2d mode.
qglMatrixMode(GL_PROJECTION);
@ -1888,29 +1944,29 @@ static inline void RB_DrawGlowOverlay()
qglPushMatrix();
qglLoadIdentity();
GL_State(GLS_DEPTHTEST_DISABLE);
GL_State(0);
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_ARB );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
// For debug purposes.
if ( r_DynamicGlow->integer != 2 )
{
// Render the normal scene texture.
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.sceneImage );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage );
qglBegin(GL_QUADS);
qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
qglTexCoord2f( 0, glConfig.vidHeight );
qglVertex2f( 0, 0 );
qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
qglTexCoord2f( 0, glConfig.vidHeight );
qglVertex2f( 0, 0 );
qglTexCoord2f( 0, 0 );
qglVertex2f( 0, glConfig.vidHeight );
qglTexCoord2f( 0, 0 );
qglVertex2f( 0, glConfig.vidHeight );
qglTexCoord2f( glConfig.vidWidth, 0 );
qglVertex2f( glConfig.vidWidth, glConfig.vidHeight );
qglTexCoord2f( glConfig.vidWidth, 0 );
qglVertex2f( glConfig.vidWidth, glConfig.vidHeight );
qglTexCoord2f( glConfig.vidWidth, glConfig.vidHeight );
qglVertex2f( glConfig.vidWidth, 0 );
qglTexCoord2f( glConfig.vidWidth, glConfig.vidHeight );
qglVertex2f( glConfig.vidWidth, 0 );
qglEnd();
}
@ -1927,29 +1983,84 @@ static inline void RB_DrawGlowOverlay()
qglEnable( GL_BLEND );
// Now additively render the glow texture.
qglBindTexture( GL_TEXTURE_RECTANGLE_ARB, tr.blurImage );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.blurImage );
qglBegin(GL_QUADS);
qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
qglTexCoord2f( 0, r_DynamicGlowHeight->integer );
qglVertex2f( 0, 0 );
qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
qglTexCoord2f( 0, r_DynamicGlowHeight->integer );
qglVertex2f( 0, 0 );
qglTexCoord2f( 0, 0 );
qglVertex2f( 0, glConfig.vidHeight );
qglTexCoord2f( 0, 0 );
qglVertex2f( 0, glConfig.vidHeight );
qglTexCoord2f( r_DynamicGlowWidth->integer, 0 );
qglVertex2f( glConfig.vidWidth, glConfig.vidHeight );
qglTexCoord2f( r_DynamicGlowWidth->integer, 0 );
qglVertex2f( glConfig.vidWidth, glConfig.vidHeight );
qglTexCoord2f( r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer );
qglVertex2f( glConfig.vidWidth, 0 );
qglTexCoord2f( r_DynamicGlowWidth->integer, r_DynamicGlowHeight->integer );
qglVertex2f( glConfig.vidWidth, 0 );
qglEnd();
qglDisable( GL_TEXTURE_RECTANGLE_ARB );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglEnable( GL_TEXTURE_2D );
qglBlendFunc( GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR );
qglDisable( GL_BLEND );
// NOTE: Multi-texture wasn't that much faster (we're obviously not bottlenecked by transform pipeline),
// and besides, soft glow looks better anyways.
/* else
{
int iTexWidth = glConfig.vidWidth, iTexHeight = glConfig.vidHeight;
if ( GL_TEXTURE_RECTANGLE_EXT == GL_TEXTURE_RECTANGLE_NV )
{
iTexWidth = r_DynamicGlowWidth->integer;
iTexHeight = r_DynamicGlowHeight->integer;
}
qglActiveTextureARB( GL_TEXTURE1_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.screenGlow );
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD );
qglActiveTextureARB(GL_TEXTURE0_ARB );
qglDisable( GL_TEXTURE_2D );
qglEnable( GL_TEXTURE_RECTANGLE_EXT );
qglBindTexture( GL_TEXTURE_RECTANGLE_EXT, tr.sceneImage );
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
qglBegin(GL_QUADS);
qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
qglMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0, iTexHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, glConfig.vidHeight );
qglVertex2f( 0, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0, 0 );
qglVertex2f( 0, glConfig.vidHeight );
qglMultiTexCoord2fARB( GL_TEXTURE1_ARB, iTexWidth, 0 );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, glConfig.vidWidth, 0 );
qglVertex2f( glConfig.vidWidth, glConfig.vidHeight );
qglMultiTexCoord2fARB( GL_TEXTURE1_ARB, iTexWidth, iTexHeight );
qglMultiTexCoord2fARB( GL_TEXTURE0_ARB, glConfig.vidWidth, glConfig.vidHeight );
qglVertex2f( glConfig.vidWidth, 0 );
qglEnd();
qglActiveTextureARB( GL_TEXTURE1_ARB );
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglActiveTextureARB(GL_TEXTURE0_ARB );
qglTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
qglDisable( GL_TEXTURE_RECTANGLE_EXT );
qglEnable( GL_TEXTURE_2D );
}*/
qglMatrixMode(GL_PROJECTION);
qglPopMatrix();
qglMatrixMode(GL_MODELVIEW);
qglPopMatrix();
qglEnable( GL_DEPTH_TEST );
}
#endif //HAVE_GLES

View file

@ -981,7 +981,7 @@ R_LoadFogs
*/
static void R_LoadFogs( lump_t *l, lump_t *brushesLump, lump_t *sidesLump, world_t &worldData, int index ) {
int i;
fog_t *out;
jk_fog_t *out;
dfog_t *fogs;
dbrush_t *brushes, *brush;
dbrushside_t *sides;
@ -1001,7 +1001,7 @@ static void R_LoadFogs( lump_t *l, lump_t *brushesLump, lump_t *sidesLump, world
// create fog strucutres for them
worldData.numfogs = count + 1;
worldData.fogs = (fog_t *)R_Hunk_Alloc ( (worldData.numfogs+1)*sizeof(*out), qtrue);
worldData.fogs = (jk_fog_t *)R_Hunk_Alloc ( (worldData.numfogs+1)*sizeof(*out), qtrue);
worldData.globalFog = -1;
out = worldData.fogs + 1;

View file

@ -312,7 +312,7 @@ void RE_LAGoggles( void )
tr.refdef.rdflags |= (RDF_doLAGoggles|RDF_doFullbright);
tr.refdef.doLAGoggles = qtrue;
fog_t *fog = &tr.world->fogs[tr.world->numfogs];
jk_fog_t *fog = &tr.world->fogs[tr.world->numfogs];
fog->parms.color[0] = 0.75f;
fog->parms.color[1] = 0.42f + Q_flrand(0.0f, 1.0f) * 0.025f;

View file

@ -443,6 +443,7 @@ static int PowerOf2(int iArg)
return iArg;
}
#ifndef HAVE_GLES
Dissolve_t Dissolve={0};
#define fDISSOLVE_SECONDS 0.75f
@ -1060,4 +1061,4 @@ qboolean RE_InitDissolve(qboolean bForceCircularExtroWipe)
return bReturn;
}
#endif

View file

@ -786,7 +786,7 @@ R_AComputeFogNum
static int R_GComputeFogNum( trRefEntity_t *ent ) {
int i;
fog_t *fog;
jk_fog_t *fog;
if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) {
return 0;

View file

@ -126,9 +126,9 @@ void GL_TextureMode( const char *string ) {
}
if ( i == numTextureModes ) {
ri->Printf( PRINT_ALL, "bad filter name\n" );
ri.Printf( PRINT_ALL, "bad filter name\n" );
for ( i = 0; i < numTextureModes ; i++ ) {
ri->Printf( PRINT_ALL, "%s\n", modes[i].name );
ri.Printf( PRINT_ALL, "%s\n", modes[i].name );
}
return;
}
@ -138,7 +138,7 @@ void GL_TextureMode( const char *string ) {
// If the level they requested is less than possible, set the max possible...
if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy )
ri->Cvar_SetValue( "r_ext_texture_filter_anisotropic", glConfig.maxTextureFilterAnisotropy );
ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic", glConfig.maxTextureFilterAnisotropy );
// change all the existing mipmap texture objects
R_Images_StartIteration();

View file

@ -33,7 +33,7 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "tr_WorldEffects.h"
glconfig_t glConfig;
glstate_t glState;
jk_glstate_t glState;
window_t window;
static void GfxInfo_f( void );
@ -185,6 +185,7 @@ cvar_t *com_buildScript;
cvar_t *r_environmentMapping;
cvar_t *r_screenshotJpegQuality;
#ifndef HAVE_GLES
#if !defined(__APPLE__)
PFNGLSTENCILOPSEPARATEPROC qglStencilOpSeparate;
#endif
@ -207,6 +208,7 @@ PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC qglGetCombinerOutputParameterfvNV;
PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC qglGetCombinerOutputParameterivNV;
PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC qglGetFinalCombinerInputParameterfvNV;
PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC qglGetFinalCombinerInputParameterivNV;
#endif
PFNGLPROGRAMSTRINGARBPROC qglProgramStringARB;
PFNGLBINDPROGRAMARBPROC qglBindProgramARB;
@ -228,8 +230,10 @@ PFNGLGETPROGRAMIVARBPROC qglGetProgramivARB;
PFNGLGETPROGRAMSTRINGARBPROC qglGetProgramStringARB;
PFNGLISPROGRAMARBPROC qglIsProgramARB;
#ifndef HAVE_GLES
PFNGLLOCKARRAYSEXTPROC qglLockArraysEXT;
PFNGLUNLOCKARRAYSEXTPROC qglUnlockArraysEXT;
#endif
bool g_bTextureRectangleHack = false;
@ -261,7 +265,7 @@ void R_Splash()
const float y2 = 240 + height / 2;
#ifdef HAVE_GLES
GLimp_EndFrame();
//GLimp_EndFrame();
GLfloat tex[] = {
0,0 ,
1,0,
@ -489,6 +493,7 @@ static void GLimp_InitExtensions( void )
glConfig.clampToEdgeAvailable = qtrue;
Com_Printf ("...using GL_EXT_texture_edge_clamp\n" );
#ifndef HAVE_GLES
// GL_ARB_multitexture
qglMultiTexCoord2fARB = NULL;
qglActiveTextureARB = NULL;
@ -553,6 +558,7 @@ static void GLimp_InitExtensions( void )
}
bool bNVRegisterCombiners = false;
// Register Combiners.
if ( ri.GL_ExtensionSupported( "GL_NV_register_combiners" ) )
{
@ -600,7 +606,7 @@ static void GLimp_InitExtensions( void )
bNVRegisterCombiners = false;
Com_Printf ("...GL_NV_register_combiners not found\n" );
}
#endif
// NOTE: Vertex and Fragment Programs are very dependant on each other - this is actually a
// good thing! So, just check to see which we support (one or the other) and load the shared
// function pointers. ARB rocks!
@ -686,6 +692,7 @@ static void GLimp_InitExtensions( void )
// Find out how many general combiners they have.
#define GL_MAX_GENERAL_COMBINERS_NV 0x854D
GLint iNumGeneralCombiners = 0;
bool bNVRegisterCombiners = false;
if(bNVRegisterCombiners)
qglGetIntegerv( GL_MAX_GENERAL_COMBINERS_NV, &iNumGeneralCombiners );
@ -704,11 +711,13 @@ static void GLimp_InitExtensions( void )
}
#if !defined(__APPLE__)
#ifndef HAVE_GLES
qglStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)ri.GL_GetProcAddress("glStencilOpSeparate");
if (qglStencilOpSeparate)
{
glConfig.doStencilShadowsInOneDrawcall = qtrue;
}
#endif
#else
glConfig.doStencilShadowsInOneDrawcall = qtrue;
#endif
@ -1824,6 +1833,7 @@ void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) {
for ( size_t i = 0; i < numCommands; i++ )
ri.Cmd_RemoveCommand( commands[i].cmd );
#ifndef HAVE_GLES
if ( r_DynamicGlow && r_DynamicGlow->integer )
{
// Release the Glow Vertex Shader.
@ -1856,6 +1866,7 @@ void RE_Shutdown( qboolean destroyWindow, qboolean restarting ) {
// Release the blur texture.
qglDeleteTextures( 1, &tr.blurImage );
}
#endif
R_ShutdownWorldEffects();
R_ShutdownFonts();

View file

@ -31,10 +31,15 @@ along with this program; if not, see <http://www.gnu.org/licenses/>.
#include "mdx_format.h"
#include "qgl.h"
#if defined(_XBOX) || defined(HAVE_GLES)
#define GL_INDEX_TYPE GL_UNSIGNED_SHORT
typedef unsigned short glIndex_t;
#else
#define GL_INDEX_TYPE GL_UNSIGNED_INT
typedef unsigned int glIndex_t;
#endif
extern refimport_t ri;
//extern refimport_t ri;
// 13 bits
@ -529,7 +534,7 @@ typedef struct {
// for clipping distance in fog when outside
qboolean hasSurface;
float surface[4];
} fog_t;
} jk_fog_t;
typedef struct {
orientationr_t ori;
@ -769,7 +774,7 @@ typedef struct {
msurface_t **marksurfaces;
int numfogs;
fog_t *fogs;
jk_fog_t *fogs;
int globalFog;
int startLightMapIndex;
@ -902,7 +907,7 @@ typedef struct {
#define FUNCTABLE_MASK (FUNCTABLE_SIZE-1)
// the renderer front end should never modify glstate_t
// the renderer front end should never modify jk_glstate_t
typedef struct {
int currenttextures[2];
int currenttmu;
@ -910,7 +915,7 @@ typedef struct {
int texEnv[2];
int faceCulling;
uint32_t glStateBits;
} glstate_t;
} jk_glstate_t;
typedef struct {
@ -1076,7 +1081,7 @@ void R_Images_DeleteImage(image_t *pImage);
extern backEndState_t backEnd;
extern trGlobals_t tr;
extern glconfig_t glConfig; // outside of TR since it shouldn't be cleared during ref re-init
extern glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init
extern jk_glstate_t glState; // outside of TR since it shouldn't be cleared during ref re-init
extern window_t window;

View file

@ -1049,7 +1049,7 @@ See if a sprite is inside a fog volume
*/
int R_SpriteFogNum( trRefEntity_t *ent ) {
int i;
fog_t *fog;
jk_fog_t *fog;
if ( tr.refdef.rdflags & RDF_NOWORLDMODEL ) {
return 0;
@ -1475,7 +1475,7 @@ void R_SetViewFogIndex (void)
{
if ( tr.world->numfogs > 1 )
{//more than just the LA goggles
fog_t *fog;
jk_fog_t *fog;
int contents = ri.SV_PointContents( tr.refdef.vieworg, 0 );
if ( (contents&CONTENTS_FOG) )
{//only take a tr.refdef.fogIndex if the tr.refdef.vieworg is actually *in* that fog brush (assumption: checks pointcontents for any CONTENTS_FOG, not that particular brush...)

View file

@ -242,7 +242,7 @@ R_ComputeFogNum
*/
static int R_ComputeFogNum( md3Header_t *header, trRefEntity_t *ent ) {
int i;
fog_t *fog;
jk_fog_t *fog;
md3Frame_t *md3Frame;
vec3_t localOrigin;

View file

@ -85,7 +85,7 @@ void CQuickSpriteSystem::Flush(void)
if (mUseFog && r_drawfog->integer == 2 &&
mFogIndex == tr.world->globalFog)
{ //enable hardware fog when we draw this thing if applicable -rww
fog_t *fog = tr.world->fogs + mFogIndex;
jk_fog_t *fog = tr.world->fogs + mFogIndex;
qglFogf(GL_FOG_MODE, GL_EXP2);
qglFogf(GL_FOG_DENSITY, logtestExp2 / fog->parms.depthForOpaque);
@ -163,7 +163,7 @@ void CQuickSpriteSystem::Flush(void)
if (mUseFog && (r_drawfog->integer != 2 || mFogIndex != tr.world->globalFog))
#endif
{
fog_t *fog = tr.world->fogs + mFogIndex;
jk_fog_t *fog = tr.world->fogs + mFogIndex;
//
// render the fog pass

View file

@ -120,7 +120,7 @@ void RE_AddPolyToScene( qhandle_t hShader , int numVerts, const polyVert_t *vert
srfPoly_t *poly;
int i;
int fogIndex = 0;
fog_t *fog;
jk_fog_t *fog;
vec3_t bounds[2];
if ( !tr.registered ) {

View file

@ -51,6 +51,8 @@ This is just for OpenGL conformance testing, it should never be the fastest
================
*/
static void APIENTRY R_ArrayElementDiscrete( GLint index ) {
#ifndef HAVE_GLES
qglColor4ubv( tess.svars.colors[ index ] );
if ( glState.currenttmu ) {
qglMultiTexCoord2fARB( 0, tess.svars.texcoords[ 0 ][ index ][0], tess.svars.texcoords[ 0 ][ index ][1] );
@ -59,6 +61,7 @@ static void APIENTRY R_ArrayElementDiscrete( GLint index ) {
qglTexCoord2fv( tess.svars.texcoords[ 0 ][ index ] );
}
qglVertex3fv( tess.xyz[ index ] );
#endif
}
/*
@ -67,6 +70,7 @@ R_DrawStripElements
===================
*/
#ifndef HAVE_GLES
static int c_vertexes; // for seeing how long our average strips are
static int c_begins;
static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void ( APIENTRY *element )(GLint) ) {
@ -74,13 +78,14 @@ static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void
glIndex_t last[3];
qboolean even;
qglBegin( GL_TRIANGLE_STRIP );
c_begins++;
if ( numIndexes <= 0 ) {
return;
}
qglBegin( GL_TRIANGLE_STRIP );
// prime the strip
element( indexes[0] );
element( indexes[1] );
@ -106,8 +111,8 @@ static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void
assert( (int)indexes[i+2] < tess.numVertexes );
even = qtrue;
}
// otherwise we're done with this strip so finish it and start
// a new one
// otherwise we're done with this strip so finish it and start
// a new one
else
{
qglEnd();
@ -134,8 +139,8 @@ static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void
even = qfalse;
}
// otherwise we're done with this strip so finish it and start
// a new one
// otherwise we're done with this strip so finish it and start
// a new one
else
{
qglEnd();
@ -160,6 +165,8 @@ static void R_DrawStripElements( int numIndexes, const glIndex_t *indexes, void
qglEnd();
}
#endif
/*
==================
@ -187,12 +194,36 @@ static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) {
if ( primitives == 2 ) {
qglDrawElements( GL_TRIANGLES,
numIndexes,
GL_INDEX_TYPE,
indexes );
numIndexes,
GL_INDEX_TYPE,
indexes );
return;
}
#if defined(HAVE_GLES)
if (primitives == 1 || primitives == 3)
{
// if (tess.useConstantColor)
// {
// qglDisableClientState( GL_COLOR_ARRAY );
// qglColor4ubv( tess.constantColor );
// }
/*qglDrawElements( GL_TRIANGLES,
numIndexes,
GL_INDEX_TYPE,
indexes );*/
#if 1 // VVFIXME : Temporary solution to try and increase framerate
//qglIndexedTriToStrip( numIndexes, indexes );
qglDrawElements( GL_TRIANGLES,
numIndexes,
GL_INDEX_TYPE,
indexes );
#endif
return;
}
#else // HAVE_GLES
if ( primitives == 1 ) {
R_DrawStripElements( numIndexes, indexes, qglArrayElement );
return;
@ -202,14 +233,13 @@ static void R_DrawElements( int numIndexes, const glIndex_t *indexes ) {
R_DrawStripElements( numIndexes, indexes, R_ArrayElementDiscrete );
return;
}
#endif // HAVE_GLES
// anything else will cause no drawing
}
/*
=============================================================
@ -1331,7 +1361,7 @@ Blends a fog texture on top of everything else
===================
*/
static void RB_FogPass( void ) {
fog_t *fog;
jk_fog_t *fog;
int i;
qglEnableClientState( GL_COLOR_ARRAY );
@ -1496,7 +1526,7 @@ static void ComputeColors( shaderStage_t *pStage, alphaGen_t forceAlphaGen, colo
break;
case CGEN_FOG:
{
const fog_t *fog = tr.world->fogs + tess.fogNum;
const jk_fog_t *fog = tr.world->fogs + tess.fogNum;
for ( i = 0; i < tess.numVertexes; i++ ) {
byteAlias_t *ba = (byteAlias_t *)&tess.svars.colors[i];
@ -1804,7 +1834,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
#ifndef JK2_MODE
bool UseGLFog = false;
bool FogColorChange = false;
fog_t *fog = NULL;
jk_fog_t *fog = NULL;
if (tess.fogNum && tess.shader->fogPass && (tess.fogNum == tr.world->globalFog || tess.fogNum == tr.world->numfogs)
&& r_drawfog->value == 2)

View file

@ -821,7 +821,7 @@ void RB_CalcFogTexCoords( float *st ) {
float s, t;
float eyeT;
qboolean eyeOutside;
fog_t *fog;
jk_fog_t *fog;
vec3_t localVec;
vec4_t fogDistanceVector, fogDepthVector;

View file

@ -677,7 +677,11 @@ void RB_CaptureScreenImage(void)
cY = 0;
}
#ifdef HAVE_GLES
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cX, cY, radX, radY, 0);
#else
qglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, cX, cY, radX, radY, 0);
#endif
}
@ -750,20 +754,49 @@ void RB_DistortionFill(void)
GL_State(0);
}
#ifdef HAVE_GLES
qglColor4f(1.0f, 1.0f, 1.0f, alpha);
GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
if (!text)
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
if (glcol)
qglDisableClientState( GL_COLOR_ARRAY );
GLfloat tex[] = {
0+spost2, 1-spost,
0+spost2, 0+spost,
1-spost2, 0+spost,
1-spost2, 1-spost
};
GLfloat vtx[] = {
0, 0,
0, glConfig.vidHeight,
glConfig.vidWidth, glConfig.vidHeight,
glConfig.vidWidth, 0
};
qglTexCoordPointer( 2, GL_FLOAT, 0, tex );
qglVertexPointer ( 2, GL_FLOAT, 0, vtx );
qglDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
/* if (glcol)
qglEnableClientState( GL_COLOR_ARRAY );
if (!text)
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );*/
#else
qglBegin(GL_QUADS);
qglColor4f(1.0f, 1.0f, 1.0f, alpha);
qglTexCoord2f(0+spost2, 1-spost);
qglVertex2f(0, 0);
qglColor4f(1.0f, 1.0f, 1.0f, alpha);
qglTexCoord2f(0+spost2, 1-spost);
qglVertex2f(0, 0);
qglTexCoord2f(0+spost2, 0+spost);
qglVertex2f(0, glConfig.vidHeight);
qglTexCoord2f(0+spost2, 0+spost);
qglVertex2f(0, glConfig.vidHeight);
qglTexCoord2f(1-spost2, 0+spost);
qglVertex2f(glConfig.vidWidth, glConfig.vidHeight);
qglTexCoord2f(1-spost2, 0+spost);
qglVertex2f(glConfig.vidWidth, glConfig.vidHeight);
qglTexCoord2f(1-spost2, 1-spost);
qglVertex2f(glConfig.vidWidth, 0);
qglTexCoord2f(1-spost2, 1-spost);
qglVertex2f(glConfig.vidWidth, 0);
qglEnd();
#endif
if (tr_distortionAlpha == 1.0f && tr_distortionStretch == 0.0f)
{ //no overrides

View file

@ -371,22 +371,62 @@ static void DrawSkySide( struct image_s *image, const int mins[2], const int max
int s, t;
GL_Bind( image );
#ifdef HAVE_GLES
GLfloat vtx[3*1024]; // arbitrary sized
GLfloat tex[2*1024];
int idx;
GLboolean text = qglIsEnabled(GL_TEXTURE_COORD_ARRAY);
GLboolean glcol = qglIsEnabled(GL_COLOR_ARRAY);
if (glcol)
qglDisableClientState(GL_COLOR_ARRAY);
if (!text)
qglEnableClientState( GL_TEXTURE_COORD_ARRAY );
#endif
for ( t = mins[1]+HALF_SKY_SUBDIVISIONS; t < maxs[1]+HALF_SKY_SUBDIVISIONS; t++ )
{
#ifdef HAVE_GLES
idx=0;
#else
qglBegin( GL_TRIANGLE_STRIP );
#endif
for ( s = mins[0]+HALF_SKY_SUBDIVISIONS; s <= maxs[0]+HALF_SKY_SUBDIVISIONS; s++ )
{
#ifdef HAVE_GLES
memcpy(tex+idx*2, s_skyTexCoords[t][s], sizeof(GLfloat)*2);
memcpy(vtx+idx*3, s_skyPoints[t][s], sizeof(GLfloat)*3);
idx++;
memcpy(tex+idx*2, s_skyTexCoords[t+1][s], sizeof(GLfloat)*2);
memcpy(vtx+idx*3, s_skyPoints[t+1][s], sizeof(GLfloat)*3);
idx++;
#else
qglTexCoord2fv( s_skyTexCoords[t][s] );
qglVertex3fv( s_skyPoints[t][s] );
qglTexCoord2fv( s_skyTexCoords[t+1][s] );
qglVertex3fv( s_skyPoints[t+1][s] );
#endif
}
#ifdef HAVE_GLES
qglVertexPointer (3, GL_FLOAT, 0, vtx);
qglTexCoordPointer(2, GL_FLOAT, 0, tex);
qglDrawArrays(GL_TRIANGLE_STRIP, 0, idx);
#else
qglEnd();
#endif
}
#ifdef HAVE_GLES
if (glcol)
qglEnableClientState(GL_COLOR_ARRAY);
if (!text)
qglDisableClientState( GL_TEXTURE_COORD_ARRAY );
#endif
}
static void DrawSkyBox( shader_t *shader )