diff --git a/polymer/eduke32/build/include/build.h b/polymer/eduke32/build/include/build.h index d806a3cd7..060e260fc 100644 --- a/polymer/eduke32/build/include/build.h +++ b/polymer/eduke32/build/include/build.h @@ -624,7 +624,7 @@ void hicinit(void); // effect bitset: 1 = greyscale, 2 = invert void hicsetpalettetint(int32_t palnum, char r, char g, char b, char effect); // flags bitset: 1 = don't compress -int32_t hicsetsubsttex(int32_t picnum, int32_t palnum, char *filen, float alphacut, float xscale, float yscale, char flags); +int32_t hicsetsubsttex(int32_t picnum, int32_t palnum, char *filen, float alphacut, float xscale, float yscale, float specpower, float specfactor, char flags); int32_t hicsetskybox(int32_t picnum, int32_t palnum, char *faces[6]); int32_t hicclearsubst(int32_t picnum, int32_t palnum); diff --git a/polymer/eduke32/build/include/hightile.h b/polymer/eduke32/build/include/hightile.h index 81fa295f3..ff0f57a0c 100644 --- a/polymer/eduke32/build/include/hightile.h +++ b/polymer/eduke32/build/include/hightile.h @@ -10,7 +10,7 @@ typedef struct hicreplc_t { struct hicreplc_t *next; char palnum, ignore, flags, filler; char *filename; - float alphacut, xscale, yscale; + float alphacut, xscale, yscale, specpower, specfactor; struct hicskybox_t *skybox; } hicreplctyp; diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index 3c5c8024c..9013d126a 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -52,6 +52,7 @@ typedef enum { PR_BIT_DIFFUSE_MAP, PR_BIT_DIFFUSE_DETAIL_MAP, PR_BIT_DIFFUSE_MODULATION, + PR_BIT_SPECULAR_MATERIAL, PR_BIT_MIRROR_MAP, PR_BIT_GLOW_MAP, PR_BIT_SHADOW_MAP, @@ -76,6 +77,8 @@ typedef struct s_prmaterial { GLfloat detailscale[2]; // PR_BIT_DIFFUSE_MODULATION GLfloat diffusemodulation[4]; + // PR_BIT_SPECULAR_MATERIAL + GLfloat specmaterial[2]; // PR_BIT_MIRROR_MAP GLuint mirrormap; // PR_BIT_GLOW_MAP @@ -101,6 +104,8 @@ typedef struct s_prrograminfo { // PR_BIT_DIFFUSE_DETAIL_MAP GLint uniform_detailMap; GLint uniform_detailScale; + // PR_BIT_SPECULAR_MATERIAL + GLint uniform_specMaterial; // PR_BIT_MIRROR_MAP GLint uniform_mirrorMap; // PR_BIT_GLOW_MAP diff --git a/polymer/eduke32/build/src/defs.c b/polymer/eduke32/build/src/defs.c index 5d9ba2110..354878df1 100644 --- a/polymer/eduke32/build/src/defs.c +++ b/polymer/eduke32/build/src/defs.c @@ -62,7 +62,7 @@ enum T_SKYBOX, T_FRONT,T_RIGHT,T_BACK,T_LEFT,T_TOP,T_BOTTOM, T_TINT,T_RED,T_GREEN,T_BLUE, - T_TEXTURE,T_ALPHACUT,T_XSCALE,T_YSCALE,T_NOCOMPRESS,T_NODOWNSIZE, + T_TEXTURE,T_ALPHACUT,T_XSCALE,T_YSCALE,T_SPECPOWER,T_SPECFACTOR,T_NOCOMPRESS,T_NODOWNSIZE, T_UNDEFMODEL,T_UNDEFMODELRANGE,T_UNDEFMODELOF,T_UNDEFTEXTURE,T_UNDEFTEXTURERANGE, T_ALPHAHACK,T_ALPHAHACKRANGE, T_SPRITECOL,T_2DCOL, @@ -245,6 +245,8 @@ static tokenlist texturetokens_pal[] = { "alphacut", T_ALPHACUT }, { "detailscale", T_XSCALE }, { "scale", T_XSCALE }, { "xscale", T_XSCALE }, { "intensity", T_XSCALE }, { "yscale", T_YSCALE }, + { "specpower", T_SPECPOWER }, + { "specfactor", T_SPECFACTOR }, { "nocompress", T_NOCOMPRESS }, { "nodownsize", T_NODOWNSIZE }, }; @@ -385,7 +387,7 @@ static int32_t defsparser(scriptfile *script) else Bfree(tfn); pathsearchmode = i; - hicsetsubsttex(tile,pal,fn,-1.0,1.0,1.0,0); + hicsetsubsttex(tile,pal,fn,-1.0,1.0,1.0,1.0,1.0,0); } break; case T_DEFINESKYBOX: @@ -1530,7 +1532,7 @@ static int32_t defsparser(scriptfile *script) char *paltokptr = script->ltextptr, *palend; int32_t pal=-1, i; char *fn = NULL, *tfn = NULL; - double alphacut = -1.0, xscale = 1.0, yscale = 1.0; + double alphacut = -1.0, xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0; char flags = 0; if (scriptfile_getsymbol(script,&pal)) break; @@ -1547,6 +1549,10 @@ static int32_t defsparser(scriptfile *script) scriptfile_getdouble(script,&xscale); break; case T_YSCALE: scriptfile_getdouble(script,&yscale); break; + case T_SPECPOWER: + scriptfile_getdouble(script,&specpower); break; + case T_SPECFACTOR: + scriptfile_getdouble(script,&specfactor); break; case T_NOCOMPRESS: flags |= 1; break; case T_NODOWNSIZE: @@ -1590,7 +1596,7 @@ static int32_t defsparser(scriptfile *script) xscale = 1.0f / xscale; yscale = 1.0f / yscale; - hicsetsubsttex(tile,pal,fn,alphacut,xscale,yscale,flags); + hicsetsubsttex(tile,pal,fn,alphacut,xscale,yscale, specpower, specfactor,flags); fnB=fn; alphacutB=alphacut; xscaleB=xscale; yscaleB=yscale; flagsB=flags; if (pal<30)palbits|=1<alphacut = min(alphacut,1.0); hrn->xscale = xscale; hrn->yscale = yscale; + hrn->specpower = specpower; + hrn->specfactor = specfactor; hrn->flags = flags; if (hr == NULL) { diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index 6b4ad586c..7424b2ef8 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -132,7 +132,6 @@ GLfloat shadowBias[] = 0.5, 0.5, 0.5, 1.0 }; - // MATERIALS _prprogrambit prprogrambits[PR_BIT_COUNT] = { { @@ -259,6 +258,19 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { " result *= vec4(gl_Color);\n" "\n", }, + { + 1 << PR_BIT_SPECULAR_MATERIAL, + // vert_def + "", + // vert_prog + "", + // frag_def + "uniform vec2 specMaterial;\n" + "\n", + // frag_prog + " specularMaterial = specMaterial;\n" + "\n", + }, { 1 << PR_BIT_MIRROR_MAP, // vert_def @@ -344,8 +356,8 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { " lightVector = gl_LightSource[0].ambient.rgb - vertexPos;\n" "\n" " if (isNormalMapped == 1) {\n" - " tangentSpaceLightVector = vec3(32376.0, -94.0, -32496.0) - vec3(curVertex);\n" - " tangentSpaceLightVector = TBN * tangentSpaceLightVector;\n" + " //tangentSpaceLightVector = vec3(32376.0, -94.0, -32496.0) - vec3(curVertex);\n" + " //tangentSpaceLightVector = TBN * tangentSpaceLightVector;\n" " } else\n" " vertexNormal = normalize(gl_NormalMatrix * curNormal);\n" "\n", @@ -395,7 +407,7 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { " gl_LightSource[0].diffuse.rgb * lightAttenuation * spotAttenuation;\n" " result += vec4(lightDiffuse * NdotL, 0.0);\n" "\n" - " lightSpecular = pow( max(dot(R, E), 0.0), 60.0) * 10.0;\n" + " lightSpecular = pow( max(dot(R, E), 0.0), specularMaterial.x) * specularMaterial.y;\n" " result += vec4(lightDiffuse * lightSpecular, 0.0);\n" "\n", }, @@ -427,6 +439,7 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { " vec3 spotVector;\n" " vec2 spotCosRadius;\n" " float shadowResult = 1;\n" + " vec2 specularMaterial = vec2(1.0, 1.0);\n" "\n", // frag_prog " gl_FragColor = result;\n" @@ -3037,6 +3050,8 @@ static void polymer_getscratchmaterial(_prmaterial* material) material->diffusemodulation[1] = material->diffusemodulation[2] = material->diffusemodulation[3] = 1.0f; + // PR_BIT_SPECULAR_MATERIAL + material->specmaterial[0] = material->specmaterial[1] = 1.0f; // PR_BIT_MIRROR_MAP material->mirrormap = 0; // PR_BIT_GLOW_MAP @@ -3114,6 +3129,13 @@ static void polymer_getbuildmaterial(_prmaterial* material, int16_t tile material->diffusemodulation[2] *= (float)hictinting[pal].b / 255.0; } + // PR_BIT_SPECULAR_MATERIAL + if (pth->hicr) + { + material->specmaterial[0] = pth->hicr->specpower; + material->specmaterial[1] = pth->hicr->specfactor; + } + // PR_BIT_GLOW_MAP if (r_fullbrights && pth && pth->flags & 16) material->glowmap = pth->ofb->glpic; @@ -3160,6 +3182,10 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int // PR_BIT_DIFFUSE_MODULATION programbits |= prprogrambits[PR_BIT_DIFFUSE_MODULATION].bit; + // PR_BIT_SPECULAR_MATERIAL + if ((material.specmaterial[0] != 1.0) || (material.specmaterial[1] != 1.0)) + programbits |= prprogrambits[PR_BIT_SPECULAR_MATERIAL].bit; + // PR_BIT_MIRROR_MAP if (!curlight && material.mirrormap) programbits |= prprogrambits[PR_BIT_MIRROR_MAP].bit; @@ -3264,6 +3290,12 @@ static int32_t polymer_bindmaterial(_prmaterial material, char* lights, int material.diffusemodulation[3]); } + // PR_BIT_SPECULAR_MATERIAL + if (programbits & prprogrambits[PR_BIT_SPECULAR_MATERIAL].bit) + { + bglUniform2fvARB(prprograms[programbits].uniform_specMaterial, 1, material.specmaterial); + } + // PR_BIT_MIRROR_MAP if (programbits & prprogrambits[PR_BIT_MIRROR_MAP].bit) { @@ -3496,6 +3528,12 @@ static void polymer_compileprogram(int32_t programbits) prprograms[programbits].uniform_detailScale = bglGetUniformLocationARB(program, "detailScale"); } + // PR_BIT_SPECULAR_MATERIAL + if (programbits & prprogrambits[PR_BIT_SPECULAR_MATERIAL].bit) + { + prprograms[programbits].uniform_specMaterial = bglGetUniformLocationARB(program, "specMaterial"); + } + // PR_BIT_MIRROR_MAP if (programbits & prprogrambits[PR_BIT_MIRROR_MAP].bit) {