diff --git a/common/const.h b/common/const.h index f579675c..23d2ab1a 100644 --- a/common/const.h +++ b/common/const.h @@ -325,7 +325,7 @@ // byte (color) // short (count) // short (base speed) -// short (ramdon velocity) +// short (random velocity) #define TE_BEAMHOSE 26 // obsolete @@ -333,7 +333,6 @@ // coord, coord, coord (pos) // byte (radius in 10's) // byte byte byte (color) -// byte (brightness) // byte (life in 10's) // byte (decay rate in 10's) diff --git a/engine/client/cl_menu.c b/engine/client/cl_menu.c index f4e6ecf5..3610149d 100644 --- a/engine/client/cl_menu.c +++ b/engine/client/cl_menu.c @@ -100,7 +100,6 @@ qboolean UI_IsVisible( void ) static void UI_DrawLogo( const char *filename, float x, float y, float width, float height ) { - static float video_duration; static float cin_time; static int last_frame = -1; byte *cin_data = NULL; @@ -129,7 +128,7 @@ static void UI_DrawLogo( const char *filename, float x, float y, float width, fl } AVI_OpenVideo( cin_state, fullpath, false, false, true ); - if( !( AVI_GetVideoInfo( cin_state, &menu.logo_xres, &menu.logo_yres, &video_duration ))) + if( !( AVI_GetVideoInfo( cin_state, &menu.logo_xres, &menu.logo_yres, &menu.logo_length ))) { AVI_CloseVideo( cin_state ); menu.drawLogo = false; @@ -152,7 +151,7 @@ static void UI_DrawLogo( const char *filename, float x, float y, float width, fl cin_time += host.realframetime; // restarts the cinematic - if( cin_time > video_duration ) + if( cin_time > menu.logo_length ) cin_time = 0.0f; // read the next frame @@ -180,6 +179,11 @@ static int UI_GetLogoHeight( void ) return menu.logo_yres; } +static float UI_GetLogoLength( void ) +{ + return menu.logo_length; +} + static void UI_UpdateUserinfo( void ) { player_info_t *player; @@ -861,6 +865,7 @@ static ui_enginefuncs_t gEngfuncs = UI_DrawLogo, UI_GetLogoWidth, UI_GetLogoHeight, + UI_GetLogoLength, pfnDrawCharacter, pfnDrawConsoleString, pfnDrawSetTextColor, diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index bf1d6b5b..f69f6960 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -1814,16 +1814,12 @@ void CL_ParseTempEntity( sizebuf_t *msg ) dl->origin[0] = BF_ReadCoord( &buf ); dl->origin[1] = BF_ReadCoord( &buf ); dl->origin[2] = BF_ReadCoord( &buf ); - dl->radius = (float)(BF_ReadByte( &buf ) * 0.1f); + dl->radius = (float)(BF_ReadByte( &buf ) * 10.0f); dl->color.r = BF_ReadByte( &buf ); dl->color.g = BF_ReadByte( &buf ); dl->color.b = BF_ReadByte( &buf ); - brightness = (float)BF_ReadByte( &buf ); - dl->color.r *= brightness; - dl->color.g *= brightness; - dl->color.b *= brightness; dl->die = cl.time + (float)(BF_ReadByte( &buf ) * 0.1f); - dl->decay = (float)(BF_ReadByte( &buf ) * 0.1f); + dl->decay = (float)(BF_ReadByte( &buf ) * 10.0f); break; case TE_ELIGHT: dl = CL_AllocElight( 0 ); @@ -2288,20 +2284,24 @@ void CL_DecayLights( void ) for( i = 0, dl = cl_dlights; i < MAX_DLIGHTS; i++, dl++ ) { - if( dl->die < cl.time || !dl->radius ) - continue; - + if( !dl->radius ) continue; + dl->radius -= time * dl->decay; if( dl->radius < 0 ) dl->radius = 0; + + if( dl->die < cl.time || !dl->radius ) + Mem_Set( dl, 0, sizeof( *dl )); } for( i = 0, dl = cl_elights; i < MAX_ELIGHTS; i++, dl++ ) { - if( dl->die < cl.time || !dl->radius ) - continue; - + if( !dl->radius ) continue; + dl->radius -= time * dl->decay; if( dl->radius < 0 ) dl->radius = 0; + + if( dl->die < cl.time || !dl->radius ) + Mem_Set( dl, 0, sizeof( *dl )); } } diff --git a/engine/client/client.h b/engine/client/client.h index 901647c5..f97dfd76 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -379,6 +379,7 @@ typedef struct qboolean drawLogo; // set to TRUE if logo.avi missed or corrupted long logo_xres; long logo_yres; + float logo_length; } menu_static_t; typedef struct diff --git a/engine/client/gl_rsurf.c b/engine/client/gl_rsurf.c index 19f39de7..bc2bd2ea 100644 --- a/engine/client/gl_rsurf.c +++ b/engine/client/gl_rsurf.c @@ -771,6 +771,7 @@ void R_DrawTextureChains( void ) // make sure what color is reset pglColor4ub( 255, 255, 255, 255 ); + R_LoadIdentity(); // set identity matrix // clip skybox surfaces for( s = skychain; s != NULL; s = s->texturechain ) @@ -1241,8 +1242,11 @@ void R_RecursiveWorldNode( mnode_t *node, uint clipflags ) } else { - surf->texturechain = surf->texinfo->texture->texturechain; - surf->texinfo->texture->texturechain = surf; + if( surf->texinfo && surf->texinfo->texture ) + { + surf->texturechain = surf->texinfo->texture->texturechain; + surf->texinfo->texture->texturechain = surf; + } } } diff --git a/engine/client/gl_vidnt.c b/engine/client/gl_vidnt.c index 9df1377c..f788ee5d 100644 --- a/engine/client/gl_vidnt.c +++ b/engine/client/gl_vidnt.c @@ -14,6 +14,7 @@ #define WINDOW_STYLE (WS_OVERLAPPED|WS_BORDER|WS_SYSMENU|WS_CAPTION|WS_VISIBLE) #define WINDOW_EX_STYLE (0) #define GL_DRIVER_OPENGL "OpenGL32" +#define WINDOW_NAME "Xash Window" // Half-Life convar_t *renderinfo; convar_t *gl_allow_software; @@ -949,7 +950,7 @@ qboolean VID_CreateWindow( int width, int height, qboolean fullscreen ) wc.hInstance = host.hInst; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (void *)COLOR_3DSHADOW; - wc.lpszClassName = "Xash Window"; + wc.lpszClassName = WINDOW_NAME; wc.lpszMenuName = 0; // find the icon file in the filesystem @@ -970,7 +971,7 @@ qboolean VID_CreateWindow( int width, int height, qboolean fullscreen ) if( !RegisterClass( &wc )) { - MsgDev( D_ERROR, "VID_CreateWindow: couldn't register window class %s\n" "Xash Window" ); + MsgDev( D_ERROR, "VID_CreateWindow: couldn't register window class %s\n" WINDOW_NAME ); return false; } @@ -1010,7 +1011,7 @@ qboolean VID_CreateWindow( int width, int height, qboolean fullscreen ) } } - CreateWindowEx( exstyle, "Xash Window", wndname, stylebits, x, y, w, h, NULL, NULL, host.hInst, NULL ); + CreateWindowEx( exstyle, WINDOW_NAME, wndname, stylebits, x, y, w, h, NULL, NULL, host.hInst, NULL ); // host.hWnd will be filled in IN_WndProc @@ -1030,7 +1031,7 @@ qboolean VID_CreateWindow( int width, int height, qboolean fullscreen ) DestroyWindow( host.hWnd ); host.hWnd = NULL; - UnregisterClass( "Xash Window", host.hInst ); + UnregisterClass( WINDOW_NAME, host.hInst ); MsgDev( D_ERROR, "OpenGL driver not installed\n" ); return false; } @@ -1071,7 +1072,7 @@ void VID_DestroyWindow( void ) host.hWnd = NULL; } - UnregisterClass( "Xash Window", host.hInst ); + UnregisterClass( WINDOW_NAME, host.hInst ); if( glState.fullScreen ) { diff --git a/engine/common/console.c b/engine/common/console.c index aa6f3ae5..712de32b 100644 --- a/engine/common/console.c +++ b/engine/common/console.c @@ -1520,6 +1520,10 @@ void Con_VidInit( void ) } } + // missed console image will be replaced as white (GoldSrc rules) + if( con.background == tr.defaultTexture ) + con.background = tr.whiteTexture; + Con_LoadConchars(); } diff --git a/engine/common/mathlib.h b/engine/common/mathlib.h index 8502e65d..65d91381 100644 --- a/engine/common/mathlib.h +++ b/engine/common/mathlib.h @@ -83,6 +83,7 @@ #define MakeRGBA( out, x, y, z, w ) Vector4Set( out, x, y, z, w ) #define PlaneDist(point,plane) ((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) #define PlaneDiff(point,plane) (((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) - (plane)->dist) +#define PlaneDiff2(point, plane) ((((plane)->type < 3) ? (point)[(plane)->type] - (plane)->dist : DotProduct((point), (plane)->normal) - (plane)->dist)) float rsqrt( float number ); float anglemod( const float a ); diff --git a/engine/common/vgui_int.cpp b/engine/common/vgui_int.cpp index 84111084..3f23f9fb 100644 --- a/engine/common/vgui_int.cpp +++ b/engine/common/vgui_int.cpp @@ -54,13 +54,11 @@ public: virtual bool hasFocus( void ) { - Msg( "hasFocus()\n" ); return false; } virtual bool isWithin( int x, int y ) { - Msg( "isWithin()\n" ); return false; } protected: @@ -155,9 +153,8 @@ protected: class CEngineApp : public App { public: - CEngineApp( void ) + CEngineApp( bool externalMain = true ):App( externalMain ) { - App::reset(); } virtual void main( int argc, char* argv[] ) @@ -167,13 +164,12 @@ public: virtual void setCursorPos( int x, int y ) { - Msg( "setCursorPos: %i %i\n", x, y ); + App::setCursorPos( x, y ); } virtual void getCursorPos( int &x,int &y ) { App::getCursorPos( x, y ); - Msg( "getCursorPos: %i %i\n", x, y ); } virtual App* getApp( void ) { @@ -262,7 +258,7 @@ void VGui_Paint( void ) { if( !rootpanel ) return; - rootpanel->paintBackground(); +// pApp->externalTick(); } void VGui_ViewportPaintBackground( int extents[4] ) diff --git a/engine/common/vgui_int.new b/engine/common/vgui_int.new index 9dddd4e4..556489b2 100644 --- a/engine/common/vgui_int.new +++ b/engine/common/vgui_int.new @@ -10,89 +10,152 @@ #include #include #include -#include +#include #include #include using namespace vgui; -SurfaceGL::SurfaceGL( Panel* embeddedPanel ):Surface( embeddedPanel ) +class CEngineSurface : public SurfaceBase { - _embeddedPanel = embeddedPanel; -} +public: + CEngineSurface( Panel *embeddedPanel ):SurfaceBase( embeddedPanel ) + { + _embeddedPanel = embeddedPanel; + } +public: + virtual void setTitle( const char *title ) + { + Msg( "SetTitle: %s\n", title ); + } -bool SurfaceGL::recreateContext( void ) -{ - Msg( "recreate context\n" ); - return Surface::recreateContext(); -} - -void SurfaceGL::createPopup(Panel* embeddedPanel) -{ -} + virtual bool setFullscreenMode( int wide, int tall, int bpp ) + { + return false; + } -void SurfaceGL::pushMakeCurrent( Panel* panel, bool useInsets ) -{ - Surface::pushMakeCurrent( panel, useInsets ); -} + virtual void setWindowedMode( void ) + { + } -void SurfaceGL::popMakeCurrent( Panel* panel ) -{ - Surface::popMakeCurrent( panel ); -} + virtual void setAsTopMost( bool state ) + { + } -void SurfaceGL::makeCurrent( void ) -{ - Msg( "make current\n" ); -} + virtual int getModeInfoCount( void ) + { + Msg( "getModeInfoCount()\n" ); + return 0; + } -void SurfaceGL::swapBuffers( void ) -{ - Surface::swapBuffers(); -} + virtual void createPopup( Panel* embeddedPanel ) + { + } -void SurfaceGL::setColor( int r, int g, int b ) -{ -} + virtual bool hasFocus( void ) + { +// Msg( "hasFocus()\n" ); + return false; + } -void SurfaceGL::filledRect( int x0, int y0, int x1, int y1 ) -{ -} + virtual bool isWithin( int x, int y ) + { +// Msg( "isWithin()\n" ); + return false; + } +protected: + virtual int createNewTextureID( void ) + { + Msg( "createNewTextureID()\n" ); + return 0; + } -void SurfaceGL::outlinedRect( int x0, int y0, int x1, int y1 ) -{ -} + virtual void drawSetColor( int r, int g, int b, int a ) + { + } -void SurfaceGL::setTextFont( Font* font ) -{ -} + virtual void drawFilledRect( int x0, int y0, int x1, int y1 ) + { + } -void SurfaceGL::setTextColor( int r, int g, int b ) -{ -} + virtual void drawOutlinedRect( int x0,int y0,int x1,int y1 ) + { + } + + virtual void drawSetTextFont( Font *font ) + { + } -void SurfaceGL::setDrawPos( int x, int y ) -{ -} + virtual void drawSetTextColor( int r, int g, int b, int a ) + { + } -void SurfaceGL::printText( const char *str, int strlen ) -{ - Msg( "Con_Printf( %s )\n", str ); -} + virtual void drawSetTextPos( int x, int y ) + { + } -void SurfaceGL::setTextureRGBA( int id, const char *rgba, int wide, int tall ) -{ - Msg( "SetTexture( %i )\n", id ); -} + virtual void drawPrintText( const char* text, int textLen ) + { + } -void SurfaceGL::setTexture( int id ) -{ - Msg( "SetTexture( %i )\n", id ); -} + virtual void drawSetTextureRGBA( int id, const char* rgba, int wide, int tall ) + { + Msg( "drawSetTextureRGBA()\n" ); + } + + virtual void drawSetTexture( int id ) + { + Msg( "drawSetTexture()\n" ); + } + + virtual void drawTexturedRect( int x0, int y0, int x1, int y1 ) + { + } -void SurfaceGL::texturedRect( int x0, int y0, int x1, int y1 ) -{ -} + virtual void invalidate( Panel *panel ) + { + } + + virtual bool createPlat() + { + Msg( "createPlat()\n" ); + return false; + } + + virtual bool recreateContext() + { + Msg( "recreateContext()\n" ); + return false; + } + + virtual void enableMouseCapture(bool state) + { + } + + virtual void setCursor(Cursor* cursor) + { + } + + virtual void swapBuffers() + { + Msg( "swapBuffers()\n" ); + } + + virtual void pushMakeCurrent(Panel* panel,bool useInsets) + { + } + + virtual void popMakeCurrent(Panel* panel) + { + } + + virtual void applyChanges( void ) + { + } +protected: + friend class App; + friend class Panel; +}; class CEngineApp : public App { @@ -109,13 +172,11 @@ public: virtual void setCursorPos( int x, int y ) { App::setCursorPos( x, y ); - Msg( "setCursorPos: %i %i\n", x, y ); } virtual void getCursorPos( int &x,int &y ) { App::getCursorPos( x, y ); - Msg( "getCursorPos: %i %i\n", x, y ); } virtual App* getApp( void ) { @@ -124,7 +185,7 @@ public: }; RECT window_rect; -SurfaceGL *surface = NULL; +CEngineSurface *surface = NULL; CEngineApp *pApp = NULL; Panel *rootpanel = NULL; #define WND_BORDER 3 @@ -144,25 +205,23 @@ void VGui_Startup( void ) if( rootpanel ) { // rootpanel->reset(); -// rootpanel->setSize( menu.globals->scrWidth, menu.globals->scrHeight ); + rootpanel->setSize( menu.globals->scrWidth, menu.globals->scrHeight ); return; } - Scheme *pScheme = new Scheme(); pApp = new CEngineApp( true ); - pApp->setScheme( pScheme ); - + rootpanel = new Panel(); - rootpanel->setPaintEnabled( true ); + rootpanel->setPaintEnabled( false ); rootpanel->setPaintBorderEnabled( false ); rootpanel->setPaintBackgroundEnabled( true ); rootpanel->setVisible( true ); - rootpanel->setEnabled( true ); + rootpanel->setEnabled( false ); rootpanel->setCursor( new Cursor( Cursor::dc_none )); VGui_SetBounds(); - surface = new SurfaceGL( rootpanel ); + surface = new CEngineSurface( rootpanel ); ASSERT( rootpanel->getApp() != NULL ); ASSERT( rootpanel->getSurfaceBase() != NULL ); @@ -184,7 +243,7 @@ void VGui_Paint( void ) if( !rootpanel ) return; pApp->externalTick(); -// rootpanel->paintBackground(); +// rootpanel->repaint(); } void VGui_ViewportPaintBackground( int extents[4] ) @@ -195,11 +254,8 @@ void VGui_ViewportPaintBackground( int extents[4] ) Panel *pVPanel = surface->getPanel(); if( !pVPanel ) return; - rootpanel->setBounds( extents[0], extents[1], extents[2], extents[3] ); + rootpanel->setBounds( extents[0], extents[1], menu.globals->scrWidth, menu.globals->scrHeight ); // rootpanel->repaint(); - - // paint everything - rootpanel->paintTraverse(); } void *VGui_GetPanel( void ) diff --git a/engine/menu_int.h b/engine/menu_int.h index 1f909ec9..99cae352 100644 --- a/engine/menu_int.h +++ b/engine/menu_int.h @@ -71,6 +71,7 @@ typedef struct ui_enginefuncs_s void (*pfnDrawLogo)( const char *filename, float x, float y, float width, float height ); int (*pfnGetLogoWidth)( void ); int (*pfnGetLogoHeight)( void ); + float (*pfnGetLogoLength)( void ); // text message system void (*pfnDrawCharacter)( int x, int y, int width, int height, int ch, int ulRGBA, HIMAGE hFont ); diff --git a/engine/server/server.h b/engine/server/server.h index 79105660..5c53cb49 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -375,6 +375,8 @@ extern convar_t *sv_unlagpush; extern convar_t *sv_unlagsamples; extern convar_t *sv_allow_upload; extern convar_t *sv_allow_download; +extern convar_t *sv_allow_studio_scaling; +extern convar_t *sv_allow_studio_attachment_angles; extern convar_t *sv_send_resources; extern convar_t *sv_send_logos; extern convar_t *sv_sendvelocity; diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 50c7c4b0..aab54f3d 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -82,19 +82,13 @@ void SV_SetMinMaxSize( edict_t *e, const float *min, const float *max ) return; } } -#if 0 - // FIXME: enable this when other server parts will be done and tested - if( e->v.scale > 0.0f && e->v.scale != 1.0f ) + + if( sv_allow_studio_scaling->integer && e->v.scale != 0.0f ) { - switch( Mod_GetType( e->v.modelindex )) - { - case mod_sprite: - case mod_studio: + if( Mod_GetType( e->v.modelindex ) == mod_studio ) scale = e->v.scale; - break; - } } -#endif + VectorScale( min, scale, e->v.mins ); VectorScale( max, scale, e->v.maxs ); VectorSubtract( max, min, e->v.size ); diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 8fcaceef..131ca18c 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -50,6 +50,8 @@ convar_t *sv_reconnect_limit; // minimum seconds between connect messages convar_t *sv_failuretime; convar_t *sv_allow_upload; convar_t *sv_allow_download; +convar_t *sv_allow_studio_scaling; +convar_t *sv_allow_studio_attachment_angles; convar_t *sv_send_resources; convar_t *sv_send_logos; convar_t *sv_sendvelocity; @@ -626,6 +628,8 @@ void SV_Init( void ) zombietime = Cvar_Get( "zombietime", "2", CVAR_SERVERNOTIFY, "timeout for clients-zombie (who died but not respawned)" ); sv_pausable = Cvar_Get( "pausable", "1", CVAR_SERVERNOTIFY, "allow players to pause or not" ); allow_download = Cvar_Get( "allow_download", "0", CVAR_ARCHIVE, "allow download resources" ); + sv_allow_studio_scaling = Cvar_Get( "sv_allow_studio_scaling", "0", CVAR_ARCHIVE, "allow to scale physics hull for studio models (visible hull scaled on the client-side)" ); + sv_allow_studio_attachment_angles = Cvar_Get( "sv_allow_studio_attachment_angles", "0", CVAR_ARCHIVE, "enable calc angles for attachment points (on studio models)" ); sv_wallbounce = Cvar_Get( "sv_wallbounce", "1.0", CVAR_PHYSICINFO, "bounce factor for client with MOVETYPE_BOUNCE" ); sv_spectatormaxspeed = Cvar_Get( "sv_spectatormaxspeed", "500", CVAR_PHYSICINFO, "spectator maxspeed" ); sv_waterfriction = Cvar_Get( "sv_waterfriction", "1", CVAR_PHYSICINFO, "how fast you slow down in water" ); diff --git a/engine/server/sv_studio.c b/engine/server/sv_studio.c index 5d753127..87b8f15f 100644 --- a/engine/server/sv_studio.c +++ b/engine/server/sv_studio.c @@ -91,7 +91,7 @@ static void SV_StudioSetUpTransform( edict_t *ent ) VectorCopy( ent->v.angles, ang ); ang[PITCH] = -ang[PITCH]; // stupid Half-Life bug - if( ent->v.scale != 0.0f ) scale = ent->v.scale; + if( ent->v.scale != 0.0f && sv_allow_studio_scaling->integer ) scale = ent->v.scale; Matrix3x4_CreateFromEntity( sv_studiomatrix, ang, ent->v.origin, scale ); } @@ -955,13 +955,17 @@ void SV_StudioGetAttachment( edict_t *e, int iAttachment, float *org, float *ang // compute pos and angles Matrix3x4_VectorTransform( sv_studiobones[pAtt[iAttachment].bone], pAtt[iAttachment].org, localOrg ); - Matrix3x4_OriginFromMatrix( sv_studiobones[pAtt[iAttachment].bone], bonepos ); - VectorSubtract( localOrg, bonepos, forward ); // make forward - VectorNormalizeFast( forward ); - VectorAngles( forward, localAng ); - if( org ) VectorCopy( localOrg, org ); - if( ang ) VectorCopy( localAng, ang ); + + if( sv_allow_studio_attachment_angles->integer ) + { + Matrix3x4_OriginFromMatrix( sv_studiobones[pAtt[iAttachment].bone], bonepos ); + VectorSubtract( localOrg, bonepos, forward ); // make forward + VectorNormalizeFast( forward ); + VectorAngles( forward, localAng ); + + if( ang ) VectorCopy( localAng, ang ); + } } void SV_GetBonePosition( edict_t *e, int iBone, float *org, float *ang ) diff --git a/engine/server/sv_world.c b/engine/server/sv_world.c index 48353899..986172d9 100644 --- a/engine/server/sv_world.c +++ b/engine/server/sv_world.c @@ -112,16 +112,16 @@ hull_t *SV_HullForEntity( edict_t *ent, int hullNumber, vec3_t mins, vec3_t maxs vec3_t hullmins, hullmaxs; vec3_t size; + model = CM_ClipHandleToModel( ent->v.modelindex ); + // decide which clipping hull to use, based on the size - if( ent->v.solid == SOLID_BSP || ent->v.skin == CONTENTS_LADDER ) + if( model && ( ent->v.solid == SOLID_BSP || ent->v.skin == CONTENTS_LADDER )) { // explicit hulls in the BSP model if( ent->v.movetype != MOVETYPE_PUSH ) Host_Error( "SOLID_BSP without MOVETYPE_PUSH\n" ); - model = CM_ClipHandleToModel( ent->v.modelindex ); - - if( !model || model->type != mod_brush ) + if( model->type != mod_brush ) Host_Error( "MOVETYPE_PUSH with a non bsp model\n" ); VectorSubtract( maxs, mins, size ); diff --git a/mainui/enginecallback.h b/mainui/enginecallback.h index 9d121a06..26b3e59c 100644 --- a/mainui/enginecallback.h +++ b/mainui/enginecallback.h @@ -25,6 +25,7 @@ #define PRECACHE_LOGO( x ) (*g_engfuncs.pfnDrawLogo)( x, 0, 0, 0, 0 ) #define GetLogoWidth (*g_engfuncs.pfnGetLogoWidth) #define GetLogoHeight (*g_engfuncs.pfnGetLogoHeight) +#define GetLogoLength (*g_engfuncs.pfnGetLogoLength) inline HIMAGE PIC_Load( const char *szPicName ) { diff --git a/mainui/menu_main.cpp b/mainui/menu_main.cpp index 19b7cede..bbafee3f 100644 --- a/mainui/menu_main.cpp +++ b/mainui/menu_main.cpp @@ -103,14 +103,15 @@ static void UI_Background_Ownerdraw( void *self ) UI_DrawPic( item->x, item->y, item->width, item->height, uiColorWhite, ((menuBitmap_s *)self)->pic ); + if( GetLogoLength() <= 0.1 || GetLogoWidth() <= 32 ) + return; // don't draw stub logo (GoldSrc rules) + float logoWidth, logoHeight, logoPosY; float scaleX, scaleY; scaleX = ScreenWidth / 640.0f; scaleY = ScreenHeight / 480.0f; - if( GetLogoWidth() <= 32 ) return; // don't draw stub logo - logoWidth = GetLogoWidth() * scaleX; logoHeight = GetLogoHeight() * scaleY; logoPosY = 70 * scaleY; // 70 it's empirically determined value (magic number)