05 Nov 2017
This commit is contained in:
parent
030f081591
commit
4dc689321e
|
@ -136,7 +136,8 @@ BRUSH MODELS
|
||||||
#define EXTRA_LUMPS 12 // count of the extra lumps
|
#define EXTRA_LUMPS 12 // count of the extra lumps
|
||||||
|
|
||||||
// texture flags
|
// texture flags
|
||||||
#define TEX_SPECIAL BIT( 0 ) // sky or slime, no lightmap or 256 subdivision
|
#define TEX_SPECIAL BIT( 0 ) // sky or slime, no lightmap or 256 subdivision
|
||||||
|
#define TEX_WORLD_LUXELS BIT( 1 ) // alternative lightmap matrix will be used (luxels per world units instead of luxels per texels)
|
||||||
|
|
||||||
// ambient sound types
|
// ambient sound types
|
||||||
enum
|
enum
|
||||||
|
|
|
@ -200,6 +200,10 @@ typedef struct mextrasurf_s
|
||||||
int mirrortexturenum; // gl texnum
|
int mirrortexturenum; // gl texnum
|
||||||
float mirrormatrix[4][4];
|
float mirrormatrix[4][4];
|
||||||
|
|
||||||
|
short lightmapmins[2]; // lightmatrix
|
||||||
|
short lightextents[2];
|
||||||
|
float lmvecs[2][4];
|
||||||
|
|
||||||
struct mextrasurf_s *mirrorchain; // for gl_texsort drawing
|
struct mextrasurf_s *mirrorchain; // for gl_texsort drawing
|
||||||
struct mextrasurf_s *detailchain; // for detail textures drawing
|
struct mextrasurf_s *detailchain; // for detail textures drawing
|
||||||
struct msurface_s *lightmapchain; // lightmapped polys
|
struct msurface_s *lightmapchain; // lightmapped polys
|
||||||
|
|
|
@ -438,7 +438,7 @@ void CL_AddLinksToPmove( frame_t *frame )
|
||||||
if(( state->owner != 0 ) && ( state->owner == cl.playernum + 1 ))
|
if(( state->owner != 0 ) && ( state->owner == cl.playernum + 1 ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(( model->hulls[1].firstclipnode || model->type == mod_studio ) && clgame.pmove->numvisent < MAX_PHYSENTS )
|
if(( model->hulls[1].lastclipnode || model->type == mod_studio ) && clgame.pmove->numvisent < MAX_PHYSENTS )
|
||||||
{
|
{
|
||||||
pe = &clgame.pmove->visents[clgame.pmove->numvisent];
|
pe = &clgame.pmove->visents[clgame.pmove->numvisent];
|
||||||
CL_CopyEntityToPhysEnt( pe, state, true );
|
CL_CopyEntityToPhysEnt( pe, state, true );
|
||||||
|
@ -456,7 +456,7 @@ void CL_AddLinksToPmove( frame_t *frame )
|
||||||
if( VectorIsNull( state->mins ) && VectorIsNull( state->maxs ))
|
if( VectorIsNull( state->mins ) && VectorIsNull( state->maxs ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( !model->hulls[1].firstclipnode && model->type != mod_studio )
|
if ( !model->hulls[1].lastclipnode && model->type != mod_studio )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( state->solid == SOLID_NOT && state->skin < CONTENTS_EMPTY )
|
if( state->solid == SOLID_NOT && state->skin < CONTENTS_EMPTY )
|
||||||
|
|
|
@ -374,7 +374,9 @@ static void R_DecalVertsLight( float *v, msurface_t *surf, int vertCount )
|
||||||
{
|
{
|
||||||
float s, t;
|
float s, t;
|
||||||
mtexinfo_t *tex;
|
mtexinfo_t *tex;
|
||||||
int j, sample_size;
|
mextrasurf_t *info = surf->info;
|
||||||
|
float sample_size;
|
||||||
|
int j;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
tex = surf->texinfo;
|
tex = surf->texinfo;
|
||||||
|
@ -382,14 +384,14 @@ static void R_DecalVertsLight( float *v, msurface_t *surf, int vertCount )
|
||||||
for( j = 0; j < vertCount; j++, v += VERTEXSIZE )
|
for( j = 0; j < vertCount; j++, v += VERTEXSIZE )
|
||||||
{
|
{
|
||||||
// lightmap texture coordinates
|
// lightmap texture coordinates
|
||||||
s = DotProduct( v, tex->vecs[0] ) + tex->vecs[0][3] - surf->texturemins[0];
|
s = DotProduct( v, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
s += surf->light_s * sample_size;
|
s += surf->light_s * sample_size;
|
||||||
s += sample_size >> 1;
|
s += sample_size * 0.5;
|
||||||
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
||||||
|
|
||||||
t = DotProduct( v, tex->vecs[1] ) + tex->vecs[1][3] - surf->texturemins[1];
|
t = DotProduct( v, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
t += surf->light_t * sample_size;
|
t += surf->light_t * sample_size;
|
||||||
t += sample_size >> 1;
|
t += sample_size * 0.5;
|
||||||
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
||||||
|
|
||||||
v[5] = s;
|
v[5] = s;
|
||||||
|
|
|
@ -29,6 +29,7 @@ static rgbdata_t r_image; // generic pixelbuffer used for internal textures
|
||||||
// internal tables
|
// internal tables
|
||||||
static vec3_t r_luminanceTable[256]; // RGB to luminance
|
static vec3_t r_luminanceTable[256]; // RGB to luminance
|
||||||
|
|
||||||
|
#define IsLightMap( tex ) (!Q_strncmp( (tex)->name, "*lightmap", 9 ) || !Q_strncmp( (tex)->name, "*dlight", 7 ))
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
R_GetTexture
|
R_GetTexture
|
||||||
|
@ -147,7 +148,7 @@ void GL_ApplyTextureParams( gltexture_t *tex )
|
||||||
}
|
}
|
||||||
else if( FBitSet( tex->flags, TF_NOMIPMAP ) || tex->numMips <= 1 )
|
else if( FBitSet( tex->flags, TF_NOMIPMAP ) || tex->numMips <= 1 )
|
||||||
{
|
{
|
||||||
if( FBitSet( tex->flags, TF_NEAREST ) || ( !Q_strncmp( tex->name, "*lightmap", 9 ) && gl_lightmap_nearest->value ))
|
if( FBitSet( tex->flags, TF_NEAREST ) || ( IsLightMap( tex ) && gl_lightmap_nearest->value ))
|
||||||
{
|
{
|
||||||
pglTexParameteri( tex->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
pglTexParameteri( tex->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
|
||||||
pglTexParameteri( tex->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
pglTexParameteri( tex->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
|
||||||
|
@ -262,7 +263,7 @@ static void GL_UpdateTextureParams( int iTexture )
|
||||||
if( GL_Support( GL_TEXTURE_LOD_BIAS ) && ( tex->numMips > 1 ) && !FBitSet( tex->flags, TF_DEPTHMAP ))
|
if( GL_Support( GL_TEXTURE_LOD_BIAS ) && ( tex->numMips > 1 ) && !FBitSet( tex->flags, TF_DEPTHMAP ))
|
||||||
pglTexParameterf( tex->target, GL_TEXTURE_LOD_BIAS_EXT, gl_texture_lodbias->value );
|
pglTexParameterf( tex->target, GL_TEXTURE_LOD_BIAS_EXT, gl_texture_lodbias->value );
|
||||||
|
|
||||||
if( !Q_strncmp( tex->name, "*lightmap", 9 ))
|
if( IsLightMap( tex ))
|
||||||
{
|
{
|
||||||
if( gl_lightmap_nearest->value )
|
if( gl_lightmap_nearest->value )
|
||||||
{
|
{
|
||||||
|
|
|
@ -228,7 +228,8 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||||
{
|
{
|
||||||
float front, back, frac, midf;
|
float front, back, frac, midf;
|
||||||
int i, map, side, size, s, t;
|
int i, map, side, size, s, t;
|
||||||
int sample_size;
|
float sample_size;
|
||||||
|
mextrasurf_t *info;
|
||||||
msurface_t *surf;
|
msurface_t *surf;
|
||||||
mtexinfo_t *tex;
|
mtexinfo_t *tex;
|
||||||
color24 *lm;
|
color24 *lm;
|
||||||
|
@ -271,14 +272,15 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||||
for( i = 0; i < node->numsurfaces; i++, surf++ )
|
for( i = 0; i < node->numsurfaces; i++, surf++ )
|
||||||
{
|
{
|
||||||
tex = surf->texinfo;
|
tex = surf->texinfo;
|
||||||
|
info = surf->info;
|
||||||
|
|
||||||
if( FBitSet( surf->flags, SURF_DRAWTILED ))
|
if( FBitSet( surf->flags, SURF_DRAWTILED ))
|
||||||
continue; // no lightmaps
|
continue; // no lightmaps
|
||||||
|
|
||||||
s = DotProduct( mid, tex->vecs[0] ) + tex->vecs[0][3] - surf->texturemins[0];
|
s = DotProduct( mid, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
t = DotProduct( mid, tex->vecs[1] ) + tex->vecs[1][3] - surf->texturemins[1];
|
t = DotProduct( mid, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
|
|
||||||
if(( s < 0 || s > surf->extents[0] ) || ( t < 0 || t > surf->extents[1] ))
|
if(( s < 0 || s > info->lightextents[0] ) || ( t < 0 || t > info->lightextents[1] ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cv->r = cv->g = cv->b = cv->a = 0;
|
cv->r = cv->g = cv->b = cv->a = 0;
|
||||||
|
@ -290,8 +292,8 @@ static qboolean R_RecursiveLightPoint( model_t *model, mnode_t *node, float p1f,
|
||||||
s /= sample_size;
|
s /= sample_size;
|
||||||
t /= sample_size;
|
t /= sample_size;
|
||||||
|
|
||||||
lm = surf->samples + (t * ((surf->extents[0] / sample_size) + 1) + s);
|
lm = surf->samples + (t * ((info->lightextents[0] / (int)sample_size) + 1) + s);
|
||||||
size = ((surf->extents[0] / sample_size) + 1) * ((surf->extents[1] / sample_size) + 1);
|
size = ((info->lightextents[0] / (int)sample_size) + 1) * ((info->lightextents[1] / sample_size) + 1);
|
||||||
g_trace_fraction = midf;
|
g_trace_fraction = midf;
|
||||||
|
|
||||||
for( map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++ )
|
for( map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++ )
|
||||||
|
|
|
@ -81,13 +81,14 @@ static void BoundPoly( int numverts, float *verts, vec3_t mins, vec3_t maxs )
|
||||||
|
|
||||||
static void SubdividePolygon_r( msurface_t *warpface, int numverts, float *verts )
|
static void SubdividePolygon_r( msurface_t *warpface, int numverts, float *verts )
|
||||||
{
|
{
|
||||||
int i, j, k, f, b;
|
int i, j, k, f, b;
|
||||||
int sample_size;
|
float sample_size;
|
||||||
vec3_t mins, maxs;
|
vec3_t mins, maxs;
|
||||||
float m, frac, s, t, *v, vertsDiv;
|
float m, frac, s, t, *v, vertsDiv;
|
||||||
vec3_t front[SUBDIVIDE_SIZE], back[SUBDIVIDE_SIZE], total;
|
vec3_t front[SUBDIVIDE_SIZE], back[SUBDIVIDE_SIZE], total;
|
||||||
float dist[SUBDIVIDE_SIZE], total_s, total_t, total_ls, total_lt;
|
float dist[SUBDIVIDE_SIZE], total_s, total_t, total_ls, total_lt;
|
||||||
glpoly_t *poly;
|
mextrasurf_t *warpinfo = warpface->info;
|
||||||
|
glpoly_t *poly;
|
||||||
|
|
||||||
if( numverts > ( SUBDIVIDE_SIZE - 4 ))
|
if( numverts > ( SUBDIVIDE_SIZE - 4 ))
|
||||||
Host_Error( "Mod_SubdividePolygon: too many vertexes on face ( %i )\n", numverts );
|
Host_Error( "Mod_SubdividePolygon: too many vertexes on face ( %i )\n", numverts );
|
||||||
|
@ -185,16 +186,16 @@ static void SubdividePolygon_r( msurface_t *warpface, int numverts, float *verts
|
||||||
if( !( warpface->flags & SURF_DRAWTURB ))
|
if( !( warpface->flags & SURF_DRAWTURB ))
|
||||||
{
|
{
|
||||||
// lightmap texture coordinates
|
// lightmap texture coordinates
|
||||||
s = DotProduct( verts, warpface->texinfo->vecs[0] ) + warpface->texinfo->vecs[0][3];
|
s = DotProduct( verts, warpinfo->lmvecs[0] ) + warpinfo->lmvecs[0][3];
|
||||||
s -= warpface->texturemins[0];
|
s -= warpinfo->lightmapmins[0];
|
||||||
s += warpface->light_s * sample_size;
|
s += warpface->light_s * sample_size;
|
||||||
s += sample_size >> 1;
|
s += sample_size * 0.5;
|
||||||
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
||||||
|
|
||||||
t = DotProduct( verts, warpface->texinfo->vecs[1] ) + warpface->texinfo->vecs[1][3];
|
t = DotProduct( verts, warpinfo->lmvecs[1] ) + warpinfo->lmvecs[1][3];
|
||||||
t -= warpface->texturemins[1];
|
t -= warpinfo->lightmapmins[1];
|
||||||
t += warpface->light_t * sample_size;
|
t += warpface->light_t * sample_size;
|
||||||
t += sample_size >> 1;
|
t += sample_size * 0.5;
|
||||||
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
||||||
|
|
||||||
poly->verts[i+1][5] = s;
|
poly->verts[i+1][5] = s;
|
||||||
|
@ -290,8 +291,10 @@ GL_BuildPolygonFromSurface
|
||||||
void GL_BuildPolygonFromSurface( model_t *mod, msurface_t *fa )
|
void GL_BuildPolygonFromSurface( model_t *mod, msurface_t *fa )
|
||||||
{
|
{
|
||||||
int i, lindex, lnumverts;
|
int i, lindex, lnumverts;
|
||||||
int vertpage, sample_size;
|
|
||||||
medge_t *pedges, *r_pedge;
|
medge_t *pedges, *r_pedge;
|
||||||
|
mextrasurf_t *info = fa->info;
|
||||||
|
float sample_size;
|
||||||
|
int vertpage;
|
||||||
texture_t *tex;
|
texture_t *tex;
|
||||||
gltexture_t *glt;
|
gltexture_t *glt;
|
||||||
float *vec;
|
float *vec;
|
||||||
|
@ -355,16 +358,16 @@ void GL_BuildPolygonFromSurface( model_t *mod, msurface_t *fa )
|
||||||
poly->verts[i][4] = t;
|
poly->verts[i][4] = t;
|
||||||
|
|
||||||
// lightmap texture coordinates
|
// lightmap texture coordinates
|
||||||
s = DotProduct( vec, fa->texinfo->vecs[0] ) + fa->texinfo->vecs[0][3];
|
s = DotProduct( vec, info->lmvecs[0] ) + info->lmvecs[0][3];
|
||||||
s -= fa->texturemins[0];
|
s -= info->lightmapmins[0];
|
||||||
s += fa->light_s * sample_size;
|
s += fa->light_s * sample_size;
|
||||||
s += sample_size >> 1;
|
s += sample_size / 2.0;
|
||||||
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
s /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->width;
|
||||||
|
|
||||||
t = DotProduct( vec, fa->texinfo->vecs[1] ) + fa->texinfo->vecs[1][3];
|
t = DotProduct( vec, info->lmvecs[1] ) + info->lmvecs[1][3];
|
||||||
t -= fa->texturemins[1];
|
t -= info->lightmapmins[1];
|
||||||
t += fa->light_t * sample_size;
|
t += fa->light_t * sample_size;
|
||||||
t += sample_size >> 1;
|
t += sample_size / 2.0;
|
||||||
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
t /= BLOCK_SIZE * sample_size; //fa->texinfo->texture->height;
|
||||||
|
|
||||||
poly->verts[i][5] = s;
|
poly->verts[i][5] = s;
|
||||||
|
@ -483,7 +486,9 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||||
int lnum, s, t, sd, td, smax, tmax;
|
int lnum, s, t, sd, td, smax, tmax;
|
||||||
float sl, tl, sacc, tacc;
|
float sl, tl, sacc, tacc;
|
||||||
vec3_t impact, origin_l;
|
vec3_t impact, origin_l;
|
||||||
int sample_size;
|
mextrasurf_t *info = surf->info;
|
||||||
|
int sample_frac = 1.0;
|
||||||
|
float sample_size;
|
||||||
mtexinfo_t *tex;
|
mtexinfo_t *tex;
|
||||||
dlight_t *dl;
|
dlight_t *dl;
|
||||||
uint *bl;
|
uint *bl;
|
||||||
|
@ -492,10 +497,17 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||||
if( !R_CountSurfaceDlights( surf )) return;
|
if( !R_CountSurfaceDlights( surf )) return;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
smax = (surf->extents[0] / sample_size) + 1;
|
smax = (info->lightextents[0] / sample_size) + 1;
|
||||||
tmax = (surf->extents[1] / sample_size) + 1;
|
tmax = (info->lightextents[1] / sample_size) + 1;
|
||||||
tex = surf->texinfo;
|
tex = surf->texinfo;
|
||||||
|
|
||||||
|
if( FBitSet( tex->flags, TEX_WORLD_LUXELS ))
|
||||||
|
{
|
||||||
|
if( surf->texinfo->faceinfo )
|
||||||
|
sample_frac = surf->texinfo->faceinfo->texture_step;
|
||||||
|
else sample_frac = LM_SAMPLE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
for( lnum = 0; lnum < MAX_DLIGHTS; lnum++ )
|
||||||
{
|
{
|
||||||
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
if( !FBitSet( surf->dlightbits, BIT( lnum )))
|
||||||
|
@ -526,18 +538,18 @@ void R_AddDynamicLights( msurface_t *surf )
|
||||||
}
|
}
|
||||||
else VectorMA( origin_l, -dist, surf->plane->normal, impact );
|
else VectorMA( origin_l, -dist, surf->plane->normal, impact );
|
||||||
|
|
||||||
sl = DotProduct( impact, tex->vecs[0] ) + tex->vecs[0][3] - surf->texturemins[0];
|
sl = DotProduct( impact, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
tl = DotProduct( impact, tex->vecs[1] ) + tex->vecs[1][3] - surf->texturemins[1];
|
tl = DotProduct( impact, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
|
|
||||||
bl = r_blocklights;
|
bl = r_blocklights;
|
||||||
|
|
||||||
for( t = 0, tacc = 0; t < tmax; t++, tacc += sample_size )
|
for( t = 0, tacc = 0; t < tmax; t++, tacc += sample_size )
|
||||||
{
|
{
|
||||||
td = tl - tacc;
|
td = (tl - tacc) * sample_frac;
|
||||||
if( td < 0 ) td = -td;
|
if( td < 0 ) td = -td;
|
||||||
|
|
||||||
for( s = 0, sacc = 0; s < smax; s++, sacc += sample_size, bl += 3 )
|
for( s = 0, sacc = 0; s < smax; s++, sacc += sample_size, bl += 3 )
|
||||||
{
|
{
|
||||||
sd = sl - sacc;
|
sd = (sl - sacc) * sample_frac;
|
||||||
if( sd < 0 ) sd = -sd;
|
if( sd < 0 ) sd = -sd;
|
||||||
|
|
||||||
if( sd > td ) dist = sd + (td >> 1);
|
if( sd > td ) dist = sd + (td >> 1);
|
||||||
|
@ -671,15 +683,16 @@ format in r_blocklights
|
||||||
*/
|
*/
|
||||||
static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean dynamic )
|
static void R_BuildLightMap( msurface_t *surf, byte *dest, int stride, qboolean dynamic )
|
||||||
{
|
{
|
||||||
int smax, tmax;
|
int smax, tmax;
|
||||||
uint *bl, scale;
|
uint *bl, scale;
|
||||||
int i, map, size, s, t;
|
int i, map, size, s, t;
|
||||||
int sample_size;
|
int sample_size;
|
||||||
color24 *lm;
|
mextrasurf_t *info = surf->info;
|
||||||
|
color24 *lm;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
smax = ( surf->extents[0] / sample_size ) + 1;
|
smax = ( info->lightextents[0] / sample_size ) + 1;
|
||||||
tmax = ( surf->extents[1] / sample_size ) + 1;
|
tmax = ( info->lightextents[1] / sample_size ) + 1;
|
||||||
size = smax * tmax;
|
size = smax * tmax;
|
||||||
|
|
||||||
lm = surf->samples;
|
lm = surf->samples;
|
||||||
|
@ -894,13 +907,14 @@ void R_BlendLightmaps( void )
|
||||||
|
|
||||||
for( surf = gl_lms.dynamic_surfaces; surf != NULL; surf = surf->info->lightmapchain )
|
for( surf = gl_lms.dynamic_surfaces; surf != NULL; surf = surf->info->lightmapchain )
|
||||||
{
|
{
|
||||||
int smax, tmax;
|
int smax, tmax;
|
||||||
int sample_size;
|
int sample_size;
|
||||||
byte *base;
|
mextrasurf_t *info = surf->info;
|
||||||
|
byte *base;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
smax = ( surf->extents[0] / sample_size ) + 1;
|
smax = ( info->lightextents[0] / sample_size ) + 1;
|
||||||
tmax = ( surf->extents[1] / sample_size ) + 1;
|
tmax = ( info->lightextents[1] / sample_size ) + 1;
|
||||||
|
|
||||||
if( LM_AllocBlock( smax, tmax, &surf->info->dlight_s, &surf->info->dlight_t ))
|
if( LM_AllocBlock( smax, tmax, &surf->info->dlight_s, &surf->info->dlight_t ))
|
||||||
{
|
{
|
||||||
|
@ -1195,13 +1209,14 @@ dynamic:
|
||||||
{
|
{
|
||||||
if(( fa->styles[maps] >= 32 || fa->styles[maps] == 0 || fa->styles[maps] == 20 ) && ( fa->dlightframe != tr.framecount ))
|
if(( fa->styles[maps] >= 32 || fa->styles[maps] == 0 || fa->styles[maps] == 20 ) && ( fa->dlightframe != tr.framecount ))
|
||||||
{
|
{
|
||||||
byte temp[132*132*4];
|
byte temp[132*132*4];
|
||||||
int sample_size;
|
mextrasurf_t *info = fa->info;
|
||||||
int smax, tmax;
|
int sample_size;
|
||||||
|
int smax, tmax;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( fa );
|
sample_size = Mod_SampleSizeForFace( fa );
|
||||||
smax = ( fa->extents[0] / sample_size ) + 1;
|
smax = ( info->lightextents[0] / sample_size ) + 1;
|
||||||
tmax = ( fa->extents[1] / sample_size ) + 1;
|
tmax = ( info->lightextents[1] / sample_size ) + 1;
|
||||||
|
|
||||||
R_BuildLightMap( fa, temp, smax * 4, true );
|
R_BuildLightMap( fa, temp, smax * 4, true );
|
||||||
R_SetCacheState( fa );
|
R_SetCacheState( fa );
|
||||||
|
@ -2097,17 +2112,18 @@ GL_CreateSurfaceLightmap
|
||||||
*/
|
*/
|
||||||
void GL_CreateSurfaceLightmap( msurface_t *surf )
|
void GL_CreateSurfaceLightmap( msurface_t *surf )
|
||||||
{
|
{
|
||||||
int smax, tmax;
|
int smax, tmax;
|
||||||
int sample_size;
|
int sample_size;
|
||||||
byte *base;
|
mextrasurf_t *info = surf->info;
|
||||||
|
byte *base;
|
||||||
|
|
||||||
if( !cl.worldmodel->lightdata ) return;
|
if( !cl.worldmodel->lightdata ) return;
|
||||||
if( surf->flags & SURF_DRAWTILED )
|
if( surf->flags & SURF_DRAWTILED )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
smax = ( surf->extents[0] / sample_size ) + 1;
|
smax = ( info->lightextents[0] / sample_size ) + 1;
|
||||||
tmax = ( surf->extents[1] / sample_size ) + 1;
|
tmax = ( info->lightextents[1] / sample_size ) + 1;
|
||||||
|
|
||||||
if( !LM_AllocBlock( smax, tmax, &surf->light_s, &surf->light_t ))
|
if( !LM_AllocBlock( smax, tmax, &surf->light_s, &surf->light_t ))
|
||||||
{
|
{
|
||||||
|
|
|
@ -499,10 +499,54 @@ return the current lightmap resolution per face
|
||||||
*/
|
*/
|
||||||
int Mod_SampleSizeForFace( msurface_t *surf )
|
int Mod_SampleSizeForFace( msurface_t *surf )
|
||||||
{
|
{
|
||||||
if( !surf || !surf->texinfo || !surf->texinfo->faceinfo )
|
if( !surf || !surf->texinfo )
|
||||||
return LM_SAMPLE_SIZE;
|
return LM_SAMPLE_SIZE;
|
||||||
|
|
||||||
return surf->texinfo->faceinfo->texture_step;
|
if( FBitSet( surf->texinfo->flags, TEX_WORLD_LUXELS ))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if( surf->texinfo->faceinfo )
|
||||||
|
return surf->texinfo->faceinfo->texture_step;
|
||||||
|
|
||||||
|
return LM_SAMPLE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
Mod_SampleSizeForFace
|
||||||
|
|
||||||
|
return the current lightmap resolution per face
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
static void Mod_LightMatrixFromTexMatrix( const mtexinfo_t *tx, float lmvecs[2][4] )
|
||||||
|
{
|
||||||
|
float lmscale = LM_SAMPLE_SIZE;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if( tx->faceinfo )
|
||||||
|
lmscale = tx->faceinfo->texture_step;
|
||||||
|
|
||||||
|
// copy texmatrix into lightmap matrix fisrt
|
||||||
|
for( i = 0; i < 2; i++ )
|
||||||
|
{
|
||||||
|
for( j = 0; j < 4; j++ )
|
||||||
|
{
|
||||||
|
lmvecs[i][j] = tx->vecs[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !FBitSet( tx->flags, TEX_WORLD_LUXELS ))
|
||||||
|
return; // just use texmatrix
|
||||||
|
|
||||||
|
VectorNormalize( lmvecs[0] );
|
||||||
|
VectorNormalize( lmvecs[1] );
|
||||||
|
|
||||||
|
// put the lighting origin at center the poly
|
||||||
|
VectorScale( lmvecs[0], (1.0 / lmscale), lmvecs[0] );
|
||||||
|
VectorScale( lmvecs[1], -(1.0 / lmscale), lmvecs[1] );
|
||||||
|
|
||||||
|
lmvecs[0][3] = lmscale * 0.5;
|
||||||
|
lmvecs[1][3] = -lmscale * 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1275,16 +1319,21 @@ Fills in surf->texturemins[] and surf->extents[]
|
||||||
static void Mod_CalcSurfaceExtents( msurface_t *surf )
|
static void Mod_CalcSurfaceExtents( msurface_t *surf )
|
||||||
{
|
{
|
||||||
float mins[2], maxs[2], val;
|
float mins[2], maxs[2], val;
|
||||||
|
float lmmins[2], lmmaxs[2];
|
||||||
int bmins[2], bmaxs[2];
|
int bmins[2], bmaxs[2];
|
||||||
int i, j, e, sample_size;
|
int i, j, e, sample_size;
|
||||||
|
mextrasurf_t *info = surf->info;
|
||||||
|
int facenum = surf - loadmodel->surfaces;
|
||||||
mtexinfo_t *tex;
|
mtexinfo_t *tex;
|
||||||
mvertex_t *v;
|
mvertex_t *v;
|
||||||
|
|
||||||
sample_size = Mod_SampleSizeForFace( surf );
|
sample_size = Mod_SampleSizeForFace( surf );
|
||||||
tex = surf->texinfo;
|
tex = surf->texinfo;
|
||||||
|
|
||||||
mins[0] = mins[1] = 999999;
|
Mod_LightMatrixFromTexMatrix( tex, info->lmvecs );
|
||||||
maxs[0] = maxs[1] = -999999;
|
|
||||||
|
mins[0] = lmmins[0] = mins[1] = lmmins[1] = 999999;
|
||||||
|
maxs[0] = lmmaxs[0] = maxs[1] = lmmaxs[1] =-999999;
|
||||||
|
|
||||||
for( i = 0; i < surf->numedges; i++ )
|
for( i = 0; i < surf->numedges; i++ )
|
||||||
{
|
{
|
||||||
|
@ -1299,8 +1348,15 @@ static void Mod_CalcSurfaceExtents( msurface_t *surf )
|
||||||
for( j = 0; j < 2; j++ )
|
for( j = 0; j < 2; j++ )
|
||||||
{
|
{
|
||||||
val = DotProduct( v->position, surf->texinfo->vecs[j] ) + surf->texinfo->vecs[j][3];
|
val = DotProduct( v->position, surf->texinfo->vecs[j] ) + surf->texinfo->vecs[j][3];
|
||||||
if( val < mins[j] ) mins[j] = val;
|
mins[j] = Q_min( val, mins[j] );
|
||||||
if( val > maxs[j] ) maxs[j] = val;
|
maxs[j] = Q_max( val, maxs[j] );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( j = 0; j < 2; j++ )
|
||||||
|
{
|
||||||
|
val = DotProduct( v->position, info->lmvecs[j] ) + info->lmvecs[j][3];
|
||||||
|
lmmins[j] = Q_min( val, lmmins[j] );
|
||||||
|
lmmaxs[j] = Q_max( val, lmmaxs[j] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1312,6 +1368,21 @@ static void Mod_CalcSurfaceExtents( msurface_t *surf )
|
||||||
surf->texturemins[i] = bmins[i] * sample_size;
|
surf->texturemins[i] = bmins[i] * sample_size;
|
||||||
surf->extents[i] = (bmaxs[i] - bmins[i]) * sample_size;
|
surf->extents[i] = (bmaxs[i] - bmins[i]) * sample_size;
|
||||||
|
|
||||||
|
if( FBitSet( tex->flags, TEX_WORLD_LUXELS ))
|
||||||
|
{
|
||||||
|
lmmins[i] = floor( lmmins[i] );
|
||||||
|
lmmaxs[i] = ceil( lmmaxs[i] );
|
||||||
|
|
||||||
|
info->lightmapmins[i] = lmmins[i];
|
||||||
|
info->lightextents[i] = (lmmaxs[i] - lmmins[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// just copy texturemins
|
||||||
|
info->lightmapmins[i] = surf->texturemins[i];
|
||||||
|
info->lightextents[i] = surf->extents[i];
|
||||||
|
}
|
||||||
|
|
||||||
if( !FBitSet( tex->flags, TEX_SPECIAL ) && surf->extents[i] > 4096 )
|
if( !FBitSet( tex->flags, TEX_SPECIAL ) && surf->extents[i] > 4096 )
|
||||||
MsgDev( D_ERROR, "Bad surface extents %i\n", surf->extents[i] );
|
MsgDev( D_ERROR, "Bad surface extents %i\n", surf->extents[i] );
|
||||||
}
|
}
|
||||||
|
@ -2072,6 +2143,9 @@ static void Mod_SetupHull( model_t *mod, byte *mempool, int headnode, int hullnu
|
||||||
if(( headnode == -1 ) || ( hullnum != 1 && headnode == 0 ))
|
if(( headnode == -1 ) || ( hullnum != 1 && headnode == 0 ))
|
||||||
return; // hull missed
|
return; // hull missed
|
||||||
|
|
||||||
|
if( headnode >= world.numclipnodes )
|
||||||
|
return; // ZHLT weird empty hulls
|
||||||
|
|
||||||
switch( hullnum )
|
switch( hullnum )
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -223,7 +223,7 @@ qboolean PM_RecursiveHullCheck( hull_t *hull, int num, float p1f, float p2f, vec
|
||||||
|
|
||||||
if( hull->firstclipnode >= hull->lastclipnode )
|
if( hull->firstclipnode >= hull->lastclipnode )
|
||||||
{
|
{
|
||||||
// studiotrace issues
|
// empty hull?
|
||||||
trace->allsolid = false;
|
trace->allsolid = false;
|
||||||
trace->inopen = true;
|
trace->inopen = true;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1377,7 +1377,8 @@ static qboolean SV_RecursiveLightPoint( model_t *model, mnode_t *node, const vec
|
||||||
mtexinfo_t *tex;
|
mtexinfo_t *tex;
|
||||||
float front, back, scale, frac;
|
float front, back, scale, frac;
|
||||||
int i, map, size, s, t;
|
int i, map, size, s, t;
|
||||||
int sample_size;
|
float sample_size;
|
||||||
|
mextrasurf_t *info;
|
||||||
color24 *lm;
|
color24 *lm;
|
||||||
vec3_t mid;
|
vec3_t mid;
|
||||||
|
|
||||||
|
@ -1419,14 +1420,15 @@ static qboolean SV_RecursiveLightPoint( model_t *model, mnode_t *node, const vec
|
||||||
for( i = 0; i < node->numsurfaces; i++, surf++ )
|
for( i = 0; i < node->numsurfaces; i++, surf++ )
|
||||||
{
|
{
|
||||||
tex = surf->texinfo;
|
tex = surf->texinfo;
|
||||||
|
info = surf->info;
|
||||||
|
|
||||||
if( surf->flags & SURF_DRAWTILED )
|
if( surf->flags & SURF_DRAWTILED )
|
||||||
continue; // no lightmaps
|
continue; // no lightmaps
|
||||||
|
|
||||||
s = DotProduct( mid, tex->vecs[0] ) + tex->vecs[0][3] - surf->texturemins[0];
|
s = DotProduct( mid, info->lmvecs[0] ) + info->lmvecs[0][3] - info->lightmapmins[0];
|
||||||
t = DotProduct( mid, tex->vecs[1] ) + tex->vecs[1][3] - surf->texturemins[1];
|
t = DotProduct( mid, info->lmvecs[1] ) + info->lmvecs[1][3] - info->lightmapmins[1];
|
||||||
|
|
||||||
if(( s < 0.0f || s > surf->extents[0] ) || ( t < 0.0f || t > surf->extents[1] ))
|
if(( s < 0 || s > info->lightextents[0] ) || ( t < 0 || t > info->lightextents[1] ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( !surf->samples )
|
if( !surf->samples )
|
||||||
|
@ -1438,8 +1440,8 @@ static qboolean SV_RecursiveLightPoint( model_t *model, mnode_t *node, const vec
|
||||||
|
|
||||||
VectorClear( sv_pointColor );
|
VectorClear( sv_pointColor );
|
||||||
|
|
||||||
lm = surf->samples + (t * ((surf->extents[0] / sample_size) + 1) + s);
|
lm = surf->samples + (t * ((info->lightextents[0] / (int)sample_size) + 1) + s);
|
||||||
size = ((surf->extents[0] / sample_size) + 1) * ((surf->extents[1] / sample_size) + 1);
|
size = ((info->lightextents[0] / (int)sample_size) + 1) * ((info->lightextents[1] / sample_size) + 1);
|
||||||
|
|
||||||
for( map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++ )
|
for( map = 0; map < MAXLIGHTMAPS && surf->styles[map] != 255; map++ )
|
||||||
{
|
{
|
||||||
|
|
Reference in New Issue