Merge branch 'master' into sdl2
Conflicts: .travis.yml
This commit is contained in:
commit
107cae63d6
21 changed files with 162 additions and 240 deletions
|
@ -145,7 +145,6 @@ cvar_t *r_baseNormalY;
|
|||
cvar_t *r_baseParallax;
|
||||
cvar_t *r_baseSpecular;
|
||||
cvar_t *r_baseGloss;
|
||||
cvar_t *r_recalcMD3Normals;
|
||||
cvar_t *r_mergeLightmaps;
|
||||
cvar_t *r_dlightMode;
|
||||
cvar_t *r_pshadowDist;
|
||||
|
@ -1206,7 +1205,6 @@ void R_Register( void )
|
|||
r_baseGloss = ri.Cvar_Get( "r_baseGloss", "0.3", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_dlightMode = ri.Cvar_Get( "r_dlightMode", "0", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_pshadowDist = ri.Cvar_Get( "r_pshadowDist", "128", CVAR_ARCHIVE );
|
||||
r_recalcMD3Normals = ri.Cvar_Get( "r_recalcMD3Normals", "0", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_mergeLightmaps = ri.Cvar_Get( "r_mergeLightmaps", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_imageUpsample = ri.Cvar_Get( "r_imageUpsample", "0", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
r_imageUpsampleMaxSize = ri.Cvar_Get( "r_imageUpsampleMaxSize", "1024", CVAR_ARCHIVE | CVAR_LATCH );
|
||||
|
|
|
@ -1805,7 +1805,6 @@ extern cvar_t *r_baseSpecular;
|
|||
extern cvar_t *r_baseGloss;
|
||||
extern cvar_t *r_dlightMode;
|
||||
extern cvar_t *r_pshadowDist;
|
||||
extern cvar_t *r_recalcMD3Normals;
|
||||
extern cvar_t *r_mergeLightmaps;
|
||||
extern cvar_t *r_imageUpsample;
|
||||
extern cvar_t *r_imageUpsampleMaxSize;
|
||||
|
@ -1866,8 +1865,9 @@ void R_DecomposeSort( unsigned sort, int *entityNum, shader_t **shader,
|
|||
void R_AddDrawSurf( surfaceType_t *surface, shader_t *shader,
|
||||
int fogIndex, int dlightMap, int pshadowMap, int cubemap );
|
||||
|
||||
void R_CalcTangentSpace(vec3_t tangent, vec3_t bitangent, vec3_t normal,
|
||||
const vec3_t v0, const vec3_t v1, const vec3_t v2, const vec2_t t0, const vec2_t t1, const vec2_t t2);
|
||||
void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2,
|
||||
const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3);
|
||||
void R_CalcTbnFromNormalAndTexDirs(vec3_t tangent, vec3_t bitangent, vec3_t normal, vec3_t sdir, vec3_t tdir);
|
||||
qboolean R_CalcTangentVectors(srfVert_t * dv[3]);
|
||||
|
||||
#define CULL_IN 0 // completely unclipped
|
||||
|
|
|
@ -294,13 +294,11 @@ void R_CalcTangentSpaceFast(vec3_t tangent, vec3_t bitangent, vec3_t normal,
|
|||
/*
|
||||
http://www.terathon.com/code/tangent.html
|
||||
*/
|
||||
void R_CalcTBN(vec3_t tangent, vec3_t bitangent, vec3_t normal,
|
||||
const vec3_t v1, const vec3_t v2, const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3)
|
||||
void R_CalcTexDirs(vec3_t sdir, vec3_t tdir, const vec3_t v1, const vec3_t v2,
|
||||
const vec3_t v3, const vec2_t w1, const vec2_t w2, const vec2_t w3)
|
||||
{
|
||||
vec3_t u, v;
|
||||
float x1, x2, y1, y2, z1, z2;
|
||||
float s1, s2, t1, t2;
|
||||
float r, dot;
|
||||
float s1, s2, t1, t2, r;
|
||||
|
||||
x1 = v2[0] - v1[0];
|
||||
x2 = v3[0] - v1[0];
|
||||
|
@ -316,24 +314,27 @@ void R_CalcTBN(vec3_t tangent, vec3_t bitangent, vec3_t normal,
|
|||
|
||||
r = 1.0f / (s1 * t2 - s2 * t1);
|
||||
|
||||
VectorSet(tangent, (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
|
||||
VectorSet(bitangent, (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
|
||||
VectorSet(sdir, (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
|
||||
VectorSet(tdir, (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
|
||||
}
|
||||
|
||||
// compute the face normal based on vertex points
|
||||
VectorSubtract(v3, v1, u);
|
||||
VectorSubtract(v2, v1, v);
|
||||
CrossProduct(u, v, normal);
|
||||
|
||||
VectorNormalize(normal);
|
||||
void R_CalcTbnFromNormalAndTexDirs(vec3_t tangent, vec3_t bitangent, vec3_t normal, vec3_t sdir, vec3_t tdir)
|
||||
{
|
||||
vec3_t n_cross_t;
|
||||
vec_t n_dot_t, handedness;
|
||||
|
||||
// Gram-Schmidt orthogonalize
|
||||
//tangent[a] = (t - n * Dot(n, t)).Normalize();
|
||||
dot = DotProduct(normal, tangent);
|
||||
VectorMA(tangent, -dot, normal, tangent);
|
||||
n_dot_t = DotProduct(normal, sdir);
|
||||
VectorMA(sdir, -n_dot_t, normal, tangent);
|
||||
VectorNormalize(tangent);
|
||||
|
||||
// B=NxT
|
||||
//CrossProduct(normal, tangent, bitangent);
|
||||
// Calculate handedness
|
||||
CrossProduct(normal, sdir, n_cross_t);
|
||||
handedness = (DotProduct(n_cross_t, tdir) < 0.0f) ? -1.0f : 1.0f;
|
||||
|
||||
// Calculate bitangent
|
||||
CrossProduct(normal, tangent, bitangent);
|
||||
VectorScale(bitangent, handedness, bitangent);
|
||||
}
|
||||
|
||||
void R_CalcTBN2(vec3_t tangent, vec3_t bitangent, vec3_t normal,
|
||||
|
|
|
@ -372,7 +372,7 @@ R_LoadMD3
|
|||
*/
|
||||
static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize, const char *modName)
|
||||
{
|
||||
int f, i, j, k;
|
||||
int f, i, j;
|
||||
|
||||
md3Header_t *md3Model;
|
||||
md3Frame_t *md3Frame;
|
||||
|
@ -598,70 +598,54 @@ static qboolean R_LoadMD3(model_t * mod, int lod, void *buffer, int bufferSize,
|
|||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
// calc tangent spaces
|
||||
{
|
||||
// Valgrind complaints: Conditional jump or move depends on uninitialised value(s)
|
||||
// So lets Initialize them.
|
||||
const float *v0 = NULL, *v1 = NULL, *v2 = NULL;
|
||||
const float *t0 = NULL, *t1 = NULL, *t2 = NULL;
|
||||
vec3_t tangent = { 0, 0, 0 };
|
||||
vec3_t bitangent = { 0, 0, 0 };
|
||||
vec3_t normal = { 0, 0, 0 };
|
||||
|
||||
for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++)
|
||||
{
|
||||
VectorClear(v->tangent);
|
||||
VectorClear(v->bitangent);
|
||||
if (r_recalcMD3Normals->integer)
|
||||
VectorClear(v->normal);
|
||||
}
|
||||
|
||||
for(f = 0; f < mdvModel->numFrames; f++)
|
||||
{
|
||||
for(j = 0, tri = surf->indexes; j < surf->numIndexes; j += 3, tri += 3)
|
||||
{
|
||||
v0 = surf->verts[surf->numVerts * f + tri[0]].xyz;
|
||||
v1 = surf->verts[surf->numVerts * f + tri[1]].xyz;
|
||||
v2 = surf->verts[surf->numVerts * f + tri[2]].xyz;
|
||||
vec3_t sdir, tdir;
|
||||
const float *v0, *v1, *v2, *t0, *t1, *t2;
|
||||
glIndex_t index0, index1, index2;
|
||||
|
||||
index0 = surf->numVerts * f + tri[0];
|
||||
index1 = surf->numVerts * f + tri[1];
|
||||
index2 = surf->numVerts * f + tri[2];
|
||||
|
||||
v0 = surf->verts[index0].xyz;
|
||||
v1 = surf->verts[index1].xyz;
|
||||
v2 = surf->verts[index2].xyz;
|
||||
|
||||
t0 = surf->st[tri[0]].st;
|
||||
t1 = surf->st[tri[1]].st;
|
||||
t2 = surf->st[tri[2]].st;
|
||||
|
||||
if (!r_recalcMD3Normals->integer)
|
||||
VectorCopy(v->normal, normal);
|
||||
else
|
||||
VectorClear(normal);
|
||||
R_CalcTexDirs(sdir, tdir, v0, v1, v2, t0, t1, t2);
|
||||
|
||||
#if 1
|
||||
R_CalcTangentSpace(tangent, bitangent, normal, v0, v1, v2, t0, t1, t2);
|
||||
#else
|
||||
R_CalcNormalForTriangle(normal, v0, v1, v2);
|
||||
R_CalcTangentsForTriangle(tangent, bitangent, v0, v1, v2, t0, t1, t2);
|
||||
#endif
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
{
|
||||
float *v;
|
||||
|
||||
v = surf->verts[surf->numVerts * f + tri[k]].tangent;
|
||||
VectorAdd(v, tangent, v);
|
||||
|
||||
v = surf->verts[surf->numVerts * f + tri[k]].bitangent;
|
||||
VectorAdd(v, bitangent, v);
|
||||
|
||||
if (r_recalcMD3Normals->integer)
|
||||
{
|
||||
v = surf->verts[surf->numVerts * f + tri[k]].normal;
|
||||
VectorAdd(v, normal, v);
|
||||
}
|
||||
}
|
||||
VectorAdd(sdir, surf->verts[index0].tangent, surf->verts[index0].tangent);
|
||||
VectorAdd(sdir, surf->verts[index1].tangent, surf->verts[index1].tangent);
|
||||
VectorAdd(sdir, surf->verts[index2].tangent, surf->verts[index2].tangent);
|
||||
VectorAdd(tdir, surf->verts[index0].bitangent, surf->verts[index0].bitangent);
|
||||
VectorAdd(tdir, surf->verts[index1].bitangent, surf->verts[index1].bitangent);
|
||||
VectorAdd(tdir, surf->verts[index2].bitangent, surf->verts[index2].bitangent);
|
||||
}
|
||||
}
|
||||
|
||||
for(j = 0, v = surf->verts; j < (surf->numVerts * mdvModel->numFrames); j++, v++)
|
||||
{
|
||||
VectorNormalize(v->tangent);
|
||||
VectorNormalize(v->bitangent);
|
||||
VectorNormalize(v->normal);
|
||||
vec3_t sdir, tdir;
|
||||
|
||||
VectorCopy(v->tangent, sdir);
|
||||
VectorCopy(v->bitangent, tdir);
|
||||
|
||||
VectorNormalize(sdir);
|
||||
VectorNormalize(tdir);
|
||||
|
||||
R_CalcTbnFromNormalAndTexDirs(v->tangent, v->bitangent, v->normal, sdir, tdir);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -1132,6 +1116,7 @@ static qboolean R_LoadMDR( model_t *mod, void *buffer, int filesize, const char
|
|||
** RE_BeginRegistration
|
||||
*/
|
||||
void RE_BeginRegistration( glconfig_t *glconfigOut ) {
|
||||
int i;
|
||||
|
||||
R_Init();
|
||||
|
||||
|
@ -1140,7 +1125,10 @@ void RE_BeginRegistration( glconfig_t *glconfigOut ) {
|
|||
R_IssuePendingRenderCommands();
|
||||
|
||||
tr.visIndex = 0;
|
||||
memset(tr.visClusters, -2, sizeof(tr.visClusters)); // force markleafs to regenerate
|
||||
// force markleafs to regenerate
|
||||
for(i = 0; i < MAX_VISCOUNTS; i++) {
|
||||
tr.visClusters[i] = -2;
|
||||
}
|
||||
|
||||
R_ClearFlares();
|
||||
RE_ClearScene();
|
||||
|
@ -1230,7 +1218,7 @@ static mdvTag_t *R_GetTag( mdvModel_t *mod, int frame, const char *_tagName ) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t * dest)
|
||||
mdvTag_t *R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t * dest)
|
||||
{
|
||||
int i, j, k;
|
||||
int frameSize;
|
||||
|
@ -1263,12 +1251,11 @@ void R_GetAnimTag( mdrHeader_t *mod, int framenum, const char *tagName, mdvTag_t
|
|||
dest->origin[1]=frame->bones[tag->boneIndex].matrix[1][3];
|
||||
dest->origin[2]=frame->bones[tag->boneIndex].matrix[2][3];
|
||||
|
||||
return;
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
|
||||
AxisClear( dest->axis );
|
||||
VectorClear( dest->origin );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1289,34 +1276,29 @@ int R_LerpTag( orientation_t *tag, qhandle_t handle, int startFrame, int endFram
|
|||
{
|
||||
if(model->type == MOD_MDR)
|
||||
{
|
||||
start = &start_space;
|
||||
end = &end_space;
|
||||
R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, start);
|
||||
R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, end);
|
||||
start = R_GetAnimTag((mdrHeader_t *) model->modelData, startFrame, tagName, &start_space);
|
||||
end = R_GetAnimTag((mdrHeader_t *) model->modelData, endFrame, tagName, &end_space);
|
||||
}
|
||||
else if( model->type == MOD_IQM ) {
|
||||
return R_IQMLerpTag( tag, model->modelData,
|
||||
startFrame, endFrame,
|
||||
frac, tagName );
|
||||
} else {
|
||||
|
||||
AxisClear( tag->axis );
|
||||
VectorClear( tag->origin );
|
||||
return qfalse;
|
||||
|
||||
start = end = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
start = R_GetTag( model->mdv[0], startFrame, tagName );
|
||||
end = R_GetTag( model->mdv[0], endFrame, tagName );
|
||||
if ( !start || !end ) {
|
||||
AxisClear( tag->axis );
|
||||
VectorClear( tag->origin );
|
||||
return qfalse;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( !start || !end ) {
|
||||
AxisClear( tag->axis );
|
||||
VectorClear( tag->origin );
|
||||
return qfalse;
|
||||
}
|
||||
|
||||
frontLerp = frac;
|
||||
backLerp = 1.0f - frac;
|
||||
|
||||
|
|
|
@ -639,7 +639,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
|||
else if ( !Q_stricmp( token, "$lightmap" ) )
|
||||
{
|
||||
stage->bundle[0].isLightmap = qtrue;
|
||||
if ( shader.lightmapIndex < 0 ) {
|
||||
if ( shader.lightmapIndex < 0 || !tr.lightmaps ) {
|
||||
stage->bundle[0].image[0] = tr.whiteImage;
|
||||
} else {
|
||||
stage->bundle[0].image[0] = tr.lightmaps[shader.lightmapIndex];
|
||||
|
@ -1265,8 +1265,8 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
|
|||
token = COM_ParseExt( text, qfalse );
|
||||
if ( token[0] == 0 )
|
||||
break;
|
||||
strcat( buffer, token );
|
||||
strcat( buffer, " " );
|
||||
Q_strcat( buffer, sizeof (buffer), token );
|
||||
Q_strcat( buffer, sizeof (buffer), " " );
|
||||
}
|
||||
|
||||
ParseTexMod( buffer, stage );
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue