1
0
Fork 0
forked from fte/fteqw

Fixed the shadow related bugs.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1071 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2005-06-04 01:58:17 +00:00
parent 45edf4631f
commit 87b0e0aa80

View file

@ -1822,21 +1822,13 @@ static void PPL_GenerateLightArrays(msurface_t *surf, vec3_t relativelightorigin
shadowlightfaces++; shadowlightfaces++;
// if (varray_vc + surf->mesh->numvertexes*3>MAXARRAYVERTS)
{
PPL_FlushArrays();
}
v = surf->mesh->xyz_array[0]; v = surf->mesh->xyz_array[0];
stw = surf->mesh->st_array[0]; stw = surf->mesh->st_array[0];
out = &varray_v[varray_vc]; out = &varray_v[0];
for (vi=0 ; vi<surf->mesh->numvertexes ; vi++, v+=4, stw+=2, out++) for (vi=0 ; vi<surf->mesh->numvertexes ; vi++, v+=3, stw+=2, out++)
{ {
out->xyz[0] = v[0];
out->xyz[1] = v[1];
out->xyz[2] = v[2];
out->stw[0] = stw[0]; out->stw[0] = stw[0];
out->stw[1] = stw[1]; out->stw[1] = stw[1];
lightdir[0] = relativelightorigin[0] - v[0]; lightdir[0] = relativelightorigin[0] - v[0];
@ -1851,14 +1843,11 @@ static void PPL_GenerateLightArrays(msurface_t *surf, vec3_t relativelightorigin
out->stl[2] = colour[2]*dist; out->stl[2] = colour[2]*dist;
out->ncm[0] = DotProduct(lightdir, surf->texinfo->vecs[0]); out->ncm[0] = DotProduct(lightdir, surf->texinfo->vecs[0]);
out->ncm[1] = -DotProduct(lightdir, surf->texinfo->vecs[1]); out->ncm[1] = -DotProduct(lightdir, surf->texinfo->vecs[1]);
out->ncm[2] = DotProduct(lightdir, surf->normal); if (surf->flags & SURF_PLANEBACK)
out->ncm[2] = -DotProduct(lightdir, surf->plane->normal);
else
out->ncm[2] = DotProduct(lightdir, surf->plane->normal);
} }
for (vi=0 ; vi<surf->mesh->numindexes ; vi++)
{
varray_i[varray_ic++] = varray_vc+vi;
}
varray_vc += surf->mesh->numvertexes;
} }
//flags //flags
@ -2009,7 +1998,7 @@ void PPL_LightTexturesFP(model_t *model, vec3_t modelorigin, dlight_t *light, ve
qglEnable(GL_BLEND); qglEnable(GL_BLEND);
GL_TexEnv(GL_MODULATE); GL_TexEnv(GL_MODULATE);
qglBlendFunc(GL_ONE, GL_ONE); qglBlendFunc(GL_ONE, GL_ONE);
qglDisableClientState(GL_COLOR_ARRAY);
if (qglGetError()) if (qglGetError())
Con_Printf("GL Error early in lighttextures\n"); Con_Printf("GL Error early in lighttextures\n");
@ -2029,15 +2018,16 @@ void PPL_LightTexturesFP(model_t *model, vec3_t modelorigin, dlight_t *light, ve
p = 0; p = 0;
if (t->gl_texturenumbumpmap) if (t->gl_texturenumbumpmap && ppl_light_shader[p|PERMUTATION_BUMPMAP])
p |= PERMUTATION_BUMPMAP; p |= PERMUTATION_BUMPMAP;
if (gl_specular.value && t->gl_texturenumspec) if (gl_specular.value && t->gl_texturenumspec && ppl_light_shader[p|PERMUTATION_SPECULAR])
p |= PERMUTATION_SPECULAR; p |= PERMUTATION_SPECULAR;
if (p != lp) if (p != lp)
{ {
lp = p; lp = p;
GLSlang_UseProgram(ppl_light_shader[p]); GLSlang_UseProgram(ppl_light_shader[p]);
if (ppl_light_shader_eyeposition[p] != -1)
qglUniform3fvARB(ppl_light_shader_eyeposition[p], 1, relativeeyeorigin); qglUniform3fvARB(ppl_light_shader_eyeposition[p], 1, relativeeyeorigin);
qglUniform3fvARB(ppl_light_shader_lightposition[p], 1, relativelightorigin); qglUniform3fvARB(ppl_light_shader_lightposition[p], 1, relativelightorigin);
qglUniform3fvARB(ppl_light_shader_lightcolour[p], 1, colour); qglUniform3fvARB(ppl_light_shader_lightcolour[p], 1, colour);
@ -2045,29 +2035,29 @@ void PPL_LightTexturesFP(model_t *model, vec3_t modelorigin, dlight_t *light, ve
} }
if (p & PERMUTATION_BUMPMAP)
GL_MBind(GL_TEXTURE1_ARB, t->gl_texturenumbumpmap);
if (p & PERMUTATION_SPECULAR)
GL_MBind(GL_TEXTURE2_ARB, t->gl_texturenumspec);
GL_MBind(GL_TEXTURE0_ARB, t->gl_texturenum); GL_MBind(GL_TEXTURE0_ARB, t->gl_texturenum);
qglEnableClientState(GL_TEXTURE_COORD_ARRAY); qglEnableClientState(GL_TEXTURE_COORD_ARRAY);
GL_MBind(GL_TEXTURE1_ARB, t->gl_texturenumbumpmap);
GL_MBind(GL_TEXTURE2_ARB, t->gl_texturenumspec);
GL_SelectTexture(GL_TEXTURE0_ARB);
for (; s; s=s->texturechain) for (; s; s=s->texturechain)
{ {
// if (s->shadowframe != r_shadowframe) if (s->shadowframe != r_shadowframe)
// continue; continue;
/*
if (s->flags & SURF_PLANEBACK) if (s->flags & SURF_PLANEBACK)
{//inverted normal. {//inverted normal.
if (-DotProduct(s->plane->normal, relativelightorigin)+s->plane->dist > lightradius) if (DotProduct(s->plane->normal, relativelightorigin)-s->plane->dist > lightradius)
continue; continue;
} }
else else
{ {
if (DotProduct(s->plane->normal, relativelightorigin)-s->plane->dist > lightradius) if (-DotProduct(s->plane->normal, relativelightorigin)+s->plane->dist > lightradius)
continue; continue;
} }
*/
qglMultiTexCoord3fARB(GL_TEXTURE1_ARB, s->texinfo->vecs[0][0], s->texinfo->vecs[0][1], s->texinfo->vecs[0][2]); qglMultiTexCoord3fARB(GL_TEXTURE1_ARB, s->texinfo->vecs[0][0], s->texinfo->vecs[0][1], s->texinfo->vecs[0][2]);
qglMultiTexCoord3fARB(GL_TEXTURE2_ARB, -s->texinfo->vecs[1][0], -s->texinfo->vecs[1][1], -s->texinfo->vecs[1][2]); qglMultiTexCoord3fARB(GL_TEXTURE2_ARB, -s->texinfo->vecs[1][0], -s->texinfo->vecs[1][1], -s->texinfo->vecs[1][2]);
@ -2078,9 +2068,9 @@ void PPL_LightTexturesFP(model_t *model, vec3_t modelorigin, dlight_t *light, ve
qglMultiTexCoord3fARB(GL_TEXTURE3_ARB, s->plane->normal[0], s->plane->normal[1], s->plane->normal[2]); qglMultiTexCoord3fARB(GL_TEXTURE3_ARB, s->plane->normal[0], s->plane->normal[1], s->plane->normal[2]);
qglTexCoordPointer(2, GL_FLOAT, 0, s->mesh->st_array); qglTexCoordPointer(2, GL_FLOAT, 0, s->mesh->st_array);
qglVertexPointer(3, GL_FLOAT, 0, s->mesh->xyz_array); qglVertexPointer(3, GL_FLOAT, 0, s->mesh->xyz_array);
qglDrawElements(GL_TRIANGLES, s->mesh->numindexes, GL_UNSIGNED_INT, s->mesh->indexes); qglDrawElements(GL_TRIANGLES, s->mesh->numindexes, GL_UNSIGNED_INT, s->mesh->indexes);
} }
} }
@ -2099,7 +2089,7 @@ void PPL_LightTextures(model_t *model, vec3_t modelorigin, dlight_t *light, vec3
vec3_t relativelightorigin; vec3_t relativelightorigin;
if (ppl_light_shader) if (ppl_light_shader[0])
{ {
PPL_LightTexturesFP(model, modelorigin, light, colour); PPL_LightTexturesFP(model, modelorigin, light, colour);
return; return;
@ -2193,26 +2183,25 @@ void PPL_LightTextures(model_t *model, vec3_t modelorigin, dlight_t *light, vec3
if (s->shadowframe != r_shadowframe) if (s->shadowframe != r_shadowframe)
continue; continue;
/* if (fabs(s->center[0] - lightorg[0]) > lightradius+s->radius ||
fabs(s->center[1] - lightorg[1]) > lightradius+s->radius ||
fabs(s->center[2] - lightorg[2]) > lightradius+s->radius)
continue;*/
if (s->flags & SURF_PLANEBACK) if (s->flags & SURF_PLANEBACK)
{//inverted normal. {//inverted normal.
if (-DotProduct(s->plane->normal, relativelightorigin)+s->plane->dist > lightradius) if (DotProduct(s->plane->normal, relativelightorigin)-s->plane->dist > lightradius)
continue; continue;
} }
else else
{ {
if (DotProduct(s->plane->normal, relativelightorigin)-s->plane->dist > lightradius) if (-DotProduct(s->plane->normal, relativelightorigin)+s->plane->dist > lightradius)
continue; continue;
} }
PPL_GenerateLightArrays(s, relativelightorigin, light, colour); PPL_GenerateLightArrays(s, relativelightorigin, light, colour);
qglVertexPointer(3, GL_FLOAT, 0, s->mesh->xyz_array);
qglDrawElements(GL_TRIANGLES, s->mesh->numindexes, GL_UNSIGNED_INT, s->mesh->indexes);
varray_ic = 0;
varray_vc = 0;
} }
PPL_FlushArrays();
} }
} }
@ -2276,14 +2265,15 @@ void PPL_LightBModelTexturesFP(entity_t *e, dlight_t *light, vec3_t colour)
t = GLR_TextureAnimation (tnum); t = GLR_TextureAnimation (tnum);
p = 0; p = 0;
if (t->gl_texturenumbumpmap) if (t->gl_texturenumbumpmap && ppl_light_shader[p|PERMUTATION_BUMPMAP])
p |= PERMUTATION_BUMPMAP; p |= PERMUTATION_BUMPMAP;
if (gl_specular.value && t->gl_texturenumspec) if (gl_specular.value && t->gl_texturenumspec && ppl_light_shader[p|PERMUTATION_SPECULAR])
p |= PERMUTATION_SPECULAR; p |= PERMUTATION_SPECULAR;
if (p != lp) if (p != lp)
{ {
lp = p; lp = p;
GLSlang_UseProgram(ppl_light_shader[p]); GLSlang_UseProgram(ppl_light_shader[p]);
if (ppl_light_shader_eyeposition[p] != -1)
qglUniform3fvARB(ppl_light_shader_eyeposition[p], 1, relativeeyeorigin); qglUniform3fvARB(ppl_light_shader_eyeposition[p], 1, relativeeyeorigin);
qglUniform3fvARB(ppl_light_shader_lightposition[p], 1, relativelightorigin); qglUniform3fvARB(ppl_light_shader_lightposition[p], 1, relativelightorigin);
qglUniform3fvARB(ppl_light_shader_lightcolour[p], 1, colour); qglUniform3fvARB(ppl_light_shader_lightcolour[p], 1, colour);
@ -2331,7 +2321,7 @@ void PPL_LightBModelTextures(entity_t *e, dlight_t *light, vec3_t colour)
qglPushMatrix(); qglPushMatrix();
R_RotateForEntity(e); R_RotateForEntity(e);
if (ppl_light_shader) if (ppl_light_shader[0])
{ {
PPL_LightBModelTexturesFP(e, light, colour); PPL_LightBModelTexturesFP(e, light, colour);
qglPopMatrix(); qglPopMatrix();
@ -2435,6 +2425,11 @@ void PPL_LightBModelTextures(entity_t *e, dlight_t *light, vec3_t colour)
continue; continue;
} }
PPL_GenerateLightArrays(s, relativelightorigin, light, colour); PPL_GenerateLightArrays(s, relativelightorigin, light, colour);
qglVertexPointer(3, GL_FLOAT, 0, s->mesh->xyz_array);
qglDrawElements(GL_TRIANGLES, s->mesh->numindexes, GL_UNSIGNED_INT, s->mesh->indexes);
varray_ic = 0;
varray_vc = 0;
} }
PPL_FlushArrays(); PPL_FlushArrays();
} }
@ -2615,6 +2610,7 @@ void PPL_DrawEntFullBrights(void)
{ {
int i; int i;
currententity = &r_worldentity;
// if (gl_detail.value || (r_fb_bmodels.value && cls.allow_luma)) // if (gl_detail.value || (r_fb_bmodels.value && cls.allow_luma))
PPL_FullBrights(cl.worldmodel); PPL_FullBrights(cl.worldmodel);
@ -2736,11 +2732,17 @@ void PPL_SchematicsTextureChain(msurface_t *first)
qglTexCoord2f (fcol, frow + size); qglTexCoord2f (fcol, frow + size);
qglVertex3fv(pos); qglVertex3fv(pos);
VectorMA(pos, 8, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(pos, -8, s->plane->normal, v);
else
VectorMA(pos, 8, s->plane->normal, v);
qglTexCoord2f (fcol, frow); qglTexCoord2f (fcol, frow);
qglVertex3fv(v); qglVertex3fv(v);
VectorMA(pos, -8, dir, pos); VectorMA(pos, -8, dir, pos);
VectorMA(pos, 8, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(pos, -8, s->plane->normal, v);
else
VectorMA(pos, 8, s->plane->normal, v);
qglTexCoord2f (fcol + size, frow); qglTexCoord2f (fcol + size, frow);
qglVertex3fv(v); qglVertex3fv(v);
qglTexCoord2f (fcol + size, frow + size); qglTexCoord2f (fcol + size, frow + size);
@ -2782,14 +2784,23 @@ void PPL_SchematicsTextureChain(msurface_t *first)
sl = 0; sl = 0;
//left side. (find arrowhead part) //left side. (find arrowhead part)
VectorMA(v1, 4, s->normal, pos); if (s->flags & SURF_PLANEBACK)
VectorMA(v1, -4, s->plane->normal, pos);
else
VectorMA(v1, 4, s->plane->normal, pos);
VectorMA(pos, 4, dir, v); VectorMA(pos, 4, dir, v);
VectorMA(v, -4, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(v, 4, s->plane->normal, v);
else
VectorMA(v, -4, s->plane->normal, v);
qglVertex3fv(v); qglVertex3fv(v);
qglVertex3fv(pos); qglVertex3fv(pos);
VectorMA(v, 8, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(v, -8, s->plane->normal, v);
else
VectorMA(v, 8, s->plane->normal, v);
qglVertex3fv(v); qglVertex3fv(v);
qglVertex3fv(pos); qglVertex3fv(pos);
@ -2799,14 +2810,23 @@ void PPL_SchematicsTextureChain(msurface_t *first)
qglVertex3fv(pos); qglVertex3fv(pos);
//right hand side. //right hand side.
VectorMA(v2, 4, s->normal, pos); if (s->flags & SURF_PLANEBACK)
VectorMA(v2, -4, s->plane->normal, pos);
else
VectorMA(v2, 4, s->plane->normal, pos);
VectorMA(pos, -4, dir, v); VectorMA(pos, -4, dir, v);
VectorMA(v, -4, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(v, 4, s->plane->normal, v);
else
VectorMA(v, -4, s->plane->normal, v);
qglVertex3fv(v); qglVertex3fv(v);
qglVertex3fv(pos); qglVertex3fv(pos);
VectorMA(v, 8, s->normal, v); if (s->flags & SURF_PLANEBACK)
VectorMA(v, -8, s->plane->normal, v);
else
VectorMA(v, 8, s->plane->normal, v);
qglVertex3fv(v); qglVertex3fv(v);
qglVertex3fv(pos); qglVertex3fv(pos);
@ -4044,12 +4064,9 @@ void PPL_AddLight(dlight_t *dl)
qglDisable(GL_TEXTURE_2D); qglDisable(GL_TEXTURE_2D);
qglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); qglTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// if (1)
// goto noshadows;
qglEnable(GL_SCISSOR_TEST); qglEnable(GL_SCISSOR_TEST);
// if (!((int)r_shadows.value & 4))
{
qglDisable(GL_BLEND); qglDisable(GL_BLEND);
qglColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE ); qglColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
qglDepthMask(0); qglDepthMask(0);
@ -4177,7 +4194,7 @@ void PPL_AddLight(dlight_t *dl)
qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); qglStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
qglCullFace(GL_FRONT); qglCullFace(GL_FRONT);
//noshadows: }
qglColor3f(1,1,1); qglColor3f(1,1,1);
qglEnable(GL_BLEND); qglEnable(GL_BLEND);