29 Dec 2008
This commit is contained in:
parent
c08c09e4d0
commit
8404344c12
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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 ));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
|
|
Reference in New Issue