mirror of
https://git.code.sf.net/p/quake/quake2forge
synced 2024-12-12 13:42:21 +00:00
- Added a new cvar, "gl_stencilshadow". Off by default, set
it to 1 to enable stencilbuffer shadows. (Turn gl_shadows on first!) Based on MrG's tutorial on quakesrc.org, but hacked a bit to work for GLX instead of Win32, and is a bit more robust (won't die if it can't get a stencil buffer). - Updated TODO list to reflect this change.
This commit is contained in:
parent
d4e602d215
commit
a29be70dcd
6 changed files with 121 additions and 46 deletions
5
TODO
5
TODO
|
@ -20,6 +20,7 @@ http://gozer.quakeforge.net/list-archives/quakeforge-cvs/2002-April/000151.html
|
||||||
- investigate the possibility of savegames not being tied to a particular build
|
- investigate the possibility of savegames not being tied to a particular build
|
||||||
- fix software assembler when building without --disable-asm on i386
|
- fix software assembler when building without --disable-asm on i386
|
||||||
- split out assembler per arch/os (we currently have gas i386 and win i386)
|
- split out assembler per arch/os (we currently have gas i386 and win i386)
|
||||||
|
- make sure that we give back the mouse and keyboard if the game crashes
|
||||||
|
|
||||||
from http://www.quakesrc.org/?Page=tutorials&Dir=Quake2 :
|
from http://www.quakesrc.org/?Page=tutorials&Dir=Quake2 :
|
||||||
(replace - with X when done)
|
(replace - with X when done)
|
||||||
|
@ -32,7 +33,7 @@ from http://www.quakesrc.org/?Page=tutorials&Dir=Quake2 :
|
||||||
- Transparent console
|
- Transparent console
|
||||||
- How to add .m32 texture support to the Quake2 engine and compile tools.
|
- How to add .m32 texture support to the Quake2 engine and compile tools.
|
||||||
- TGA textures
|
- TGA textures
|
||||||
- Stencil buffered shadows
|
X Stencil buffered shadows
|
||||||
- Adding true color TGA loading for MD2 Models
|
- Adding true color TGA loading for MD2 Models
|
||||||
- Better dynamic light falloff
|
- Better dynamic light falloff
|
||||||
- Controlable water waves
|
- Controlable water waves
|
||||||
|
@ -41,5 +42,3 @@ from http://www.quakesrc.org/?Page=tutorials&Dir=Quake2 :
|
||||||
- Adding a skybox size variable
|
- Adding a skybox size variable
|
||||||
- Adding new video resolutions
|
- Adding new video resolutions
|
||||||
- Drawing alias model bounding boxes
|
- Drawing alias model bounding boxes
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,7 @@ set gl_texturemode "GL_LINEAR_MIPMAP_NEAREST"
|
||||||
set gl_driver "opengl32"
|
set gl_driver "opengl32"
|
||||||
set gl_finish "0"
|
set gl_finish "0"
|
||||||
set gl_shadows "0"
|
set gl_shadows "0"
|
||||||
|
set gl_stencilshadow "0"
|
||||||
set gl_mode "3"
|
set gl_mode "3"
|
||||||
set gl_modulate "1"
|
set gl_modulate "1"
|
||||||
set gl_particle_att_c "0.01"
|
set gl_particle_att_c "0.01"
|
||||||
|
|
54
src/gl_glx.c
54
src/gl_glx.c
|
@ -111,6 +111,8 @@ static XF86VidModeModeInfo **vidmodes;
|
||||||
//static int default_dotclock_vidmode;
|
//static int default_dotclock_vidmode;
|
||||||
static int num_vidmodes;
|
static int num_vidmodes;
|
||||||
static qboolean vidmode_active = false;
|
static qboolean vidmode_active = false;
|
||||||
|
|
||||||
|
/* hardware gamma */
|
||||||
static XF86VidModeGamma oldgamma;
|
static XF86VidModeGamma oldgamma;
|
||||||
|
|
||||||
static qboolean mlooking;
|
static qboolean mlooking;
|
||||||
|
@ -119,6 +121,9 @@ static qboolean mouse_active = false;
|
||||||
static qboolean dgamouse = false;
|
static qboolean dgamouse = false;
|
||||||
static qboolean vidmode_ext = false;
|
static qboolean vidmode_ext = false;
|
||||||
|
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
qboolean have_stencil = false;
|
||||||
|
|
||||||
// state struct passed in Init
|
// state struct passed in Init
|
||||||
static in_state_t *in_state;
|
static in_state_t *in_state;
|
||||||
|
|
||||||
|
@ -684,10 +689,20 @@ int GLimp_SetMode( unsigned int *pwidth, unsigned int *pheight, int mode, qboole
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
int attrib[] = {
|
int attrib[] = {
|
||||||
GLX_RGBA,
|
GLX_RGBA,
|
||||||
|
GLX_DOUBLEBUFFER,
|
||||||
GLX_RED_SIZE, 1,
|
GLX_RED_SIZE, 1,
|
||||||
GLX_GREEN_SIZE, 1,
|
GLX_GREEN_SIZE, 1,
|
||||||
GLX_BLUE_SIZE, 1,
|
GLX_BLUE_SIZE, 1,
|
||||||
|
GLX_DEPTH_SIZE, 1,
|
||||||
|
GLX_STENCIL_SIZE, 1,
|
||||||
|
None
|
||||||
|
};
|
||||||
|
int attrib_nostencil[] = {
|
||||||
|
GLX_RGBA,
|
||||||
GLX_DOUBLEBUFFER,
|
GLX_DOUBLEBUFFER,
|
||||||
|
GLX_RED_SIZE, 1,
|
||||||
|
GLX_GREEN_SIZE, 1,
|
||||||
|
GLX_BLUE_SIZE, 1,
|
||||||
GLX_DEPTH_SIZE, 1,
|
GLX_DEPTH_SIZE, 1,
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
@ -749,12 +764,47 @@ int GLimp_SetMode( unsigned int *pwidth, unsigned int *pheight, int mode, qboole
|
||||||
|
|
||||||
visinfo = qglXChooseVisual(dpy, scrnum, attrib);
|
visinfo = qglXChooseVisual(dpy, scrnum, attrib);
|
||||||
if (!visinfo) {
|
if (!visinfo) {
|
||||||
fprintf(stderr, "Error couldn't get an RGB, Double-buffered, Depth visual\n");
|
fprintf(stderr, "W: couldn't get an RGBA, DOUBLEBUFFER, DEPTH, STENCIL visual\n");
|
||||||
return rserr_invalid_mode;
|
visinfo = qglXChooseVisual(dpy, scrnum, attrib_nostencil);
|
||||||
|
if (!visinfo) {
|
||||||
|
fprintf(stderr, "E: couldn't get an RGBA, DOUBLEBUFFER, DEPTH visual\n");
|
||||||
|
return rserr_invalid_mode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gl_state.hwgamma = false;
|
gl_state.hwgamma = false;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* do some pantsness */
|
||||||
|
{
|
||||||
|
int red_bits, blue_bits, green_bits, depth_bits, alpha_bits;
|
||||||
|
|
||||||
|
glXGetConfig(dpy, visinfo, GLX_RED_SIZE, &red_bits);
|
||||||
|
glXGetConfig(dpy, visinfo, GLX_BLUE_SIZE, &blue_bits);
|
||||||
|
glXGetConfig(dpy, visinfo, GLX_GREEN_SIZE, &green_bits);
|
||||||
|
glXGetConfig(dpy, visinfo, GLX_DEPTH_SIZE, &depth_bits);
|
||||||
|
glXGetConfig(dpy, visinfo, GLX_ALPHA_SIZE, &alpha_bits);
|
||||||
|
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of red\n", red_bits);
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of blue\n", blue_bits);
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of green\n", green_bits);
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of depth\n", depth_bits);
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of alpha\n", alpha_bits);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
{
|
||||||
|
int stencil_bits;
|
||||||
|
|
||||||
|
if (!glXGetConfig(dpy, visinfo, GLX_STENCIL_SIZE, &stencil_bits)) {
|
||||||
|
ri.Con_Printf(PRINT_ALL, "I: got %d bits of stencil\n", stencil_bits);
|
||||||
|
if (stencil_bits >= 1) {
|
||||||
|
have_stencil = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (vidmode_ext) {
|
if (vidmode_ext) {
|
||||||
int best_fit, best_dist, dist, x, y;
|
int best_fit, best_dist, dist, x, y;
|
||||||
|
|
||||||
|
|
|
@ -214,6 +214,7 @@ extern cvar_t *gl_mode;
|
||||||
extern cvar_t *gl_log;
|
extern cvar_t *gl_log;
|
||||||
extern cvar_t *gl_lightmap;
|
extern cvar_t *gl_lightmap;
|
||||||
extern cvar_t *gl_shadows;
|
extern cvar_t *gl_shadows;
|
||||||
|
extern cvar_t * gl_stencilshadow;
|
||||||
extern cvar_t *gl_dynamic;
|
extern cvar_t *gl_dynamic;
|
||||||
extern cvar_t *gl_monolightmap;
|
extern cvar_t *gl_monolightmap;
|
||||||
extern cvar_t *gl_nobind;
|
extern cvar_t *gl_nobind;
|
||||||
|
|
|
@ -1,23 +1,25 @@
|
||||||
/*
|
/* $Id$
|
||||||
Copyright (C) 1997-2001 Id Software, Inc.
|
*
|
||||||
|
* triangle model functions
|
||||||
This program is free software; you can redistribute it and/or
|
*
|
||||||
modify it under the terms of the GNU General Public License
|
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
as published by the Free Software Foundation; either version 2
|
* Copyright (c) 2002 The Quakeforge Project.
|
||||||
of the License, or (at your option) any later version.
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
This program is distributed in the hope that it will be useful,
|
* modify it under the terms of the GNU General Public License
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* as published by the Free Software Foundation; either version 2
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
See the GNU General Public License for more details.
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
You should have received a copy of the GNU General Public License
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
along with this program; if not, write to the Free Software
|
*
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
*/
|
* You should have received a copy of the GNU General Public License
|
||||||
// gl_mesh.c: triangle model functions
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "gl_local.h"
|
#include "gl_local.h"
|
||||||
|
|
||||||
|
@ -302,6 +304,8 @@ GL_DrawAliasShadow
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
extern vec3_t lightspot;
|
extern vec3_t lightspot;
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
extern qboolean have_stencil;
|
||||||
|
|
||||||
void GL_DrawAliasShadow (dmdl_t *paliashdr, int posenum)
|
void GL_DrawAliasShadow (dmdl_t *paliashdr, int posenum)
|
||||||
{
|
{
|
||||||
|
@ -324,6 +328,13 @@ void GL_DrawAliasShadow (dmdl_t *paliashdr, int posenum)
|
||||||
|
|
||||||
height = -lheight + 1.0;
|
height = -lheight + 1.0;
|
||||||
|
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
if (have_stencil && gl_stencilshadow->value) {
|
||||||
|
qglEnable(GL_STENCIL_TEST);
|
||||||
|
qglStencilFunc(GL_EQUAL, 1, 2);
|
||||||
|
qglStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
|
||||||
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
// get the vertex count and primitive type
|
// get the vertex count and primitive type
|
||||||
|
@ -362,7 +373,11 @@ void GL_DrawAliasShadow (dmdl_t *paliashdr, int posenum)
|
||||||
} while (--count);
|
} while (--count);
|
||||||
|
|
||||||
qglEnd ();
|
qglEnd ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
if (have_stencil && gl_stencilshadow->value)
|
||||||
|
qglDisable(GL_STENCIL_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
/*
|
/* $Id$
|
||||||
Copyright (C) 1997-2001 Id Software, Inc.
|
*
|
||||||
|
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||||
This program is free software; you can redistribute it and/or
|
* Copyright (c) 2002 The Quakeforge Project.
|
||||||
modify it under the terms of the GNU General Public License
|
*
|
||||||
as published by the Free Software Foundation; either version 2
|
* This program is free software; you can redistribute it and/or
|
||||||
of the License, or (at your option) any later version.
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
This program is distributed in the hope that it will be useful,
|
* of the License, or (at your option) any later version.
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
*
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
See the GNU General Public License for more details.
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
You should have received a copy of the GNU General Public License
|
* See the GNU General Public License for more details.
|
||||||
along with this program; if not, write to the Free Software
|
*
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
*/
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
// r_main.c
|
*/
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ cvar_t *gl_drawbuffer;
|
||||||
cvar_t *gl_driver;
|
cvar_t *gl_driver;
|
||||||
cvar_t *gl_lightmap;
|
cvar_t *gl_lightmap;
|
||||||
cvar_t *gl_shadows;
|
cvar_t *gl_shadows;
|
||||||
|
cvar_t * gl_stencilshadow;
|
||||||
cvar_t *gl_mode;
|
cvar_t *gl_mode;
|
||||||
cvar_t *gl_dynamic;
|
cvar_t *gl_dynamic;
|
||||||
cvar_t *gl_monolightmap;
|
cvar_t *gl_monolightmap;
|
||||||
|
@ -770,6 +771,8 @@ void R_SetupGL (void)
|
||||||
R_Clear
|
R_Clear
|
||||||
=============
|
=============
|
||||||
*/
|
*/
|
||||||
|
extern qboolean have_stencil;
|
||||||
|
|
||||||
void R_Clear (void)
|
void R_Clear (void)
|
||||||
{
|
{
|
||||||
if (gl_ztrick->value)
|
if (gl_ztrick->value)
|
||||||
|
@ -806,6 +809,11 @@ void R_Clear (void)
|
||||||
|
|
||||||
qglDepthRange (gldepthmin, gldepthmax);
|
qglDepthRange (gldepthmin, gldepthmax);
|
||||||
|
|
||||||
|
/* stencilbuffer shadows */
|
||||||
|
if (gl_shadows->value && have_stencil && gl_stencilshadow->value) {
|
||||||
|
qglClearStencil(1);
|
||||||
|
qglClear(GL_STENCIL_BUFFER_BIT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void R_Flash( void )
|
void R_Flash( void )
|
||||||
|
@ -1010,6 +1018,7 @@ void R_Register( void )
|
||||||
gl_mode = ri.Cvar_Get( "gl_mode", "3", CVAR_ARCHIVE );
|
gl_mode = ri.Cvar_Get( "gl_mode", "3", CVAR_ARCHIVE );
|
||||||
gl_lightmap = ri.Cvar_Get ("gl_lightmap", "0", 0);
|
gl_lightmap = ri.Cvar_Get ("gl_lightmap", "0", 0);
|
||||||
gl_shadows = ri.Cvar_Get ("gl_shadows", "0", CVAR_ARCHIVE );
|
gl_shadows = ri.Cvar_Get ("gl_shadows", "0", CVAR_ARCHIVE );
|
||||||
|
gl_stencilshadow = ri.Cvar_Get("gl_stencilshadow", "0", CVAR_ARCHIVE);
|
||||||
gl_dynamic = ri.Cvar_Get ("gl_dynamic", "1", 0);
|
gl_dynamic = ri.Cvar_Get ("gl_dynamic", "1", 0);
|
||||||
gl_nobind = ri.Cvar_Get ("gl_nobind", "0", 0);
|
gl_nobind = ri.Cvar_Get ("gl_nobind", "0", 0);
|
||||||
gl_round_down = ri.Cvar_Get ("gl_round_down", "1", 0);
|
gl_round_down = ri.Cvar_Get ("gl_round_down", "1", 0);
|
||||||
|
|
Loading…
Reference in a new issue