ref: simplify efx api, move efrags to engine

This commit is contained in:
mittorn 2019-03-17 23:14:53 +07:00
parent 78f8932313
commit c55b7dcda7
14 changed files with 54 additions and 77 deletions

View File

@ -13,10 +13,12 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "gl_local.h"
#include "common.h"
#include "entity_types.h"
#include "studio.h"
#include "world.h" // BOX_ON_PLANE_SIDE
#include "client.h"
#include "mathlib.h"
/*
===============================================================================
@ -65,8 +67,8 @@ void R_RemoveEfrags( cl_entity_t *ent )
ef = ef->entnext;
// put it on the free list
old->entnext = gEngfuncs.GetEfragsFreeList();
gEngfuncs.SetEfragsFreeList( old );
old->entnext = clgame.free_efrags;
clgame.free_efrags = old;
}
ent->efrag = NULL;
}
@ -94,14 +96,14 @@ static void R_SplitEntityOnNode( mnode_t *node )
leaf = (mleaf_t *)node;
// grab an efrag off the free list
ef = gEngfuncs.GetEfragsFreeList();
ef = clgame.free_efrags;
if( !ef )
{
gEngfuncs.Con_Printf( S_ERROR "too many efrags!\n" );
Con_Printf( S_ERROR "too many efrags!\n" );
return; // no free fragments...
}
gEngfuncs.SetEfragsFreeList( ef->entnext );
clgame.free_efrags = ef->entnext;
ef->entity = r_addent;
// add the entity link
@ -159,7 +161,7 @@ void R_AddEfrags( cl_entity_t *ent )
r_emaxs[i] = ent->origin[i] + outmaxs[i];
}
R_SplitEntityOnNode( WORLDMODEL->nodes );
R_SplitEntityOnNode( cl.worldmodel->nodes );
ent->topnode = r_pefragtopnode;
}
@ -190,10 +192,10 @@ void R_StoreEfrags( efrag_t **ppefrag, int framecount )
if( pent->visframe != framecount )
{
if( gEngfuncs.CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
if( CL_AddVisibleEntity( pent, ET_FRAGMENTED ))
{
// mark that we've recorded this entity for this frame
pent->curstate.messagenum = gpGlobals->parsecount;
pent->curstate.messagenum = cl.parsecount;
pent->visframe = framecount;
}
}

View File

@ -21,22 +21,6 @@ static int ramp2[8] = { 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x68, 0x66 };
static int ramp3[6] = { 0x6d, 0x6b, 6, 5, 4, 3 };
static int gSparkRamp[9] = { 0xfe, 0xfd, 0xfc, 0x6f, 0x6e, 0x6d, 0x6c, 0x67, 0x60 };
static color24 gTracerColors[] =
{
{ 255, 255, 255 }, // White
{ 255, 0, 0 }, // Red
{ 0, 255, 0 }, // Green
{ 0, 0, 255 }, // Blue
{ 0, 0, 0 }, // Tracer default, filled in from cvars, etc.
{ 255, 167, 17 }, // Yellow-orange sparks
{ 255, 130, 90 }, // Yellowish streaks (garg)
{ 55, 60, 144 }, // Blue egon streak
{ 255, 130, 90 }, // More Yellowish streaks (garg)
{ 255, 140, 90 }, // More Yellowish streaks (garg)
{ 200, 130, 90 }, // More red streaks (garg)
{ 255, 120, 70 }, // Darker red streaks (garg)
};
convar_t *tracerspeed;
convar_t *tracerlength;
convar_t *traceroffset;
@ -83,14 +67,6 @@ short R_LookupColor( byte r, byte g, byte b )
return best;
}
color24 *R_GetTracerColor( uint idx )
{
if( idx > ARRAYSIZE( gTracerColors ))
return NULL;
return &gTracerColors[idx];
}
/*
================
R_GetPackedColor
@ -1879,12 +1855,6 @@ void R_UserTracerParticle( float *org, float *vel, float life, int colorIndex, f
if( colorIndex < 0 )
return;
if( colorIndex > ARRAYSIZE( gTracerColors ))
{
Con_Printf( S_ERROR "UserTracer with color > %d\n", ARRAYSIZE( gTracerColors ));
return;
}
if(( p = R_AllocTracer( org, vel, life )) != NULL )
{
p->context = deathcontext;

View File

@ -1096,7 +1096,7 @@ void CL_LinkUserMessage( char *pszName, const int svc_num, int iSize )
void CL_FreeEntity( cl_entity_t *pEdict )
{
Assert( pEdict != NULL );
ref.dllFuncs.R_RemoveEfrags( pEdict );
R_RemoveEfrags( pEdict );
CL_KillDeadBeams( pEdict );
}

View File

@ -352,7 +352,7 @@ void CL_ParseStaticEntity( sizebuf_t *msg )
}
}
ref.dllFuncs.R_AddEfrags( ent ); // add link
R_AddEfrags( ent ); // add link
}
@ -1023,8 +1023,8 @@ void CL_ParseClientData( sizebuf_t *msg )
}
}
refState.parsecount = cl.parsecount = i; // ack'd incoming messages.
refState.parsecountmod = cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
cl.parsecount = i; // ack'd incoming messages.
cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
frame = &cl.frames[cl.parsecountmod]; // frame at index.
frame->time = cl.mtime[0]; // mark network received time
@ -2559,7 +2559,7 @@ void CL_LegacyParseStaticEntity( sizebuf_t *msg )
}
}
ref.dllFuncs.R_AddEfrags( ent ); // add link
R_AddEfrags( ent ); // add link
}

View File

@ -349,8 +349,8 @@ static void CL_ParseQuakeClientData( sizebuf_t *msg )
// this is the frame update that this message corresponds to
i = cls.netchan.incoming_sequence;
refState.parsecount = cl.parsecount = i; // ack'd incoming messages.
refState.parsecountmod = cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
cl.parsecount = i; // ack'd incoming messages.
cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
frame = &cl.frames[cl.parsecountmod]; // frame at index.
frame->time = cl.mtime[0]; // mark network received time
frame->receivedtime = host.realtime; // time now that we are parsing.
@ -683,7 +683,7 @@ static void CL_ParseQuakeStaticEntity( sizebuf_t *msg )
}
}
ref.dllFuncs.R_AddEfrags( ent ); // add link
R_AddEfrags( ent ); // add link
}
/*

View File

@ -260,7 +260,7 @@ qboolean R_InitRenderAPI( void )
gRenderAPI.GetFrameTime = ref.dllFuncs.GetFrameTime;
gRenderAPI.R_SetCurrentEntity = ref.dllFuncs.R_SetCurrentEntity;
gRenderAPI.R_SetCurrentModel = ref.dllFuncs.R_SetCurrentModel;
gRenderAPI.R_StoreEfrags = ref.dllFuncs.R_StoreEfrags;
gRenderAPI.R_StoreEfrags = R_StoreEfrags;
gRenderAPI.GL_FindTexture = ref.dllFuncs.GL_FindTexture;
gRenderAPI.GL_TextureName = ref.dllFuncs.GL_TextureName;
gRenderAPI.GL_TextureData = ref.dllFuncs.GL_TextureData;

View File

@ -91,7 +91,6 @@ int CL_DecalIndex( int id );
// RefAPI
struct particle_s *CL_AllocParticleFast( void );
color24 *R_GetTracerColor( uint idx );
// Beams
struct beam_s *R_BeamLightning( vec3_t start, vec3_t end, int modelIndex, float life, float width, float amplitude, float brightness, float speed );

View File

@ -963,6 +963,12 @@ lightstyle_t *CL_GetLightStyle( int number );
int R_FatPVS( const vec3_t org, float radius, byte *visbuffer, qboolean merge, qboolean fullvis );
const ref_overview_t *GL_GetOverviewParms( void );
//
// cl_efrag.c
//
void R_StoreEfrags( efrag_t **ppefrag, int framecount );
void R_AddEfrags( cl_entity_t *ent );
void R_RemoveEfrags( cl_entity_t *ent );
//
// cl_tent.c
//

View File

@ -292,11 +292,9 @@ static ref_api_t gEngfuncs =
CL_ThinkParticle,
R_FreeDeadParticles,
CL_AllocParticleFast,
pfnGetEfragsFreeList,
pfnSetEfragsFreeList,
R_GetTracerColor,
CL_AllocElight,
pfnGetDefaultSprite,
R_StoreEfrags,
Mod_ForName,
pfnMod_Extradata,

View File

@ -80,16 +80,12 @@ typedef struct
typedef struct ref_globals_s
{
qboolean developer;
qboolean video_prepped;
float time; // cl.time
float oldtime; // cl.oldtime
double realtime; // host.realtime
double frametime; // host.frametime
int parsecount; // cl.parsecount
int parsecountmod; // cl.parsecountmod
// viewport width and height
int width;
int height;
@ -313,11 +309,9 @@ typedef struct ref_api_s
void (*CL_ThinkParticle)( double frametime, particle_t *p );
void (*R_FreeDeadParticles)( particle_t **ppparticles );
particle_t *(*CL_AllocParticleFast)( void ); // unconditionally give new particle pointer from cl_free_particles
efrag_t* (*GetEfragsFreeList)( void ); // clgame.free_efrags
void (*SetEfragsFreeList)( efrag_t* ); // clgame.free_efrags
color24 *(*GetTracerColors)( uint num );
struct dlight_s *(*CL_AllocElight)( int key );
struct model_s *(*GetDefaultSprite)( enum ref_defaultsprite_e spr );
void (*R_StoreEfrags)( struct efrag_s **ppefrag, int framecount );// store efrags for static entities
// model management
model_t *(*Mod_ForName)( const char *name, qboolean crash, qboolean trackCRC );
@ -494,9 +488,6 @@ typedef struct ref_interface_s
// light
colorVec (*R_LightPoint)( const float *p );
void (*R_AddEfrags)( struct cl_entity_s *ent );
void (*R_RemoveEfrags)( struct cl_entity_s *ent );
// decals
// Shoots a decal onto the surface of the BSP. position is the center of the decal in world coords
void (*R_DecalShoot)( int textureIndex, int entityIndex, int modelIndex, vec3_t pos, int flags, float scale );
@ -539,7 +530,6 @@ typedef struct ref_interface_s
// 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
void (*R_StoreEfrags)( struct efrag_s **ppefrag, int framecount );// store efrags for static entities
// Texture tools
int (*GL_FindTexture)( const char *name );

View File

@ -432,9 +432,6 @@ ref_interface_t gReffuncs =
R_LightPoint,
R_AddEfrags,
R_RemoveEfrags,
R_DecalShoot,
R_DecalRemoveAll,
R_CreateDecalList,
@ -466,7 +463,6 @@ ref_interface_t gReffuncs =
R_SetCurrentEntity,
R_SetCurrentModel,
R_StoreEfrags,
GL_FindTexture,
GL_TextureName,

View File

@ -359,11 +359,6 @@ void R_TextureList_f( void );
void R_InitImages( void );
void R_ShutdownImages( void );
//
// gl_refrag.c
//
void R_StoreEfrags( efrag_t **ppefrag, int framecount );
//
// gl_rlight.c
//

View File

@ -23,6 +23,21 @@ GNU General Public License for more details.
#include "studio.h"
static float gTracerSize[11] = { 1.5f, 0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
static color24 gTracerColors[] =
{
{ 255, 255, 255 }, // White
{ 255, 0, 0 }, // Red
{ 0, 255, 0 }, // Green
{ 0, 0, 255 }, // Blue
{ 0, 0, 0 }, // Tracer default, filled in from cvars, etc.
{ 255, 167, 17 }, // Yellow-orange sparks
{ 255, 130, 90 }, // Yellowish streaks (garg)
{ 55, 60, 144 }, // Blue egon streak
{ 255, 130, 90 }, // More Yellowish streaks (garg)
{ 255, 140, 90 }, // More Yellowish streaks (garg)
{ 200, 130, 90 }, // More red streaks (garg)
{ 255, 120, 70 }, // Darker red streaks (garg)
};
/*
================
@ -153,7 +168,7 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
// update tracer color if this is changed
if( FBitSet( tracerred->flags|tracergreen->flags|tracerblue->flags|traceralpha->flags, FCVAR_CHANGED ))
{
color24 *customColors = gEngfuncs.GetTracerColors( 4 );
color24 *customColors = &gTracerColors[4];
customColors->r = (byte)(tracerred->value * traceralpha->value * 255);
customColors->g = (byte)(tracergreen->value * traceralpha->value * 255);
customColors->b = (byte)(tracerblue->value * traceralpha->value * 255);
@ -215,7 +230,13 @@ void CL_DrawTracers( double frametime, particle_t *cl_active_tracers )
VectorAdd( verts[0], delta, verts[2] );
VectorAdd( verts[1], delta, verts[3] );
pColor = gEngfuncs.GetTracerColors( p->color );
if( p->color > sizeof( gTracerColors ) / sizeof( color24 ) )
{
gEngfuncs.Con_Printf( S_ERROR "UserTracer with color > %d\n", sizeof( gTracerColors ) / sizeof( color24 ));
p->color = 0;
}
pColor = &gTracerColors[p->color];
pglColor4ub( pColor->r, pColor->g, pColor->b, p->packedColor );
pglBegin( GL_QUADS );

View File

@ -3069,7 +3069,7 @@ loc0:
// deal with model fragments in this leaf
if( pleaf->efrags )
R_StoreEfrags( &pleaf->efrags, tr.realframecount );
gEngfuncs.R_StoreEfrags( &pleaf->efrags, tr.realframecount );
r_stats.c_world_leafs++;
return;
@ -3163,7 +3163,7 @@ static void R_DrawTopViewLeaf( mleaf_t *pleaf, uint clipflags )
// deal with model fragments in this leaf
if( pleaf->efrags )
R_StoreEfrags( &pleaf->efrags, tr.realframecount );
gEngfuncs.R_StoreEfrags( &pleaf->efrags, tr.realframecount );
r_stats.c_world_leafs++;
}
@ -3492,7 +3492,7 @@ void GL_RebuildLightmaps( void )
int i, j;
model_t *m;
if( !gpGlobals->video_prepped )
if( !gEngfuncs.CL_GetRenderParm( PARM_CLIENT_ACTIVE, 0 ) )
return; // wait for worldmodel
ClearBits( vid_brightness->flags, FCVAR_CHANGED );