04 Sep 2013
This commit is contained in:
parent
004465e00b
commit
0e5ba36d21
10
change.log
10
change.log
|
@ -1,3 +1,13 @@
|
||||||
|
build 2402
|
||||||
|
|
||||||
|
Engine: added new feature flag for compensate stupid quake bug
|
||||||
|
Client: update the render interface, added usefully function GL_TextureTarget
|
||||||
|
Render: get support for GL_RECTANGLE textures
|
||||||
|
Client: fix playerangles in event receive (Paranoia bug with decals)
|
||||||
|
Render: fixed mipmap generation for normalmaps (TF_NORMALMAP)
|
||||||
|
Render: added two built-in textures: *blankbump and *whiteCube (self-explanatory names)
|
||||||
|
Engine: made better check for Half-Life alpha maps (version 29 with colored lighting)
|
||||||
|
|
||||||
build 2271
|
build 2271
|
||||||
|
|
||||||
Client: fix message TE_GLOWSPRITE. The gaussgun in Xash Mod is properly worked now.
|
Client: fix message TE_GLOWSPRITE. The gaussgun in Xash Mod is properly worked now.
|
||||||
|
|
|
@ -22,5 +22,6 @@ GNU General Public License for more details.
|
||||||
#define ENGINE_BUILD_STVECTORS (1<<2) // build ST-vectors for surfmeshes. ENGINE_BUILD_SURFMESHES must be set!
|
#define ENGINE_BUILD_STVECTORS (1<<2) // build ST-vectors for surfmeshes. ENGINE_BUILD_SURFMESHES must be set!
|
||||||
#define ENGINE_TRANSFORM_TRACE_AABB (1<<3) // transform trace bbox into local space of rotating bmodels
|
#define ENGINE_TRANSFORM_TRACE_AABB (1<<3) // transform trace bbox into local space of rotating bmodels
|
||||||
#define ENGINE_LARGE_LIGHTMAPS (1<<4) // change lightmap sizes from 128x128 to 256x256
|
#define ENGINE_LARGE_LIGHTMAPS (1<<4) // change lightmap sizes from 128x128 to 256x256
|
||||||
|
#define ENGINE_COMPENSATE_QUAKE_BUG (1<<5) // compensate stupid quake bug (inverse pitch) for mods where this bug is fixed
|
||||||
|
|
||||||
#endif//FEATURES_H
|
#endif//FEATURES_H
|
|
@ -46,6 +46,7 @@ GNU General Public License for more details.
|
||||||
#define PARM_TEX_TEXNUM 18
|
#define PARM_TEX_TEXNUM 18
|
||||||
#define PARM_TEX_FLAGS 19
|
#define PARM_TEX_FLAGS 19
|
||||||
#define PARM_FEATURES 20 // same as movevars->features
|
#define PARM_FEATURES 20 // same as movevars->features
|
||||||
|
#define PARM_ACTIVE_TMU 21 // for debug
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -82,6 +83,7 @@ typedef enum
|
||||||
TF_BORDER = (1<<19),
|
TF_BORDER = (1<<19),
|
||||||
TF_TEXTURE_3D = (1<<20), // this is GL_TEXTURE_3D
|
TF_TEXTURE_3D = (1<<20), // this is GL_TEXTURE_3D
|
||||||
TF_FLOAT = (1<<21), // use GL_FLOAT instead of GL_UNSIGNED_BYTE
|
TF_FLOAT = (1<<21), // use GL_FLOAT instead of GL_UNSIGNED_BYTE
|
||||||
|
TF_TEXTURE_RECTANGLE= (1<<22), // this is GL_TEXTURE_RECTANGLE
|
||||||
} texFlags_t;
|
} texFlags_t;
|
||||||
|
|
||||||
typedef struct beam_s BEAM;
|
typedef struct beam_s BEAM;
|
||||||
|
@ -169,6 +171,9 @@ typedef struct render_api_s
|
||||||
// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 26
|
// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 26
|
||||||
void (*R_EntityRemoveDecals)( struct model_s *mod ); // remove all the decals from specified entity (BSP only)
|
void (*R_EntityRemoveDecals)( struct model_s *mod ); // remove all the decals from specified entity (BSP only)
|
||||||
float *(*R_DecalSetupVerts)( struct decal_s *pDecal, struct msurface_s *surf, int texture, int *outCount );
|
float *(*R_DecalSetupVerts)( struct decal_s *pDecal, struct msurface_s *surf, int texture, int *outCount );
|
||||||
|
void (*R_StoreEfragsExt)( struct efrag_s **ppefrag, int framecount ); // store efrags for static entities
|
||||||
|
void (*GL_TextureTarget)( unsigned int target ); // change texture unit mode without bind texture
|
||||||
|
struct mstudiotex_s *( *StudioGetTexture )( struct cl_entity_s *e ); // moved here to avoid incompatibility with IEngineStudio official iface
|
||||||
} render_api_t;
|
} render_api_t;
|
||||||
|
|
||||||
// render callbacks
|
// render callbacks
|
||||||
|
|
|
@ -372,9 +372,20 @@ void CL_ParseEvent( sizebuf_t *msg )
|
||||||
if( args.entindex >= 1 && args.entindex <= cl.maxclients )
|
if( args.entindex >= 1 && args.entindex <= cl.maxclients )
|
||||||
{
|
{
|
||||||
if(( args.entindex - 1 ) == cl.playernum )
|
if(( args.entindex - 1 ) == cl.playernum )
|
||||||
|
{
|
||||||
|
if( state && !CL_IsPredicted( ))
|
||||||
|
{
|
||||||
|
// restore viewangles from angles
|
||||||
|
args.angles[PITCH] = -state->angles[PITCH] * 3;
|
||||||
|
args.angles[YAW] = state->angles[YAW];
|
||||||
|
args.angles[ROLL] = 0; // no roll
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// get the predicted angles
|
// get the predicted angles
|
||||||
VectorCopy( cl.refdef.cl_viewangles, args.angles );
|
VectorCopy( cl.refdef.cl_viewangles, args.angles );
|
||||||
|
}
|
||||||
|
|
||||||
VectorCopy( cl.frame.local.client.origin, args.origin );
|
VectorCopy( cl.frame.local.client.origin, args.origin );
|
||||||
VectorCopy( cl.frame.local.client.velocity, args.velocity );
|
VectorCopy( cl.frame.local.client.velocity, args.velocity );
|
||||||
}
|
}
|
||||||
|
|
|
@ -234,6 +234,29 @@ void GL_MultiTexCoord2f( GLenum texture, GLfloat s, GLfloat t )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
GL_TextureTarget
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void GL_TextureTarget( uint target )
|
||||||
|
{
|
||||||
|
if( glState.activeTMU < 0 || glState.activeTMU >= glConfig.max_texture_units )
|
||||||
|
{
|
||||||
|
MsgDev( D_ERROR, "GL_TextureTarget: bad tmu state %i\n", glState.activeTMU );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( glState.currentTextureTargets[glState.activeTMU] != target )
|
||||||
|
{
|
||||||
|
if( glState.currentTextureTargets[glState.activeTMU] != GL_NONE )
|
||||||
|
pglDisable( glState.currentTextureTargets[glState.activeTMU] );
|
||||||
|
glState.currentTextureTargets[glState.activeTMU] = target;
|
||||||
|
if( target != GL_NONE )
|
||||||
|
pglEnable( glState.currentTextureTargets[glState.activeTMU] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
GL_TexGen
|
GL_TexGen
|
||||||
|
@ -635,11 +658,17 @@ rebuild_page:
|
||||||
pglBegin( GL_QUADS );
|
pglBegin( GL_QUADS );
|
||||||
pglTexCoord2f( 0, 0 );
|
pglTexCoord2f( 0, 0 );
|
||||||
pglVertex2f( x, y );
|
pglVertex2f( x, y );
|
||||||
pglTexCoord2f( 1, 0 );
|
if( image->flags & TF_TEXTURE_RECTANGLE )
|
||||||
|
pglTexCoord2f( image->width, 0 );
|
||||||
|
else pglTexCoord2f( 1, 0 );
|
||||||
pglVertex2f( x + w, y );
|
pglVertex2f( x + w, y );
|
||||||
pglTexCoord2f( 1, 1 );
|
if( image->flags & TF_TEXTURE_RECTANGLE )
|
||||||
|
pglTexCoord2f( image->width, image->height );
|
||||||
|
else pglTexCoord2f( 1, 1 );
|
||||||
pglVertex2f( x + w, y + h );
|
pglVertex2f( x + w, y + h );
|
||||||
pglTexCoord2f( 0, 1 );
|
if( image->flags & TF_TEXTURE_RECTANGLE )
|
||||||
|
pglTexCoord2f( 0, image->height );
|
||||||
|
else pglTexCoord2f( 0, 1 );
|
||||||
pglVertex2f( x, y + h );
|
pglVertex2f( x, y + h );
|
||||||
pglEnd();
|
pglEnd();
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,8 @@ const char *GL_Target( GLenum target )
|
||||||
return "3D";
|
return "3D";
|
||||||
case GL_TEXTURE_CUBE_MAP_ARB:
|
case GL_TEXTURE_CUBE_MAP_ARB:
|
||||||
return "Cube";
|
return "Cube";
|
||||||
|
case GL_TEXTURE_RECTANGLE_EXT:
|
||||||
|
return "Rect";
|
||||||
}
|
}
|
||||||
return "??";
|
return "??";
|
||||||
}
|
}
|
||||||
|
@ -439,6 +441,9 @@ void R_TextureList_f( void )
|
||||||
case GL_TEXTURE_CUBE_MAP_ARB:
|
case GL_TEXTURE_CUBE_MAP_ARB:
|
||||||
Msg( "CUBE " );
|
Msg( "CUBE " );
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_RECTANGLE_EXT:
|
||||||
|
Msg( "RECT " );
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Msg( "???? " );
|
Msg( "???? " );
|
||||||
break;
|
break;
|
||||||
|
@ -519,6 +524,16 @@ void GL_RoundImageDimensions( word *width, word *height, texFlags_t flags, qbool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if( flags & TF_TEXTURE_RECTANGLE )
|
||||||
|
{
|
||||||
|
while( scaledWidth > glConfig.max_2d_rectangle_size || scaledHeight > glConfig.max_2d_rectangle_size )
|
||||||
|
{
|
||||||
|
scaledWidth >>= 1;
|
||||||
|
scaledHeight >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
while( scaledWidth > glConfig.max_2d_texture_size || scaledHeight > glConfig.max_2d_texture_size )
|
while( scaledWidth > glConfig.max_2d_texture_size || scaledHeight > glConfig.max_2d_texture_size )
|
||||||
{
|
{
|
||||||
|
@ -526,6 +541,7 @@ void GL_RoundImageDimensions( word *width, word *height, texFlags_t flags, qbool
|
||||||
scaledHeight >>= 1;
|
scaledHeight >>= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( scaledWidth < 1 ) scaledWidth = 1;
|
if( scaledWidth < 1 ) scaledWidth = 1;
|
||||||
if( scaledHeight < 1 ) scaledHeight = 1;
|
if( scaledHeight < 1 ) scaledHeight = 1;
|
||||||
|
@ -958,7 +974,8 @@ static void GL_UploadTexture( rgbdata_t *pic, gltexture_t *tex, qboolean subImag
|
||||||
inFormat = GL_DEPTH_COMPONENT;
|
inFormat = GL_DEPTH_COMPONENT;
|
||||||
dataType = GL_UNSIGNED_BYTE;
|
dataType = GL_UNSIGNED_BYTE;
|
||||||
}
|
}
|
||||||
else if( pic->flags & IMAGE_CUBEMAP )
|
|
||||||
|
if( pic->flags & IMAGE_CUBEMAP )
|
||||||
{
|
{
|
||||||
if( GL_Support( GL_TEXTURECUBEMAP_EXT ))
|
if( GL_Support( GL_TEXTURECUBEMAP_EXT ))
|
||||||
{
|
{
|
||||||
|
@ -984,6 +1001,12 @@ static void GL_UploadTexture( rgbdata_t *pic, gltexture_t *tex, qboolean subImag
|
||||||
// determine target
|
// determine target
|
||||||
tex->target = glTarget = GL_TEXTURE_1D;
|
tex->target = glTarget = GL_TEXTURE_1D;
|
||||||
}
|
}
|
||||||
|
else if( tex->flags & TF_TEXTURE_RECTANGLE )
|
||||||
|
{
|
||||||
|
if( glConfig.max_2d_rectangle_size )
|
||||||
|
tex->target = glTarget = glConfig.texRectangle;
|
||||||
|
// or leave as GL_TEXTURE_2D
|
||||||
|
}
|
||||||
else if( tex->flags & TF_TEXTURE_3D )
|
else if( tex->flags & TF_TEXTURE_3D )
|
||||||
{
|
{
|
||||||
// determine target
|
// determine target
|
||||||
|
@ -1051,10 +1074,12 @@ static void GL_UploadTexture( rgbdata_t *pic, gltexture_t *tex, qboolean subImag
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( GL_Support( GL_SGIS_MIPMAPS_EXT )) GL_GenerateMipmaps( data, pic, tex, glTarget, inFormat, i, subImage );
|
if( GL_Support( GL_SGIS_MIPMAPS_EXT ) && !( tex->flags & TF_NORMALMAP ))
|
||||||
|
GL_GenerateMipmaps( data, pic, tex, glTarget, inFormat, i, subImage );
|
||||||
if( subImage ) pglTexSubImage2D( tex->target, 0, 0, 0, tex->width, tex->height, inFormat, dataType, data );
|
if( subImage ) pglTexSubImage2D( tex->target, 0, 0, 0, tex->width, tex->height, inFormat, dataType, data );
|
||||||
else pglTexImage2D( tex->target, 0, outFormat, tex->width, tex->height, 0, inFormat, dataType, data );
|
else pglTexImage2D( tex->target, 0, outFormat, tex->width, tex->height, 0, inFormat, dataType, data );
|
||||||
if( !GL_Support( GL_SGIS_MIPMAPS_EXT )) GL_GenerateMipmaps( data, pic, tex, glTarget, inFormat, i, subImage );
|
if( !GL_Support( GL_SGIS_MIPMAPS_EXT ) || ( tex->flags & TF_NORMALMAP ))
|
||||||
|
GL_GenerateMipmaps( data, pic, tex, glTarget, inFormat, i, subImage );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( numSides > 1 ) buf += offset;
|
if( numSides > 1 ) buf += offset;
|
||||||
|
@ -1639,6 +1664,34 @@ static rgbdata_t *R_InitBlackTexture( texFlags_t *flags )
|
||||||
return R_InitSolidColorTexture( flags, 0 );
|
return R_InitSolidColorTexture( flags, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
R_InitBlankBumpTexture
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
static rgbdata_t *R_InitBlankBumpTexture( texFlags_t *flags )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// default normalmap texture
|
||||||
|
for( i = 0; i < 256; i++ )
|
||||||
|
{
|
||||||
|
data2D[i*4+0] = 127;
|
||||||
|
data2D[i*4+1] = 127;
|
||||||
|
data2D[i*4+2] = 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
*flags = TF_NORMALMAP|TF_UNCOMPRESSED;
|
||||||
|
|
||||||
|
r_image.buffer = data2D;
|
||||||
|
r_image.width = r_image.height = 16;
|
||||||
|
r_image.size = r_image.width * r_image.height * 4;
|
||||||
|
r_image.flags = IMAGE_HAS_COLOR;
|
||||||
|
r_image.type = PF_RGBA_32;
|
||||||
|
|
||||||
|
return &r_image;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
R_InitAttenuationTexture
|
R_InitAttenuationTexture
|
||||||
|
@ -1923,6 +1976,33 @@ static rgbdata_t *R_InitGrayCubemap( texFlags_t *flags )
|
||||||
return &r_image;
|
return &r_image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
R_InitWhiteCubemap
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
static rgbdata_t *R_InitWhiteCubemap( texFlags_t *flags )
|
||||||
|
{
|
||||||
|
int size = 4;
|
||||||
|
byte *dataCM = data2D;
|
||||||
|
|
||||||
|
if( !GL_Support( GL_TEXTURECUBEMAP_EXT ))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// white cubemap - just stub for pointlights
|
||||||
|
Q_memset( dataCM, 0xFF, size * size * 6 * 4 );
|
||||||
|
|
||||||
|
*flags = (TF_NOPICMIP|TF_NOMIPMAP|TF_UNCOMPRESSED|TF_CUBEMAP|TF_CLAMP);
|
||||||
|
|
||||||
|
r_image.width = r_image.height = size;
|
||||||
|
r_image.size = r_image.width * r_image.height * 4 * 6;
|
||||||
|
r_image.flags |= (IMAGE_CUBEMAP|IMAGE_HAS_COLOR); // yes it's cubemap
|
||||||
|
r_image.buffer = data2D;
|
||||||
|
r_image.type = PF_RGBA_32;
|
||||||
|
|
||||||
|
return &r_image;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
R_InitBuiltinTextures
|
R_InitBuiltinTextures
|
||||||
|
@ -1956,8 +2036,10 @@ static void R_InitBuiltinTextures( void )
|
||||||
{ "*atten3", &tr.attenuationTexture3, R_InitAttenuationTexture3, TEX_SYSTEM },
|
{ "*atten3", &tr.attenuationTexture3, R_InitAttenuationTexture3, TEX_SYSTEM },
|
||||||
{ "*attnno", &tr.attenuationStubTexture, R_InitAttenuationTextureNoAtten, TEX_SYSTEM },
|
{ "*attnno", &tr.attenuationStubTexture, R_InitAttenuationTextureNoAtten, TEX_SYSTEM },
|
||||||
{ "*normalize", &tr.normalizeTexture, R_InitNormalizeCubemap, TEX_CUBEMAP },
|
{ "*normalize", &tr.normalizeTexture, R_InitNormalizeCubemap, TEX_CUBEMAP },
|
||||||
|
{ "*blankbump", &tr.blankbumpTexture, R_InitBlankBumpTexture, TEX_SYSTEM },
|
||||||
{ "*lightCube", &tr.dlightCubeTexture, R_InitDlightCubemap, TEX_CUBEMAP },
|
{ "*lightCube", &tr.dlightCubeTexture, R_InitDlightCubemap, TEX_CUBEMAP },
|
||||||
{ "*grayCube", &tr.grayCubeTexture, R_InitGrayCubemap, TEX_CUBEMAP },
|
{ "*grayCube", &tr.grayCubeTexture, R_InitGrayCubemap, TEX_CUBEMAP },
|
||||||
|
{ "*whiteCube", &tr.whiteCubeTexture, R_InitWhiteCubemap, TEX_CUBEMAP },
|
||||||
{ "*atten3D", &tr.attenuationTexture3D, R_InitAttenTexture3D, TEX_SYSTEM },
|
{ "*atten3D", &tr.attenuationTexture3D, R_InitAttenTexture3D, TEX_SYSTEM },
|
||||||
{ "*sky", &tr.skyTexture, R_InitSkyTexture, TEX_SYSTEM },
|
{ "*sky", &tr.skyTexture, R_InitSkyTexture, TEX_SYSTEM },
|
||||||
{ NULL, NULL, NULL }
|
{ NULL, NULL, NULL }
|
||||||
|
|
|
@ -190,9 +190,11 @@ typedef struct
|
||||||
int attenuationTexture3;// bright attenuation
|
int attenuationTexture3;// bright attenuation
|
||||||
int attenuationTexture3D;// 3D attenuation
|
int attenuationTexture3D;// 3D attenuation
|
||||||
int attenuationStubTexture;
|
int attenuationStubTexture;
|
||||||
|
int blankbumpTexture;
|
||||||
int normalizeTexture;
|
int normalizeTexture;
|
||||||
int dlightCubeTexture; // dynamic cubemap
|
int dlightCubeTexture; // dynamic cubemap
|
||||||
int grayCubeTexture;
|
int grayCubeTexture;
|
||||||
|
int whiteCubeTexture;
|
||||||
int skyboxTextures[6]; // skybox sides
|
int skyboxTextures[6]; // skybox sides
|
||||||
int mirrorTextures[MAX_MIRRORS];
|
int mirrorTextures[MAX_MIRRORS];
|
||||||
int num_mirrors_used; // used mirror textures
|
int num_mirrors_used; // used mirror textures
|
||||||
|
@ -279,6 +281,7 @@ void GL_LoadIdentityTexMatrix( void );
|
||||||
void GL_DisableAllTexGens( void );
|
void GL_DisableAllTexGens( void );
|
||||||
void GL_SetRenderMode( int mode );
|
void GL_SetRenderMode( int mode );
|
||||||
void GL_FrontFace( GLenum front );
|
void GL_FrontFace( GLenum front );
|
||||||
|
void GL_TextureTarget( uint target );
|
||||||
void GL_Cull( GLenum cull );
|
void GL_Cull( GLenum cull );
|
||||||
void R_ShowTextures( void );
|
void R_ShowTextures( void );
|
||||||
|
|
||||||
|
@ -337,7 +340,7 @@ void R_FindMirrors( const ref_params_t *fd );
|
||||||
//
|
//
|
||||||
// gl_refrag.c
|
// gl_refrag.c
|
||||||
//
|
//
|
||||||
void R_StoreEfrags( efrag_t **ppefrag );
|
void R_StoreEfrags( efrag_t **ppefrag, int framecount );
|
||||||
|
|
||||||
//
|
//
|
||||||
// gl_rlight.c
|
// gl_rlight.c
|
||||||
|
@ -420,6 +423,7 @@ void R_DrawSpriteModel( cl_entity_t *e );
|
||||||
//
|
//
|
||||||
void R_StudioInit( void );
|
void R_StudioInit( void );
|
||||||
void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded );
|
void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded );
|
||||||
|
struct mstudiotex_s *R_StudioGetTexture( cl_entity_t *e );
|
||||||
void R_DrawStudioModel( cl_entity_t *e );
|
void R_DrawStudioModel( cl_entity_t *e );
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -186,7 +186,7 @@ R_StoreEfrags
|
||||||
|
|
||||||
================
|
================
|
||||||
*/
|
*/
|
||||||
void R_StoreEfrags( efrag_t **ppefrag )
|
void R_StoreEfrags( efrag_t **ppefrag, int framecount )
|
||||||
{
|
{
|
||||||
cl_entity_t *pent;
|
cl_entity_t *pent;
|
||||||
model_t *clmodel;
|
model_t *clmodel;
|
||||||
|
@ -205,12 +205,12 @@ void R_StoreEfrags( efrag_t **ppefrag )
|
||||||
case mod_sprite:
|
case mod_sprite:
|
||||||
pent = pefrag->entity;
|
pent = pefrag->entity;
|
||||||
|
|
||||||
if( pent->visframe != tr.framecount )
|
if( pent->visframe != framecount )
|
||||||
{
|
{
|
||||||
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
|
||||||
{
|
{
|
||||||
// mark that we've recorded this entity for this frame
|
// mark that we've recorded this entity for this frame
|
||||||
pent->visframe = tr.framecount;
|
pent->visframe = framecount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1444,6 +1444,8 @@ static int GL_RenderGetParm( int parm, int arg )
|
||||||
return glt->flags;
|
return glt->flags;
|
||||||
case PARM_FEATURES:
|
case PARM_FEATURES:
|
||||||
return host.features;
|
return host.features;
|
||||||
|
case PARM_ACTIVE_TMU:
|
||||||
|
return glState.activeTMU;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1562,6 +1564,11 @@ static int GL_LoadTextureNoFilter( const char *name, const byte *buf, size_t siz
|
||||||
return GL_LoadTexture( name, buf, size, flags, NULL );
|
return GL_LoadTexture( name, buf, size, flags, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void GL_StoreEfrags( efrag_t **ppefrag )
|
||||||
|
{
|
||||||
|
R_StoreEfrags( ppefrag, tr.framecount );
|
||||||
|
}
|
||||||
|
|
||||||
static render_api_t gRenderAPI =
|
static render_api_t gRenderAPI =
|
||||||
{
|
{
|
||||||
GL_RenderGetParm,
|
GL_RenderGetParm,
|
||||||
|
@ -1575,7 +1582,7 @@ static render_api_t gRenderAPI =
|
||||||
R_SetCurrentEntity,
|
R_SetCurrentEntity,
|
||||||
R_SetCurrentModel,
|
R_SetCurrentModel,
|
||||||
GL_SetWorldviewProjectionMatrix,
|
GL_SetWorldviewProjectionMatrix,
|
||||||
R_StoreEfrags,
|
GL_StoreEfrags,
|
||||||
GL_FindTexture,
|
GL_FindTexture,
|
||||||
GL_TextureName,
|
GL_TextureName,
|
||||||
GL_LoadTextureNoFilter,
|
GL_LoadTextureNoFilter,
|
||||||
|
@ -1604,6 +1611,9 @@ static render_api_t gRenderAPI =
|
||||||
GL_TexGen,
|
GL_TexGen,
|
||||||
R_EntityRemoveDecals,
|
R_EntityRemoveDecals,
|
||||||
R_DecalSetupVerts,
|
R_DecalSetupVerts,
|
||||||
|
R_StoreEfrags,
|
||||||
|
GL_TextureTarget,
|
||||||
|
R_StudioGetTexture, // moved here to avoid incompatibility with official expanded interface of IEngineStduio (HLSDK Update at 30.08.2013)
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1654,7 +1654,7 @@ void R_RecursiveWorldNode( mnode_t *node, uint clipflags )
|
||||||
|
|
||||||
// deal with model fragments in this leaf
|
// deal with model fragments in this leaf
|
||||||
if( pleaf->efrags )
|
if( pleaf->efrags )
|
||||||
R_StoreEfrags( &pleaf->efrags );
|
R_StoreEfrags( &pleaf->efrags, tr.framecount );
|
||||||
|
|
||||||
r_stats.c_world_leafs++;
|
r_stats.c_world_leafs++;
|
||||||
return;
|
return;
|
||||||
|
@ -1747,7 +1747,7 @@ static void R_DrawTopViewLeaf( mleaf_t *pleaf, uint clipflags )
|
||||||
|
|
||||||
// deal with model fragments in this leaf
|
// deal with model fragments in this leaf
|
||||||
if( pleaf->efrags )
|
if( pleaf->efrags )
|
||||||
R_StoreEfrags( &pleaf->efrags );
|
R_StoreEfrags( &pleaf->efrags, tr.framecount );
|
||||||
|
|
||||||
r_stats.c_world_leafs++;
|
r_stats.c_world_leafs++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -558,8 +558,8 @@ void R_StudioSetUpTransform( cl_entity_t *e )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// stupid Half-Life bug
|
if( !( host.features & ENGINE_COMPENSATE_QUAKE_BUG ))
|
||||||
angles[PITCH] = -angles[PITCH];
|
angles[PITCH] = -angles[PITCH]; // stupid quake bug
|
||||||
|
|
||||||
// don't rotate clients, only aim
|
// don't rotate clients, only aim
|
||||||
if( e->player ) angles[PITCH] = 0.0f;
|
if( e->player ) angles[PITCH] = 0.0f;
|
||||||
|
|
|
@ -48,6 +48,6 @@ int Q_buildnum( void )
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
#else
|
#else
|
||||||
return 2271;
|
return 2402;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
|
@ -229,6 +229,8 @@ hull_t *Mod_HullForStudio( model_t *model, float frame, int sequence, vec3_t ang
|
||||||
ASSERT( pBlendAPI != NULL );
|
ASSERT( pBlendAPI != NULL );
|
||||||
|
|
||||||
VectorCopy( angles, angles2 );
|
VectorCopy( angles, angles2 );
|
||||||
|
|
||||||
|
if( !( host.features & ENGINE_COMPENSATE_QUAKE_BUG ))
|
||||||
angles2[PITCH] = -angles2[PITCH]; // stupid quake bug
|
angles2[PITCH] = -angles2[PITCH]; // stupid quake bug
|
||||||
|
|
||||||
pBlendAPI->SV_StudioSetupBones( model, frame, sequence, angles2, origin, pcontroller, pblending, pEdict, -1 );
|
pBlendAPI->SV_StudioSetupBones( model, frame, sequence, angles2, origin, pcontroller, pblending, pEdict, -1 );
|
||||||
|
@ -753,6 +755,8 @@ void Mod_StudioGetAttachment( const edict_t *e, int iAttachment, float *origin,
|
||||||
pAtt = (mstudioattachment_t *)((byte *)mod_studiohdr + mod_studiohdr->attachmentindex);
|
pAtt = (mstudioattachment_t *)((byte *)mod_studiohdr + mod_studiohdr->attachmentindex);
|
||||||
|
|
||||||
VectorCopy( e->v.angles, angles2 );
|
VectorCopy( e->v.angles, angles2 );
|
||||||
|
|
||||||
|
if( !( host.features & ENGINE_COMPENSATE_QUAKE_BUG ))
|
||||||
angles2[PITCH] = -angles2[PITCH];
|
angles2[PITCH] = -angles2[PITCH];
|
||||||
|
|
||||||
pBlendAPI->SV_StudioSetupBones( mod, e->v.frame, e->v.sequence, angles2, e->v.origin,
|
pBlendAPI->SV_StudioSetupBones( mod, e->v.frame, e->v.sequence, angles2, e->v.origin,
|
||||||
|
|
|
@ -2679,8 +2679,8 @@ static void Mod_LoadBrushModel( model_t *mod, const void *buffer, qboolean *load
|
||||||
Mod_LoadPlanes( &header->lumps[LUMP_PLANES] );
|
Mod_LoadPlanes( &header->lumps[LUMP_PLANES] );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Half-Life: alpha version has BSP version 29 and map version 220
|
// Half-Life: alpha version has BSP version 29 and map version 220 (and lightdata is RGB)
|
||||||
if( world.version <= 29 && world.mapversion == 220 )
|
if( world.version <= 29 && world.mapversion == 220 && (header->lumps[LUMP_LIGHTING].filelen % 3) == 0 )
|
||||||
world.version = bmodel_version = HLBSP_VERSION;
|
world.version = bmodel_version = HLBSP_VERSION;
|
||||||
|
|
||||||
Mod_LoadVertexes( &header->lumps[LUMP_VERTEXES] );
|
Mod_LoadVertexes( &header->lumps[LUMP_VERTEXES] );
|
||||||
|
|
|
@ -1256,6 +1256,7 @@ void SV_Physics_Compound( edict_t *ent )
|
||||||
Matrix4x4_CreateFromEntity( end_l, parent->v.angles, parent->v.origin, 1.0f );
|
Matrix4x4_CreateFromEntity( end_l, parent->v.angles, parent->v.origin, 1.0f );
|
||||||
|
|
||||||
// stupid quake bug!!!
|
// stupid quake bug!!!
|
||||||
|
if( !( host.features & ENGINE_COMPENSATE_QUAKE_BUG ))
|
||||||
ent->v.angles[PITCH] = -ent->v.angles[PITCH];
|
ent->v.angles[PITCH] = -ent->v.angles[PITCH];
|
||||||
|
|
||||||
// create child actual position
|
// create child actual position
|
||||||
|
@ -1269,6 +1270,7 @@ void SV_Physics_Compound( edict_t *ent )
|
||||||
Matrix4x4_ConvertToEntity( child, ent->v.angles, ent->v.origin );
|
Matrix4x4_ConvertToEntity( child, ent->v.angles, ent->v.origin );
|
||||||
|
|
||||||
// stupid quake bug!!!
|
// stupid quake bug!!!
|
||||||
|
if( !( host.features & ENGINE_COMPENSATE_QUAKE_BUG ))
|
||||||
ent->v.angles[PITCH] = -ent->v.angles[PITCH];
|
ent->v.angles[PITCH] = -ent->v.angles[PITCH];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
static const char *uiCreditsDefault[] =
|
static const char *uiCreditsDefault[] =
|
||||||
{
|
{
|
||||||
"",
|
"",
|
||||||
"Copyright XashXT Group 2011 (C)",
|
"Copyright XashXT Group 2013 (C)",
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in New Issue