14 Jan 2008
|
@ -28,8 +28,13 @@ fopen
|
|||
2. поля в вирт машине для сохранения матрицы OK
|
||||
3. сохранить velocity и avelocity OK
|
||||
4. дописать лоадер кастомных мешей OK
|
||||
5. Придумать как развернуть меш на 90 грд
|
||||
6. Пофиксить утечку памяти в cmodel OK
|
||||
5. Отладить менеджер загрузки моделей на сервере OK
|
||||
6. Перенести создание mesh-buffer в cmodel OK
|
||||
7. разобраться куда пропали модели из dm_qstyle OK
|
||||
8. Придумать как развернуть меш на 90 грд OK
|
||||
9. Пофиксить утечку памяти в cmodel OK
|
||||
10.Найти все кластеры для карт без виза (рендер\сервер) OK
|
||||
11.Перенести cmodel и pmove.c в physic.dll
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1196,8 +1196,8 @@ void CL_RequestNextDownload (void)
|
|||
{
|
||||
precache_check = ENV_CNT + 1;
|
||||
|
||||
CM_LoadMap (cl.configstrings[CS_MODELS+1], true, &map_checksum);
|
||||
if (map_checksum != atoi(cl.configstrings[CS_MAPCHECKSUM]))
|
||||
CM_BeginRegistration( cl.configstrings[CS_MODELS+1], true, &map_checksum );
|
||||
if( map_checksum != com.atoi(cl.configstrings[CS_MAPCHECKSUM]))
|
||||
{
|
||||
Host_Error("Local map version differs from server: %i != '%s'\n", map_checksum, cl.configstrings[CS_MAPCHECKSUM]);
|
||||
return;
|
||||
|
@ -1230,26 +1230,24 @@ void CL_RequestNextDownload (void)
|
|||
if (precache_check == TEXTURE_CNT+1)
|
||||
{
|
||||
// from common/cmodel.c
|
||||
extern int numtexinfo;
|
||||
extern mapsurface_t map_surfaces[];
|
||||
|
||||
if (allow_download->value && allow_download_maps->value)
|
||||
{
|
||||
while (precache_tex < numtexinfo)
|
||||
while( precache_tex < CM_NumTexinfo())
|
||||
{
|
||||
char fn[MAX_OSPATH];
|
||||
|
||||
sprintf(fn, "textures/%s.jpg", map_surfaces[precache_tex++].rname);
|
||||
if (!CL_CheckOrDownloadFile(fn)) return; // started a download
|
||||
sprintf(fn, "textures/%s.tga", CM_TexName( precache_tex++ ));
|
||||
if(!CL_CheckOrDownloadFile(fn)) return; // started a download
|
||||
}
|
||||
}
|
||||
precache_check = TEXTURE_CNT+999;
|
||||
}
|
||||
|
||||
//ZOID
|
||||
CL_RegisterSounds ();
|
||||
CL_PrepRefresh ();
|
||||
|
||||
CL_RegisterSounds();
|
||||
CL_PrepRefresh();
|
||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||
MSG_WriteString (&cls.netchan.message, va("begin %i\n", precache_spawncount) );
|
||||
}
|
||||
|
@ -1268,15 +1266,15 @@ void CL_Precache_f (void)
|
|||
// the old precache sequence
|
||||
if(Cmd_Argc() < 2)
|
||||
{
|
||||
uint map_checksum; // for detecting cheater maps
|
||||
CM_LoadMap(cl.configstrings[CS_MODELS+1], true, &map_checksum );
|
||||
uint map_checksum; // for detecting cheater maps
|
||||
CM_BeginRegistration( cl.configstrings[CS_MODELS+1], true, &map_checksum );
|
||||
CL_RegisterSounds();
|
||||
CL_PrepRefresh();
|
||||
return;
|
||||
}
|
||||
|
||||
precache_check = CS_MODELS;
|
||||
precache_spawncount = atoi(Cmd_Argv(1));
|
||||
precache_spawncount = com.atoi(Cmd_Argv(1));
|
||||
precache_model = 0;
|
||||
precache_model_skin = 0;
|
||||
|
||||
|
|
|
@ -489,13 +489,12 @@ void CL_ParseConfigString (void)
|
|||
}
|
||||
else if (i >= CS_MODELS && i < CS_MODELS+MAX_MODELS)
|
||||
{
|
||||
if (cl.refresh_prepped)
|
||||
if(cl.refresh_prepped)
|
||||
{
|
||||
cl.model_draw[i-CS_MODELS] = re->RegisterModel (cl.configstrings[i]);
|
||||
if (cl.configstrings[i][0] == '*')
|
||||
cl.model_clip[i-CS_MODELS] = CM_InlineModel (cl.configstrings[i]);
|
||||
else
|
||||
cl.model_clip[i-CS_MODELS] = NULL;
|
||||
cl.model_clip[i-CS_MODELS] = CM_RegisterModel(cl.configstrings[i] );
|
||||
else cl.model_clip[i-CS_MODELS] = NULL;
|
||||
}
|
||||
}
|
||||
else if (i >= CS_SOUNDS && i < CS_SOUNDS+MAX_MODELS)
|
||||
|
|
|
@ -83,17 +83,14 @@ void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end,
|
|||
num = (cl.frame.parse_entities + i)&(MAX_PARSE_ENTITIES-1);
|
||||
ent = &cl_parse_entities[num];
|
||||
|
||||
if (!ent->solid)
|
||||
continue;
|
||||
|
||||
if (ent->number == cl.playernum+1)
|
||||
continue;
|
||||
if(!ent->solid) continue;
|
||||
if(ent->number == cl.playernum + 1) continue;
|
||||
|
||||
if (ent->solid == 31)
|
||||
{ // special value for bmodel
|
||||
{
|
||||
// special value for bmodel
|
||||
cmodel = cl.model_clip[ent->modelindex];
|
||||
if (!cmodel)
|
||||
continue;
|
||||
if(!cmodel) continue;
|
||||
headnode = cmodel->headnode;
|
||||
angles = ent->angles;
|
||||
}
|
||||
|
@ -115,9 +112,7 @@ void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end,
|
|||
if (tr->allsolid)
|
||||
return;
|
||||
|
||||
trace = CM_TransformedBoxTrace (start, end,
|
||||
mins, maxs, headnode, MASK_PLAYERSOLID,
|
||||
ent->origin, angles);
|
||||
trace = CM_TransformedBoxTrace (start, end, mins, maxs, headnode, MASK_PLAYERSOLID, ent->origin, angles);
|
||||
|
||||
if (trace.allsolid || trace.startsolid ||
|
||||
trace.fraction < tr->fraction)
|
||||
|
@ -128,8 +123,7 @@ void CL_ClipMoveToEntities ( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end,
|
|||
*tr = trace;
|
||||
tr->startsolid = true;
|
||||
}
|
||||
else
|
||||
*tr = trace;
|
||||
else *tr = trace;
|
||||
}
|
||||
else if (trace.startsolid)
|
||||
tr->startsolid = true;
|
||||
|
|
|
@ -41,13 +41,13 @@ cvar_t *cl_stats;
|
|||
|
||||
extern bool scr_initialized;
|
||||
|
||||
int r_numdlights;
|
||||
int r_numdlights;
|
||||
dlight_t r_dlights[MAX_DLIGHTS];
|
||||
|
||||
int r_numentities;
|
||||
int r_numentities;
|
||||
entity_t r_entities[MAX_ENTITIES];
|
||||
|
||||
int r_numparticles;
|
||||
int r_numparticles;
|
||||
particle_t r_particles[MAX_PARTICLES];
|
||||
|
||||
lightstyle_t r_lightstyles[MAX_LIGHTSTYLES];
|
||||
|
@ -278,7 +278,7 @@ Call before entering a new level, or after changing dlls
|
|||
void CL_PrepRefresh( void )
|
||||
{
|
||||
char mapname[32];
|
||||
char name[MAX_QPATH];
|
||||
string name;
|
||||
float rotate;
|
||||
vec3_t axis;
|
||||
int i;
|
||||
|
@ -306,7 +306,7 @@ void CL_PrepRefresh( void )
|
|||
CL_RegisterTEntModels ();
|
||||
|
||||
num_cl_weaponmodels = 1;
|
||||
strcpy(cl_weaponmodels[0], "weapon.mdl");
|
||||
com.strcpy(cl_weaponmodels[0], "v_glock.mdl");
|
||||
|
||||
for( i = 1; i < MAX_MODELS; i++ )
|
||||
{
|
||||
|
@ -330,27 +330,13 @@ void CL_PrepRefresh( void )
|
|||
// create thread here ?
|
||||
for (i = 1; i < MAX_MODELS && cl.configstrings[CS_MODELS+i][0]; i++)
|
||||
{
|
||||
strcpy(name, cl.configstrings[CS_MODELS+i]);
|
||||
name[37] = 0; // never go beyond one line
|
||||
if (name[0] != '*') MsgDev(D_LOAD, "%s\n", name);
|
||||
com.strncpy( name, cl.configstrings[CS_MODELS+i], MAX_STRING );
|
||||
SCR_UpdateScreen();
|
||||
Sys_SendKeyEvents(); // pump message loop
|
||||
if (name[0] == '#')
|
||||
{
|
||||
// special player weapon model
|
||||
if (num_cl_weaponmodels < MAX_CLIENTWEAPONMODELS)
|
||||
{
|
||||
strncpy(cl_weaponmodels[num_cl_weaponmodels], cl.configstrings[CS_MODELS+i]+1,
|
||||
sizeof(cl_weaponmodels[num_cl_weaponmodels]) - 1);
|
||||
num_cl_weaponmodels++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cl.model_draw[i] = re->RegisterModel(cl.configstrings[CS_MODELS+i]);
|
||||
if (name[0] == '*') cl.model_clip[i] = CM_InlineModel (cl.configstrings[CS_MODELS+i]);
|
||||
else cl.model_clip[i] = NULL;
|
||||
}
|
||||
Sys_SendKeyEvents(); // pump message loop
|
||||
|
||||
cl.model_draw[i] = re->RegisterModel( name );
|
||||
if (name[0] == '*') cl.model_clip[i] = CM_RegisterModel( name );
|
||||
else cl.model_clip[i] = NULL;//get studio models here?
|
||||
Cvar_SetValue("scr_loading", scr_loading->value + 50.0f/mdlcount );
|
||||
SCR_UpdateScreen();
|
||||
}
|
||||
|
|
1876
engine/cmodel.c
|
@ -27,15 +27,19 @@
|
|||
#define PMF_TIME_TELEPORT 32 // pm_time is non-moving time
|
||||
#define PMF_NO_PREDICTION 64 // temporarily disables prediction (used for grappling hook)
|
||||
|
||||
cmodel_t *CM_LoadMap (char *name, bool clientload, unsigned *checksum);
|
||||
cmodel_t *CM_InlineModel (char *name); // *1, *2, etc
|
||||
cmodel_t *CM_LoadModel( edict_t *ent );
|
||||
cmodel_t *CM_BeginRegistration( const char *name, bool clientload, uint *checksum );
|
||||
cmodel_t *CM_RegisterModel( const char *name );
|
||||
void CM_EndRegistration( void );
|
||||
void CM_FreeModels( void );
|
||||
void CM_FreeWorld( void );
|
||||
int CM_NumClusters (void);
|
||||
int CM_NumTexinfo( void );
|
||||
int CM_NumInlineModels (void);
|
||||
char *CM_EntityString (void);
|
||||
char *CM_TexName( int index );
|
||||
int CM_HeadnodeForBox (vec3_t mins, vec3_t maxs);
|
||||
int CM_PointContents (vec3_t p, int headnode);
|
||||
const char *CM_GetStringFromTable( int index );
|
||||
int CM_TransformedPointContents (vec3_t p, int headnode, vec3_t origin, vec3_t angles);
|
||||
trace_t CM_BoxTrace (vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, int headnode, int brushmask);
|
||||
trace_t CM_TransformedBoxTrace (vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, int headnode, int brushmask, vec3_t origin, vec3_t angles);
|
||||
|
@ -52,7 +56,6 @@ int CM_WriteAreaBits (byte *buffer, int area);
|
|||
bool CM_HeadnodeVisible (int headnode, byte *visbits);
|
||||
void CM_InitBoxHull (void);
|
||||
void CM_FloodAreaConnections (void);
|
||||
void CM_RoundUpHullSize(vec3_t size, bool down);
|
||||
extern byte portalopen[MAX_MAP_AREAPORTALS];
|
||||
|
||||
/*
|
||||
|
|
|
@ -314,7 +314,6 @@ typedef enum
|
|||
#define MAX_DLIGHTS 32
|
||||
#define MAX_CLIENTS 256 // absolute limit
|
||||
#define MAX_EDICTS 4096 // must change protocol to increase more
|
||||
#define MAX_MODELS 4096 // these are sent over the net as short
|
||||
#define MAX_PARTICLES 4096
|
||||
#define MAX_LIGHTSTYLES 256
|
||||
#define MAX_SOUNDS 256 // so they cannot be blindly increased
|
||||
|
@ -459,7 +458,7 @@ NET
|
|||
==============================================================
|
||||
*/
|
||||
#define PORT_ANY -1
|
||||
#define MAX_MSGLEN 2048 // max length of a message
|
||||
#define MAX_MSGLEN 1600 // max length of a message
|
||||
#define PACKET_HEADER 10 // two ints and a short
|
||||
|
||||
typedef enum { NA_LOOPBACK, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX } netadrtype_t;
|
||||
|
|
|
@ -84,7 +84,7 @@ typedef struct
|
|||
float frametime;
|
||||
|
||||
char name[MAX_QPATH]; // map name, or cinematic name
|
||||
struct cmodel_s *models[MAX_MODELS];
|
||||
cmodel_t *models[MAX_MODELS];
|
||||
|
||||
char configstrings[MAX_CONFIGSTRINGS][MAX_QPATH];
|
||||
entity_state_t baselines[MAX_EDICTS];
|
||||
|
@ -188,6 +188,7 @@ typedef struct
|
|||
|
||||
char mapcmd[MAX_TOKEN_CHARS]; // ie: *intro.cin+base
|
||||
char comment[MAX_TOKEN_CHARS]; // map name, e.t.c.
|
||||
byte portalopen[MAX_MAP_AREAPORTALS];
|
||||
|
||||
int spawncount; // incremented each server start
|
||||
// used to check late spawns
|
||||
|
|
|
@ -225,7 +225,7 @@ void SV_Load_f( void )
|
|||
|
||||
SV_ReadSaveFile( filename );
|
||||
SV_BroadcastCommand( "changing\n" );
|
||||
SV_SpawnServer(svs.mapcmd, filename, ss_game );
|
||||
SV_SpawnServer( svs.mapcmd, filename, ss_game );
|
||||
SV_BroadcastCommand( "reconnect\n" );
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ int SV_FindIndex (const char *name, int start, int end, bool create)
|
|||
if (!name || !name[0]) return 0;
|
||||
|
||||
for (i = 1; i < end && sv.configstrings[start+i][0]; i++)
|
||||
if(!strcmp(sv.configstrings[start+i], name))
|
||||
if(!com.strcmp(sv.configstrings[start+i], name))
|
||||
return i;
|
||||
if(!create) return 0;
|
||||
|
||||
|
@ -130,7 +130,6 @@ void SV_CheckForSavegame (char *savename )
|
|||
if(!savename) sv.loadgame = false;
|
||||
if(!FS_FileExists(va("save/%s", savename )))
|
||||
sv.loadgame = false;
|
||||
SV_ClearWorld();
|
||||
}
|
||||
|
||||
|
||||
|
@ -195,22 +194,22 @@ void SV_SpawnServer (char *server, char *savename, sv_state_t serverstate )
|
|||
|
||||
if (serverstate != ss_game)
|
||||
{
|
||||
sv.models[1] = CM_LoadMap ("", false, &checksum); // no real map
|
||||
sv.models[1] = CM_BeginRegistration("", false, &checksum); // no real map
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf (sv.configstrings[CS_MODELS+1], "maps/%s", server);
|
||||
sv.models[1] = CM_LoadMap (sv.configstrings[CS_MODELS+1], false, &checksum);
|
||||
sprintf(sv.configstrings[CS_MODELS+1], "maps/%s", server);
|
||||
sv.models[1] = CM_BeginRegistration(sv.configstrings[CS_MODELS+1], false, &checksum);
|
||||
}
|
||||
sprintf (sv.configstrings[CS_MAPCHECKSUM],"%i", checksum);
|
||||
sprintf(sv.configstrings[CS_MAPCHECKSUM], "%i", checksum);
|
||||
|
||||
// clear physics interaction links
|
||||
SV_ClearWorld ();
|
||||
SV_ClearWorld();
|
||||
|
||||
for (i = 1; i < CM_NumInlineModels(); i++)
|
||||
{
|
||||
sprintf(sv.configstrings[CS_MODELS+1+i], "*%i", i);
|
||||
sv.models[i+1] = CM_InlineModel(sv.configstrings[CS_MODELS+1+i]);
|
||||
sprintf( sv.configstrings[CS_MODELS+1+i], "*%i", i );
|
||||
sv.models[i+1] = CM_RegisterModel(sv.configstrings[CS_MODELS+1+i] );
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -220,7 +219,7 @@ void SV_SpawnServer (char *server, char *savename, sv_state_t serverstate )
|
|||
// precache and static commands can be issued during
|
||||
// map initialization
|
||||
sv.state = ss_loading;
|
||||
Host_SetServerState (sv.state);
|
||||
Host_SetServerState( sv.state );
|
||||
|
||||
// check for a savegame
|
||||
SV_CheckForSavegame( savename );
|
||||
|
@ -241,6 +240,7 @@ void SV_SpawnServer (char *server, char *savename, sv_state_t serverstate )
|
|||
|
||||
// set serverinfo variable
|
||||
Cvar_FullSet("mapname", sv.name, CVAR_SERVERINFO | CVAR_INIT);
|
||||
CM_EndRegistration(); // free unused models
|
||||
SV_VM_End();
|
||||
}
|
||||
|
||||
|
@ -419,30 +419,31 @@ void SV_VM_Setup( void )
|
|||
{
|
||||
PRVM_Begin;
|
||||
PRVM_InitProg( PRVM_SERVERPROG );
|
||||
|
||||
// allocate the mempools
|
||||
// TODO: move the magic numbers/constants into #defines [9/13/2006 Black]
|
||||
prog->progs_mempool = Mem_AllocPool("Server Progs" );
|
||||
prog->builtins = vm_sv_builtins;
|
||||
prog->numbuiltins = vm_sv_numbuiltins;
|
||||
prog->max_edicts = 512;
|
||||
prog->limit_edicts = MAX_EDICTS;
|
||||
prog->reserved_edicts = maxclients->value;
|
||||
prog->edictprivate_size = sizeof(sv_edict_t);
|
||||
prog->name = "server";
|
||||
prog->extensionstring = "";
|
||||
prog->loadintoworld = true;
|
||||
|
||||
prog->begin_increase_edicts = SV_VM_BeginIncreaseEdicts;
|
||||
prog->end_increase_edicts = SV_VM_EndIncreaseEdicts;
|
||||
prog->init_edict = SV_VM_InitEdict;
|
||||
prog->free_edict = SV_VM_FreeEdict;
|
||||
prog->count_edicts = SV_VM_CountEdicts;
|
||||
prog->load_edict = SV_VM_LoadEdict;
|
||||
prog->init_cmd = VM_Cmd_Init;
|
||||
prog->reset_cmd = VM_Cmd_Reset;
|
||||
prog->error_cmd = VM_Error;
|
||||
PRVM_LoadProgs( "server.dat", 0, NULL, SV_NUM_REQFIELDS, sv_reqfields );
|
||||
prog->reserved_edicts = maxclients->value;
|
||||
prog->loadintoworld = true;
|
||||
|
||||
if( !prog->loaded )
|
||||
{
|
||||
prog->progs_mempool = Mem_AllocPool("Server Progs" );
|
||||
prog->builtins = vm_sv_builtins;
|
||||
prog->numbuiltins = vm_sv_numbuiltins;
|
||||
prog->max_edicts = 512;
|
||||
prog->limit_edicts = MAX_EDICTS;
|
||||
prog->edictprivate_size = sizeof(sv_edict_t);
|
||||
prog->name = "server";
|
||||
prog->extensionstring = "";
|
||||
prog->begin_increase_edicts = SV_VM_BeginIncreaseEdicts;
|
||||
prog->end_increase_edicts = SV_VM_EndIncreaseEdicts;
|
||||
prog->init_edict = SV_VM_InitEdict;
|
||||
prog->free_edict = SV_VM_FreeEdict;
|
||||
prog->count_edicts = SV_VM_CountEdicts;
|
||||
prog->load_edict = SV_VM_LoadEdict;
|
||||
prog->init_cmd = VM_Cmd_Init;
|
||||
prog->reset_cmd = VM_Cmd_Reset;
|
||||
prog->error_cmd = VM_Error;
|
||||
PRVM_LoadProgs( "server.dat", 0, NULL, SV_NUM_REQFIELDS, sv_reqfields );
|
||||
}
|
||||
PRVM_End;
|
||||
}
|
||||
|
||||
|
|
|
@ -727,7 +727,7 @@ void SV_RunGameFrame (void)
|
|||
{
|
||||
|
||||
if(!cm_paused->value)
|
||||
pe->Frame( sv.time );
|
||||
pe->Frame( 0.05 );//FIXME
|
||||
SV_RunFrame ();
|
||||
|
||||
// never get more than one tic behind
|
||||
|
@ -875,13 +875,14 @@ void Master_Shutdown (void)
|
|||
return; // a private dedicated game
|
||||
|
||||
// send to group master
|
||||
for (i=0 ; i<MAX_MASTERS ; i++)
|
||||
for(i = 0; i < MAX_MASTERS; i++)
|
||||
{
|
||||
if (master_adr[i].port)
|
||||
{
|
||||
if (i > 0)
|
||||
Msg ("Sending heartbeat to %s\n", NET_AdrToString (master_adr[i]));
|
||||
Netchan_OutOfBandPrint (NS_SERVER, master_adr[i], "shutdown");
|
||||
if( i ) Msg ("Sending heartbeat to %s\n", NET_AdrToString (master_adr[i]));
|
||||
Netchan_OutOfBandPrint( NS_SERVER, master_adr[i], "shutdown" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
@ -1019,13 +1020,11 @@ void SV_FinalMessage (char *message, bool reconnect)
|
|||
|
||||
for (i=0, cl = svs.clients ; i<maxclients->value ; i++, cl++)
|
||||
if (cl->state >= cs_connected)
|
||||
Netchan_Transmit (&cl->netchan, net_message.cursize
|
||||
, net_message.data);
|
||||
Netchan_Transmit (&cl->netchan, net_message.cursize, net_message.data);
|
||||
|
||||
for (i=0, cl = svs.clients ; i<maxclients->value ; i++, cl++)
|
||||
if (cl->state >= cs_connected)
|
||||
Netchan_Transmit (&cl->netchan, net_message.cursize
|
||||
, net_message.data);
|
||||
Netchan_Transmit (&cl->netchan, net_message.cursize, net_message.data);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ void SV_WriteSaveFile( char *name )
|
|||
// write lumps
|
||||
SV_AddSaveLump( header, savfile, LUMP_COMMENTS, comment, sizeof(comment));
|
||||
SV_AddCStrLump( header, savfile );
|
||||
SV_AddSaveLump( header, savfile, LUMP_AREASTATE, portalopen, sizeof(portalopen));
|
||||
SV_AddSaveLump( header, savfile, LUMP_AREASTATE, svs.portalopen, sizeof(svs.portalopen));
|
||||
SV_WriteGlobal( header, savfile );
|
||||
SV_AddSaveLump( header, savfile, LUMP_MAPNAME, svs.mapcmd, sizeof(svs.mapcmd));
|
||||
SV_AddCvarLump( header, savfile );
|
||||
|
@ -167,7 +167,7 @@ void Sav_LoadComment( lump_t *l )
|
|||
if (l->filelen % sizeof(*in)) Host_Error("Sav_LoadComment: funny lump size\n" );
|
||||
|
||||
size = l->filelen / sizeof(*in);
|
||||
strncpy(svs.comment, in, size );
|
||||
com.strncpy(svs.comment, in, size );
|
||||
}
|
||||
|
||||
void Sav_LoadCvars( lump_t *l )
|
||||
|
@ -197,7 +197,7 @@ void Sav_LoadMapCmds( lump_t *l )
|
|||
if (l->filelen % sizeof(*in)) Host_Error("Sav_LoadMapCmds: funny lump size\n" );
|
||||
|
||||
size = l->filelen / sizeof(*in);
|
||||
strncpy (svs.mapcmd, in, size );
|
||||
com.strncpy(svs.mapcmd, in, size );
|
||||
}
|
||||
|
||||
void Sav_LoadCfgString( lump_t *l )
|
||||
|
@ -225,8 +225,8 @@ void Sav_LoadAreaPortals( lump_t *l )
|
|||
if (l->filelen % sizeof(*in)) Host_Error("Sav_LoadAreaPortals: funny lump size\n" );
|
||||
|
||||
size = l->filelen / sizeof(*in);
|
||||
Mem_Copy(portalopen, in, size);
|
||||
CM_FloodAreaConnections ();
|
||||
Mem_Copy(svs.portalopen, in, size);
|
||||
CM_FloodAreaConnections();
|
||||
}
|
||||
|
||||
void Sav_LoadGlobal( lump_t *l )
|
||||
|
@ -318,6 +318,8 @@ void SV_ReadSaveFile( char *name )
|
|||
|
||||
SV_InitGame(); // start a new game fresh with new cvars
|
||||
Sav_LoadMapCmds(&header->lumps[LUMP_MAPNAME]);
|
||||
Mem_Free( savfile );
|
||||
CL_Drop();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -353,6 +355,7 @@ void SV_ReadLevelFile( char *name )
|
|||
Sav_LoadAreaPortals(&header->lumps[LUMP_AREASTATE]);
|
||||
Sav_LoadGlobal(&header->lumps[LUMP_GAMESTATE]);
|
||||
Sav_LoadLocals(&header->lumps[LUMP_GAMEENTS]);
|
||||
Mem_Free( savfile );
|
||||
}
|
||||
|
||||
bool Menu_ReadComment( char *comment, int savenum )
|
||||
|
@ -376,7 +379,7 @@ bool Menu_ReadComment( char *comment, int savenum )
|
|||
|
||||
if(id != IDSAVEHEADER || i != SAVE_VERSION)
|
||||
{
|
||||
strncpy( comment, "<corrupted>", MAX_QPATH );
|
||||
com.strncpy( comment, "<corrupted>", MAX_QPATH );
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,272 +6,32 @@
|
|||
#include "engine.h"
|
||||
#include "server.h"
|
||||
|
||||
edict_t *m_pCurrentEntity;
|
||||
studiohdr_t *m_pStudioHeader;
|
||||
mstudiomodel_t *m_pSubModel;
|
||||
mstudiobodyparts_t *m_pBodyPart;
|
||||
matrix3x4 m_pRotationMatrix;
|
||||
vec3_t g_xVertsTransform[MAXSTUDIOVERTS];
|
||||
matrix3x4 g_xBonesTransform[MAXSTUDIOBONES];
|
||||
uint m_BodyCount;
|
||||
|
||||
// mesh buffer
|
||||
vec3_t g_xModelVerts[MAXSTUDIOVERTS];
|
||||
uint iNumVertices = 0;
|
||||
vec3_t *m_pModelVerts;
|
||||
|
||||
void SV_GetBodyCount( void )
|
||||
{
|
||||
if(m_pStudioHeader)
|
||||
{
|
||||
m_pBodyPart = (mstudiobodyparts_t *)((byte *)m_pStudioHeader + m_pStudioHeader->bodypartindex);
|
||||
m_BodyCount = m_pBodyPart->nummodels;
|
||||
}
|
||||
else m_BodyCount = 0; // just reset it
|
||||
}
|
||||
|
||||
int SV_StudioExtractBbox( studiohdr_t *phdr, int sequence, float *mins, float *maxs )
|
||||
{
|
||||
mstudioseqdesc_t *pseqdesc;
|
||||
pseqdesc = (mstudioseqdesc_t *)((byte *)phdr + phdr->seqindex);
|
||||
|
||||
if(sequence == -1) return 0;
|
||||
|
||||
VectorCopy( pseqdesc[ sequence ].bbmin, mins );
|
||||
VectorCopy( pseqdesc[ sequence ].bbmax, maxs );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
byte *SV_GetModelPtr( edict_t *ent )
|
||||
{
|
||||
cmodel_t *cmod;
|
||||
|
||||
cmod = CM_LoadModel( ent );
|
||||
cmod = CM_RegisterModel( sv.configstrings[CS_MODELS + (int)ent->progs.sv->modelindex] );
|
||||
if(!cmod || !cmod->extradata)
|
||||
return NULL;
|
||||
|
||||
return cmod->extradata;
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
StudioCalcBoneQuaterion
|
||||
|
||||
====================
|
||||
*/
|
||||
void SV_StudioCalcBoneQuaterion( mstudiobone_t *pbone, float *q )
|
||||
{
|
||||
int i;
|
||||
vec3_t angle1;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
angle1[i] = pbone->value[i+3];
|
||||
AngleQuaternion( angle1, q );
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
StudioCalcBonePosition
|
||||
|
||||
====================
|
||||
*/
|
||||
void SV_StudioCalcBonePosition( mstudiobone_t *pbone, float *pos )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
pos[i] = pbone->value[i];
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
StudioSetUpTransform
|
||||
|
||||
====================
|
||||
*/
|
||||
void SV_StudioSetUpTransform ( void )
|
||||
{
|
||||
vec3_t mins, maxs, modelpos;
|
||||
|
||||
// clear count
|
||||
iNumVertices = 0;
|
||||
SV_StudioExtractBbox( m_pStudioHeader, 0, mins, maxs );
|
||||
CM_RoundUpHullSize(mins, true );
|
||||
CM_RoundUpHullSize(maxs, true );
|
||||
VectorAdd( mins, maxs, modelpos );
|
||||
VectorScale( modelpos, 0.5, modelpos );
|
||||
|
||||
// setup matrix
|
||||
m_pRotationMatrix[0][0] = 1;
|
||||
m_pRotationMatrix[1][0] = 0;
|
||||
m_pRotationMatrix[2][0] = 0;
|
||||
|
||||
m_pRotationMatrix[0][1] = 0;
|
||||
m_pRotationMatrix[1][1] = 1;
|
||||
m_pRotationMatrix[2][1] = 0;
|
||||
|
||||
m_pRotationMatrix[0][2] = 0;
|
||||
m_pRotationMatrix[1][2] = 0;
|
||||
m_pRotationMatrix[2][2] = -1;
|
||||
|
||||
m_pRotationMatrix[0][3] = modelpos[0];
|
||||
m_pRotationMatrix[1][3] = modelpos[1];
|
||||
m_pRotationMatrix[2][3] = modelpos[2];// ? modelpos[2] : maxs[2];
|
||||
}
|
||||
|
||||
void SV_StudioCalcRotations ( float pos[][3], vec4_t *q )
|
||||
{
|
||||
int i;
|
||||
mstudiobone_t *pbone;
|
||||
|
||||
pbone = (mstudiobone_t *)((byte *)m_pStudioHeader + m_pStudioHeader->boneindex);
|
||||
for (i = 0; i < m_pStudioHeader->numbones; i++, pbone++ )
|
||||
{
|
||||
SV_StudioCalcBoneQuaterion( pbone, q[i] );
|
||||
SV_StudioCalcBonePosition( pbone, pos[i] );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================
|
||||
StudioSetupBones
|
||||
|
||||
====================
|
||||
*/
|
||||
void SV_StudioSetupBones( void )
|
||||
{
|
||||
int i;
|
||||
mstudiobone_t *pbones;
|
||||
static float pos[MAXSTUDIOBONES][3];
|
||||
static vec4_t q[MAXSTUDIOBONES];
|
||||
matrix3x4 bonematrix;
|
||||
|
||||
SV_StudioCalcRotations( pos, q );
|
||||
pbones = (mstudiobone_t *)((byte *)m_pStudioHeader + m_pStudioHeader->boneindex);
|
||||
|
||||
for (i = 0; i < m_pStudioHeader->numbones; i++)
|
||||
{
|
||||
QuaternionMatrix( q[i], bonematrix );
|
||||
|
||||
bonematrix[0][3] = pos[i][0];
|
||||
bonematrix[1][3] = pos[i][1];
|
||||
bonematrix[2][3] = pos[i][2];
|
||||
|
||||
if (pbones[i].parent == -1)
|
||||
R_ConcatTransforms (m_pRotationMatrix, bonematrix, g_xBonesTransform[i]);
|
||||
else R_ConcatTransforms(g_xBonesTransform[pbones[i].parent], bonematrix, g_xBonesTransform[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void SV_StudioSetupModel ( int bodypart, int body )
|
||||
{
|
||||
int index;
|
||||
|
||||
if(bodypart > m_pStudioHeader->numbodyparts) bodypart = 0;
|
||||
m_pBodyPart = (mstudiobodyparts_t *)((byte *)m_pStudioHeader + m_pStudioHeader->bodypartindex) + bodypart;
|
||||
|
||||
index = body / m_pBodyPart->base;
|
||||
index = index % m_pBodyPart->nummodels;
|
||||
m_pSubModel = (mstudiomodel_t *)((byte *)m_pStudioHeader + m_pBodyPart->modelindex) + index;
|
||||
}
|
||||
|
||||
void SV_StudioAddMesh( int mesh )
|
||||
{
|
||||
mstudiomesh_t *pmesh = (mstudiomesh_t *)((byte *)m_pStudioHeader + m_pSubModel->meshindex) + mesh;
|
||||
short *ptricmds = (short *)((byte *)m_pStudioHeader + pmesh->triindex);
|
||||
int i;
|
||||
|
||||
while(i = *(ptricmds++))
|
||||
{
|
||||
for(i = abs(i); i > 0; i--, ptricmds += 4)
|
||||
{
|
||||
m_pModelVerts[iNumVertices][0] = INCH2METER(g_xVertsTransform[ptricmds[0]][0]);
|
||||
m_pModelVerts[iNumVertices][1] = INCH2METER(g_xVertsTransform[ptricmds[0]][1]);
|
||||
m_pModelVerts[iNumVertices][2] = INCH2METER(g_xVertsTransform[ptricmds[0]][2]);
|
||||
iNumVertices++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SV_StudioLookMeshes ( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < m_pSubModel->nummesh; i++)
|
||||
SV_StudioAddMesh( i );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SV_StudioGetVertices( void )
|
||||
{
|
||||
int i;
|
||||
vec3_t *pstudioverts;
|
||||
byte *pvertbone;
|
||||
|
||||
pvertbone = ((byte *)m_pStudioHeader + m_pSubModel->vertinfoindex);
|
||||
pstudioverts = (vec3_t *)((byte *)m_pStudioHeader + m_pSubModel->vertindex);
|
||||
|
||||
for (i = 0; i < m_pSubModel->numverts; i++)
|
||||
{
|
||||
VectorTransform( pstudioverts[i], g_xBonesTransform[pvertbone[i]], g_xVertsTransform[i]);
|
||||
}
|
||||
SV_StudioLookMeshes();
|
||||
}
|
||||
|
||||
float *SV_GetModelVerts( sv_edict_t *ent, int *numvertices )
|
||||
float *SV_GetModelVerts( sv_edict_t *ed, int *numvertices )
|
||||
{
|
||||
cmodel_t *cmod;
|
||||
edict_t *ent;
|
||||
int i;
|
||||
|
||||
m_pCurrentEntity = PRVM_EDICT_NUM(ent->serialnumber);
|
||||
i = (int)m_pCurrentEntity->progs.sv->body;
|
||||
cmod = CM_LoadModel( m_pCurrentEntity );
|
||||
|
||||
if(SV_CreateMeshBuffer( m_pCurrentEntity, cmod ))
|
||||
ent = PRVM_EDICT_NUM(ed->serialnumber);
|
||||
i = (int)ent->progs.sv->body;
|
||||
|
||||
cmod = CM_RegisterModel( sv.configstrings[CS_MODELS + (int)ent->progs.sv->modelindex] );
|
||||
if( cmod && cmod->physmesh[i].verts )
|
||||
{
|
||||
Msg("get physmesh for %s(%s) with index %d(%d)\n", cmod->name, PRVM_GetString(m_pCurrentEntity->progs.sv->model), (int)m_pCurrentEntity->progs.sv->modelindex, ent->serialnumber );
|
||||
*numvertices = cmod->physmesh[i].numverts;
|
||||
return (float *)cmod->physmesh[i].verts;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool SV_CreateMeshBuffer( edict_t *in, cmodel_t *out )
|
||||
{
|
||||
int i, j;
|
||||
|
||||
// validate args
|
||||
if(!in || !out || !out->extradata || in->progs.sv->movetype != MOVETYPE_PHYSIC)
|
||||
return false;
|
||||
|
||||
// setup global pointers
|
||||
m_pStudioHeader = (studiohdr_t *)out->extradata;
|
||||
m_pModelVerts = &g_xModelVerts[0];
|
||||
|
||||
SV_GetBodyCount();
|
||||
|
||||
for( i = 0; i < m_BodyCount; i++)
|
||||
{
|
||||
// already loaded
|
||||
if( out->physmesh[i].verts )
|
||||
continue;
|
||||
|
||||
SV_StudioSetUpTransform();
|
||||
SV_StudioSetupBones();
|
||||
|
||||
for (j = 0; j < m_pStudioHeader->numbodyparts; j++)
|
||||
{
|
||||
SV_StudioSetupModel( j, i );
|
||||
SV_StudioGetVertices();
|
||||
}
|
||||
if( iNumVertices )
|
||||
{
|
||||
out->physmesh[i].verts = Mem_Alloc( out->mempool, iNumVertices * sizeof(vec3_t));
|
||||
Mem_Copy(out->physmesh[i].verts, m_pModelVerts, iNumVertices * sizeof(vec3_t));
|
||||
out->physmesh[i].numverts = iNumVertices;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
|
@ -120,17 +120,22 @@ void SV_SetModel (edict_t *ent, const char *name)
|
|||
{
|
||||
int i;
|
||||
cmodel_t *mod;
|
||||
vec3_t angles;
|
||||
|
||||
i = SV_ModelIndex( name );
|
||||
if(i == 0) return;
|
||||
ent->progs.sv->model = PRVM_SetEngineString(sv.configstrings[CS_MODELS+i]);
|
||||
ent->progs.sv->model = PRVM_SetEngineString( sv.configstrings[CS_MODELS+i] );
|
||||
ent->progs.sv->modelindex = i;
|
||||
|
||||
mod = CM_LoadModel( ent );
|
||||
mod = CM_RegisterModel( name );
|
||||
if( mod ) SV_SetMinMaxSize( ent, mod->mins, mod->maxs, false );
|
||||
|
||||
// setup matrix
|
||||
AngleVectors( ent->progs.sv->angles, ent->progs.sv->m_pmatrix[0], ent->progs.sv->m_pmatrix[1], ent->progs.sv->m_pmatrix[2] );
|
||||
// FIXME: translate angles correctly
|
||||
angles[0] = ent->progs.sv->angles[0] - 90.0f;
|
||||
angles[1] = ent->progs.sv->angles[1];
|
||||
angles[2] = ent->progs.sv->angles[2] + 90.0f;
|
||||
|
||||
AngleVectors( angles, ent->progs.sv->m_pmatrix[0], ent->progs.sv->m_pmatrix[1], ent->progs.sv->m_pmatrix[2] );
|
||||
VectorCopy( ent->progs.sv->origin, ent->progs.sv->m_pmatrix[3] );
|
||||
ConvertPositionToPhysic( ent->progs.sv->m_pmatrix[3] );
|
||||
SV_CreatePhysBody( ent );
|
||||
|
|
|
@ -1222,7 +1222,7 @@ PRVM_ResetProg
|
|||
===============
|
||||
*/
|
||||
|
||||
void PRVM_ResetProg()
|
||||
void PRVM_ResetProg( void )
|
||||
{
|
||||
PRVM_GCALL(reset_cmd)();
|
||||
Mem_FreePool(&prog->progs_mempool);
|
||||
|
@ -1318,7 +1318,7 @@ void PRVM_LoadProgs (const char *filename, int numedfunc, char **ed_func, int nu
|
|||
prog->filecrc = CRC_Block((unsigned char *)prog->progs, filesize);
|
||||
|
||||
// byte swap the header
|
||||
for (i = 0; i < (int)sizeof(*prog->progs)/4; i++) ((int *)prog->progs)[i] = LittleLong(((int *)prog->progs)[i]);
|
||||
SwapBlock((int *)prog->progs, sizeof(*prog->progs));
|
||||
|
||||
switch( prog->progs->version )
|
||||
{
|
||||
|
@ -1590,6 +1590,10 @@ void PRVM_LoadProgs (const char *filename, int numedfunc, char **ed_func, int nu
|
|||
case OP_DIV_F:
|
||||
case OP_BITAND:
|
||||
case OP_BITOR:
|
||||
case OP_BITSET:
|
||||
case OP_BITSETP:
|
||||
case OP_BITCLR:
|
||||
case OP_BITCLRP:
|
||||
case OP_GE:
|
||||
case OP_LE:
|
||||
case OP_GT:
|
||||
|
@ -1613,6 +1617,33 @@ void PRVM_LoadProgs (const char *filename, int numedfunc, char **ed_func, int nu
|
|||
case OP_LOAD_S:
|
||||
case OP_LOAD_FNC:
|
||||
case OP_LOAD_V:
|
||||
case OP_LOADA_F:
|
||||
case OP_LOADA_V:
|
||||
case OP_LOADA_S:
|
||||
case OP_LOADA_ENT:
|
||||
case OP_LOADA_FLD:
|
||||
case OP_LOADA_FNC:
|
||||
case OP_LOADA_I:
|
||||
case OP_LE_I:
|
||||
case OP_GE_I:
|
||||
case OP_LT_I:
|
||||
case OP_GT_I:
|
||||
case OP_LE_IF:
|
||||
case OP_GE_IF:
|
||||
case OP_LT_IF:
|
||||
case OP_GT_IF:
|
||||
case OP_LE_FI:
|
||||
case OP_GE_FI:
|
||||
case OP_LT_FI:
|
||||
case OP_GT_FI:
|
||||
case OP_EQ_IF:
|
||||
case OP_EQ_FI:
|
||||
case OP_CONV_ITOF:
|
||||
case OP_CONV_FTOI:
|
||||
case OP_CP_ITOF:
|
||||
case OP_CP_FTOI:
|
||||
case OP_GLOBAL_ADD:
|
||||
case OP_POINTER_ADD:
|
||||
if((word) st->a >= prog->progs->numglobals || (word) st->b >= prog->progs->numglobals || (word)st->c >= prog->progs->numglobals)
|
||||
PRVM_ERROR("PRVM_LoadProgs: out of bounds global index (statement %d)", i);
|
||||
break;
|
||||
|
@ -1639,6 +1670,20 @@ void PRVM_LoadProgs (const char *filename, int numedfunc, char **ed_func, int nu
|
|||
case OP_STATE:
|
||||
case OP_STOREP_V:
|
||||
case OP_STORE_V:
|
||||
case OP_MULSTORE_F:
|
||||
case OP_MULSTORE_V:
|
||||
case OP_MULSTOREP_F:
|
||||
case OP_MULSTOREP_V:
|
||||
case OP_DIVSTORE_F:
|
||||
case OP_DIVSTOREP_F:
|
||||
case OP_ADDSTORE_F:
|
||||
case OP_ADDSTORE_V:
|
||||
case OP_ADDSTOREP_F:
|
||||
case OP_ADDSTOREP_V:
|
||||
case OP_SUBSTORE_F:
|
||||
case OP_SUBSTORE_V:
|
||||
case OP_SUBSTOREP_F:
|
||||
case OP_SUBSTOREP_V:
|
||||
if ((word) st->a >= prog->progs->numglobals || (word) st->b >= prog->progs->numglobals)
|
||||
Host_Error("PRVM_LoadProgs: out of bounds global index (statement %d) in %s", i, PRVM_NAME);
|
||||
break;
|
||||
|
@ -1987,7 +2032,7 @@ void _PRVM_FreeAll(const char *filename, int fileline)
|
|||
prog->progs = NULL;
|
||||
prog->fielddefs = NULL;
|
||||
prog->functions = NULL;
|
||||
com.clearpool(prog->progs_mempool, filename, fileline);
|
||||
com.clearpool( prog->progs_mempool, filename, fileline);
|
||||
}
|
||||
|
||||
// LordHavoc: turned PRVM_EDICT_NUM into a #define for speed reasons
|
||||
|
@ -2026,7 +2071,7 @@ int PRVM_SetEngineString(const char *s)
|
|||
if (prog->knownstrings[i] == s)
|
||||
return -1 - i;
|
||||
// new unknown engine string
|
||||
MsgDev(D_NOTE, "new engine string %p\n", s );
|
||||
MsgDev(D_MEMORY, "new engine string %p\n", s );
|
||||
for (i = prog->firstfreeknownstring;i < prog->numknownstrings;i++)
|
||||
if (!prog->knownstrings[i])
|
||||
break;
|
||||
|
|
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
After Width: | Height: | Size: 9.4 KiB |
|
@ -30,8 +30,14 @@ physbody_t *Phys_CreateBody( sv_edict_t *ed, void *buffer, matrix4x3 transform,
|
|||
|
||||
if( solid == SOLID_BOX )
|
||||
{
|
||||
CM_RoundUpHullSize( mins, false );
|
||||
CM_RoundUpHullSize( maxs, false );
|
||||
CM_RoundUpHullSize( mins );
|
||||
CM_RoundUpHullSize( maxs );
|
||||
}
|
||||
else if( solid == SOLID_CYLINDER )
|
||||
{
|
||||
// barrel always stay on top side
|
||||
VectorSet( vec3_angles, 90.0f, 0.0f, 0.0f );
|
||||
AngleVectors( vec3_angles, offset[0], offset[2], offset[1] );
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -64,7 +70,7 @@ physbody_t *Phys_CreateBody( sv_edict_t *ed, void *buffer, matrix4x3 transform,
|
|||
col = NewtonCreateSphere( gWorld, size[0]/2, size[1]/2, size[2]/2, &offset[0][0] );
|
||||
break;
|
||||
case SOLID_CYLINDER:
|
||||
col = NewtonCreateCylinder( gWorld, size[0], size[1], &offset[0][0] );
|
||||
col = NewtonCreateCylinder( gWorld, size[1]/2, size[2], &offset[0][0] );
|
||||
break;
|
||||
case SOLID_MESH:
|
||||
vertices = pi.GetModelVerts( ed, &numvertices );
|
||||
|
|
|
@ -18,7 +18,7 @@ void* Palloc (int size )
|
|||
|
||||
void Pfree (void *ptr, int size )
|
||||
{
|
||||
Mem_Free( ptr );
|
||||
if( ptr ) Mem_Free( ptr );
|
||||
}
|
||||
|
||||
void Phys_Frame( float time )
|
||||
|
|
|
@ -155,11 +155,11 @@ void misc_physbox ( void )
|
|||
|
||||
void misc_barrel( void )
|
||||
{
|
||||
string name = "models/barrel1.mdl";
|
||||
string name = "models/barrel2.mdl";
|
||||
|
||||
precache_model( name );
|
||||
pev->owner = pev;
|
||||
pev->solid = SOLID_MESH; //test
|
||||
pev->solid = SOLID_CYLINDER; //test
|
||||
pev->movetype = MOVETYPE_PHYSIC;
|
||||
setmodel (pev, name );
|
||||
}
|
||||
|
@ -177,11 +177,13 @@ void misc_sphere( void )
|
|||
|
||||
void item_healthkit( void )
|
||||
{
|
||||
precache_model( "models/w_medkit.mdl" );
|
||||
pev->model = "models/w_medkit.mdl";
|
||||
|
||||
precache_model( pev->model );
|
||||
pev->owner = pev;
|
||||
pev->solid = SOLID_MESH;
|
||||
pev->movetype = MOVETYPE_PHYSIC;
|
||||
setmodel (pev, "models/w_medkit.mdl" );
|
||||
setmodel (pev, pev->model );
|
||||
}
|
||||
|
||||
void env_sprite( void )
|
||||
|
|
|
@ -933,7 +933,7 @@ _inline int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, cplane_t *p)
|
|||
#define HULL_PRECISION 4
|
||||
static word hull_table[] = { 0, 4, 8, 16, 18, 24, 28, 30, 32, 40, 48, 54, 56, 60, 64, 72, 80, 112, 120, 128, 140, 176 };
|
||||
|
||||
_inline void CM_RoundUpHullSize( vec3_t size, bool down )
|
||||
_inline void CM_RoundUpHullSize( vec3_t size )
|
||||
{
|
||||
int i, j;
|
||||
|
||||
|
@ -942,7 +942,7 @@ _inline void CM_RoundUpHullSize( vec3_t size, bool down )
|
|||
bool negative = false;
|
||||
float result, value;
|
||||
|
||||
value = down ? floor(size[i]) : ceil(size[i]); // round it
|
||||
value = ceil(size[i] + 0.5f); // round it
|
||||
if(value < 0) negative = true;
|
||||
value = fabs( value ); // make positive
|
||||
|
||||
|
|
|
@ -657,6 +657,7 @@ BRUSH MODELS
|
|||
#define MAX_MAP_COLLISION 0x800000
|
||||
#define MAX_MAP_STRINGDATA 0x40000
|
||||
#define MAX_MAP_NUMSTRINGS 0x10000
|
||||
#define MAX_MODELS MAX_MAP_MODELS>>1 // brushmodels and other models
|
||||
|
||||
// lump offset
|
||||
#define LUMP_ENTITIES 0
|
||||
|
@ -1069,8 +1070,8 @@ enum op_state
|
|||
OP_RANDV2,
|
||||
|
||||
OP_SWITCH_F, // switches
|
||||
OP_SWITCH_V, // 100
|
||||
OP_SWITCH_S,
|
||||
OP_SWITCH_V,
|
||||
OP_SWITCH_S, // 100
|
||||
OP_SWITCH_E,
|
||||
OP_SWITCH_FNC,
|
||||
|
||||
|
@ -1082,8 +1083,8 @@ enum op_state
|
|||
OP_STORE_FI,
|
||||
|
||||
OP_ADD_I,
|
||||
OP_ADD_FI, // 110
|
||||
OP_ADD_IF,
|
||||
OP_ADD_FI,
|
||||
OP_ADD_IF, // 110
|
||||
|
||||
OP_SUB_I,
|
||||
OP_SUB_FI,
|
||||
|
@ -1094,8 +1095,8 @@ enum op_state
|
|||
OP_CP_ITOF,
|
||||
OP_CP_FTOI,
|
||||
OP_LOAD_I,
|
||||
OP_STOREP_I, // 120
|
||||
OP_STOREP_IF,
|
||||
OP_STOREP_I,
|
||||
OP_STOREP_IF, // 120
|
||||
OP_STOREP_FI,
|
||||
|
||||
OP_BITAND_I,
|
||||
|
@ -1107,9 +1108,9 @@ enum op_state
|
|||
OP_NE_I,
|
||||
|
||||
OP_IFNOTS,
|
||||
OP_IFS, // 130
|
||||
OP_IFS,
|
||||
|
||||
OP_NOT_I,
|
||||
OP_NOT_I, // 130
|
||||
|
||||
OP_DIV_VF,
|
||||
|
||||
|
@ -1122,8 +1123,8 @@ enum op_state
|
|||
|
||||
OP_LOADA_F,
|
||||
OP_LOADA_V,
|
||||
OP_LOADA_S, // 140
|
||||
OP_LOADA_ENT,
|
||||
OP_LOADA_S,
|
||||
OP_LOADA_ENT, // 140
|
||||
OP_LOADA_FLD,
|
||||
OP_LOADA_FNC,
|
||||
OP_LOADA_I,
|
||||
|
@ -1134,8 +1135,8 @@ enum op_state
|
|||
OP_LOADP_F,
|
||||
OP_LOADP_V,
|
||||
OP_LOADP_S,
|
||||
OP_LOADP_ENT, // 150
|
||||
OP_LOADP_FLD,
|
||||
OP_LOADP_ENT,
|
||||
OP_LOADP_FLD, // 150
|
||||
OP_LOADP_FNC,
|
||||
OP_LOADP_I,
|
||||
|
||||
|
@ -1170,8 +1171,8 @@ enum op_state
|
|||
OP_DIV_FI,
|
||||
OP_BITAND_IF,
|
||||
OP_BITOR_IF,
|
||||
OP_BITAND_FI, // 180
|
||||
OP_BITOR_FI,
|
||||
OP_BITAND_FI,
|
||||
OP_BITOR_FI, // 180
|
||||
OP_AND_I,
|
||||
OP_OR_I,
|
||||
OP_AND_IF,
|
||||
|
@ -1181,8 +1182,8 @@ enum op_state
|
|||
OP_NE_IF,
|
||||
OP_NE_FI,
|
||||
|
||||
OP_GSTOREP_I, // 190
|
||||
OP_GSTOREP_F,
|
||||
OP_GSTOREP_I,
|
||||
OP_GSTOREP_F, // 190
|
||||
OP_GSTOREP_ENT,
|
||||
OP_GSTOREP_FLD, // integers
|
||||
OP_GSTOREP_S,
|
||||
|
@ -1191,8 +1192,8 @@ enum op_state
|
|||
OP_GADDRESS,
|
||||
OP_GLOAD_I,
|
||||
OP_GLOAD_F,
|
||||
OP_GLOAD_FLD, // 200
|
||||
OP_GLOAD_ENT,
|
||||
OP_GLOAD_FLD,
|
||||
OP_GLOAD_ENT, // 200
|
||||
OP_GLOAD_S,
|
||||
OP_GLOAD_FNC,
|
||||
OP_GLOAD_V,
|
||||
|
@ -1371,9 +1372,9 @@ typedef struct cmesh_s
|
|||
|
||||
typedef struct cmodel_s
|
||||
{
|
||||
int modidx; // edict index
|
||||
char name[64]; // model name
|
||||
string name; // model name
|
||||
byte *mempool; // personal mempool
|
||||
int registration_sequence;
|
||||
|
||||
vec3_t mins, maxs; // boundbox
|
||||
int headnode; // bsp info
|
||||
|
|
|
@ -211,7 +211,6 @@ extern cvar_t *gl_vertex_arrays;
|
|||
|
||||
extern cvar_t *gl_ext_swapinterval;
|
||||
extern cvar_t *gl_ext_multitexture;
|
||||
extern cvar_t *gl_ext_pointparameters;
|
||||
extern cvar_t *gl_ext_compiled_vertex_array;
|
||||
|
||||
extern cvar_t *gl_particle_min_size;
|
||||
|
@ -444,9 +443,6 @@ typedef struct
|
|||
int stencil_warp;
|
||||
int stencil_two_side;
|
||||
int ati_separate_stencil;
|
||||
bool nv_tex_rectangle;
|
||||
bool ati_tex_rectangle;
|
||||
|
||||
vec4_t draw_color; // using with Draw_* functions
|
||||
|
||||
} glstate_t;
|
||||
|
|
|
@ -31,15 +31,14 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer);
|
|||
model_t *Mod_LoadModel (model_t *mod, bool crash);
|
||||
|
||||
byte mod_novis[MAX_MAP_LEAFS/8];
|
||||
|
||||
#define MAX_MOD_KNOWN 512
|
||||
model_t mod_known[MAX_MOD_KNOWN];
|
||||
model_t mod_known[MAX_MODELS];
|
||||
model_t mod_inline[MAX_MODELS];
|
||||
int mod_numknown;
|
||||
|
||||
// the inline * models from the current map are kept seperate
|
||||
model_t mod_inline[MAX_MOD_KNOWN];
|
||||
|
||||
int registration_sequence;
|
||||
|
||||
int registration_sequence;
|
||||
|
||||
const char *Mod_GetStringFromTable( int index )
|
||||
{
|
||||
|
@ -68,10 +67,8 @@ mleaf_t *Mod_PointInLeaf (vec3_t p, model_t *model)
|
|||
return (mleaf_t *)node;
|
||||
plane = node->plane;
|
||||
d = DotProduct (p,plane->normal) - plane->dist;
|
||||
if (d > 0)
|
||||
node = node->children[0];
|
||||
else
|
||||
node = node->children[1];
|
||||
if (d > 0) node = node->children[0];
|
||||
else node = node->children[1];
|
||||
}
|
||||
|
||||
return NULL; // never reached
|
||||
|
@ -130,10 +127,8 @@ Mod_ClusterPVS
|
|||
*/
|
||||
byte *Mod_ClusterPVS (int cluster, model_t *model)
|
||||
{
|
||||
if (cluster == -1 || !model->vis)
|
||||
return mod_novis;
|
||||
return Mod_DecompressVis ( (byte *)model->vis + model->vis->bitofs[cluster][DVIS_PVS],
|
||||
model);
|
||||
if (cluster == -1 || !model->vis) return mod_novis;
|
||||
return Mod_DecompressVis ( (byte *)model->vis + model->vis->bitofs[cluster][DVIS_PVS], model);
|
||||
}
|
||||
|
||||
|
||||
|
@ -220,11 +215,14 @@ model_t *Mod_ForName(char *name, bool crash)
|
|||
}
|
||||
if (i == mod_numknown)
|
||||
{
|
||||
if (mod_numknown == MAX_MOD_KNOWN)
|
||||
Sys_Error ("mod_numknown == MAX_MOD_KNOWN");
|
||||
if (mod_numknown == MAX_MODELS)
|
||||
{
|
||||
MsgWarn("Mod_ForName: MAX_MODELS limit exceeded\n" );
|
||||
return NULL;
|
||||
}
|
||||
mod_numknown++;
|
||||
}
|
||||
strcpy (mod->name, name);
|
||||
com.strncpy( mod->name, name, MAX_STRING );
|
||||
|
||||
// load the file
|
||||
buf = (uint *)FS_LoadFile (mod->name, &modfilelen);
|
||||
|
@ -301,7 +299,7 @@ void Mod_LoadStringData( lump_t *l )
|
|||
{
|
||||
if (!l->filelen)
|
||||
{
|
||||
loadmodel->lightdata = NULL;
|
||||
loadmodel->stringdata = NULL;
|
||||
return;
|
||||
}
|
||||
loadmodel->stringdata = (char *)Mem_Alloc( loadmodel->mempool, l->filelen );
|
||||
|
@ -334,9 +332,6 @@ void Mod_LoadVisibility (lump_t *l)
|
|||
loadmodel->vis = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
//TODO: calculate fast visibility from leafs
|
||||
|
||||
loadmodel->vis = Mem_Alloc( loadmodel->mempool, l->filelen);
|
||||
memcpy (loadmodel->vis, mod_base + l->fileofs, l->filelen);
|
||||
|
||||
|
@ -988,7 +983,7 @@ void R_BeginRegistration (char *model)
|
|||
// explicitly free the old map if different
|
||||
// this guarantees that mod_known[0] is the world map
|
||||
flushmap = Cvar_Get ("flushmap", "0", 0);
|
||||
if(strcmp(mod_known[0].name, fullname) || flushmap->value)
|
||||
if(com.strcmp(mod_known[0].name, fullname) || flushmap->value)
|
||||
{
|
||||
Mod_Free (&mod_known[0]);
|
||||
}
|
||||
|
@ -1050,10 +1045,7 @@ void R_EndRegistration (void)
|
|||
{
|
||||
if (!mod->name[0]) continue;
|
||||
if (mod->registration_sequence != registration_sequence)
|
||||
{
|
||||
Msg("free %s\n", mod->name );
|
||||
Mod_Free (mod);
|
||||
}
|
||||
}
|
||||
R_ImageFreeUnused();
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ typedef enum {mod_bad, mod_brush, mod_studio, mod_sprite } modtype_t;
|
|||
|
||||
typedef struct model_s
|
||||
{
|
||||
char name[MAX_QPATH];
|
||||
string name;
|
||||
|
||||
int registration_sequence;
|
||||
|
||||
|
|
|
@ -114,7 +114,6 @@ cvar_t *r_minimap_style;
|
|||
|
||||
cvar_t *gl_ext_swapinterval;
|
||||
cvar_t *gl_ext_multitexture;
|
||||
cvar_t *gl_ext_pointparameters;
|
||||
cvar_t *gl_ext_compiled_vertex_array;
|
||||
cvar_t *r_motionblur_intens;
|
||||
cvar_t *r_motionblur;
|
||||
|
@ -258,7 +257,7 @@ void R_DrawEntitiesOnList (void)
|
|||
currentmodel = currententity->model;
|
||||
if (!currentmodel)
|
||||
{
|
||||
R_DrawNullModel ();
|
||||
R_DrawNullModel();
|
||||
continue;
|
||||
}
|
||||
switch (currentmodel->type)
|
||||
|
@ -386,7 +385,7 @@ R_DrawParticles
|
|||
*/
|
||||
void R_DrawParticles (void)
|
||||
{
|
||||
if ( gl_ext_pointparameters->value && qglPointParameterfEXT )
|
||||
if( qglPointParameterfEXT )
|
||||
{
|
||||
int i;
|
||||
unsigned char color[4];
|
||||
|
@ -832,9 +831,6 @@ void R_SetGL2D( void )
|
|||
GL_DisableAlphaTest();
|
||||
GL_EnableBlend();
|
||||
|
||||
if (gl_state.nv_tex_rectangle ) gl_state.tex_rectangle_type = GL_TEXTURE_RECTANGLE_NV;
|
||||
if (gl_state.ati_tex_rectangle) gl_state.tex_rectangle_type = GL_TEXTURE_RECTANGLE_EXT;
|
||||
|
||||
if(!r_motionblur->value && v_blend[3])
|
||||
{
|
||||
qglDisable (GL_TEXTURE_2D);
|
||||
|
@ -854,7 +850,7 @@ void R_SetGL2D( void )
|
|||
}
|
||||
else if (r_motionblur->value && (r_newrefdef.rdflags & RDF_PAIN))
|
||||
{
|
||||
if(!gl_state.nv_tex_rectangle && !gl_state.ati_tex_rectangle) return;
|
||||
if(!gl_state.tex_rectangle_type) return;
|
||||
if (blurtex)
|
||||
{
|
||||
GL_TexEnv(GL_MODULATE);
|
||||
|
@ -879,12 +875,12 @@ void R_SetGL2D( void )
|
|||
qglVertex2f(0,r_height->integer);
|
||||
qglEnd();
|
||||
|
||||
qglDisable(gl_state.tex_rectangle_type);
|
||||
qglEnable(GL_TEXTURE_2D);
|
||||
qglDisable( gl_state.tex_rectangle_type );
|
||||
qglEnable( GL_TEXTURE_2D );
|
||||
}
|
||||
if (!blurtex) qglGenTextures(1,&blurtex);
|
||||
qglBindTexture(gl_state.tex_rectangle_type,blurtex);
|
||||
qglCopyTexImage2D(gl_state.tex_rectangle_type,0,GL_RGB,0,0,r_width->integer,r_height->integer,0);
|
||||
if(!blurtex) qglGenTextures(1,&blurtex);
|
||||
qglBindTexture( gl_state.tex_rectangle_type, blurtex );
|
||||
qglCopyTexImage2D( gl_state.tex_rectangle_type, 0, GL_RGB, 0, 0, r_width->integer, r_height->integer, 0 );
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
}
|
||||
|
@ -1040,7 +1036,6 @@ void R_Register( void )
|
|||
|
||||
gl_ext_swapinterval = Cvar_Get( "gl_ext_swapinterval", "1", CVAR_ARCHIVE );
|
||||
gl_ext_multitexture = Cvar_Get( "gl_ext_multitexture", "1", CVAR_ARCHIVE );
|
||||
gl_ext_pointparameters = Cvar_Get( "gl_ext_pointparameters", "1", CVAR_ARCHIVE );
|
||||
gl_ext_compiled_vertex_array = Cvar_Get( "gl_ext_compiled_vertex_array", "1", CVAR_ARCHIVE );
|
||||
|
||||
gl_drawbuffer = Cvar_Get( "gl_drawbuffer", "GL_BACK", 0 );
|
||||
|
@ -1118,10 +1113,7 @@ R_Init
|
|||
*/
|
||||
int R_Init( void *hinstance, void *hWnd )
|
||||
{
|
||||
char renderer_buffer[1000];
|
||||
char vendor_buffer[1000];
|
||||
int err;
|
||||
int j;
|
||||
int j, err;
|
||||
extern float r_turbsin[256];
|
||||
|
||||
r_temppool = Mem_AllocPool( "Render Memory" );
|
||||
|
@ -1157,162 +1149,95 @@ int R_Init( void *hinstance, void *hWnd )
|
|||
}
|
||||
|
||||
// get our various GL strings
|
||||
gl_config.vendor_string = qglGetString (GL_VENDOR);
|
||||
MsgDev(D_INFO, "GL_VENDOR: %s\n", gl_config.vendor_string );
|
||||
gl_config.vendor_string = qglGetString( GL_VENDOR );
|
||||
gl_config.renderer_string = qglGetString (GL_RENDERER);
|
||||
MsgDev(D_INFO, "GL_RENDERER: %s\n", gl_config.renderer_string );
|
||||
gl_config.version_string = qglGetString (GL_VERSION);
|
||||
MsgDev(D_INFO, "GL_VERSION: %s\n", gl_config.version_string );
|
||||
gl_config.extensions_string = qglGetString (GL_EXTENSIONS);
|
||||
MsgDev(D_INFO, "GL_EXTENSIONS: %s\n", gl_config.extensions_string );
|
||||
|
||||
strcpy( renderer_buffer, gl_config.renderer_string );
|
||||
strlwr( renderer_buffer );
|
||||
|
||||
strcpy( vendor_buffer, gl_config.vendor_string );
|
||||
strlwr( vendor_buffer );
|
||||
MsgDev(D_INFO, "Video: %s\n", gl_config.renderer_string );
|
||||
|
||||
if ( strstr( renderer_buffer, "voodoo" ) )
|
||||
if(stristr( gl_config.renderer_string, "voodoo" ))
|
||||
gl_config.renderer = GL_RENDERER_VOODOO;
|
||||
if ( strstr( vendor_buffer, "ati" ) )
|
||||
else if(stristr( gl_config.vendor_string, "ati" ))
|
||||
gl_config.renderer = GL_RENDERER_ATI;
|
||||
else if ( strstr( vendor_buffer, "nvidia" ) )
|
||||
else if(stristr( gl_config.vendor_string, "nvidia" ))
|
||||
gl_config.renderer = GL_RENDERER_ATI;
|
||||
else gl_config.renderer = GL_RENDERER_DEFAULT;
|
||||
|
||||
gl_config.allow_cds = true;
|
||||
|
||||
/*
|
||||
** grab extensions
|
||||
*/
|
||||
if ( strstr( gl_config.extensions_string, "GL_EXT_compiled_vertex_array" ) || strstr( gl_config.extensions_string, "GL_SGI_compiled_vertex_array" ) )
|
||||
// grab extensions
|
||||
if( stristr( gl_config.extensions_string, "GL_EXT_compiled_vertex_array" ) || stristr( gl_config.extensions_string, "GL_SGI_compiled_vertex_array" ))
|
||||
{
|
||||
MsgDev(D_INFO, "...enabling GL_EXT_compiled_vertex_array\n" );
|
||||
qglLockArraysEXT = ( void * ) qwglGetProcAddress( "glLockArraysEXT" );
|
||||
qglUnlockArraysEXT = ( void * ) qwglGetProcAddress( "glUnlockArraysEXT" );
|
||||
}
|
||||
else MsgDev(D_WARN, "...GL_EXT_compiled_vertex_array not found\n" );
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "WGL_EXT_swap_control" ) )
|
||||
{
|
||||
qwglSwapIntervalEXT = ( BOOL (WINAPI *)(int)) qwglGetProcAddress( "wglSwapIntervalEXT" );
|
||||
MsgDev(D_INFO, "...enabling WGL_EXT_swap_control\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...WGL_EXT_swap_control not found\n" );
|
||||
qglLockArraysEXT = (void *)qwglGetProcAddress( "glLockArraysEXT" );
|
||||
qglUnlockArraysEXT = (void *)qwglGetProcAddress( "glUnlockArraysEXT" );
|
||||
}
|
||||
|
||||
if (strstr( gl_config.extensions_string, "GL_ARB_texture_compression" ))
|
||||
if( stristr( gl_config.extensions_string, "WGL_EXT_swap_control" ) )
|
||||
{
|
||||
if (strstr( gl_config.extensions_string, "GL_EXT_texture_compression_s3tc" ))
|
||||
qwglSwapIntervalEXT = (bool(_stdcall *)(int))qwglGetProcAddress( "wglSwapIntervalEXT" );
|
||||
}
|
||||
|
||||
if( stristr( gl_config.extensions_string, "GL_ARB_texture_compression" ))
|
||||
{
|
||||
if(stristr( gl_config.extensions_string, "GL_EXT_texture_compression_s3tc" ))
|
||||
{
|
||||
qglCompressedTexImage2D = ( void *)qwglGetProcAddress("glCompressedTexImage2DARB");
|
||||
qglGetCompressedTexImage = ( void *)qwglGetProcAddress("glGetCompressedTexImageARB");
|
||||
qglCompressedTexImage2D = (void *)qwglGetProcAddress( "glCompressedTexImage2DARB" );
|
||||
qglGetCompressedTexImage = (void *)qwglGetProcAddress( "glGetCompressedTexImageARB" );
|
||||
}
|
||||
|
||||
if (qglCompressedTexImage2D && qglGetCompressedTexImage)
|
||||
gl_config.arb_compressed_teximage = true;
|
||||
else gl_config.arb_compressed_teximage = false;
|
||||
}
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) )
|
||||
if( stristr( gl_config.extensions_string, "GL_EXT_point_parameters" ) )
|
||||
{
|
||||
if ( gl_ext_pointparameters->value )
|
||||
{
|
||||
qglPointParameterfEXT = ( void (APIENTRY *)( GLenum, GLfloat ) ) qwglGetProcAddress( "glPointParameterfEXT" );
|
||||
qglPointParameterfvEXT = ( void (APIENTRY *)( GLenum, const GLfloat * ) ) qwglGetProcAddress( "glPointParameterfvEXT" );
|
||||
MsgDev(D_INFO, "...using GL_EXT_point_parameters\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_INFO, "...ignoring GL_EXT_point_parameters\n" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...GL_EXT_point_parameters not found\n" );
|
||||
qglPointParameterfEXT = (void *)qwglGetProcAddress( "glPointParameterfEXT" );
|
||||
qglPointParameterfvEXT = (void *)qwglGetProcAddress( "glPointParameterfvEXT" );
|
||||
}
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "GL_ARB_multitexture" ) )
|
||||
if( stristr( gl_config.extensions_string, "GL_ARB_multitexture" ) )
|
||||
{
|
||||
if ( gl_ext_multitexture->value )
|
||||
if( gl_ext_multitexture->value )
|
||||
{
|
||||
MsgDev(D_INFO, "...using GL_ARB_multitexture\n" );
|
||||
qglMTexCoord2fSGIS = ( void * ) qwglGetProcAddress( "glMultiTexCoord2fARB" );
|
||||
qglActiveTextureARB = ( void * ) qwglGetProcAddress( "glActiveTextureARB" );
|
||||
qglClientActiveTextureARB = ( void * ) qwglGetProcAddress( "glClientActiveTextureARB" );
|
||||
qglMTexCoord2fSGIS = (void *)qwglGetProcAddress( "glMultiTexCoord2fARB" );
|
||||
qglActiveTextureARB = (void *)qwglGetProcAddress( "glActiveTextureARB" );
|
||||
qglClientActiveTextureARB = (void *)qwglGetProcAddress( "glClientActiveTextureARB" );
|
||||
GL_TEXTURE0 = GL_TEXTURE0_ARB;
|
||||
GL_TEXTURE1 = GL_TEXTURE1_ARB;
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_INFO, "...ignoring GL_ARB_multitexture\n" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...GL_ARB_multitexture not found\n" );
|
||||
}
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "GL_NV_texture_rectangle" ) )
|
||||
{
|
||||
MsgDev(D_INFO, "...using GL_NV_texture_rectangle\n");
|
||||
gl_state.nv_tex_rectangle = true;
|
||||
}
|
||||
if( stristr( gl_config.extensions_string, "GL_NV_texture_rectangle" ))
|
||||
gl_state.tex_rectangle_type = GL_TEXTURE_RECTANGLE_NV;
|
||||
else if( stristr( gl_config.extensions_string, "GL_EXT_texture_rectangle" ))
|
||||
gl_state.tex_rectangle_type = GL_TEXTURE_RECTANGLE_EXT;
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...GL_NV_texture_rectangle not found\n");
|
||||
gl_state.nv_tex_rectangle = false;
|
||||
MsgDev(D_WARN, "R_Init: rectangle extension not found\n");
|
||||
gl_state.tex_rectangle_type = 0; // no rectangle
|
||||
}
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "GL_EXT_texture_rectangle" ) )
|
||||
if( stristr( gl_config.extensions_string, "GL_SGIS_multitexture" ) )
|
||||
{
|
||||
MsgDev(D_INFO, "...using GL_EXT_texture_rectangle\n");
|
||||
gl_state.ati_tex_rectangle = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...GL_EXT_texture_rectangle not found\n");
|
||||
gl_state.ati_tex_rectangle = false;
|
||||
}
|
||||
|
||||
if ( strstr( gl_config.extensions_string, "GL_SGIS_multitexture" ) )
|
||||
{
|
||||
if ( qglActiveTextureARB )
|
||||
if( !qglActiveTextureARB && gl_ext_multitexture->value )
|
||||
{
|
||||
MsgDev(D_INFO, "...GL_SGIS_multitexture deprecated in favor of ARB_multitexture\n" );
|
||||
}
|
||||
else if ( gl_ext_multitexture->value )
|
||||
{
|
||||
MsgDev(D_INFO, "...using GL_SGIS_multitexture\n" );
|
||||
qglMTexCoord2fSGIS = ( void * ) qwglGetProcAddress( "glMTexCoord2fSGIS" );
|
||||
qglSelectTextureSGIS = ( void * ) qwglGetProcAddress( "glSelectTextureSGIS" );
|
||||
GL_TEXTURE0 = GL_TEXTURE0_SGIS;
|
||||
GL_TEXTURE1 = GL_TEXTURE1_SGIS;
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_INFO, "...ignoring GL_SGIS_multitexture\n" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MsgDev(D_WARN, "...GL_SGIS_multitexture not found\n" );
|
||||
}
|
||||
|
||||
GL_SetDefaultState();
|
||||
|
||||
R_InitTextures();
|
||||
Mod_Init ();
|
||||
R_InitParticleTexture ();
|
||||
Draw_InitLocal ();
|
||||
Mod_Init();
|
||||
R_InitParticleTexture();
|
||||
Draw_InitLocal();
|
||||
R_StudioInit();
|
||||
|
||||
if(!r_framebuffer) r_framebuffer = Z_Malloc(r_width->integer*r_height->integer*3);
|
||||
if(!r_framebuffer) r_framebuffer = Z_Malloc(r_width->integer * r_height->integer * 3);
|
||||
|
||||
err = qglGetError();
|
||||
if ( err != GL_NO_ERROR ) MsgWarn("glGetError = 0x%x\n", err);
|
||||
if ( err != GL_NO_ERROR ) MsgWarn("glGetError = 0x%x\n", err );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1084,8 +1084,10 @@ void R_StudioSetupLighting( void )
|
|||
}
|
||||
else
|
||||
{
|
||||
R_LightPoint (m_pCurrentEntity->origin, m_plightcolor );
|
||||
|
||||
vec3_t light_org;
|
||||
VectorCopy( m_pCurrentEntity->origin, light_org );
|
||||
light_org[2] += 3; // make sure what lightpoint is off thr ground
|
||||
R_LightPoint( light_org, m_plightcolor );
|
||||
if ( m_pCurrentEntity->flags & RF_WEAPONMODEL )
|
||||
r_lightlevel->value = bound(0, VectorLength(m_plightcolor) * 75.0f, 255);
|
||||
|
||||
|
|