14 Jan 2008

This commit is contained in:
g-cont 2008-01-14 00:00:00 +03:00 committed by Alibek Omarov
parent bb5ef5b1d3
commit 3935504d65
38 changed files with 1238 additions and 1464 deletions

View File

@ -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
}

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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();
}

File diff suppressed because it is too large Load Diff

View File

@ -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];
/*

View File

@ -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;

View File

@ -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

View File

@ -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" );
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 );

View File

@ -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;

BIN
launch/bsplib/bsp copy.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -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 );

View File

@ -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 )

View File

@ -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 )

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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();
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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);