Detail mapping : r_detailmapping.

git-svn-id: https://svn.eduke32.com/eduke32@459 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
Plagman 2007-01-15 09:08:57 +00:00
parent 530edf77b8
commit 59ef78ff35
10 changed files with 164 additions and 10 deletions

View File

@ -46,6 +46,8 @@ struct glinfo {
char shadow; char shadow;
char fbos; char fbos;
char rect; char rect;
char multitex;
char envcombine;
}; };
extern struct glinfo glinfo; extern struct glinfo glinfo;
#endif #endif

View File

@ -36,6 +36,9 @@ extern "C" {
#define MAXSPRITESONSCREEN 4096 #define MAXSPRITESONSCREEN 4096
#define MAXUNIQHUDID 256 //Extra slots so HUD models can store animation state without messing game sprites #define MAXUNIQHUDID 256 //Extra slots so HUD models can store animation state without messing game sprites
#define RESERVEDPALS 1
#define DETAILPAL MAXPALOOKUPS - 1
#define CLIPMASK0 (((1L)<<16)+1L) #define CLIPMASK0 (((1L)<<16)+1L)
#define CLIPMASK1 (((256L)<<16)+64L) #define CLIPMASK1 (((256L)<<16)+64L)
@ -492,6 +495,7 @@ extern long glwidescreen, glprojectionhacks;
void gltexapplyprops (void); void gltexapplyprops (void);
extern long r_depthpeeling, r_peelscount; extern long r_depthpeeling, r_peelscount;
extern long r_detailmapping;
#endif #endif
void hicinit(void); void hicinit(void);

View File

@ -146,6 +146,8 @@ extern void (APIENTRY * bglDeleteProgramsARB)(GLsizei n, const GLuint *programs)
// Multitexturing // Multitexturing
extern void (APIENTRY * bglActiveTextureARB)(GLenum texture); extern void (APIENTRY * bglActiveTextureARB)(GLenum texture);
extern void (APIENTRY * bglMultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t );
extern void (APIENTRY * bglMultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t );
// Frame Buffer Objects // Frame Buffer Objects
extern void (APIENTRY * bglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers); extern void (APIENTRY * bglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);

View File

@ -26,6 +26,8 @@ struct glinfo glinfo = {
0, // shadow comparison 0, // shadow comparison
0, // Frame Buffer Objects 0, // Frame Buffer Objects
0, // rectangle textures 0, // rectangle textures
0, // multitexturing
0, // env_combine
}; };
#endif #endif

View File

@ -42,6 +42,7 @@ enum {
T_FPS, T_FPS,
T_FLAGS, T_FLAGS,
T_PAL, T_PAL,
T_DETAIL,
T_HUD, T_HUD,
T_XADD, T_XADD,
T_YADD, T_YADD,
@ -185,10 +186,11 @@ static tokenlist tinttokens[] = {
static tokenlist texturetokens[] = { static tokenlist texturetokens[] = {
{ "pal", T_PAL }, { "pal", T_PAL },
{ "detail", T_DETAIL },
}; };
static tokenlist texturetokens_pal[] = { static tokenlist texturetokens_pal[] = {
{ "file", T_FILE },{ "name", T_FILE }, { "file", T_FILE },{ "name", T_FILE },
{ "alphacut", T_ALPHACUT }, { "alphacut", T_ALPHACUT }, { "detailscale", T_ALPHACUT }, { "scale", T_ALPHACUT },
{ "nocompress",T_NOCOMPRESS }, { "nocompress",T_NOCOMPRESS },
}; };
@ -1106,7 +1108,7 @@ static int defsparser(scriptfile *script)
} }
if ((unsigned)tile > (unsigned)MAXTILES) break; // message is printed later if ((unsigned)tile > (unsigned)MAXTILES) break; // message is printed later
if ((unsigned)pal > (unsigned)MAXPALOOKUPS) { if ((unsigned)pal > ((unsigned)MAXPALOOKUPS - RESERVEDPALS)) {
initprintf("Error: missing or invalid 'palette number' for texture definition near " initprintf("Error: missing or invalid 'palette number' for texture definition near "
"line %s:%d\n", script->filename, scriptfile_getlinum(script,paltokptr)); "line %s:%d\n", script->filename, scriptfile_getlinum(script,paltokptr));
break; break;
@ -1123,6 +1125,40 @@ static int defsparser(scriptfile *script)
hicsetsubsttex(tile,pal,fn,alphacut,flags); hicsetsubsttex(tile,pal,fn,alphacut,flags);
} break; } break;
case T_DETAIL: {
char *detailtokptr = script->ltextptr, *detailend;
int i;
char *fn = NULL;
double detailscale = 1.0;
char flags = 0;
if (scriptfile_getbraces(script,&detailend)) break;
while (script->textptr < detailend) {
switch (getatoken(script,texturetokens_pal,sizeof(texturetokens_pal)/sizeof(tokenlist))) {
case T_FILE:
scriptfile_getstring(script,&fn); break;
case T_ALPHACUT:
scriptfile_getdouble(script,&detailscale); break;
case T_NOCOMPRESS:
flags |= 1; break;
default:
break;
}
}
if ((unsigned)tile > (unsigned)MAXTILES) break; // message is printed later
if (!fn) {
initprintf("Error: missing 'file name' for texture definition near line %s:%d\n",
script->filename, scriptfile_getlinum(script,detailtokptr));
break;
}
if ((i = kopen4load(fn,0)) < 0) {
initprintf("Error: file '%s' does not exist\n",fn);
break;
} else kclose(i);
hicsetsubsttex(tile,DETAILPAL,fn,detailscale,flags);
} break;
default: default:
break; break;
} }

View File

@ -123,6 +123,8 @@ void (APIENTRY * bglDeleteProgramsARB)(GLsizei n, const GLuint *programs);
// Multitexturing // Multitexturing
void (APIENTRY * bglActiveTextureARB)(GLenum texture); void (APIENTRY * bglActiveTextureARB)(GLenum texture);
void (APIENTRY * bglMultiTexCoord2dARB)(GLenum target, GLdouble s, GLdouble t );
void (APIENTRY * bglMultiTexCoord2fARB)(GLenum target, GLfloat s, GLfloat t );
// Frame Buffer Objects // Frame Buffer Objects
void (APIENTRY * bglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers); void (APIENTRY * bglGenFramebuffersEXT)(GLsizei n, GLuint *framebuffers);
@ -336,6 +338,8 @@ int loadglextensions(void)
// Multitexturing // Multitexturing
bglActiveTextureARB = GETPROCEXTSOFT("glActiveTextureARB"); bglActiveTextureARB = GETPROCEXTSOFT("glActiveTextureARB");
bglMultiTexCoord2dARB = GETPROCEXTSOFT("glMultiTexCoord2dARB");
bglMultiTexCoord2fARB = GETPROCEXTSOFT("glMultiTexCoord2fARB");
// Frame Buffer Objects // Frame Buffer Objects
bglGenFramebuffersEXT = GETPROCEXTSOFT("glGenFramebuffersEXT"); bglGenFramebuffersEXT = GETPROCEXTSOFT("glGenFramebuffersEXT");
@ -466,6 +470,8 @@ int unloadgldriver(void)
// Multitexturing // Multitexturing
bglActiveTextureARB = NULL; bglActiveTextureARB = NULL;
bglMultiTexCoord2dARB = NULL;
bglMultiTexCoord2fARB = NULL;
// Frame Buffer Objects // Frame Buffer Objects
bglGenFramebuffersEXT = NULL; bglGenFramebuffersEXT = NULL;

View File

@ -149,6 +149,9 @@ GLuint *peels; // peels identifiers
GLuint *peelfbos; // peels FBOs identifiers GLuint *peelfbos; // peels FBOs identifiers
GLuint peelprogram[2]; // ARBfp peeling fragment program GLuint peelprogram[2]; // ARBfp peeling fragment program
// Bleh
long r_detailmapping = 0;
float fogresult, ofogresult; float fogresult, ofogresult;
void fogcalc (const signed char *shade, const char *vis) void fogcalc (const signed char *shade, const char *vis)
@ -686,12 +689,18 @@ void polymost_glinit()
bglEnable(GL_MULTISAMPLE_ARB); bglEnable(GL_MULTISAMPLE_ARB);
} }
if (!glinfo.arbfp || !glinfo.depthtex || !glinfo.shadow || !glinfo.fbos || !glinfo.rect) if (r_depthpeeling && (!glinfo.arbfp || !glinfo.depthtex || !glinfo.shadow || !glinfo.fbos || !glinfo.rect || !glinfo.multitex))
{ {
OSD_Printf("Your OpenGL implementation doesn't support depth peeling. Disabling...\n"); OSD_Printf("Your OpenGL implementation doesn't support depth peeling. Disabling...\n");
r_depthpeeling = 0; r_depthpeeling = 0;
} }
if (r_detailmapping && (!glinfo.multitex))
{
OSD_Printf("Your OpenGL implementation doesn't support detail mapping. Disabling...\n");
r_depthpeeling = 0;
}
//depth peeling initialization //depth peeling initialization
if (r_depthpeeling) if (r_depthpeeling)
{ {
@ -1513,7 +1522,7 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
long xx, yy, xi, d0, u0, v0, d1, u1, v1, xmodnice = 0, ymulnice = 0, dorot; long xx, yy, xi, d0, u0, v0, d1, u1, v1, xmodnice = 0, ymulnice = 0, dorot;
char dacol = 0, *walptr, *palptr = NULL, *vidp, *vide; char dacol = 0, *walptr, *palptr = NULL, *vidp, *vide;
#ifdef USE_OPENGL #ifdef USE_OPENGL
pthtyp *pth; pthtyp *pth, *detailpth;
#endif #endif
// backup of the n for possible redrawing of fullbright // backup of the n for possible redrawing of fullbright
long n_ = n, method_ = method; long n_ = n, method_ = method;
@ -1613,6 +1622,46 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
bglBindTexture(GL_TEXTURE_2D, pth ? pth->glpic : 0); bglBindTexture(GL_TEXTURE_2D, pth ? pth->glpic : 0);
detailpth = NULL;
if (r_detailmapping && !r_depthpeeling && indrawroomsandmasks && !drawingskybox && hicfindsubst(globalpicnum, DETAILPAL, 0))
detailpth = gltexcache(globalpicnum,DETAILPAL,method&(~3));
if (detailpth && (detailpth->hicr->palnum == DETAILPAL))
{
bglActiveTextureARB(GL_TEXTURE1_ARB);
bglEnable(GL_TEXTURE_2D);
bglBindTexture(GL_TEXTURE_2D, detailpth ? detailpth->glpic : 0);
bglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
bglTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
bglTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
bglTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
bglTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
bglTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2.0f);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
f = detailpth ? (1.0f / detailpth->hicr->alphacut) : 1.0;
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglScalef(f, f, 1.0f);
bglMatrixMode(GL_MODELVIEW);
}
else
detailpth = NULL;
if (pth && (pth->flags & 2)) if (pth && (pth->flags & 2))
{ {
hackscx = pth->scalex; hackscx = pth->scalex;
@ -1807,7 +1856,14 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
dp = ox*ngdx + oy*ngdy + ngdo; dp = ox*ngdx + oy*ngdy + ngdo;
up = ox*ngux + oy*nguy + nguo; up = ox*ngux + oy*nguy + nguo;
vp = ox*ngvx + oy*ngvy + ngvo; vp = ox*ngvx + oy*ngvy + ngvo;
r = 1.0/dp; bglTexCoord2d((up*r-du0+uoffs)*ox2,vp*r*oy2); r = 1.0/dp;
if (detailpth)
{
bglMultiTexCoord2dARB(GL_TEXTURE0_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2);
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2);
}
else
bglTexCoord2d((up*r-du0+uoffs)*ox2,vp*r*oy2);
bglVertex3d((ox-ghalfx)*r*grhalfxdown10x,(ghoriz-oy)*r*grhalfxdown10,r*(1.0/1024.0)); bglVertex3d((ox-ghalfx)*r*grhalfxdown10x,(ghoriz-oy)*r*grhalfxdown10,r*(1.0/1024.0));
} }
bglEnd(); bglEnd();
@ -1819,7 +1875,13 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
bglBegin(GL_TRIANGLE_FAN); bglBegin(GL_TRIANGLE_FAN);
for (i=0;i<n;i++) for (i=0;i<n;i++)
{ {
r = 1.0/dd[i]; bglTexCoord2d(uu[i]*r*ox2,vv[i]*r*oy2); r = 1.0/dd[i];
if (detailpth)
{
bglMultiTexCoord2dARB(GL_TEXTURE0_ARB, uu[i]*r*ox2,vv[i]*r*oy2);
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, uu[i]*r*ox2,vv[i]*r*oy2);
}
bglTexCoord2d(uu[i]*r*ox2,vv[i]*r*oy2);
bglVertex3d((px[i]-ghalfx)*r*grhalfxdown10x,(ghoriz-py[i])*r*grhalfxdown10,r*(1.0/1024.0)); bglVertex3d((px[i]-ghalfx)*r*grhalfxdown10x,(ghoriz-py[i])*r*grhalfxdown10,r*(1.0/1024.0));
} }
bglEnd(); bglEnd();
@ -1837,6 +1899,11 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
bglFogf(GL_FOG_DENSITY, fogresult); bglFogf(GL_FOG_DENSITY, fogresult);
fullbrightdrawingpass = 0; fullbrightdrawingpass = 0;
} }
if (detailpth)
{
bglDisable(GL_TEXTURE_2D);
bglActiveTextureARB(GL_TEXTURE0_ARB);
}
return; return;
} }
#endif #endif
@ -5158,6 +5225,19 @@ static int osdcmd_polymostvars(const osdfuncparm_t *parm)
else r_curpeel = val; else r_curpeel = val;
return OSDCMD_OK; return OSDCMD_OK;
} }
else if (!Bstrcasecmp(parm->name, "r_detailmapping")) {
if (showval) { OSD_Printf("r_detailmapping is %d\n", r_detailmapping); }
else {
if (!glinfo.multitex)
{
OSD_Printf("Your OpenGL implementation doesn't support detail mapping.\n");
r_depthpeeling = 0;
return OSDCMD_OK;
}
r_detailmapping = (val != 0);
}
return OSDCMD_OK;
}
else if (!Bstrcasecmp(parm->name, "glpolygonmode")) { else if (!Bstrcasecmp(parm->name, "glpolygonmode")) {
if (showval) { OSD_Printf("glpolygonmode is %d\n", glpolygonmode); } if (showval) { OSD_Printf("glpolygonmode is %d\n", glpolygonmode); }
else glpolygonmode = val; else glpolygonmode = val;
@ -5242,6 +5322,7 @@ void polymost_initosdfuncs(void)
OSD_RegisterFunction("r_depthpeeling","r_depthpeeling: enable/disable order-independant transparency",osdcmd_polymostvars); OSD_RegisterFunction("r_depthpeeling","r_depthpeeling: enable/disable order-independant transparency",osdcmd_polymostvars);
OSD_RegisterFunction("r_peelscount","r_peelscount: sets the number of depth layers for depth peeling",osdcmd_polymostvars); OSD_RegisterFunction("r_peelscount","r_peelscount: sets the number of depth layers for depth peeling",osdcmd_polymostvars);
OSD_RegisterFunction("r_curpeel","r_curpeel: allows to display one depth layer at a time (for development purposes)",osdcmd_polymostvars); OSD_RegisterFunction("r_curpeel","r_curpeel: allows to display one depth layer at a time (for development purposes)",osdcmd_polymostvars);
OSD_RegisterFunction("r_detailmapping","r_detailmapping: shut your fucking face uncle fucker",osdcmd_polymostvars);
#endif #endif
OSD_RegisterFunction("usemodels","usemodels: enable/disable model rendering in >8-bit mode",osdcmd_polymostvars); OSD_RegisterFunction("usemodels","usemodels: enable/disable model rendering in >8-bit mode",osdcmd_polymostvars);
OSD_RegisterFunction("usehightile","usehightile: enable/disable hightile texture rendering in >8-bit mode",osdcmd_polymostvars); OSD_RegisterFunction("usehightile","usehightile: enable/disable hightile texture rendering in >8-bit mode",osdcmd_polymostvars);

View File

@ -1070,6 +1070,14 @@ int setvideomode(int x, int y, int c, int fs)
{ {
glinfo.rect = 1; glinfo.rect = 1;
} }
else if (!Bstrcmp((char *)p2, "GL_ARB_multitexture"))
{
glinfo.multitex = 1;
}
else if (!Bstrcmp((char *)p2, "GL_ARB_texture_env_combine"))
{
glinfo.envcombine = 1;
}
} }
Bfree(p); Bfree(p);
} }

View File

@ -2894,6 +2894,14 @@ static int SetupOpenGL(int width, int height, int bitspp)
!Bstrcmp((char *)p2, "GL_EXT_texture_rectangle")) { !Bstrcmp((char *)p2, "GL_EXT_texture_rectangle")) {
glinfo.rect = 1; glinfo.rect = 1;
} }
else if (!Bstrcmp((char *)p2, "GL_ARB_multitexture"))
{
glinfo.multitex = 1;
}
else if (!Bstrcmp((char *)p2, "GL_ARB_texture_env_combine"))
{
glinfo.envcombine = 1;
}
} }
Bfree(p); Bfree(p);
} }

View File

@ -642,6 +642,8 @@ int32 CONFIG_ReadSetup(void)
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDepthPeeling", &r_depthpeeling); SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDepthPeeling", &r_depthpeeling);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLPeelsCount", &r_peelscount); SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLPeelsCount", &r_peelscount);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDetailMapping", &r_detailmapping);
dummy = usemodels; dummy = usemodels;
SCRIPT_GetNumber(scripthandle, "Screen Setup", "UseModels",&dummy); SCRIPT_GetNumber(scripthandle, "Screen Setup", "UseModels",&dummy);
usemodels = dummy != 0; usemodels = dummy != 0;
@ -787,8 +789,11 @@ void CONFIG_WriteSetup(void)
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLUseTextureCacheCompression", glusetexcachecompression,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLUseTextureCacheCompression", glusetexcachecompression,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLUseTextureCompr",glusetexcompr,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLUseTextureCompr",glusetexcompr,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLWidescreen",glwidescreen,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLWidescreen",glwidescreen,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDepthPeeling",r_depthpeeling,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDepthPeeling",r_depthpeeling,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLPeelsCount",r_peelscount,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLPeelsCount",r_peelscount,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDetailMapping", &r_detailmapping,false,false);
#endif #endif
#ifdef RENDERTYPEWIN #ifdef RENDERTYPEWIN
SCRIPT_PutNumber(scripthandle, "Screen Setup", "MaxRefreshFreq",maxrefreshfreq,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "MaxRefreshFreq",maxrefreshfreq,false,false);