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_FLAGS,
T_PAL, T_PAL,
T_DETAIL, T_DETAIL,
T_GLOW,
T_HUD, T_HUD,
T_XADD, T_XADD,
T_YADD, T_YADD,
@ -119,6 +120,7 @@ static tokenlist modeltokens[] = {
{ "frame", T_FRAME }, { "frame", T_FRAME },
{ "anim", T_ANIM }, { "anim", T_ANIM },
{ "skin", T_SKIN }, { "skin", T_SKIN },
{ "glow", T_GLOW },
{ "hud", T_HUD }, { "hud", T_HUD },
}; };
@ -187,10 +189,11 @@ static tokenlist tinttokens[] = {
static tokenlist texturetokens[] = { static tokenlist texturetokens[] = {
{ "pal", T_PAL }, { "pal", T_PAL },
{ "detail", T_DETAIL }, { "detail", T_DETAIL },
{ "glow", T_GLOW },
}; };
static tokenlist texturetokens_pal[] = { static tokenlist texturetokens_pal[] = {
{ "file", T_FILE },{ "name", T_FILE }, { "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 }, { "nocompress",T_NOCOMPRESS },
}; };
@ -867,6 +870,51 @@ static int defsparser(scriptfile *script)
script->filename, scriptfile_getlinum(script,skintokptr)); script->filename, scriptfile_getlinum(script,skintokptr));
break; 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 #endif
} break; } break;
case T_HUD: case T_HUD:
@ -1159,6 +1207,40 @@ static int defsparser(scriptfile *script)
hicsetsubsttex(tile,DETAILPAL,fn,detailscale,flags); hicsetsubsttex(tile,DETAILPAL,fn,detailscale,flags);
} break; } 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: default:
break; break;
} }

View file

@ -661,7 +661,7 @@ failure:
// --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF // --------------------------------------------------- JONOF'S COMPRESSED TEXTURE CACHE STUFF
//Note: even though it says md2model, it works for both md2model&md3model //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; 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]; 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 (!sk)
{ {
if (exact)
return (0);
if (skzero) if (skzero)
{ {
skinfile = skzero->fn; skinfile = skzero->fn;
@ -1272,13 +1274,14 @@ static int md3draw (md3model *m, spritetype *tspr)
{ {
point3d fp, fp1, fp2, m0, m1, a0, a1; point3d fp, fp1, fp2, m0, m1, a0, a1;
md3xyzn_t *v0, *v1; 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; float f, g, k0, k1, k2, k3, k4, k5, k6, k7, mat[16], pc[4], mult;
md3surf_t *s; md3surf_t *s;
//PLAG : sorting stuff //PLAG : sorting stuff
unsigned short *indexes; unsigned short *indexes;
float *maxdepths; float *maxdepths;
unsigned short tempus; unsigned short tempus;
int texunits = GL_TEXTURE0_ARB;
// if ((tspr->cstat&48) == 32) return 0; // 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); mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f; bglLoadMatrixf(mat);
// PLAG: End // 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 //i = mdloadskin((md2model *)m,tile2model[tspr->picnum].skinnum,surfi); //hack for testing multiple surfaces per MD3
bglBindTexture(GL_TEXTURE_2D, i); 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 //PLAG: delayed polygon-level sorted rendering
if (m->usesalpha && !(tspr->cstat & 1024) && !r_depthpeeling) 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++) for (j=0;j<3;j++)
{ {
k = s->tris[indexes[i]].i[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]); bglVertex3fv((float *)&vertlist[k]);
} }
bglEnd(); 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++) for (j=0;j<3;j++)
{ {
k = s->tris[i].i[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]); bglVertex3fv((float *)&vertlist[k]);
} }
bglEnd(); 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 // Detail mapping cvar
long r_detailmapping = 1; long r_detailmapping = 1;
// Glow mapping cvar
long r_glowmapping = 1;
float fogresult, ofogresult, fogcol[4]; float fogresult, ofogresult, fogcol[4];
void fogcalc (signed char shade, char vis, char pal) void fogcalc (signed char shade, char vis, char pal)
@ -634,33 +637,33 @@ void polymost_glinit()
{ {
GLfloat col[4]; GLfloat col[4];
int i; int i;
char notpeeledprogramstring[] = char notpeeledprogramstring[] =
"!!ARBfp1.0\n" "!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n" "OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n" "OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n" "TEMP texsample;\n"
"TEMP depthresult;\n" "TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n" "TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n" "ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n" "KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n" "TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n" "MUL result.color, fragment.color, texsample;\n"
"END\n"; "END\n";
char peeledprogramstring[] = char peeledprogramstring[] =
"!!ARBfp1.0\n" "!!ARBfp1.0\n"
"OPTION ARB_fog_exp2;\n" "OPTION ARB_fog_exp2;\n"
"OPTION ARB_fragment_program_shadow;\n" "OPTION ARB_fragment_program_shadow;\n"
"TEMP texsample;\n" "TEMP texsample;\n"
"TEMP depthresult;\n" "TEMP depthresult;\n"
"TEX depthresult, fragment.position, texture[2], SHADOWRECT;\n" "TEX depthresult, fragment.position, texture[2], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n" "ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n" "KIL depthresult.a;\n"
"TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n" "TEX depthresult, fragment.position, texture[1], SHADOWRECT;\n"
"ADD depthresult.a, depthresult.a, -0.5;\n" "ADD depthresult.a, depthresult.a, -0.5;\n"
"KIL depthresult.a;\n" "KIL depthresult.a;\n"
"TEX texsample, fragment.texcoord[0], texture[0], 2D;\n" "TEX texsample, fragment.texcoord[0], texture[0], 2D;\n"
"MUL result.color, fragment.color, texsample;\n" "MUL result.color, fragment.color, texsample;\n"
"END\n"; "END\n";
#if 1 #if 1
if (!Bstrcmp(glinfo.vendor, "ATI Technologies Inc.")) if (!Bstrcmp(glinfo.vendor, "ATI Technologies Inc."))
@ -700,12 +703,18 @@ void polymost_glinit()
r_depthpeeling = 0; 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"); OSD_Printf("Your OpenGL implementation doesn't support detail mapping. Disabling...\n");
r_detailmapping = 0; 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 //depth peeling initialization
if (r_depthpeeling) if (r_depthpeeling)
{ {
@ -715,67 +724,67 @@ void polymost_glinit()
newpeelscount = 0; newpeelscount = 0;
} }
// create the secondary Z-buffers and the Z-backbuffer // create the secondary Z-buffers and the Z-backbuffer
bglGenTextures(3, ztexture); bglGenTextures(3, ztexture);
i = 0; i = 0;
while (i < 3) while (i < 3)
{ {
bglBindTexture(GL_TEXTURE_RECTANGLE, ztexture[i]); bglBindTexture(GL_TEXTURE_RECTANGLE, ztexture[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_DEPTH_COMPONENT, 0, 0, xdim, ydim, 0); 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_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_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_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, 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); bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
if (i < 2) if (i < 2)
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_GREATER); bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_GREATER);
else else
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LESS); bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LESS);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA); bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_DEPTH_TEXTURE_MODE_ARB, GL_ALPHA);
i++; i++;
} }
// create the various peeling layers as well as the FBOs to render to them // create the various peeling layers as well as the FBOs to render to them
peels = malloc((r_peelscount + 1) * sizeof(GLuint)); peels = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenTextures(r_peelscount + 1, peels); bglGenTextures(r_peelscount + 1, peels);
peelfbos = malloc((r_peelscount + 1) * sizeof(GLuint)); peelfbos = malloc((r_peelscount + 1) * sizeof(GLuint));
bglGenFramebuffersEXT(r_peelscount + 1, peelfbos); bglGenFramebuffersEXT(r_peelscount + 1, peelfbos);
i = 0; i = 0;
while (i <= r_peelscount) while (i <= r_peelscount)
{ {
bglBindTexture(GL_TEXTURE_RECTANGLE, peels[i]); bglBindTexture(GL_TEXTURE_RECTANGLE, peels[i]);
bglCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, xdim, ydim, 0); 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_MIN_FILTER, GL_NEAREST);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_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_S, GL_CLAMP);
bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP); bglTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[i]); bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[i]);
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE, peels[i], 0); bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE, peels[i], 0);
if (i == r_peelscount) // bakcbuffer if (i == r_peelscount) // bakcbuffer
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[2], 0); bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[2], 0);
else if (i < (r_peelscount - 1)) else if (i < (r_peelscount - 1))
bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[i % 2], 0); bglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_RECTANGLE, ztexture[i % 2], 0);
if (bglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) if (bglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{ {
OSD_Printf("FBO #%d initialization failed.\n", i); OSD_Printf("FBO #%d initialization failed.\n", i);
} }
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
i++; i++;
} }
// create the peeling fragment programs // create the peeling fragment programs
bglGenProgramsARB(2, peelprogram); bglGenProgramsARB(2, peelprogram);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[0]); bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[0]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(notpeeledprogramstring), notpeeledprogramstring); bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(notpeeledprogramstring), notpeeledprogramstring);
bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[1]); bglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, peelprogram[1]);
bglProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(peeledprogramstring), peeledprogramstring); 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; 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, *detailpth; pthtyp *pth, *detailpth, *glowpth;
int texunits = GL_TEXTURE0_ARB;
#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;
@ -1630,29 +1640,29 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
detailpth = NULL; detailpth = NULL;
if (r_detailmapping && usehightile && !r_depthpeeling && indrawroomsandmasks && !drawingskybox && if (r_detailmapping && usehightile && !r_depthpeeling && indrawroomsandmasks && !drawingskybox &&
hicfindsubst(globalpicnum, DETAILPAL, 0)) hicfindsubst(globalpicnum, DETAILPAL, 0))
detailpth = gltexcache(globalpicnum, DETAILPAL,method&(~3)); detailpth = gltexcache(globalpicnum, DETAILPAL, method&(~3));
if (detailpth && (detailpth->hicr->palnum == DETAILPAL)) if (detailpth && (detailpth->hicr->palnum == DETAILPAL))
{ {
bglActiveTextureARB(GL_TEXTURE1_ARB); bglActiveTextureARB(++texunits);
bglEnable(GL_TEXTURE_2D); bglEnable(GL_TEXTURE_2D);
bglBindTexture(GL_TEXTURE_2D, detailpth ? detailpth->glpic : 0); 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_COMBINE_RGB_ARB, GL_MODULATE);
bglTexEnvf(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_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_OPERAND0_RGB_ARB, GL_SRC_COLOR);
bglTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); 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_OPERAND1_RGB_ARB, GL_SRC_COLOR);
bglTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); 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_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
bglTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); 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_RGB_SCALE_ARB, 2.0f);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,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; f = detailpth ? (1.0f / detailpth->hicr->alphacut) : 1.0;
bglMatrixMode(GL_TEXTURE); bglMatrixMode(GL_TEXTURE);
bglLoadIdentity(); bglLoadIdentity();
bglScalef(f, f, 1.0f); bglScalef(f, f, 1.0f);
bglMatrixMode(GL_MODELVIEW); bglMatrixMode(GL_MODELVIEW);
} }
else else
detailpth = NULL; 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)) if (pth && (pth->flags & 2))
{ {
hackscx = pth->scalex; hackscx = pth->scalex;
@ -1863,10 +1907,11 @@ void drawpoly (double *dpx, double *dpy, long n, long method)
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; r = 1.0/dp;
if (detailpth) if (texunits > GL_TEXTURE0_ARB)
{ {
bglMultiTexCoord2dARB(GL_TEXTURE0_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2); j = GL_TEXTURE0_ARB;
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, (up*r-du0+uoffs)*ox2,vp*r*oy2); while (j <= texunits)
bglMultiTexCoord2dARB(j++, (up*r-du0+uoffs)*ox2,vp*r*oy2);
} }
else else
bglTexCoord2d((up*r-du0+uoffs)*ox2,vp*r*oy2); 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++) for (i=0;i<n;i++)
{ {
r = 1.0/dd[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); j = GL_TEXTURE0_ARB;
bglMultiTexCoord2dARB(GL_TEXTURE1_ARB, uu[i]*r*ox2,vv[i]*r*oy2); 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)); bglVertex3d((px[i]-ghalfx)*r*grhalfxdown10x,(ghoriz-py[i])*r*grhalfxdown10,r*(1.0/1024.0));
} }
bglEnd(); bglEnd();
} }
if (detailpth)
if (texunits > GL_TEXTURE0_ARB)
{ {
bglDisable(GL_TEXTURE_2D); while (texunits > GL_TEXTURE0_ARB)
bglActiveTextureARB(GL_TEXTURE0_ARB); {
bglMatrixMode(GL_TEXTURE);
bglLoadIdentity();
bglMatrixMode(GL_MODELVIEW);
bglDisable(GL_TEXTURE_2D);
bglActiveTextureARB(--texunits);
}
} }
if (fullbrightdrawingpass == 1) // tile has fullbright colors ? if (fullbrightdrawingpass == 1) // tile has fullbright colors ?
{ {
fullbrightdrawingpass = 2; fullbrightdrawingpass = 2;
@ -3702,7 +3757,7 @@ void polymost_drawrooms ()
} }
if (r_depthpeeling) if (r_depthpeeling)
{ {
bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[r_peelscount]); bglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, peelfbos[r_peelscount]);
bglPushAttrib(GL_VIEWPORT_BIT); bglPushAttrib(GL_VIEWPORT_BIT);
bglViewport(0, 0, xdim, ydim); bglViewport(0, 0, xdim, ydim);
//bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //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")) { else if (!Bstrcasecmp(parm->name, "r_detailmapping")) {
if (showval) { OSD_Printf("r_detailmapping is %d\n", r_detailmapping); } if (showval) { OSD_Printf("r_detailmapping is %d\n", r_detailmapping); }
else { else {
if (!glinfo.multitex) if (!glinfo.multitex || !glinfo.envcombine)
{ {
OSD_Printf("Your OpenGL implementation doesn't support detail mapping.\n"); OSD_Printf("Your OpenGL implementation doesn't support detail mapping.\n");
r_detailmapping = 0; r_detailmapping = 0;
@ -5238,6 +5293,19 @@ static int osdcmd_polymostvars(const osdfuncparm_t *parm)
} }
return OSDCMD_OK; 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")) { 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;
@ -5322,7 +5390,8 @@ 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: 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 #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);
@ -5359,7 +5428,7 @@ void polymost_precache(long dapicnum, long dapalnum, long datype)
j = ((md3model *)models[mid])->head.numsurfs; j = ((md3model *)models[mid])->head.numsurfs;
for (i=0;i<=j;i++) for (i=0;i<=j;i++)
mdloadskin((md2model*)models[mid], 0, dapalnum, i); mdloadskin((md2model*)models[mid], 0, dapalnum, i, 0);
} }
#endif #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.ActiveCfg = Release|Win32
{CD149A75-4507-404D-856C-E9DBC2E0B286}.HRP SD Release|Win32.Build.0 = 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.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.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.Classic JFAud|Win32.Build.0 = 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 {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.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD Release|Win32.Build.0 = 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.ActiveCfg = Release|Win32
{862365FE-811C-46B8-BB1E-B7189DA8D858}.HRP SD|Win32.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE 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", "GLPeelsCount", &r_peelscount);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDetailMapping", &r_detailmapping); SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLDetailMapping", &r_detailmapping);
SCRIPT_GetNumber(scripthandle, "Screen Setup", "GLGlowMapping", &r_glowmapping);
dummy = usemodels; dummy = usemodels;
SCRIPT_GetNumber(scripthandle, "Screen Setup", "UseModels",&dummy); 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", "GLPeelsCount",r_peelscount,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDetailMapping", r_detailmapping,false,false); SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLDetailMapping", r_detailmapping,false,false);
SCRIPT_PutNumber(scripthandle, "Screen Setup", "GLGlowMapping", r_glowmapping,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);