Boxlights
This commit is contained in:
parent
a72f031c41
commit
8d10a9b3a3
1 changed files with 76 additions and 32 deletions
108
gl_bumpgf.c
108
gl_bumpgf.c
|
@ -34,6 +34,8 @@ If a light has a cubemap filter it requires 3 passes
|
||||||
#include "quakedef.h"
|
#include "quakedef.h"
|
||||||
#include "nvparse/nvparse.h"
|
#include "nvparse/nvparse.h"
|
||||||
|
|
||||||
|
//#define DELUX_DEBUG
|
||||||
|
|
||||||
//<AWE> "diffuse_program_object" has to be defined static. Otherwise nameclash with "gl_bumpradeon.c".
|
//<AWE> "diffuse_program_object" has to be defined static. Otherwise nameclash with "gl_bumpradeon.c".
|
||||||
static GLuint diffuse_program_object;
|
static GLuint diffuse_program_object;
|
||||||
static GLuint specularalias_program_object; //He he nice name to type a lot
|
static GLuint specularalias_program_object; //He he nice name to type a lot
|
||||||
|
@ -46,8 +48,6 @@ Pixel shader for diffuse bump mapping does diffuse bumpmapping with norm cube, s
|
||||||
*/
|
*/
|
||||||
void GL_EnableDiffuseShaderGF3(const transform_t *tr, vec3_t lightOrig) {
|
void GL_EnableDiffuseShaderGF3(const transform_t *tr, vec3_t lightOrig) {
|
||||||
|
|
||||||
float invrad = 1/currentshadowlight->radius;
|
|
||||||
|
|
||||||
//tex 0 = normal map
|
//tex 0 = normal map
|
||||||
//tex 1 = nomalization cube map (tangent space light vector)
|
//tex 1 = nomalization cube map (tangent space light vector)
|
||||||
//tex 2 = color map
|
//tex 2 = color map
|
||||||
|
@ -75,7 +75,13 @@ void GL_EnableDiffuseShaderGF3(const transform_t *tr, vec3_t lightOrig) {
|
||||||
|
|
||||||
glTranslatef(0.5,0.5,0.5);
|
glTranslatef(0.5,0.5,0.5);
|
||||||
glScalef(0.5,0.5,0.5);
|
glScalef(0.5,0.5,0.5);
|
||||||
glScalef(invrad, invrad, invrad);
|
glScalef(1.0f/(currentshadowlight->radiusv[0]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[1]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[2]));
|
||||||
|
|
||||||
|
/*glScalef(1/currentshadowlight->radius,
|
||||||
|
1/currentshadowlight->radius,1/currentshadowlight->radius);
|
||||||
|
*/
|
||||||
glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
|
glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +181,7 @@ void GL_DisableDiffuseShaderGF3() {
|
||||||
glDisable( GL_VERTEX_PROGRAM_NV );
|
glDisable( GL_VERTEX_PROGRAM_NV );
|
||||||
}
|
}
|
||||||
|
|
||||||
void GL_EnableSpecularShaderGF3(const transform_t *tr, vec3_t lightOrig, qboolean alias) {
|
void GL_EnableSpecularShaderGF3(const transform_t *tr, vec3_t lightOrig, qboolean alias, qboolean packedGloss) {
|
||||||
|
|
||||||
vec3_t scaler = {0.5f, 0.5f, 0.5f};
|
vec3_t scaler = {0.5f, 0.5f, 0.5f};
|
||||||
float invrad = 1/currentshadowlight->radius;
|
float invrad = 1/currentshadowlight->radius;
|
||||||
|
@ -209,7 +215,11 @@ void GL_EnableSpecularShaderGF3(const transform_t *tr, vec3_t lightOrig, qboolea
|
||||||
|
|
||||||
glTranslatef(0.5,0.5,0.5);
|
glTranslatef(0.5,0.5,0.5);
|
||||||
glScalef(0.5,0.5,0.5);
|
glScalef(0.5,0.5,0.5);
|
||||||
glScalef(invrad, invrad, invrad);
|
//glScalef(invrad, invrad, invrad);
|
||||||
|
glScalef(1.0f/(currentshadowlight->radiusv[0]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[1]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[2]));
|
||||||
|
|
||||||
glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
|
glTranslatef(-lightOrig[0], -lightOrig[1], -lightOrig[2]);
|
||||||
|
|
||||||
|
|
||||||
|
@ -226,7 +236,12 @@ void GL_EnableSpecularShaderGF3(const transform_t *tr, vec3_t lightOrig, qboolea
|
||||||
// (gloss map = C) mul (light filter = D) save in Spare1 RGB
|
// (gloss map = C) mul (light filter = D) save in Spare1 RGB
|
||||||
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB);
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_EXPAND_NORMAL_NV, GL_RGB);
|
||||||
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB);
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_RGB);
|
||||||
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV , GL_ALPHA);
|
|
||||||
|
if (packedGloss)
|
||||||
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV , GL_ALPHA);
|
||||||
|
else
|
||||||
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV , GL_RGB);
|
||||||
|
|
||||||
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV , GL_RGB);
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_TEXTURE3_ARB, GL_UNSIGNED_IDENTITY_NV , GL_RGB);
|
||||||
qglCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE);
|
qglCombinerOutputNV(GL_COMBINER0_NV, GL_RGB, GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE);
|
||||||
|
|
||||||
|
@ -320,12 +335,16 @@ Same as GL_DisableDiffuseShaderGF3()
|
||||||
void GL_EnableAttentShaderGF3(vec3_t lightOrig) {
|
void GL_EnableAttentShaderGF3(vec3_t lightOrig) {
|
||||||
|
|
||||||
float invrad = 1/currentshadowlight->radius;
|
float invrad = 1/currentshadowlight->radius;
|
||||||
|
|
||||||
|
GL_SelectTexture(GL_TEXTURE0_ARB);
|
||||||
glMatrixMode(GL_TEXTURE);
|
glMatrixMode(GL_TEXTURE);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glTranslatef(0.5,0.5,0.5);
|
glTranslatef(0.5,0.5,0.5);
|
||||||
glScalef(0.5,0.5,0.5);
|
glScalef(0.5,0.5,0.5);
|
||||||
glScalef(invrad, invrad, invrad);
|
glScalef(1.0f/(currentshadowlight->radiusv[0]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[1]),
|
||||||
|
1.0f/(currentshadowlight->radiusv[2]));
|
||||||
glTranslatef(-lightOrig[0],
|
glTranslatef(-lightOrig[0],
|
||||||
-lightOrig[1],
|
-lightOrig[1],
|
||||||
-lightOrig[2]);
|
-lightOrig[2]);
|
||||||
|
@ -532,29 +551,30 @@ void GF3_drawTriangleListBump (const vertexdef_t *verts, int *indecies, int numI
|
||||||
}
|
}
|
||||||
glColor3fv(¤tshadowlight->color[0]);
|
glColor3fv(¤tshadowlight->color[0]);
|
||||||
|
|
||||||
GL_EnableSpecularShaderGF3(tr,currentshadowlight->origin,true);
|
if ((shader->numglossstages > 0) && (shader->numbumpstages > 0)) {
|
||||||
//bind the correct texture
|
GL_EnableSpecularShaderGF3(tr,currentshadowlight->origin,true,(shader->glossstages[0].type == STAGE_GRAYGLOSS));
|
||||||
GL_SelectTexture(GL_TEXTURE0_ARB);
|
//bind the correct texture
|
||||||
if (shader->numbumpstages > 0)
|
GL_SelectTexture(GL_TEXTURE0_ARB);
|
||||||
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
||||||
GL_SelectTexture(GL_TEXTURE2_ARB);
|
|
||||||
if (shader->numcolorstages > 0)
|
|
||||||
GL_BindAdvanced(shader->colorstages[0].texture[0]);
|
|
||||||
|
|
||||||
GF3_sendTriangleListTA(verts,indecies,numIndecies);
|
GL_SelectTexture(GL_TEXTURE2_ARB);
|
||||||
GL_DisableDiffuseShaderGF3();
|
GL_BindAdvanced(shader->glossstages[0].texture[0]);
|
||||||
|
|
||||||
GL_EnableDiffuseShaderGF3(tr,currentshadowlight->origin);
|
GF3_sendTriangleListTA(verts,indecies,numIndecies);
|
||||||
//bind the correct texture
|
GL_DisableDiffuseShaderGF3();
|
||||||
GL_SelectTexture(GL_TEXTURE0_ARB);
|
}
|
||||||
if (shader->numbumpstages > 0)
|
|
||||||
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
|
||||||
GL_SelectTexture(GL_TEXTURE2_ARB);
|
|
||||||
if (shader->numcolorstages > 0)
|
|
||||||
GL_BindAdvanced(shader->colorstages[0].texture[0]);
|
|
||||||
|
|
||||||
GF3_sendTriangleListTA(verts,indecies,numIndecies);
|
if ((shader->numcolorstages > 0) && (shader->numbumpstages > 0)) {
|
||||||
GL_DisableDiffuseShaderGF3();
|
GL_EnableDiffuseShaderGF3(tr,currentshadowlight->origin);
|
||||||
|
//bind the correct texture
|
||||||
|
GL_SelectTexture(GL_TEXTURE0_ARB);
|
||||||
|
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
||||||
|
GL_SelectTexture(GL_TEXTURE2_ARB);
|
||||||
|
GL_BindAdvanced(shader->colorstages[0].texture[0]);
|
||||||
|
|
||||||
|
GF3_sendTriangleListTA(verts,indecies,numIndecies);
|
||||||
|
GL_DisableDiffuseShaderGF3();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GF3_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, int lightmapIndex) {
|
void GF3_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecies, shader_t *shader, int lightmapIndex) {
|
||||||
|
@ -639,7 +659,9 @@ void GF3_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecie
|
||||||
qglBindProgramNV( GL_VERTEX_PROGRAM_NV, delux_program_object );
|
qglBindProgramNV( GL_VERTEX_PROGRAM_NV, delux_program_object );
|
||||||
glEnable( GL_VERTEX_PROGRAM_NV );
|
glEnable( GL_VERTEX_PROGRAM_NV );
|
||||||
|
|
||||||
|
#ifndef DELUX_DEBUG
|
||||||
glColorMask(false, false, false, true);
|
glColorMask(false, false, false, true);
|
||||||
|
#endif
|
||||||
glDrawElements(GL_TRIANGLES,numIndecies,GL_UNSIGNED_INT,indecies);
|
glDrawElements(GL_TRIANGLES,numIndecies,GL_UNSIGNED_INT,indecies);
|
||||||
glColorMask(true, true, true, true);
|
glColorMask(true, true, true, true);
|
||||||
|
|
||||||
|
@ -718,7 +740,9 @@ void GF3_drawTriangleListBase (vertexdef_t *verts, int *indecies, int numIndecie
|
||||||
|
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
|
|
||||||
|
#ifndef DELUX_DEBUG
|
||||||
glDrawElements(GL_TRIANGLES,numIndecies,GL_UNSIGNED_INT,indecies);
|
glDrawElements(GL_TRIANGLES,numIndecies,GL_UNSIGNED_INT,indecies);
|
||||||
|
#endif
|
||||||
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
qglClientActiveTextureARB(GL_TEXTURE0_ARB);
|
qglClientActiveTextureARB(GL_TEXTURE0_ARB);
|
||||||
|
@ -918,7 +942,9 @@ void GF3_drawSurfaceListBase (vertexdef_t *verts, msurface_t **surfs, int numSur
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
//glBlendFunc(GL_ONE, GL_ONE);
|
//glBlendFunc(GL_ONE, GL_ONE);
|
||||||
|
|
||||||
|
#ifndef DELUX_DEBUG
|
||||||
glColorMask(false, false, false, true);
|
glColorMask(false, false, false, true);
|
||||||
|
#endif
|
||||||
//glClear(GL_COLOR_BUFFER_BIT);
|
//glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
GL_SelectTexture(GL_TEXTURE2_ARB);
|
GL_SelectTexture(GL_TEXTURE2_ARB);
|
||||||
|
@ -1024,7 +1050,9 @@ void GF3_drawSurfaceListBase (vertexdef_t *verts, msurface_t **surfs, int numSur
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
glColor3f(sh_lightmapbright.value,sh_lightmapbright.value,sh_lightmapbright.value);
|
glColor3f(sh_lightmapbright.value,sh_lightmapbright.value,sh_lightmapbright.value);
|
||||||
|
|
||||||
|
#ifndef DELUX_DEBUG
|
||||||
GF3_sendSurfacesBase(surfs, numSurfaces, true);
|
GF3_sendSurfacesBase(surfs, numSurfaces, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
GL_DisableMultitexture();
|
GL_DisableMultitexture();
|
||||||
|
@ -1043,7 +1071,7 @@ void GF3_drawSurfaceListBase (vertexdef_t *verts, msurface_t **surfs, int numSur
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GF3_sendSurfacesTA(msurface_t **surfs, int numSurfaces) {
|
void GF3_sendSurfacesTA(msurface_t **surfs, int numSurfaces, qboolean bindSpecular) {
|
||||||
int i,j;
|
int i,j;
|
||||||
glpoly_t *p;
|
glpoly_t *p;
|
||||||
msurface_t *surf;
|
msurface_t *surf;
|
||||||
|
@ -1058,7 +1086,7 @@ void GF3_sendSurfacesTA(msurface_t **surfs, int numSurfaces) {
|
||||||
if (surf->visframe != r_framecount)
|
if (surf->visframe != r_framecount)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(surf->flags & SURF_PPLIGHT))
|
if (!(surf->flags & SURF_BUMP))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
p = surf->polys;
|
p = surf->polys;
|
||||||
|
@ -1080,9 +1108,24 @@ void GF3_sendSurfacesTA(msurface_t **surfs, int numSurfaces) {
|
||||||
GL_SelectTexture(GL_TEXTURE0_ARB);
|
GL_SelectTexture(GL_TEXTURE0_ARB);
|
||||||
if (shader->numbumpstages > 0)
|
if (shader->numbumpstages > 0)
|
||||||
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
GL_BindAdvanced(shader->bumpstages[0].texture[0]);
|
||||||
|
|
||||||
GL_SelectTexture(GL_TEXTURE2_ARB);
|
GL_SelectTexture(GL_TEXTURE2_ARB);
|
||||||
|
if (!bindSpecular) {
|
||||||
if (shader->numcolorstages > 0)
|
if (shader->numcolorstages > 0)
|
||||||
GL_BindAdvanced(shader->colorstages[0].texture[0]);
|
GL_BindAdvanced(shader->colorstages[0].texture[0]);
|
||||||
|
} else {
|
||||||
|
if (shader->numglossstages > 0) {
|
||||||
|
|
||||||
|
if (shader->glossstages[0].type == STAGE_GRAYGLOSS) {
|
||||||
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV , GL_ALPHA);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qglCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_UNSIGNED_IDENTITY_NV , GL_RGB);
|
||||||
|
GL_BindAdvanced(shader->glossstages[0].texture[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
lastshader = shader;
|
lastshader = shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1182,14 +1225,15 @@ void GF3_drawSurfaceListBump (vertexdef_t *verts, msurface_t **surfs, int numSur
|
||||||
}
|
}
|
||||||
glColor3fv(¤tshadowlight->color[0]);
|
glColor3fv(¤tshadowlight->color[0]);
|
||||||
|
|
||||||
GL_EnableSpecularShaderGF3(tr,currentshadowlight->origin,true);
|
|
||||||
|
GL_EnableSpecularShaderGF3(tr,currentshadowlight->origin,true,true);
|
||||||
|
|
||||||
glTexCoordPointer(2, GL_FLOAT, verts->texcoordstride, verts->texcoords);
|
glTexCoordPointer(2, GL_FLOAT, verts->texcoordstride, verts->texcoords);
|
||||||
GF3_sendSurfacesTA(surfs,numSurfaces);
|
GF3_sendSurfacesTA(surfs,numSurfaces, true);
|
||||||
GL_DisableDiffuseShaderGF3();
|
GL_DisableDiffuseShaderGF3();
|
||||||
|
|
||||||
GL_EnableDiffuseShaderGF3(tr,currentshadowlight->origin);
|
GL_EnableDiffuseShaderGF3(tr,currentshadowlight->origin);
|
||||||
GF3_sendSurfacesTA(surfs,numSurfaces);
|
GF3_sendSurfacesTA(surfs,numSurfaces, false);
|
||||||
GL_DisableDiffuseShaderGF3();
|
GL_DisableDiffuseShaderGF3();
|
||||||
|
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
|
Loading…
Reference in a new issue