Glow mapping !

git-svn-id: https://svn.eduke32.com/eduke32@497 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
Plagman 2007-02-15 01:35:34 +00:00
parent 5bc5a1bfd0
commit 3dd47da766
6 changed files with 917 additions and 664 deletions

File diff suppressed because it is too large Load diff

View file

@ -43,6 +43,7 @@ enum {
T_FLAGS,
T_PAL,
T_DETAIL,
T_GLOW,
T_HUD,
T_XADD,
T_YADD,
@ -119,6 +120,7 @@ static tokenlist modeltokens[] = {
{ "frame", T_FRAME },
{ "anim", T_ANIM },
{ "skin", T_SKIN },
{ "glow", T_GLOW },
{ "hud", T_HUD },
};
@ -187,10 +189,11 @@ static tokenlist tinttokens[] = {
static tokenlist texturetokens[] = {
{ "pal", T_PAL },
{ "detail", T_DETAIL },
{ "glow", T_GLOW },
};
static tokenlist texturetokens_pal[] = {
{ "file", T_FILE },{ "name", T_FILE },
{ "alphacut", T_ALPHACUT }, { "detailscale", T_ALPHACUT }, { "scale", T_ALPHACUT },
{ "alphacut", T_ALPHACUT }, { "detailscale", T_ALPHACUT }, { "scale", T_ALPHACUT }, { "intensity", T_ALPHACUT },
{ "nocompress",T_NOCOMPRESS },
};
@ -867,6 +870,51 @@ static int defsparser(scriptfile *script)
script->filename, scriptfile_getlinum(script,skintokptr));
break;
}
#endif
} break;
case T_GLOW:
{
char *glowtokptr = script->ltextptr;
char *glowend, *glowfn = 0;
int surfnum = 0;
if (scriptfile_getbraces(script,&glowend)) break;
while (script->textptr < glowend) {
switch (getatoken(script,modelskintokens,sizeof(modelskintokens)/sizeof(tokenlist))) {
case T_FILE:
scriptfile_getstring(script,&glowfn); break; //skin filename
case T_SURF:
scriptfile_getnumber(script,&surfnum); break;
}
}
if (!glowfn) {
initprintf("Error: missing 'skin filename' for skin definition near line %s:%d\n", script->filename, scriptfile_getlinum(script,glowtokptr));
break;
}
if (seenframe) { modelskin = ++lastmodelskin; }
seenframe = 0;
#if defined(POLYMOST) && defined(USE_OPENGL)
switch (md_defineskin(lastmodelid, glowfn, GLOWPAL, max(0,modelskin), surfnum)) {
case 0:
break;
case -1:
break; // invalid model id!?
case -2:
initprintf("Invalid skin filename on line %s:%d\n",
script->filename, scriptfile_getlinum(script,glowtokptr));
break;
case -3:
initprintf("Invalid palette number on line %s:%d\n",
script->filename, scriptfile_getlinum(script,glowtokptr));
break;
case -4:
initprintf("Out of memory on line %s:%d\n",
script->filename, scriptfile_getlinum(script,glowtokptr));
break;
}
#endif
} break;
case T_HUD:
@ -1159,6 +1207,40 @@ static int defsparser(scriptfile *script)
hicsetsubsttex(tile,DETAILPAL,fn,detailscale,flags);
} break;
case T_GLOW: {
char *glowtokptr = script->ltextptr, *glowend;
int i;
char *fn = NULL;
double glowintensity = 1.0;
char flags = 0;
if (scriptfile_getbraces(script,&glowend)) break;
while (script->textptr < glowend) {
switch (getatoken(script,texturetokens_pal,sizeof(texturetokens_pal)/sizeof(tokenlist))) {
case T_FILE:
scriptfile_getstring(script,&fn); break;
case T_ALPHACUT:
scriptfile_getdouble(script,&glowintensity); 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,glowtokptr));
break;
}
if ((i = kopen4load(fn,0)) < 0) {
initprintf("Error: file '%s' does not exist\n",fn);
break;
} else kclose(i);
hicsetsubsttex(tile,GLOWPAL,fn,glowintensity,flags);
} break;
default:
break;
}

View file

@ -661,7 +661,7 @@ failure:
// --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF
//Note: even though it says md2model, it works for both md2model&md3model
static long mdloadskin (md2model *m, int number, int pal, int surf)
static long mdloadskin (md2model *m, int number, int pal, int surf, int exact)
{
long i,j, fptr=0, bpl, xsiz=0, ysiz=0, osizx, osizy, texfmt = GL_RGBA, intexfmt = GL_RGBA;
char *skinfile, hasalpha, fn[BMAX_PATH+65];
@ -696,6 +696,8 @@ static long mdloadskin (md2model *m, int number, int pal, int surf)
}
if (!sk)
{
if (exact)
return (0);
if (skzero)
{
skinfile = skzero->fn;
@ -1272,13 +1274,14 @@ static int md3draw (md3model *m, spritetype *tspr)
{
point3d fp, fp1, fp2, m0, m1, a0, a1;
md3xyzn_t *v0, *v1;
long i, j, k, surfi, *lptr;
long i, j, k, l, surfi, *lptr;
float f, g, k0, k1, k2, k3, k4, k5, k6, k7, mat[16], pc[4], mult;
md3surf_t *s;
//PLAG : sorting stuff
unsigned short *indexes;
float *maxdepths;
unsigned short tempus;
int texunits = GL_TEXTURE0_ARB;
// if ((tspr->cstat&48) == 32) return 0;
@ -1485,10 +1488,81 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; }
mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f; bglLoadMatrixf(mat);
// PLAG: End
i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,globalpal,surfi); if (!i) continue;
i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,globalpal,surfi,0); if (!i) continue;
//i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,surfi); //hack for testing multiple surfaces per MD3
bglBindTexture(GL_TEXTURE_2D, i);
/*if (r_detailmapping && !r_depthpeeling && indrawroomsandmasks)
i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,DETAILPAL,surfi,1);
else
i = 0;
if (i)
{
bglActiveTextureARB(++texunits);
bglEnable(GL_TEXTURE_2D);
bglBindTexture(GL_TEXTURE_2D, i);
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 = 0.5f;
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglScalef(f, f, 1.0f);
bglMatrixMode(GL_MODELVIEW);
}*/
if (r_glowmapping && !r_depthpeeling && indrawroomsandmasks)
i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,GLOWPAL,surfi,1);
else
i = 0;
if (i)
{
bglActiveTextureARB(++texunits);
bglEnable(GL_TEXTURE_2D);
bglBindTexture(GL_TEXTURE_2D, i);
bglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);
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_SOURCE2_RGB_ARB, GL_TEXTURE);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_ONE_MINUS_SRC_ALPHA);
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);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
}
//PLAG: delayed polygon-level sorted rendering
if (m->usesalpha && !(tspr->cstat & 1024) && !r_depthpeeling)
{
@ -1595,7 +1669,14 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; }
for (j=0;j<3;j++)
{
k = s->tris[indexes[i]].i[j];
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
if (texunits > GL_TEXTURE0_ARB)
{
l = GL_TEXTURE0_ARB;
while (l <= texunits)
bglMultiTexCoord2fARB(l++, s->uv[k].u,s->uv[k].v);
}
else
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
bglVertex3fv((float *)&vertlist[k]);
}
bglEnd();
@ -1610,11 +1691,30 @@ if (tspr->cstat&2) { if (!(tspr->cstat&512)) pc[3] = 0.66; else pc[3] = 0.33; }
for (j=0;j<3;j++)
{
k = s->tris[i].i[j];
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
if (texunits > GL_TEXTURE0_ARB)
{
l = GL_TEXTURE0_ARB;
while (l <= texunits)
bglMultiTexCoord2fARB(l++, s->uv[k].u,s->uv[k].v);
}
else
bglTexCoord2f(s->uv[k].u,s->uv[k].v);
bglVertex3fv((float *)&vertlist[k]);
}
bglEnd();
}
if (texunits > GL_TEXTURE0_ARB)
{
while (texunits > GL_TEXTURE0_ARB)
{
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglMatrixMode(GL_MODELVIEW);
bglDisable(GL_TEXTURE_2D);
bglActiveTextureARB(--texunits);
}
}
}
//------------

View file

@ -152,6 +152,9 @@ GLuint peelprogram[2]; // ARBfp peeling fragment program
// Detail mapping cvar
long r_detailmapping = 1;
// Glow mapping cvar
long r_glowmapping = 1;
float fogresult, ofogresult, fogcol[4];
void fogcalc (signed char shade, char vis, char pal)
@ -634,33 +637,33 @@ void polymost_glinit()
{
GLfloat col[4];
int i;
char notpeeledprogramstring[] =
"!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n"
"TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n"
"END\n";
char peeledprogramstring[] =
"!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n"
"TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[2], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n"
"END\n";
char notpeeledprogramstring[] =
"!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n"
"TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n"
"END\n";
char peeledprogramstring[] =
"!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n"
"TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[2], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n"
"END\n";
#if 1
if (!Bstrcmp(glinfo.vendor, "ATI Technologies Inc."))
@ -700,12 +703,18 @@ void polymost_glinit()
r_depthpeeling = 0;
}
if (r_detailmapping && (!glinfo.multitex))
if (r_detailmapping && (!glinfo.multitex || !glinfo.envcombine))
{
OSD_Printf("Your OpenGL implementation doesn't support detail mapping. Disabling...\n");
r_detailmapping = 0;
}
if (r_glowmapping && (!glinfo.multitex || !glinfo.envcombine))
{
OSD_Printf("Your OpenGL implementation doesn't support glow mapping. Disabling...\n");
r_glowmapping = 0;
}
//depth peeling initialization
if (r_depthpeeling)
{
@ -715,67 +724,67 @@ void polymost_glinit()
newpeelscount = 0;
}
// create the secondary Z-buffers and the Z-backbuffer
bglGenTextures(3, ztexture);
i = 0;
while (i < 3)
{
bglBindTexture(GL_TEXTURE_RECTANGLE, ztexture[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_DEPTH_COMPONENT, 0, 0, xdim, ydim, 0);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
if (i < 2)
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_GREATER);
else
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LESS);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
i++;
}
// create the various peeling layers as well as the FBOs to render to them
peels = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenTextures(r_peelscount + 1, peels);
peelfbos = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenFramebuffersEXT(r_peelscount + 1, peelfbos);
i = 0;
while (i <= r_peelscount)
{
bglBindTexture(GL_TEXTURE_RECTANGLE, peels[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, xdim, ydim, 0);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[i]);
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE, peels[i], 0);
if (i == r_peelscount) // bakcbuffer
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[2], 0);
bglGenTextures(3, ztexture);
i = 0;
while (i < 3)
{
bglBindTexture(GL_TEXTURE_RECTANGLE, ztexture[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_DEPTH_COMPONENT, 0, 0, xdim, ydim, 0);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
if (i < 2)
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_GREATER);
else
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LESS);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
i++;
}
// create the various peeling layers as well as the FBOs to render to them
peels = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenTextures(r_peelscount + 1, peels);
peelfbos = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenFramebuffersEXT(r_peelscount + 1, peelfbos);
i = 0;
while (i <= r_peelscount)
{
bglBindTexture(GL_TEXTURE_RECTANGLE, peels[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, xdim, ydim, 0);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[i]);
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE, peels[i], 0);
if (i == r_peelscount) // bakcbuffer
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[2], 0);
else if (i < (r_peelscount - 1))
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[i % 2], 0);
if (bglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
OSD_Printf("FBO #%d initialization failed.\n", i);
}
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[i % 2], 0);
if (bglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
OSD_Printf("FBO #%d initialization failed.\n", i);
}
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
i++;
}
// create the peeling fragment programs
bglGenProgramsARB(2, peelprogram);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[0]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(notpeeledprogramstring), notpeeledprogramstring);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[1]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(peeledprogramstring), peeledprogramstring);
i++;
}
// create the peeling fragment programs
bglGenProgramsARB(2, peelprogram);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[0]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(notpeeledprogramstring), notpeeledprogramstring);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[1]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(peeledprogramstring), peeledprogramstring);
}
}
@ -1527,7 +1536,8 @@ 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;
char dacol = 0, *walptr, *palptr = NULL, *vidp, *vide;
#ifdef USE_OPENGL
pthtyp *pth, *detailpth;
pthtyp *pth, *detailpth, *glowpth;
int texunits = GL_TEXTURE0_ARB;
#endif
// backup of the n for possible redrawing of fullbright
long n_ = n, method_ = method;
@ -1630,29 +1640,29 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
detailpth = NULL;
if (r_detailmapping && usehightile && !r_depthpeeling && indrawroomsandmasks && !drawingskybox &&
hicfindsubst(globalpicnum, DETAILPAL, 0))
detailpth = gltexcache(globalpicnum, DETAILPAL,method&(~3));
detailpth = gltexcache(globalpicnum, DETAILPAL, method&(~3));
if (detailpth && (detailpth->hicr->palnum == DETAILPAL))
{
bglActiveTextureARB(GL_TEXTURE1_ARB);
bglActiveTextureARB(++texunits);
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_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_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_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);
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);
@ -1660,14 +1670,48 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
f = detailpth ? (1.0f / detailpth->hicr->alphacut) : 1.0;
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglScalef(f, f, 1.0f);
bglMatrixMode(GL_MODELVIEW);
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglScalef(f, f, 1.0f);
bglMatrixMode(GL_MODELVIEW);
}
else
detailpth = NULL;
glowpth = NULL;
if (r_glowmapping && usehightile && !r_depthpeeling && indrawroomsandmasks && !drawingskybox &&
hicfindsubst(globalpicnum, GLOWPAL, 0))
glowpth = gltexcache(globalpicnum, GLOWPAL, method&(~3));
if (glowpth && (glowpth->hicr->palnum == GLOWPAL))
{
bglActiveTextureARB(++texunits);
bglEnable(GL_TEXTURE_2D);
bglBindTexture(GL_TEXTURE_2D, glowpth ? glowpth->glpic : 0);
bglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);
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_SOURCE2_RGB_ARB, GL_TEXTURE);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_ONE_MINUS_SRC_ALPHA);
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);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
}
else
glowpth = NULL;
if (pth && (pth->flags & 2))
{
hackscx = pth->scalex;
@ -1863,10 +1907,11 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
up = ox*ngux + oy*nguy + nguo;
vp = ox*ngvx + oy*ngvy + ngvo;
r = 1.0/dp;
if (detailpth)
if (texunits > GL_TEXTURE0_ARB)
{
bglMultiTexCoord2dARB(GL_TEXTURE0_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2);
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2);
j = GL_TEXTURE0_ARB;
while (j <= texunits)
bglMultiTexCoord2dARB(j++, (up*r-du0+uoffs)*ox2,vp*r*oy2);
}
else
bglTexCoord2d((up*r-du0+uoffs)*ox2,vp*r*oy2);
@ -1882,21 +1927,31 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
for (i=0;i<n;i++)
{
r = 1.0/dd[i];
if (detailpth)
if (texunits > GL_TEXTURE0_ARB)
{
bglMultiTexCoord2dARB(GL_TEXTURE0_ARB, uu[i]*r*ox2,vv[i]*r*oy2);
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, uu[i]*r*ox2,vv[i]*r*oy2);
j = GL_TEXTURE0_ARB;
while (j <= texunits)
bglMultiTexCoord2dARB(j++, uu[i]*r*ox2,vv[i]*r*oy2);
}
bglTexCoord2d(uu[i]*r*ox2,vv[i]*r*oy2);
else
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));
}
bglEnd();
}
if (detailpth)
if (texunits > GL_TEXTURE0_ARB)
{
bglDisable(GL_TEXTURE_2D);
bglActiveTextureARB(GL_TEXTURE0_ARB);
while (texunits > GL_TEXTURE0_ARB)
{
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglMatrixMode(GL_MODELVIEW);
bglDisable(GL_TEXTURE_2D);
bglActiveTextureARB(--texunits);
}
}
if (fullbrightdrawingpass == 1) // tile has fullbright colors ?
{
fullbrightdrawingpass = 2;
@ -3702,7 +3757,7 @@ void polymost_drawrooms ()
}
if (r_depthpeeling)
{
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[r_peelscount]);
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[r_peelscount]);
bglPushAttrib(GL_VIEWPORT_BIT);
bglViewport(0, 0, xdim, ydim);
//bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
@ -5228,7 +5283,7 @@ static int osdcmd_polymostvars(const osdfuncparm_t *parm)
else if (!Bstrcasecmp(parm->name, "r_detailmapping")) {
if (showval) { OSD_Printf("r_detailmapping is %d\n", r_detailmapping); }
else {
if (!glinfo.multitex)
if (!glinfo.multitex || !glinfo.envcombine)
{
OSD_Printf("Your OpenGL implementation doesn't support detail mapping.\n");
r_detailmapping = 0;
@ -5238,6 +5293,19 @@ static int osdcmd_polymostvars(const osdfuncparm_t *parm)
}
return OSDCMD_OK;
}
else if (!Bstrcasecmp(parm->name, "r_glowmapping")) {
if (showval) { OSD_Printf("r_glowmapping is %d\n", r_glowmapping); }
else {
if (!glinfo.multitex || !glinfo.envcombine)
{
OSD_Printf("Your OpenGL implementation doesn't support glow mapping.\n");
r_glowmapping = 0;
return OSDCMD_OK;
}
r_glowmapping = (val != 0);
}
return OSDCMD_OK;
}
else if (!Bstrcasecmp(parm->name, "glpolygonmode")) {
if (showval) { OSD_Printf("glpolygonmode is %d\n", glpolygonmode); }
else glpolygonmode = val;
@ -5322,7 +5390,8 @@ void polymost_initosdfuncs(void)
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_curpeel","r_curpeel: allows to display one depth layer at a time (for development purposes)",osdcmd_polymostvars);
OSD_RegisterFunction("r_detailmapping","r_detailmapping: enable/disable detail-mapping",osdcmd_polymostvars);
OSD_RegisterFunction("r_detailmapping","r_detailmapping: enable/disable detail mapping",osdcmd_polymostvars);
OSD_RegisterFunction("r_glowmapping","r_glowmapping: enable/disable glow mapping",osdcmd_polymostvars);
#endif
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);
@ -5359,7 +5428,7 @@ void polymost_precache(long dapicnum, long dapalnum, long datype)
j = ((md3model *)models[mid])->head.numsurfs;
for (i=0;i<=j;i++)
mdloadskin((md2model*)models[mid], 0, dapalnum, i);
mdloadskin((md2model*)models[mid], 0, dapalnum, i, 0);
}
#endif
}

View file

@ -57,7 +57,6 @@ Global
{CD149A75-4507-404D-856C-E9DBC2E0B286}.HRP SD Release|Win32.ActiveCfg = Release|Win32
{CD149A75-4507-404D-856C-E9DBC2E0B286}.HRP SD Release|Win32.Build.0 = Release|Win32
{CD149A75-4507-404D-856C-E9DBC2E0B286}.HRP SD|Win32.ActiveCfg = Release|Win32
{CD149A75-4507-404D-856C-E9DBC2E0B286}.HRP SD|Win32.Build.0 = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.Classic JFAud|Win32.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.Classic JFAud|Win32.Build.0 = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.Classic Release JFAud|Win32.ActiveCfg = Release|Win32
@ -73,7 +72,6 @@ Global
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD Release|Win32.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD Release|Win32.Build.0 = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD|Win32.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -680,6 +680,7 @@ int32 CONFIG_ReadSetup(void)
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLPeelsCount", &r_peelscount);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDetailMapping", &r_detailmapping);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLGlowMapping", &r_glowmapping);
dummy = usemodels;
SCRIPT_GetNumber(scripthandle, "Screen Setup", "UseModels",&dummy);
@ -832,6 +833,7 @@ void CONFIG_WriteSetup(void)
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLPeelsCount",r_peelscount,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDetailMapping", r_detailmapping,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLGlowMapping", r_glowmapping,false,false);
#endif
#ifdef RENDERTYPEWIN
SCRIPT_PutNumber(scripthandle, "Screen Setup", "MaxRefreshFreq",maxrefreshfreq,false,false);