------------------------------------------------------------------------
r4230 | acceptthis | 2013-02-27 12:11:02 +0000 (Wed, 27 Feb 2013) | 2 lines Make sure s+t vectors are actually calculated on q3/rbsp, fixing rtlights. Resort shaders if the sort key changes, fixes issue with r_wateralpha changing without having to hack the other water shader alternatives, thereby fixing particles etc in front of standard water. ------------------------------------------------------------------------ git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4226 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
61b833e665
commit
e8e230d98c
4 changed files with 49 additions and 49 deletions
|
@ -341,6 +341,7 @@ int Mod_SkinNumForName(struct model_s *model, char *name);
|
|||
int Mod_FrameNumForName(struct model_s *model, char *name);
|
||||
float Mod_FrameDuration(struct model_s *model, int frameno);
|
||||
|
||||
void RMod_ResortShaders(void);
|
||||
void RMod_ClearAll (void);
|
||||
struct model_s *RMod_ForName (char *name, qboolean crash);
|
||||
struct model_s *RMod_FindName (char *name);
|
||||
|
|
|
@ -127,6 +127,7 @@ void ClearBounds (vec3_t mins, vec3_t maxs)
|
|||
|
||||
void Mod_SortShaders(void)
|
||||
{
|
||||
//surely this isn't still needed?
|
||||
texture_t *textemp;
|
||||
int i, j;
|
||||
|
||||
|
@ -2565,6 +2566,9 @@ void CModRBSP_BuildSurfMesh(model_t *mod, msurface_t *out, void *cookie)
|
|||
Vector4Copy(mesh->colors4b_array[0], mesh->colors4b_array[3]);
|
||||
*/
|
||||
}
|
||||
|
||||
Mod_AccumulateMeshTextureVectors(out->mesh);
|
||||
Mod_NormaliseTextureVectors(out->mesh->normals_array, out->mesh->snormals_array, out->mesh->tnormals_array, out->mesh->numvertexes);
|
||||
}
|
||||
|
||||
void CModQ3_BuildSurfMesh(model_t *mod, msurface_t *out, void *cookie)
|
||||
|
@ -2575,15 +2579,7 @@ void CModQ3_BuildSurfMesh(model_t *mod, msurface_t *out, void *cookie)
|
|||
|
||||
if (LittleLong(in->facetype) == MST_PATCH)
|
||||
{
|
||||
// out->mesh->numindexes = 0;
|
||||
// out->mesh->numvertexes = 0;
|
||||
//FIXME
|
||||
GL_CreateMeshForPatch(loadmodel, out->mesh, LittleLong(in->patchwidth), LittleLong(in->patchheight), LittleLong(in->num_vertices), LittleLong(in->firstvertex));
|
||||
// if (out->mesh)
|
||||
// {
|
||||
// Mod_AccumulateMeshTextureVectors(out->mesh);
|
||||
// Mod_NormaliseTextureVectors(out->mesh->normals_array, out->mesh->snormals_array, out->mesh->tnormals_array, out->mesh->numvertexes);
|
||||
// }
|
||||
}
|
||||
else if (LittleLong(in->facetype) == MST_PLANAR || LittleLong(in->facetype) == MST_TRIANGLE_SOUP)
|
||||
{
|
||||
|
@ -2602,35 +2598,6 @@ void CModQ3_BuildSurfMesh(model_t *mod, msurface_t *out, void *cookie)
|
|||
{
|
||||
out->mesh->indexes[i] = map_surfindexes[fv + i];
|
||||
}
|
||||
|
||||
/* numindexes = LittleLong(in->num_indexes);
|
||||
numverts = LittleLong(in->num_vertices);
|
||||
if (numindexes%3 || numindexes < 0 || numverts < 0)
|
||||
{
|
||||
Con_Printf(CON_ERROR "mesh indexes should be multiples of 3\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
out->mesh = Hunk_Alloc(sizeof(mesh_t));
|
||||
out->mesh->normals_array= map_normals_array + LittleLong(in->firstvertex);
|
||||
out->mesh->snormals_array = map_svector_array + LittleLong(in->firstvertex);
|
||||
out->mesh->tnormals_array = map_tvector_array + LittleLong(in->firstvertex);
|
||||
|
||||
out->mesh->colors4f_array = map_colors4f_array + LittleLong(in->firstvertex);
|
||||
out->mesh->indexes = map_surfindexes + LittleLong(in->firstindex);
|
||||
out->mesh->xyz_array = map_verts + LittleLong(in->firstvertex);
|
||||
out->mesh->st_array = map_vertstmexcoords + LittleLong(in->firstvertex);
|
||||
out->mesh->lmst_array = map_vertlstmexcoords + LittleLong(in->firstvertex);
|
||||
|
||||
out->mesh->numindexes = numindexes;
|
||||
out->mesh->numvertexes = numverts;
|
||||
|
||||
if (LittleLong(in->facetype) == MST_PLANAR)
|
||||
if (out->mesh->numindexes == (out->mesh->numvertexes-2)*3)
|
||||
out->mesh->istrifan = true;
|
||||
|
||||
Mod_AccumulateMeshTextureVectors(out->mesh);
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2669,7 +2636,8 @@ void CModQ3_BuildSurfMesh(model_t *mod, msurface_t *out, void *cookie)
|
|||
*/
|
||||
}
|
||||
|
||||
|
||||
Mod_AccumulateMeshTextureVectors(out->mesh);
|
||||
Mod_NormaliseTextureVectors(out->mesh->normals_array, out->mesh->snormals_array, out->mesh->tnormals_array, out->mesh->numvertexes);
|
||||
}
|
||||
|
||||
qboolean CModQ3_LoadRFaces (lump_t *l)
|
||||
|
@ -2783,10 +2751,7 @@ qboolean CModQ3_LoadRFaces (lump_t *l)
|
|||
}
|
||||
}
|
||||
|
||||
Mod_NormaliseTextureVectors(map_normals_array, map_svector_array, map_tvector_array, numvertexes);
|
||||
|
||||
Mod_SortShaders();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2901,6 +2866,7 @@ qboolean CModRBSP_LoadRFaces (lump_t *l)
|
|||
}
|
||||
}
|
||||
|
||||
Mod_SortShaders();
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -365,6 +365,35 @@ void Mod_RebuildLightmaps (void)
|
|||
}
|
||||
}
|
||||
|
||||
void RMod_ResortShaders(void)
|
||||
{
|
||||
//called when some shader changed its sort key.
|
||||
//this means we have to hunt down all models and update their batches.
|
||||
//really its only bsps that need this.
|
||||
batch_t *oldlists[SHADER_SORT_COUNT], *b;
|
||||
int i, j, bs;
|
||||
model_t *mod;
|
||||
for (i=0, mod=mod_known ; i<mod_numknown ; i++, mod++)
|
||||
{
|
||||
if (mod->needload)
|
||||
continue;
|
||||
|
||||
memcpy(oldlists, mod->batches, sizeof(oldlists));
|
||||
memset(mod->batches, 0, sizeof(oldlists));
|
||||
|
||||
for (j = 0; j < SHADER_SORT_COUNT; j++)
|
||||
{
|
||||
while((b=oldlists[j]))
|
||||
{
|
||||
oldlists[j] = b->next;
|
||||
bs = b->shader?b->shader->sort:j;
|
||||
|
||||
b->next = mod->batches[bs];
|
||||
mod->batches[bs] = b;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
===================
|
||||
Mod_ClearAll
|
||||
|
|
|
@ -4194,7 +4194,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case -1: //invisible
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n"
|
||||
"surfaceparm nodraw\n"
|
||||
"surfaceparm nodlight\n"
|
||||
"}\n"
|
||||
|
@ -4202,7 +4201,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 0: //fastturb
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n"
|
||||
"{\n"
|
||||
"map $whiteimage\n"
|
||||
"rgbgen const $r_fastturbcolour\n"
|
||||
|
@ -4214,7 +4212,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 1: //vanilla style
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n" /*make sure it always has the same sort order, so switching on/off wateralpha doesn't break stuff*/
|
||||
"program defaultwarp\n"
|
||||
"{\n"
|
||||
"map $diffuse\n"
|
||||
|
@ -4231,7 +4228,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 2: //refraction of the underwater surface, with a fresnel
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n" /*make sure it always has the same sort order, so switching on/off wateralpha doesn't break stuff*/
|
||||
"surfaceparm nodlight\n"
|
||||
"{\n"
|
||||
"map $refraction\n"
|
||||
|
@ -4248,7 +4244,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 3: //reflections
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n" /*make sure it always has the same sort order, so switching on/off wateralpha doesn't break stuff*/
|
||||
"surfaceparm nodlight\n"
|
||||
"{\n"
|
||||
"map $refraction\n"
|
||||
|
@ -4265,7 +4260,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 4: //ripples
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n" /*make sure it always has the same sort order, so switching on/off wateralpha doesn't break stuff*/
|
||||
"surfaceparm nodlight\n"
|
||||
"{\n"
|
||||
"map $refraction\n"
|
||||
|
@ -4285,7 +4279,6 @@ char *Shader_DefaultBSPWater(char *shortname)
|
|||
case 5: //ripples+reflections
|
||||
return (
|
||||
"{\n"
|
||||
"sort blend\n" /*make sure it always has the same sort order, so switching on/off wateralpha doesn't break stuff*/
|
||||
"surfaceparm nodlight\n"
|
||||
"{\n"
|
||||
"map $refraction\n"
|
||||
|
@ -4931,6 +4924,8 @@ void Shader_DoReload(void)
|
|||
shader_t *s;
|
||||
unsigned int i;
|
||||
char shortname[MAX_QPATH];
|
||||
int oldsort;
|
||||
qboolean resort = false;
|
||||
|
||||
if (shader_rescan_needed && ruleset_allow_shaders.ival)
|
||||
{
|
||||
|
@ -4973,11 +4968,20 @@ void Shader_DoReload(void)
|
|||
}
|
||||
if (s->generator)
|
||||
{
|
||||
oldsort = s->sort;
|
||||
Shader_Reset(s);
|
||||
|
||||
s->generator(shortname, s, s->genargs);
|
||||
|
||||
if (s->sort != oldsort)
|
||||
resort = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (resort)
|
||||
{
|
||||
RMod_ResortShaders();
|
||||
}
|
||||
}
|
||||
|
||||
void Shader_NeedReload(qboolean rescanfs)
|
||||
|
|
Loading…
Reference in a new issue