mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-31 17:24:15 +00:00
engine: client: consolidate client and menu scissor functions
This commit is contained in:
parent
ba6dd3c751
commit
c0fa91bec9
@ -371,55 +371,6 @@ void SPR_AdjustTexCoords( float width, float height, float *s1, float *t1, float
|
|||||||
*t2 /= height;
|
*t2 /= height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qboolean SPR_Scissor( float *x, float *y, float *width, float *height, float *u0, float *v0, float *u1, float *v1 )
|
|
||||||
{
|
|
||||||
float dudx, dvdy;
|
|
||||||
|
|
||||||
// clip sub rect to sprite
|
|
||||||
if(( width == 0 ) || ( height == 0 ))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( *x + *width <= clgame.ds.scissor_x )
|
|
||||||
return false;
|
|
||||||
if( *x >= clgame.ds.scissor_x + clgame.ds.scissor_width )
|
|
||||||
return false;
|
|
||||||
if( *y + *height <= clgame.ds.scissor_y )
|
|
||||||
return false;
|
|
||||||
if( *y >= clgame.ds.scissor_y + clgame.ds.scissor_height )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
dudx = (*u1 - *u0) / *width;
|
|
||||||
dvdy = (*v1 - *v0) / *height;
|
|
||||||
|
|
||||||
if( *x < clgame.ds.scissor_x )
|
|
||||||
{
|
|
||||||
*u0 += (clgame.ds.scissor_x - *x) * dudx;
|
|
||||||
*width -= clgame.ds.scissor_x - *x;
|
|
||||||
*x = clgame.ds.scissor_x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *x + *width > clgame.ds.scissor_x + clgame.ds.scissor_width )
|
|
||||||
{
|
|
||||||
*u1 -= (*x + *width - (clgame.ds.scissor_x + clgame.ds.scissor_width)) * dudx;
|
|
||||||
*width = clgame.ds.scissor_x + clgame.ds.scissor_width - *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *y < clgame.ds.scissor_y )
|
|
||||||
{
|
|
||||||
*v0 += (clgame.ds.scissor_y - *y) * dvdy;
|
|
||||||
*height -= clgame.ds.scissor_y - *y;
|
|
||||||
*y = clgame.ds.scissor_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *y + *height > clgame.ds.scissor_y + clgame.ds.scissor_height )
|
|
||||||
{
|
|
||||||
*v1 -= (*y + *height - (clgame.ds.scissor_y + clgame.ds.scissor_height)) * dvdy;
|
|
||||||
*height = clgame.ds.scissor_y + clgame.ds.scissor_height - *y;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
SPR_DrawGeneric
|
SPR_DrawGeneric
|
||||||
@ -470,7 +421,7 @@ static void SPR_DrawGeneric( int frame, float x, float y, float width, float hei
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pass scissor test if supposed
|
// pass scissor test if supposed
|
||||||
if( clgame.ds.scissor_test && !SPR_Scissor( &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
if( !CL_Scissor( &clgame.ds.scissor, &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// scale for screen sizes
|
// scale for screen sizes
|
||||||
@ -825,6 +776,92 @@ const char *CL_SoundFromIndex( int index )
|
|||||||
return sfx->name;
|
return sfx->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
CL_EnableScissor
|
||||||
|
|
||||||
|
enable scissor test
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
void CL_EnableScissor( scissor_state_t *scissor, int x, int y, int width, int height )
|
||||||
|
{
|
||||||
|
scissor->x = x;
|
||||||
|
scissor->y = y;
|
||||||
|
scissor->width = width;
|
||||||
|
scissor->height = height;
|
||||||
|
scissor->test = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
CL_DisableScissor
|
||||||
|
|
||||||
|
disable scissor test
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
void CL_DisableScissor( scissor_state_t *scissor )
|
||||||
|
{
|
||||||
|
scissor->test = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
================
|
||||||
|
CL_Scissor
|
||||||
|
|
||||||
|
perform common scissor test
|
||||||
|
================
|
||||||
|
*/
|
||||||
|
qboolean CL_Scissor( const scissor_state_t *scissor, float *x, float *y, float *width, float *height, float *u0, float *v0, float *u1, float *v1 )
|
||||||
|
{
|
||||||
|
float dudx, dvdy;
|
||||||
|
|
||||||
|
if( !scissor->test )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// clip sub rect to sprite
|
||||||
|
if( *width == 0 || *height == 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( *x + *width <= scissor->x )
|
||||||
|
return false;
|
||||||
|
if( *x >= scissor->x + scissor->width )
|
||||||
|
return false;
|
||||||
|
if( *y + *height <= scissor->y )
|
||||||
|
return false;
|
||||||
|
if( *y >= scissor->y + scissor->height )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dudx = (*u1 - *u0) / *width;
|
||||||
|
dvdy = (*v1 - *v0) / *height;
|
||||||
|
|
||||||
|
if( *x < scissor->x )
|
||||||
|
{
|
||||||
|
*u0 += (scissor->x - *x) * dudx;
|
||||||
|
*width -= scissor->x - *x;
|
||||||
|
*x = scissor->x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *x + *width > scissor->x + scissor->width )
|
||||||
|
{
|
||||||
|
*u1 -= (*x + *width - (scissor->x + scissor->width)) * dudx;
|
||||||
|
*width = scissor->x + scissor->width - *x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *y < scissor->y )
|
||||||
|
{
|
||||||
|
*v0 += (scissor->y - *y) * dvdy;
|
||||||
|
*height -= scissor->y - *y;
|
||||||
|
*y = scissor->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *y + *height > scissor->y + scissor->height )
|
||||||
|
{
|
||||||
|
*v1 -= (*y + *height - (scissor->y + scissor->height)) * dvdy;
|
||||||
|
*height = scissor->y + scissor->height - *y;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=========
|
=========
|
||||||
SPR_EnableScissor
|
SPR_EnableScissor
|
||||||
@ -839,11 +876,7 @@ static void GAME_EXPORT SPR_EnableScissor( int x, int y, int width, int height )
|
|||||||
width = bound( 0, width, clgame.scrInfo.iWidth - x );
|
width = bound( 0, width, clgame.scrInfo.iWidth - x );
|
||||||
height = bound( 0, height, clgame.scrInfo.iHeight - y );
|
height = bound( 0, height, clgame.scrInfo.iHeight - y );
|
||||||
|
|
||||||
clgame.ds.scissor_x = x;
|
CL_EnableScissor( &clgame.ds.scissor, x, y, width, height );
|
||||||
clgame.ds.scissor_width = width;
|
|
||||||
clgame.ds.scissor_y = y;
|
|
||||||
clgame.ds.scissor_height = height;
|
|
||||||
clgame.ds.scissor_test = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -854,11 +887,7 @@ SPR_DisableScissor
|
|||||||
*/
|
*/
|
||||||
static void GAME_EXPORT SPR_DisableScissor( void )
|
static void GAME_EXPORT SPR_DisableScissor( void )
|
||||||
{
|
{
|
||||||
clgame.ds.scissor_x = 0;
|
CL_DisableScissor( &clgame.ds.scissor );
|
||||||
clgame.ds.scissor_width = 0;
|
|
||||||
clgame.ds.scissor_y = 0;
|
|
||||||
clgame.ds.scissor_height = 0;
|
|
||||||
clgame.ds.scissor_test = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -421,54 +421,6 @@ static void UI_ConvertGameInfo( GAMEINFO *out, gameinfo_t *in )
|
|||||||
out->flags |= GFL_RENDER_PICBUTTON_TEXT;
|
out->flags |= GFL_RENDER_PICBUTTON_TEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static qboolean PIC_Scissor( float *x, float *y, float *width, float *height, float *u0, float *v0, float *u1, float *v1 )
|
|
||||||
{
|
|
||||||
float dudx, dvdy;
|
|
||||||
|
|
||||||
// clip sub rect to sprite
|
|
||||||
if(( width == 0 ) || ( height == 0 ))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( *x + *width <= gameui.ds.scissor_x )
|
|
||||||
return false;
|
|
||||||
if( *x >= gameui.ds.scissor_x + gameui.ds.scissor_width )
|
|
||||||
return false;
|
|
||||||
if( *y + *height <= gameui.ds.scissor_y )
|
|
||||||
return false;
|
|
||||||
if( *y >= gameui.ds.scissor_y + gameui.ds.scissor_height )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
dudx = (*u1 - *u0) / *width;
|
|
||||||
dvdy = (*v1 - *v0) / *height;
|
|
||||||
|
|
||||||
if( *x < gameui.ds.scissor_x )
|
|
||||||
{
|
|
||||||
*u0 += (gameui.ds.scissor_x - *x) * dudx;
|
|
||||||
*width -= gameui.ds.scissor_x - *x;
|
|
||||||
*x = gameui.ds.scissor_x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *x + *width > gameui.ds.scissor_x + gameui.ds.scissor_width )
|
|
||||||
{
|
|
||||||
*u1 -= (*x + *width - (gameui.ds.scissor_x + gameui.ds.scissor_width)) * dudx;
|
|
||||||
*width = gameui.ds.scissor_x + gameui.ds.scissor_width - *x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *y < gameui.ds.scissor_y )
|
|
||||||
{
|
|
||||||
*v0 += (gameui.ds.scissor_y - *y) * dvdy;
|
|
||||||
*height -= gameui.ds.scissor_y - *y;
|
|
||||||
*y = gameui.ds.scissor_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( *y + *height > gameui.ds.scissor_y + gameui.ds.scissor_height )
|
|
||||||
{
|
|
||||||
*v1 -= (*y + *height - (gameui.ds.scissor_y + gameui.ds.scissor_height)) * dvdy;
|
|
||||||
*height = gameui.ds.scissor_y + gameui.ds.scissor_height - *y;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
====================
|
====================
|
||||||
PIC_DrawGeneric
|
PIC_DrawGeneric
|
||||||
@ -511,7 +463,7 @@ static void PIC_DrawGeneric( float x, float y, float width, float height, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pass scissor test if supposed
|
// pass scissor test if supposed
|
||||||
if( gameui.ds.scissor_test && !PIC_Scissor( &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
if( !CL_Scissor( &gameui.ds.scissor, &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ref.dllFuncs.R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, gameui.ds.gl_texturenum );
|
ref.dllFuncs.R_DrawStretchPic( x, y, width, height, s1, t1, s2, t2, gameui.ds.gl_texturenum );
|
||||||
@ -658,11 +610,7 @@ static void GAME_EXPORT pfnPIC_EnableScissor( int x, int y, int width, int heigh
|
|||||||
width = bound( 0, width, gameui.globals->scrWidth - x );
|
width = bound( 0, width, gameui.globals->scrWidth - x );
|
||||||
height = bound( 0, height, gameui.globals->scrHeight - y );
|
height = bound( 0, height, gameui.globals->scrHeight - y );
|
||||||
|
|
||||||
gameui.ds.scissor_x = x;
|
CL_EnableScissor( &gameui.ds.scissor, x, y, width, height );
|
||||||
gameui.ds.scissor_width = width;
|
|
||||||
gameui.ds.scissor_y = y;
|
|
||||||
gameui.ds.scissor_height = height;
|
|
||||||
gameui.ds.scissor_test = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -673,11 +621,7 @@ pfnPIC_DisableScissor
|
|||||||
*/
|
*/
|
||||||
static void GAME_EXPORT pfnPIC_DisableScissor( void )
|
static void GAME_EXPORT pfnPIC_DisableScissor( void )
|
||||||
{
|
{
|
||||||
gameui.ds.scissor_x = 0;
|
CL_DisableScissor( &gameui.ds.scissor );
|
||||||
gameui.ds.scissor_width = 0;
|
|
||||||
gameui.ds.scissor_y = 0;
|
|
||||||
gameui.ds.scissor_height = 0;
|
|
||||||
gameui.ds.scissor_test = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -765,7 +709,7 @@ static void GAME_EXPORT pfnDrawCharacter( int ix, int iy, int iwidth, int iheigh
|
|||||||
t2 = t1 + size;
|
t2 = t1 + size;
|
||||||
|
|
||||||
// pass scissor test if supposed
|
// pass scissor test if supposed
|
||||||
if( gameui.ds.scissor_test && !PIC_Scissor( &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
if( !CL_Scissor( &gameui.ds.scissor, &x, &y, &width, &height, &s1, &t1, &s2, &t2 ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
ref.dllFuncs.GL_SetRenderMode( kRenderTransTexture );
|
||||||
|
@ -340,18 +340,23 @@ typedef struct
|
|||||||
qboolean valid; // all rectangles are valid
|
qboolean valid; // all rectangles are valid
|
||||||
} cl_font_t;
|
} cl_font_t;
|
||||||
|
|
||||||
|
typedef struct scissor_state_s
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
qboolean test;
|
||||||
|
} scissor_state_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
// scissor test
|
||||||
|
scissor_state_t scissor;
|
||||||
|
|
||||||
// temp handle
|
// temp handle
|
||||||
const model_t *pSprite; // pointer to current SpriteTexture
|
const model_t *pSprite; // pointer to current SpriteTexture
|
||||||
|
|
||||||
// scissor test
|
|
||||||
int scissor_x;
|
|
||||||
int scissor_y;
|
|
||||||
int scissor_width;
|
|
||||||
int scissor_height;
|
|
||||||
qboolean scissor_test;
|
|
||||||
|
|
||||||
int renderMode; // override kRenderMode from TriAPI
|
int renderMode; // override kRenderMode from TriAPI
|
||||||
TRICULLSTYLE cullMode; // override CULL FACE from TriAPI
|
TRICULLSTYLE cullMode; // override CULL FACE from TriAPI
|
||||||
|
|
||||||
@ -378,14 +383,10 @@ typedef struct cl_predicted_player_s
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int gl_texturenum; // this is a real texnum
|
|
||||||
|
|
||||||
// scissor test
|
// scissor test
|
||||||
int scissor_x;
|
scissor_state_t scissor;
|
||||||
int scissor_y;
|
|
||||||
int scissor_width;
|
int gl_texturenum; // this is a real texnum
|
||||||
int scissor_height;
|
|
||||||
qboolean scissor_test;
|
|
||||||
|
|
||||||
// holds text color
|
// holds text color
|
||||||
rgba_t textColor;
|
rgba_t textColor;
|
||||||
@ -862,6 +863,9 @@ void pfnGetScreenFade( struct screenfade_s *fade );
|
|||||||
physent_t *pfnGetPhysent( int idx );
|
physent_t *pfnGetPhysent( int idx );
|
||||||
struct msurface_s *pfnTraceSurface( int ground, float *vstart, float *vend );
|
struct msurface_s *pfnTraceSurface( int ground, float *vstart, float *vend );
|
||||||
movevars_t *pfnGetMoveVars( void );
|
movevars_t *pfnGetMoveVars( void );
|
||||||
|
void CL_EnableScissor( scissor_state_t *scissor, int x, int y, int width, int height );
|
||||||
|
void CL_DisableScissor( scissor_state_t *scissor );
|
||||||
|
qboolean CL_Scissor( const scissor_state_t *scissor, float *x, float *y, float *width, float *height, float *u0, float *v0, float *u1, float *v1 );
|
||||||
|
|
||||||
_inline cl_entity_t *CL_EDICT_NUM( int n )
|
_inline cl_entity_t *CL_EDICT_NUM( int n )
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user