mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-22 12:01:25 +00:00
CSQC support changes and some small bugfixes.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@874 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
f4cfc008e1
commit
acde8ade44
41 changed files with 861 additions and 444 deletions
|
@ -2198,6 +2198,89 @@ void CL_LinkPlayers (void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CL_LinkViewModel(void)
|
||||
{
|
||||
entity_t ent;
|
||||
// float ambient[4], diffuse[4];
|
||||
// int j;
|
||||
// int lnum;
|
||||
// vec3_t dist;
|
||||
// float add;
|
||||
// dlight_t *dl;
|
||||
// int ambientlight, shadelight;
|
||||
|
||||
static struct model_s *oldmodel[MAX_SPLITS];
|
||||
static float lerptime[MAX_SPLITS];
|
||||
static int prevframe[MAX_SPLITS];
|
||||
static int oldframe[MAX_SPLITS];
|
||||
|
||||
#ifdef SIDEVIEWS
|
||||
extern qboolean r_secondaryview;
|
||||
if (r_secondaryview==1)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (!r_drawviewmodel.value || !Cam_DrawViewModel(r_refdef.currentplayernum))
|
||||
return;
|
||||
|
||||
#ifdef Q2CLIENT
|
||||
if (cls.q2server)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (!r_drawentities.value)
|
||||
return;
|
||||
|
||||
if (cl.stats[r_refdef.currentplayernum][STAT_ITEMS] & IT_INVISIBILITY)
|
||||
return;
|
||||
|
||||
if (cl.stats[r_refdef.currentplayernum][STAT_HEALTH] <= 0)
|
||||
return;
|
||||
|
||||
memset(&ent, 0, sizeof(ent));
|
||||
|
||||
ent.model = cl.viewent[r_refdef.currentplayernum].model;
|
||||
if (!ent.model)
|
||||
return;
|
||||
|
||||
#ifdef PEXT_SCALE
|
||||
ent.scale = 1;
|
||||
#endif
|
||||
if (r_drawviewmodel.value > 0 && r_drawviewmodel.value < 1)
|
||||
ent.alpha = r_drawviewmodel.value;
|
||||
else
|
||||
ent.alpha = 1;
|
||||
|
||||
ent.frame = cl.viewent[r_refdef.currentplayernum].frame;
|
||||
ent.oldframe = oldframe[r_refdef.currentplayernum];
|
||||
|
||||
if (ent.frame != prevframe[r_refdef.currentplayernum])
|
||||
{
|
||||
oldframe[r_refdef.currentplayernum] = ent.oldframe = prevframe[r_refdef.currentplayernum];
|
||||
lerptime[r_refdef.currentplayernum] = realtime;
|
||||
}
|
||||
prevframe[r_refdef.currentplayernum] = ent.frame;
|
||||
|
||||
if (ent.model != oldmodel[r_refdef.currentplayernum])
|
||||
{
|
||||
oldmodel[r_refdef.currentplayernum] = ent.model;
|
||||
oldframe[r_refdef.currentplayernum] = ent.oldframe = ent.frame;
|
||||
lerptime[r_refdef.currentplayernum] = realtime;
|
||||
}
|
||||
ent.lerptime = 1-(realtime-lerptime[r_refdef.currentplayernum])*10;
|
||||
if (ent.lerptime<0)ent.lerptime=0;
|
||||
if (ent.lerptime>1)ent.lerptime=1;
|
||||
#define Q2RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
|
||||
#define Q2RF_WEAPONMODEL 4 // only draw through eyes
|
||||
#define Q2RF_DEPTHHACK 16 // for view weapon Z crunching
|
||||
|
||||
ent.flags = Q2RF_WEAPONMODEL|Q2RF_DEPTHHACK;
|
||||
|
||||
V_AddEntity(&ent);
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
|
||||
/*
|
||||
|
@ -2401,6 +2484,20 @@ Builds the visedicts array for cl.time
|
|||
Made up of: clients, packet_entities, nails, and tents
|
||||
===============
|
||||
*/
|
||||
void CL_SwapEntityLists(void)
|
||||
{
|
||||
cl_oldnumvisedicts = cl_numvisedicts;
|
||||
cl_oldvisedicts = cl_visedicts;
|
||||
if (cl_visedicts == cl_visedicts_list[0])
|
||||
cl_visedicts = cl_visedicts_list[1];
|
||||
else
|
||||
cl_visedicts = cl_visedicts_list[0];
|
||||
// cl_oldvisedicts = cl_visedicts_list[(cls.netchan.incoming_sequence-1)&1];
|
||||
// cl_visedicts = cl_visedicts_list[cls.netchan.incoming_sequence&1];
|
||||
|
||||
cl_numvisedicts = 0;
|
||||
}
|
||||
|
||||
void CL_EmitEntities (void)
|
||||
{
|
||||
if (cls.state != ca_active)
|
||||
|
@ -2418,17 +2515,9 @@ void CL_EmitEntities (void)
|
|||
if (!cl.validsequence)
|
||||
return;
|
||||
|
||||
cl_oldnumvisedicts = cl_numvisedicts;
|
||||
cl_oldvisedicts = cl_visedicts;
|
||||
if (cl_visedicts == cl_visedicts_list[0])
|
||||
cl_visedicts = cl_visedicts_list[1];
|
||||
else
|
||||
cl_visedicts = cl_visedicts_list[0];
|
||||
// cl_oldvisedicts = cl_visedicts_list[(cls.netchan.incoming_sequence-1)&1];
|
||||
// cl_visedicts = cl_visedicts_list[cls.netchan.incoming_sequence&1];
|
||||
|
||||
cl_numvisedicts = 0;
|
||||
CL_SwapEntityLists();
|
||||
|
||||
CL_LinkViewModel ();
|
||||
CL_LinkPlayers ();
|
||||
CL_LinkPacketEntities ();
|
||||
CL_LinkProjectiles ();
|
||||
|
|
|
@ -2722,22 +2722,13 @@ CL_RequestNextDownload();
|
|||
{
|
||||
CL_SendCmd ();
|
||||
|
||||
if (cl.worldmodel)
|
||||
{
|
||||
//work out which packet entities are solid
|
||||
CL_SetSolidEntities ();
|
||||
if (cls.state == ca_onserver && cl.validsequence && cl.worldmodel)
|
||||
{ // first update is the final signon stage
|
||||
cls.state = ca_active;
|
||||
if (VID_SetWindowCaption)
|
||||
VID_SetWindowCaption(va("FTE QuakeWorld: %s", cls.servername));
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(false);
|
||||
|
||||
// do client side motion prediction
|
||||
CL_PredictMove ();
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(true);
|
||||
|
||||
// build a refresh entity list
|
||||
CL_EmitEntities ();
|
||||
SCR_EndLoadingPlaque();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3627,12 +3627,17 @@ void CL_ParseStuffCmd(char *msg, int destsplit) //this protects stuffcmds from n
|
|||
*msg = '\0';
|
||||
Con_DPrintf("stufftext: %s\n", stufftext);
|
||||
if (!strncmp(stufftext, "fullserverinfo ", 15))
|
||||
Cmd_ExecuteString(stufftext, RESTRICT_SERVER+destsplit);
|
||||
Cmd_ExecuteString(stufftext, RESTRICT_SERVER+destsplit); //do this NOW so that it's done before any models or anything are loaded
|
||||
else
|
||||
{
|
||||
#ifdef CSQC_DAT
|
||||
if (!CSQC_StuffCmd(stufftext))
|
||||
#endif
|
||||
{
|
||||
Cbuf_AddText (stufftext, RESTRICT_SERVER+destsplit);
|
||||
Cbuf_AddText ("\n", RESTRICT_SERVER+destsplit);
|
||||
}
|
||||
}
|
||||
msg++;
|
||||
|
||||
memmove(stufftext, msg, strlen(msg)+1);
|
||||
|
|
|
@ -584,15 +584,6 @@ void CL_PredictMovePNum (int pnum)
|
|||
return;
|
||||
}
|
||||
|
||||
if (cls.state == ca_onserver)
|
||||
{ // first update is the final signon stage
|
||||
cls.state = ca_active;
|
||||
if (VID_SetWindowCaption)
|
||||
VID_SetWindowCaption(va("FTE QuakeWorld: %s", cls.servername));
|
||||
|
||||
SCR_EndLoadingPlaque();
|
||||
}
|
||||
|
||||
// this is the last frame received from the server
|
||||
from = &cl.frames[cl.validsequence & UPDATE_MASK];
|
||||
|
||||
|
|
|
@ -184,6 +184,11 @@ for a few moments
|
|||
*/
|
||||
void SCR_CenterPrint (int pnum, char *str)
|
||||
{
|
||||
#ifdef CSQC_DAT
|
||||
if (CSQC_CenterPrint(str)) //csqc nabbed it.
|
||||
return;
|
||||
#endif
|
||||
|
||||
Q_strncpyz (scr_centerstring[pnum], str, sizeof(scr_centerstring[pnum]));
|
||||
scr_centertime_off[pnum] = scr_centertime.value;
|
||||
scr_centertime_start[pnum] = cl.time;
|
||||
|
@ -1153,8 +1158,8 @@ void SCR_BeginLoadingPlaque (void)
|
|||
|
||||
void SCR_EndLoadingPlaque (void)
|
||||
{
|
||||
if (!scr_initialized)
|
||||
return;
|
||||
// if (!scr_initialized)
|
||||
// return;
|
||||
|
||||
scr_disabled_for_loading = false;
|
||||
scr_fullupdate = 0;
|
||||
|
|
|
@ -344,9 +344,11 @@ void VQ3_AddEntity(const q3refEntity_t *q3)
|
|||
ent.lerpfrac = ent.lerptime = q3->backlerp;
|
||||
ent.alpha = 1;
|
||||
ent.scale = 1;
|
||||
ent.forcedshader = q3->customShader;
|
||||
#ifdef Q3SHADERS
|
||||
ent.forcedshader = (void*)q3->customShader;
|
||||
*(int*)ent.shaderRGBA = *(int*)q3->shaderRGBA;
|
||||
ent.shaderTime = q3->shaderTime;
|
||||
#endif
|
||||
if (q3->renderfx & Q3RF_DEPTHHACK)
|
||||
ent.flags |= Q2RF_DEPTHHACK;
|
||||
if (q3->renderfx & Q3RF_THIRD_PERSON)
|
||||
|
|
|
@ -466,6 +466,9 @@ typedef struct
|
|||
struct model_s *model_precache[MAX_MODELS];
|
||||
struct sfx_s *sound_precache[MAX_SOUNDS];
|
||||
|
||||
char model_csqcname[MAX_CSQCMODELS][MAX_QPATH];
|
||||
struct model_s *model_csqcprecache[MAX_CSQCMODELS];
|
||||
|
||||
char skyname[MAX_QPATH];
|
||||
char levelname[40]; // for display on solo scoreboard
|
||||
int playernum[MAX_SPLITS];
|
||||
|
@ -720,6 +723,38 @@ void CL_ParsePacketEntities (qboolean delta);
|
|||
void CL_SetSolidEntities (void);
|
||||
void CL_ParsePlayerinfo (void);
|
||||
void CL_ParseClientPersist(void);
|
||||
//these last ones are needed for csqc handling of engine-bound ents.
|
||||
void CL_SwapEntityLists(void);
|
||||
void CL_LinkViewModel(void);
|
||||
void CL_LinkPlayers (void);
|
||||
void CL_LinkPacketEntities (void);
|
||||
void CL_LinkProjectiles (void);
|
||||
|
||||
//
|
||||
//clq3_parse.c
|
||||
//
|
||||
#ifdef Q3CLIENT
|
||||
void CLQ3_SendClientCommand(const char *fmt, ...);
|
||||
void CLQ3_SendConnectPacket(netadr_t to);
|
||||
void CLQ3_SendCmd(usercmd_t *cmd);
|
||||
qboolean CLQ3_Netchan_Process(void);
|
||||
void CLQ3_ParseServerMessage (void);
|
||||
qboolean CG_FillQ3Snapshot(int snapnum, struct snapshot_s *snapshot);
|
||||
|
||||
void CG_InsertIntoGameState(int num, char *str);
|
||||
void CG_Restart_f(void);
|
||||
#endif
|
||||
|
||||
//
|
||||
//pr_csqc.c
|
||||
//
|
||||
#ifdef CSQC_DAT
|
||||
void CSQC_Init (void);
|
||||
qboolean CSQC_DrawView(void);
|
||||
void CSQC_Shutdown(void);
|
||||
qboolean CSQC_StuffCmd(char *cmd);
|
||||
qboolean CSQC_CenterPrint(char *cmd);
|
||||
#endif
|
||||
|
||||
//
|
||||
// cl_pred.c
|
||||
|
@ -871,6 +906,7 @@ qboolean CIN_RunCinematic (void);
|
|||
void MVD_Interpolate(void);
|
||||
|
||||
void TP_Init(void);
|
||||
void TP_CheckVars(void);
|
||||
void TP_CheckPickupSound(char *s, vec3_t org);
|
||||
|
||||
void Stats_NewMap(void);
|
||||
|
|
|
@ -28,26 +28,6 @@ float LerpAngle (float a2, float a1, float frac)
|
|||
return a2 + frac * (a1 - a2);
|
||||
}
|
||||
|
||||
|
||||
#define Q2PS_M_TYPE (1<<0)
|
||||
#define Q2PS_M_ORIGIN (1<<1)
|
||||
#define Q2PS_M_VELOCITY (1<<2)
|
||||
#define Q2PS_M_TIME (1<<3)
|
||||
#define Q2PS_M_FLAGS (1<<4)
|
||||
#define Q2PS_M_GRAVITY (1<<5)
|
||||
#define Q2PS_M_DELTA_ANGLES (1<<6)
|
||||
|
||||
#define Q2PS_VIEWOFFSET (1<<7)
|
||||
#define Q2PS_VIEWANGLES (1<<8)
|
||||
#define Q2PS_KICKANGLES (1<<9)
|
||||
#define Q2PS_BLEND (1<<10)
|
||||
#define Q2PS_FOV (1<<11)
|
||||
#define Q2PS_WEAPONINDEX (1<<12)
|
||||
#define Q2PS_WEAPONFRAME (1<<13)
|
||||
#define Q2PS_RDFLAGS (1<<14)
|
||||
|
||||
|
||||
|
||||
// entity_state_t->effects
|
||||
// Effects are things handled on the client side (lights, particles, frame animations)
|
||||
// that happen constantly on the given entity.
|
||||
|
@ -89,37 +69,6 @@ float LerpAngle (float a2, float a1, float frac)
|
|||
#define Q2EF_TRACKERTRAIL 0x80000000
|
||||
//ROGUE
|
||||
|
||||
// entity_state_t->renderfx flags
|
||||
#define Q2RF_MINLIGHT 1 // allways have some light (viewmodel)
|
||||
#define Q2RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
|
||||
#define Q2RF_WEAPONMODEL 4 // only draw through eyes
|
||||
#define Q2RF_FULLBRIGHT 8 // allways draw full intensity
|
||||
#define Q2RF_DEPTHHACK 16 // for view weapon Z crunching
|
||||
#define Q2RF_TRANSLUCENT 32
|
||||
#define Q2RF_FRAMELERP 64
|
||||
#define Q2RF_BEAM 128
|
||||
#define Q2RF_CUSTOMSKIN 256 // skin is an index in image_precache
|
||||
#define Q2RF_GLOW 512 // pulse lighting for bonus items
|
||||
#define Q2RF_SHELL_RED 1024
|
||||
#define Q2RF_SHELL_GREEN 2048
|
||||
#define Q2RF_SHELL_BLUE 4096
|
||||
|
||||
//ROGUE
|
||||
#define Q2RF_IR_VISIBLE 0x00008000 // 32768
|
||||
#define Q2RF_SHELL_DOUBLE 0x00010000 // 65536
|
||||
#define Q2RF_SHELL_HALF_DAM 0x00020000
|
||||
#define Q2RF_USE_DISGUISE 0x00040000
|
||||
//ROGUE
|
||||
|
||||
// player_state_t->refdef flags
|
||||
#define Q2RDF_UNDERWATER 1 // warp the screen as apropriate
|
||||
#define Q2RDF_NOWORLDMODEL 2 // used for player configuration screen
|
||||
|
||||
//ROGUE
|
||||
#define Q2RDF_IRGOGGLES 4
|
||||
#define Q2RDF_UVGOGGLES 8
|
||||
//ROGUE
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -480,6 +480,7 @@ menuedit_t *MC_AddEdit(menu_t *menu, int x, int y, char *text, char *def)
|
|||
n->common.iszone = true;
|
||||
n->common.posx = x;
|
||||
n->common.posy = y;
|
||||
n->modified = true;
|
||||
n->caption = text;
|
||||
Q_strncpyz(n->text, def, sizeof(n->text));
|
||||
|
||||
|
@ -499,6 +500,7 @@ menuedit_t *MC_AddEditCvar(menu_t *menu, int x, int y, char *text, char *name)
|
|||
n->common.posy = y;
|
||||
n->common.width = (strlen(text)+17)*8;
|
||||
n->common.height = 8;
|
||||
n->modified = true;
|
||||
n->caption = (char *)(n+1);
|
||||
strcpy((char *)(n+1), text);
|
||||
n->cvar = cvar;
|
||||
|
@ -811,6 +813,8 @@ void MC_EditBox_Key(menuedit_t *edit, int key)
|
|||
edit->text[len+1] = '\0';
|
||||
}
|
||||
|
||||
edit->modified = true;
|
||||
|
||||
if (edit->cvar)
|
||||
{
|
||||
Cvar_Set(edit->cvar, edit->text);
|
||||
|
|
|
@ -56,6 +56,9 @@ typedef struct {
|
|||
menuedit_t *skinedit;
|
||||
int topcolour;
|
||||
int lowercolour;
|
||||
|
||||
int tiwidth, tiheight;
|
||||
qbyte translationimage[64*64];
|
||||
} setupmenu_t;
|
||||
qboolean ApplySetupMenu (union menuoption_s *option,struct menu_s *menu, int key)
|
||||
{
|
||||
|
@ -119,14 +122,30 @@ void MSetup_TransDraw (int x, int y, menucustom_t *option, menu_t *menu)
|
|||
extern qbyte translationTable[256];
|
||||
setupmenu_t *info = menu->data;
|
||||
mpic_t *p;
|
||||
qbyte *f;
|
||||
|
||||
if (info->skinedit->modified)
|
||||
{
|
||||
info->skinedit->modified = false;
|
||||
|
||||
f = COM_LoadMallocFile (va("gfx/player/%s.lmp", info->skinedit->text));
|
||||
if (!f)
|
||||
f = COM_LoadMallocFile("gfx/menuplyr.lmp");
|
||||
|
||||
if (f)
|
||||
{
|
||||
info->tiwidth = ((int*)f)[0];
|
||||
info->tiheight = ((int*)f)[1];
|
||||
memcpy(info->translationimage, f+8, info->tiwidth*info->tiheight);
|
||||
BZ_Free(f);
|
||||
}
|
||||
}
|
||||
|
||||
p = Draw_CachePic ("gfx/bigbox.lmp");
|
||||
Draw_TransPic (x-12, y-8, p);
|
||||
p = Draw_SafeCachePic (va("gfx/player/%s.lmp", info->skinedit->text));
|
||||
if (!p) //fallback
|
||||
p = Draw_CachePic ("gfx/menuplyr.lmp");
|
||||
|
||||
M_BuildTranslationTable(info->topcolour*16, info->lowercolour*16);
|
||||
Draw_TransPicTranslate (x, y, p, translationTable);
|
||||
Draw_TransPicTranslate (x, y, info->tiwidth, info->tiheight, info->translationimage, translationTable);
|
||||
}
|
||||
|
||||
void M_Menu_Setup_f (void)
|
||||
|
@ -164,6 +183,7 @@ void M_Menu_Setup_f (void)
|
|||
|
||||
info->lowercolour = bottomcolor.value;
|
||||
info->topcolour = topcolor.value;
|
||||
info->skinedit->modified = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -132,11 +132,11 @@ void M_BuildTranslationTable(int top, int bottom)
|
|||
dest[BOTTOM_RANGE+j] = source[bottom+15-j];
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void M_DrawTransPicTranslate (int x, int y, mpic_t *pic)
|
||||
{
|
||||
Draw_TransPicTranslate (x + ((vid.width - 320)>>1), y, pic, translationTable);
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
void M_DrawTextBox (int x, int y, int width, int lines)
|
||||
|
|
|
@ -81,6 +81,7 @@ typedef struct {
|
|||
cvar_t *cvar;
|
||||
char text[MAX_EDIT_LENGTH];
|
||||
int cursorpos;
|
||||
qboolean modified;
|
||||
} menuedit_t;
|
||||
typedef struct {
|
||||
menucommon_t common;
|
||||
|
|
|
@ -30,7 +30,7 @@ extern void (*Draw_Pic) (int x, int y, mpic_t *pic);
|
|||
extern void (*Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic);
|
||||
extern void (*Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height);
|
||||
extern void (*Draw_TransPic) (int x, int y, mpic_t *pic);
|
||||
extern void (*Draw_TransPicTranslate) (int x, int y, mpic_t *pic, qbyte *translation);
|
||||
extern void (*Draw_TransPicTranslate) (int x, int y, int width, int height, qbyte *image, qbyte *translation);
|
||||
extern void (*Draw_ConsoleBackground) (int lines);
|
||||
extern void (*Draw_EditorBackground) (int lines);
|
||||
extern void (*Draw_TileClear) (int x, int y, int w, int h);
|
||||
|
|
|
@ -25,6 +25,8 @@ typedef struct {
|
|||
float lerpfrac;
|
||||
|
||||
float drawmask; //drawentities uses this mask for it.
|
||||
|
||||
string_t model;
|
||||
} csqcentvars_t;
|
||||
|
||||
typedef struct csqcedict_s
|
||||
|
@ -39,11 +41,11 @@ typedef struct csqcedict_s
|
|||
|
||||
void CSQC_InitFields(void)
|
||||
{ //CHANGING THIS FUNCTION REQUIRES CHANGES TO csqcentvars_t
|
||||
#define fieldfloat(name) QC_RegisterFieldVar(csqcprogs, ev_float, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldvector(name) QC_RegisterFieldVar(csqcprogs, ev_vector, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldentity(name) QC_RegisterFieldVar(csqcprogs, ev_entity, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldstring(name) QC_RegisterFieldVar(csqcprogs, ev_string, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldfunction(name) QC_RegisterFieldVar(csqcprogs, ev_function, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldfloat(name) PR_RegisterFieldVar(csqcprogs, ev_float, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldvector(name) PR_RegisterFieldVar(csqcprogs, ev_vector, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldentity(name) PR_RegisterFieldVar(csqcprogs, ev_entity, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldstring(name) PR_RegisterFieldVar(csqcprogs, ev_string, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
#define fieldfunction(name) PR_RegisterFieldVar(csqcprogs, ev_function, #name, (int)&((csqcedict_t*)0)->v.name - (int)&((csqcedict_t*)0)->v, -1)
|
||||
|
||||
fieldfloat(modelindex);
|
||||
fieldvector(origin);
|
||||
|
@ -58,6 +60,8 @@ void CSQC_InitFields(void)
|
|||
fieldfloat(lerpfrac);
|
||||
|
||||
fieldfloat(drawmask);
|
||||
|
||||
fieldstring(model);
|
||||
}
|
||||
|
||||
#define RETURN_SSTRING(s) (*(char **)&((int *)pr_globals)[OFS_RETURN] = PR_SetString(prinst, s)) //static - exe will not change it.
|
||||
|
@ -141,6 +145,8 @@ void PF_CL_drawsetcliparea (progfuncs_t *prinst, struct globalvars_s *pr_globals
|
|||
void PF_CL_drawresetcliparea (progfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void PF_CL_drawgetimagesize (progfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
|
||||
#define MAXTEMPBUFFERLEN 1024
|
||||
|
||||
void PF_fclose_progs (progfuncs_t *prinst);
|
||||
char *PF_VarString (progfuncs_t *prinst, int first, struct globalvars_s *pr_globals);
|
||||
|
||||
|
@ -181,15 +187,24 @@ static void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
|||
entity_t ent;
|
||||
int i;
|
||||
|
||||
if (!cl_visedicts)
|
||||
cl_visedicts = cl_visedicts_list[0];
|
||||
memset(&ent, 0, sizeof(ent));
|
||||
|
||||
i = in->v.modelindex;
|
||||
if (i <= 0 || i >= MAX_MODELS) //whoops, no model, no draw.
|
||||
if (i == 0)
|
||||
return;
|
||||
else if (i > 0 && i < MAX_MODELS)
|
||||
ent.model = cl.model_precache[i];
|
||||
else if (i < 0 && i > -MAX_CSQCMODELS)
|
||||
ent.model = cl.model_csqcprecache[-i];
|
||||
else
|
||||
return; //there might be other ent types later as an extension that stop this.
|
||||
|
||||
ent.model = cl.model_precache[i];
|
||||
if (!ent.model)
|
||||
{
|
||||
Con_Printf("PF_R_AddEntity: model wasn't precached!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
ent.frame = in->v.frame;
|
||||
ent.oldframe = in->v.oldframe;
|
||||
|
@ -227,20 +242,41 @@ static void PF_R_AddEntityMask(progfuncs_t *prinst, struct globalvars_s *pr_glob
|
|||
}
|
||||
}
|
||||
|
||||
if (mask & MASK_ENGINE)
|
||||
if (mask & MASK_ENGINE && cl.worldmodel)
|
||||
{
|
||||
CL_EmitEntities();
|
||||
CL_LinkViewModel ();
|
||||
CL_LinkPlayers ();
|
||||
CL_LinkPacketEntities ();
|
||||
CL_LinkProjectiles ();
|
||||
CL_UpdateTEnts ();
|
||||
}
|
||||
}
|
||||
|
||||
float CalcFov (float fov_x, float width, float height);
|
||||
//float CalcFov (float fov_x, float width, float height);
|
||||
//clear scene, and set up the default stuff.
|
||||
static void PF_R_ClearScene (progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
extern frame_t *view_frame;
|
||||
extern player_state_t *view_message;
|
||||
|
||||
cl_numvisedicts = 0;
|
||||
CL_DecayLights ();
|
||||
|
||||
if (cl.worldmodel)
|
||||
{
|
||||
//work out which packet entities are solid
|
||||
CL_SetSolidEntities ();
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(false);
|
||||
|
||||
// do client side motion prediction
|
||||
CL_PredictMove ();
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(true);
|
||||
}
|
||||
|
||||
CL_SwapEntityLists();
|
||||
|
||||
view_frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK];
|
||||
view_message = &view_frame->playerstate[cl.playernum[0]];
|
||||
|
@ -417,19 +453,24 @@ static void PF_cs_getstatf(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
|||
G_FLOAT(OFS_RETURN) = val;
|
||||
}
|
||||
static void PF_cs_getstati(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
{ //convert an int stat into a qc float.
|
||||
|
||||
int stnum = G_FLOAT(OFS_PARM0);
|
||||
unsigned int val = cl.stats[0][stnum];
|
||||
if (G_FLOAT(OFS_PARM1))
|
||||
G_FLOAT(OFS_RETURN) = (val&(((1<<9)-1)<<23))>>23;
|
||||
int val = cl.stats[0][stnum];
|
||||
if (*prinst->callargc > 1)
|
||||
{
|
||||
int first, count;
|
||||
first = G_FLOAT(OFS_PARM1);
|
||||
count = G_FLOAT(OFS_PARM2);
|
||||
G_FLOAT(OFS_RETURN) = (((unsigned int)val)&(((1<<count)-1)<<first))>>first;
|
||||
}
|
||||
else
|
||||
G_FLOAT(OFS_RETURN) = val&((1<<24)-1);
|
||||
G_FLOAT(OFS_RETURN) = val;
|
||||
}
|
||||
static void PF_cs_getstats(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
int stnum = G_FLOAT(OFS_PARM0);
|
||||
char *out;
|
||||
unsigned int val;
|
||||
|
||||
out = PF_TempStr();
|
||||
|
||||
|
@ -444,14 +485,116 @@ static void PF_cs_getstats(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
|||
RETURN_SSTRING(out);
|
||||
}
|
||||
|
||||
static void PF_CSQC_SetOrigin(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
csqcedict_t *ent = (void*)G_EDICT(prinst, OFS_PARM0);
|
||||
float *org = G_VECTOR(OFS_PARM1);
|
||||
VectorCopy(org, ent->v.origin);
|
||||
|
||||
//fixme: add some sort of fast area grid
|
||||
}
|
||||
|
||||
static int FindModel(char *name, int *free)
|
||||
{
|
||||
int i;
|
||||
|
||||
*free = 0;
|
||||
|
||||
for (i = 1; i < MAX_CSQCMODELS; i++)
|
||||
{
|
||||
if (!*cl.model_csqcname[i])
|
||||
{
|
||||
*free = -i;
|
||||
break;
|
||||
}
|
||||
if (!strcmp(cl.model_csqcname[i], name))
|
||||
return -i;
|
||||
}
|
||||
for (i = 1; i < MAX_MODELS; i++)
|
||||
{
|
||||
if (!strcmp(cl.model_name[i], name))
|
||||
return i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static void PF_CSQC_SetModel(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
csqcedict_t *ent = (void*)G_EDICT(prinst, OFS_PARM0);
|
||||
char *modelname = PR_GetStringOfs(prinst, OFS_PARM1);
|
||||
int freei;
|
||||
int modelindex = FindModel(modelname, &freei);
|
||||
|
||||
if (!modelindex)
|
||||
{
|
||||
if (!freei)
|
||||
Host_EndGame("CSQC ran out of model slots\n");
|
||||
Con_DPrintf("Late caching model \"%s\"\n", modelname);
|
||||
Q_strncpyz(cl.model_csqcname[-freei], modelname, sizeof(cl.model_csqcname[-freei])); //allocate a slot now
|
||||
modelindex = freei;
|
||||
|
||||
cl.model_csqcprecache[-freei] = Mod_ForName(cl.model_csqcname[-freei], false);
|
||||
}
|
||||
|
||||
ent->v.modelindex = modelindex;
|
||||
if (modelindex < 0)
|
||||
ent->v.model = PR_SetString(prinst, cl.model_csqcname[-modelindex]);
|
||||
else
|
||||
ent->v.model = PR_SetString(prinst, cl.model_name[modelindex]);
|
||||
}
|
||||
static void PF_CSQC_SetModelIndex(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
csqcedict_t *ent = (void*)G_EDICT(prinst, OFS_PARM0);
|
||||
int modelindex = G_FLOAT(OFS_PARM1);
|
||||
|
||||
ent->v.modelindex = modelindex;
|
||||
if (modelindex < 0)
|
||||
ent->v.model = PR_SetString(prinst, cl.model_csqcname[-modelindex]);
|
||||
else
|
||||
ent->v.model = PR_SetString(prinst, cl.model_name[modelindex]);
|
||||
}
|
||||
static void PF_CSQC_PrecacheModel(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
char *modelname = PR_GetStringOfs(prinst, OFS_PARM0);
|
||||
int i;
|
||||
for (i = 1; i < MAX_CSQCMODELS; i++)
|
||||
{
|
||||
if (!*cl.model_csqcname[i])
|
||||
break;
|
||||
if (!strcmp(cl.model_csqcname[i], modelname))
|
||||
{
|
||||
cl.model_csqcprecache[i] = Mod_ForName(cl.model_csqcname[i], false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i < MAX_MODELS; i++) //I regret this.
|
||||
{
|
||||
if (!*cl.model_name[i])
|
||||
break;
|
||||
if (!strcmp(cl.model_name[i], modelname))
|
||||
{
|
||||
cl.model_precache[i] = Mod_ForName(cl.model_name[i], false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
static void PF_CSQC_ModelnameForIndex(progfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
int modelindex = G_FLOAT(OFS_PARM0);
|
||||
|
||||
if (modelindex < 0)
|
||||
G_INT(OFS_RETURN) = (int)PR_SetString(prinst, cl.model_csqcname[-modelindex]);
|
||||
else
|
||||
G_INT(OFS_RETURN) = (int)PR_SetString(prinst, cl.model_name[modelindex]);
|
||||
}
|
||||
|
||||
//warning: functions that depend on globals are bad, mkay?
|
||||
builtin_t csqc_builtins[] = {
|
||||
//0
|
||||
PF_Fixme,
|
||||
PF_makevectors,
|
||||
PF_Fixme, //PF_setorigin
|
||||
PF_Fixme, //PF_setmodel
|
||||
PF_CSQC_SetOrigin, //PF_setorigin
|
||||
PF_CSQC_SetModel, //PF_setmodel
|
||||
PF_Fixme, //PF_setsize
|
||||
PF_Fixme,
|
||||
PF_Fixme, //PF_break,
|
||||
|
@ -466,14 +609,14 @@ builtin_t csqc_builtins[] = {
|
|||
PF_Spawn,
|
||||
PF_Fixme, //PF_Remove,
|
||||
PF_Fixme, //PF_traceline,
|
||||
PF_Fixme, //PF_checkclient,
|
||||
PF_Fixme, //PF_checkclient, (don't support)
|
||||
PF_FindString,
|
||||
PF_Fixme, //PF_precache_sound,
|
||||
//20
|
||||
PF_Fixme, //PF_precache_model,
|
||||
PF_Fixme, //PF_stuffcmd,
|
||||
PF_CSQC_PrecacheModel, //PF_precache_model,
|
||||
PF_Fixme, //PF_stuffcmd, (don't support)
|
||||
PF_Fixme, //PF_findradius,
|
||||
PF_Fixme, //PF_bprint,
|
||||
PF_Fixme, //PF_bprint, (don't support)
|
||||
PF_Fixme, //PF_sprint,
|
||||
PF_dprint,
|
||||
PF_ftos,
|
||||
|
@ -483,7 +626,7 @@ builtin_t csqc_builtins[] = {
|
|||
//30
|
||||
PF_traceoff,
|
||||
PF_eprint,
|
||||
PF_Fixme, //PF_walkmove,
|
||||
PF_Fixme, //PF_walkmove, (don't support yet)
|
||||
PF_Fixme,
|
||||
PF_Fixme, //PF_droptofloor,
|
||||
PF_Fixme, //PF_lightstyle,
|
||||
|
@ -496,7 +639,7 @@ PF_Fixme, //PF_checkbottom,
|
|||
PF_Fixme, //PF_pointcontents,
|
||||
PF_Fixme,
|
||||
PF_fabs,
|
||||
PF_Fixme, //PF_aim, hehehe...
|
||||
PF_Fixme, //PF_aim, hehehe... (don't support)
|
||||
PF_cvar,
|
||||
PF_localcmd,
|
||||
PF_nextent,
|
||||
|
@ -526,10 +669,10 @@ PF_Fixme,
|
|||
PF_Fixme,
|
||||
PF_Fixme,
|
||||
SV_MoveToGoal,
|
||||
PF_Fixme, //PF_precache_file,
|
||||
PF_Fixme, //PF_precache_file, (don't support)
|
||||
PF_Fixme, //PF_makestatic,
|
||||
//70
|
||||
PF_Fixme, //PF_changelevel,
|
||||
PF_Fixme, //PF_changelevel, (don't support)
|
||||
PF_Fixme,
|
||||
PF_cvar_set,
|
||||
PF_Fixme, //PF_centerprint,
|
||||
|
@ -539,11 +682,11 @@ PF_Fixme, //PF_precache_model,
|
|||
PF_Fixme, //PF_precache_sound,
|
||||
PF_Fixme, //PF_precache_file,
|
||||
PF_Fixme, //PF_setspawnparms,
|
||||
PF_Fixme, //PF_logfrag,
|
||||
PF_Fixme, //PF_logfrag, (don't support)
|
||||
//80
|
||||
PF_Fixme, //PF_infokey,
|
||||
PF_stof,
|
||||
PF_Fixme, //PF_multicast,
|
||||
PF_Fixme, //PF_multicast, (don't support)
|
||||
PF_Fixme,
|
||||
PF_Fixme,
|
||||
|
||||
|
@ -775,7 +918,8 @@ func_t csqc_shutdown_function;
|
|||
func_t csqc_draw_function;
|
||||
func_t csqc_keydown_function;
|
||||
func_t csqc_keyup_function;
|
||||
func_t csqc_toggle_function;
|
||||
func_t csqc_parse_stuffcmd;
|
||||
func_t csqc_parse_centerprint;
|
||||
|
||||
float *csqc_time;
|
||||
|
||||
|
@ -832,6 +976,9 @@ void CSQC_FindGlobals(void)
|
|||
csqc_draw_function = PR_FindFunction(csqcprogs, "CSQC_UpdateView", PR_ANY);
|
||||
csqc_keydown_function = PR_FindFunction(csqcprogs, "CSQC_KeyDown", PR_ANY);
|
||||
csqc_keyup_function = PR_FindFunction(csqcprogs, "CSQC_KeyUp", PR_ANY);
|
||||
|
||||
csqc_parse_stuffcmd = PR_FindFunction(csqcprogs, "CSQC_Parse_StuffCmd", PR_ANY);
|
||||
csqc_parse_centerprint = PR_FindFunction(csqcprogs, "CSQC_Parse_CenterPrint", PR_ANY);
|
||||
}
|
||||
|
||||
double csqctime;
|
||||
|
@ -844,6 +991,9 @@ void CSQC_Init (void)
|
|||
return;
|
||||
}
|
||||
|
||||
memset(cl.model_csqcname, 0, sizeof(cl.model_csqcname));
|
||||
memset(cl.model_csqcprecache, 0, sizeof(cl.model_csqcprecache));
|
||||
|
||||
csqcprogparms.progsversion = PROGSTRUCT_VERSION;
|
||||
csqcprogparms.ReadFile = COM_LoadStackFile;//char *(*ReadFile) (char *fname, void *buffer, int *len);
|
||||
csqcprogparms.FileSize = COM_FileSize;//int (*FileSize) (char *fname); //-1 if file does not exist
|
||||
|
@ -920,6 +1070,9 @@ qboolean CSQC_DrawView(void)
|
|||
if (!csqc_draw_function || !csqcprogs)
|
||||
return false;
|
||||
|
||||
r_secondaryview = 0;
|
||||
|
||||
if (cl.worldmodel)
|
||||
R_LessenStains();
|
||||
|
||||
PR_ExecuteProgram(csqcprogs, csqc_draw_function);
|
||||
|
@ -927,8 +1080,89 @@ qboolean CSQC_DrawView(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
qboolean CSQC_StuffCmd(char *cmd)
|
||||
{
|
||||
void *pr_globals;
|
||||
char *str;
|
||||
if (!csqcprogs || !csqc_parse_stuffcmd)
|
||||
return false;
|
||||
|
||||
str = PF_TempStr();
|
||||
Q_strncpyz(str, cmd, MAXTEMPBUFFERLEN);
|
||||
|
||||
pr_globals = PR_globals(csqcprogs, PR_CURRENT);
|
||||
(*(char **)&((int *)pr_globals)[OFS_PARM0] = PR_SetString(csqcprogs, str));
|
||||
|
||||
PR_ExecuteProgram (csqcprogs, csqc_parse_stuffcmd);
|
||||
return true;
|
||||
}
|
||||
qboolean CSQC_CenterPrint(char *cmd)
|
||||
{
|
||||
void *pr_globals;
|
||||
char *str;
|
||||
if (!csqcprogs || !csqc_parse_centerprint)
|
||||
return false;
|
||||
|
||||
str = PF_TempStr();
|
||||
Q_strncpyz(str, cmd, MAXTEMPBUFFERLEN);
|
||||
|
||||
pr_globals = PR_globals(csqcprogs, PR_CURRENT);
|
||||
(*(char **)&((int *)pr_globals)[OFS_PARM0] = PR_SetString(csqcprogs, str));
|
||||
|
||||
PR_ExecuteProgram (csqcprogs, csqc_parse_centerprint);
|
||||
return G_FLOAT(OFS_RETURN);
|
||||
}
|
||||
|
||||
//this protocol allows up to 32767 edicts.
|
||||
void CSQC_ParseEntities(void)
|
||||
{
|
||||
/*
|
||||
csqcedict_t *ent;
|
||||
unsigned short entnum;
|
||||
|
||||
if (!csqcprogs)
|
||||
Host_EndGame
|
||||
|
||||
for(;;)
|
||||
{
|
||||
entnum = MSG_ReadShort();
|
||||
if (!entnum)
|
||||
break;
|
||||
if (entnum & 0x8000)
|
||||
{ //remove
|
||||
entnum &= ~0x8000;
|
||||
|
||||
if (!entnum)
|
||||
{
|
||||
Con_Printf("CSQC cannot remove world!\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
ent = csqcent[entnum];
|
||||
|
||||
if (!ent) //hrm.
|
||||
continue;
|
||||
|
||||
*csqc_globals->self = EDICT_TO_PROG(svprogfuncs, ent);
|
||||
PR_ExecuteProgram(csqcprogs, csqc_ent_remove);
|
||||
csqcent[entnum] = NULL;
|
||||
//the csqc is expected to call the remove builtin.
|
||||
}
|
||||
else
|
||||
{
|
||||
ent = csqcent[entnum];
|
||||
if (!ent)
|
||||
{
|
||||
ent = ED_Alloc(csqcprogs);
|
||||
G_FLOAT(OFS_PARM0) = true;
|
||||
}
|
||||
else
|
||||
G_FLOAT(OFS_PARM0) = false;
|
||||
|
||||
*csqc_globals->self = EDICT_TO_PROG(svprogfuncs, ent);
|
||||
PR_ExecuteProgram(csqcprogs, csqc_ent_update);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -76,7 +76,7 @@ int R_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum);
|
|||
#define crand() (rand()%32767/16383.5f-1)
|
||||
|
||||
void D_DrawParticleTrans (particle_t *pparticle);
|
||||
void D_DrawSparkTrans (particle_t *pparticle);
|
||||
void D_DrawSparkTrans (particle_t *pparticle, vec3_t src, vec3_t dest);
|
||||
|
||||
#define MAX_BEAMS 2048 // default max # of beam segments
|
||||
#define MAX_PARTICLES 32768 // default max # of particles at one
|
||||
|
@ -2867,6 +2867,9 @@ void GL_DrawParticleBeam_Untextured(beamseg_t *b, part_type_t *type)
|
|||
#ifdef SWQUAKE
|
||||
void SWD_DrawParticleSpark(particle_t *p, part_type_t *type)
|
||||
{
|
||||
float speed;
|
||||
vec3_t src, dest;
|
||||
|
||||
int r,g,b; //if you have a cpu with mmx, good for you...
|
||||
r = p->rgb[0]*255;
|
||||
if (r < 0)
|
||||
|
@ -2884,7 +2887,22 @@ void SWD_DrawParticleSpark(particle_t *p, part_type_t *type)
|
|||
else if (b > 255)
|
||||
b = 255;
|
||||
p->color = GetPalette(r, g, b);
|
||||
D_DrawSparkTrans(p);
|
||||
|
||||
speed = Length(p->vel);
|
||||
if ((speed) < 1)
|
||||
{
|
||||
VectorCopy(p->org, src);
|
||||
VectorCopy(p->org, dest);
|
||||
}
|
||||
else
|
||||
{ //causes flickers with lower vels (due to bouncing in physics)
|
||||
if (speed < 50)
|
||||
speed *= 50/speed;
|
||||
VectorMA(p->org, 2.5/(speed), p->vel, src);
|
||||
VectorMA(p->org, -2.5/(speed), p->vel, dest);
|
||||
}
|
||||
|
||||
D_DrawSparkTrans(p, src, dest);
|
||||
}
|
||||
void SWD_DrawParticleBlob(particle_t *p, part_type_t *type)
|
||||
{
|
||||
|
@ -2907,6 +2925,46 @@ void SWD_DrawParticleBlob(particle_t *p, part_type_t *type)
|
|||
p->color = GetPalette(r, g, b);
|
||||
D_DrawParticleTrans(p);
|
||||
}
|
||||
void SWD_DrawParticleBeam(beamseg_t *beam, part_type_t *type)
|
||||
{
|
||||
int r,g,b; //if you have a cpu with mmx, good for you...
|
||||
vec3_t v;
|
||||
vec3_t cr;
|
||||
beamseg_t *c;
|
||||
particle_t *p;
|
||||
particle_t *q;
|
||||
|
||||
vec3_t point[4];
|
||||
|
||||
// if (!b->next)
|
||||
// return;
|
||||
|
||||
c = beam->next;
|
||||
|
||||
q = c->p;
|
||||
// if (!q)
|
||||
// return;
|
||||
|
||||
p = beam->p;
|
||||
|
||||
r = p->rgb[0]*255;
|
||||
if (r < 0)
|
||||
r = 0;
|
||||
else if (r > 255)
|
||||
r = 255;
|
||||
g = p->rgb[1]*255;
|
||||
if (g < 0)
|
||||
g = 0;
|
||||
else if (g > 255)
|
||||
g = 255;
|
||||
b = p->rgb[2]*255;
|
||||
if (b < 0)
|
||||
b = 0;
|
||||
else if (b > 255)
|
||||
b = 255;
|
||||
p->color = GetPalette(r, g, b);
|
||||
D_DrawSparkTrans(p, p->org, q->org );
|
||||
}
|
||||
#endif
|
||||
|
||||
void DrawParticleTypes (void texturedparticles(particle_t *,part_type_t*), void sparkparticles(particle_t*,part_type_t*), void beamparticlest(beamseg_t*,part_type_t*), void beamparticlesut(beamseg_t*,part_type_t*))
|
||||
|
@ -3310,7 +3368,7 @@ void R_DrawParticles (void)
|
|||
if (qrenderer == QR_SOFTWARE)
|
||||
{
|
||||
D_StartParticles();
|
||||
DrawParticleTypes(SWD_DrawParticleBlob, SWD_DrawParticleSpark, NULL, NULL);//SWD_DrawParticleBeam);
|
||||
DrawParticleTypes(SWD_DrawParticleBlob, SWD_DrawParticleSpark, SWD_DrawParticleBeam, SWD_DrawParticleBeam);
|
||||
D_EndParticles();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -560,7 +560,7 @@ void (*Draw_Pic) (int x, int y, mpic_t *pic);
|
|||
void (*Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic);
|
||||
void (*Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height);
|
||||
void (*Draw_TransPic) (int x, int y, mpic_t *pic);
|
||||
void (*Draw_TransPicTranslate) (int x, int y, mpic_t *pic, qbyte *translation);
|
||||
void (*Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *image, qbyte *translation);
|
||||
void (*Draw_ConsoleBackground) (int lines);
|
||||
void (*Draw_EditorBackground) (int lines);
|
||||
void (*Draw_TileClear) (int x, int y, int w, int h);
|
||||
|
@ -650,7 +650,7 @@ struct {
|
|||
void (*Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic);
|
||||
void (*Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height);
|
||||
void (*Draw_TransPic) (int x, int y, mpic_t *pic);
|
||||
void (*Draw_TransPicTranslate) (int x, int y, mpic_t *pic, qbyte *translation);
|
||||
void (*Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *pic, qbyte *translation);
|
||||
void (*Draw_ConsoleBackground) (int lines);
|
||||
void (*Draw_EditorBackground) (int lines);
|
||||
void (*Draw_TileClear) (int x, int y, int w, int h);
|
||||
|
|
|
@ -1408,6 +1408,24 @@ void V_RenderView (void)
|
|||
if (cls.state != ca_active)
|
||||
return;
|
||||
|
||||
if (cl.worldmodel)
|
||||
{
|
||||
//work out which packet entities are solid
|
||||
CL_SetSolidEntities ();
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(false);
|
||||
|
||||
// do client side motion prediction
|
||||
CL_PredictMove ();
|
||||
|
||||
// Set up prediction for other players
|
||||
CL_SetUpPlayerPrediction(true);
|
||||
|
||||
// build a refresh entity list
|
||||
CL_EmitEntities ();
|
||||
}
|
||||
|
||||
view_frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK];
|
||||
|
||||
R_PushDlights ();
|
||||
|
|
|
@ -109,6 +109,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#define PLUGINS
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define CSQC_DAT //support for csqc
|
||||
#endif
|
||||
#define MENU_DAT //support for menu.dat
|
||||
|
||||
#define Q3SHADERS
|
||||
|
@ -292,6 +295,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define MAX_MODELS 512 // these are sent over the net as bytes
|
||||
#define MAX_SOUNDS 256 // so they cannot be blindly increased
|
||||
|
||||
#define MAX_CSQCMODELS 256 // these live entirly clientside
|
||||
|
||||
#define SAVEGAME_COMMENT_LENGTH 39
|
||||
|
||||
#define MAX_STYLESTRING 64
|
||||
|
|
|
@ -143,6 +143,7 @@ extern qboolean msg_badread; // set if a read goes beyond end of message
|
|||
void MSG_BeginReading (void);
|
||||
int MSG_GetReadCount(void);
|
||||
int MSG_ReadChar (void);
|
||||
int MSG_ReadBits(int bits);
|
||||
int MSG_ReadByte (void);
|
||||
int MSG_ReadShort (void);
|
||||
int MSG_ReadLong (void);
|
||||
|
|
|
@ -46,9 +46,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#ifdef Q3BSPS
|
||||
#define PEXT_Q3BSP 0x00040000
|
||||
#endif
|
||||
#define PEXT_SEEF1 0x00080000
|
||||
//#define PEXT_SEEF1 0x00080000
|
||||
#define PEXT_SPLITSCREEN 0x00100000
|
||||
#define PEXT_HEXEN2 0x00200000
|
||||
#define PEXT_HEXEN2 0x00200000 //more stats and working particle builtin.
|
||||
#define PEXT_SPAWNSTATIC2 0x00400000 //Sends an entity delta instead of a baseline.
|
||||
#define PEXT_CUSTOMTEMPEFFECTS 0x00800000 //supports custom temp ents.
|
||||
#define PEXT_256PACKETENTITIES 0x01000000 //Client can recieve 256 packet entities.
|
||||
|
@ -803,8 +803,61 @@ typedef struct q1usercmd_s
|
|||
#define Q2MAX_STATS 32
|
||||
|
||||
|
||||
//for the local player
|
||||
#define Q2PS_M_TYPE (1<<0)
|
||||
#define Q2PS_M_ORIGIN (1<<1)
|
||||
#define Q2PS_M_VELOCITY (1<<2)
|
||||
#define Q2PS_M_TIME (1<<3)
|
||||
#define Q2PS_M_FLAGS (1<<4)
|
||||
#define Q2PS_M_GRAVITY (1<<5)
|
||||
#define Q2PS_M_DELTA_ANGLES (1<<6)
|
||||
|
||||
// edict->drawflags
|
||||
#define Q2PS_VIEWOFFSET (1<<7)
|
||||
#define Q2PS_VIEWANGLES (1<<8)
|
||||
#define Q2PS_KICKANGLES (1<<9)
|
||||
#define Q2PS_BLEND (1<<10)
|
||||
#define Q2PS_FOV (1<<11)
|
||||
#define Q2PS_WEAPONINDEX (1<<12)
|
||||
#define Q2PS_WEAPONFRAME (1<<13)
|
||||
#define Q2PS_RDFLAGS (1<<14)
|
||||
|
||||
|
||||
|
||||
// entity_state_t->renderfx flags
|
||||
#define Q2RF_MINLIGHT 1 // allways have some light (viewmodel)
|
||||
#define Q2RF_VIEWERMODEL 2 // don't draw through eyes, only mirrors
|
||||
#define Q2RF_WEAPONMODEL 4 // only draw through eyes
|
||||
#define Q2RF_FULLBRIGHT 8 // allways draw full intensity
|
||||
#define Q2RF_DEPTHHACK 16 // for view weapon Z crunching
|
||||
#define Q2RF_TRANSLUCENT 32
|
||||
#define Q2RF_FRAMELERP 64
|
||||
#define Q2RF_BEAM 128
|
||||
#define Q2RF_CUSTOMSKIN 256 // skin is an index in image_precache
|
||||
#define Q2RF_GLOW 512 // pulse lighting for bonus items
|
||||
#define Q2RF_SHELL_RED 1024
|
||||
#define Q2RF_SHELL_GREEN 2048
|
||||
#define Q2RF_SHELL_BLUE 4096
|
||||
|
||||
//ROGUE
|
||||
#define Q2RF_IR_VISIBLE 0x00008000 // 32768
|
||||
#define Q2RF_SHELL_DOUBLE 0x00010000 // 65536
|
||||
#define Q2RF_SHELL_HALF_DAM 0x00020000
|
||||
#define Q2RF_USE_DISGUISE 0x00040000
|
||||
//ROGUE
|
||||
|
||||
// player_state_t->refdef flags
|
||||
#define Q2RDF_UNDERWATER 1 // warp the screen as apropriate
|
||||
#define Q2RDF_NOWORLDMODEL 2 // used for player configuration screen
|
||||
|
||||
//ROGUE
|
||||
#define Q2RDF_IRGOGGLES 4
|
||||
#define Q2RDF_UVGOGGLES 8
|
||||
//ROGUE
|
||||
|
||||
|
||||
|
||||
|
||||
// edict->drawflags (hexen2 stuff)
|
||||
#define MLS_MASKIN 7 // Model Light Style
|
||||
#define MLS_MASKOUT 248
|
||||
#define MLS_NONE 0
|
||||
|
@ -825,3 +878,6 @@ typedef struct q1usercmd_s
|
|||
#define SCALE_ORIGIN_TOP 64 // Scaling origin at object top
|
||||
#define DRF_TRANSLUCENT 128
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ int UI_MenuState(void);
|
|||
void CG_Stop (void);
|
||||
void CG_Start (void);
|
||||
int CG_Refresh(void);
|
||||
qboolean CG_Command(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -199,8 +199,6 @@ typedef struct glcachepic_s
|
|||
glcachepic_t glmenu_cachepics[MAX_CACHED_PICS];
|
||||
int glmenu_numcachepics;
|
||||
|
||||
qbyte menuplyr_pixels[4096];
|
||||
|
||||
int pic_texels;
|
||||
int pic_count;
|
||||
|
||||
|
@ -498,13 +496,6 @@ mpic_t *GLDraw_SafeCachePic (char *path)
|
|||
SwapPic (qpic);
|
||||
}
|
||||
|
||||
// HACK HACK HACK --- we need to keep the bytes for
|
||||
// the translatable player picture just for the menu
|
||||
// configuration dialog
|
||||
|
||||
if (!strncmp (path, "gfx/player/", 11) || !strcmp (path, "gfx/menuplyr.lmp")) //these arn't cached. I hate hacks.
|
||||
memcpy (menuplyr_pixels, qpic->data, qpic->width*qpic->height);
|
||||
else
|
||||
{
|
||||
glmenu_numcachepics++;
|
||||
Q_strncpyz (pic->name, path, sizeof(pic->name));
|
||||
|
@ -1588,7 +1579,7 @@ Draw_TransPicTranslate
|
|||
Only used for the player color selection menu
|
||||
=============
|
||||
*/
|
||||
void GLDraw_TransPicTranslate (int x, int y, mpic_t *pic, qbyte *translation)
|
||||
void GLDraw_TransPicTranslate (int x, int y, int width, int height, qbyte *pic, qbyte *translation)
|
||||
{
|
||||
int v, u, c;
|
||||
unsigned trans[64*64], *dest;
|
||||
|
@ -1597,15 +1588,15 @@ void GLDraw_TransPicTranslate (int x, int y, mpic_t *pic, qbyte *translation)
|
|||
|
||||
GL_Bind (translate_texture);
|
||||
|
||||
c = pic->width * pic->height;
|
||||
c = width * height;
|
||||
|
||||
dest = trans;
|
||||
for (v=0 ; v<64 ; v++, dest += 64)
|
||||
{
|
||||
src = &menuplyr_pixels[ ((v*pic->height)>>6) *pic->width];
|
||||
src = &pic[ ((v*height)>>6) *width];
|
||||
for (u=0 ; u<64 ; u++)
|
||||
{
|
||||
p = src[(u*pic->width)>>6];
|
||||
p = src[(u*width)>>6];
|
||||
if (p == 255)
|
||||
dest[u] = p;
|
||||
else
|
||||
|
@ -1623,11 +1614,11 @@ void GLDraw_TransPicTranslate (int x, int y, mpic_t *pic, qbyte *translation)
|
|||
qglTexCoord2f (0, 0);
|
||||
qglVertex2f (x, y);
|
||||
qglTexCoord2f (1, 0);
|
||||
qglVertex2f (x+pic->width, y);
|
||||
qglVertex2f (x+width, y);
|
||||
qglTexCoord2f (1, 1);
|
||||
qglVertex2f (x+pic->width, y+pic->height);
|
||||
qglVertex2f (x+width, y+height);
|
||||
qglTexCoord2f (0, 1);
|
||||
qglVertex2f (x, y+pic->height);
|
||||
qglVertex2f (x, y+height);
|
||||
qglEnd ();
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ void GLDraw_SubPic(int x, int y, mpic_t *pic, int srcx, int srcy, int width, int
|
|||
void GLDraw_Pic (int x, int y, mpic_t *pic);
|
||||
void GLDraw_ScalePic (int x, int y, int width, int height, mpic_t *pic);
|
||||
void GLDraw_TransPic (int x, int y, mpic_t *pic);
|
||||
void GLDraw_TransPicTranslate (int x, int y, mpic_t *pic, qbyte *translation);
|
||||
void GLDraw_TransPicTranslate (int x, int y, int w, int h, qbyte *pic, qbyte *translation);
|
||||
void GLDraw_ConsoleBackground (int lines);
|
||||
void GLDraw_EditorBackground (int lines);
|
||||
void GLDraw_BeginDisc (void);
|
||||
|
|
|
@ -810,6 +810,7 @@ int CM_PointContents (vec3_t p, int headnode);
|
|||
struct trace_s CM_BoxTrace (vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, int headnode, int brushmask);
|
||||
int CM_HeadnodeForBox (vec3_t mins, vec3_t maxs);
|
||||
struct trace_s CM_TransformedBoxTrace (vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, int headnode, int brushmask, vec3_t origin, vec3_t angles);
|
||||
struct model_s *CM_TempBoxModel(vec3_t mins, vec3_t maxs);
|
||||
|
||||
void Mod_ParseInfoFromEntityLump(char *data);
|
||||
|
||||
|
|
|
@ -229,6 +229,9 @@ void GL_SetupSceneProcessingTextures (void)
|
|||
unsigned char pp_warp_tex[PP_WARP_TEX_SIZE*PP_WARP_TEX_SIZE*3];
|
||||
unsigned char pp_edge_tex[PP_AMP_TEX_SIZE*PP_AMP_TEX_SIZE*3];
|
||||
|
||||
if (!gl_config.arb_shader_objects)
|
||||
return;
|
||||
|
||||
scenepp_texture = texture_extension_number++;
|
||||
scenepp_texture_warp = texture_extension_number++;
|
||||
scenepp_texture_edge = texture_extension_number++;
|
||||
|
@ -254,7 +257,7 @@ void GL_SetupSceneProcessingTextures (void)
|
|||
GL_Bind(scenepp_texture_warp);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
qglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, PP_WARP_TEX_SIZE, PP_WARP_TEX_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, pp_warp_tex);
|
||||
qglTexImage2D(GL_TEXTURE_2D, 0, 3, PP_WARP_TEX_SIZE, PP_WARP_TEX_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, pp_warp_tex);
|
||||
|
||||
// TODO: init edge texture - this is ampscale * 2, with ampscale calculated
|
||||
// init warp texture - this specifies offset in
|
||||
|
@ -337,6 +340,31 @@ qboolean R_CullSphere (vec3_t org, float radius)
|
|||
void R_RotateForEntity (entity_t *e)
|
||||
{
|
||||
float m[16];
|
||||
if (e->flags & Q2RF_WEAPONMODEL)
|
||||
{ //rotate to view first
|
||||
m[0] = cl.viewent[r_refdef.currentplayernum].axis[0][0];
|
||||
m[1] = cl.viewent[r_refdef.currentplayernum].axis[0][1];
|
||||
m[2] = cl.viewent[r_refdef.currentplayernum].axis[0][2];
|
||||
m[3] = 0;
|
||||
|
||||
m[4] = cl.viewent[r_refdef.currentplayernum].axis[1][0];
|
||||
m[5] = cl.viewent[r_refdef.currentplayernum].axis[1][1];
|
||||
m[6] = cl.viewent[r_refdef.currentplayernum].axis[1][2];
|
||||
m[7] = 0;
|
||||
|
||||
m[8] = cl.viewent[r_refdef.currentplayernum].axis[2][0];
|
||||
m[9] = cl.viewent[r_refdef.currentplayernum].axis[2][1];
|
||||
m[10] = cl.viewent[r_refdef.currentplayernum].axis[2][2];
|
||||
m[11] = 0;
|
||||
|
||||
m[12] = cl.viewent[r_refdef.currentplayernum].origin[0];
|
||||
m[13] = cl.viewent[r_refdef.currentplayernum].origin[1];
|
||||
m[14] = cl.viewent[r_refdef.currentplayernum].origin[2];
|
||||
m[15] = 1;
|
||||
|
||||
qglMultMatrixf(m);
|
||||
}
|
||||
|
||||
m[0] = e->axis[0][0];
|
||||
m[1] = e->axis[0][1];
|
||||
m[2] = e->axis[0][2];
|
||||
|
@ -357,26 +385,7 @@ void R_RotateForEntity (entity_t *e)
|
|||
m[14] = e->origin[2];
|
||||
m[15] = 1;
|
||||
|
||||
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
{
|
||||
void Matrix4_Multiply(float *a, float *b, float *out);
|
||||
float new[16];
|
||||
Matrix4_Multiply(m, r_world_matrix, new);
|
||||
qglLoadMatrixf(new);
|
||||
}
|
||||
#endif
|
||||
qglMultMatrixf(m);
|
||||
|
||||
#else
|
||||
qglTranslatef (e->origin[0], e->origin[1], e->origin[2]);
|
||||
qglRotatef (e->angles[1], 0, 0, 1);
|
||||
qglRotatef (-e->angles[0], 0, 1, 0);
|
||||
//ZOID: fixed z angle
|
||||
qglRotatef (e->angles[2], 1, 0, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -814,6 +823,7 @@ R_DrawViewModel
|
|||
*/
|
||||
void GLR_DrawViewModel (void)
|
||||
{
|
||||
/*
|
||||
// float ambient[4], diffuse[4];
|
||||
// int j;
|
||||
// int lnum;
|
||||
|
@ -933,6 +943,7 @@ void GLR_DrawViewModel (void)
|
|||
case mod_dummy:
|
||||
break;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
@ -1862,9 +1873,12 @@ void GLR_RenderView (void)
|
|||
// Con_Printf ("%3i ms %4i wpoly %4i epoly\n", (int)((time2-time1)*1000), c_brush_polys, c_alias_polys);
|
||||
}
|
||||
|
||||
if (!gl_config.arb_shader_objects)
|
||||
return;
|
||||
|
||||
// SCENE POST PROCESSING
|
||||
// we check if we need to use any shaders - currently it's just waterwarp
|
||||
if ((gl_config.arb_shader_objects) && (r_waterwarp.value && r_viewleaf && r_viewleaf->contents <= Q1CONTENTS_WATER))
|
||||
if ( (r_waterwarp.value && r_viewleaf && r_viewleaf->contents <= Q1CONTENTS_WATER))
|
||||
{
|
||||
float vwidth = 1, vheight = 1;
|
||||
float vs, vt;
|
||||
|
|
|
@ -176,13 +176,13 @@ void GLSCR_UpdateScreen (void)
|
|||
|
||||
if (scr_disabled_for_loading)
|
||||
{
|
||||
/* if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game)
|
||||
extern float scr_disabled_time;
|
||||
if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game)
|
||||
{
|
||||
scr_disabled_for_loading = false;
|
||||
Con_Printf ("load failed.\n");
|
||||
}
|
||||
else
|
||||
*/ {
|
||||
{
|
||||
GL_BeginRendering (&glx, &gly, &glwidth, &glheight);
|
||||
SCR_DrawLoading ();
|
||||
GL_EndRendering ();
|
||||
|
|
|
@ -1765,7 +1765,7 @@ public:
|
|||
RELEASENULL(m_textureMatrixStack);
|
||||
}
|
||||
|
||||
void glAlphaFunc (GLenum func, GLclampf ref){
|
||||
void cglAlphaFunc (GLenum func, GLclampf ref){
|
||||
if ( m_glAlphaFunc != func || m_glAlphaFuncRef != ref ) {
|
||||
SetRenderStateDirty();
|
||||
m_glAlphaFunc = func;
|
||||
|
@ -1774,7 +1774,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glBegin (GLenum mode){
|
||||
void cglBegin (GLenum mode){
|
||||
if ( m_needBeginScene ){
|
||||
HRESULT hr = m_pD3DDev->BeginScene();
|
||||
if ( FAILED(hr) ) {
|
||||
|
@ -1814,7 +1814,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glBindTexture(GLenum target, GLuint texture){
|
||||
void cglBindTexture(GLenum target, GLuint texture){
|
||||
if ( target != GL_TEXTURE_2D ) {
|
||||
LocalDebugBreak();
|
||||
return;
|
||||
|
@ -1826,19 +1826,19 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
inline void glMTexCoord2fSGIS(GLenum target, GLfloat s, GLfloat t){
|
||||
inline void cglMTexCoord2fSGIS(GLenum target, GLfloat s, GLfloat t){
|
||||
int textStage = target - TEXTURE0_SGIS;
|
||||
m_OGLPrimitiveVertexBuffer.SetTextureCoord(textStage, s, t);
|
||||
}
|
||||
|
||||
void glSelectTextureSGIS(GLenum target){
|
||||
void cglSelectTextureSGIS(GLenum target){
|
||||
int textStage = target - TEXTURE0_SGIS;
|
||||
m_textureState.SetCurrentStage(textStage);
|
||||
m_textures.BindTexture(m_textureState.GetCurrentTexture());
|
||||
// Does not, by itself, dirty the render state
|
||||
}
|
||||
|
||||
void glBlendFunc (GLenum sfactor, GLenum dfactor){
|
||||
void cglBlendFunc (GLenum sfactor, GLenum dfactor){
|
||||
if ( m_glBlendFuncSFactor != sfactor || m_glBlendFuncDFactor != dfactor ) {
|
||||
SetRenderStateDirty();
|
||||
m_glBlendFuncSFactor = sfactor;
|
||||
|
@ -1847,7 +1847,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glClear (GLbitfield mask){
|
||||
void cglClear (GLbitfield mask){
|
||||
HRESULT hr;
|
||||
internalEnd();
|
||||
SetGLRenderState();
|
||||
|
@ -1871,7 +1871,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){
|
||||
void cglClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){
|
||||
D3DCOLOR clearColor = D3DRGBA(Clamp(red), Clamp(green), Clamp(blue), Clamp(alpha));
|
||||
#ifdef USE_D3DXCONTEXT
|
||||
HRESULT hr = m_pD3DX->SetClearColor(clearColor);
|
||||
|
@ -1884,32 +1884,32 @@ public:
|
|||
#endif
|
||||
}
|
||||
|
||||
inline void glColor3f (GLfloat red, GLfloat green, GLfloat blue){
|
||||
inline void cglColor3f (GLfloat red, GLfloat green, GLfloat blue){
|
||||
// Note: On x86 architectures this function will chew up a lot of time
|
||||
// converting floating point to integer by calling _ftol
|
||||
// unless the /QIfist flag is specified.
|
||||
m_OGLPrimitiveVertexBuffer.SetColor(D3DRGB(Clamp(red), Clamp(green), Clamp(blue)));
|
||||
}
|
||||
|
||||
inline void glColor3ubv (const GLubyte *v){
|
||||
inline void cglColor3ubv (const GLubyte *v){
|
||||
m_OGLPrimitiveVertexBuffer.SetColor(RGBA_MAKE(v[0], v[1], v[2], 0xff));
|
||||
}
|
||||
|
||||
inline void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){
|
||||
inline void cglColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){
|
||||
// Note: On x86 architectures this function will chew up a lot of time
|
||||
// converting floating point to integer by calling _ftol
|
||||
// unless the /QIfist flag is specified.
|
||||
m_OGLPrimitiveVertexBuffer.SetColor(D3DRGBA(Clamp(red), Clamp(green), Clamp(blue), Clamp(alpha)));
|
||||
}
|
||||
|
||||
inline void glColor4fv (const GLfloat *v){
|
||||
inline void cglColor4fv (const GLfloat *v){
|
||||
// Note: On x86 architectures this function will chew up a lot of time
|
||||
// converting floating point to integer by calling _ftol
|
||||
// unless the /QIfist flag is specified.
|
||||
m_OGLPrimitiveVertexBuffer.SetColor(D3DRGBA(Clamp(v[0]), Clamp(v[1]), Clamp(v[2]), Clamp(v[3])));
|
||||
}
|
||||
|
||||
void glCullFace (GLenum mode){
|
||||
void cglCullFace (GLenum mode){
|
||||
if ( m_glCullFaceMode != mode ) {
|
||||
SetRenderStateDirty();
|
||||
m_glCullFaceMode = mode;
|
||||
|
@ -1917,7 +1917,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glDepthFunc (GLenum func){
|
||||
void cglDepthFunc (GLenum func){
|
||||
if ( m_glDepthFunc != func ) {
|
||||
SetRenderStateDirty();
|
||||
m_glDepthFunc = func;
|
||||
|
@ -1925,7 +1925,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glDepthMask (GLboolean flag){
|
||||
void cglDepthMask (GLboolean flag){
|
||||
if ( m_glDepthMask != (flag != 0) ) {
|
||||
SetRenderStateDirty();
|
||||
m_glDepthMask = flag != 0 ? true : false;
|
||||
|
@ -1933,7 +1933,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glDepthRange (GLclampd zNear, GLclampd zFar){
|
||||
void cglDepthRange (GLclampd zNear, GLclampd zFar){
|
||||
if ( m_glDepthRangeNear != zNear || m_glDepthRangeFar != zFar ) {
|
||||
SetRenderStateDirty();
|
||||
m_glDepthRangeNear = zNear;
|
||||
|
@ -1942,19 +1942,19 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glDisable (GLenum cap){
|
||||
glEnableDisableSet(cap, false);
|
||||
void cglDisable (GLenum cap){
|
||||
EnableDisableSet(cap, false);
|
||||
}
|
||||
|
||||
void glDrawBuffer (GLenum /* mode */){
|
||||
void cglDrawBuffer (GLenum /* mode */){
|
||||
// Do nothing. (Can DirectX render to the front buffer at all?)
|
||||
}
|
||||
|
||||
void glEnable (GLenum cap){
|
||||
glEnableDisableSet(cap, true);
|
||||
void cglEnable (GLenum cap){
|
||||
EnableDisableSet(cap, true);
|
||||
}
|
||||
|
||||
void glEnableDisableSet(GLenum cap, bool value){
|
||||
void EnableDisableSet(GLenum cap, bool value){
|
||||
switch ( cap ) {
|
||||
case GL_ALPHA_TEST:
|
||||
if ( m_glAlphaTest != value ) {
|
||||
|
@ -2002,13 +2002,15 @@ public:
|
|||
case GL_DITHER:
|
||||
case GL_FOG:
|
||||
break;
|
||||
case GL_POLYGON_OFFSET_FILL: // I fear for the shaders.
|
||||
break;
|
||||
default:
|
||||
LocalDebugBreak();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void glEnd (void){
|
||||
void cglEnd (void){
|
||||
// internalEnd();
|
||||
}
|
||||
|
||||
|
@ -2016,12 +2018,12 @@ public:
|
|||
m_OGLPrimitiveVertexBuffer.End();
|
||||
}
|
||||
|
||||
void glFinish (void){
|
||||
void cglFinish (void){
|
||||
// To Do: This is supposed to flush all pending commands
|
||||
internalEnd();
|
||||
}
|
||||
|
||||
void glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
void cglFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
SetRenderStateDirty();
|
||||
D3DXMATRIX m;
|
||||
// Note that D3D takes top, bottom arguments in opposite order
|
||||
|
@ -2030,7 +2032,7 @@ public:
|
|||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glGetFloatv (GLenum pname, GLfloat *params){
|
||||
void cglGetFloatv (GLenum pname, GLfloat *params){
|
||||
switch(pname){
|
||||
case GL_MODELVIEW_MATRIX:
|
||||
memcpy(params,m_modelViewMatrixStack->GetTop(), sizeof(D3DMATRIX));
|
||||
|
@ -2041,7 +2043,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
const GLubyte * glGetString (GLenum name){
|
||||
const GLubyte * cglGetString (GLenum name){
|
||||
const char* result = "";
|
||||
EnsureDriverInfo();
|
||||
switch ( name ) {
|
||||
|
@ -2063,28 +2065,28 @@ public:
|
|||
return (const GLubyte *) result;
|
||||
}
|
||||
|
||||
void glHint (GLenum /* target */, GLenum /* mode */){
|
||||
void cglHint (GLenum /* target */, GLenum /* mode */){
|
||||
LocalDebugBreak();
|
||||
}
|
||||
|
||||
void glLoadIdentity (void){
|
||||
void cglLoadIdentity (void){
|
||||
SetRenderStateDirty();
|
||||
m_currentMatrixStack->LoadIdentity();
|
||||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glLoadMatrixf (const GLfloat *m){
|
||||
void cglLoadMatrixf (const GLfloat *m){
|
||||
SetRenderStateDirty();
|
||||
m_currentMatrixStack->LoadMatrix((D3DXMATRIX*) m);
|
||||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
void glMultMatrixf (const GLfloat *m){
|
||||
void cglMultMatrixf (const GLfloat *m){
|
||||
SetRenderStateDirty();
|
||||
m_currentMatrixStack->MultMatrixLocal((D3DXMATRIX*) m);
|
||||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glMatrixMode (GLenum mode){
|
||||
void cglMatrixMode (GLenum mode){
|
||||
m_glMatrixMode = mode;
|
||||
switch ( mode ) {
|
||||
case GL_MODELVIEW:
|
||||
|
@ -2105,7 +2107,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
void cglOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
SetRenderStateDirty();
|
||||
D3DXMATRIX m;
|
||||
qD3DXMatrixOrthoOffCenter(&m, left, right, top, bottom, zNear, zFar);
|
||||
|
@ -2113,7 +2115,7 @@ public:
|
|||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glPolygonMode (GLenum face, GLenum mode){
|
||||
void cglPolygonMode (GLenum face, GLenum mode){
|
||||
SetRenderStateDirty();
|
||||
switch ( face ) {
|
||||
case GL_FRONT:
|
||||
|
@ -2132,22 +2134,22 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glPopMatrix (void){
|
||||
void cglPopMatrix (void){
|
||||
SetRenderStateDirty();
|
||||
m_currentMatrixStack->Pop();
|
||||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glPushMatrix (void){
|
||||
void cglPushMatrix (void){
|
||||
m_currentMatrixStack->Push();
|
||||
// Doesn't dirty matrix state
|
||||
}
|
||||
|
||||
void glReadBuffer (GLenum /* mode */){
|
||||
void cglReadBuffer (GLenum /* mode */){
|
||||
// Not that we allow reading from various buffers anyway.
|
||||
}
|
||||
|
||||
void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels){
|
||||
void cglReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels){
|
||||
if ( format != GL_RGB || type != GL_UNSIGNED_BYTE) {
|
||||
LocalDebugBreak();
|
||||
return;
|
||||
|
@ -2258,7 +2260,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z){
|
||||
void cglRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z){
|
||||
SetRenderStateDirty();
|
||||
D3DXMATRIX m;
|
||||
D3DXVECTOR3 v;
|
||||
|
@ -2271,7 +2273,7 @@ public:
|
|||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glScalef (GLfloat x, GLfloat y, GLfloat z){
|
||||
void cglScalef (GLfloat x, GLfloat y, GLfloat z){
|
||||
SetRenderStateDirty();
|
||||
D3DXMATRIX m;
|
||||
qD3DXMatrixScaling(&m, x, y, z);
|
||||
|
@ -2279,7 +2281,7 @@ public:
|
|||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
void glShadeModel (GLenum mode){
|
||||
void cglShadeModel (GLenum mode){
|
||||
if ( m_glShadeModel != mode ) {
|
||||
SetRenderStateDirty();
|
||||
m_glShadeModel = mode;
|
||||
|
@ -2287,11 +2289,11 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
inline void glTexCoord2f (GLfloat s, GLfloat t){
|
||||
inline void cglTexCoord2f (GLfloat s, GLfloat t){
|
||||
m_OGLPrimitiveVertexBuffer.SetTextureCoord0(s, t);
|
||||
}
|
||||
|
||||
void glTexEnvf (GLenum /* target */, GLenum /* pname */, GLfloat param){
|
||||
void cglTexEnvf (GLenum /* target */, GLenum /* pname */, GLfloat param){
|
||||
// ignore target, which must be GL_TEXTURE_ENV
|
||||
// ignore pname, which must be GL_TEXTURE_ENV_MODE
|
||||
if ( m_textureState.GetTextEnvMode() != param ) {
|
||||
|
@ -2311,7 +2313,7 @@ public:
|
|||
|
||||
#define LOAD_OURSELVES
|
||||
|
||||
void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width,
|
||||
void cglTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width,
|
||||
GLsizei height, GLint /* border */, GLenum format, GLenum type, const GLvoid *pixels){
|
||||
HRESULT hr;
|
||||
if ( target != GL_TEXTURE_2D || type != GL_UNSIGNED_BYTE) {
|
||||
|
@ -2478,7 +2480,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glTexParameterf (GLenum target, GLenum pname, GLfloat param){
|
||||
void cglTexParameterf (GLenum target, GLenum pname, GLfloat param){
|
||||
|
||||
switch(target){
|
||||
case GL_TEXTURE_2D:
|
||||
|
@ -2513,7 +2515,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glTexSubImage2D (GLenum target, GLint level,
|
||||
void cglTexSubImage2D (GLenum target, GLint level,
|
||||
GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
|
||||
GLenum format, GLenum type, const GLvoid *pixels){
|
||||
if ( target != GL_TEXTURE_2D ) {
|
||||
|
@ -2626,7 +2628,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void glTranslatef (GLfloat x, GLfloat y, GLfloat z){
|
||||
void cglTranslatef (GLfloat x, GLfloat y, GLfloat z){
|
||||
SetRenderStateDirty();
|
||||
D3DXMATRIX m;
|
||||
qD3DXMatrixTranslation(&m, x, y, z);
|
||||
|
@ -2634,19 +2636,19 @@ public:
|
|||
*m_currentMatrixStateDirty = true;
|
||||
}
|
||||
|
||||
inline void glVertex2f (GLfloat x, GLfloat y){
|
||||
inline void cglVertex2f (GLfloat x, GLfloat y){
|
||||
m_OGLPrimitiveVertexBuffer.SetVertex(x, y, 0);
|
||||
}
|
||||
|
||||
inline void glVertex3f (GLfloat x, GLfloat y, GLfloat z){
|
||||
inline void cglVertex3f (GLfloat x, GLfloat y, GLfloat z){
|
||||
m_OGLPrimitiveVertexBuffer.SetVertex(x, y, z);
|
||||
}
|
||||
|
||||
inline void glVertex3fv (const GLfloat *v){
|
||||
inline void cglVertex3fv (const GLfloat *v){
|
||||
m_OGLPrimitiveVertexBuffer.SetVertex(v[0], v[1], v[2]);
|
||||
}
|
||||
|
||||
void glViewport (GLint x, GLint y, GLsizei width, GLsizei height){
|
||||
void cglViewport (GLint x, GLint y, GLsizei width, GLsizei height){
|
||||
if ( m_glViewPortX != x || m_glViewPortY != y ||
|
||||
m_glViewPortWidth != width || m_glViewPortHeight != height ) {
|
||||
SetRenderStateDirty();
|
||||
|
@ -3350,23 +3352,23 @@ private:
|
|||
#pragma warning(disable:4273)
|
||||
|
||||
void APIENTRY D3DAlphaFunc (GLenum func, GLclampf ref){
|
||||
gFakeGL->glAlphaFunc(func, ref);
|
||||
gFakeGL->cglAlphaFunc(func, ref);
|
||||
}
|
||||
|
||||
void APIENTRY D3DBegin (GLenum mode){
|
||||
gFakeGL->glBegin(mode);
|
||||
gFakeGL->cglBegin(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DBlendFunc (GLenum sfactor, GLenum dfactor){
|
||||
gFakeGL->glBlendFunc(sfactor, dfactor);
|
||||
gFakeGL->cglBlendFunc(sfactor, dfactor);
|
||||
}
|
||||
|
||||
void APIENTRY D3DClear (GLbitfield mask){
|
||||
gFakeGL->glClear(mask);
|
||||
gFakeGL->cglClear(mask);
|
||||
}
|
||||
|
||||
void APIENTRY D3DClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){
|
||||
gFakeGL->glClearColor(red, green, blue, alpha);
|
||||
gFakeGL->cglClearColor(red, green, blue, alpha);
|
||||
}
|
||||
|
||||
void APIENTRY D3DColor3f (GLfloat red, GLfloat green, GLfloat blue){
|
||||
|
@ -3376,15 +3378,15 @@ void APIENTRY D3DColor3f (GLfloat red, GLfloat green, GLfloat blue){
|
|||
if (red < 0) red = 0;
|
||||
if (green < 0) green = 0;
|
||||
if (blue < 0) blue = 0;
|
||||
gFakeGL->glColor3f(red, green, blue);
|
||||
gFakeGL->cglColor3f(red, green, blue);
|
||||
}
|
||||
|
||||
void APIENTRY D3DColor3ubv (const GLubyte *v){
|
||||
gFakeGL->glColor3ubv(v);
|
||||
gFakeGL->cglColor3ubv(v);
|
||||
}
|
||||
void APIENTRY D3DColor3ub (GLubyte v1, GLubyte v2, GLubyte v3)
|
||||
{
|
||||
gFakeGL->glColor3f(v1/255.0, v2/255.0, v3/255.0);
|
||||
gFakeGL->cglColor3f(v1/255.0, v2/255.0, v3/255.0);
|
||||
}
|
||||
void APIENTRY D3DColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){
|
||||
if (red>1) red = 1;
|
||||
|
@ -3395,48 +3397,48 @@ void APIENTRY D3DColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alph
|
|||
if (green < 0) green = 0;
|
||||
if (blue < 0) blue = 0;
|
||||
if (alpha < 0) alpha = 0;
|
||||
gFakeGL->glColor4f(red, green, blue, alpha);
|
||||
gFakeGL->cglColor4f(red, green, blue, alpha);
|
||||
}
|
||||
|
||||
void APIENTRY D3DColor4fv (const GLfloat *v){
|
||||
gFakeGL->glColor4fv(v);
|
||||
gFakeGL->cglColor4fv(v);
|
||||
}
|
||||
|
||||
void APIENTRY D3DColor4ubv (const GLubyte *v) //no bounds checking needed
|
||||
{
|
||||
gFakeGL->glColor4f(v[0]/255.0, v[1]/255.0, v[2]/255.0, v[3]/255.0);
|
||||
gFakeGL->cglColor4f(v[0]/255.0, v[1]/255.0, v[2]/255.0, v[3]/255.0);
|
||||
}
|
||||
void APIENTRY D3DColor4ub (GLubyte v1, GLubyte v2, GLubyte v3, GLubyte v4)
|
||||
{
|
||||
gFakeGL->glColor4f(v1/255.0, v2/255.0, v3/255.0, v4/255.0);
|
||||
gFakeGL->cglColor4f(v1/255.0, v2/255.0, v3/255.0, v4/255.0);
|
||||
}
|
||||
|
||||
void APIENTRY D3DCullFace (GLenum mode){
|
||||
gFakeGL->glCullFace(mode);
|
||||
gFakeGL->cglCullFace(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DDepthFunc (GLenum func){
|
||||
gFakeGL->glDepthFunc(func);
|
||||
gFakeGL->cglDepthFunc(func);
|
||||
}
|
||||
|
||||
void APIENTRY D3DDepthMask (GLboolean flag){
|
||||
gFakeGL->glDepthMask(flag);
|
||||
gFakeGL->cglDepthMask(flag);
|
||||
}
|
||||
|
||||
void APIENTRY D3DDepthRange (GLclampd zNear, GLclampd zFar){
|
||||
gFakeGL->glDepthRange(zNear, zFar);
|
||||
gFakeGL->cglDepthRange(zNear, zFar);
|
||||
}
|
||||
|
||||
void APIENTRY D3DDisable (GLenum cap){
|
||||
gFakeGL->glDisable(cap);
|
||||
gFakeGL->cglDisable(cap);
|
||||
}
|
||||
|
||||
void APIENTRY D3DDrawBuffer (GLenum mode){
|
||||
gFakeGL->glDrawBuffer(mode);
|
||||
gFakeGL->cglDrawBuffer(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DEnable (GLenum cap){
|
||||
gFakeGL->glEnable(cap);
|
||||
gFakeGL->cglEnable(cap);
|
||||
}
|
||||
|
||||
void APIENTRY D3DEnd (void){
|
||||
|
@ -3445,111 +3447,111 @@ void APIENTRY D3DEnd (void){
|
|||
}
|
||||
|
||||
void APIENTRY D3DFinish (void){
|
||||
gFakeGL->glFinish();
|
||||
gFakeGL->cglFinish();
|
||||
}
|
||||
|
||||
void APIENTRY D3DFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
gFakeGL->glFrustum(left, right, bottom, top, zNear, zFar);
|
||||
gFakeGL->cglFrustum(left, right, bottom, top, zNear, zFar);
|
||||
}
|
||||
|
||||
void APIENTRY D3DGetFloatv (GLenum pname, GLfloat *params){
|
||||
gFakeGL->glGetFloatv(pname, params);
|
||||
gFakeGL->cglGetFloatv(pname, params);
|
||||
}
|
||||
|
||||
const GLubyte * APIENTRY D3DGetString (GLenum name){
|
||||
return gFakeGL->glGetString(name);
|
||||
return gFakeGL->cglGetString(name);
|
||||
}
|
||||
|
||||
void APIENTRY D3DHint (GLenum target, GLenum mode){
|
||||
gFakeGL->glHint(target, mode);
|
||||
gFakeGL->cglHint(target, mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DLoadIdentity (void){
|
||||
gFakeGL->glLoadIdentity();
|
||||
gFakeGL->cglLoadIdentity();
|
||||
}
|
||||
|
||||
void APIENTRY D3DLoadMatrixf (const GLfloat *m){
|
||||
gFakeGL->glLoadMatrixf(m);
|
||||
gFakeGL->cglLoadMatrixf(m);
|
||||
}
|
||||
|
||||
void APIENTRY D3DMatrixMode (GLenum mode){
|
||||
gFakeGL->glMatrixMode(mode);
|
||||
gFakeGL->cglMatrixMode(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){
|
||||
gFakeGL->glOrtho(left, right, top, bottom, zNear, zFar);
|
||||
gFakeGL->cglOrtho(left, right, top, bottom, zNear, zFar);
|
||||
}
|
||||
|
||||
void APIENTRY D3DPolygonMode (GLenum face, GLenum mode){
|
||||
gFakeGL->glPolygonMode(face, mode);
|
||||
gFakeGL->cglPolygonMode(face, mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DPopMatrix (void){
|
||||
gFakeGL->glPopMatrix();
|
||||
gFakeGL->cglPopMatrix();
|
||||
}
|
||||
|
||||
void APIENTRY D3DPushMatrix (void){
|
||||
gFakeGL->glPushMatrix();
|
||||
gFakeGL->cglPushMatrix();
|
||||
}
|
||||
|
||||
void APIENTRY D3DReadBuffer (GLenum mode){
|
||||
gFakeGL->glReadBuffer(mode);
|
||||
gFakeGL->cglReadBuffer(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels){
|
||||
gFakeGL->glReadPixels(x, y, width, height, format, type, pixels);
|
||||
gFakeGL->cglReadPixels(x, y, width, height, format, type, pixels);
|
||||
}
|
||||
|
||||
void APIENTRY D3DRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z){
|
||||
gFakeGL->glRotatef(angle, x, y, z);
|
||||
gFakeGL->cglRotatef(angle, x, y, z);
|
||||
}
|
||||
|
||||
void APIENTRY D3DScalef (GLfloat x, GLfloat y, GLfloat z){
|
||||
gFakeGL->glScalef(x, y, z);
|
||||
gFakeGL->cglScalef(x, y, z);
|
||||
}
|
||||
|
||||
void APIENTRY D3DShadeModel (GLenum mode){
|
||||
gFakeGL->glShadeModel(mode);
|
||||
gFakeGL->cglShadeModel(mode);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTexCoord2f (GLfloat s, GLfloat t){
|
||||
gFakeGL->glTexCoord2f(s, t);
|
||||
gFakeGL->cglTexCoord2f(s, t);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTexEnvf (GLenum target, GLenum pname, GLfloat param){
|
||||
gFakeGL->glTexEnvf(target, pname, param);
|
||||
gFakeGL->cglTexEnvf(target, pname, param);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels){
|
||||
gFakeGL->glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
|
||||
gFakeGL->cglTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTexParameterf (GLenum target, GLenum pname, GLfloat param){
|
||||
gFakeGL->glTexParameterf(target, pname, param);
|
||||
gFakeGL->cglTexParameterf(target, pname, param);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels){
|
||||
gFakeGL->glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
|
||||
gFakeGL->cglTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
|
||||
}
|
||||
|
||||
void APIENTRY D3DTranslatef (GLfloat x, GLfloat y, GLfloat z){
|
||||
gFakeGL->glTranslatef(x, y, z);
|
||||
gFakeGL->cglTranslatef(x, y, z);
|
||||
}
|
||||
|
||||
void APIENTRY D3DVertex2f (GLfloat x, GLfloat y){
|
||||
gFakeGL->glVertex2f(x, y);
|
||||
gFakeGL->cglVertex2f(x, y);
|
||||
}
|
||||
|
||||
void APIENTRY D3DVertex3f (GLfloat x, GLfloat y, GLfloat z){
|
||||
gFakeGL->glVertex3f(x, y, z);
|
||||
gFakeGL->cglVertex3f(x, y, z);
|
||||
}
|
||||
|
||||
void APIENTRY D3DVertex3fv (const GLfloat *v){
|
||||
gFakeGL->glVertex3fv(v);
|
||||
gFakeGL->cglVertex3fv(v);
|
||||
}
|
||||
|
||||
void APIENTRY D3DViewport (GLint x, GLint y, GLsizei width, GLsizei height){
|
||||
gFakeGL->glViewport(x, y, width, height);
|
||||
gFakeGL->cglViewport(x, y, width, height);
|
||||
}
|
||||
|
||||
HDC gHDC;
|
||||
|
@ -3581,15 +3583,15 @@ HDC WINAPI D3DwglGetCurrentDC(VOID){
|
|||
}
|
||||
|
||||
static void APIENTRY D3DBindTextureExt(GLenum target, GLuint texture){
|
||||
gFakeGL->glBindTexture(target, texture);
|
||||
gFakeGL->cglBindTexture(target, texture);
|
||||
}
|
||||
|
||||
static void APIENTRY D3DMTexCoord2fSGIS(GLenum target, GLfloat s, GLfloat t){
|
||||
gFakeGL->glMTexCoord2fSGIS(target, s, t);
|
||||
gFakeGL->cglMTexCoord2fSGIS(target, s, t);
|
||||
}
|
||||
|
||||
static void APIENTRY D3DSelectTextureSGIS(GLenum target){
|
||||
gFakeGL->glSelectTextureSGIS(target);
|
||||
gFakeGL->cglSelectTextureSGIS(target);
|
||||
}
|
||||
|
||||
// type cast unsafe conversion from
|
||||
|
@ -3704,7 +3706,7 @@ void APIENTRY D3DTexEnvi (GLenum target, GLenum pname, GLint param)
|
|||
}
|
||||
void APIENTRY D3DMultMatrixf (const GLfloat *m)
|
||||
{
|
||||
gFakeGL->glMultMatrixf(m);
|
||||
gFakeGL->cglMultMatrixf(m);
|
||||
}
|
||||
|
||||
void APIENTRY D3DNormal3f(GLfloat x, GLfloat y, GLfloat z)
|
||||
|
|
|
@ -370,7 +370,9 @@ progfuncs_t deffuncs = {
|
|||
PR_ResumeThread,
|
||||
PR_AbortStack,
|
||||
|
||||
0
|
||||
0,
|
||||
|
||||
QC_RegisterFieldVar
|
||||
};
|
||||
#undef printf
|
||||
|
||||
|
|
|
@ -123,6 +123,8 @@ struct progfuncs_s {
|
|||
void (*AbortStack) (progfuncs_t *prinst);
|
||||
|
||||
int lastcalledbuiltinnumber;
|
||||
|
||||
int (*RegisterFieldVar) (progfuncs_t *prinst, unsigned int type, char *name, int requestedpos, int origionalofs);
|
||||
};
|
||||
|
||||
typedef struct progexterns_s {
|
||||
|
@ -204,6 +206,8 @@ typedef union eval_s
|
|||
#define PR_globals(pf, num) (*pf->globals) (pf, num)
|
||||
#define PR_entvars(pf, ent) (*pf->entvars) (pf, ent)
|
||||
|
||||
#define PR_RegisterFieldVar(pf,type,name,reqofs,qcofs) (*pf->RegisterFieldVar) (pf,type,name,reqofs,qcofs)
|
||||
|
||||
#define ED_Alloc(pf) (*pf->ED_Alloc) (pf)
|
||||
#define ED_Free(pf, ed) (*pf->ED_Free) (pf, ed)
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#ifndef CLIENTONLY
|
||||
|
||||
//okay, so these are a quick but easy hack
|
||||
int QC_RegisterFieldVar(struct progfuncs_s *progfuncs, unsigned int type, char *name, int requestedpos, int origionalofs);
|
||||
void ED_Print (struct progfuncs_s *progfuncs, struct edict_s *ed);
|
||||
int PR_EnableEBFSBuiltin(char *name, int binum);
|
||||
void PR_CleanLogText_Init (void);
|
||||
|
@ -8235,11 +8234,11 @@ void PR_RegisterSVBuiltins(void)
|
|||
|
||||
void PR_RegisterFields(void) //it's just easier to do it this way.
|
||||
{
|
||||
#define fieldfloat(name) QC_RegisterFieldVar(svprogfuncs, ev_float, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldvector(name) QC_RegisterFieldVar(svprogfuncs, ev_vector, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldentity(name) QC_RegisterFieldVar(svprogfuncs, ev_entity, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldstring(name) QC_RegisterFieldVar(svprogfuncs, ev_string, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldfunction(name) QC_RegisterFieldVar(svprogfuncs, ev_function, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldfloat(name) PR_RegisterFieldVar(svprogfuncs, ev_float, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldvector(name) PR_RegisterFieldVar(svprogfuncs, ev_vector, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldentity(name) PR_RegisterFieldVar(svprogfuncs, ev_entity, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldstring(name) PR_RegisterFieldVar(svprogfuncs, ev_string, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
#define fieldfunction(name) PR_RegisterFieldVar(svprogfuncs, ev_function, #name, (int)&((edict_t*)0)->v.name - (int)&((edict_t*)0)->v, -1)
|
||||
|
||||
fieldfloat(modelindex);
|
||||
fieldvector(absmin);
|
||||
|
@ -8333,11 +8332,10 @@ void PR_RegisterFields(void) //it's just easier to do it this way.
|
|||
fieldfloat(alpha);
|
||||
fieldfloat(fatness);
|
||||
fieldentity(view2);
|
||||
fieldfloat(sendflags);
|
||||
fieldvector(movement);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "buttonforward", (int)&((edict_t*)0)->v.movement[0] - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "buttonright", (int)&((edict_t*)0)->v.movement[1] - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "buttonup", (int)&((edict_t*)0)->v.movement[2] - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "buttonforward", (int)&((edict_t*)0)->v.movement[0] - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "buttonright", (int)&((edict_t*)0)->v.movement[1] - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "buttonup", (int)&((edict_t*)0)->v.movement[2] - (int)&((edict_t*)0)->v, -1);
|
||||
fieldfloat(fteflags);
|
||||
fieldfloat(vweapmodelindex);
|
||||
|
||||
|
@ -8346,11 +8344,11 @@ void PR_RegisterFields(void) //it's just easier to do it this way.
|
|||
fieldentity(drawonlytoclient);
|
||||
|
||||
//UDC_EXTEFFECT... yuckie
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "fieldcolor", (int)&((edict_t*)0)->v.seefcolour - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizex", (int)&((edict_t*)0)->v.seefsizex - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizey", (int)&((edict_t*)0)->v.seefsizey - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizez", (int)&((edict_t*)0)->v.seefsizez - (int)&((edict_t*)0)->v, -1);
|
||||
QC_RegisterFieldVar(svprogfuncs, ev_float, "fieldoffset", (int)&((edict_t*)0)->v.seefoffset - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "fieldcolor", (int)&((edict_t*)0)->v.seefcolour - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizex", (int)&((edict_t*)0)->v.seefsizex - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizey", (int)&((edict_t*)0)->v.seefsizey - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "fieldsizez", (int)&((edict_t*)0)->v.seefsizez - (int)&((edict_t*)0)->v, -1);
|
||||
PR_RegisterFieldVar(svprogfuncs, ev_float, "fieldoffset", (int)&((edict_t*)0)->v.seefoffset - (int)&((edict_t*)0)->v, -1);
|
||||
|
||||
//hexen 2 stuff
|
||||
fieldfloat(playerclass);
|
||||
|
@ -8372,7 +8370,7 @@ void PR_RegisterFields(void) //it's just easier to do it this way.
|
|||
fieldfloat(dimension_hit);
|
||||
|
||||
if (pr_fixbrokenqccarrays.value)
|
||||
QC_RegisterFieldVar(svprogfuncs, 0, NULL, 0,0);
|
||||
PR_RegisterFieldVar(svprogfuncs, 0, NULL, 0,0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -232,7 +232,6 @@ typedef struct entvars_s
|
|||
float alpha;
|
||||
float fatness;
|
||||
int view2;
|
||||
float sendflags;
|
||||
float fteflags;
|
||||
vec3_t movement;
|
||||
float vweapmodelindex;
|
||||
|
|
|
@ -111,6 +111,9 @@ int numlight;
|
|||
extern int sv_lightningmodel;
|
||||
#endif
|
||||
|
||||
edict_t *csqcent[MAX_EDICTS];
|
||||
int csqcnuments;
|
||||
|
||||
qboolean SV_AddNailUpdate (edict_t *ent)
|
||||
{
|
||||
if (ent->v.modelindex != sv_nailmodel
|
||||
|
@ -140,6 +143,16 @@ qboolean SV_DemoNailUpdate (int i)
|
|||
return true;
|
||||
}
|
||||
|
||||
static qboolean SV_AddCSQCUpdate (edict_t *ent)
|
||||
{
|
||||
// if (!ent->sendcsqc)
|
||||
return false;
|
||||
|
||||
// csqcent[csqcnuments++] = ent;
|
||||
|
||||
// return true;
|
||||
}
|
||||
|
||||
#ifdef PEXT_LIGHTUPDATES
|
||||
qboolean SV_AddLightUpdate (edict_t *ent)
|
||||
{
|
||||
|
@ -258,6 +271,11 @@ void SV_EmitNailUpdate (sizebuf_t *msg, qboolean recorder)
|
|||
}
|
||||
}
|
||||
|
||||
void SV_EmitCSQCUpdate(client_t *client, sizebuf_t *msg)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//=============================================================================
|
||||
|
||||
|
||||
|
@ -836,6 +854,7 @@ void SV_WritePlayerToClient(sizebuf_t *msg, clstate_t *ent)
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef PEXT_SEEF1
|
||||
#define EFNQ_DARKLIGHT 16
|
||||
#define EFNQ_DARKFIELD 32
|
||||
#define EFNQ_LIGHT 64
|
||||
|
@ -956,9 +975,10 @@ void SV_AddEffect(client_t *to, edict_t *ent, int seefno)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
void SV_SendExtraEntEffects(client_t *to, edict_t *ent)
|
||||
{
|
||||
#ifdef PEXT_SEEF1
|
||||
int removeeffects = 0;
|
||||
if (pr_udc_exteffect_enabled)
|
||||
{
|
||||
|
@ -1018,6 +1038,7 @@ void SV_SendExtraEntEffects(client_t *to, edict_t *ent)
|
|||
SV_RemoveEffect(to, ent, removeeffects);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
=============
|
||||
|
@ -1314,6 +1335,9 @@ void SV_WritePlayersToClient (client_t *client, edict_t *clent, qbyte *pvs, size
|
|||
continue; //not in this dimension - sorry...
|
||||
}
|
||||
|
||||
if (SV_AddCSQCUpdate(ent))
|
||||
continue;
|
||||
|
||||
{
|
||||
clstate_t clst;
|
||||
clst.playernum = j;
|
||||
|
@ -1726,6 +1750,7 @@ qboolean Q2BSP_EdictInFatPVS(edict_t *ent)
|
|||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
=============
|
||||
SV_WriteEntitiesToClient
|
||||
|
@ -2048,34 +2073,7 @@ void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg, qboolean ignore
|
|||
// if (strstr(sv.model_precache[(int)ent->v.modelindex], "gib"))
|
||||
// continue;
|
||||
|
||||
//QC code doesn't want some clients to see some ents.
|
||||
#define SF_OWNERSEEONLY 1
|
||||
#define SF_OWNERDONTSEE 2
|
||||
#define SF_OWNERTEAMONLY 4
|
||||
#define SF_OWNERTEAMDONTSEE 8
|
||||
if (ent->v.sendflags && !ignorepvs) //hmm
|
||||
{
|
||||
if ((int)ent->v.sendflags & SF_OWNERSEEONLY)
|
||||
{
|
||||
if (PROG_TO_EDICT(svprogfuncs, ent->v.owner) != clent)
|
||||
continue;
|
||||
}
|
||||
if ((int)ent->v.sendflags & SF_OWNERDONTSEE)
|
||||
{
|
||||
if (PROG_TO_EDICT(svprogfuncs, ent->v.owner) == clent)
|
||||
continue;
|
||||
}
|
||||
if ((int)ent->v.sendflags & SF_OWNERTEAMONLY)
|
||||
{
|
||||
if (ent->v.team != clent->v.team)
|
||||
continue;
|
||||
}
|
||||
if ((int)ent->v.sendflags & SF_OWNERTEAMDONTSEE)
|
||||
{
|
||||
if (ent->v.team == clent->v.team)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (ent->v.nodrawtoclient) //DP extension.
|
||||
if (ent->v.nodrawtoclient == EDICT_TO_PROG(svprogfuncs, client->edict))
|
||||
continue;
|
||||
|
@ -2097,6 +2095,9 @@ void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg, qboolean ignore
|
|||
if (!((int)client->edict->v.dimension_see & ((int)ent->v.dimension_seen | (int)ent->v.dimension_ghost)))
|
||||
continue; //not in this dimension - sorry...
|
||||
|
||||
if (SV_AddCSQCUpdate(ent)) //csqc took it.
|
||||
continue;
|
||||
|
||||
#ifdef NQPROT
|
||||
if (nqprot)
|
||||
{
|
||||
|
|
|
@ -3036,7 +3036,9 @@ void SV_InitLocal (void)
|
|||
#ifdef PEXT_FLOATCOORDS
|
||||
svs.fteprotocolextensions |= PEXT_FLOATCOORDS;
|
||||
#endif
|
||||
#ifdef PEXT_SEEF1
|
||||
svs.fteprotocolextensions |= PEXT_SEEF1;
|
||||
#endif
|
||||
svs.fteprotocolextensions |= PEXT_SPLITSCREEN;
|
||||
svs.fteprotocolextensions |= PEXT_HEXEN2;
|
||||
svs.fteprotocolextensions |= PEXT_SPAWNSTATIC2;
|
||||
|
|
|
@ -1389,10 +1389,11 @@ void SV_UpdateToReliableMessages (void)
|
|||
|
||||
if (svprogfuncs)
|
||||
{
|
||||
extern cvar_t sv_gravity;
|
||||
// maxspeed/entgravity changes
|
||||
ent = host_client->edict;
|
||||
|
||||
newval = ent->v.gravity;
|
||||
newval = ent->v.gravity*sv_gravity.value;
|
||||
if (progstype == PROG_NQ)
|
||||
{
|
||||
if (!newval)
|
||||
|
@ -1413,7 +1414,7 @@ void SV_UpdateToReliableMessages (void)
|
|||
else */if (host_client->entgravity != newval)
|
||||
{
|
||||
ClientReliableWrite_Begin(host_client, svc_entgravity, 5);
|
||||
ClientReliableWrite_Float(host_client, newval);
|
||||
ClientReliableWrite_Float(host_client, newval/movevars.gravity); //lie to the client in a cunning way
|
||||
host_client->entgravity = newval;
|
||||
}
|
||||
newval = ent->v.maxspeed;
|
||||
|
|
|
@ -2974,6 +2974,7 @@ void SV_ExecuteUserCommand (char *s, qboolean fromQC)
|
|||
#ifdef NQPROT
|
||||
void SVNQ_Spawn_f (void)
|
||||
{
|
||||
extern cvar_t sv_gravity;
|
||||
int i;
|
||||
client_t *client;
|
||||
edict_t *ent;
|
||||
|
@ -3008,7 +3009,7 @@ void SVNQ_Spawn_f (void)
|
|||
|
||||
if (host_client->istobeloaded) //minimal setup
|
||||
{
|
||||
host_client->entgravity = ent->v.gravity;
|
||||
host_client->entgravity = ent->v.gravity*sv_gravity.value;
|
||||
host_client->maxspeed = ent->v.maxspeed;
|
||||
}
|
||||
else
|
||||
|
@ -3021,6 +3022,7 @@ void SVNQ_Spawn_f (void)
|
|||
ent->v.netname = PR_SetString(svprogfuncs, host_client->name);
|
||||
|
||||
host_client->entgravity = ent->v.gravity = 1.0;
|
||||
host_client->entgravity*=sv_gravity.value;
|
||||
host_client->maxspeed = ent->v.maxspeed = sv_maxspeed.value;
|
||||
}
|
||||
|
||||
|
@ -3687,6 +3689,7 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
|
|||
int oldmsec;
|
||||
double tmp_time;
|
||||
qboolean jumpable;
|
||||
extern cvar_t sv_gravity;
|
||||
|
||||
#ifdef Q2SERVER
|
||||
if (!svprogfuncs)
|
||||
|
@ -3929,7 +3932,7 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
|
|||
else
|
||||
pmove.hullnum = SV_HullNumForPlayer(sv_player->v.hull, sv_player->v.mins, sv_player->v.maxs);
|
||||
|
||||
movevars.entgravity = host_client->entgravity;
|
||||
movevars.entgravity = host_client->entgravity/movevars.gravity;
|
||||
movevars.maxspeed = host_client->maxspeed;
|
||||
movevars.bunnyspeedcap = pm_bunnyspeedcap.value;
|
||||
movevars.ktjump = pm_ktjump.value;
|
||||
|
|
|
@ -13,24 +13,6 @@ void SV_BuildClientFrame (client_t *client)
|
|||
}
|
||||
#else
|
||||
|
||||
#define Q2PS_M_TYPE (1<<0)
|
||||
#define Q2PS_M_ORIGIN (1<<1)
|
||||
#define Q2PS_M_VELOCITY (1<<2)
|
||||
#define Q2PS_M_TIME (1<<3)
|
||||
#define Q2PS_M_FLAGS (1<<4)
|
||||
#define Q2PS_M_GRAVITY (1<<5)
|
||||
#define Q2PS_M_DELTA_ANGLES (1<<6)
|
||||
|
||||
#define Q2PS_VIEWOFFSET (1<<7)
|
||||
#define Q2PS_VIEWANGLES (1<<8)
|
||||
#define Q2PS_KICKANGLES (1<<9)
|
||||
#define Q2PS_BLEND (1<<10)
|
||||
#define Q2PS_FOV (1<<11)
|
||||
#define Q2PS_WEAPONINDEX (1<<12)
|
||||
#define Q2PS_WEAPONFRAME (1<<13)
|
||||
#define Q2PS_RDFLAGS (1<<14)
|
||||
#define Q2RF_BEAM 128
|
||||
|
||||
q2entity_state_t *svs_client_entities;//[Q2UPDATE_BACKUP*MAX_PACKET_ENTITIES];
|
||||
int svs_num_client_entities;
|
||||
int svs_next_client_entities;
|
||||
|
|
|
@ -734,39 +734,24 @@ vec_t VI2Length(int x, int y)
|
|||
length = sqrt (length);
|
||||
return length;
|
||||
}
|
||||
void D_DrawSparkTrans32 (particle_t *pparticle) //draw a line in 3d space
|
||||
void D_DrawSparkTrans32 (particle_t *pparticle, vec3_t src, vec3_t dest) //draw a line in 3d space
|
||||
{
|
||||
/*
|
||||
Finds 2d coords for the points, then draws a line between them with an appropriate alpha
|
||||
*/
|
||||
vec3_t delta;
|
||||
unsigned char *pdest;
|
||||
unsigned char *pal;
|
||||
short *pz;
|
||||
int count, u1, v1, z1, a1, a, ia;
|
||||
int u2, v2, z2;
|
||||
float speed;
|
||||
|
||||
int du, dv, dz, da;
|
||||
|
||||
if (pparticle->alpha <= 0.0)
|
||||
return;
|
||||
|
||||
speed = Length(pparticle->vel);
|
||||
if ((speed) < 1)
|
||||
{
|
||||
D_2dPos(pparticle->org, &u1, &v1, &z1);
|
||||
D_2dPos(pparticle->org, &u2, &v2, &z2);
|
||||
}
|
||||
else
|
||||
{ //causes flickers with lower vels (due to bouncing in physics)
|
||||
if (speed < 50)
|
||||
speed *= 50/speed;
|
||||
VectorMA(pparticle->org, 5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u1, &v1, &z1);
|
||||
VectorMA(pparticle->org, -5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u2, &v2, &z2);
|
||||
}
|
||||
D_2dPos(src, &u1, &v1, &z1);
|
||||
D_2dPos(dest, &u2, &v2, &z2);
|
||||
|
||||
if ((v1 > d_vrectbottom_particle) ||
|
||||
(u1 > d_vrectright_particle) ||
|
||||
|
@ -837,35 +822,20 @@ pal = (qbyte *)(d_8to32table + (int)pparticle->color);
|
|||
} while (count--);
|
||||
}
|
||||
|
||||
void D_DrawSparkTrans16 (particle_t *pparticle) //draw a line in 3d space, 8bpp
|
||||
void D_DrawSparkTrans16 (particle_t *pparticle, vec3_t src, vec3_t dest) //draw a line in 3d space, 8bpp
|
||||
{
|
||||
vec3_t delta;
|
||||
unsigned short *pdest;
|
||||
short *pz;
|
||||
int count, u1, v1, z1;
|
||||
int u2, v2, z2;
|
||||
float speed;
|
||||
|
||||
int du, dv, dz;
|
||||
|
||||
if (pparticle->alpha <= 0.0)
|
||||
return;
|
||||
|
||||
speed = Length(pparticle->vel);
|
||||
if ((speed) < 1)
|
||||
{
|
||||
D_2dPos(pparticle->org, &u1, &v1, &z1);
|
||||
D_2dPos(pparticle->org, &u2, &v2, &z2);
|
||||
}
|
||||
else
|
||||
{ //causes flickers with lower vels (due to bouncing in physics)
|
||||
if (speed < 50)
|
||||
speed *= 50/speed;
|
||||
VectorMA(pparticle->org, 2.5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u1, &v1, &z1);
|
||||
VectorMA(pparticle->org, -2.5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u2, &v2, &z2);
|
||||
}
|
||||
D_2dPos(src, &u1, &v1, &z1);
|
||||
D_2dPos(dest, &u2, &v2, &z2);
|
||||
|
||||
if ((v1 > d_vrectbottom_particle) ||
|
||||
(u1 > d_vrectright_particle) ||
|
||||
|
@ -925,14 +895,12 @@ void D_DrawSparkTrans16 (particle_t *pparticle) //draw a line in 3d space, 8bpp
|
|||
} while (count--);
|
||||
}
|
||||
|
||||
void D_DrawSparkTrans (particle_t *pparticle) //draw a line in 3d space, 8bpp
|
||||
void D_DrawSparkTrans (particle_t *pparticle, vec3_t src, vec3_t dest) //draw a line in 3d space, 8bpp
|
||||
{
|
||||
vec3_t delta;
|
||||
qbyte *pdest;
|
||||
short *pz;
|
||||
int count, u1, v1, z1;
|
||||
int u2, v2, z2;
|
||||
float speed;
|
||||
|
||||
int du, dv, dz;
|
||||
/*
|
||||
|
@ -941,12 +909,12 @@ void D_DrawSparkTrans (particle_t *pparticle) //draw a line in 3d space, 8bpp
|
|||
*/
|
||||
if (r_pixbytes == 4)
|
||||
{
|
||||
D_DrawSparkTrans32(pparticle);
|
||||
D_DrawSparkTrans32(pparticle, src, dest);
|
||||
return;
|
||||
}
|
||||
if (r_pixbytes == 2)
|
||||
{
|
||||
D_DrawSparkTrans16(pparticle);
|
||||
D_DrawSparkTrans16(pparticle, src, dest);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -955,21 +923,8 @@ void D_DrawSparkTrans (particle_t *pparticle) //draw a line in 3d space, 8bpp
|
|||
if (t_state & TT_ZERO)
|
||||
return;
|
||||
|
||||
speed = Length(pparticle->vel);
|
||||
if ((speed) < 1)
|
||||
{
|
||||
D_2dPos(pparticle->org, &u1, &v1, &z1);
|
||||
D_2dPos(pparticle->org, &u2, &v2, &z2);
|
||||
}
|
||||
else
|
||||
{ //causes flickers with lower vels (due to bouncing in physics)
|
||||
if (speed < 50)
|
||||
speed *= 50/speed;
|
||||
VectorMA(pparticle->org, 2.5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u1, &v1, &z1);
|
||||
VectorMA(pparticle->org, -2.5/(speed), pparticle->vel, delta);
|
||||
D_2dPos(delta, &u2, &v2, &z2);
|
||||
}
|
||||
D_2dPos(src, &u1, &v1, &z1);
|
||||
D_2dPos(dest, &u2, &v2, &z2);
|
||||
|
||||
if ((v1 > d_vrectbottom_particle) ||
|
||||
(u1 > d_vrectright_particle) ||
|
||||
|
|
|
@ -79,7 +79,7 @@ void R_CalcTransTable(int table, int level)
|
|||
else
|
||||
rvr = 0;
|
||||
|
||||
COM_FOpenFile (va("data/ttable%i.dat", (int) level) , &f); //we can ignore the filesize return value
|
||||
COM_FOpenFile (va("tables/ttable%i.dat", (int) level) , &f); //we can ignore the filesize return value
|
||||
if (f)
|
||||
{
|
||||
if (fread (t_lookup[table], 256, 256, f) == 256)
|
||||
|
@ -126,14 +126,14 @@ void R_CalcTransTable(int table, int level)
|
|||
|
||||
if (r_transtablewrite.value)
|
||||
{
|
||||
COM_CreatePath(va("%s/data/", com_gamedir));
|
||||
COM_CreatePath(va("%s/tables/", com_gamedir));
|
||||
#if 1
|
||||
f = fopen (va("%s/data/ttable%i.dat", com_gamedir, (int) level), "wb");
|
||||
f = fopen (va("%s/tables/ttable%i.dat", com_gamedir, (int) level), "wb");
|
||||
if (f)
|
||||
{
|
||||
if (fwrite (t_lookup[table], 256, 256, f) != 256)
|
||||
{
|
||||
Con_Printf("Couldn't write data to \"data/ttable%i.dat\"\n", (int) level);
|
||||
Con_Printf("Couldn't write data to \"tables/ttable%i.dat\"\n", (int) level);
|
||||
fclose(f);
|
||||
if (rvr)
|
||||
R_ReverseTable(table); // make sure it gets reversed if needed
|
||||
|
@ -142,9 +142,9 @@ void R_CalcTransTable(int table, int level)
|
|||
fclose(f);
|
||||
}
|
||||
else
|
||||
Con_Printf("Couldn't write data to \"data/ttable%i.dat\"\n", (int) level);
|
||||
Con_Printf("Couldn't write data to \"tables/ttable%i.dat\"\n", (int) level);
|
||||
#else
|
||||
COM_WriteFile(va("data/ttable%i.dat", (int)level, t_lookup[table], 256*256);
|
||||
COM_WriteFile(va("tables/ttable%i.dat", (int)level, t_lookup[table], 256*256);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#endif
|
||||
#include "d_local.h" //trans stuff
|
||||
|
||||
#include "sw_draw.h"
|
||||
|
||||
extern unsigned int *d_8to32table;
|
||||
|
||||
typedef struct {
|
||||
|
@ -1010,9 +1012,8 @@ void SWDraw_Pic (int x, int y, mpic_t *pic)
|
|||
Draw_SubPic
|
||||
=============
|
||||
*/
|
||||
void SWDraw_TransSubPic(int x, int y, qpic_t *qpic, int srcx, int srcy, int width, int height)
|
||||
void SWDraw_TransSubPic(int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height)
|
||||
{
|
||||
mpic_t *pic = (mpic_t *)qpic;
|
||||
qbyte *dest, *source;
|
||||
int v, u;
|
||||
|
||||
|
@ -1103,15 +1104,14 @@ void SWDraw_TransSubPic(int x, int y, qpic_t *qpic, int srcx, int srcy, int widt
|
|||
Draw_SubPic
|
||||
=============
|
||||
*/
|
||||
void SWDraw_SubPic(int x, int y, qpic_t *qpic, int srcx, int srcy, int width, int height)
|
||||
void SWDraw_SubPic(int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height)
|
||||
{
|
||||
mpic_t *pic = (mpic_t *)qpic;
|
||||
qbyte *dest, *source;
|
||||
int v, u;
|
||||
|
||||
if (pic->flags & MPIC_ALPHA)
|
||||
{
|
||||
SWDraw_TransSubPic(x, y, qpic, srcx, srcy, width, height);
|
||||
SWDraw_TransSubPic(x, y, pic, srcx, srcy, width, height);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1328,42 +1328,39 @@ void SWDraw_TransPic (int x, int y, mpic_t *pic)
|
|||
Draw_TransPicTranslate
|
||||
=============
|
||||
*/
|
||||
void SWDraw_TransPicTranslate (int x, int y, qpic_t *qpic, qbyte *translation)
|
||||
void SWDraw_TransPicTranslate (int x, int y, int width, int height, qbyte *source, qbyte *translation)
|
||||
{
|
||||
mpic_t *pic = (mpic_t*)qpic;
|
||||
qbyte *source, tbyte;
|
||||
qbyte tbyte;
|
||||
int v, u;
|
||||
|
||||
if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
|
||||
(unsigned)(y + pic->height) > vid.height)
|
||||
if (x < 0 || (unsigned)(x + width) > vid.width || y < 0 ||
|
||||
(unsigned)(y + height) > vid.height)
|
||||
{
|
||||
Sys_Error ("Draw_TransPic: bad coordinates");
|
||||
}
|
||||
|
||||
source = pic->data;
|
||||
|
||||
if (r_pixbytes == 1)
|
||||
{
|
||||
qbyte *dest;
|
||||
dest = vid.buffer + y * vid.rowbytes + x;
|
||||
|
||||
if (pic->width & 7)
|
||||
if (width & 7)
|
||||
{ // general
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
for (v=0 ; v<height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
for (u=0 ; u<width ; u++)
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = translation[tbyte];
|
||||
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
source += width;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // unwound
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
for (v=0 ; v<height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u+=8)
|
||||
for (u=0 ; u<width ; u+=8)
|
||||
{
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
dest[u] = translation[tbyte];
|
||||
|
@ -1383,7 +1380,7 @@ void SWDraw_TransPicTranslate (int x, int y, qpic_t *qpic, qbyte *translation)
|
|||
dest[u+7] = translation[tbyte];
|
||||
}
|
||||
dest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
source += width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1393,23 +1390,23 @@ void SWDraw_TransPicTranslate (int x, int y, qpic_t *qpic, qbyte *translation)
|
|||
|
||||
puidest = (unsigned int *)(vid.buffer + ((y * vid.rowbytes + x) << 2));
|
||||
|
||||
if (pic->width & 7)
|
||||
if (width & 7)
|
||||
{ // general
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
for (v=0 ; v<height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u++)
|
||||
for (u=0 ; u<width ; u++)
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
puidest[u] = d_8to32table[translation[tbyte]];
|
||||
|
||||
puidest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
source += width;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // unwound
|
||||
for (v=0 ; v<pic->height ; v++)
|
||||
for (v=0 ; v<height ; v++)
|
||||
{
|
||||
for (u=0 ; u<pic->width ; u+=8)
|
||||
for (u=0 ; u<width ; u+=8)
|
||||
{
|
||||
if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
|
||||
puidest[u] = d_8to32table[translation[tbyte]];
|
||||
|
@ -1429,7 +1426,7 @@ void SWDraw_TransPicTranslate (int x, int y, qpic_t *qpic, qbyte *translation)
|
|||
puidest[u+7] = d_8to32table[translation[tbyte]];
|
||||
}
|
||||
puidest += vid.rowbytes;
|
||||
source += pic->width;
|
||||
source += width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1694,9 +1691,8 @@ void SWDraw_ImageColours (float r, float g, float b, float a) //like glcolour4f
|
|||
SWDraw_Image_Blend = r<1 || b<1 || g<1 || a<1;
|
||||
}
|
||||
|
||||
void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, float s2, float t2, qpic_t *qpic)
|
||||
void SWDraw_Image (float xp, float yp, float wp, float hp, float s1, float t1, float s2, float t2, mpic_t *pic)
|
||||
{
|
||||
mpic_t *pic = (mpic_t*)qpic;
|
||||
float xend, yend, xratio, yratio;
|
||||
|
||||
if (!pic)
|
||||
|
|
|
@ -32,7 +32,7 @@ void SWDraw_DebugChar (qbyte num);
|
|||
void SWDraw_SubPic(int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height);
|
||||
void SWDraw_Pic (int x, int y, mpic_t *pic);
|
||||
void SWDraw_TransPic (int x, int y, mpic_t *pic);
|
||||
void SWDraw_TransPicTranslate (int x, int y, mpic_t *pic, qbyte *translation);
|
||||
void SWDraw_TransPicTranslate (int x, int y, int w, int h, qbyte *pic, qbyte *translation);
|
||||
void SWDraw_ConsoleBackground (int lines);
|
||||
void SWDraw_EditorBackground (int lines);
|
||||
void SWDraw_BeginDisc (void);
|
||||
|
|
|
@ -147,7 +147,7 @@ void SWSCR_UpdateScreen (void)
|
|||
D_DisableBackBufferAccess (); // for adapters that can't stay mapped in
|
||||
// for linear writes all the time
|
||||
|
||||
nohud = true;
|
||||
nohud = false;
|
||||
#ifdef TEXTEDIT
|
||||
if (!editormodal) //don't render view.
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue