mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-06 04:05:11 +08:00
Compare commits
15 Commits
ci-test
...
continuous
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6ec4a497c | ||
|
|
30884d7a52 | ||
|
|
95854bc4c4 | ||
|
|
76565fd9a8 | ||
|
|
c509b90a39 | ||
|
|
9f660d2660 | ||
|
|
39f8fd6870 | ||
|
|
7c0fca81b0 | ||
|
|
e9e46dd67a | ||
|
|
68875267de | ||
|
|
5955d31997 | ||
|
|
69757945fa | ||
|
|
2da155708a | ||
|
|
81bda52a79 | ||
|
|
231646ae72 |
@@ -444,16 +444,13 @@ qboolean AVI_Think( movie_state_t *Avi )
|
||||
|
||||
if( Avi->texture == 0 )
|
||||
{
|
||||
int cinTexture = SCR_GetCinematicTexture();
|
||||
int w = Avi->w >= 0 ? Avi->w : refState.width;
|
||||
int h = Avi->h >= 0 ? Avi->h : refState.height;
|
||||
|
||||
if( redraw )
|
||||
ref.dllFuncs.GL_UpdateTexture( cinTexture, Avi->xres, Avi->yres, Avi->xres, Avi->yres, Avi->dst, PF_BGRA_32 );
|
||||
ref.dllFuncs.R_DrawStretchPic( Avi->x, Avi->y, w, h, 0, 0, 1, 1, cinTexture );
|
||||
ref.dllFuncs.R_DrawStretchRaw( Avi->x, Avi->y, w, h, Avi->xres, Avi->yres, Avi->dst, redraw );
|
||||
}
|
||||
else if( redraw && Avi->texture > 0 )
|
||||
ref.dllFuncs.GL_UpdateTexture( Avi->texture, Avi->xres, Avi->yres, Avi->w, Avi->h, Avi->dst, PF_BGRA_32 );
|
||||
ref.dllFuncs.AVI_UploadRawFrame( Avi->texture, Avi->xres, Avi->yres, Avi->w, Avi->h, Avi->dst );
|
||||
|
||||
if( flushing && !decoded )
|
||||
return false; // probably hit an EOF
|
||||
|
||||
@@ -849,31 +849,6 @@ BEAM * GAME_EXPORT R_BeamEnts( int startEnt, int endEnt, int modelIndex, float l
|
||||
return pbeam;
|
||||
}
|
||||
|
||||
static qboolean R_BeamVisible( const vec3_t start, const vec3_t end )
|
||||
{
|
||||
vec3_t mins, maxs;
|
||||
|
||||
for( int i = 0; i < 3; i++ )
|
||||
{
|
||||
if( start[i] < end[i] )
|
||||
{
|
||||
mins[i] = start[i];
|
||||
maxs[i] = end[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
mins[i] = end[i];
|
||||
maxs[i] = start[i];
|
||||
}
|
||||
|
||||
// don't let it be zero sized
|
||||
if( mins[i] == maxs[i] )
|
||||
maxs[i] += 1.0f;
|
||||
}
|
||||
|
||||
return Mod_BoxVisible( mins, maxs, ref.dllFuncs.Mod_GetCurrentVis( ));
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
R_BeamPoints
|
||||
@@ -886,7 +861,7 @@ BEAM * GAME_EXPORT R_BeamPoints( vec3_t start, vec3_t end, int modelIndex, float
|
||||
{
|
||||
BEAM *pbeam;
|
||||
|
||||
if( life != 0 && !R_BeamVisible( start, end ))
|
||||
if( life != 0 && ref.dllFuncs.R_BeamCull( start, end, true ))
|
||||
return NULL;
|
||||
|
||||
pbeam = R_BeamAlloc();
|
||||
|
||||
@@ -23,8 +23,6 @@ GNU General Public License for more details.
|
||||
#include "client.h"
|
||||
#include "const.h"
|
||||
#include "triangleapi.h"
|
||||
#include "r_studioint.h"
|
||||
#include "mod_local.h"
|
||||
#include "r_efx.h"
|
||||
#include "demo_api.h"
|
||||
#include "ivoicetweak.h"
|
||||
@@ -2175,7 +2173,7 @@ pfnGetViewModel
|
||||
|
||||
=============
|
||||
*/
|
||||
static cl_entity_t *GAME_EXPORT CL_GetViewModel( void )
|
||||
static cl_entity_t* GAME_EXPORT CL_GetViewModel( void )
|
||||
{
|
||||
return &clgame.viewent;
|
||||
}
|
||||
@@ -3931,69 +3929,6 @@ void CL_UnloadProgs( void )
|
||||
memset( &clgame, 0, sizeof( clgame ));
|
||||
}
|
||||
|
||||
static model_t *pfnStudio_Mod_ForName( const char *name, int crash )
|
||||
{
|
||||
return Mod_ForName( name, crash, false );
|
||||
}
|
||||
|
||||
static void *pfnStudio_Mod_Extradata( model_t *mod )
|
||||
{
|
||||
return Mod_StudioExtradata( mod );
|
||||
}
|
||||
|
||||
static void pfnStudio_GetAliasScale( float *x, float *y )
|
||||
{
|
||||
if( x ) *x = 1.0f;
|
||||
if( y ) *y = 1.0f;
|
||||
}
|
||||
|
||||
static float ***pfnStudio_GetAliasTransform( void )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static model_t *pfnStudio_GetChromeSprite( void )
|
||||
{
|
||||
return cl_sprite_shell;
|
||||
}
|
||||
|
||||
static int pfnStudio_IsHardware( void )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static engine_studio_api_t gStudioAPI =
|
||||
{
|
||||
.Mem_Calloc = Mod_Calloc,
|
||||
.Cache_Check = Mod_CacheCheck,
|
||||
.LoadCacheFile = Mod_LoadCacheFile,
|
||||
.Mod_ForName = pfnStudio_Mod_ForName,
|
||||
.Mod_Extradata = pfnStudio_Mod_Extradata,
|
||||
.GetModelByIndex = CL_ModelHandle,
|
||||
.GetCvar = pfnCVarGetPointer,
|
||||
.GetChromeSprite = pfnStudio_GetChromeSprite,
|
||||
.GetAliasScale = pfnStudio_GetAliasScale,
|
||||
.StudioGetAliasTransform = pfnStudio_GetAliasTransform,
|
||||
.GetViewEntity = CL_GetViewModel,
|
||||
.IsHardware = pfnStudio_IsHardware,
|
||||
};
|
||||
|
||||
static void CL_InitStudioAPI( void )
|
||||
{
|
||||
static r_studio_interface_t gDefaultStudioDraw;
|
||||
r_studio_interface_t *pStudioDraw;
|
||||
|
||||
if( !ref.dllFuncs.R_StudioFillAPI( &gStudioAPI, &gDefaultStudioDraw ))
|
||||
return;
|
||||
|
||||
pStudioDraw = &gDefaultStudioDraw;
|
||||
|
||||
if( clgame.dllFuncs.pfnGetStudioModelInterface )
|
||||
clgame.dllFuncs.pfnGetStudioModelInterface( STUDIO_INTERFACE_VERSION, &pStudioDraw, &gStudioAPI );
|
||||
|
||||
ref.dllFuncs.R_StudioSetDrawInterface( pStudioDraw );
|
||||
}
|
||||
|
||||
qboolean CL_LoadProgs( const char *name )
|
||||
{
|
||||
static playermove_t gpMove;
|
||||
@@ -4131,7 +4066,7 @@ qboolean CL_LoadProgs( const char *name )
|
||||
// initialize game
|
||||
clgame.dllFuncs.pfnInit();
|
||||
|
||||
CL_InitStudioAPI();
|
||||
ref.dllFuncs.CL_InitStudioAPI();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -15,7 +15,6 @@ GNU General Public License for more details.
|
||||
|
||||
#include "common.h"
|
||||
#include "client.h"
|
||||
#include "mod_local.h"
|
||||
#include "net_encode.h"
|
||||
#include "cl_tent.h"
|
||||
#include "shake.h"
|
||||
@@ -1739,8 +1738,6 @@ void CL_RegisterResources( sizebuf_t *msg, connprotocol_t proto )
|
||||
// tell rendering system we have a new set of models.
|
||||
ref.dllFuncs.R_NewMap ();
|
||||
|
||||
Mod_LoadDetailTextures( cl.worldmodel );
|
||||
|
||||
// check if this map must start from dark screen
|
||||
CL_StartDark ();
|
||||
|
||||
@@ -514,26 +514,17 @@ static void CL_ParseSoundPacketGS( sizebuf_t *msg )
|
||||
static void CL_ParseSpawnStaticSound( sizebuf_t *msg )
|
||||
{
|
||||
vec3_t pos;
|
||||
int sound, entnum, pitch, flags;
|
||||
int handle, entnum, pitch, flags;
|
||||
float volume, attn;
|
||||
sound_t handle = 0;
|
||||
|
||||
MSG_ReadVec3Coord( msg, pos );
|
||||
sound = MSG_ReadShort( msg );
|
||||
handle = MSG_ReadShort( msg );
|
||||
volume = MSG_ReadByte( msg ) * ( 1.0f / 255.0f );
|
||||
attn = MSG_ReadByte( msg ) * ( 1.0f / 64.0f );
|
||||
entnum = MSG_ReadShort( msg );
|
||||
pitch = MSG_ReadByte( msg );
|
||||
flags = MSG_ReadByte( msg );
|
||||
|
||||
if( FBitSet( flags, SND_SENTENCE ))
|
||||
{
|
||||
char sentenceName[32];
|
||||
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
||||
handle = S_RegisterSound( sentenceName );
|
||||
}
|
||||
else handle = cl.sound_index[sound]; // see precached sound
|
||||
|
||||
S_AmbientSound( pos, entnum, handle, volume, attn, pitch, flags );
|
||||
}
|
||||
|
||||
@@ -214,11 +214,6 @@ static void pfnAVI_StreamSound( movie_state_t *avi, int entnum, float fvol, floa
|
||||
return; // stub, use AVI_SetParm and AVI_Think to stream AVI sound
|
||||
}
|
||||
|
||||
static void pfnAVI_UploadRawFrame( int texture, int cols, int rows, int width, int height, const byte *data )
|
||||
{
|
||||
ref.dllFuncs.GL_UpdateTexture( texture, cols, rows, width, height, data, PF_BGRA_32 );
|
||||
}
|
||||
|
||||
static render_api_t gRenderAPI =
|
||||
{
|
||||
pfnRenderGetParm, // GL_RenderGetParm,
|
||||
@@ -248,7 +243,7 @@ static render_api_t gRenderAPI =
|
||||
AVI_GetVideoInfo,
|
||||
AVI_GetVideoFrameNumber,
|
||||
AVI_GetVideoFrame,
|
||||
pfnAVI_UploadRawFrame, // AVI_UploadRawFrame
|
||||
NULL, // R_UploadStretchRaw,
|
||||
AVI_FreeVideo,
|
||||
AVI_IsActive,
|
||||
pfnAVI_StreamSound,
|
||||
@@ -288,6 +283,40 @@ static render_api_t gRenderAPI =
|
||||
COM_SetRandomSeed,
|
||||
};
|
||||
|
||||
static void R_FillRenderAPIFromRef( render_api_t *to, const ref_interface_t *from )
|
||||
{
|
||||
to->GetDetailScaleForTexture = from->GetDetailScaleForTexture;
|
||||
to->GetExtraParmsForTexture = from->GetExtraParmsForTexture;
|
||||
to->GetFrameTime = from->GetFrameTime;
|
||||
to->R_SetCurrentEntity = from->R_SetCurrentEntity;
|
||||
to->R_SetCurrentModel = from->R_SetCurrentModel;
|
||||
to->GL_FindTexture = from->GL_FindTexture;
|
||||
to->GL_TextureName = from->GL_TextureName;
|
||||
to->GL_TextureData = from->GL_TextureData;
|
||||
to->GL_LoadTexture = from->GL_LoadTexture;
|
||||
to->GL_CreateTexture = from->GL_CreateTexture;
|
||||
to->GL_LoadTextureArray = from->GL_LoadTextureArray;
|
||||
to->GL_CreateTextureArray = from->GL_CreateTextureArray;
|
||||
to->GL_FreeTexture = from->GL_FreeTexture;
|
||||
to->DrawSingleDecal = from->DrawSingleDecal;
|
||||
to->R_DecalSetupVerts = from->R_DecalSetupVerts;
|
||||
to->R_EntityRemoveDecals = from->R_EntityRemoveDecals;
|
||||
to->AVI_UploadRawFrame = from->AVI_UploadRawFrame;
|
||||
to->GL_Bind = from->GL_Bind;
|
||||
to->GL_SelectTexture = from->GL_SelectTexture;
|
||||
to->GL_LoadTextureMatrix = from->GL_LoadTextureMatrix;
|
||||
to->GL_TexMatrixIdentity = from->GL_TexMatrixIdentity;
|
||||
to->GL_CleanUpTextureUnits = from->GL_CleanUpTextureUnits;
|
||||
to->GL_TexGen = from->GL_TexGen;
|
||||
to->GL_TextureTarget = from->GL_TextureTarget;
|
||||
to->GL_TexCoordArrayMode = from->GL_TexCoordArrayMode;
|
||||
to->GL_UpdateTexSize = from->GL_UpdateTexSize;
|
||||
to->GL_DrawParticles = from->GL_DrawParticles;
|
||||
to->LightVec = from->LightVec;
|
||||
to->StudioGetTexture = from->StudioGetTexture;
|
||||
to->GL_GetProcAddress = from->R_GetProcAddress;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_InitRenderAPI
|
||||
@@ -300,15 +329,8 @@ qboolean R_InitRenderAPI( void )
|
||||
// make sure what render functions is cleared
|
||||
memset( &clgame.drawFuncs, 0, sizeof( clgame.drawFuncs ));
|
||||
|
||||
gRenderAPI.GetDetailScaleForTexture = ref.dllFuncs.R_GetDetailScaleForTexture;
|
||||
gRenderAPI.GL_FindTexture = ref.dllFuncs.GL_FindTexture;
|
||||
gRenderAPI.GL_TextureName = ref.dllFuncs.GL_TextureName;
|
||||
gRenderAPI.GL_TextureData = ref.dllFuncs.GL_TextureData;
|
||||
gRenderAPI.GL_LoadTexture = ref.dllFuncs.GL_LoadTexture;
|
||||
gRenderAPI.GL_FreeTexture = ref.dllFuncs.GL_FreeTexture;
|
||||
gRenderAPI.GL_Bind = ref.dllFuncs.GL_Bind;
|
||||
|
||||
ref.dllFuncs.R_FillRenderAPI( &gRenderAPI );
|
||||
// fill missing functions from renderer
|
||||
R_FillRenderAPIFromRef( &gRenderAPI, &ref.dllFuncs );
|
||||
|
||||
if( clgame.dllFuncs.pfnGetRenderInterface )
|
||||
{
|
||||
@@ -25,7 +25,6 @@ AVI PLAYING
|
||||
*/
|
||||
|
||||
static movie_state_t *cin_state;
|
||||
static int cin_texture;
|
||||
|
||||
/*
|
||||
==================
|
||||
@@ -282,12 +281,6 @@ void SCR_InitCinematic( void )
|
||||
{
|
||||
AVI_Initailize ();
|
||||
cin_state = AVI_GetState( CIN_MAIN );
|
||||
cin_texture = ref.dllFuncs.GL_CreateTexture( "*cintexture", 64, 64, NULL, TF_NOMIPMAP|TF_CLAMP );
|
||||
}
|
||||
|
||||
int SCR_GetCinematicTexture( void )
|
||||
{
|
||||
return cin_texture;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -874,6 +874,7 @@ struct msurface_s *pfnTraceSurface( int ground, float *vstart, float *vend );
|
||||
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 );
|
||||
|
||||
static inline cl_entity_t *CL_EDICT_NUM( int index )
|
||||
{
|
||||
if( unlikely( !clgame.entities )) // not in game yet
|
||||
@@ -1215,7 +1216,6 @@ void SteamBroker_TerminateGameConnection( void );
|
||||
// cl_video.c
|
||||
//
|
||||
void SCR_InitCinematic( void );
|
||||
int SCR_GetCinematicTexture( void );
|
||||
void SCR_FreeCinematic( void );
|
||||
qboolean SCR_PlayCinematic( const char *name );
|
||||
qboolean SCR_DrawCinematic( void );
|
||||
@@ -1241,6 +1241,7 @@ void Key_EnumCmds_f( void );
|
||||
void Key_SetKeyDest( int key_dest );
|
||||
void Key_EnableTextInput( qboolean enable, qboolean force );
|
||||
int Key_ToUpper( int key );
|
||||
void OSK_Draw( void );
|
||||
qboolean Cmd_GetKeysList( const char *s, char *completedname, int length, qboolean print_suggestions );
|
||||
|
||||
//
|
||||
|
||||
@@ -197,7 +197,7 @@ static int Joy_GetHatValueForAxis( const engineAxis_t engineAxis )
|
||||
positive = JOY_HAT_RIGHT;
|
||||
break;
|
||||
case JOY_AXIS_FWD:
|
||||
threshold = joy_forward_key_threshold.value;
|
||||
threshold = joy_side_key_threshold.value;
|
||||
negative = JOY_HAT_UP;
|
||||
positive = JOY_HAT_DOWN;
|
||||
break;
|
||||
@@ -318,7 +318,7 @@ void Joy_FinalizeMove( float *fw, float *side, float *dpitch, float *dyaw )
|
||||
const char *bind = joy_axis_binding.string;
|
||||
size_t i;
|
||||
|
||||
for( i = 0; bind[i] && i < MAX_AXES; i++ )
|
||||
for( i = 0; bind[i]; i++ )
|
||||
{
|
||||
switch( bind[i] )
|
||||
{
|
||||
@@ -185,10 +185,10 @@ void Touch_NotifyResize( void )
|
||||
|
||||
static inline float Touch_AspectRatio( void )
|
||||
{
|
||||
if( touch.config_aspect_ratio >= 0.25f )
|
||||
if( touch.config_aspect_ratio )
|
||||
return touch.config_aspect_ratio;
|
||||
|
||||
if( touch.actual_aspect_ratio >= 0.25f )
|
||||
if( touch.actual_aspect_ratio )
|
||||
return touch.actual_aspect_ratio;
|
||||
|
||||
if( refState.width && refState.height )
|
||||
@@ -369,7 +369,7 @@ static void Touch_ExportConfig_f( void )
|
||||
string profilebase;
|
||||
|
||||
COM_FileBase( name, profilebase, sizeof( profilebase ));
|
||||
Q_snprintf( profilename, sizeof( profilename ), "touch_profiles/%s (copy).cfg", profilebase );
|
||||
Q_snprintf( profilename, sizeof( profilebase ), "touch_profiles/%s (copy).cfg", profilebase );
|
||||
}
|
||||
else Q_strncpy( profilename, name, sizeof( profilename ));
|
||||
|
||||
@@ -588,7 +588,7 @@ static void Touch_RemoveButtonFromList( touchbuttonlist_t *list, const char *nam
|
||||
|
||||
IN_TouchEditClear();
|
||||
|
||||
while(( button = Touch_FindFirst( list, name, privileged )))
|
||||
while(( button = Touch_FindFirst( &touch.list_user, name, privileged )))
|
||||
{
|
||||
if( button->prev )
|
||||
button->prev->next = button->next;
|
||||
@@ -860,7 +860,8 @@ void Touch_AddClientButton( const char *name, const char *texture, const char *c
|
||||
if( !touch.initialized )
|
||||
return;
|
||||
|
||||
IN_TouchCheckCoords( &x1, &y1, &x2, &y2 );
|
||||
if( round )
|
||||
IN_TouchCheckCoords( &x1, &y1, &x2, &y2 );
|
||||
|
||||
if( round == round_aspect )
|
||||
y2 = y1 + ( x2 - x1 ) / (Touch_AspectRatio()) * aspect;
|
||||
@@ -1067,7 +1068,7 @@ static void Touch_InitEditor( void )
|
||||
temp = Touch_AddButton( &touch.list_edit, "close", "touch_default/edit_close", "touch_disableedit", 0, y, x, y + 0.1f, color, true );
|
||||
SetBits( temp->flags, TOUCH_FL_NOEDIT );
|
||||
|
||||
temp = Touch_AddButton( &touch.list_edit, "close_label", "#Close and save", "", x, y, x + 0.2f, y + 0.1f, color, true );
|
||||
temp = Touch_AddButton( &touch.list_edit, "close", "#Close and save", "", x, y, x + 0.2f, y + 0.1f, color, true );
|
||||
SetBits( temp->flags, TOUCH_FL_NOEDIT );
|
||||
|
||||
y += 0.2f;
|
||||
@@ -1075,7 +1076,7 @@ static void Touch_InitEditor( void )
|
||||
temp = Touch_AddButton( &touch.list_edit, "cancel", "touch_default/edit_reset", "touch_reloadconfig", 0, y, x, y + 0.1f, color, true );
|
||||
SetBits( temp->flags, TOUCH_FL_NOEDIT );
|
||||
|
||||
temp = Touch_AddButton( &touch.list_edit, "cancel_label", "#Cancel and reset", "", x, y, x + 0.2f, y + 0.1f, color, true );
|
||||
temp = Touch_AddButton( &touch.list_edit, "close", "#Cancel and reset", "", x, y, x + 0.2f, y + 0.1f, color, true );
|
||||
SetBits( temp->flags, TOUCH_FL_NOEDIT );
|
||||
|
||||
y += 0.2f;
|
||||
@@ -1255,21 +1256,12 @@ static void Touch_DrawTexture( float x1, float y1, float x2, float y2, int textu
|
||||
0, 0, 1, 1, texture );
|
||||
}
|
||||
|
||||
static inline int Touch_GridCountX( void )
|
||||
{
|
||||
return Q_max((int)touch_grid_count.value, 1 );
|
||||
}
|
||||
|
||||
static inline int Touch_GridCountY( void )
|
||||
{
|
||||
float grid_count_y = touch_grid_count.value * Touch_AspectRatio();
|
||||
return Q_max((int)grid_count_y, 1 );
|
||||
}
|
||||
|
||||
#define GRID_X ( 1.0f / Touch_GridCountX( ))
|
||||
#define GRID_Y ( 1.0f / Touch_GridCountY( ))
|
||||
#define GRID_ROUND_X( x ) ((float)round(( x ) * Touch_GridCountX() ) / Touch_GridCountX())
|
||||
#define GRID_ROUND_Y( x ) ((float)round(( x ) * Touch_GridCountY() ) / Touch_GridCountY())
|
||||
#define GRID_COUNT_X ((int)touch_grid_count.value )
|
||||
#define GRID_COUNT_Y (((int)touch_grid_count.value ) * Touch_AspectRatio( ))
|
||||
#define GRID_X ( 1.0f / GRID_COUNT_X )
|
||||
#define GRID_Y ( 1.0f / Touch_AspectRatio() / GRID_COUNT_X )
|
||||
#define GRID_ROUND_X( x ) ((float)round(( x ) * GRID_COUNT_X ) / GRID_COUNT_X )
|
||||
#define GRID_ROUND_Y( x ) ((float)round(( x ) * GRID_COUNT_Y ) / GRID_COUNT_Y )
|
||||
|
||||
static void IN_TouchCheckCoords( float *x1, float *y1, float *x2, float *y2 )
|
||||
{
|
||||
@@ -445,10 +445,6 @@ void IN_Init( void )
|
||||
{
|
||||
IN_StartupMouse( );
|
||||
|
||||
IN_GyroInit();
|
||||
|
||||
OSK_Init();
|
||||
|
||||
Joy_Init(); // common joystick support init
|
||||
|
||||
Touch_Init();
|
||||
@@ -564,7 +560,6 @@ static void IN_CollectInput( float *forward, float *side, float *pitch, float *y
|
||||
#endif
|
||||
}
|
||||
|
||||
IN_GyroFinalizeMove( forward, side, pitch, yaw );
|
||||
Joy_FinalizeMove( forward, side, pitch, yaw );
|
||||
Touch_GetMove( forward, side, pitch, yaw );
|
||||
|
||||
@@ -39,10 +39,6 @@ void IN_DeactivateMouse( void );
|
||||
void IN_MouseSavePos( void );
|
||||
void IN_MouseRestorePos( void );
|
||||
void IN_ToggleClientMouse( int newstate, int oldstate );
|
||||
void IN_GyroInit( void );
|
||||
void IN_GyroCheckAvailability( void );
|
||||
void IN_GyroEvent( vec3_t data );
|
||||
void IN_GyroFinalizeMove( float *fw, float *side, float *dpitch, float *dyaw );
|
||||
|
||||
uint IN_CollectInputDevices( void );
|
||||
void IN_LockInputDevices( qboolean lock );
|
||||
@@ -99,15 +95,6 @@ qboolean Touch_WantVisibleCursor( void );
|
||||
void Touch_NotifyResize( void );
|
||||
#endif
|
||||
|
||||
//
|
||||
// in_osk.c
|
||||
//
|
||||
extern convar_t osk_enable;
|
||||
void OSK_Init( void );
|
||||
qboolean OSK_KeyEvent( int key, int down );
|
||||
void OSK_EnableTextInput( qboolean enable, qboolean force );
|
||||
void OSK_Draw( void );
|
||||
|
||||
//
|
||||
// in_joy.c
|
||||
//
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
/*
|
||||
in_gyro.c - System gyroscope input code
|
||||
Copyright (C) 2026 Xash3D FWGS contributors
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "input.h"
|
||||
#include "client.h"
|
||||
|
||||
static CVAR_DEFINE_AUTO( gyro_enable, "0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "enables aiming with built-in device gyroscope" );
|
||||
static CVAR_DEFINE_AUTO( gyro_available, "0", FCVAR_READ_ONLY, "tells whether system gyroscope hardware is available or not" );
|
||||
static CVAR_DEFINE_AUTO( gyro_pitch, "1.0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope sensitivity for looking up and down" );
|
||||
static CVAR_DEFINE_AUTO( gyro_yaw, "1.0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope sensitivity for turning left and right" );
|
||||
static CVAR_DEFINE_AUTO( gyro_roll, "0.0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope sensitivity when tilting the device sideways" );
|
||||
static CVAR_DEFINE_AUTO( gyro_pitch_deadzone, "0.5", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope pitch axis deadzone (deg/s)" );
|
||||
static CVAR_DEFINE_AUTO( gyro_yaw_deadzone, "0.5", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope yaw axis deadzone (deg/s)" );
|
||||
static CVAR_DEFINE_AUTO( gyro_roll_deadzone, "0.5", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "built-in gyroscope roll axis deadzone (deg/s)" );
|
||||
|
||||
// stores the latest instantaneous rotation rates from built-in gyroscope
|
||||
static vec3_t gyro_speed;
|
||||
|
||||
/*
|
||||
==============
|
||||
IN_GyroInit
|
||||
|
||||
==============
|
||||
*/
|
||||
void IN_GyroInit( void )
|
||||
{
|
||||
Cvar_RegisterVariable( &gyro_enable );
|
||||
Cvar_RegisterVariable( &gyro_available );
|
||||
Cvar_RegisterVariable( &gyro_pitch );
|
||||
Cvar_RegisterVariable( &gyro_yaw );
|
||||
Cvar_RegisterVariable( &gyro_roll );
|
||||
Cvar_RegisterVariable( &gyro_pitch_deadzone );
|
||||
Cvar_RegisterVariable( &gyro_yaw_deadzone );
|
||||
Cvar_RegisterVariable( &gyro_roll_deadzone );
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
IN_GyroCheckAvailability
|
||||
|
||||
One-time late check called after startup and configs
|
||||
==============
|
||||
*/
|
||||
void IN_GyroCheckAvailability( void )
|
||||
{
|
||||
#if XASH_SDL
|
||||
if( gyro_available.value )
|
||||
return;
|
||||
|
||||
if( SDLash_GyroIsAvailable() )
|
||||
{
|
||||
Cvar_FullSet( "gyro_available", "1", FCVAR_READ_ONLY );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
IN_GyroEvent
|
||||
|
||||
System gyroscope events from platform
|
||||
=============
|
||||
*/
|
||||
void IN_GyroEvent( vec3_t data )
|
||||
{
|
||||
VectorCopy( data, gyro_speed );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
IN_GyroFinalizeMove
|
||||
|
||||
Apply gyro movement to view angles
|
||||
=============
|
||||
*/
|
||||
void IN_GyroFinalizeMove( float *fw, float *side, float *dpitch, float *dyaw )
|
||||
{
|
||||
platform_orientation_t orient;
|
||||
float orient_scale = 1.0f;
|
||||
|
||||
if( !gyro_enable.value || !gyro_available.value )
|
||||
return;
|
||||
|
||||
orient = Platform_GetDisplayOrientation();
|
||||
if( orient == ORIENTATION_LANDSCAPE_FLIPPED )
|
||||
orient_scale = -1.0f;
|
||||
|
||||
// In Landscape mode axes are swapped relative to natural (Portrait) orientation
|
||||
// Y axis rotation becomes Pitch (up/down)
|
||||
// X axis rotation becomes Yaw (left/right)
|
||||
float pitch_speed = -orient_scale * gyro_speed[1] * ( 180.0f / M_PI );
|
||||
float yaw_speed = orient_scale * gyro_speed[0] * ( 180.0f / M_PI );
|
||||
float roll_speed = orient_scale * gyro_speed[2] * ( 180.0f / M_PI );
|
||||
|
||||
if( fabs( pitch_speed ) < gyro_pitch_deadzone.value )
|
||||
pitch_speed = 0.0f;
|
||||
if( fabs( yaw_speed ) < gyro_yaw_deadzone.value )
|
||||
yaw_speed = 0.0f;
|
||||
if( fabs( roll_speed ) < gyro_roll_deadzone.value )
|
||||
roll_speed = 0.0f;
|
||||
|
||||
*dpitch -= gyro_pitch.value * pitch_speed * host.realframetime;
|
||||
*dyaw += gyro_yaw.value * yaw_speed * host.realframetime;
|
||||
*dyaw += gyro_roll.value * roll_speed * host.realframetime;
|
||||
|
||||
VectorClear( gyro_speed );
|
||||
}
|
||||
@@ -1,312 +0,0 @@
|
||||
/*
|
||||
in_osk.c - on-screen keyboard input
|
||||
Copyright (C) 2016-2026 Alibek Omarov
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "common.h"
|
||||
#include "input.h"
|
||||
#include "client.h"
|
||||
|
||||
CVAR_DEFINE_AUTO( osk_enable, "0", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "enable built-in on-screen keyboard" );
|
||||
|
||||
/* On-screen keyboard:
|
||||
*
|
||||
* 4 lines with 13 buttons each
|
||||
* Left trigger == backspace
|
||||
* Right trigger == space
|
||||
* Any button press is button press on keyboard
|
||||
*
|
||||
* Our layout:
|
||||
* 0 1 2 3 4 5 6 7 8 9 10 11 12
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= | 0
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |q |w |e |r |t |y |u |i |o |p |[ |] |\ | 1
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |CL|a |s |d |f |g |h |j |k |l |; |' |BS| 2
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |SH|z |x |c |v |b |n |m |, |. |/ |SP|EN| 3
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
*/
|
||||
|
||||
#define MAX_OSK_ROWS 13
|
||||
#define MAX_OSK_LINES 4
|
||||
|
||||
enum
|
||||
{
|
||||
OSK_DEFAULT = 0,
|
||||
OSK_UPPER, // on caps, shift
|
||||
/*
|
||||
OSK_RUSSIAN,
|
||||
OSK_RUSSIAN_UPPER,
|
||||
*/
|
||||
OSK_LAST
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
OSK_TAB = 16,
|
||||
OSK_SHIFT,
|
||||
OSK_BACKSPACE,
|
||||
OSK_ENTER,
|
||||
OSK_SPECKEY_LAST
|
||||
};
|
||||
static const char *osk_keylayout[][4] =
|
||||
{
|
||||
{
|
||||
"`1234567890-=", // 13
|
||||
"qwertyuiop[]\\", // 13
|
||||
"\x10" "asdfghjkl;'" "\x12", // 11 + caps on a left, enter on a right
|
||||
"\x11" "zxcvbnm,./ " "\x13" // 10 + esc on left + shift on a left/right
|
||||
},
|
||||
{
|
||||
"~!@#$%^&*()_+",
|
||||
"QWERTYUIOP{}|",
|
||||
"\x10" "ASDFGHJKL:\"" "\x12",
|
||||
"\x11" "ZXCVBNM<>? " "\x13"
|
||||
}
|
||||
};
|
||||
|
||||
static struct osk_s
|
||||
{
|
||||
qboolean enable;
|
||||
int curlayout;
|
||||
qboolean shift;
|
||||
qboolean sending;
|
||||
struct
|
||||
{
|
||||
signed char x;
|
||||
signed char y;
|
||||
char val;
|
||||
} curbutton;
|
||||
} osk;
|
||||
|
||||
qboolean OSK_KeyEvent( int key, int down )
|
||||
{
|
||||
if( !osk.enable || !osk_enable.value )
|
||||
return false;
|
||||
|
||||
if( osk.sending )
|
||||
{
|
||||
osk.sending = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( osk.curbutton.val == 0 )
|
||||
{
|
||||
if( key == K_ENTER || key == K_A_BUTTON )
|
||||
{
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
switch( key )
|
||||
{
|
||||
case K_A_BUTTON:
|
||||
case K_ENTER:
|
||||
switch( osk.curbutton.val )
|
||||
{
|
||||
case OSK_ENTER:
|
||||
osk.sending = true;
|
||||
Key_Event( K_ENTER, down );
|
||||
// osk_enable = false; // TODO: handle multiline
|
||||
break;
|
||||
case OSK_SHIFT:
|
||||
if( !down )
|
||||
break;
|
||||
|
||||
if( osk.curlayout & 1 )
|
||||
osk.curlayout--;
|
||||
else
|
||||
osk.curlayout++;
|
||||
|
||||
osk.shift = true;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
break;
|
||||
case OSK_BACKSPACE:
|
||||
Key_Event( K_BACKSPACE, down );
|
||||
break;
|
||||
case OSK_TAB:
|
||||
Key_Event( K_TAB, down );
|
||||
break;
|
||||
default:
|
||||
{
|
||||
int ch;
|
||||
|
||||
if( !down )
|
||||
{
|
||||
if( osk.shift && osk.curlayout & 1 )
|
||||
osk.curlayout--;
|
||||
|
||||
osk.shift = false;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
break;
|
||||
}
|
||||
|
||||
ch = (byte)osk.curbutton.val;
|
||||
|
||||
// do not pass UTF-8 sequence into the engine, convert it here
|
||||
if( !cls.accept_utf8 )
|
||||
ch = Con_UtfProcessCharForce( ch );
|
||||
|
||||
if( !ch )
|
||||
break;
|
||||
|
||||
CL_CharEvent( ch );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case K_UPARROW:
|
||||
if( down && --osk.curbutton.y < 0 )
|
||||
{
|
||||
osk.curbutton.y = MAX_OSK_LINES - 1;
|
||||
osk.curbutton.val = 0;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case K_DOWNARROW:
|
||||
if( down && ++osk.curbutton.y >= MAX_OSK_LINES )
|
||||
{
|
||||
osk.curbutton.y = 0;
|
||||
osk.curbutton.val = 0;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case K_LEFTARROW:
|
||||
if( down && --osk.curbutton.x < 0 )
|
||||
osk.curbutton.x = MAX_OSK_ROWS - 1;
|
||||
break;
|
||||
case K_RIGHTARROW:
|
||||
if( down && ++osk.curbutton.x >= MAX_OSK_ROWS )
|
||||
osk.curbutton.x = 0;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
OSK_EnableTextInput
|
||||
|
||||
Enables built-in IME
|
||||
=============
|
||||
*/
|
||||
void OSK_EnableTextInput( qboolean enable, qboolean force )
|
||||
{
|
||||
qboolean old = osk.enable;
|
||||
|
||||
osk.enable = enable;
|
||||
|
||||
if( osk.enable && ( !old || force ))
|
||||
{
|
||||
osk.curlayout = 0;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
}
|
||||
}
|
||||
|
||||
#define X_START 0.1347475f
|
||||
#define Y_START 0.567f
|
||||
#define X_STEP 0.05625
|
||||
#define Y_STEP 0.0825
|
||||
|
||||
/*
|
||||
============
|
||||
OSK_DrawSymbolButton
|
||||
|
||||
Draw button with symbol on it
|
||||
============
|
||||
*/
|
||||
static void OSK_DrawSymbolButton( int symb, float x, float y, float width, float height )
|
||||
{
|
||||
cl_font_t *font = Con_GetCurFont();
|
||||
byte color[] = { 255, 255, 255, 255 };
|
||||
int x1 = x * refState.width,
|
||||
y1 = y * refState.height,
|
||||
w = width * refState.width,
|
||||
h = height * refState.height;
|
||||
|
||||
if( symb == osk.curbutton.val )
|
||||
ref.dllFuncs.FillRGBA( kRenderTransTexture, x1, y1, w, h, 255, 160, 0, 100 );
|
||||
|
||||
if( !symb || symb == ' ' || ( symb >= OSK_TAB && symb < OSK_SPECKEY_LAST ))
|
||||
return;
|
||||
|
||||
CL_DrawCharacter(
|
||||
x1 + width * 0.4 * refState.width,
|
||||
y1 + height * 0.4 * refState.height,
|
||||
symb, color, font, 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
OSK_DrawSpecialButton
|
||||
|
||||
Draw special button, like shift, enter or esc
|
||||
=============
|
||||
*/
|
||||
static void OSK_DrawSpecialButton( const char *name, float x, float y, float width, float height )
|
||||
{
|
||||
byte color[] = { 0, 255, 0, 255 };
|
||||
|
||||
Con_DrawString(
|
||||
x * refState.width + width * 0.4 * refState.width,
|
||||
y * refState.height + height * 0.4 * refState.height,
|
||||
name,
|
||||
color );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
OSK_Draw
|
||||
|
||||
Draw on screen keyboard, if enabled
|
||||
=============
|
||||
*/
|
||||
void OSK_Draw( void )
|
||||
{
|
||||
const char **curlayout = osk_keylayout[osk.curlayout]; // shortcut :)
|
||||
float x, y;
|
||||
int i, j;
|
||||
|
||||
if( !osk.enable || !osk_enable.value || !osk.curbutton.val )
|
||||
return;
|
||||
|
||||
// draw keyboard
|
||||
ref.dllFuncs.FillRGBA( kRenderTransTexture, X_START * refState.width, Y_START * refState.height,
|
||||
X_STEP * MAX_OSK_ROWS * refState.width,
|
||||
Y_STEP * MAX_OSK_LINES * refState.height, 100, 100, 100, 100 );
|
||||
|
||||
OSK_DrawSpecialButton( "-]", X_START, Y_START + Y_STEP * 2, X_STEP, Y_STEP );
|
||||
OSK_DrawSpecialButton( "<-", X_START + X_STEP * 12, Y_START + Y_STEP * 2, X_STEP, Y_STEP );
|
||||
|
||||
OSK_DrawSpecialButton( "sh", X_START, Y_START + Y_STEP * 3, X_STEP, Y_STEP );
|
||||
OSK_DrawSpecialButton( "en", X_START + X_STEP * 12, Y_START + Y_STEP * 3, X_STEP, Y_STEP );
|
||||
|
||||
for( y = Y_START, j = 0; j < MAX_OSK_LINES; j++, y += Y_STEP )
|
||||
for( x = X_START, i = 0; i < MAX_OSK_ROWS; i++, x += X_STEP )
|
||||
OSK_DrawSymbolButton( curlayout[j][i], x, y, X_STEP, Y_STEP );
|
||||
}
|
||||
|
||||
void OSK_Init( void )
|
||||
{
|
||||
Cvar_RegisterVariable( &osk_enable );
|
||||
}
|
||||
@@ -158,6 +158,9 @@ static const keyname_t keynames[] =
|
||||
{ "INTERNATIONAL9", K_INTERNATIONAL + 8, "" },
|
||||
};
|
||||
|
||||
static void OSK_EnableTextInput( qboolean enable, qboolean force );
|
||||
static qboolean OSK_KeyEvent( int key, int down );
|
||||
static CVAR_DEFINE_AUTO( osk_enable, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "enable built-in on-screen keyboard" );
|
||||
static CVAR_DEFINE_AUTO( key_rotate, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "rotate arrow keys (0-3)" );
|
||||
|
||||
/*
|
||||
@@ -197,14 +200,7 @@ static int Key_StringToKeynum( const char *str )
|
||||
|
||||
// check for hex code
|
||||
if( str[0] == '0' && str[1] == 'x' )
|
||||
{
|
||||
int key = Q_atoi( str );
|
||||
|
||||
if( key >= ARRAYSIZE( keys ))
|
||||
return -1;
|
||||
|
||||
return key;
|
||||
}
|
||||
return Q_atoi( str );
|
||||
|
||||
// scan for a text match
|
||||
for( i = 0; i < ARRAYSIZE( keynames ); i++ )
|
||||
@@ -524,7 +520,7 @@ qboolean Cmd_GetKeysList( const char *s, char *completedname, int length, qboole
|
||||
const char *keyname = Key_KeynumToString( i );
|
||||
|
||||
if(( *s == '*' ) || !Q_strnicmp( keyname, s, len ))
|
||||
Q_strncpy( keys_strings[numkeys++], keyname, sizeof( keys_strings[0] ));
|
||||
Q_strncpy( keys_strings[numkeys++], keyname, sizeof( keys[0] ));
|
||||
}
|
||||
|
||||
if( !numkeys ) return false;
|
||||
@@ -583,6 +579,7 @@ void Key_Init( void )
|
||||
for( i = 0; i < ARRAYSIZE( keynames ); i++ )
|
||||
Key_SetBinding( keynames[i].keynum, keynames[i].binding );
|
||||
|
||||
Cvar_RegisterVariable( &osk_enable );
|
||||
Cvar_RegisterVariable( &key_rotate );
|
||||
|
||||
}
|
||||
@@ -988,3 +985,288 @@ int Key_ToUpper( int keynum )
|
||||
|
||||
return Q_toupper( keynum );
|
||||
}
|
||||
|
||||
/* On-screen keyboard:
|
||||
*
|
||||
* 4 lines with 13 buttons each
|
||||
* Left trigger == backspace
|
||||
* Right trigger == space
|
||||
* Any button press is button press on keyboard
|
||||
*
|
||||
* Our layout:
|
||||
* 0 1 2 3 4 5 6 7 8 9 10 11 12
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= | 0
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |q |w |e |r |t |y |u |i |o |p |[ |] |\ | 1
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |CL|a |s |d |f |g |h |j |k |l |; |' |BS| 2
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
* |SH|z |x |c |v |b |n |m |, |. |/ |SP|EN| 3
|
||||
* +--+--+--+--+--+--+--+--+--+--+--+--+--+
|
||||
*/
|
||||
|
||||
#define MAX_OSK_ROWS 13
|
||||
#define MAX_OSK_LINES 4
|
||||
|
||||
enum
|
||||
{
|
||||
OSK_DEFAULT = 0,
|
||||
OSK_UPPER, // on caps, shift
|
||||
/*
|
||||
OSK_RUSSIAN,
|
||||
OSK_RUSSIAN_UPPER,
|
||||
*/
|
||||
OSK_LAST
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
OSK_TAB = 16,
|
||||
OSK_SHIFT,
|
||||
OSK_BACKSPACE,
|
||||
OSK_ENTER,
|
||||
OSK_SPECKEY_LAST
|
||||
};
|
||||
static const char *osk_keylayout[][4] =
|
||||
{
|
||||
{
|
||||
"`1234567890-=", // 13
|
||||
"qwertyuiop[]\\", // 13
|
||||
"\x10" "asdfghjkl;'" "\x12", // 11 + caps on a left, enter on a right
|
||||
"\x11" "zxcvbnm,./ " "\x13" // 10 + esc on left + shift on a left/right
|
||||
},
|
||||
{
|
||||
"~!@#$%^&*()_+",
|
||||
"QWERTYUIOP{}|",
|
||||
"\x10" "ASDFGHJKL:\"" "\x12",
|
||||
"\x11" "ZXCVBNM<>? " "\x13"
|
||||
}
|
||||
};
|
||||
|
||||
struct osk_s
|
||||
{
|
||||
qboolean enable;
|
||||
int curlayout;
|
||||
qboolean shift;
|
||||
qboolean sending;
|
||||
struct {
|
||||
signed char x;
|
||||
signed char y;
|
||||
char val;
|
||||
} curbutton;
|
||||
} osk;
|
||||
|
||||
static qboolean OSK_KeyEvent( int key, int down )
|
||||
{
|
||||
if( !osk.enable || !osk_enable.value )
|
||||
return false;
|
||||
|
||||
if( osk.sending )
|
||||
{
|
||||
osk.sending = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( osk.curbutton.val == 0 )
|
||||
{
|
||||
if( key == K_ENTER || key == K_A_BUTTON )
|
||||
{
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
switch ( key )
|
||||
{
|
||||
case K_A_BUTTON:
|
||||
case K_ENTER:
|
||||
switch( osk.curbutton.val )
|
||||
{
|
||||
case OSK_ENTER:
|
||||
osk.sending = true;
|
||||
Key_Event( K_ENTER, down );
|
||||
//osk_enable = false; // TODO: handle multiline
|
||||
break;
|
||||
case OSK_SHIFT:
|
||||
if( !down )
|
||||
break;
|
||||
|
||||
if( osk.curlayout & 1 )
|
||||
osk.curlayout--;
|
||||
else
|
||||
osk.curlayout++;
|
||||
|
||||
osk.shift = true;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
break;
|
||||
case OSK_BACKSPACE:
|
||||
Key_Event( K_BACKSPACE, down ); break;
|
||||
case OSK_TAB:
|
||||
Key_Event( K_TAB, down ); break;
|
||||
default:
|
||||
{
|
||||
int ch;
|
||||
|
||||
if( !down )
|
||||
{
|
||||
if( osk.shift && osk.curlayout & 1 )
|
||||
osk.curlayout--;
|
||||
|
||||
osk.shift = false;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
break;
|
||||
}
|
||||
|
||||
ch = (byte)osk.curbutton.val;
|
||||
|
||||
// do not pass UTF-8 sequence into the engine, convert it here
|
||||
if( !cls.accept_utf8 )
|
||||
ch = Con_UtfProcessCharForce( ch );
|
||||
|
||||
if( !ch )
|
||||
break;
|
||||
|
||||
CL_CharEvent( ch );
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case K_UPARROW:
|
||||
if( down && --osk.curbutton.y < 0 )
|
||||
{
|
||||
osk.curbutton.y = MAX_OSK_LINES - 1;
|
||||
osk.curbutton.val = 0;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case K_DOWNARROW:
|
||||
if( down && ++osk.curbutton.y >= MAX_OSK_LINES )
|
||||
{
|
||||
osk.curbutton.y = 0;
|
||||
osk.curbutton.val = 0;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case K_LEFTARROW:
|
||||
if( down && --osk.curbutton.x < 0 )
|
||||
osk.curbutton.x = MAX_OSK_ROWS - 1;
|
||||
break;
|
||||
case K_RIGHTARROW:
|
||||
if( down && ++osk.curbutton.x >= MAX_OSK_ROWS )
|
||||
osk.curbutton.x = 0;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
OSK_EnableTextInput
|
||||
|
||||
Enables built-in IME
|
||||
=============
|
||||
*/
|
||||
static void OSK_EnableTextInput( qboolean enable, qboolean force )
|
||||
{
|
||||
qboolean old = osk.enable;
|
||||
|
||||
osk.enable = enable;
|
||||
|
||||
if( osk.enable && (!old || force) )
|
||||
{
|
||||
osk.curlayout = 0;
|
||||
osk.curbutton.val = osk_keylayout[osk.curlayout][osk.curbutton.y][osk.curbutton.x];
|
||||
}
|
||||
}
|
||||
|
||||
#define X_START 0.1347475f
|
||||
#define Y_START 0.567f
|
||||
#define X_STEP 0.05625
|
||||
#define Y_STEP 0.0825
|
||||
|
||||
/*
|
||||
============
|
||||
Joy_DrawSymbolButton
|
||||
|
||||
Draw button with symbol on it
|
||||
============
|
||||
*/
|
||||
static void OSK_DrawSymbolButton( int symb, float x, float y, float width, float height )
|
||||
{
|
||||
cl_font_t *font = Con_GetCurFont();
|
||||
byte color[] = { 255, 255, 255, 255 };
|
||||
int x1 = x * refState.width,
|
||||
y1 = y * refState.height,
|
||||
w = width * refState.width,
|
||||
h = height * refState.height;
|
||||
|
||||
if( symb == osk.curbutton.val )
|
||||
ref.dllFuncs.FillRGBA( kRenderTransTexture, x1, y1, w, h, 255, 160, 0, 100 );
|
||||
|
||||
if( !symb || symb == ' ' || (symb >= OSK_TAB && symb < OSK_SPECKEY_LAST ) )
|
||||
return;
|
||||
|
||||
CL_DrawCharacter(
|
||||
x1 + width * 0.4 * refState.width,
|
||||
y1 + height * 0.4 * refState.height,
|
||||
symb, color, font, 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
Joy_DrawSpecialButton
|
||||
|
||||
Draw special button, like shift, enter or esc
|
||||
=============
|
||||
*/
|
||||
static void OSK_DrawSpecialButton( const char *name, float x, float y, float width, float height )
|
||||
{
|
||||
byte color[] = { 0, 255, 0, 255 };
|
||||
|
||||
Con_DrawString(
|
||||
x * refState.width + width * 0.4 * refState.width,
|
||||
y * refState.height + height * 0.4 * refState.height,
|
||||
name,
|
||||
color );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
Joy_DrawOnScreenKeyboard
|
||||
|
||||
Draw on screen keyboard, if enabled
|
||||
=============
|
||||
*/
|
||||
void OSK_Draw( void )
|
||||
{
|
||||
const char **curlayout = osk_keylayout[osk.curlayout]; // shortcut :)
|
||||
float x, y;
|
||||
int i, j;
|
||||
|
||||
if( !osk.enable || !osk_enable.value || !osk.curbutton.val )
|
||||
return;
|
||||
|
||||
// draw keyboard
|
||||
ref.dllFuncs.FillRGBA( kRenderTransTexture, X_START * refState.width, Y_START * refState.height,
|
||||
X_STEP * MAX_OSK_ROWS * refState.width,
|
||||
Y_STEP * MAX_OSK_LINES * refState.height, 100, 100, 100, 100 );
|
||||
|
||||
OSK_DrawSpecialButton( "-]", X_START, Y_START + Y_STEP * 2, X_STEP, Y_STEP );
|
||||
OSK_DrawSpecialButton( "<-", X_START + X_STEP * 12, Y_START + Y_STEP * 2, X_STEP, Y_STEP );
|
||||
|
||||
OSK_DrawSpecialButton( "sh", X_START, Y_START + Y_STEP * 3, X_STEP, Y_STEP );
|
||||
OSK_DrawSpecialButton( "en", X_START + X_STEP * 12, Y_START + Y_STEP * 3, X_STEP, Y_STEP );
|
||||
|
||||
for( y = Y_START, j = 0; j < MAX_OSK_LINES; j++, y += Y_STEP )
|
||||
for( x = X_START, i = 0; i < MAX_OSK_ROWS; i++, x += X_STEP )
|
||||
OSK_DrawSymbolButton( curlayout[j][i], x, y, X_STEP, Y_STEP );
|
||||
}
|
||||
@@ -287,6 +287,13 @@ static entity_state_t *R_StudioGetPlayerState( int index )
|
||||
return &cl.frames[cl.parsecountmod].playerstate[index];
|
||||
}
|
||||
|
||||
static int pfnGetStudioModelInterface( int version, struct r_studio_interface_s **ppinterface, struct engine_studio_api_s *pstudio )
|
||||
{
|
||||
return clgame.dllFuncs.pfnGetStudioModelInterface ?
|
||||
clgame.dllFuncs.pfnGetStudioModelInterface( version, ppinterface, pstudio ) :
|
||||
0;
|
||||
}
|
||||
|
||||
static const bpc_desc_t *pfnImage_GetPFDesc( int idx )
|
||||
{
|
||||
return &PFDesc[idx];
|
||||
@@ -322,6 +329,11 @@ static qboolean R_Init_Video_( ref_graphic_apis_t type )
|
||||
return R_Init_Video( type );
|
||||
}
|
||||
|
||||
static mleaf_t *pfnMod_PointInLeaf( const vec3_t p, mnode_t *node )
|
||||
{
|
||||
// FIXME: get rid of this on next RefAPI update
|
||||
return Mod_PointInLeaf( p, node, cl.models[1] );
|
||||
}
|
||||
|
||||
static const ref_api_t gEngfuncs =
|
||||
{
|
||||
@@ -363,7 +375,7 @@ static const ref_api_t gEngfuncs =
|
||||
|
||||
Mod_SampleSizeForFace,
|
||||
Mod_BoxVisible,
|
||||
Mod_PointInLeaf,
|
||||
pfnMod_PointInLeaf,
|
||||
R_DrawWorldHull,
|
||||
R_DrawModelHull,
|
||||
|
||||
@@ -399,6 +411,7 @@ static const ref_api_t gEngfuncs =
|
||||
Mod_CacheCheck,
|
||||
Mod_LoadCacheFile,
|
||||
Mod_Calloc,
|
||||
pfnGetStudioModelInterface,
|
||||
|
||||
_Mem_AllocPool,
|
||||
_Mem_FreePool,
|
||||
@@ -475,82 +488,28 @@ static void R_UnloadProgs( void )
|
||||
memset( &ref.dllFuncs, 0, sizeof( ref.dllFuncs ));
|
||||
}
|
||||
|
||||
static void CL_FillTriAPI( triangleapi_t *dst )
|
||||
static void CL_FillTriAPIFromRef( triangleapi_t *dst, const ref_interface_t *src )
|
||||
{
|
||||
dst->version = TRI_API_VERSION;
|
||||
dst->Begin = src->Begin;
|
||||
dst->RenderMode = TriRenderMode;
|
||||
dst->End = src->End;
|
||||
dst->Color4f = TriColor4f;
|
||||
dst->Color4ub = TriColor4ub;
|
||||
dst->TexCoord2f = src->TexCoord2f;
|
||||
dst->Vertex3f = src->Vertex3f;
|
||||
dst->Vertex3fv = src->Vertex3fv;
|
||||
dst->Brightness = TriBrightness;
|
||||
dst->CullFace = TriCullFace;
|
||||
dst->SpriteTexture = TriSpriteTexture;
|
||||
dst->WorldToScreen = TriWorldToScreen;
|
||||
dst->Fog = src->Fog;
|
||||
dst->ScreenToWorld = src->ScreenToWorld;
|
||||
dst->GetMatrix = src->GetMatrix;
|
||||
dst->BoxInPVS = TriBoxInPVS;
|
||||
dst->LightAtPoint = TriLightAtPoint;
|
||||
dst->Color4fRendermode = TriColor4fRendermode;
|
||||
dst->Begin = ref.dllFuncs.Begin;
|
||||
dst->End = ref.dllFuncs.End;
|
||||
dst->Vertex3f = ref.dllFuncs.Vertex3f;
|
||||
dst->Vertex3fv = ref.dllFuncs.Vertex3fv;
|
||||
|
||||
ref.dllFuncs.R_FillTriAPI( dst );
|
||||
}
|
||||
|
||||
static const byte dottexture[8][8] =
|
||||
{
|
||||
{ 0, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 1, 0, 0, 0, 0 },
|
||||
{ 1, 1, 1, 1, 0, 0, 0, 0 },
|
||||
{ 0, 1, 1, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
static void R_CreateBuiltinTextures( void )
|
||||
{
|
||||
uint data4x4[16];
|
||||
uint data16x16[256];
|
||||
byte particle[8 * 8 * 4];
|
||||
int x, y;
|
||||
|
||||
// default checkerboard
|
||||
for( y = 0; y < 16; y++ )
|
||||
{
|
||||
for( x = 0; x < 16; x++ )
|
||||
{
|
||||
if(( y < 8 ) ^ ( x < 8 ))
|
||||
data16x16[y * 16 + x] = 0xFFFF00FF;
|
||||
else
|
||||
data16x16[y * 16 + x] = 0xFF000000;
|
||||
}
|
||||
}
|
||||
ref.dllFuncs.GL_CreateTexture( REF_DEFAULT_TEXTURE, 16, 16, data16x16, TF_COLORMAP );
|
||||
|
||||
// particle texture
|
||||
memset( particle, 0, sizeof( particle ));
|
||||
for( x = 0; x < 8; x++ )
|
||||
{
|
||||
for( y = 0; y < 8; y++ )
|
||||
{
|
||||
if( dottexture[x][y] )
|
||||
particle[( y * 8 + x ) * 4 + 3] = 255;
|
||||
}
|
||||
}
|
||||
ref.dllFuncs.GL_CreateTexture( REF_PARTICLE_TEXTURE, 8, 8, particle, TF_CLAMP );
|
||||
|
||||
// solid colors
|
||||
memset( data4x4, 0xFF, sizeof( data4x4 ));
|
||||
ref.dllFuncs.GL_CreateTexture( REF_WHITE_TEXTURE, 4, 4, data4x4, TF_COLORMAP );
|
||||
|
||||
for( x = 0; x < 16; x++ )
|
||||
data4x4[x] = 0xFF7F7F7F;
|
||||
ref.dllFuncs.GL_CreateTexture( REF_GRAY_TEXTURE, 4, 4, data4x4, TF_COLORMAP );
|
||||
|
||||
for( x = 0; x < 16; x++ )
|
||||
data4x4[x] = 0xFF000000;
|
||||
ref.dllFuncs.GL_CreateTexture( REF_BLACK_TEXTURE, 4, 4, data4x4, TF_COLORMAP );
|
||||
dst->FogParams = src->FogParams;
|
||||
}
|
||||
|
||||
static qboolean R_LoadProgs( const char *name )
|
||||
@@ -596,8 +555,8 @@ static qboolean R_LoadProgs( const char *name )
|
||||
Cvar_FullSet( "host_refloaded", "1", FCVAR_READ_ONLY );
|
||||
ref.initialized = true;
|
||||
|
||||
R_CreateBuiltinTextures();
|
||||
CL_FillTriAPI( &gTriApi );
|
||||
// initialize TriAPI callbacks
|
||||
CL_FillTriAPIFromRef( &gTriApi, &ref.dllFuncs );
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1276,10 +1276,6 @@ int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGa
|
||||
Cbuf_ExecStuffCmds(); // execute stuffcmds (commandline)
|
||||
SCR_CheckStartupVids(); // must be last
|
||||
|
||||
#ifndef XASH_DEDICATED
|
||||
IN_GyroCheckAvailability();
|
||||
#endif
|
||||
|
||||
if( Sys_GetParmFromCmdLine( "-timedemo", demoname ))
|
||||
Cbuf_AddTextf( "timedemo %s\n", demoname );
|
||||
|
||||
|
||||
@@ -2989,105 +2989,6 @@ static void Mod_LoadTextures( model_t *mod, dbspmodel_t *bmod )
|
||||
Mod_SequenceAllAnimatedTextures( mod );
|
||||
}
|
||||
|
||||
#if !XASH_DEDICATED
|
||||
static void Mod_ParseDetailTextures( model_t *mod )
|
||||
{
|
||||
byte *afile;
|
||||
char *pfile;
|
||||
string token, texname;
|
||||
string detail_texname;
|
||||
string detail_path;
|
||||
float xScale, yScale;
|
||||
texture_t *tex;
|
||||
int i;
|
||||
|
||||
string filepath;
|
||||
|
||||
Q_strncpy( filepath, mod->name, sizeof( filepath ));
|
||||
COM_StripExtension( filepath );
|
||||
Q_strncat( filepath, "_detail.txt", sizeof( filepath ));
|
||||
|
||||
afile = FS_LoadFile( filepath, NULL, false );
|
||||
if( !afile )
|
||||
return;
|
||||
|
||||
pfile = (char *)afile;
|
||||
|
||||
// format: 'texturename' 'detailtexture' 'xScale' 'yScale'
|
||||
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
|
||||
{
|
||||
texname[0] = '\0';
|
||||
detail_texname[0] = '\0';
|
||||
|
||||
// read texname
|
||||
if( token[0] == '{' )
|
||||
{
|
||||
// NOTE: COM_ParseFile handled some symbols seperately
|
||||
// this code will be fix it
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
Q_snprintf( texname, sizeof( texname ), "{%s", token );
|
||||
}
|
||||
else
|
||||
Q_strncpy( texname, token, sizeof( texname ));
|
||||
|
||||
// read detailtexture name
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
Q_strncpy( detail_texname, token, sizeof( detail_texname ));
|
||||
|
||||
// trying the scales or '{'
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
|
||||
// read second part of detailtexture name
|
||||
if( token[0] == '{' )
|
||||
{
|
||||
Q_strncat( detail_texname, token, sizeof( detail_texname ));
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token )); // read scales
|
||||
Q_strncat( detail_texname, token, sizeof( detail_texname ));
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token )); // parse scales
|
||||
}
|
||||
|
||||
Q_snprintf( detail_path, sizeof( detail_path ), "gfx/%s", detail_texname );
|
||||
|
||||
// read scales
|
||||
xScale = Q_atof( token );
|
||||
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
yScale = Q_atof( token );
|
||||
|
||||
if( xScale <= 0.0f || yScale <= 0.0f )
|
||||
continue;
|
||||
|
||||
// search for existing texture and uploading detail texture
|
||||
for( i = 0; i < mod->numtextures; i++ )
|
||||
{
|
||||
tex = mod->textures[i];
|
||||
|
||||
if( Q_stricmp( tex->name, texname ))
|
||||
continue;
|
||||
|
||||
tex->dt_texturenum = ref.dllFuncs.GL_LoadTexture( detail_path, NULL, 0, TF_FORCE_COLOR|TF_NOFLIP_TGA );
|
||||
|
||||
if( tex->dt_texturenum )
|
||||
ref.dllFuncs.R_SetDetailScaleForTexture( tex->gl_texturenum, xScale, yScale );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Mem_Free( afile );
|
||||
}
|
||||
|
||||
void Mod_LoadDetailTextures( model_t *mod )
|
||||
{
|
||||
convar_t *r_detailtextures = Cvar_FindVar( "r_detailtextures" );
|
||||
|
||||
if( !r_detailtextures || !r_detailtextures->value )
|
||||
return;
|
||||
|
||||
Mod_ParseDetailTextures( mod );
|
||||
}
|
||||
#endif // !XASH_DEDICATED
|
||||
|
||||
/*
|
||||
=================
|
||||
Mod_LoadTexInfo
|
||||
|
||||
@@ -156,7 +156,6 @@ model_t *Mod_ForName( const char *name, qboolean crash, qboolean trackCRC );
|
||||
qboolean Mod_ValidateCRC( const char *name, uint32_t crc );
|
||||
void Mod_NeedCRC( const char *name, qboolean needCRC );
|
||||
void Mod_FreeUnused( void );
|
||||
void Mod_LoadDetailTextures( model_t *mod );
|
||||
|
||||
//
|
||||
// mod_alias.c
|
||||
|
||||
@@ -40,17 +40,6 @@ void Platform_MessageBox( const char *title, const char *message, qboolean paren
|
||||
void Platform_SetStatus( const char *status );
|
||||
qboolean Platform_DebuggerPresent( void );
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ORIENTATION_UNKNOWN = 0,
|
||||
ORIENTATION_LANDSCAPE,
|
||||
ORIENTATION_LANDSCAPE_FLIPPED,
|
||||
ORIENTATION_PORTRAIT,
|
||||
ORIENTATION_PORTRAIT_FLIPPED
|
||||
} platform_orientation_t;
|
||||
|
||||
platform_orientation_t Platform_GetDisplayOrientation( void );
|
||||
|
||||
// legacy iOS port functions
|
||||
#if XASH_IOS
|
||||
int IOS_GetArgs( char ***argv );
|
||||
@@ -75,7 +64,6 @@ char *Posix_Input( void );
|
||||
void SDLash_Init( void );
|
||||
void SDLash_Shutdown( void );
|
||||
void SDLash_NanoSleep( int nsec );
|
||||
qboolean SDLash_GyroIsAvailable( void );
|
||||
#endif
|
||||
|
||||
#if XASH_ANDROID
|
||||
|
||||
@@ -368,11 +368,6 @@ static void SDLash_EventHandler( SDL_Event *event )
|
||||
#endif
|
||||
SDLash_HandleGameControllerEvent( event );
|
||||
break;
|
||||
#if SDL_VERSION_ATLEAST( 2, 0, 14 )
|
||||
case SDL_SENSORUPDATE:
|
||||
SDLash_SensorUpdate( event->sensor );
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SDL_WINDOWEVENT:
|
||||
if( event->window.windowID != SDL_GetWindowID( host.hWnd ) )
|
||||
|
||||
@@ -35,15 +35,5 @@ void SDLash_FreeCursors( void );
|
||||
//
|
||||
void SDLash_HandleGameControllerEvent( SDL_Event *ev );
|
||||
|
||||
//
|
||||
// sensor_sdl2.c
|
||||
//
|
||||
void SDLash_InitSensors( void );
|
||||
void SDLash_ShutdownSensors( void );
|
||||
qboolean SDLash_GyroIsAvailable( void );
|
||||
#if SDL_VERSION_ATLEAST( 2, 0, 14 )
|
||||
void SDLash_SensorUpdate( SDL_SensorEvent sensor );
|
||||
#endif
|
||||
|
||||
#endif // XASH_SDL
|
||||
#endif // KEYWRAPPER_H
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
/*
|
||||
sensor_sdl2.c - SDL2 sensor handling
|
||||
Copyright (C) 2026 Xash3D FWGS contributors
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <SDL.h>
|
||||
#include "common.h"
|
||||
#include "input.h"
|
||||
#include "platform_sdl2.h"
|
||||
|
||||
#if SDL_VERSION_ATLEAST( 2, 0, 14 )
|
||||
static SDL_SensorID g_system_gyro_id = -1;
|
||||
static SDL_Sensor *g_system_gyro;
|
||||
|
||||
/*
|
||||
==============
|
||||
SDLash_InitSensors
|
||||
|
||||
==============
|
||||
*/
|
||||
void SDLash_InitSensors( void )
|
||||
{
|
||||
if( SDL_InitSubSystem( SDL_INIT_SENSOR ) == 0 )
|
||||
{
|
||||
int num_sensors = SDL_NumSensors();
|
||||
|
||||
for( int i = 0; i < num_sensors; i++ )
|
||||
{
|
||||
if( SDL_SensorGetDeviceType( i ) == SDL_SENSOR_GYRO )
|
||||
{
|
||||
g_system_gyro = SDL_SensorOpen( i );
|
||||
if( g_system_gyro )
|
||||
{
|
||||
g_system_gyro_id = SDL_SensorGetInstanceID( g_system_gyro );
|
||||
Con_Printf( "SDL: Opened built-in gyroscope: %s\n", SDL_SensorGetName( g_system_gyro ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Con_Reportf( S_ERROR "Failed to init SDL Sensor subsystem: %s\n", SDL_GetError() );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
SDLash_ShutdownSensors
|
||||
|
||||
==============
|
||||
*/
|
||||
void SDLash_ShutdownSensors( void )
|
||||
{
|
||||
if( g_system_gyro )
|
||||
{
|
||||
SDL_SensorClose( g_system_gyro );
|
||||
g_system_gyro = NULL;
|
||||
g_system_gyro_id = -1;
|
||||
}
|
||||
|
||||
SDL_QuitSubSystem( SDL_INIT_SENSOR );
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
SDLash_GyroIsAvailable
|
||||
|
||||
==============
|
||||
*/
|
||||
qboolean SDLash_GyroIsAvailable( void )
|
||||
{
|
||||
return ( g_system_gyro != NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
==============
|
||||
SDLash_SensorUpdate
|
||||
|
||||
==============
|
||||
*/
|
||||
void SDLash_SensorUpdate( SDL_SensorEvent sensor )
|
||||
{
|
||||
if( sensor.which == g_system_gyro_id )
|
||||
{
|
||||
IN_GyroEvent( sensor.data );
|
||||
}
|
||||
}
|
||||
#else
|
||||
void SDLash_InitSensors( void ) { }
|
||||
void SDLash_ShutdownSensors( void ) { }
|
||||
qboolean SDLash_GyroIsAvailable( void ) { return false; }
|
||||
#endif
|
||||
@@ -146,12 +146,10 @@ void SDLash_Init( void )
|
||||
SDL_StopTextInput();
|
||||
|
||||
SDLash_InitCursors();
|
||||
SDLash_InitSensors();
|
||||
}
|
||||
|
||||
void SDLash_Shutdown( void )
|
||||
{
|
||||
SDLash_ShutdownSensors();
|
||||
SDLash_FreeCursors();
|
||||
|
||||
SDL_Quit();
|
||||
|
||||
@@ -1204,29 +1204,3 @@ void VID_Info_f( void )
|
||||
else
|
||||
Con_Printf( "Window display mode: " S_RED "fail: " S_DEFAULT "%s\n", SDL_GetError( ));
|
||||
}
|
||||
|
||||
platform_orientation_t Platform_GetDisplayOrientation( void )
|
||||
{
|
||||
if( host.hWnd )
|
||||
{
|
||||
int display_index = SDL_GetWindowDisplayIndex( host.hWnd );
|
||||
if( display_index >= 0 )
|
||||
{
|
||||
switch( SDL_GetDisplayOrientation( display_index ) )
|
||||
{
|
||||
case SDL_ORIENTATION_LANDSCAPE:
|
||||
return ORIENTATION_LANDSCAPE;
|
||||
case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
|
||||
return ORIENTATION_LANDSCAPE_FLIPPED;
|
||||
case SDL_ORIENTATION_PORTRAIT:
|
||||
return ORIENTATION_PORTRAIT;
|
||||
case SDL_ORIENTATION_PORTRAIT_FLIPPED:
|
||||
return ORIENTATION_PORTRAIT_FLIPPED;
|
||||
default:
|
||||
return ORIENTATION_UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ORIENTATION_UNKNOWN;
|
||||
}
|
||||
|
||||
@@ -64,15 +64,7 @@ GNU General Public License for more details.
|
||||
// 13. Removed ignore_flags argument from GetCvarPointer
|
||||
// 14. Removed reserved functions, they are leftover from RenderAPI
|
||||
// Removed CL_AddCustomBeam, it's now handled through R_AddEntity
|
||||
// 15. Replaced CL_InitStudioAPI with R_StudioFillAPI + R_StudioSetDrawInterface
|
||||
// Engine now builds engine_studio_api_t and handles client DLL negotiation
|
||||
// Replaced R_DrawStretchRaw and AVI_UploadRawFrame with GL_UpdateTexture
|
||||
// Added GL_CreateTexture, R_GetDetailScaleForTexture, R_SetDetailScaleForTexture
|
||||
// Removed R_Flush, VGUI_UploadTextureBlock, R_BeamCull, pfnGetStudioModelInterface
|
||||
// Moved RenderAPI and TriAPI filling to renderer via R_FillRenderAPI and R_FillTriAPI
|
||||
// Moved detail textures parsing and cinematic texture management to engine
|
||||
// Moved creation of default textures to the engine
|
||||
#define REF_API_VERSION 15
|
||||
#define REF_API_VERSION 14
|
||||
|
||||
#define TF_SKY (TF_SKYSIDE|TF_NOMIPMAP|TF_ALLOW_NEAREST)
|
||||
#define TF_FONT (TF_NOMIPMAP|TF_CLAMP|TF_ALLOW_NEAREST)
|
||||
@@ -231,7 +223,7 @@ enum ref_defaultsprite_e
|
||||
};
|
||||
|
||||
// the order of first three is important!
|
||||
// so you can use this value in IEngineStudio.StudioIsHardware (but shouldn't)
|
||||
// so you can use this value in IEngineStudio.StudioIsHardware
|
||||
typedef enum ref_graphic_apis_e
|
||||
{
|
||||
REF_SOFTWARE, // hypothetical: just make a surface to draw on, in software
|
||||
@@ -397,7 +389,7 @@ typedef struct ref_api_s
|
||||
// brushes
|
||||
int (*Mod_SampleSizeForFace)( const struct msurface_s *surf );
|
||||
qboolean (*Mod_BoxVisible)( const vec3_t mins, const vec3_t maxs, const byte *visbits );
|
||||
mleaf_t *(*Mod_PointInLeaf)( const vec3_t p, mnode_t *node, struct model_s *mod );
|
||||
mleaf_t *(*Mod_PointInLeaf)( const vec3_t p, mnode_t *node );
|
||||
void (*R_DrawWorldHull)( void );
|
||||
void (*R_DrawModelHull)( model_t *mod );
|
||||
|
||||
@@ -439,6 +431,7 @@ typedef struct ref_api_s
|
||||
void *(*Mod_CacheCheck)( struct cache_user_s *c );
|
||||
void (*Mod_LoadCacheFile)( const char *path, struct cache_user_s *cu );
|
||||
void *(*Mod_Calloc)( int number, size_t size );
|
||||
int (*pfnGetStudioModelInterface)( int version, struct r_studio_interface_s **ppinterface, struct engine_studio_api_s *pstudio );
|
||||
|
||||
// memory
|
||||
poolhandle_t (*_Mem_AllocPool)( const char *name, const char *filename, int fileline )
|
||||
@@ -546,6 +539,8 @@ typedef struct ref_interface_s
|
||||
|
||||
qboolean (*R_AddEntity)( struct cl_entity_s *clent, int type );
|
||||
void (*R_ProcessEntData)( qboolean allocate, cl_entity_t *entities, unsigned int max_entities );
|
||||
void (*R_Flush)( unsigned int flush_flags );
|
||||
|
||||
// debug
|
||||
void (*R_ShowTextures)( void );
|
||||
|
||||
@@ -557,6 +552,7 @@ typedef struct ref_interface_s
|
||||
|
||||
// 2D
|
||||
void (*R_Set2DMode)( qboolean enable );
|
||||
void (*R_DrawStretchRaw)( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty );
|
||||
void (*R_DrawStretchPic)( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum );
|
||||
void (*FillRGBA)( int rendermode, float x, float y, float w, float h, byte r, byte g, byte b, byte a ); // in screen space
|
||||
int (*WorldToScreen)( const vec3_t world, vec3_t screen ); // Returns 1 if it's z clipped
|
||||
@@ -578,8 +574,7 @@ typedef struct ref_interface_s
|
||||
// studio interface
|
||||
float (*R_StudioEstimateFrame)( cl_entity_t *e, mstudioseqdesc_t *pseqdesc, double time );
|
||||
void (*R_StudioLerpMovement)( cl_entity_t *e, double time, vec3_t origin, vec3_t angles );
|
||||
qboolean (*R_StudioFillAPI)( struct engine_studio_api_s *api, struct r_studio_interface_s *pDefaultDraw );
|
||||
void (*R_StudioSetDrawInterface)( struct r_studio_interface_s *pDraw );
|
||||
void (*CL_InitStudioAPI)( void );
|
||||
|
||||
// bmodel
|
||||
void (*R_SetSkyCloudsTextures)( int solidskyTexture, int alphaskyTexture );
|
||||
@@ -596,27 +591,53 @@ typedef struct ref_interface_s
|
||||
void (*CL_DrawParticles)( double frametime, particle_t *particles, float partsize );
|
||||
void (*CL_DrawTracers)( double frametime, particle_t *tracers );
|
||||
void (*CL_DrawBeams)( int fTrans , BEAM *beams );
|
||||
qboolean (*R_BeamCull)( const vec3_t start, const vec3_t end, qboolean pvsOnly );
|
||||
|
||||
// Xash3D Render Interface
|
||||
// Get renderer info (doesn't changes engine state at all)
|
||||
int (*RefGetParm)( int parm, int arg ); // generic
|
||||
void (*GetDetailScaleForTexture)( int texture, float *xScale, float *yScale );
|
||||
void (*GetExtraParmsForTexture)( int texture, byte *red, byte *green, byte *blue, byte *alpha );
|
||||
float (*GetFrameTime)( void );
|
||||
|
||||
// detail texture scale
|
||||
void (*R_GetDetailScaleForTexture)( int texture, float *xScale, float *yScale );
|
||||
void (*R_SetDetailScaleForTexture)( int texture, float xScale, float yScale );
|
||||
// Set renderer info (tell engine about changes)
|
||||
void (*R_SetCurrentEntity)( struct cl_entity_s *ent ); // tell engine about both currententity and currentmodel
|
||||
void (*R_SetCurrentModel)( struct model_s *mod ); // change currentmodel but leave currententity unchanged
|
||||
|
||||
// Texture tools (used by engine directly)
|
||||
int (*GL_CreateTexture)( const char *name, int width, int height, const void *buffer, texFlags_t flags );
|
||||
// Texture tools
|
||||
int (*GL_FindTexture)( const char *name );
|
||||
const char* (*GL_TextureName)( unsigned int texnum );
|
||||
const byte* (*GL_TextureData)( unsigned int texnum ); // may be NULL
|
||||
int (*GL_LoadTexture)( const char *name, const byte *buf, size_t size, int flags );
|
||||
int (*GL_CreateTexture)( const char *name, int width, int height, const void *buffer, texFlags_t flags );
|
||||
int (*GL_LoadTextureArray)( const char **names, int flags );
|
||||
int (*GL_CreateTextureArray)( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags );
|
||||
void (*GL_FreeTexture)( unsigned int texnum );
|
||||
void (*R_OverrideTextureSourceSize)( unsigned int texnum, unsigned int srcWidth, unsigned int srcHeight ); // used to override decal size for texture replacement
|
||||
|
||||
void (*GL_UpdateTexture)( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt );
|
||||
// Decals manipulating (draw & remove)
|
||||
void (*DrawSingleDecal)( struct decal_s *pDecal, struct msurface_s *fa );
|
||||
float *(*R_DecalSetupVerts)( struct decal_s *pDecal, struct msurface_s *surf, int texture, int *outCount );
|
||||
void (*R_EntityRemoveDecals)( struct model_s *mod ); // remove all the decals from specified entity (BSP only)
|
||||
|
||||
// glState related calls (used by engine directly)
|
||||
// AVI
|
||||
void (*AVI_UploadRawFrame)( int texture, int cols, int rows, int width, int height, const byte *data );
|
||||
|
||||
// glState related calls (must use this instead of normal gl-calls to prevent de-synchornize local states between engine and the client)
|
||||
void (*GL_Bind)( int tmu, unsigned int texnum );
|
||||
void (*GL_SelectTexture)( int tmu );
|
||||
void (*GL_LoadTextureMatrix)( const float *glmatrix );
|
||||
void (*GL_TexMatrixIdentity)( void );
|
||||
void (*GL_CleanUpTextureUnits)( int last ); // pass 0 for clear all the texture units
|
||||
void (*GL_TexGen)( unsigned int coord, unsigned int mode );
|
||||
void (*GL_TextureTarget)( unsigned int target ); // change texture unit mode without bind texture
|
||||
void (*GL_TexCoordArrayMode)( unsigned int texmode );
|
||||
void (*GL_UpdateTexSize)( int texnum, int width, int height, int depth ); // recalc statistics
|
||||
|
||||
// Misc renderer functions
|
||||
void (*GL_DrawParticles)( const struct ref_viewpass_s *rvp, qboolean trans_pass, float frametime );
|
||||
colorVec (*LightVec)( const float *start, const float *end, float *lightspot, float *lightvec );
|
||||
struct mstudiotex_s *( *StudioGetTexture )( struct cl_entity_s *e );
|
||||
|
||||
// passed through R_RenderFrame (0 - use engine renderer, 1 - use custom client renderer)
|
||||
void (*GL_RenderFrame)( const struct ref_viewpass_s *rvp );
|
||||
@@ -630,23 +651,28 @@ typedef struct ref_interface_s
|
||||
void (*R_NewMap)( void );
|
||||
// clear the render entities before each frame
|
||||
void (*R_ClearScene)( void );
|
||||
// GL_GetProcAddress for client renderer
|
||||
void* (*R_GetProcAddress)( const char *name );
|
||||
|
||||
// TriAPI Interface (functions used by engine wrappers)
|
||||
// TriAPI Interface
|
||||
// NOTE: implementation isn't required to be compatible
|
||||
void (*TriRenderMode)( int mode );
|
||||
void (*Begin)( int primitiveCode );
|
||||
void (*End)( void );
|
||||
void (*Color4f)( float r, float g, float b, float a ); // real glColor4f
|
||||
void (*Color4ub)( unsigned char r, unsigned char g, unsigned char b, unsigned char a ); // real glColor4ub
|
||||
void (*TexCoord2f)( float u, float v );
|
||||
void (*Vertex3fv)( const float *worldPnt );
|
||||
void (*Vertex3f)( float x, float y, float z );
|
||||
void (*Fog)( float flFogColor[3], float flStart, float flEnd, int bOn ); //Works just like GL_FOG, flFogColor is r/g/b.
|
||||
void (*ScreenToWorld)( const float *screen, float *world );
|
||||
void (*GetMatrix)( const int pname, float *matrix );
|
||||
void (*FogParams)( float flDensity, int iFogSkybox );
|
||||
void (*CullFace)( TRICULLSTYLE mode );
|
||||
|
||||
// fill render_api_t and triangleapi_t with renderer-specific functions
|
||||
void (*R_FillRenderAPI)( struct render_api_s *api );
|
||||
void (*R_FillTriAPI)( struct triangleapi_s *api );
|
||||
|
||||
// vgui drawing implementation
|
||||
void (*VGUI_SetupDrawing)( qboolean rect );
|
||||
void (*VGUI_UploadTextureBlock)( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight );
|
||||
} ref_interface_t;
|
||||
|
||||
typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t* engfuncs, ref_globals_t *pGlobals );
|
||||
|
||||
@@ -81,7 +81,6 @@ void R_PushDlightsForBmodel( model_t *model, int framecount, const matrix4x4 obj
|
||||
int R_PushDlights( model_t *model, int framecount );
|
||||
colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t lvec );
|
||||
colorVec R_LightPoint( const vec3_t p0 );
|
||||
void R_GatherPlayerLight( cl_entity_t *view );
|
||||
void R_UpdateSurfaceCachedLight( msurface_t *surf );
|
||||
|
||||
//
|
||||
|
||||
@@ -475,20 +475,6 @@ colorVec R_LightPoint( const vec3_t p0 )
|
||||
return R_LightVec( p0, p1, NULL, NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_GatherPlayerLight
|
||||
|
||||
get light level of an entity and set it as player's light level
|
||||
=================
|
||||
*/
|
||||
void R_GatherPlayerLight( cl_entity_t *view )
|
||||
{
|
||||
colorVec c = R_LightPoint( view->origin );
|
||||
|
||||
gEngfuncs.SetLocalLightLevel(( c.r + c.g + c.b ) / 3 );
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
R_SetCacheState
|
||||
|
||||
@@ -114,7 +114,7 @@ R_BeamCull
|
||||
Cull the beam by bbox
|
||||
==============
|
||||
*/
|
||||
static qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly )
|
||||
qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly )
|
||||
{
|
||||
vec3_t mins, maxs;
|
||||
int i;
|
||||
|
||||
@@ -244,14 +244,6 @@ static void R_GetDetailScaleForTexture( int texture, float *xScale, float *yScal
|
||||
if( yScale ) *yScale = glt->yscale;
|
||||
}
|
||||
|
||||
static void R_SetDetailScaleForTexture( int texture, float xScale, float yScale )
|
||||
{
|
||||
gl_texture_t *glt = R_GetTexture( texture );
|
||||
|
||||
glt->xscale = xScale;
|
||||
glt->yscale = yScale;
|
||||
}
|
||||
|
||||
static void R_GetExtraParmsForTexture( int texture, byte *red, byte *green, byte *blue, byte *density )
|
||||
{
|
||||
gl_texture_t *glt = R_GetTexture( texture );
|
||||
@@ -319,6 +311,11 @@ static void R_ProcessEntData( qboolean allocate, cl_entity_t *entities, unsigned
|
||||
gEngfuncs.drawFuncs->R_ProcessEntData( allocate );
|
||||
}
|
||||
|
||||
static void GAME_EXPORT R_Flush( unsigned int flags )
|
||||
{
|
||||
// stub
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
R_SetSkyCloudsTextures
|
||||
@@ -372,6 +369,11 @@ static qboolean R_SetDisplayTransform( ref_screen_rotation_t rotate, int offset_
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void GAME_EXPORT VGUI_UploadTextureBlock( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight )
|
||||
{
|
||||
pglTexSubImage2D( GL_TEXTURE_2D, 0, drawX, drawY, blockWidth, blockHeight, GL_RGBA, GL_UNSIGNED_BYTE, rgba );
|
||||
}
|
||||
|
||||
static void GAME_EXPORT VGUI_SetupDrawing( qboolean rect )
|
||||
{
|
||||
pglEnable( GL_BLEND );
|
||||
@@ -411,85 +413,6 @@ static const char *R_GetConfigName( void )
|
||||
return "opengl";
|
||||
}
|
||||
|
||||
static void R_NewMap( void )
|
||||
{
|
||||
texture_t *tx;
|
||||
int i;
|
||||
|
||||
tr.worldmodel = gp_cl->models[1];
|
||||
|
||||
R_ClearDecals(); // clear all level decals
|
||||
|
||||
R_StudioResetPlayerModels();
|
||||
|
||||
// clear out efrags in case the level hasn't been reloaded
|
||||
for( i = 0; i < WORLDMODEL->numleafs; i++ )
|
||||
WORLDMODEL->leafs[i+1].efrags = NULL;
|
||||
|
||||
glState.isFogEnabled = false;
|
||||
tr.skytexturenum = -1;
|
||||
pglDisable( GL_FOG );
|
||||
|
||||
// clearing texture chains
|
||||
for( i = 0; i < WORLDMODEL->numtextures; i++ )
|
||||
{
|
||||
if( !WORLDMODEL->textures[i] )
|
||||
continue;
|
||||
|
||||
tx = WORLDMODEL->textures[i];
|
||||
|
||||
if( !Q_strncmp( tx->name, "sky", 3 ) && tx->width == ( tx->height * 2 ))
|
||||
tr.skytexturenum = i;
|
||||
|
||||
tx->texturechain = NULL;
|
||||
}
|
||||
|
||||
GL_BuildLightmaps ();
|
||||
|
||||
R_ClearVBO();
|
||||
if( R_HasEnabledVBO( ))
|
||||
R_GenerateVBO();
|
||||
R_ResetRipples();
|
||||
|
||||
if( gEngfuncs.drawFuncs->R_NewMap != NULL )
|
||||
gEngfuncs.drawFuncs->R_NewMap();
|
||||
}
|
||||
|
||||
static void R_FillRenderAPI( render_api_t *api )
|
||||
{
|
||||
api->GetExtraParmsForTexture = R_GetExtraParmsForTexture;
|
||||
api->GetFrameTime = R_GetFrameTime;
|
||||
api->R_SetCurrentEntity = R_SetCurrentEntity;
|
||||
api->R_SetCurrentModel = R_SetCurrentModel;
|
||||
api->GL_CreateTexture = GL_CreateTexture;
|
||||
api->GL_LoadTextureArray = GL_LoadTextureArray;
|
||||
api->GL_CreateTextureArray = GL_CreateTextureArray;
|
||||
api->DrawSingleDecal = DrawSingleDecal;
|
||||
api->R_DecalSetupVerts = R_DecalSetupVerts;
|
||||
api->R_EntityRemoveDecals = R_EntityRemoveDecals;
|
||||
api->GL_SelectTexture = GL_SelectTexture;
|
||||
api->GL_LoadTextureMatrix = GL_LoadTexMatrixExt;
|
||||
api->GL_TexMatrixIdentity = GL_LoadIdentityTexMatrix;
|
||||
api->GL_CleanUpTextureUnits = GL_CleanUpTextureUnits;
|
||||
api->GL_TexGen = GL_TexGen;
|
||||
api->GL_TextureTarget = GL_TextureTarget;
|
||||
api->GL_TexCoordArrayMode = GL_SetTexCoordArrayMode;
|
||||
api->GL_UpdateTexSize = GL_UpdateTexSize;
|
||||
api->GL_DrawParticles = CL_DrawParticlesExternal;
|
||||
api->LightVec = R_LightVec;
|
||||
api->StudioGetTexture = R_StudioGetTexture;
|
||||
api->GL_GetProcAddress = R_GetProcAddress;
|
||||
}
|
||||
|
||||
static void R_FillTriAPI( triangleapi_t *api )
|
||||
{
|
||||
api->TexCoord2f = TriTexCoord2f;
|
||||
api->Fog = TriFog;
|
||||
api->ScreenToWorld = R_ScreenToWorld;
|
||||
api->GetMatrix = TriGetMatrix;
|
||||
api->FogParams = TriFogParams;
|
||||
}
|
||||
|
||||
const ref_interface_t gReffuncs =
|
||||
{
|
||||
R_Init,
|
||||
@@ -516,6 +439,7 @@ const ref_interface_t gReffuncs =
|
||||
|
||||
R_AddEntity,
|
||||
R_ProcessEntData,
|
||||
R_Flush,
|
||||
|
||||
R_ShowTextures,
|
||||
|
||||
@@ -525,6 +449,7 @@ const ref_interface_t gReffuncs =
|
||||
R_SetupSky,
|
||||
|
||||
R_Set2DMode,
|
||||
R_DrawStretchRaw,
|
||||
R_DrawStretchPic,
|
||||
CL_FillRGBA,
|
||||
R_WorldToScreen,
|
||||
@@ -541,8 +466,7 @@ const ref_interface_t gReffuncs =
|
||||
|
||||
R_StudioEstimateFrame,
|
||||
R_StudioLerpMovement,
|
||||
R_StudioFillAPI,
|
||||
R_StudioSetDrawInterface,
|
||||
CL_InitStudioAPI,
|
||||
|
||||
R_SetSkyCloudsTextures,
|
||||
GL_SubdivideSurface,
|
||||
@@ -555,23 +479,45 @@ const ref_interface_t gReffuncs =
|
||||
CL_DrawParticles,
|
||||
CL_DrawTracers,
|
||||
CL_DrawBeams,
|
||||
R_BeamCull,
|
||||
|
||||
GL_RefGetParm,
|
||||
|
||||
R_GetDetailScaleForTexture,
|
||||
R_SetDetailScaleForTexture,
|
||||
R_GetExtraParmsForTexture,
|
||||
R_GetFrameTime,
|
||||
|
||||
R_SetCurrentEntity,
|
||||
R_SetCurrentModel,
|
||||
|
||||
GL_CreateTexture,
|
||||
GL_FindTexture,
|
||||
GL_TextureName,
|
||||
GL_TextureData,
|
||||
GL_LoadTexture,
|
||||
GL_CreateTexture,
|
||||
GL_LoadTextureArray,
|
||||
GL_CreateTextureArray,
|
||||
GL_FreeTexture,
|
||||
R_OverrideTextureSourceSize,
|
||||
|
||||
GL_UpdateTexture,
|
||||
DrawSingleDecal,
|
||||
R_DecalSetupVerts,
|
||||
R_EntityRemoveDecals,
|
||||
|
||||
R_UploadStretchRaw,
|
||||
|
||||
GL_Bind,
|
||||
GL_SelectTexture,
|
||||
GL_LoadTexMatrixExt,
|
||||
GL_LoadIdentityTexMatrix,
|
||||
GL_CleanUpTextureUnits,
|
||||
GL_TexGen,
|
||||
GL_TextureTarget,
|
||||
GL_SetTexCoordArrayMode,
|
||||
GL_UpdateTexSize,
|
||||
|
||||
CL_DrawParticlesExternal,
|
||||
R_LightVec,
|
||||
R_StudioGetTexture,
|
||||
|
||||
R_RenderFrame,
|
||||
Mod_SetOrthoBounds,
|
||||
@@ -579,19 +525,23 @@ const ref_interface_t gReffuncs =
|
||||
Mod_GetCurrentVis,
|
||||
R_NewMap,
|
||||
R_ClearScene,
|
||||
R_GetProcAddress,
|
||||
|
||||
TriRenderMode,
|
||||
TriBegin,
|
||||
TriEnd,
|
||||
_TriColor4f,
|
||||
_TriColor4ub,
|
||||
TriTexCoord2f,
|
||||
TriVertex3fv,
|
||||
TriVertex3f,
|
||||
TriFog,
|
||||
R_ScreenToWorld,
|
||||
TriGetMatrix,
|
||||
TriFogParams,
|
||||
TriCullFace,
|
||||
|
||||
R_FillRenderAPI,
|
||||
R_FillTriAPI,
|
||||
|
||||
VGUI_SetupDrawing,
|
||||
VGUI_UploadTextureBlock,
|
||||
};
|
||||
|
||||
|
||||
127
ref/gl/gl_draw.c
127
ref/gl/gl_draw.c
@@ -55,69 +55,120 @@ void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, f
|
||||
|
||||
/*
|
||||
=============
|
||||
GL_UpdateTexture
|
||||
R_DrawStretchRaw
|
||||
=============
|
||||
*/
|
||||
void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt )
|
||||
void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty )
|
||||
{
|
||||
byte *raw = NULL;
|
||||
gl_texture_t *tex;
|
||||
GLenum gl_format;
|
||||
|
||||
switch( fmt )
|
||||
{
|
||||
case PF_RGBA_32:
|
||||
gl_format = GL_RGBA;
|
||||
break;
|
||||
case PF_BGRA_32:
|
||||
gl_format = GL_BGRA;
|
||||
break;
|
||||
case PF_RGB_24:
|
||||
gl_format = GL_RGB;
|
||||
break;
|
||||
case PF_BGR_24:
|
||||
gl_format = GL_BGR;
|
||||
break;
|
||||
case PF_LUMINANCE:
|
||||
gl_format = GL_LUMINANCE;
|
||||
break;
|
||||
default:
|
||||
gEngfuncs.Con_DPrintf( S_ERROR "%s: unsupported pixel format %i\n", __func__, fmt );
|
||||
return;
|
||||
}
|
||||
|
||||
if( !GL_Support( GL_ARB_TEXTURE_NPOT_EXT ))
|
||||
{
|
||||
width = NearestPOW( width, true );
|
||||
height = NearestPOW( height, false );
|
||||
}
|
||||
int width = 1, height = 1;
|
||||
|
||||
if( cols != width || rows != height )
|
||||
{
|
||||
raw = GL_ResampleTexture( buffer, cols, rows, width, height, false );
|
||||
cols = width;
|
||||
rows = height;
|
||||
// check the dimensions
|
||||
width = NearestPOW( cols, true );
|
||||
height = NearestPOW( rows, false );
|
||||
|
||||
if( cols != width || rows != height )
|
||||
{
|
||||
raw = GL_ResampleTexture( data, cols, rows, width, height, false );
|
||||
cols = width;
|
||||
rows = height;
|
||||
}
|
||||
}
|
||||
else
|
||||
raw = (byte *)buffer;
|
||||
{
|
||||
raw = (byte *)data;
|
||||
}
|
||||
|
||||
if( cols > glConfig.max_2d_texture_size )
|
||||
gEngfuncs.Host_Error( "%s: size %i exceeds hardware limits\n", __func__, cols );
|
||||
if( rows > glConfig.max_2d_texture_size )
|
||||
gEngfuncs.Host_Error( "%s: size %i exceeds hardware limits\n", __func__, rows );
|
||||
|
||||
tex = R_GetTexture( texnum );
|
||||
GL_Bind( GL_KEEP_UNIT, texnum );
|
||||
pglDisable( GL_BLEND );
|
||||
pglDisable( GL_ALPHA_TEST );
|
||||
pglTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
|
||||
|
||||
tex = R_GetTexture( tr.cinTexture );
|
||||
GL_Bind( XASH_TEXTURE0, tr.cinTexture );
|
||||
|
||||
if( cols == tex->width && rows == tex->height )
|
||||
pglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, gl_format, GL_UNSIGNED_BYTE, raw );
|
||||
{
|
||||
if( dirty )
|
||||
{
|
||||
pglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_BGRA, GL_UNSIGNED_BYTE, raw );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tex->size = cols * rows * 4;
|
||||
tex->width = cols;
|
||||
tex->height = rows;
|
||||
pglTexImage2D( GL_TEXTURE_2D, 0, tex->format, cols, rows, 0, gl_format, GL_UNSIGNED_BYTE, raw );
|
||||
if( dirty )
|
||||
{
|
||||
pglTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, raw );
|
||||
}
|
||||
}
|
||||
|
||||
pglBegin( GL_QUADS );
|
||||
pglTexCoord2f( 0, 0 );
|
||||
pglVertex2f( x, y );
|
||||
pglTexCoord2f( 1, 0 );
|
||||
pglVertex2f( x + w, y );
|
||||
pglTexCoord2f( 1, 1 );
|
||||
pglVertex2f( x + w, y + h );
|
||||
pglTexCoord2f( 0, 1 );
|
||||
pglVertex2f( x, y + h );
|
||||
pglEnd();
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
R_UploadStretchRaw
|
||||
=============
|
||||
*/
|
||||
void R_UploadStretchRaw( int texture, int cols, int rows, int width, int height, const byte *data )
|
||||
{
|
||||
byte *raw = NULL;
|
||||
gl_texture_t *tex;
|
||||
|
||||
if( !GL_Support( GL_ARB_TEXTURE_NPOT_EXT ))
|
||||
{
|
||||
// check the dimensions
|
||||
width = NearestPOW( width, true );
|
||||
height = NearestPOW( height, false );
|
||||
}
|
||||
else
|
||||
{
|
||||
width = bound( 128, width, glConfig.max_2d_texture_size );
|
||||
height = bound( 128, height, glConfig.max_2d_texture_size );
|
||||
}
|
||||
|
||||
if( cols != width || rows != height )
|
||||
{
|
||||
raw = GL_ResampleTexture( data, cols, rows, width, height, false );
|
||||
cols = width;
|
||||
rows = height;
|
||||
}
|
||||
else
|
||||
{
|
||||
raw = (byte *)data;
|
||||
}
|
||||
|
||||
if( cols > glConfig.max_2d_texture_size )
|
||||
gEngfuncs.Host_Error( "%s: size %i exceeds hardware limits\n", __func__, cols );
|
||||
if( rows > glConfig.max_2d_texture_size )
|
||||
gEngfuncs.Host_Error( "%s: size %i exceeds hardware limits\n", __func__, rows );
|
||||
|
||||
tex = R_GetTexture( texture );
|
||||
GL_Bind( GL_KEEP_UNIT, texture );
|
||||
tex->width = cols;
|
||||
tex->height = rows;
|
||||
|
||||
pglTexImage2D( GL_TEXTURE_2D, 0, tex->format, cols, rows, 0, GL_BGRA, GL_UNSIGNED_BYTE, raw );
|
||||
GL_ApplyTextureParams( tex );
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,19 @@ static gl_texture_t gl_textures[MAX_TEXTURES];
|
||||
static gl_texture_t* gl_texturesHashTable[TEXTURES_HASH_SIZE];
|
||||
static uint gl_numTextures;
|
||||
|
||||
static byte dottexture[8][8] =
|
||||
{
|
||||
{0,1,1,0,0,0,0,0},
|
||||
{1,1,1,1,0,0,0,0},
|
||||
{1,1,1,1,0,0,0,0},
|
||||
{0,1,1,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0},
|
||||
};
|
||||
|
||||
|
||||
#define IsLightMap( tex ) ( FBitSet(( tex )->flags, TF_ATLAS_PAGE ))
|
||||
/*
|
||||
=================
|
||||
@@ -1686,20 +1699,7 @@ int GL_CreateTexture( const char *name, int width, int height, const void *buffe
|
||||
r_empty.size *= 6;
|
||||
}
|
||||
|
||||
int texnum = GL_LoadTextureFromBuffer( name, &r_empty, flags, update );
|
||||
|
||||
if( !Q_strcmp( name, REF_DEFAULT_TEXTURE ))
|
||||
tr.defaultTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_PARTICLE_TEXTURE ))
|
||||
tr.particleTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_WHITE_TEXTURE ))
|
||||
tr.whiteTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_GRAY_TEXTURE ))
|
||||
tr.grayTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_BLACK_TEXTURE ))
|
||||
tr.blackTexture = texnum;
|
||||
|
||||
return texnum;
|
||||
return GL_LoadTextureFromBuffer( name, &r_empty, flags, update );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1912,6 +1912,70 @@ void R_InitDlightTexture( void )
|
||||
tr.dlightTexture = GL_LoadTextureFromBuffer( "*dlight", &r_image, TF_NOMIPMAP|TF_CLAMP|TF_ATLAS_PAGE, update );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
GL_CreateInternalTextures
|
||||
==================
|
||||
*/
|
||||
static void GL_CreateInternalTextures( void )
|
||||
{
|
||||
int dx2, dy, d;
|
||||
int x, y;
|
||||
rgbdata_t *pic;
|
||||
|
||||
// emo-texture from quake1
|
||||
pic = GL_FakeImage( 16, 16, 1, IMAGE_HAS_COLOR );
|
||||
|
||||
for( y = 0; y < 16; y++ )
|
||||
{
|
||||
for( x = 0; x < 16; x++ )
|
||||
{
|
||||
if(( y < 8 ) ^ ( x < 8 ))
|
||||
((uint *)pic->buffer)[y*16+x] = 0xFFFF00FF;
|
||||
else ((uint *)pic->buffer)[y*16+x] = 0xFF000000;
|
||||
}
|
||||
}
|
||||
|
||||
tr.defaultTexture = GL_LoadTextureInternal( REF_DEFAULT_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// particle texture from quake1
|
||||
pic = GL_FakeImage( 8, 8, 1, IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA );
|
||||
|
||||
for( x = 0; x < 8; x++ )
|
||||
{
|
||||
for( y = 0; y < 8; y++ )
|
||||
{
|
||||
if( dottexture[x][y] )
|
||||
pic->buffer[( y * 8 + x ) * 4 + 3] = 255;
|
||||
else pic->buffer[( y * 8 + x ) * 4 + 3] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
tr.particleTexture = GL_LoadTextureInternal( REF_PARTICLE_TEXTURE, pic, TF_CLAMP );
|
||||
|
||||
// white texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer)[x] = 0xFFFFFFFF;
|
||||
tr.whiteTexture = GL_LoadTextureInternal( REF_WHITE_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// gray texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer)[x] = 0xFF7F7F7F;
|
||||
tr.grayTexture = GL_LoadTextureInternal( REF_GRAY_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// black texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer)[x] = 0xFF000000;
|
||||
tr.blackTexture = GL_LoadTextureInternal( REF_BLACK_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// cinematic dummy
|
||||
pic = GL_FakeImage( 640, 100, 1, IMAGE_HAS_COLOR );
|
||||
tr.cinTexture = GL_LoadTextureInternal( "*cintexture", pic, TF_NOMIPMAP|TF_CLAMP );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_TextureList_f
|
||||
@@ -2144,6 +2208,7 @@ void R_InitImages( void )
|
||||
|
||||
// validate cvars
|
||||
R_SetTextureParameters();
|
||||
GL_CreateInternalTextures();
|
||||
|
||||
gEngfuncs.Cmd_AddCommand( "texturelist", R_TextureList_f, "display loaded textures list" );
|
||||
}
|
||||
|
||||
@@ -187,6 +187,8 @@ typedef struct
|
||||
int lightmapTextures[MAX_LIGHTMAPS];
|
||||
int dlightTexture; // custom dlight texture
|
||||
int skyboxTextures[SKYBOX_MAX_SIDES]; // skybox sides
|
||||
int cinTexture; // cinematic texture
|
||||
|
||||
int skytexturenum; // this not a gl_texturenum!
|
||||
int skyboxbasenum; // start with 5800
|
||||
|
||||
@@ -294,6 +296,7 @@ void SCR_TimeRefresh_f( void );
|
||||
// gl_beams.c
|
||||
//
|
||||
void CL_DrawBeams( int fTrans, BEAM *active_beams );
|
||||
qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly );
|
||||
|
||||
//
|
||||
// gl_cull.c
|
||||
@@ -316,7 +319,7 @@ void R_ClearDecals( void );
|
||||
// gl_draw.c
|
||||
//
|
||||
void R_Set2DMode( qboolean enable );
|
||||
void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt );
|
||||
void R_UploadStretchRaw( int texture, int cols, int rows, int width, int height, const byte *data );
|
||||
|
||||
//
|
||||
// gl_image.c
|
||||
@@ -366,6 +369,10 @@ void R_DrawFog( void );
|
||||
int CL_FxBlend( cl_entity_t *e );
|
||||
|
||||
//
|
||||
// gl_rmisc.c
|
||||
//
|
||||
void R_NewMap( void );
|
||||
|
||||
//
|
||||
// gl_rsurf.c
|
||||
//
|
||||
@@ -409,11 +416,11 @@ struct mstudiotex_s *R_StudioGetTexture( cl_entity_t *e );
|
||||
int R_GetEntityRenderMode( cl_entity_t *ent );
|
||||
void R_DrawStudioModel( cl_entity_t *e );
|
||||
player_info_t *pfnPlayerInfo( int index );
|
||||
void R_GatherPlayerLight( void );
|
||||
float R_StudioEstimateFrame( cl_entity_t *e, mstudioseqdesc_t *pseqdesc, double time );
|
||||
void R_StudioLerpMovement( cl_entity_t *e, double time, vec3_t origin, vec3_t angles );
|
||||
void R_StudioResetPlayerModels( void );
|
||||
qboolean R_StudioFillAPI( struct engine_studio_api_s *api, struct r_studio_interface_s *pDefaultDraw );
|
||||
void R_StudioSetDrawInterface( struct r_studio_interface_s *pDraw );
|
||||
void CL_InitStudioAPI( void );
|
||||
void Mod_StudioLoadTextures( model_t *mod, void *data );
|
||||
void Mod_StudioUnloadTextures( void *data );
|
||||
|
||||
@@ -456,6 +463,7 @@ void R_RenderFrame( const struct ref_viewpass_s *vp );
|
||||
void R_EndFrame( void );
|
||||
void R_ClearScene( void );
|
||||
void R_GetTextureParms( int *w, int *h, int texnum );
|
||||
void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty );
|
||||
void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum );
|
||||
qboolean R_SpeedsMessage( char *out, size_t size );
|
||||
qboolean R_CullBox( const vec3_t mins, const vec3_t maxs );
|
||||
|
||||
@@ -511,7 +511,7 @@ R_FindViewLeaf
|
||||
void R_FindViewLeaf( void )
|
||||
{
|
||||
RI.oldviewleaf = RI.viewleaf;
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes, WORLDMODEL );
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1105,7 +1105,7 @@ void R_RenderFrame( const ref_viewpass_t *rvp )
|
||||
|
||||
if( gEngfuncs.drawFuncs->GL_RenderFrame( rvp ))
|
||||
{
|
||||
R_GatherPlayerLight( tr.viewent );
|
||||
R_GatherPlayerLight();
|
||||
tr.realframecount++;
|
||||
tr.fResetVis = true;
|
||||
return;
|
||||
|
||||
161
ref/gl/gl_rmisc.c
Normal file
161
ref/gl/gl_rmisc.c
Normal file
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
gl_rmisc.c - renderer misceallaneous
|
||||
Copyright (C) 2010 Uncle Mike
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "gl_local.h"
|
||||
#include "shake.h"
|
||||
#include "screenfade.h"
|
||||
#include "cdll_int.h"
|
||||
|
||||
static void R_ParseDetailTextures( const char *filename )
|
||||
{
|
||||
byte *afile;
|
||||
char *pfile;
|
||||
string token, texname;
|
||||
string detail_texname;
|
||||
string detail_path;
|
||||
float xScale, yScale;
|
||||
texture_t *tex;
|
||||
int i;
|
||||
|
||||
afile = gEngfuncs.fsapi->LoadFile( filename, NULL, false );
|
||||
if( !afile ) return;
|
||||
|
||||
pfile = (char *)afile;
|
||||
|
||||
// format: 'texturename' 'detailtexture' 'xScale' 'yScale'
|
||||
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
|
||||
{
|
||||
texname[0] = '\0';
|
||||
detail_texname[0] = '\0';
|
||||
|
||||
// read texname
|
||||
if( token[0] == '{' )
|
||||
{
|
||||
// NOTE: COM_ParseFile handled some symbols seperately
|
||||
// this code will be fix it
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
Q_snprintf( texname, sizeof( texname ), "{%s", token );
|
||||
}
|
||||
else Q_strncpy( texname, token, sizeof( texname ));
|
||||
|
||||
// read detailtexture name
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
Q_strncpy( detail_texname, token, sizeof( detail_texname ));
|
||||
|
||||
// trying the scales or '{'
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
|
||||
// read second part of detailtexture name
|
||||
if( token[0] == '{' )
|
||||
{
|
||||
Q_strncat( detail_texname, token, sizeof( detail_texname ));
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token )); // read scales
|
||||
Q_strncat( detail_texname, token, sizeof( detail_texname ));
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token )); // parse scales
|
||||
}
|
||||
|
||||
Q_snprintf( detail_path, sizeof( detail_path ), "gfx/%s", detail_texname );
|
||||
|
||||
// read scales
|
||||
xScale = Q_atof( token );
|
||||
|
||||
pfile = COM_ParseFile( pfile, token, sizeof( token ));
|
||||
yScale = Q_atof( token );
|
||||
|
||||
if( xScale <= 0.0f || yScale <= 0.0f )
|
||||
continue;
|
||||
|
||||
// search for existing texture and uploading detail texture
|
||||
for( i = 0; i < WORLDMODEL->numtextures; i++ )
|
||||
{
|
||||
tex = WORLDMODEL->textures[i];
|
||||
|
||||
if( Q_stricmp( tex->name, texname ))
|
||||
continue;
|
||||
|
||||
tex->dt_texturenum = GL_LoadTexture( detail_path, NULL, 0, TF_FORCE_COLOR|TF_NOFLIP_TGA );
|
||||
|
||||
// texture is loaded
|
||||
if( tex->dt_texturenum )
|
||||
{
|
||||
gl_texture_t *glt;
|
||||
|
||||
glt = R_GetTexture( tex->gl_texturenum );
|
||||
glt->xscale = xScale;
|
||||
glt->yscale = yScale;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Mem_Free( afile );
|
||||
}
|
||||
|
||||
void R_NewMap( void )
|
||||
{
|
||||
texture_t *tx;
|
||||
int i;
|
||||
|
||||
tr.worldmodel = gp_cl->models[1];
|
||||
|
||||
R_ClearDecals(); // clear all level decals
|
||||
|
||||
R_StudioResetPlayerModels();
|
||||
|
||||
// upload detailtextures
|
||||
if( r_detailtextures.value )
|
||||
{
|
||||
string mapname, filepath;
|
||||
|
||||
Q_strncpy( mapname, WORLDMODEL->name, sizeof( mapname ));
|
||||
COM_StripExtension( mapname );
|
||||
Q_snprintf( filepath, sizeof( filepath ), "%s_detail.txt", mapname );
|
||||
|
||||
R_ParseDetailTextures( filepath );
|
||||
}
|
||||
|
||||
// clear out efrags in case the level hasn't been reloaded
|
||||
for( i = 0; i < WORLDMODEL->numleafs; i++ )
|
||||
WORLDMODEL->leafs[i+1].efrags = NULL;
|
||||
|
||||
glState.isFogEnabled = false;
|
||||
tr.skytexturenum = -1;
|
||||
pglDisable( GL_FOG );
|
||||
|
||||
// clearing texture chains
|
||||
for( i = 0; i < WORLDMODEL->numtextures; i++ )
|
||||
{
|
||||
if( !WORLDMODEL->textures[i] )
|
||||
continue;
|
||||
|
||||
tx = WORLDMODEL->textures[i];
|
||||
|
||||
if( !Q_strncmp( tx->name, "sky", 3 ) && tx->width == ( tx->height * 2 ))
|
||||
tr.skytexturenum = i;
|
||||
|
||||
tx->texturechain = NULL;
|
||||
}
|
||||
|
||||
GL_BuildLightmaps ();
|
||||
|
||||
R_ClearVBO();
|
||||
if( R_HasEnabledVBO( ))
|
||||
R_GenerateVBO();
|
||||
R_ResetRipples();
|
||||
|
||||
if( gEngfuncs.drawFuncs->R_NewMap != NULL )
|
||||
gEngfuncs.drawFuncs->R_NewMap();
|
||||
|
||||
}
|
||||
@@ -3770,7 +3770,7 @@ void R_MarkLeaves( void )
|
||||
else
|
||||
VectorSet( test, RI.rvp.vieworigin[0], RI.rvp.vieworigin[1], RI.rvp.vieworigin[2] + 16.0f );
|
||||
|
||||
leaf = gEngfuncs.Mod_PointInLeaf( test, WORLDMODEL->nodes, WORLDMODEL );
|
||||
leaf = gEngfuncs.Mod_PointInLeaf( test, WORLDMODEL->nodes );
|
||||
|
||||
if(( leaf->contents != CONTENTS_SOLID ) && ( RI.viewleaf != leaf ))
|
||||
force = true;
|
||||
|
||||
@@ -21,6 +21,8 @@ GNU General Public License for more details.
|
||||
|
||||
#define GLARE_FALLOFF 19000.0f
|
||||
|
||||
static float sprite_radius;
|
||||
|
||||
/*
|
||||
================
|
||||
R_GetSpriteFrameInterpolant
|
||||
@@ -210,6 +212,8 @@ static qboolean R_CullSpriteModel( cl_entity_t *e, vec3_t origin )
|
||||
VectorScale( e->model->mins, scale, sprite_mins );
|
||||
VectorScale( e->model->maxs, scale, sprite_maxs );
|
||||
|
||||
sprite_radius = RadiusFromBounds( sprite_mins, sprite_maxs );
|
||||
|
||||
VectorAdd( sprite_mins, origin, sprite_mins );
|
||||
VectorAdd( sprite_maxs, origin, sprite_maxs );
|
||||
|
||||
|
||||
@@ -375,6 +375,17 @@ player_info_t *pfnPlayerInfo( int index )
|
||||
return gEngfuncs.pfnPlayerInfo( index );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnMod_ForName
|
||||
|
||||
===============
|
||||
*/
|
||||
static model_t *pfnMod_ForName( const char *model, int crash )
|
||||
{
|
||||
return gEngfuncs.Mod_ForName( model, crash, false );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetPlayerState
|
||||
@@ -389,6 +400,17 @@ static entity_state_t *R_StudioGetPlayerState( int index )
|
||||
return gEngfuncs.pfnGetPlayerState( index );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetViewEntity
|
||||
|
||||
===============
|
||||
*/
|
||||
static cl_entity_t *pfnGetViewEntity( void )
|
||||
{
|
||||
return tr.viewent;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetEngineTimes
|
||||
@@ -416,6 +438,17 @@ static void pfnGetViewInfo( float *origin, float *upv, float *rightv, float *for
|
||||
if( upv ) VectorCopy( RI.vup, upv );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_GetChromeSprite
|
||||
|
||||
===============
|
||||
*/
|
||||
static model_t *R_GetChromeSprite( void )
|
||||
{
|
||||
return gEngfuncs.GetDefaultSprite( REF_CHROME_SPRITE );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetModelCounters
|
||||
@@ -428,6 +461,18 @@ static void pfnGetModelCounters( int **s, int **a )
|
||||
*a = &r_stats.c_studio_models_drawn;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetAliasScale
|
||||
|
||||
===============
|
||||
*/
|
||||
static void pfnGetAliasScale( float *x, float *y )
|
||||
{
|
||||
if( x ) *x = 1.0f;
|
||||
if( y ) *y = 1.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetBoneTransform
|
||||
@@ -450,6 +495,17 @@ static float ****pfnStudioGetLightTransform( void )
|
||||
return (float ****)g_studio.lighttransform;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetAliasTransform
|
||||
|
||||
===============
|
||||
*/
|
||||
static float ***pfnStudioGetAliasTransform( void )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetRotationMatrix
|
||||
@@ -2861,6 +2917,18 @@ static void R_StudioSetChromeOrigin( void )
|
||||
VectorCopy( RI.rvp.vieworigin, g_studio.chrome_origin );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnIsHardware
|
||||
|
||||
Xash3D is always works in hardware mode
|
||||
===============
|
||||
*/
|
||||
static int pfnIsHardware( void )
|
||||
{
|
||||
return 1; // 0 is Software, 1 is OpenGL, 2 is Direct3D
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_StudioDrawPointsShadow
|
||||
@@ -3097,7 +3165,7 @@ static void R_StudioRenderModel( void )
|
||||
R_StudioRenderFinal( );
|
||||
|
||||
R_StudioSetForceFaceFlags( STUDIO_NF_CHROME );
|
||||
TriSpriteTexture( gEngfuncs.GetDefaultSprite( REF_CHROME_SPRITE ), 0 );
|
||||
TriSpriteTexture( R_GetChromeSprite(), 0 );
|
||||
RI.currententity->curstate.renderfx = kRenderFxGlowShell;
|
||||
|
||||
R_StudioRenderFinal( );
|
||||
@@ -3594,6 +3662,20 @@ void R_RunViewmodelEvents( void )
|
||||
R_StudioDrawModelInternal( RI.currententity, STUDIO_EVENTS );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_GatherPlayerLight
|
||||
=================
|
||||
*/
|
||||
void R_GatherPlayerLight( void )
|
||||
{
|
||||
cl_entity_t *view = tr.viewent;
|
||||
colorVec c;
|
||||
|
||||
c = R_LightPoint( view->origin );
|
||||
gEngfuncs.SetLocalLightLevel( ( c.r + c.g + c.b ) / 3 );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_DrawViewModel
|
||||
@@ -3603,7 +3685,7 @@ void R_DrawViewModel( void )
|
||||
{
|
||||
cl_entity_t *view = tr.viewent;
|
||||
|
||||
R_GatherPlayerLight( view );
|
||||
R_GatherPlayerLight();
|
||||
|
||||
if( r_drawviewmodel->value == 0 )
|
||||
return;
|
||||
@@ -3799,53 +3881,115 @@ void Mod_StudioUnloadTextures( void *data )
|
||||
}
|
||||
}
|
||||
|
||||
qboolean R_StudioFillAPI( engine_studio_api_t *api, r_studio_interface_t *pDefaultDraw )
|
||||
static model_t *pfnModelHandle( int modelindex )
|
||||
{
|
||||
if( modelindex < 0 || modelindex >= MAX_MODELS )
|
||||
return NULL;
|
||||
return CL_ModelHandle( modelindex );
|
||||
}
|
||||
|
||||
static void *pfnMod_CacheCheck( struct cache_user_s *c )
|
||||
{
|
||||
return gEngfuncs.Mod_CacheCheck( c );
|
||||
}
|
||||
|
||||
static void *pfnMod_StudioExtradata( model_t *mod )
|
||||
{
|
||||
return gEngfuncs.Mod_Extradata( mod_studio, mod );
|
||||
}
|
||||
|
||||
static void pfnMod_LoadCacheFile( const char *path, struct cache_user_s *cu )
|
||||
{
|
||||
gEngfuncs.Mod_LoadCacheFile( path, cu );
|
||||
}
|
||||
|
||||
static cvar_t *pfnGetCvarPointer( const char *name )
|
||||
{
|
||||
return (cvar_t*)gEngfuncs.pfnGetCvarPointer( name );
|
||||
}
|
||||
|
||||
static void *pfnMod_Calloc( int number, size_t size )
|
||||
{
|
||||
return gEngfuncs.Mod_Calloc( number, size );
|
||||
}
|
||||
|
||||
static engine_studio_api_t gStudioAPI =
|
||||
{
|
||||
pfnMod_Calloc,
|
||||
pfnMod_CacheCheck,
|
||||
pfnMod_LoadCacheFile,
|
||||
pfnMod_ForName,
|
||||
pfnMod_StudioExtradata,
|
||||
pfnModelHandle,
|
||||
pfnGetCurrentEntity,
|
||||
pfnPlayerInfo,
|
||||
R_StudioGetPlayerState,
|
||||
pfnGetViewEntity,
|
||||
pfnGetEngineTimes,
|
||||
pfnGetCvarPointer,
|
||||
pfnGetViewInfo,
|
||||
R_GetChromeSprite,
|
||||
pfnGetModelCounters,
|
||||
pfnGetAliasScale,
|
||||
pfnStudioGetBoneTransform,
|
||||
pfnStudioGetLightTransform,
|
||||
pfnStudioGetAliasTransform,
|
||||
pfnStudioGetRotationMatrix,
|
||||
R_StudioSetupModel,
|
||||
R_StudioCheckBBox,
|
||||
R_StudioDynamicLight,
|
||||
R_StudioEntityLight,
|
||||
R_StudioSetupLighting,
|
||||
R_StudioDrawPoints,
|
||||
R_StudioDrawHulls,
|
||||
R_StudioDrawAbsBBox,
|
||||
R_StudioDrawBones,
|
||||
(void*)R_StudioSetupSkin,
|
||||
R_StudioSetRemapColors,
|
||||
R_StudioSetupPlayerModel,
|
||||
R_StudioClientEvents,
|
||||
R_StudioGetForceFaceFlags,
|
||||
R_StudioSetForceFaceFlags,
|
||||
(void*)R_StudioSetHeader,
|
||||
R_StudioSetRenderModel,
|
||||
R_StudioSetupRenderer,
|
||||
R_StudioRestoreRenderer,
|
||||
R_StudioSetChromeOrigin,
|
||||
pfnIsHardware,
|
||||
GL_StudioDrawShadow,
|
||||
GL_StudioSetRenderMode,
|
||||
R_StudioSetRenderamt,
|
||||
R_StudioSetCullState,
|
||||
R_StudioRenderShadow,
|
||||
};
|
||||
|
||||
static r_studio_interface_t gStudioDraw =
|
||||
{
|
||||
STUDIO_INTERFACE_VERSION,
|
||||
R_StudioDrawModel,
|
||||
R_StudioDrawPlayer,
|
||||
};
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_InitStudioAPI
|
||||
|
||||
Initialize client studio
|
||||
===============
|
||||
*/
|
||||
void CL_InitStudioAPI( void )
|
||||
{
|
||||
pStudioDraw = &gStudioDraw;
|
||||
|
||||
// trying to grab them from client.dll
|
||||
cl_righthand = gEngfuncs.pfnGetCvarPointer( "cl_righthand" );
|
||||
|
||||
api->GetCurrentEntity = pfnGetCurrentEntity;
|
||||
api->PlayerInfo = pfnPlayerInfo;
|
||||
api->GetPlayerState = R_StudioGetPlayerState;
|
||||
api->GetTimes = pfnGetEngineTimes;
|
||||
api->GetViewInfo = pfnGetViewInfo;
|
||||
api->GetModelCounters = pfnGetModelCounters;
|
||||
api->StudioGetBoneTransform = pfnStudioGetBoneTransform;
|
||||
api->StudioGetLightTransform = pfnStudioGetLightTransform;
|
||||
api->StudioGetRotationMatrix = pfnStudioGetRotationMatrix;
|
||||
api->StudioSetupModel = R_StudioSetupModel;
|
||||
api->StudioCheckBBox = R_StudioCheckBBox;
|
||||
api->StudioDynamicLight = R_StudioDynamicLight;
|
||||
api->StudioEntityLight = R_StudioEntityLight;
|
||||
api->StudioSetupLighting = R_StudioSetupLighting;
|
||||
api->StudioDrawPoints = R_StudioDrawPoints;
|
||||
api->StudioDrawHulls = R_StudioDrawHulls;
|
||||
api->StudioDrawAbsBBox = R_StudioDrawAbsBBox;
|
||||
api->StudioDrawBones = R_StudioDrawBones;
|
||||
api->StudioSetupSkin = (void *)R_StudioSetupSkin;
|
||||
api->StudioSetRemapColors = R_StudioSetRemapColors;
|
||||
api->SetupPlayerModel = R_StudioSetupPlayerModel;
|
||||
api->StudioClientEvents = R_StudioClientEvents;
|
||||
api->GetForceFaceFlags = R_StudioGetForceFaceFlags;
|
||||
api->SetForceFaceFlags = R_StudioSetForceFaceFlags;
|
||||
api->StudioSetHeader = (void *)R_StudioSetHeader;
|
||||
api->SetRenderModel = R_StudioSetRenderModel;
|
||||
api->SetupRenderer = R_StudioSetupRenderer;
|
||||
api->RestoreRenderer = R_StudioRestoreRenderer;
|
||||
api->SetChromeOrigin = R_StudioSetChromeOrigin;
|
||||
api->GL_StudioDrawShadow = GL_StudioDrawShadow;
|
||||
api->GL_SetRenderMode = GL_StudioSetRenderMode;
|
||||
api->StudioSetRenderamt = R_StudioSetRenderamt;
|
||||
api->StudioSetCullState = R_StudioSetCullState;
|
||||
api->StudioRenderShadow = R_StudioRenderShadow;
|
||||
// Xash will be used internal StudioModelRenderer
|
||||
if( gEngfuncs.pfnGetStudioModelInterface( STUDIO_INTERFACE_VERSION, &pStudioDraw, &gStudioAPI ))
|
||||
return;
|
||||
|
||||
pDefaultDraw->version = STUDIO_INTERFACE_VERSION;
|
||||
pDefaultDraw->StudioDrawModel = R_StudioDrawModel;
|
||||
pDefaultDraw->StudioDrawPlayer = R_StudioDrawPlayer;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void R_StudioSetDrawInterface( r_studio_interface_t *pDraw )
|
||||
{
|
||||
pStudioDraw = pDraw;
|
||||
// NOTE: we always return true even if game interface was not correct
|
||||
// because we need Draw our StudioModels
|
||||
// just restore pointer to builtin function
|
||||
pStudioDraw = &gStudioDraw;
|
||||
}
|
||||
|
||||
@@ -49,37 +49,6 @@ static void R_SimpleStubBool( qboolean unused )
|
||||
;
|
||||
}
|
||||
|
||||
static qboolean R_StudioFillAPI( struct engine_studio_api_s *api, struct r_studio_interface_s *pDefaultDraw )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void R_StudioSetDrawInterface( struct r_studio_interface_s *pDraw )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static void R_GetDetailScaleForTexture( int texture, float *xScale, float *yScale )
|
||||
{
|
||||
if( xScale ) *xScale = 1.0f;
|
||||
if( yScale ) *yScale = 1.0f;
|
||||
}
|
||||
|
||||
static void R_SetDetailScaleForTexture( int texture, float xScale, float yScale )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static void R_FillRenderAPI( render_api_t *api )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static void R_FillTriAPI( triangleapi_t *api )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static qboolean R_Init( void )
|
||||
{
|
||||
gEngfuncs.R_Init_Video( REF_SOFTWARE );
|
||||
@@ -131,6 +100,11 @@ static void R_SetupSky( int *skytextures )
|
||||
;
|
||||
}
|
||||
|
||||
static void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum )
|
||||
{
|
||||
;
|
||||
@@ -224,6 +198,11 @@ static void CL_DrawBeams( int fTrans, BEAM *beams )
|
||||
;
|
||||
}
|
||||
|
||||
static qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static int RefGetParm( int parm, int arg )
|
||||
{
|
||||
return 0;
|
||||
@@ -309,7 +288,7 @@ static void R_EntityRemoveDecals( struct model_s *mod )
|
||||
;
|
||||
}
|
||||
|
||||
static void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt )
|
||||
static void AVI_UploadRawFrame( int texture, int cols, int rows, int width, int height, const byte *data )
|
||||
{
|
||||
;
|
||||
}
|
||||
@@ -430,6 +409,11 @@ static void VGUI_SetupDrawing( qboolean rect )
|
||||
;
|
||||
}
|
||||
|
||||
static void VGUI_UploadTextureBlock( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
static const ref_interface_t gReffuncs =
|
||||
{
|
||||
.R_Init = R_Init,
|
||||
@@ -456,6 +440,7 @@ static const ref_interface_t gReffuncs =
|
||||
|
||||
.R_AddEntity = R_AddEntity,
|
||||
.R_ProcessEntData = R_ProcessEntData,
|
||||
.R_Flush = R_SimpleStubUInt,
|
||||
|
||||
.R_ShowTextures = R_SimpleStub,
|
||||
|
||||
@@ -465,6 +450,7 @@ static const ref_interface_t gReffuncs =
|
||||
.R_SetupSky = R_SetupSky,
|
||||
|
||||
.R_Set2DMode = R_SimpleStubBool,
|
||||
.R_DrawStretchRaw = R_DrawStretchRaw,
|
||||
.R_DrawStretchPic = R_DrawStretchPic,
|
||||
.FillRGBA = FillRGBA,
|
||||
.WorldToScreen = WorldToScreen,
|
||||
@@ -481,8 +467,7 @@ static const ref_interface_t gReffuncs =
|
||||
|
||||
.R_StudioEstimateFrame = R_StudioEstimateFrame,
|
||||
.R_StudioLerpMovement = R_StudioLerpMovement,
|
||||
.R_StudioFillAPI = R_StudioFillAPI,
|
||||
.R_StudioSetDrawInterface = R_StudioSetDrawInterface,
|
||||
.CL_InitStudioAPI = R_SimpleStub,
|
||||
|
||||
.R_SetSkyCloudsTextures = R_SetSkyCloudsTextures,
|
||||
.GL_SubdivideSurface = GL_SubdivideSurface,
|
||||
@@ -495,23 +480,45 @@ static const ref_interface_t gReffuncs =
|
||||
.CL_DrawParticles = CL_DrawParticles,
|
||||
.CL_DrawTracers = CL_DrawTracers,
|
||||
.CL_DrawBeams = CL_DrawBeams,
|
||||
.R_BeamCull = R_BeamCull,
|
||||
|
||||
.RefGetParm = RefGetParm,
|
||||
.RefGetParm = RefGetParm,
|
||||
.GetDetailScaleForTexture = GetDetailScaleForTexture,
|
||||
.GetExtraParmsForTexture = GetExtraParmsForTexture,
|
||||
.GetFrameTime = GetFrameTime,
|
||||
|
||||
.R_GetDetailScaleForTexture = R_GetDetailScaleForTexture,
|
||||
.R_SetDetailScaleForTexture = R_SetDetailScaleForTexture,
|
||||
.R_SetCurrentEntity = R_SetCurrentEntity,
|
||||
.R_SetCurrentModel = R_SetCurrentModel,
|
||||
|
||||
.GL_CreateTexture = GL_CreateTexture,
|
||||
.GL_FindTexture = GL_FindTexture,
|
||||
.GL_TextureName = GL_TextureName,
|
||||
.GL_TextureData = GL_TextureData,
|
||||
.GL_LoadTexture = GL_LoadTexture,
|
||||
.GL_FreeTexture = R_SimpleStubUInt,
|
||||
.GL_FindTexture = GL_FindTexture,
|
||||
.GL_TextureName = GL_TextureName,
|
||||
.GL_TextureData = GL_TextureData,
|
||||
.GL_LoadTexture = GL_LoadTexture,
|
||||
.GL_CreateTexture = GL_CreateTexture,
|
||||
.GL_LoadTextureArray = GL_LoadTextureArray,
|
||||
.GL_CreateTextureArray = GL_CreateTextureArray,
|
||||
.GL_FreeTexture = R_SimpleStubUInt,
|
||||
.R_OverrideTextureSourceSize = R_OverrideTextureSourceSize,
|
||||
|
||||
.GL_UpdateTexture = GL_UpdateTexture,
|
||||
.DrawSingleDecal = DrawSingleDecal,
|
||||
.R_DecalSetupVerts = R_DecalSetupVerts,
|
||||
.R_EntityRemoveDecals = R_EntityRemoveDecals,
|
||||
|
||||
.GL_Bind = GL_Bind,
|
||||
.AVI_UploadRawFrame = AVI_UploadRawFrame,
|
||||
|
||||
.GL_Bind = GL_Bind,
|
||||
.GL_SelectTexture = R_SimpleStubInt,
|
||||
.GL_LoadTextureMatrix = GL_LoadTextureMatrix,
|
||||
.GL_TexMatrixIdentity = R_SimpleStub,
|
||||
.GL_CleanUpTextureUnits = R_SimpleStubInt,
|
||||
.GL_TexGen = GL_TexGen,
|
||||
.GL_TextureTarget = R_SimpleStubUInt,
|
||||
.GL_TexCoordArrayMode = R_SimpleStubUInt,
|
||||
.GL_UpdateTexSize = GL_UpdateTexSize,
|
||||
|
||||
.GL_DrawParticles = GL_DrawParticles,
|
||||
.LightVec = LightVec,
|
||||
.StudioGetTexture = StudioGetTexture,
|
||||
|
||||
.GL_RenderFrame = GL_RenderFrame,
|
||||
.GL_OrthoBounds = GL_OrthoBounds,
|
||||
@@ -519,20 +526,24 @@ static const ref_interface_t gReffuncs =
|
||||
.Mod_GetCurrentVis = Mod_GetCurrentVis,
|
||||
.R_NewMap = R_SimpleStub,
|
||||
.R_ClearScene = R_SimpleStub,
|
||||
.R_GetProcAddress = R_GetProcAddress,
|
||||
|
||||
.TriRenderMode = R_SimpleStubInt,
|
||||
.Begin = R_SimpleStubInt,
|
||||
.End = R_SimpleStub,
|
||||
.Color4f = Color4f,
|
||||
.Color4ub = Color4ub,
|
||||
.TexCoord2f = TexCoord2f,
|
||||
.Vertex3fv = Vertex3fv,
|
||||
.Vertex3f = Vertex3f,
|
||||
.Fog = Fog,
|
||||
.ScreenToWorld = ScreenToWorld,
|
||||
.GetMatrix = GetMatrix,
|
||||
.FogParams = FogParams,
|
||||
.CullFace = CullFace,
|
||||
|
||||
.R_FillRenderAPI = R_FillRenderAPI,
|
||||
.R_FillTriAPI = R_FillTriAPI,
|
||||
|
||||
.VGUI_SetupDrawing = VGUI_SetupDrawing,
|
||||
.VGUI_UploadTextureBlock = VGUI_UploadTextureBlock,
|
||||
};
|
||||
|
||||
int EXPORT GetRefAPI( int version, ref_interface_t *funcs, ref_api_t *engfuncs, ref_globals_t *globals );
|
||||
|
||||
@@ -116,7 +116,7 @@ R_BeamCull
|
||||
Cull the beam by bbox
|
||||
==============
|
||||
*/
|
||||
static qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly )
|
||||
qboolean GAME_EXPORT R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly )
|
||||
{
|
||||
// culling is undone in ref_soft
|
||||
return false;
|
||||
|
||||
@@ -198,13 +198,8 @@ static void GAME_EXPORT R_GetDetailScaleForTexture( int texture, float *xScale,
|
||||
{
|
||||
// details are not implemented in ref_soft
|
||||
|
||||
if( xScale ) *xScale = 1.0f;
|
||||
if( yScale ) *yScale = 1.0f;
|
||||
}
|
||||
|
||||
static void GAME_EXPORT R_SetDetailScaleForTexture( int texture, float xScale, float yScale )
|
||||
{
|
||||
// details are not implemented in ref_soft
|
||||
if( xScale ) *xScale = 0.0f;
|
||||
if( yScale ) *yScale = 0.0f;
|
||||
}
|
||||
|
||||
static void GAME_EXPORT R_GetExtraParmsForTexture( int texture, byte *red, byte *green, byte *blue, byte *density )
|
||||
@@ -263,6 +258,11 @@ static void GAME_EXPORT R_ProcessEntData( qboolean allocate, cl_entity_t *entiti
|
||||
tr.max_entities = max_entities;
|
||||
}
|
||||
|
||||
static void GAME_EXPORT R_Flush( unsigned int flags )
|
||||
{
|
||||
// stub
|
||||
}
|
||||
|
||||
// stubs
|
||||
|
||||
static void GAME_EXPORT GL_SetTexCoordArrayMode( uint mode )
|
||||
@@ -372,6 +372,10 @@ byte *GAME_EXPORT Mod_GetCurrentVis( void )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void GAME_EXPORT VGUI_UploadTextureBlock( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight )
|
||||
{
|
||||
}
|
||||
|
||||
static void GAME_EXPORT VGUI_SetupDrawing( qboolean rect )
|
||||
{
|
||||
}
|
||||
@@ -394,41 +398,6 @@ static void * GAME_EXPORT R_GetProcAddress( const char *name )
|
||||
return gEngfuncs.GL_GetProcAddress( name );
|
||||
}
|
||||
|
||||
static void R_FillRenderAPI( render_api_t *api )
|
||||
{
|
||||
api->GetExtraParmsForTexture = R_GetExtraParmsForTexture;
|
||||
api->GetFrameTime = R_GetFrameTime;
|
||||
api->R_SetCurrentEntity = R_SetCurrentEntity;
|
||||
api->R_SetCurrentModel = R_SetCurrentModel;
|
||||
api->GL_CreateTexture = GL_CreateTexture;
|
||||
api->GL_LoadTextureArray = GL_LoadTextureArray;
|
||||
api->GL_CreateTextureArray = GL_CreateTextureArray;
|
||||
api->DrawSingleDecal = DrawSingleDecal;
|
||||
api->R_DecalSetupVerts = R_DecalSetupVerts;
|
||||
api->R_EntityRemoveDecals = R_EntityRemoveDecals;
|
||||
api->GL_SelectTexture = GL_SelectTexture;
|
||||
api->GL_LoadTextureMatrix = GL_LoadTexMatrixExt;
|
||||
api->GL_TexMatrixIdentity = GL_LoadIdentityTexMatrix;
|
||||
api->GL_CleanUpTextureUnits = GL_CleanUpTextureUnits;
|
||||
api->GL_TexGen = GL_TexGen;
|
||||
api->GL_TextureTarget = GL_TextureTarget;
|
||||
api->GL_TexCoordArrayMode = GL_SetTexCoordArrayMode;
|
||||
api->GL_UpdateTexSize = GL_UpdateTexSize;
|
||||
api->GL_DrawParticles = CL_DrawParticlesExternal;
|
||||
api->LightVec = R_LightVec;
|
||||
api->StudioGetTexture = R_StudioGetTexture;
|
||||
api->GL_GetProcAddress = R_GetProcAddress;
|
||||
}
|
||||
|
||||
static void R_FillTriAPI( triangleapi_t *api )
|
||||
{
|
||||
api->TexCoord2f = TriTexCoord2f;
|
||||
api->Fog = TriFog;
|
||||
api->ScreenToWorld = R_ScreenToWorld;
|
||||
api->GetMatrix = TriGetMatrix;
|
||||
api->FogParams = TriFogParams;
|
||||
}
|
||||
|
||||
const ref_interface_t gReffuncs =
|
||||
{
|
||||
R_Init,
|
||||
@@ -455,6 +424,7 @@ const ref_interface_t gReffuncs =
|
||||
|
||||
R_AddEntity,
|
||||
R_ProcessEntData,
|
||||
R_Flush,
|
||||
|
||||
R_ShowTextures,
|
||||
|
||||
@@ -464,6 +434,7 @@ const ref_interface_t gReffuncs =
|
||||
R_SetupSky,
|
||||
|
||||
R_Set2DMode,
|
||||
R_DrawStretchRaw,
|
||||
R_DrawStretchPic,
|
||||
CL_FillRGBA,
|
||||
R_WorldToScreen,
|
||||
@@ -480,8 +451,7 @@ const ref_interface_t gReffuncs =
|
||||
|
||||
R_StudioEstimateFrame,
|
||||
R_StudioLerpMovement,
|
||||
R_StudioFillAPI,
|
||||
R_StudioSetDrawInterface,
|
||||
CL_InitStudioAPI,
|
||||
|
||||
R_SetSkyCloudsTextures,
|
||||
GL_SubdivideSurface,
|
||||
@@ -494,23 +464,45 @@ const ref_interface_t gReffuncs =
|
||||
CL_DrawParticles,
|
||||
CL_DrawTracers,
|
||||
CL_DrawBeams,
|
||||
R_BeamCull,
|
||||
|
||||
GL_RefGetParm,
|
||||
|
||||
R_GetDetailScaleForTexture,
|
||||
R_SetDetailScaleForTexture,
|
||||
R_GetExtraParmsForTexture,
|
||||
R_GetFrameTime,
|
||||
|
||||
R_SetCurrentEntity,
|
||||
R_SetCurrentModel,
|
||||
|
||||
GL_CreateTexture,
|
||||
GL_FindTexture,
|
||||
GL_TextureName,
|
||||
GL_TextureData,
|
||||
GL_LoadTexture,
|
||||
GL_CreateTexture,
|
||||
GL_LoadTextureArray,
|
||||
GL_CreateTextureArray,
|
||||
GL_FreeTexture,
|
||||
R_OverrideTextureSourceSize,
|
||||
|
||||
GL_UpdateTexture,
|
||||
DrawSingleDecal,
|
||||
R_DecalSetupVerts,
|
||||
R_EntityRemoveDecals,
|
||||
|
||||
R_UploadStretchRaw,
|
||||
|
||||
GL_Bind,
|
||||
GL_SelectTexture,
|
||||
GL_LoadTexMatrixExt,
|
||||
GL_LoadIdentityTexMatrix,
|
||||
GL_CleanUpTextureUnits,
|
||||
GL_TexGen,
|
||||
GL_TextureTarget,
|
||||
GL_SetTexCoordArrayMode,
|
||||
GL_UpdateTexSize,
|
||||
|
||||
CL_DrawParticlesExternal,
|
||||
R_LightVec,
|
||||
R_StudioGetTexture,
|
||||
|
||||
R_RenderFrame,
|
||||
Mod_SetOrthoBounds,
|
||||
@@ -518,19 +510,23 @@ const ref_interface_t gReffuncs =
|
||||
Mod_GetCurrentVis,
|
||||
R_NewMap,
|
||||
R_ClearScene,
|
||||
R_GetProcAddress,
|
||||
|
||||
TriRenderMode,
|
||||
TriBegin,
|
||||
TriEnd,
|
||||
_TriColor4f,
|
||||
_TriColor4ub,
|
||||
TriTexCoord2f,
|
||||
TriVertex3fv,
|
||||
TriVertex3f,
|
||||
TriFog,
|
||||
R_ScreenToWorld,
|
||||
TriGetMatrix,
|
||||
TriFogParams,
|
||||
TriCullFace,
|
||||
|
||||
R_FillRenderAPI,
|
||||
R_FillTriAPI,
|
||||
|
||||
VGUI_SetupDrawing,
|
||||
VGUI_UploadTextureBlock,
|
||||
};
|
||||
|
||||
|
||||
@@ -219,10 +219,19 @@ void Draw_Fill( int x, int y, int w, int h )
|
||||
|
||||
/*
|
||||
=============
|
||||
GL_UpdateTexture
|
||||
R_DrawStretchRaw
|
||||
=============
|
||||
*/
|
||||
void GAME_EXPORT GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt )
|
||||
void GAME_EXPORT R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty )
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
=============
|
||||
R_UploadStretchRaw
|
||||
=============
|
||||
*/
|
||||
void GAME_EXPORT R_UploadStretchRaw( int texture, int cols, int rows, int width, int height, const byte *data )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -659,20 +659,7 @@ int GAME_EXPORT GL_CreateTexture( const char *name, int width, int height, const
|
||||
return 0;
|
||||
}
|
||||
|
||||
int texnum = GL_LoadTextureInternal( name, &r_empty, flags );
|
||||
|
||||
if( !Q_strcmp( name, REF_DEFAULT_TEXTURE ))
|
||||
tr.defaultTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_PARTICLE_TEXTURE ))
|
||||
tr.particleTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_WHITE_TEXTURE ))
|
||||
tr.whiteTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_GRAY_TEXTURE ))
|
||||
tr.grayTexture = texnum;
|
||||
else if( !Q_strcmp( name, REF_BLACK_TEXTURE ))
|
||||
tr.blackTexture = texnum;
|
||||
|
||||
return texnum;
|
||||
return GL_LoadTextureInternal( name, &r_empty, flags );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -851,6 +838,74 @@ void R_InitDlightTexture( void )
|
||||
tr.dlightTexture = GL_LoadTextureInternal( "*dlight", &r_image, TF_NOMIPMAP | TF_CLAMP | TF_ATLAS_PAGE );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
GL_CreateInternalTextures
|
||||
==================
|
||||
*/
|
||||
static void GL_CreateInternalTextures( void )
|
||||
{
|
||||
int dx2, dy, d;
|
||||
int x, y;
|
||||
rgbdata_t *pic;
|
||||
|
||||
// emo-texture from quake1
|
||||
pic = GL_FakeImage( 16, 16, 1, IMAGE_HAS_COLOR );
|
||||
|
||||
for( y = 0; y < 16; y++ )
|
||||
{
|
||||
for( x = 0; x < 16; x++ )
|
||||
{
|
||||
if(( y < 8 ) ^ ( x < 8 ))
|
||||
((uint *)pic->buffer )[y * 16 + x] = 0xFFFF00FF;
|
||||
else
|
||||
((uint *)pic->buffer )[y * 16 + x] = 0xFF000000;
|
||||
}
|
||||
}
|
||||
|
||||
tr.defaultTexture = GL_LoadTextureInternal( REF_DEFAULT_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// particle texture from quake1
|
||||
pic = GL_FakeImage( 16, 16, 1, IMAGE_HAS_COLOR | IMAGE_HAS_ALPHA );
|
||||
|
||||
for( x = 0; x < 16; x++ )
|
||||
{
|
||||
dx2 = x - 8;
|
||||
dx2 = dx2 * dx2;
|
||||
|
||||
for( y = 0; y < 16; y++ )
|
||||
{
|
||||
dy = y - 8;
|
||||
d = 255 - 35 * sqrt( dx2 + dy * dy );
|
||||
pic->buffer[( y * 16 + x ) * 4 + 3] = bound( 0, d, 255 );
|
||||
}
|
||||
}
|
||||
|
||||
tr.particleTexture = GL_LoadTextureInternal( "*particle", pic, TF_CLAMP );
|
||||
|
||||
// white texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer )[x] = 0xFFFFFFFF;
|
||||
tr.whiteTexture = GL_LoadTextureInternal( REF_WHITE_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// gray texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer )[x] = 0xFF7F7F7F;
|
||||
tr.grayTexture = GL_LoadTextureInternal( REF_GRAY_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// black texture
|
||||
pic = GL_FakeImage( 4, 4, 1, IMAGE_HAS_COLOR );
|
||||
for( x = 0; x < 16; x++ )
|
||||
((uint *)pic->buffer )[x] = 0xFF000000;
|
||||
tr.blackTexture = GL_LoadTextureInternal( REF_BLACK_TEXTURE, pic, TF_COLORMAP );
|
||||
|
||||
// cinematic dummy
|
||||
pic = GL_FakeImage( 640, 100, 1, IMAGE_HAS_COLOR );
|
||||
tr.cinTexture = GL_LoadTextureInternal( "*cintexture", pic, TF_NOMIPMAP | TF_CLAMP );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_TextureList_f
|
||||
@@ -916,6 +971,7 @@ void R_InitImages( void )
|
||||
r_numImages = 1;
|
||||
|
||||
// validate cvars
|
||||
GL_CreateInternalTextures();
|
||||
|
||||
gEngfuncs.Cmd_AddCommand( "texturelist", R_TextureList_f, "display loaded textures list" );
|
||||
}
|
||||
|
||||
@@ -205,6 +205,7 @@ typedef struct
|
||||
int lightmapTextures[MAX_LIGHTMAPS];
|
||||
int dlightTexture; // custom dlight texture
|
||||
int skyboxTextures[6]; // skybox sides
|
||||
int cinTexture; // cinematic texture
|
||||
|
||||
// entity lists
|
||||
draw_list_t draw_stack[MAX_DRAW_STACK];
|
||||
@@ -316,6 +317,7 @@ typedef struct image_s
|
||||
// gl_beams.c
|
||||
//
|
||||
void CL_DrawBeams( int fTrans, BEAM *active_beams );
|
||||
qboolean R_BeamCull( const vec3_t start, const vec3_t end, qboolean pvsOnly );
|
||||
|
||||
//
|
||||
// gl_decals.c
|
||||
@@ -334,7 +336,7 @@ void GL_Bind( int tmu, unsigned int texnum );
|
||||
// gl_draw.c
|
||||
//
|
||||
void R_Set2DMode( qboolean enable );
|
||||
void GL_UpdateTexture( int texnum, int cols, int rows, int width, int height, const byte *buffer, pixformat_t fmt );
|
||||
void R_UploadStretchRaw( int texture, int cols, int rows, int width, int height, const byte *data ); //
|
||||
|
||||
// gl_image.c
|
||||
//
|
||||
@@ -399,11 +401,11 @@ struct mstudiotex_s *R_StudioGetTexture( cl_entity_t *e );
|
||||
int R_GetEntityRenderMode( cl_entity_t *ent );
|
||||
void R_DrawStudioModel( cl_entity_t *e );
|
||||
player_info_t *pfnPlayerInfo( int index );
|
||||
void R_GatherPlayerLight( void );
|
||||
float R_StudioEstimateFrame( cl_entity_t *e, mstudioseqdesc_t *pseqdesc, double time );
|
||||
void R_StudioLerpMovement( cl_entity_t *e, double time, vec3_t origin, vec3_t angles );
|
||||
void R_StudioResetPlayerModels( void );
|
||||
qboolean R_StudioFillAPI( struct engine_studio_api_s *api, struct r_studio_interface_s *pDefaultDraw );
|
||||
void R_StudioSetDrawInterface( struct r_studio_interface_s *pDraw );
|
||||
void CL_InitStudioAPI( void );
|
||||
void Mod_StudioLoadTextures( model_t *mod, void *data );
|
||||
void Mod_StudioUnloadTextures( void *data );
|
||||
|
||||
@@ -449,6 +451,7 @@ void R_RenderFrame( const struct ref_viewpass_s *vp );
|
||||
void R_EndFrame( void );
|
||||
void R_ClearScene( void );
|
||||
void R_GetTextureParms( int *w, int *h, int texnum );
|
||||
void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean dirty );
|
||||
void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, int texnum );
|
||||
qboolean R_SpeedsMessage( char *out, size_t size );
|
||||
qboolean R_CullBox( const vec3_t mins, const vec3_t maxs );
|
||||
|
||||
@@ -474,7 +474,7 @@ R_FindViewLeaf
|
||||
void R_FindViewLeaf( void )
|
||||
{
|
||||
RI.oldviewleaf = RI.viewleaf;
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes, WORLDMODEL );
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1172,7 +1172,7 @@ void GAME_EXPORT R_RenderFrame( const ref_viewpass_t *rvp )
|
||||
|
||||
if( gEngfuncs.drawFuncs->GL_RenderFrame( rvp ))
|
||||
{
|
||||
// R_GatherPlayerLight( tr.viewent );
|
||||
// R_GatherPlayerLight();
|
||||
tr.realframecount++;
|
||||
tr.fResetVis = true;
|
||||
return;
|
||||
|
||||
@@ -293,7 +293,7 @@ void R_SetupFrameQ( void )
|
||||
// current viewleaf
|
||||
if( FBitSet( RI.rvp.flags, RF_DRAW_WORLD ))
|
||||
{
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes, WORLDMODEL );
|
||||
RI.viewleaf = gEngfuncs.Mod_PointInLeaf( RI.rvp.vieworigin, WORLDMODEL->nodes );
|
||||
r_viewcluster = RI.viewleaf->cluster;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ GNU General Public License for more details.
|
||||
|
||||
#define GLARE_FALLOFF 19000.0f
|
||||
|
||||
static float sprite_radius;
|
||||
|
||||
/*
|
||||
================
|
||||
R_CullSpriteModel
|
||||
@@ -43,6 +45,8 @@ static qboolean R_CullSpriteModel( cl_entity_t *e, vec3_t origin )
|
||||
VectorScale( e->model->mins, scale, sprite_mins );
|
||||
VectorScale( e->model->maxs, scale, sprite_maxs );
|
||||
|
||||
sprite_radius = RadiusFromBounds( sprite_mins, sprite_maxs );
|
||||
|
||||
VectorAdd( sprite_mins, origin, sprite_mins );
|
||||
VectorAdd( sprite_maxs, origin, sprite_maxs );
|
||||
|
||||
|
||||
@@ -359,6 +359,17 @@ player_info_t *pfnPlayerInfo( int index )
|
||||
return gEngfuncs.pfnPlayerInfo( index );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnMod_ForName
|
||||
|
||||
===============
|
||||
*/
|
||||
static model_t *pfnMod_ForName( const char *model, int crash )
|
||||
{
|
||||
return gEngfuncs.Mod_ForName( model, crash, false );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetPlayerState
|
||||
@@ -373,6 +384,17 @@ static entity_state_t *R_StudioGetPlayerState( int index )
|
||||
return gEngfuncs.pfnGetPlayerState( index );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetViewEntity
|
||||
|
||||
===============
|
||||
*/
|
||||
static cl_entity_t *pfnGetViewEntity( void )
|
||||
{
|
||||
return tr.viewent;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetEngineTimes
|
||||
@@ -407,6 +429,17 @@ static void pfnGetViewInfo( float *origin, float *upv, float *rightv, float *for
|
||||
VectorCopy( RI.vup, upv );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
R_GetChromeSprite
|
||||
|
||||
===============
|
||||
*/
|
||||
static model_t *R_GetChromeSprite( void )
|
||||
{
|
||||
return gEngfuncs.GetDefaultSprite( REF_CHROME_SPRITE );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetModelCounters
|
||||
@@ -419,6 +452,20 @@ static void pfnGetModelCounters( int **s, int **a )
|
||||
*a = &r_stats.c_studio_models_drawn;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnGetAliasScale
|
||||
|
||||
===============
|
||||
*/
|
||||
static void pfnGetAliasScale( float *x, float *y )
|
||||
{
|
||||
if( x )
|
||||
*x = 1.0f;
|
||||
if( y )
|
||||
*y = 1.0f;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetBoneTransform
|
||||
@@ -441,6 +488,17 @@ static float ****pfnStudioGetLightTransform( void )
|
||||
return (float ****)g_studio.lighttransform;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetAliasTransform
|
||||
|
||||
===============
|
||||
*/
|
||||
static float ***pfnStudioGetAliasTransform( void )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnStudioGetRotationMatrix
|
||||
@@ -2517,6 +2575,18 @@ static void R_StudioSetChromeOrigin( void )
|
||||
VectorCopy( RI.rvp.vieworigin, g_studio.chrome_origin );
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
pfnIsHardware
|
||||
|
||||
Xash3D is always works in hardware mode
|
||||
===============
|
||||
*/
|
||||
static int pfnIsHardware( void )
|
||||
{
|
||||
return 1; // 0 is Software, 1 is OpenGL, 2 is Direct3D
|
||||
}
|
||||
|
||||
/*
|
||||
===============
|
||||
GL_StudioSetRenderMode
|
||||
@@ -2613,7 +2683,7 @@ static void R_StudioRenderModel( void )
|
||||
R_StudioRenderFinal( );
|
||||
|
||||
R_StudioSetForceFaceFlags( STUDIO_NF_CHROME );
|
||||
TriSpriteTexture( gEngfuncs.GetDefaultSprite( REF_CHROME_SPRITE ), 0 );
|
||||
TriSpriteTexture( R_GetChromeSprite(), 0 );
|
||||
RI.currententity->curstate.renderfx = kRenderFxGlowShell;
|
||||
|
||||
R_StudioRenderFinal( );
|
||||
@@ -3125,6 +3195,20 @@ void R_RunViewmodelEvents( void )
|
||||
R_StudioDrawModelInternal( RI.currententity, STUDIO_EVENTS );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_GatherPlayerLight
|
||||
=================
|
||||
*/
|
||||
void R_GatherPlayerLight( void )
|
||||
{
|
||||
cl_entity_t *view = tr.viewent;
|
||||
colorVec c;
|
||||
|
||||
c = R_LightPoint( view->origin );
|
||||
gEngfuncs.SetLocalLightLevel(( c.r + c.g + c.b ) / 3 );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
R_DrawViewModel
|
||||
@@ -3134,7 +3218,7 @@ void R_DrawViewModel( void )
|
||||
{
|
||||
cl_entity_t *view = tr.viewent;
|
||||
|
||||
R_GatherPlayerLight( view );
|
||||
R_GatherPlayerLight();
|
||||
|
||||
if( r_drawviewmodel->value == 0 )
|
||||
return;
|
||||
@@ -3331,53 +3415,113 @@ void Mod_StudioUnloadTextures( void *data )
|
||||
}
|
||||
}
|
||||
|
||||
qboolean R_StudioFillAPI( engine_studio_api_t *api, r_studio_interface_t *pDefaultDraw )
|
||||
static model_t *pfnModelHandle( int modelindex )
|
||||
{
|
||||
return CL_ModelHandle( modelindex );
|
||||
}
|
||||
|
||||
static void *pfnMod_CacheCheck( struct cache_user_s *c )
|
||||
{
|
||||
return gEngfuncs.Mod_CacheCheck( c );
|
||||
}
|
||||
|
||||
static void *pfnMod_StudioExtradata( model_t *mod )
|
||||
{
|
||||
return gEngfuncs.Mod_Extradata( mod_studio, mod );
|
||||
}
|
||||
|
||||
static void pfnMod_LoadCacheFile( const char *path, struct cache_user_s *cu )
|
||||
{
|
||||
gEngfuncs.Mod_LoadCacheFile( path, cu );
|
||||
}
|
||||
|
||||
static cvar_t *pfnGetCvarPointer( const char *name )
|
||||
{
|
||||
return (cvar_t *)gEngfuncs.pfnGetCvarPointer( name );
|
||||
}
|
||||
|
||||
static void *pfnMod_Calloc( int number, size_t size )
|
||||
{
|
||||
return gEngfuncs.Mod_Calloc( number, size );
|
||||
}
|
||||
|
||||
static engine_studio_api_t gStudioAPI =
|
||||
{
|
||||
pfnMod_Calloc,
|
||||
pfnMod_CacheCheck,
|
||||
pfnMod_LoadCacheFile,
|
||||
pfnMod_ForName,
|
||||
pfnMod_StudioExtradata,
|
||||
pfnModelHandle,
|
||||
pfnGetCurrentEntity,
|
||||
pfnPlayerInfo,
|
||||
R_StudioGetPlayerState,
|
||||
pfnGetViewEntity,
|
||||
pfnGetEngineTimes,
|
||||
pfnGetCvarPointer,
|
||||
pfnGetViewInfo,
|
||||
R_GetChromeSprite,
|
||||
pfnGetModelCounters,
|
||||
pfnGetAliasScale,
|
||||
pfnStudioGetBoneTransform,
|
||||
pfnStudioGetLightTransform,
|
||||
pfnStudioGetAliasTransform,
|
||||
pfnStudioGetRotationMatrix,
|
||||
R_StudioSetupModel,
|
||||
R_StudioCheckBBox,
|
||||
R_StudioDynamicLight,
|
||||
R_StudioEntityLight,
|
||||
R_StudioSetupLighting,
|
||||
R_StudioDrawPoints,
|
||||
R_StudioDrawHulls,
|
||||
R_StudioDrawAbsBBox,
|
||||
R_StudioDrawBones,
|
||||
(void *)R_StudioSetupSkin,
|
||||
R_StudioSetRemapColors,
|
||||
R_StudioSetupPlayerModel,
|
||||
R_StudioClientEvents,
|
||||
R_StudioGetForceFaceFlags,
|
||||
R_StudioSetForceFaceFlags,
|
||||
(void *)R_StudioSetHeader,
|
||||
R_StudioSetRenderModel,
|
||||
R_StudioSetupRenderer,
|
||||
R_StudioRestoreRenderer,
|
||||
R_StudioSetChromeOrigin,
|
||||
pfnIsHardware,
|
||||
GL_StudioDrawShadow,
|
||||
GL_StudioSetRenderMode,
|
||||
R_StudioSetRenderamt,
|
||||
R_StudioSetCullState,
|
||||
R_StudioRenderShadow,
|
||||
};
|
||||
|
||||
static r_studio_interface_t gStudioDraw =
|
||||
{
|
||||
STUDIO_INTERFACE_VERSION,
|
||||
R_StudioDrawModel,
|
||||
R_StudioDrawPlayer,
|
||||
};
|
||||
|
||||
/*
|
||||
===============
|
||||
CL_InitStudioAPI
|
||||
|
||||
Initialize client studio
|
||||
===============
|
||||
*/
|
||||
void GAME_EXPORT CL_InitStudioAPI( void )
|
||||
{
|
||||
pStudioDraw = &gStudioDraw;
|
||||
|
||||
// trying to grab them from client.dll
|
||||
cl_righthand = gEngfuncs.pfnGetCvarPointer( "cl_righthand" );
|
||||
|
||||
api->GetCurrentEntity = pfnGetCurrentEntity;
|
||||
api->PlayerInfo = pfnPlayerInfo;
|
||||
api->GetPlayerState = R_StudioGetPlayerState;
|
||||
api->GetTimes = pfnGetEngineTimes;
|
||||
api->GetViewInfo = pfnGetViewInfo;
|
||||
api->GetModelCounters = pfnGetModelCounters;
|
||||
api->StudioGetBoneTransform = pfnStudioGetBoneTransform;
|
||||
api->StudioGetLightTransform = pfnStudioGetLightTransform;
|
||||
api->StudioGetRotationMatrix = pfnStudioGetRotationMatrix;
|
||||
api->StudioSetupModel = R_StudioSetupModel;
|
||||
api->StudioCheckBBox = R_StudioCheckBBox;
|
||||
api->StudioDynamicLight = R_StudioDynamicLight;
|
||||
api->StudioEntityLight = R_StudioEntityLight;
|
||||
api->StudioSetupLighting = R_StudioSetupLighting;
|
||||
api->StudioDrawPoints = R_StudioDrawPoints;
|
||||
api->StudioDrawHulls = R_StudioDrawHulls;
|
||||
api->StudioDrawAbsBBox = R_StudioDrawAbsBBox;
|
||||
api->StudioDrawBones = R_StudioDrawBones;
|
||||
api->StudioSetupSkin = (void *)R_StudioSetupSkin;
|
||||
api->StudioSetRemapColors = R_StudioSetRemapColors;
|
||||
api->SetupPlayerModel = R_StudioSetupPlayerModel;
|
||||
api->StudioClientEvents = R_StudioClientEvents;
|
||||
api->GetForceFaceFlags = R_StudioGetForceFaceFlags;
|
||||
api->SetForceFaceFlags = R_StudioSetForceFaceFlags;
|
||||
api->StudioSetHeader = (void *)R_StudioSetHeader;
|
||||
api->SetRenderModel = R_StudioSetRenderModel;
|
||||
api->SetupRenderer = R_StudioSetupRenderer;
|
||||
api->RestoreRenderer = R_StudioRestoreRenderer;
|
||||
api->SetChromeOrigin = R_StudioSetChromeOrigin;
|
||||
api->GL_StudioDrawShadow = GL_StudioDrawShadow;
|
||||
api->GL_SetRenderMode = GL_StudioSetRenderMode;
|
||||
api->StudioSetRenderamt = R_StudioSetRenderamt;
|
||||
api->StudioSetCullState = R_StudioSetCullState;
|
||||
api->StudioRenderShadow = R_StudioRenderShadow;
|
||||
// Xash will be used internal StudioModelRenderer
|
||||
if( gEngfuncs.pfnGetStudioModelInterface( STUDIO_INTERFACE_VERSION, &pStudioDraw, &gStudioAPI ))
|
||||
return;
|
||||
|
||||
pDefaultDraw->version = STUDIO_INTERFACE_VERSION;
|
||||
pDefaultDraw->StudioDrawModel = R_StudioDrawModel;
|
||||
pDefaultDraw->StudioDrawPlayer = R_StudioDrawPlayer;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void R_StudioSetDrawInterface( r_studio_interface_t *pDraw )
|
||||
{
|
||||
pStudioDraw = pDraw;
|
||||
// NOTE: we always return true even if game interface was not correct
|
||||
// because we need Draw our StudioModels
|
||||
// just restore pointer to builtin function
|
||||
pStudioDraw = &gStudioDraw;
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ cd "$GITHUB_WORKSPACE" || die
|
||||
cp -vr /Library/Frameworks/SDL2.framework ./build
|
||||
|
||||
pushd hlsdk || die
|
||||
mkdir -p ../build/ios/libs || die
|
||||
cmake -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DCMAKE_INSTALL_PREFIX=$(realpath ../build/ios/libs) -DCMAKE_BUILD_TYPE=Debug -B build -S .
|
||||
cmake -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 -DGAMEDIR=$(realpath ../build/ios) -DCMAKE_BUILD_TYPE=Debug -B build -S .
|
||||
cmake --build build --target install || die
|
||||
popd || die
|
||||
|
||||
|
||||
Reference in New Issue
Block a user