29 Dec 2008

This commit is contained in:
g-cont 2008-12-29 00:00:00 +03:00 committed by Alibek Omarov
parent c08c09e4d0
commit 8404344c12
21 changed files with 399 additions and 64 deletions

View File

@ -15,6 +15,7 @@
#define LOAD_SHADER (*g_engfuncs.pfnLoadShader)
#define DrawImage (*g_engfuncs.pfnDrawImage)
#define SetColor (*g_engfuncs.pfnSetColor)
#define SetParms (*g_engfuncs.pfnSetParms)
#define CVAR_REGISTER (*g_engfuncs.pfnRegisterVariable)
#define CVAR_SET_FLOAT (*g_engfuncs.pfnCvarSetValue)
#define CVAR_GET_FLOAT (*g_engfuncs.pfnGetCvarFloat)

View File

@ -34,6 +34,10 @@ void CHud :: Init( void )
CHud :: ~CHud( void )
{
delete [] m_rghSprites;
delete [] m_rgrcRects;
delete [] m_rgszSpriteNames;
m_Sound.Close();
if( m_pHudList )
@ -51,8 +55,13 @@ CHud :: ~CHud( void )
int CHud :: GetSpriteIndex( const char *SpriteName )
{
// use built-in Shader Manager
return LOAD_SHADER( SpriteName );
// look through the loaded sprite name list for SpriteName
for( int i = 0; i < m_iSpriteCount; i++ )
{
if(!strncmp( SpriteName, m_rgszSpriteNames + (i * MAX_SPRITE_NAME_LENGTH), MAX_SPRITE_NAME_LENGTH ))
return i;
}
return -1; // invalid sprite
}
void CHud :: VidInit( void )
@ -64,14 +73,57 @@ void CHud :: VidInit( void )
m_hsprCursor = 0;
m_hHudError = 0;
m_flScale = CVAR_GET_FLOAT( "hud_scale" );
// TODO: build real table of fonts widthInChars
for( int i = 0; i < 256; i++ )
charWidths[i] = SMALLCHAR_WIDTH;
iCharHeight = SMALLCHAR_HEIGHT;
// Only load this once
if ( !m_pSpriteList )
{
// we need to load the hud.txt, and all sprites within
m_pSpriteList = SPR_GetList( "scripts/hud.shader", &m_iSpriteCount );
if( m_pSpriteList )
{
// allocated memory for sprite handle arrays
m_rghSprites = new HSPRITE[m_iSpriteCount];
m_rgrcRects = new wrect_t[m_iSpriteCount];
m_rgszSpriteNames = new char[m_iSpriteCount * MAX_SPRITE_NAME_LENGTH];
client_sprite_t *p = m_pSpriteList;
for ( int j = 0; j < m_iSpriteCount; j++ )
{
m_rghSprites[j] = p->hSprite;
m_rgrcRects[j] = p->rc;
strncpy( &m_rgszSpriteNames[j * MAX_SPRITE_NAME_LENGTH], p->szName, MAX_SPRITE_NAME_LENGTH );
p++;
}
}
else
{
ALERT( at_warning, "hud.shader couldn't load\n" );
CVAR_SET_FLOAT( "hud_draw", 0 );
return;
}
}
else
{
// engine may be release unused shaders after reloading map or change level
// loading them again here
client_sprite_t *p = m_pSpriteList;
for( int j = 0; j < m_iSpriteCount; j++ )
{
m_rghSprites[j] = SPR_Load( p->szName );
p++;
}
}
// assumption: number_1, number_2, etc, are all listed and loaded sequentially
m_HUD_number_0 = GetSpriteIndex( "number_0" );
GetImageSize( NULL, &m_iFontHeight, m_HUD_number_0 );
m_iFontHeight = GetSpriteRect( m_HUD_number_0 ).bottom;
// loading error sprite
m_HUD_error = GetSpriteIndex( "error" );
@ -250,8 +302,8 @@ int CHud :: DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g,
if( iNumber >= 100 )
{
k = iNumber / 100;
SPR_Set(GetSprite(LOAD_SHADER( va( "number_%i", k ))), r, g, b );
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(LOAD_SHADER( va( "number_%i", k ))));
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b );
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(m_HUD_number_0 + k));
x += iWidth;
}
else if( iFlags & DHN_3DIGITS )
@ -263,8 +315,8 @@ int CHud :: DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g,
if( iNumber >= 10 )
{
k = (iNumber % 100)/10;
SPR_Set(GetSprite(LOAD_SHADER( va( "number_%i", k ))), r, g, b );
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(LOAD_SHADER( va( "number_%i", k ))));
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b );
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(m_HUD_number_0 + k));
x += iWidth;
}
else if( iFlags & (DHN_3DIGITS|DHN_2DIGITS))
@ -274,8 +326,8 @@ int CHud :: DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g,
// SPR_Draw ones
k = iNumber % 10;
SPR_Set(GetSprite(LOAD_SHADER( va( "number_%i", k ))), r, g, b );
SPR_DrawAdditive(0, x, y, &GetSpriteRect(LOAD_SHADER( va( "number_%i", k ))));
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b );
SPR_DrawAdditive(0, x, y, &GetSpriteRect(m_HUD_number_0 + k));
x += iWidth;
}
else if( iFlags & DHN_DRAWZERO )
@ -289,7 +341,7 @@ int CHud :: DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g,
}
if( iFlags & (DHN_3DIGITS|DHN_2DIGITS)) x += iWidth;
SPR_DrawAdditive( 0, x, y, &GetSpriteRect( m_HUD_number_0 ));
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(m_HUD_number_0));
x += iWidth;
}
return x;

View File

@ -554,6 +554,8 @@ class CHud
{
private:
HUDLIST *m_pHudList;
client_sprite_t *m_pSpriteList;
int m_iSpriteCount;
float m_flMouseSensitivity;
int m_iConcussionEffect;
@ -583,16 +585,28 @@ public:
int m_iHUDColor;
int viewFlags;
private:
wrect_t m_Rect;
// the memory for these arrays are allocated in the first call to CHud::VidInit()
// when the hud.txt and associated sprites are loaded. freed in ~CHud()
HSPRITE *m_rghSprites; // the sprites loaded from hud.txt
wrect_t *m_rgrcRects;
char *m_rgszSpriteNames;
wrect_t m_ScaledRect;
float m_flScale;
public:
HSPRITE GetSprite( int index ) { return (HSPRITE)index; }
wrect_t& GetSpriteRect( HSPRITE index )
HSPRITE GetSprite( int index ) { return (index < 0) ? 0 : m_rghSprites[index]; }
wrect_t& GetSpriteRect( int index, int m_iScaled = FALSE )
{
m_Rect.left = m_Rect.top = 0;
GetImageSize( &m_Rect.right, &m_Rect.bottom, index );
return m_Rect;
if( m_iScaled )
{
m_ScaledRect.top = m_rgrcRects[index].top;
m_ScaledRect.left = m_rgrcRects[index].left;
m_ScaledRect.right = m_rgrcRects[index].right * (m_flScale / 4);
m_ScaledRect.bottom = m_rgrcRects[index].bottom * (m_flScale / 3);
return m_ScaledRect;
}
return m_rgrcRects[index];
}
int InitMessages( void ); // init hud messages
int InitMessages( void ); // init hud messages
int GetSpriteIndex( const char *SpriteName );
CHudAmmo m_Ammo;

View File

@ -948,7 +948,7 @@ int CHudAmmo::DrawWList( float flTime )
else a = 192; // not used ???
ScaleColors( r, g, b, 255 );
SPR_Set( gHUD.GetSprite( LOAD_SHADER( va( "bucket%i", i ))), r, g, b );
SPR_Set( gHUD.GetSprite( m_HUD_bucket0 + i ), r, g, b );
// make active slot wide enough to accomodate gun pictures
if( i == iActiveSlot )
@ -960,7 +960,7 @@ int CHudAmmo::DrawWList( float flTime )
}
else iWidth = giBucketWidth;
SPR_DrawAdditive( 0, x, y, &gHUD.GetSpriteRect(LOAD_SHADER( va( "bucket%i", i ))));
SPR_DrawAdditive( 0, x, y, &gHUD.GetSpriteRect(m_HUD_bucket0 + i));
x += iWidth + 5;
}

View File

@ -31,6 +31,13 @@ typedef struct rect_s
int bottom;
} wrect_t;
typedef struct client_sprite_s
{
char szName[64]; // shader name and sprite name are matched
HSPRITE hSprite;
wrect_t rc;
} client_sprite_t;
typedef HMODULE dllhandle_t;
typedef struct dllfunction_s
{
@ -42,6 +49,7 @@ typedef struct dllfunction_s
#define CVAR_ARCHIVE BIT(0) // set to cause it to be saved to vars.rc
#define CVAR_USERINFO BIT(1) // added to userinfo when changed
#define CVAR_SERVERINFO BIT(2) // added to serverinfo when changed
#define CVAR_LATCH BIT(5)
// macros to hook function calls into the HUD object
#define HOOK_MESSAGE( x ) (*g_engfuncs.pfnHookUserMsg)( #x, __MsgFunc_##x );
@ -131,9 +139,11 @@ extern float READ_ANGLE16( void );
extern void END_READ( void );
// drawing stuff
#define SPR_Load( x ) LOAD_SHADER( x )
extern int SPR_Frames( HSPRITE hPic );
extern int SPR_Height( HSPRITE hPic, int frame );
extern int SPR_Width( HSPRITE hPic, int frame );
extern client_sprite_t *SPR_GetList( const char *name, int *count );
extern void SPR_Set( HSPRITE hPic, int r, int g, int b );
extern void SPR_Draw( int frame, int x, int y, const wrect_t *prc );
extern void SPR_Draw( int frame, int x, int y, int width, int height );
@ -156,6 +166,7 @@ extern void V_RenderPlaque( void );
// stdio stuff
extern char *va( const char *format, ... );
char *COM_ParseToken( const char **data_p );
// dlls stuff
BOOL Sys_LoadLibrary( const char* dllname, dllhandle_t* handle, const dllfunction_t *fcts );

View File

@ -72,6 +72,7 @@ int CHud :: InitMessages( void )
CVAR_REGISTER( "zoom_sensitivity_ratio", "1.2", 0, "mouse sensitivity when zooming" );
CVAR_REGISTER( "default_fov", "90", 0, "default client fov" );
CVAR_REGISTER( "hud_draw", "1", CVAR_ARCHIVE, "hud drawing modes" );
CVAR_REGISTER( "hud_scale", "1", CVAR_ARCHIVE|CVAR_LATCH, "hud scale factor" );
// clear any old HUD list
if( m_pHudList )

View File

@ -208,6 +208,57 @@ int SPR_Width( HSPRITE hPic, int frame )
return Width;
}
client_sprite_t *SPR_GetList( const char *psz, int *piCount )
{
char *pfile = (char *)LOAD_FILE( psz, NULL );
int iSprCount = 0;
if( !pfile )
{
*piCount = iSprCount;
return NULL;
}
char *token;
const char *plist = pfile;
int depth = 0;
while(( token = COM_ParseToken( &plist )) != NULL ) // calculate count of sprites
{
if( !stricmp( token, "{" )) depth++;
else if( !stricmp( token, "}" )) depth--;
else if( depth == 0 ) iSprCount++;
}
client_sprite_t *phud, *p;
plist = pfile;
phud = p = new client_sprite_t[iSprCount];
if( depth != 0 ) ALERT( at_console, "hud.sprite EOF without closing brace\n" );
depth = 0;
while(( token = COM_ParseToken( &plist )) != NULL )
{
if( !stricmp( token, "{" )) depth++;
else if( !stricmp( token, "}" )) depth--;
else if( depth == 0 )
{
strncpy( p->szName, token, sizeof( p->szName ));
p->hSprite = SPR_Load( p->szName );
p->rc.left = p->rc.top = 0;
GetImageSize( &p->rc.right, &p->rc.bottom, p->hSprite );
p++;
}
}
if( !iSprCount ) ALERT( at_console, "SPR_GetList: %s doesn't have sprites\n", psz );
FREE_FILE( pfile );
*piCount = iSprCount;
return phud;
}
void SPR_Set( HSPRITE hPic, int r, int g, int b )
{
ds.hSprite = hPic;
@ -216,31 +267,31 @@ void SPR_Set( HSPRITE hPic, int r, int g, int b )
void SPR_Draw( int frame, int x, int y, const wrect_t *prc )
{
// FIXME: switch rendermode
SetParms( ds.hSprite, kRenderNormal, frame );
DrawImage( ds.hSprite, x, y, prc->right, prc->bottom, frame );
}
void SPR_Draw( int frame, int x, int y, int width, int height )
{
// FIXME: switch rendermode
SetParms( ds.hSprite, kRenderNormal, frame );
DrawImage( ds.hSprite, x, y, width, height, frame );
}
void SPR_DrawHoles( int frame, int x, int y, const wrect_t *prc )
{
// FIXME: switch rendermode
SetParms( ds.hSprite, kRenderTransAlpha, frame );
DrawImage( ds.hSprite, x, y, prc->right, prc->bottom, frame );
}
void SPR_DrawHoles( int frame, int x, int y, int width, int height )
{
// FIXME: switch rendermode
SetParms( ds.hSprite, kRenderTransAlpha, frame );
DrawImage( ds.hSprite, x, y, width, height, frame );
}
void SPR_DrawAdditive( int frame, int x, int y, const wrect_t *prc )
{
// FIXME: switch rendermode
SetParms( ds.hSprite, kRenderTransAdd, frame );
DrawImage( ds.hSprite, x, y, prc->right, prc->bottom, frame );
}
@ -461,4 +512,102 @@ char *va( const char *format, ... )
_vsnprintf( s, sizeof( string[0] ), format, argptr );
va_end( argptr );
return s;
}
/*
==============
COM_ParseToken
Parse a token out of a string
==============
*/
char *COM_ParseToken( const char **data_p )
{
int c;
int len = 0;
const char *data;
static char token[512];
token[0] = 0;
data = *data_p;
if( !data )
{
*data_p = NULL;
return NULL;
}
// skip whitespace
skipwhite:
while(( c = *data) <= ' ' )
{
if( c == 0 )
{
*data_p = NULL;
return NULL; // end of file;
}
data++;
}
// skip // comments
if( c=='/' && data[1] == '/' )
{
while( *data && *data != '\n' )
data++;
goto skipwhite;
}
// skip /* comments
if( c=='/' && data[1] == '*' )
{
while( data[1] && (data[0] != '*' || data[1] != '/' ))
data++;
data += 2;
goto skipwhite;
}
// handle quoted strings specially
if( *data == '\"' || *data == '\'' )
{
data++;
while( 1 )
{
c = *data++;
if( c=='\"' || c=='\0' )
{
token[len] = 0;
*data_p = data;
return token;
}
token[len] = c;
len++;
}
}
// parse single characters
if( c == '{' || c == '}' || c == ')' || c == '(' || c == '\'' || c == ':' || c == ',' )
{
token[len] = c;
data++;
len++;
token[len] = 0;
*data_p = data;
return token;
}
// parse a regular word
do
{
token[len] = c;
data++;
len++;
c = *data;
if( c == '{' || c == '}'|| c == ')'|| c == '(' || c == '\'' || c == ':' || c == ',' )
break;
} while( c > 32 );
token[len] = 0;
*data_p = data;
return token;
}

View File

@ -699,16 +699,33 @@ void pfnDrawString( int x, int y, int width, int height, const char *text )
if( re ) re->SetColor( NULL );
}
/*
=============
pfnGetImageSize
=============
*/
void pfnGetImageSize( int *w, int *h, shader_t shader )
{
if( re ) re->DrawGetPicSize( w, h, shader );
else
{
if( w ) *w = -1;
if( h ) *h = -1;
if( w ) *w = 0;
if( h ) *h = 0;
}
}
/*
=============
pfnSetDrawParms
=============
*/
void pfnSetDrawParms( shader_t handle, kRenderMode_t rendermode, int frame )
{
if( re ) re->SetParms( handle, rendermode, frame );
}
/*
=============
pfnGetViewAngles
@ -902,6 +919,7 @@ static cl_enginefuncs_t gEngfuncs =
pfnDrawCharacter,
pfnDrawString,
pfnGetImageSize,
pfnSetDrawParms,
pfnGetViewAngles,
pfnGetEntityByIndex,
pfnGetLocalPlayer,

View File

@ -336,7 +336,7 @@ void CL_ClearState (void)
CL_ClearEffects ();
CL_FreeEdicts();
cls.dllFuncs.pfnVidInit();
if( cls.game ) cls.dllFuncs.pfnReset();
// wipe the entire cl structure
Mem_Set( &cl, 0, sizeof( cl ));

View File

@ -392,6 +392,9 @@ void SCR_RegisterShaders( void )
cls.clientFont = re->RegisterShader( va( "gfx/fonts/%s", cl_font->string ), SHADER_FONT );
cls.consoleBack = re->RegisterShader( "gfx/shell/conback", SHADER_NOMIP ); // FIXME: hardcoded ...
cls.netIcon = re->RegisterShader( cl_neticon->string, SHADER_NOMIP );
// vid_state has changed
if( cls.game ) cls.dllFuncs.pfnVidInit();
}
/*

View File

@ -193,6 +193,7 @@ typedef struct cl_enginefuncs_s
int (*pfnDrawCharacter)( int x, int y, int width, int height, int number );
void (*pfnDrawString)( int x, int y, int width, int height, const char *text );
void (*pfnGetImageSize)( int *w, int *h, shader_t shader );
void (*pfnSetParms)( shader_t handle, kRenderMode_t rendermode, int frame );
// local client handlers
void (*pfnGetViewAngles)( float *angles );

View File

@ -58,6 +58,7 @@ typedef struct render_exp_s
// misc utilities
void (*SetColor)( const float *rgba );
void (*SetParms)( shader_t handle, kRenderMode_t rendermode, int frame );
bool (*ScrShot)( const char *filename, int shot_type ); // write screenshot with same name
bool (*EnvShot)( const char *filename, uint size, bool skyshot ); // write envshot with same name
void (*LightForPoint)( const vec3_t point, vec3_t ambientLight );

View File

@ -1225,8 +1225,20 @@ static void RB_SetupTextureUnit( stageBundle_t *bundle, uint unit )
{
case TEX_GENERIC:
if( bundle->numTextures == 1 )
{
GL_BindTexture( bundle->textures[0] );
else GL_BindTexture( bundle->textures[(int)(bundle->animFrequency * m_fShaderTime) % bundle->numTextures] );
}
else if( bundle->flags & STAGEBUNDLE_FRAMES )
{
// manually changed
bundle->currentFrame = bound( 0, bundle->currentFrame, bundle->numTextures - 1 );
GL_BindTexture( bundle->textures[bundle->currentFrame] );
}
else if( bundle->flags & STAGEBUNDLE_ANIMFREQUENCY )
{
// animated image
GL_BindTexture( bundle->textures[(int)(bundle->animFrequency * m_fShaderTime) % bundle->numTextures] );
}
break;
case TEX_LIGHTMAP:
if( m_iInfoKey != 255 )

View File

@ -17,21 +17,83 @@ void R_GetPicSize( int *w, int *h, shader_t handle )
ref_shader_t *shader;
if( !w && !h ) return;
if( handle >= 0 && handle < MAX_SHADERS && (shader = &r_shaders[handle]))
{
if( shader->numStages && shader->stages[0]->numBundles && shader->stages[0]->bundles[0]->numTextures )
{
if( w ) *w = (int)shader->stages[0]->bundles[0]->textures[0]->width;
if( h ) *h = (int)shader->stages[0]->bundles[0]->textures[0]->height;
return;
}
}
if( w ) *w = -1;
if( h ) *h = -1;
// assume error
if( w ) *w = 0;
if( h ) *h = 0;
if( handle < 0 || handle > MAX_SHADERS || !(shader = &r_shaders[handle]))
return;
if( !shader->numStages || !shader->stages[0]->numBundles || !shader->stages[0]->bundles[0]->numTextures )
return;
if( w ) *w = (int)shader->stages[0]->bundles[0]->textures[0]->width;
if( h ) *h = (int)shader->stages[0]->bundles[0]->textures[0]->height;
}
/*
=================
R_DrawSetParms
setup rendermode fast preset and choose frame
=================
*/
void R_DrawSetParms( shader_t handle, kRenderMode_t rendermode, int frame )
{
ref_shader_t *shader;
if( handle < 0 || handle > MAX_SHADERS || !(shader = &r_shaders[handle]) || !shader->numStages )
return;
// change rendermode if need
if( shader->stages[0]->flags & SHADERSTAGE_RENDERMODE && shader->stages[0]->renderMode != rendermode )
{
switch( rendermode )
{
case kRenderNormal:
shader->stages[0]->flags &= ~(SHADERSTAGE_BLENDFUNC|SHADERSTAGE_ALPHAFUNC);
break;
case kRenderTransColor:
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
shader->stages[0]->blendFunc.src = GL_SRC_COLOR;
shader->stages[0]->blendFunc.dst = GL_ZERO;
break;
case kRenderTransTexture:
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
shader->stages[0]->blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
break;
case kRenderGlow:
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
shader->stages[0]->blendFunc.src = GL_ONE_MINUS_SRC_ALPHA;
shader->stages[0]->blendFunc.dst = GL_ONE;
break;
case kRenderTransAlpha:
shader->stages[0]->flags |= SHADERSTAGE_ALPHAFUNC;
shader->stages[0]->alphaFunc.func = GL_GREATER;
shader->stages[0]->alphaFunc.ref = 0.666;
shader->sort = SORT_SEETHROUGH;
break;
case kRenderTransAdd:
shader->stages[0]->flags |= SHADERSTAGE_BLENDFUNC;
shader->stages[0]->blendFunc.src = GL_SRC_ALPHA;
shader->stages[0]->blendFunc.dst = GL_ONE;
break;
}
shader->stages[0]->renderMode = rendermode;
}
if( !shader->stages[0]->numBundles || !shader->stages[0]->bundles[0]->numTextures )
return;
// change frame if need
if( shader->stages[0]->bundles[0]->flags & STAGEBUNDLE_FRAMES && shader->stages[0]->bundles[0]->currentFrame != frame )
{
// make sure what frame inbound
shader->stages[0]->bundles[0]->currentFrame = bound( 0, frame, shader->stages[0]->bundles[0]->numTextures - 1 );
}
}
/*
=================

View File

@ -821,6 +821,7 @@ void R_ModRegisterShaders( rmodel_t *mod ); // prolonge registration
bool VID_ScreenShot( const char *filename, bool levelshot );
bool VID_CubemapShot( const char *base, uint size, bool skyshot );
void R_DrawFill( float x, float y, float w, float h );
void R_DrawSetParms( shader_t handle, kRenderMode_t rendermode, int frame );
void R_DrawStretchRaw( int x, int y, int w, int h, int width, int height, const byte *raw, bool dirty );
void R_DrawStretchPic( float x, float y, float w, float h, float sl, float tl, float sh, float th, shader_t shader );
void R_GetPicSize( int *w, int *h, shader_t shader );

View File

@ -1447,6 +1447,7 @@ render_exp_t DLLEXPORT *CreateAPI(stdlib_api_t *input, render_imp_t *engfuncs )
re.EndFrame = R_EndFrame;
re.SetColor = GL_SetColor;
re.SetParms = R_DrawSetParms;
re.ScrShot = VID_ScreenShot;
re.EnvShot = VID_CubemapShot;
re.LightForPoint = R_LightForPoint;

View File

@ -1705,6 +1705,12 @@ static bool R_ParseStageAlphaZeroClamp( ref_shader_t *shader, shaderStage_t *sta
return true;
}
static bool R_ParseStageRenderMode( ref_shader_t *shader, shaderStage_t *stage, script_t *script )
{
stage->flags |= SHADERSTAGE_RENDERMODE;
return true;
}
/*
=================
R_ParseStageAnimFrequency
@ -1752,10 +1758,9 @@ static bool R_ParseStageMap( ref_shader_t *shader, shaderStage_t *stage, script_
return false;
}
if(!(bundle->flags & STAGEBUNDLE_ANIMFREQUENCY))
if(!( bundle->flags & STAGEBUNDLE_ANIMFREQUENCY ))
{
MsgDev( D_WARN, "multiple 'map' specifications without preceding 'animFrequency' in shader '%s'\n", shader->name );
return false;
bundle->flags |= STAGEBUNDLE_FRAMES;
}
}
@ -1851,8 +1856,7 @@ static bool R_ParseStageBumpMap( ref_shader_t *shader, shaderStage_t *stage, scr
}
if(!(bundle->flags & STAGEBUNDLE_ANIMFREQUENCY))
{
MsgDev( D_WARN, "multiple 'bumpMap' specifications without preceding 'animFrequency' in shader '%s'\n", shader->name );
return false;
bundle->flags |= STAGEBUNDLE_FRAMES;
}
}
@ -1927,8 +1931,7 @@ static bool R_ParseStageCubeMap( ref_shader_t *shader, shaderStage_t *stage, scr
}
if(!(bundle->flags & STAGEBUNDLE_ANIMFREQUENCY))
{
MsgDev( D_WARN, "multiple 'cubeMap' specifications without preceding 'animFrequency' in shader '%s'\n", shader->name );
return false;
bundle->flags |= STAGEBUNDLE_FRAMES;
}
}
@ -3540,6 +3543,7 @@ static shaderStageCmd_t r_shaderStageCmds[] =
{"clamp", R_ParseStageClamp },
{"zeroClamp", R_ParseStageZeroClamp },
{"alphaZeroClamp", R_ParseStageAlphaZeroClamp },
{"renderMode", R_ParseStageRenderMode, },
{"animFrequency", R_ParseStageAnimFrequency },
{"map", R_ParseStageMap },
{"bumpMap", R_ParseStageBumpMap },

View File

@ -71,19 +71,21 @@ typedef enum
SHADERSTAGE_DETAIL = BIT(7),
SHADERSTAGE_RGBGEN = BIT(8),
SHADERSTAGE_ALPHAGEN = BIT(10),
SHADERSTAGE_RENDERMODE = BIT(11), // allow to change rendermode from code
} stageFlags_t;
// stage bundle flags
typedef enum
{
STAGEBUNDLE_ANIMFREQUENCY = BIT(0),
STAGEBUNDLE_MAP = BIT(1),
STAGEBUNDLE_BUMPMAP = BIT(2),
STAGEBUNDLE_CUBEMAP = BIT(3),
STAGEBUNDLE_VIDEOMAP = BIT(4),
STAGEBUNDLE_TEXENVCOMBINE = BIT(5),
STAGEBUNDLE_TCGEN = BIT(6),
STAGEBUNDLE_TCMOD = BIT(7),
STAGEBUNDLE_ANIMFREQUENCY = BIT(0), // auto-animate
STAGEBUNDLE_FRAMES = BIT(1), // bundle have frames, thats can be switching manually
STAGEBUNDLE_MAP = BIT(2),
STAGEBUNDLE_BUMPMAP = BIT(3),
STAGEBUNDLE_CUBEMAP = BIT(4),
STAGEBUNDLE_VIDEOMAP = BIT(5),
STAGEBUNDLE_TEXENVCOMBINE = BIT(6),
STAGEBUNDLE_TCGEN = BIT(7),
STAGEBUNDLE_TCMOD = BIT(8),
} bundleFlags_t;
typedef enum
@ -247,7 +249,7 @@ typedef enum
TEX_GENERIC,
TEX_LIGHTMAP,
TEX_CINEMATIC,
TEX_ANGLEDMAP
TEX_ANGLEDMAP // doom1 eight angle-aligned ( 360 / 8 ) textures
} texType_t;
typedef struct table_s
@ -371,6 +373,7 @@ typedef struct stageBundle_s
texture_t *textures[SHADER_MAX_TEXTURES];
uint numTextures;
int currentFrame;
float animFrequency;
video_t cinematicHandle;

View File

@ -729,15 +729,15 @@ CBaseEntity * CBaseEntity::CreateGib( char *szName, char *szModel )
int istr = ALLOC_STRING(szName);
//check for virtual entities
if(GetProcAddress( GetModuleHandle("server"), szName ))
if( FUNCTION_FROM_NAME( szName ))
{
pent = CREATE_NAMED_ENTITY(istr);
pent = CREATE_NAMED_ENTITY( istr );
if ( FNullEnt( pent )) return NULL;
}
else if(!strncmp( szName, "weapon_", 7))
{
//may be this a weapon_generic entity?
pent = CREATE_NAMED_ENTITY(MAKE_STRING("weapon_generic"));
// may be this a weapon_generic entity?
pent = CREATE_NAMED_ENTITY( MAKE_STRING( "weapon_generic" ));
if ( FNullEnt( pent )) return NULL; //this never gonna called anymore. just in case
pent->v.netname = istr;
}

View File

@ -3699,19 +3699,19 @@ void CBasePlayer::GiveNamedItem( const char *pszName )
edict_t *pent;
int istr = MAKE_STRING(pszName);
if(GetProcAddress( GetModuleHandle("server"), pszName ))
if( FUNCTION_FROM_NAME( pszName ))
{
pent = CREATE_NAMED_ENTITY(istr);
if ( FNullEnt( pent )) return;
}
else if(!strncmp( pszName, "weapon_", 7))
else if( !strncmp( pszName, "weapon_", 7 ))
{
//may be this a weapon_generic entity?
pent = CREATE_NAMED_ENTITY(MAKE_STRING("weapon_generic"));
if ( FNullEnt( pent )) return;//this never gonna called anymore. just in case
pent->v.netname = istr;
}
else if(!strncmp( pszName, "item_", 5))
else if( !strncmp( pszName, "item_", 5 ))
{
//may be this a weapon_generic entity?
pent = CREATE_NAMED_ENTITY(MAKE_STRING("item_generic"));

View File

@ -30,7 +30,8 @@ Beta 13.12.08
9. HookUserMessages OK
10.remove SVC_* in utils.h OK
11.Load server.dll and client.dll only once OK
12.v_refdef interactions
12.v_refdef interactions OK
13.hud_scale factor
entity_state_t íåâèäèìà äëÿ ïîëüçîâàòåëÿ