Skip to content

Commit

Permalink
Pack lightmap coordinates into two vertex attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
viciious committed Apr 25, 2014
1 parent f37a086 commit c029ea2
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 118 deletions.
37 changes: 17 additions & 20 deletions glsl/defaultMaterial.glsl
Expand Up @@ -18,7 +18,10 @@

qf_varying vec2 v_TexCoord;
#ifdef NUM_LIGHTMAPS
qf_varying vec2 v_LightmapTexCoord[NUM_LIGHTMAPS];
qf_varying qf_lmvec01 v_LightmapTexCoord01;
#if NUM_LIGHTMAPS > 2
qf_varying qf_lmvec23 v_LightmapTexCoord23;
#endif
#endif

qf_varying vec3 v_Position;
Expand Down Expand Up @@ -66,16 +69,10 @@ void main()
v_TexCoord = TextureMatrix2x3Mul(u_TextureMatrix, TexCoord);

#ifdef NUM_LIGHTMAPS
v_LightmapTexCoord[0] = a_LightmapCoord0;
#if NUM_LIGHTMAPS >= 2
v_LightmapTexCoord[1] = a_LightmapCoord1;
#if NUM_LIGHTMAPS >= 3
v_LightmapTexCoord[2] = a_LightmapCoord2;
#if NUM_LIGHTMAPS >= 4
v_LightmapTexCoord[3] = a_LightmapCoord3;
#endif // NUM_LIGHTMAPS >= 4
#endif // NUM_LIGHTMAPS >= 3
#endif // NUM_LIGHTMAPS >= 2
v_LightmapTexCoord01 = a_LightmapCoord01;
#if NUM_LIGHTMAPS > 2
v_LightmapTexCoord23 = a_LightmapCoord23;
#endif // NUM_LIGHTMAPS > 2
#endif // NUM_LIGHTMAPS

v_StrMatrix[0] = Tangent;
Expand Down Expand Up @@ -268,19 +265,19 @@ void main()

#ifdef NUM_LIGHTMAPS
// get light normal
diffuseNormalModelspace = normalize(myhalf3 (qf_texture(u_LightmapTexture[0], vec2(v_LightmapTexCoord[0].s+u_DeluxemapOffset[0],v_LightmapTexCoord[0].t))) - myhalf3 (0.5));
diffuseNormalModelspace = normalize(myhalf3 (qf_texture(u_LightmapTexture[0], v_LightmapTexCoord01.st+vec2(u_DeluxemapOffset[0], 0.0))) - myhalf3 (0.5));
// calculate directional shading
diffuseProduct = float (dot (surfaceNormalModelspace, diffuseNormalModelspace));

#ifdef APPLY_FBLIGHTMAP
weightedDiffuseNormalModelspace = diffuseNormalModelspace;
// apply lightmap color
color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (qf_texture (u_LightmapTexture[0], v_LightmapTexCoord[0])));
color.rgb += myhalf3 (max (diffuseProduct, 0.0) * myhalf3 (qf_texture (u_LightmapTexture[0], v_LightmapTexCoord01.st)));
#else
#define NORMALIZE_DIFFUSE_NORMAL
weightedDiffuseNormalModelspace = u_LightstyleColor[0] * diffuseNormalModelspace;
// apply lightmap color
color.rgb += u_LightstyleColor[0] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[0], v_LightmapTexCoord[0]));
color.rgb += u_LightstyleColor[0] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[0], v_LightmapTexCoord01.st));
#endif // APPLY_FBLIGHTMAP

#ifdef APPLY_AMBIENT_COMPENSATION
Expand All @@ -289,20 +286,20 @@ void main()
#endif

#if NUM_LIGHTMAPS >= 2
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[1], vec2(v_LightmapTexCoord[1].s+u_DeluxemapOffset[1],v_LightmapTexCoord[1].t))) - myhalf3 (0.5));
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[1], v_LightmapTexCoord01.pq+vec2(u_DeluxemapOffset[1],0.0))) - myhalf3 (0.5));
diffuseProduct = float (dot (surfaceNormalModelspace, diffuseNormalModelspace));
weightedDiffuseNormalModelspace += u_LightstyleColor[1] * diffuseNormalModelspace;
color.rgb += u_LightstyleColor[1] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[1], v_LightmapTexCoord[1]));
color.rgb += u_LightstyleColor[1] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[1], v_LightmapTexCoord01.pq));
#if NUM_LIGHTMAPS >= 3
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[2], vec2(v_LightmapTexCoord[2].s+u_DeluxemapOffset[2],v_LightmapTexCoord[2].t))) - myhalf3 (0.5));
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[2], v_LightmapTexCoord23.st+vec2(u_DeluxemapOffset[2],0.0))) - myhalf3 (0.5));
diffuseProduct = float (dot (surfaceNormalModelspace, diffuseNormalModelspace));
weightedDiffuseNormalModelspace += u_LightstyleColor[2] * diffuseNormalModelspace;
color.rgb += u_LightstyleColor[2] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[2], v_LightmapTexCoord[2]));
color.rgb += u_LightstyleColor[2] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[2], v_LightmapTexCoord23.st));
#if NUM_LIGHTMAPS >= 4
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[3], vec2(v_LightmapTexCoord[3].s+u_DeluxemapOffset[3],v_LightmapTexCoord[3].t))) - myhalf3 (0.5));
diffuseNormalModelspace = normalize(myhalf3 (qf_texture (u_LightmapTexture[3], v_LightmapTexCoord23.pq+vec2(u_DeluxemapOffset[3],0.0))) - myhalf3 (0.5));
diffuseProduct = float (dot (surfaceNormalModelspace, diffuseNormalModelspace));
weightedDiffuseNormalModelspace += u_LightstyleColor[3] * diffuseNormalModelspace;
color.rgb += u_LightstyleColor[3] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[3], v_LightmapTexCoord[3]));
color.rgb += u_LightstyleColor[3] * myhalf(max (diffuseProduct, 0.0)) * myhalf3 (qf_texture(u_LightmapTexture[3], v_LightmapTexCoord23.pq));
#endif // NUM_LIGHTMAPS >= 4
#endif // NUM_LIGHTMAPS >= 3
#endif // NUM_LIGHTMAPS >= 2
Expand Down
27 changes: 12 additions & 15 deletions glsl/defaultQ3AShader.glsl
Expand Up @@ -34,7 +34,10 @@ qf_varying vec2 v_TexCoord;
#endif

#ifdef NUM_LIGHTMAPS
qf_varying vec2 v_LightmapTexCoord[NUM_LIGHTMAPS];
qf_varying qf_lmvec01 v_LightmapTexCoord01;
#if NUM_LIGHTMAPS > 2
qf_varying qf_lmvec23 v_LightmapTexCoord23;
#endif
#endif

#if defined(APPLY_FOG) && !defined(APPLY_FOG_COLOR)
Expand Down Expand Up @@ -104,16 +107,10 @@ void main(void)
#endif

#ifdef NUM_LIGHTMAPS
v_LightmapTexCoord[0] = a_LightmapCoord0;
#if NUM_LIGHTMAPS >= 2
v_LightmapTexCoord[1] = a_LightmapCoord1;
#if NUM_LIGHTMAPS >= 3
v_LightmapTexCoord[2] = a_LightmapCoord2;
#if NUM_LIGHTMAPS >= 4
v_LightmapTexCoord[3] = a_LightmapCoord3;
#endif // NUM_LIGHTMAPS >= 4
#endif // NUM_LIGHTMAPS >= 3
#endif // NUM_LIGHTMAPS >= 2
v_LightmapTexCoord01 = a_LightmapCoord01;
#if NUM_LIGHTMAPS > 2
v_LightmapTexCoord23 = a_LightmapCoord23;
#endif // NUM_LIGHTMAPS > 2
#endif // NUM_LIGHTMAPS

gl_Position = u_ModelViewProjectionMatrix * Position;
Expand Down Expand Up @@ -157,13 +154,13 @@ void main(void)

#ifdef NUM_LIGHTMAPS
color = myhalf4(0.0, 0.0, 0.0, qf_FrontColor.a);
color.rgb += myhalf3(qf_texture(u_LightmapTexture[0], v_LightmapTexCoord[0])) * u_LightstyleColor[0];
color.rgb += myhalf3(qf_texture(u_LightmapTexture[0], v_LightmapTexCoord01.st)) * u_LightstyleColor[0];
#if NUM_LIGHTMAPS >= 2
color.rgb += myhalf3(qf_texture(u_LightmapTexture[1], v_LightmapTexCoord[1])) * u_LightstyleColor[1];
color.rgb += myhalf3(qf_texture(u_LightmapTexture[1], v_LightmapTexCoord01.pq)) * u_LightstyleColor[1];
#if NUM_LIGHTMAPS >= 3
color.rgb += myhalf3(qf_texture(u_LightmapTexture[2], v_LightmapTexCoord[2])) * u_LightstyleColor[2];
color.rgb += myhalf3(qf_texture(u_LightmapTexture[2], v_LightmapTexCoord23.st)) * u_LightstyleColor[2];
#if NUM_LIGHTMAPS >= 4
color.rgb += myhalf3(qf_texture(u_LightmapTexture[3], v_LightmapTexCoord[3])) * u_LightstyleColor[3];
color.rgb += myhalf3(qf_texture(u_LightmapTexture[3], v_LightmapTexCoord23.pq)) * u_LightstyleColor[3];
#endif // NUM_LIGHTMAPS >= 4
#endif // NUM_LIGHTMAPS >= 3
#endif // NUM_LIGHTMAPS >= 2
Expand Down
11 changes: 9 additions & 2 deletions glsl/include/attributes.glsl
@@ -1,8 +1,15 @@
#ifdef VERTEX_SHADER

qf_attribute vec4 a_Position;
qf_attribute vec4 a_SVector;
qf_attribute vec4 a_Normal;
qf_attribute vec4 a_Color;
qf_attribute vec2 a_TexCoord;
qf_attribute vec2 a_LightmapCoord0, a_LightmapCoord1, a_LightmapCoord2, a_LightmapCoord3;
#endif
# ifdef NUM_LIGHTMAPS
qf_attribute qf_lmvec01 a_LightmapCoord01;
# if NUM_LIGHTMAPS > 2
qf_attribute qf_lmvec23 a_LightmapCoord23;
# endif // NUM_LIGHTMAPS > 2
#endif // NUM_LIGHTMAPS

#endif // VERTEX_SHADER
35 changes: 17 additions & 18 deletions source/ref_gl/r_backend.c
Expand Up @@ -1031,7 +1031,6 @@ void RB_EndBatch( void )
*/
static void RB_EnableVertexAttribs( void )
{
int i;
vattribmask_t vattribs = rb.currentVAttribs;
mesh_vbo_t *vbo = rb.currentVBO;
vattribmask_t hfa = vbo->halfFloatAttribs;
Expand Down Expand Up @@ -1106,30 +1105,30 @@ static void RB_EnableVertexAttribs( void )
( const GLvoid * )vbo->bonesWeightsOffset );
}
else {
int i;
vattrib_t lmattr;
vattribbit_t lmattrbit;

GL_EnableVertexAttrib( VATTRIB_BONESINDICES, qfalse );
GL_EnableVertexAttrib( VATTRIB_BONESWEIGHTS, qfalse );

// lightmap texture coordinates
if( vattribs & VATTRIB_LMCOORDS0_BIT ) {
GL_EnableVertexAttrib( VATTRIB_LMCOORDS0, qtrue );
qglVertexAttribPointerARB( VATTRIB_LMCOORDS0, 2, FLOAT_VATTRIB_TYPE( VATTRIB_LMCOORDS0_BIT, hfa ), GL_FALSE, 0,
( const GLvoid * )vbo->lmstOffset[0] );
}
else {
GL_EnableVertexAttrib( VATTRIB_LMCOORDS0, qfalse );
}

for( i = 0; i < MAX_LIGHTMAPS-1; i++ ) {
vattribbit_t lmvattrib = ( vattribbit_t ) (VATTRIB_LMCOORDS1_BIT<<i);

if( vattribs & lmvattrib ) {
GL_EnableVertexAttrib( VATTRIB_LMCOORDS1+i, qtrue );
qglVertexAttribPointerARB( VATTRIB_LMCOORDS1+i, 2, FLOAT_VATTRIB_TYPE( lmvattrib, hfa ), GL_FALSE, 0,
( const GLvoid * )vbo->lmstOffset[i+1] );
lmattr = VATTRIB_LMCOORDS01;
lmattrbit = VATTRIB_LMCOORDS0_BIT;

for( i = 0; i < MAX_LIGHTMAPS/2; i++ ) {
if( vattribs & lmattrbit ) {
GL_EnableVertexAttrib( lmattr, qtrue );
qglVertexAttribPointerARB( lmattr, vbo->lmstSize[i],
FLOAT_VATTRIB_TYPE( VATTRIB_LMCOORDS0_BIT, hfa ),
GL_FALSE, 0, ( const GLvoid * )vbo->lmstOffset[i] );
}
else {
GL_EnableVertexAttrib( VATTRIB_LMCOORDS1+i, qfalse );
GL_EnableVertexAttrib( lmattr, qfalse );
}

lmattr++;
lmattrbit <<= 2;
}
}

Expand Down
3 changes: 2 additions & 1 deletion source/ref_gl/r_local.h
Expand Up @@ -731,7 +731,8 @@ typedef struct mesh_vbo_s
size_t normalsOffset;
size_t sVectorsOffset;
size_t stOffset;
size_t lmstOffset[MAX_LIGHTMAPS];
size_t lmstOffset[MAX_LIGHTMAPS/2];
size_t lmstSize[MAX_LIGHTMAPS/2];
size_t colorsOffset[MAX_LIGHTMAPS];
size_t bonesIndicesOffset;
size_t bonesWeightsOffset;
Expand Down
22 changes: 10 additions & 12 deletions source/ref_gl/r_program.c
Expand Up @@ -448,10 +448,10 @@ static const glsl_feature_t glsl_features_material[] =
{ GLSL_SHADER_COMMON_INSTANCED_ATTRIB_TRASNFORMS, "#define APPLY_INSTANCED_TRANSFORMS\n"
"#define APPLY_INSTANCED_ATTRIB_TRASNFORMS\n", "_instanced_va" },

{ GLSL_SHADER_MATERIAL_LIGHTSTYLE3, "#define NUM_LIGHTMAPS 4\n", "_ls3" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE2, "#define NUM_LIGHTMAPS 3\n", "_ls2" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE1, "#define NUM_LIGHTMAPS 2\n", "_ls1" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE0, "#define NUM_LIGHTMAPS 1\n", "_ls0" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE3, "#define NUM_LIGHTMAPS 4\n#define qf_lmvec23 vec4\n", "_ls3" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE2, "#define NUM_LIGHTMAPS 3\n#define qf_lmvec23 vec2\n", "_ls2" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE1, "#define NUM_LIGHTMAPS 2\n#define qf_lmvec01 vec4\n", "_ls1" },
{ GLSL_SHADER_MATERIAL_LIGHTSTYLE0, "#define NUM_LIGHTMAPS 1\n#define qf_lmvec01 vec2\n", "_ls0" },
{ GLSL_SHADER_MATERIAL_FB_LIGHTMAP, "#define APPLY_FBLIGHTMAP\n", "_fb" },
{ GLSL_SHADER_MATERIAL_DIRECTIONAL_LIGHT, "#define APPLY_DIRECTIONAL_LIGHT\n", "_dirlight" },

Expand Down Expand Up @@ -615,10 +615,10 @@ static const glsl_feature_t glsl_features_q3a[] =
{ GLSL_SHADER_Q3_TC_GEN_ENV, "#define APPLY_TC_GEN_ENV\n", "_tc_env" },
{ GLSL_SHADER_Q3_TC_GEN_VECTOR, "#define APPLY_TC_GEN_VECTOR\n", "_tc_vec" },

{ GLSL_SHADER_Q3_LIGHTSTYLE3, "#define NUM_LIGHTMAPS 4\n", "_ls3" },
{ GLSL_SHADER_Q3_LIGHTSTYLE2, "#define NUM_LIGHTMAPS 3\n", "_ls2" },
{ GLSL_SHADER_Q3_LIGHTSTYLE1, "#define NUM_LIGHTMAPS 2\n", "_ls1" },
{ GLSL_SHADER_Q3_LIGHTSTYLE0, "#define NUM_LIGHTMAPS 1\n", "_ls0" },
{ GLSL_SHADER_Q3_LIGHTSTYLE3, "#define NUM_LIGHTMAPS 4\n#define qf_lmvec23 vec4\n", "_ls3" },
{ GLSL_SHADER_Q3_LIGHTSTYLE2, "#define NUM_LIGHTMAPS 3\n#define qf_lmvec23 vec2\n", "_ls2" },
{ GLSL_SHADER_Q3_LIGHTSTYLE1, "#define NUM_LIGHTMAPS 2\n#define qf_lmvec01 vec4\n", "_ls1" },
{ GLSL_SHADER_Q3_LIGHTSTYLE0, "#define NUM_LIGHTMAPS 1\n#define qf_lmvec01 vec2\n", "_ls0" },

{ 0, NULL, NULL }
};
Expand Down Expand Up @@ -2203,10 +2203,8 @@ static void RF_BindAttrbibutesLocations( glsl_program_t *program )
qglBindAttribLocationARB( program->object, VATTRIB_BONESINDICES, "a_BonesIndices" );
qglBindAttribLocationARB( program->object, VATTRIB_BONESWEIGHTS, "a_BonesWeights" );

qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS0, "a_LightmapCoord0" );
qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS1, "a_LightmapCoord1" );
qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS2, "a_LightmapCoord2" );
qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS3, "a_LightmapCoord3" );
qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS01, "a_LightmapCoord01" );
qglBindAttribLocationARB( program->object, VATTRIB_LMCOORDS23, "a_LightmapCoord23" );

qglBindAttribLocationARB( program->object, VATTRIB_COLOR1, "a_Color1" );
qglBindAttribLocationARB( program->object, VATTRIB_COLOR2, "a_Color2" );
Expand Down
12 changes: 5 additions & 7 deletions source/ref_gl/r_vattribs.h
Expand Up @@ -41,15 +41,13 @@ typedef enum vattrib_e
VATTRIB_COLOR2 = 7,
VATTRIB_COLOR3 = 8,

VATTRIB_LMCOORDS0 = 6,
VATTRIB_LMCOORDS1 = 7,
VATTRIB_LMCOORDS2 = 8,
VATTRIB_LMCOORDS3 = 9,
VATTRIB_LMCOORDS01 = 6,
VATTRIB_LMCOORDS23 = 7,

VATTRIB_INSTANCE_QUAT = 10,
VATTRIB_INSTANCE_XYZS = 11,
VATTRIB_INSTANCE_QUAT = 8,
VATTRIB_INSTANCE_XYZS = 9,

NUM_VERTEX_ATTRIBS = 12
NUM_VERTEX_ATTRIBS = 10
} vattrib_t;

#define VATTRIB_BIT(va) (1<<(va))
Expand Down

0 comments on commit c029ea2

Please sign in to comment.