This is a cross between raven's light direction envmap code and q3's default spheremap for models. Makes sure the model used actually has a light direction aswell. This allows models' envmaps to be modified by BOTH lightdirection AND viewpoint, creating a very nice specular effect. I find it to be better than raven's simple implementation, but then again I may be biased.
Should be easy to figure out where this goes in the code.
if(backEnd.currentEntity && backEnd.currentEntity->e.hModel
&& (backEnd.currentEntity->lightDir[0]
|| backEnd.currentEntity->lightDir[1]
|| backEnd.currentEntity->lightDir[2])){ // to prevent faulty things from trying to use this
hasLightDir = qtrue;
}
if(backEnd.currentEntity && backEnd.currentEntity->e.hModel
&& hasLightDir){
for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 )
{// specular envmap
VectorSubtract (backEnd.or.viewOrigin, v, viewer);
VectorNormalizeFast (viewer);
d = DotProduct (normal, viewer);
reflected[0] = normal[0]*2*d - (viewer[0] + backEnd.currentEntity->lightDir[0]);
reflected[1] = normal[1]*2*d - (viewer[1] + backEnd.currentEntity->lightDir[1]);
reflected[2] = normal[2]*2*d - (viewer[2] + backEnd.currentEntity->lightDir[2]);
st[0] = 0.5 + reflected[1] * 0.5;
st[1] = 0.5 - reflected[2] * 0.5;
}
}
else{
for (i = 0 ; i < tess.numVertexes ; i++, v += 4, normal += 4, st += 2 )
{// normal envmap based on raven's setup
VectorSubtract (backEnd.or.viewOrigin, v, viewer);
VectorNormalizeFast (viewer);
d = DotProduct (normal, viewer);
reflected[0] = normal[0]*2*d - viewer[0];
reflected[1] = normal[1]*2*d - viewer[1];
reflected[2] = normal[2]*2*d - viewer[2];
st[0] = 0.5 + reflected[0] * 0.5;
st[1] = 0.5 - reflected[1] * 0.5;
}
}