1
0
Fork 0
forked from fte/fteqw

Cleaned up GL a minor amount more.

Sounds can now be recorded while capturing to tga sequences (as raw sound). Fixed frame limits a little.
Passed the unicode key values around to a few more key input functions.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3332 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2009-07-25 11:05:06 +00:00
parent bce186834f
commit 10accd2908
30 changed files with 434 additions and 272 deletions

View file

@ -1179,7 +1179,7 @@ void CG_Command_f(void)
} }
} }
qboolean CG_KeyPress(int key, int down) qboolean CG_KeyPress(int key, int unicode, int down)
{ {
if (!cgvm || !(keycatcher&8)) if (!cgvm || !(keycatcher&8))
return false; return false;

View file

@ -2622,7 +2622,8 @@ void CL_LinkPlayers (void)
ent->forcedshader = NULL; ent->forcedshader = NULL;
#endif #endif
if (state->command.impulse && cl.model_precache_vwep[0]) //the extra modelindex check is to stop lame mods from using vweps with rings
if (state->command.impulse && cl.model_precache_vwep[0] && state->modelindex == cl_playerindex)
ent->model = cl.model_precache_vwep[0]; ent->model = cl.model_precache_vwep[0];
else else
ent->model = cl.model_precache[state->modelindex]; ent->model = cl.model_precache[state->modelindex];

View file

@ -1411,7 +1411,7 @@ int UI_MenuState(void)
return 0; return 0;
} }
qboolean UI_KeyPress(int key, qboolean down) qboolean UI_KeyPress(int key, int unicode, qboolean down)
{ {
extern qboolean keydown[256]; extern qboolean keydown[256];
extern int keyshift[256]; // key to map to if shift held down in console extern int keyshift[256]; // key to map to if shift held down in console

View file

@ -976,7 +976,7 @@ void CSQC_Input_Frame(int lplayernum, usercmd_t *cmd);
void CSQC_WorldLoaded(void); void CSQC_WorldLoaded(void);
qboolean CSQC_ParseTempEntity(unsigned char firstbyte); qboolean CSQC_ParseTempEntity(unsigned char firstbyte);
qboolean CSQC_ConsoleCommand(char *cmd); qboolean CSQC_ConsoleCommand(char *cmd);
qboolean CSQC_KeyPress(int key, qboolean down); qboolean CSQC_KeyPress(int key, int unicode, qboolean down);
int CSQC_StartSound(int entnum, int channel, char *soundname, vec3_t pos, float vol, float attenuation); int CSQC_StartSound(int entnum, int channel, char *soundname, vec3_t pos, float vol, float attenuation);
void CSQC_ParseEntities(void); void CSQC_ParseEntities(void);
qboolean CSQC_SettingListener(void); qboolean CSQC_SettingListener(void);
@ -1168,7 +1168,7 @@ void Media_Send_Command(cin_t *cin, char *command);
void Media_Send_MouseMove(cin_t *cin, float x, float y); void Media_Send_MouseMove(cin_t *cin, float x, float y);
void Media_Send_Resize(cin_t *cin, int x, int y); void Media_Send_Resize(cin_t *cin, int x, int y);
void Media_Send_GetSize(cin_t *cin, int *x, int *y); void Media_Send_GetSize(cin_t *cin, int *x, int *y);
void Media_Send_KeyEvent(cin_t *cin, int button, int event); void Media_Send_KeyEvent(cin_t *cin, int button, int unicode, int event);
void MVD_Interpolate(void); void MVD_Interpolate(void);

View file

@ -547,8 +547,7 @@ void Con_PrintCon (console_t *con, char *txt)
cr = true; cr = true;
break; break;
case '\n': case '\n':
if (cr) cr = false;
cr = false;
while (con->linecount >= con_maxlines.value) while (con->linecount >= con_maxlines.value)
{ {
if (con->oldest == con->current) if (con->oldest == con->current)
@ -578,7 +577,10 @@ void Con_PrintCon (console_t *con, char *txt)
break; break;
default: default:
if (cr) if (cr)
{
con->current->length = 0; con->current->length = 0;
cr = false;
}
if (selstartline == con->current) if (selstartline == con->current)
selstartline = NULL; selstartline = NULL;

View file

@ -1371,7 +1371,7 @@ void IN_MouseEvent (int mstate)
{ {
int i; int i;
if (dinput) if (dinput && mouseactive)
return; return;
#ifdef HLCLIENT #ifdef HLCLIENT
@ -1379,7 +1379,7 @@ void IN_MouseEvent (int mstate)
return; return;
#endif #endif
if (mouseactive || (key_dest != key_game)) if (1)//mouseactive || (key_dest != key_game))
{ {
// perform button actions // perform button actions
for (i=0 ; i<sysmouse.numbuttons ; i++) for (i=0 ; i<sysmouse.numbuttons ; i++)
@ -1463,10 +1463,11 @@ static void ProcessMouse(mouse_t *mouse, float *movements, int pnum)
if(in_xflip.value) mx *= -1; if(in_xflip.value) mx *= -1;
#endif #endif
mousemove_x += mx;
mousemove_y += my;
if (Key_MouseShouldBeFree()) if (Key_MouseShouldBeFree())
{ {
mousemove_x += mx;
mousemove_y += my;
mousecursor_x += mx; mousecursor_x += mx;
mousecursor_y += my; mousecursor_y += my;

View file

@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
key up events are sent even if in console mode key up events are sent even if in console mode
*/ */
void Editor_Key(int key); void Editor_Key(int key, int unicode);
#define KEY_MODIFIERSTATES 8 #define KEY_MODIFIERSTATES 8
#define MAXCMDLINE 256 #define MAXCMDLINE 256
@ -451,7 +451,7 @@ qboolean Key_GetConsoleSelectionBox(int *sx, int *sy, int *ex, int *ey)
return true; return true;
} }
void Key_ConsoleRelease(int key) void Key_ConsoleRelease(int key, int unicode)
{ {
if (key == K_MOUSE1) if (key == K_MOUSE1)
con_mousedown[2] = false; con_mousedown[2] = false;
@ -479,7 +479,6 @@ Interactive line editing and console scrollback
void Key_Console (unsigned int unicode, int key) void Key_Console (unsigned int unicode, int key)
{ {
char *clipText; char *clipText;
int upperconbound;
if (con_current->redirect) if (con_current->redirect)
{ {
@ -1301,12 +1300,12 @@ qboolean Key_MouseShouldBeFree(void)
//if true, the input code is expected to return mouse cursor positions rather than deltas //if true, the input code is expected to return mouse cursor positions rather than deltas
extern int mouseusedforgui; extern int mouseusedforgui;
if (mouseusedforgui) //I don't like this // if (mouseusedforgui) //I don't like this
return true; // return true;
if (key_dest == key_menu) if (key_dest == key_menu)
{ {
if (m_state == m_complex || m_state == m_plugin || m_state == m_menu_dat) if (m_state == m_complex || m_state == m_plugin /*|| m_state == m_menu_dat*/)
return true; return true;
} }
if (key_dest == key_console) if (key_dest == key_console)
@ -1463,11 +1462,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
if (key_dest == key_game) if (key_dest == key_game)
{ {
#ifdef CSQC_DAT #ifdef CSQC_DAT
if (CSQC_KeyPress(key, down)) //give csqc a chance to handle it. if (CSQC_KeyPress(key, unicode, down)) //give csqc a chance to handle it.
return; return;
#endif #endif
#ifdef VM_CG #ifdef VM_CG
if (CG_KeyPress(key, down)) if (CG_KeyPress(key, unicode, down))
return; return;
#endif #endif
} }
@ -1482,7 +1481,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
if (key_dest == key_game) if (key_dest == key_game)
#endif #endif
{ {
if (UI_KeyPress(key, down)) //Allow the UI to see the escape key. It is possible that a developer may get stuck at a menu. if (UI_KeyPress(key, unicode, down)) //Allow the UI to see the escape key. It is possible that a developer may get stuck at a menu.
return; return;
} }
#endif #endif
@ -1490,7 +1489,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
if (!down) if (!down)
{ {
if (key_dest == key_menu) if (key_dest == key_menu)
M_Keyup (key); M_Keyup (key, unicode);
return; return;
} }
switch (key_dest) switch (key_dest)
@ -1499,11 +1498,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
Key_Message (key, unicode); Key_Message (key, unicode);
break; break;
case key_menu: case key_menu:
M_Keydown (key); M_Keydown (key, unicode);
break; break;
#ifdef TEXTEDITOR #ifdef TEXTEDITOR
case key_editor: case key_editor:
Editor_Key (key); Editor_Key (key, unicode);
break; break;
#endif #endif
case key_game: case key_game:
@ -1524,7 +1523,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
#ifndef NOMEDIA #ifndef NOMEDIA
if (key_dest == key_game && Media_PlayingFullScreen()) if (key_dest == key_game && Media_PlayingFullScreen())
{ {
Media_Send_KeyEvent(NULL, key, down?0:1); Media_Send_KeyEvent(NULL, key, unicode, down?0:1);
return; return;
} }
#endif #endif
@ -1541,10 +1540,10 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
switch (key_dest) switch (key_dest)
{ {
case key_menu: case key_menu:
M_Keyup (key); M_Keyup (key, unicode);
break; break;
case key_console: case key_console:
Key_ConsoleRelease(key); Key_ConsoleRelease(key, unicode);
break; break;
default: default:
break; break;
@ -1589,7 +1588,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
if (key != '`' && key != '~') if (key != '`' && key != '~')
if (key_dest == key_game || !down) if (key_dest == key_game || !down)
{ {
if (UI_KeyPress(key, down) && down) //UI is allowed to take these keydowns. Keyups are always maintained. if (UI_KeyPress(key, unicode, down) && down) //UI is allowed to take these keydowns. Keyups are always maintained.
return; return;
} }
#endif #endif
@ -1617,7 +1616,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
return; return;
} }
if (shift_down) if (shift_down && unicode < K_MAX && keyshift[unicode])
unicode = keyshift[unicode]; unicode = keyshift[unicode];
if (!down) if (!down)
@ -1625,7 +1624,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
switch (key_dest) switch (key_dest)
{ {
case key_menu: case key_menu:
M_Keyup (key); M_Keyup (key, unicode);
break; break;
default: default:
break; break;
@ -1639,11 +1638,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down)
Key_Message (key, unicode); Key_Message (key, unicode);
break; break;
case key_menu: case key_menu:
M_Keydown (key); M_Keydown (key, unicode);
break; break;
#ifdef TEXTEDITOR #ifdef TEXTEDITOR
case key_editor: case key_editor:
Editor_Key (key); Editor_Key (key, unicode);
break; break;
#endif #endif
case key_game: case key_game:

View file

@ -814,7 +814,7 @@ struct cin_s {
void (*shutdown)(cin_t *cin); //warning: don't free cin_t void (*shutdown)(cin_t *cin); //warning: don't free cin_t
//these are any interactivity functions you might want... //these are any interactivity functions you might want...
void (*cursormove) (struct cin_s *cin, float posx, float posy); //pos is 0-1 void (*cursormove) (struct cin_s *cin, float posx, float posy); //pos is 0-1
void (*key) (struct cin_s *cin, int code, int event); void (*key) (struct cin_s *cin, int code, int unicode, int event);
qboolean (*setsize) (struct cin_s *cin, int width, int height); qboolean (*setsize) (struct cin_s *cin, int width, int height);
void (*getsize) (struct cin_s *cin, int *width, int *height); void (*getsize) (struct cin_s *cin, int *width, int *height);
void (*changestream) (struct cin_s *cin, char *streamname); void (*changestream) (struct cin_s *cin, char *streamname);
@ -833,7 +833,6 @@ struct cin_s {
PGETFRAME pgf; PGETFRAME pgf;
LPWAVEFORMAT pWaveFormat; LPWAVEFORMAT pWaveFormat;
HWND capturewindow;
//sound stuff //sound stuff
int soundpos; int soundpos;
@ -1746,13 +1745,13 @@ void Media_Send_Command(cin_t *cin, char *command)
return; return;
cin->changestream(cin, command); cin->changestream(cin, command);
} }
void Media_Send_KeyEvent(cin_t *cin, int button, int event) void Media_Send_KeyEvent(cin_t *cin, int button, int unicode, int event)
{ {
if (!cin) if (!cin)
cin = fullscreenvid; cin = fullscreenvid;
if (!cin || !cin->key) if (!cin || !cin->key)
return; return;
cin->key(cin, button, event); cin->key(cin, button, unicode, event);
} }
void Media_Send_MouseMove(cin_t *cin, float x, float y) void Media_Send_MouseMove(cin_t *cin, float x, float y)
{ {
@ -1828,6 +1827,7 @@ float recordavi_audiotime;
int capturesize; int capturesize;
int capturewidth; int capturewidth;
char *capturevideomem; char *capturevideomem;
vfsfile_t *captureaudiorawfile;
//short *captureaudiomem; //short *captureaudiomem;
int captureaudiosamples; int captureaudiosamples;
int captureframe; int captureframe;
@ -1867,7 +1867,7 @@ qboolean Media_PausedDemo (void)
//capturedemo doesn't record any frames when the console is visible //capturedemo doesn't record any frames when the console is visible
//but that's okay, as we don't load any demo frames either. //but that's okay, as we don't load any demo frames either.
if ((cls.demoplayback && Media_Capturing()) || capturepaused) if ((cls.demoplayback && Media_Capturing()) || capturepaused)
if (scr_con_current > 0 || !cl.validsequence || capturepaused) if (key_dest != key_game || scr_con_current > 0 || !cl.validsequence || capturepaused)
return true; return true;
return false; return false;
@ -1875,7 +1875,7 @@ qboolean Media_PausedDemo (void)
double Media_TweekCaptureFrameTime(double time) double Media_TweekCaptureFrameTime(double time)
{ {
if (cls.demoplayback && Media_Capturing() && recordavi_frametime>0.01) if (cls.demoplayback && Media_Capturing() && recordavi_frametime)
{ {
return time = recordavi_frametime; return time = recordavi_frametime;
} }
@ -2053,6 +2053,16 @@ static void MSD_Submit(soundcardinfo_t *sc)
case CT_NONE: case CT_NONE:
break; break;
case CT_SCREENSHOT: case CT_SCREENSHOT:
if ((sc->snd_completed % (sc->sn.samples/sc->sn.numchannels)) < offset)
{
int partialsamplestosubmit;
//wraped, two chunks to send
partialsamplestosubmit = ((sc->sn.samples/sc->sn.numchannels)) - offset;
VFS_WRITE(captureaudiorawfile, sc->sn.buffer+offset*bytespersample, partialsamplestosubmit*bytespersample);
samplestosubmit -= partialsamplestosubmit;
offset = 0;
}
VFS_WRITE(captureaudiorawfile, sc->sn.buffer+offset*bytespersample, samplestosubmit*bytespersample);
break; break;
} }
} }
@ -2116,9 +2126,17 @@ void Media_StopRecordFilm_f (void)
recordavi_file = NULL; recordavi_file = NULL;
#endif /* WINAVI */ #endif /* WINAVI */
if (capturevideomem) BZ_Free(capturevideomem); if (capturevideomem)
BZ_Free(capturevideomem);
capturevideomem = NULL;
if (capture_fakesounddevice) S_ShutdownCard(capture_fakesounddevice); if (capture_fakesounddevice)
S_ShutdownCard(capture_fakesounddevice);
capture_fakesounddevice = NULL;
if (captureaudiorawfile)
VFS_CLOSE(captureaudiorawfile);
captureaudiorawfile = NULL;
capturevideomem = NULL; capturevideomem = NULL;
@ -2153,6 +2171,8 @@ void Media_RecordFilm_f (void)
} }
recordavi_frametime = 1/capturerate.value; recordavi_frametime = 1/capturerate.value;
if (recordavi_frametime < 0.001)
recordavi_frametime = 0.001; //no more than 1000 images per second.
captureframe = 0; captureframe = 0;
if (*fourcc) if (*fourcc)
@ -2181,6 +2201,23 @@ void Media_RecordFilm_f (void)
} }
else if (capturetype == CT_SCREENSHOT) else if (capturetype == CT_SCREENSHOT)
{ {
if (capturesound.value && capturesoundchannels.value >= 1)
{
char filename[MAX_OSPATH];
int chans = capturesoundchannels.value;
int sbits = capturesoundbits.value;
if (sbits < 8)
sbits = 8;
if (sbits != 8)
sbits = 16;
if (chans > 6)
chans = 6;
sprintf(filename, "%s/audio_%ichan_%ikhz_%ib.raw", capturefilenameprefix, chans, snd_speed/1000, sbits);
captureaudiorawfile = FS_OpenVFS(filename, "wb", FS_GAMEONLY);
if (captureaudiorawfile)
Media_InitFakeSoundDevice(chans, sbits);
}
} }
#if defined(WINAVI) #if defined(WINAVI)
else if (capturetype == CT_AVI) else if (capturetype == CT_AVI)
@ -2401,7 +2438,7 @@ void Media_StopRecordFilm_f (void) {}
void Media_RecordFilm_f (void){} void Media_RecordFilm_f (void){}
void M_Menu_Media_f (void) {} void M_Menu_Media_f (void) {}
char *Media_NextTrack(void) {return NULL;} char *Media_NextTrack(int musicchannelnum) {return NULL;}
qboolean Media_PausedDemo(void) {return false;} qboolean Media_PausedDemo(void) {return false;}
qboolean Media_PlayingFullScreen(void) {return false;} qboolean Media_PlayingFullScreen(void) {return false;}

View file

@ -1081,7 +1081,7 @@ void M_Draw (int uimenu)
} }
void M_Keydown (int key) void M_Keydown (int key, int unicode)
{ {
switch (m_state) switch (m_state)
{ {
@ -1115,14 +1115,14 @@ void M_Keydown (int key)
#endif #endif
#ifdef MENU_DAT #ifdef MENU_DAT
case m_menu_dat: case m_menu_dat:
MP_Keydown(key); MP_Keydown(key, unicode);
return; return;
#endif #endif
} }
} }
void M_Keyup (int key) void M_Keyup (int key, int unicode)
{ {
switch (m_state) switch (m_state)
{ {
@ -1133,7 +1133,7 @@ void M_Keyup (int key)
#endif #endif
#ifdef MENU_DAT #ifdef MENU_DAT
case m_menu_dat: case m_menu_dat:
MP_Keyup(key); MP_Keyup(key, unicode);
return; return;
#endif #endif
default: default:

View file

@ -102,8 +102,8 @@ void M_SomeInitialisationFunctionCalledAtStartup(void)
// menus // menus
// //
void M_Init (void); void M_Init (void);
void M_Keydown (int key); void M_Keydown (int key, int unicode);
void M_Keyup (int key); void M_Keyup (int key, int unicode);
void M_Draw (int uimenu); void M_Draw (int uimenu);
void M_ToggleMenu_f (void); void M_ToggleMenu_f (void);
mpic_t *M_CachePic (char *path); mpic_t *M_CachePic (char *path);
@ -400,8 +400,8 @@ void MP_Init (void);
qboolean MP_Toggle(void); qboolean MP_Toggle(void);
void MP_Draw(void); void MP_Draw(void);
void MP_RegisterCvarsAndCmds(void); void MP_RegisterCvarsAndCmds(void);
void MP_Keydown(int key); void MP_Keydown(int key, int unicode);
void MP_Keyup(int key); void MP_Keyup(int key, int unicode);
#define MGT_BAD ~0 #define MGT_BAD ~0
#define MGT_QUAKE1 0 #define MGT_QUAKE1 0

View file

@ -187,7 +187,7 @@ static void PClassic_InitParticles (void)
{ {
mod->particleeffect = P_INVALID; mod->particleeffect = P_INVALID;
mod->particletrail = P_INVALID; mod->particletrail = P_INVALID;
mod->engineflags &= ~MDLF_NODEFAULTTRAIL; mod->engineflags &= ~(MDLF_NODEFAULTTRAIL | MDLF_ENGULPHS);
P_DefaultTrail(mod); P_DefaultTrail(mod);
} }

View file

@ -1546,7 +1546,7 @@ static void R_ParticlesDesc_Callback(struct cvar_s *var, char *oldvalue)
{ {
mod->particleeffect = P_INVALID; mod->particleeffect = P_INVALID;
mod->particletrail = P_INVALID; mod->particletrail = P_INVALID;
mod->engineflags &= ~MDLF_NODEFAULTTRAIL; mod->engineflags &= ~(MDLF_NODEFAULTTRAIL | MDLF_ENGULPHS);
P_DefaultTrail(mod); P_DefaultTrail(mod);
} }

View file

@ -3334,7 +3334,7 @@ static void PF_cs_gecko_keyevent (progfuncs_t *prinst, struct globalvars_s *pr_g
if (!cin) if (!cin)
return; return;
Media_Send_KeyEvent(cin, MP_TranslateDPtoFTECodes(key), eventtype); Media_Send_KeyEvent(cin, MP_TranslateDPtoFTECodes(key), (key>127)?0:key, eventtype);
} }
// #491 void gecko_mousemove( string name, float x, float y ) // #491 void gecko_mousemove( string name, float x, float y )
static void PF_cs_gecko_mousemove (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_cs_gecko_mousemove (progfuncs_t *prinst, struct globalvars_s *pr_globals)
@ -5959,7 +5959,7 @@ qboolean CSQC_DrawView(void)
return true; return true;
} }
qboolean CSQC_KeyPress(int key, qboolean down) qboolean CSQC_KeyPress(int key, int unicode, qboolean down)
{ {
void *pr_globals; void *pr_globals;
@ -5969,7 +5969,7 @@ qboolean CSQC_KeyPress(int key, qboolean down)
pr_globals = PR_globals(csqcprogs, PR_CURRENT); pr_globals = PR_globals(csqcprogs, PR_CURRENT);
G_FLOAT(OFS_PARM0) = !down; G_FLOAT(OFS_PARM0) = !down;
G_FLOAT(OFS_PARM1) = MP_TranslateFTEtoDPCodes(key); G_FLOAT(OFS_PARM1) = MP_TranslateFTEtoDPCodes(key);
G_FLOAT(OFS_PARM2) = 0; G_FLOAT(OFS_PARM2) = unicode;
PR_ExecuteProgram (csqcprogs, csqcg.input_event); PR_ExecuteProgram (csqcprogs, csqcg.input_event);

View file

@ -419,7 +419,7 @@ void PF_CL_stringwidth(progfuncs_t *prinst, struct globalvars_s *pr_globals)
if (*prinst->callargc > 2) if (*prinst->callargc > 2)
fontsize = G_FLOAT(OFS_PARM2); fontsize = G_FLOAT(OFS_PARM2);
else else
fontsize = 8; fontsize = 1;
if (usecolours) if (usecolours)
{ {
G_FLOAT(OFS_RETURN) = COM_FunStringLength(text)*fontsize; G_FLOAT(OFS_RETURN) = COM_FunStringLength(text)*fontsize;
@ -788,8 +788,8 @@ void PF_cl_getmousepos (progfuncs_t *prinst, struct globalvars_s *pr_globals)
mousemove_x=0; mousemove_x=0;
mousemove_y=0; mousemove_y=0;
ret[0] = mousecursor_x; // ret[0] = mousecursor_x;
ret[1] = mousecursor_y; // ret[1] = mousecursor_y;
ret[2] = 0; ret[2] = 0;
} }
@ -1986,7 +1986,7 @@ int MP_TranslateDPtoFTECodes(int code)
} }
} }
void MP_Keydown(int key) void MP_Keydown(int key, int unicode)
{ {
extern qboolean keydown[K_MAX]; extern qboolean keydown[K_MAX];
if (setjmp(mp_abort)) if (setjmp(mp_abort))
@ -2018,16 +2018,13 @@ void MP_Keydown(int key)
{ {
void *pr_globals = PR_globals(menuprogs, PR_CURRENT); void *pr_globals = PR_globals(menuprogs, PR_CURRENT);
G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key); G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key);
if (G_FLOAT(OFS_PARM0) > 127) G_FLOAT(OFS_PARM1) = unicode;
G_FLOAT(OFS_PARM1) = 0;
else
G_FLOAT(OFS_PARM1) = G_FLOAT(OFS_PARM0);
PR_ExecuteProgram(menuprogs, mp_keydown_function); PR_ExecuteProgram(menuprogs, mp_keydown_function);
} }
inmenuprogs--; inmenuprogs--;
} }
void MP_Keyup(int key) void MP_Keyup(int key, int unicode)
{ {
if (setjmp(mp_abort)) if (setjmp(mp_abort))
return; return;
@ -2041,10 +2038,7 @@ void MP_Keyup(int key)
{ {
void *pr_globals = PR_globals(menuprogs, PR_CURRENT); void *pr_globals = PR_globals(menuprogs, PR_CURRENT);
G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key); G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key);
if (G_FLOAT(OFS_PARM0) > 127) G_FLOAT(OFS_PARM1) = unicode;
G_FLOAT(OFS_PARM1) = 0;
else
G_FLOAT(OFS_PARM1) = G_FLOAT(OFS_PARM0);
PR_ExecuteProgram(menuprogs, mp_keyup_function); PR_ExecuteProgram(menuprogs, mp_keyup_function);
} }
inmenuprogs--; inmenuprogs--;

View file

@ -1802,4 +1802,4 @@ void Sys_DestroyConditional(void *condv)
DeleteCriticalSection(&cv->mainlock); DeleteCriticalSection(&cv->mainlock);
free(cv); free(cv);
} }
#endif #endif

View file

@ -350,7 +350,7 @@ void EditorOpenFile(char *name)
editoractive = true; editoractive = true;
} }
void Editor_Key(int key) void Editor_Key(int key, int unicode)
{ {
int i; int i;
if (keybindings[key][0]) if (keybindings[key][0])
@ -420,9 +420,12 @@ void Editor_Key(int key)
evalstring[i-1] = '\0'; evalstring[i-1] = '\0';
break; break;
default: default:
i = strlen(evalstring); if (unicode)
evalstring[i] = key; {
evalstring[i+1] = '\0'; i = strlen(evalstring);
evalstring[i] = unicode;
evalstring[i+1] = '\0';
}
break; break;
} }
return; return;
@ -700,7 +703,7 @@ void Editor_Key(int key)
insertkeyhit = insertkeyhit?false:true; insertkeyhit = insertkeyhit?false:true;
break; break;
default: default:
if ((key < ' ' || key > 127) && key != '\t') //we deem these as unprintable if (unicode < ' ' && unicode != '\t') //we deem these as unprintable
break; break;
if (insertkeyhit) //insert a char if (insertkeyhit) //insert a char
@ -719,13 +722,13 @@ void Editor_Key(int key)
} }
cursorx++; cursorx++;
cursorblock->datalength++; cursorblock->datalength++;
*(s+1) = key; *(s+1) = unicode;
} }
else //over write a char else //over write a char
{ {
MakeNewSize(cursorblock, cursorblock->datalength+5); //not really needed MakeNewSize(cursorblock, cursorblock->datalength+5); //not really needed
cursorblock->data[cursorx] = key; cursorblock->data[cursorx] = unicode;
cursorx++; cursorx++;
if (cursorx > cursorblock->datalength) if (cursorx > cursorblock->datalength)
cursorblock->datalength = cursorx; cursorblock->datalength = cursorx;

View file

@ -145,7 +145,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// #define HLCLIENT //we can run HL gamecode (not protocol compatible) // #define HLCLIENT //we can run HL gamecode (not protocol compatible)
// #define HLSERVER //we can run HL gamecode (not protocol compatible) // #define HLSERVER //we can run HL gamecode (not protocol compatible)
#define NQPROT //server and client are capable of using quake1/netquake protocols. (qw is still prefered. uses the command 'nqconnect') #define NQPROT //server and client are capable of using quake1/netquake protocols. (qw is still prefered. uses the command 'nqconnect')
#define FISH //sw rendering only #define FISH //fisheye distortion stuff
#define ZLIB //zip/pk3 support #define ZLIB //zip/pk3 support
#define WEBSERVER //http/ftp servers #define WEBSERVER //http/ftp servers
#define WEBCLIENT //http/ftp clients. #define WEBCLIENT //http/ftp clients.
@ -187,7 +187,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#endif #endif
//temporarily disable stuff here, so as to not break any custom configs //temporarily disable stuff here, so as to not break any custom configs
#ifdef Q3SHADERS
//#define NEWBACKEND //#define NEWBACKEND
#endif
//fix things a little... //fix things a little...

View file

@ -2305,9 +2305,6 @@ qboolean CModQ3_LoadFogs (lump_t *l)
} }
} }
if (count)
GL_InitFogTexture();
return true; return true;
} }
@ -2412,7 +2409,8 @@ mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, in
patch_cp[0] = patchwidth; patch_cp[0] = patchwidth;
patch_cp[1] = patchheight; patch_cp[1] = patchheight;
if ( !patch_cp[0] || !patch_cp[1] ) { if ( !patch_cp[0] || !patch_cp[1] )
{
return NULL; return NULL;
} }

View file

@ -90,7 +90,7 @@ qboolean UI_Q2LayoutChanged(void);
void UI_StringChanged(int num); void UI_StringChanged(int num);
void UI_MousePosition(int xpos, int ypos); void UI_MousePosition(int xpos, int ypos);
int UI_MenuState(void); int UI_MenuState(void);
qboolean UI_KeyPress(int key, qboolean down); qboolean UI_KeyPress(int key, int unicode, qboolean down);
void UI_Reset(void); void UI_Reset(void);
void UI_DrawMenu(void); void UI_DrawMenu(void);
qboolean UI_DrawStatusBar(int scores); qboolean UI_DrawStatusBar(int scores);
@ -121,7 +121,7 @@ void CG_Stop (void);
void CG_Start (void); void CG_Start (void);
int CG_Refresh(void); int CG_Refresh(void);
qboolean CG_Command(void); qboolean CG_Command(void);
qboolean CG_KeyPress(int key, int down); qboolean CG_KeyPress(int key, int unicode, int down);
#endif #endif
typedef struct { typedef struct {

View file

@ -1307,7 +1307,7 @@ void R_DrawGAliasModel (entity_t *e)
R_IBrokeTheArrays(); R_IBrokeTheArrays();
mb.entity = &r_worldentity; mb.entity = currententity;
mb.shader = currententity->forcedshader; mb.shader = currententity->forcedshader;
mb.fog = fog; mb.fog = fog;
mb.mesh = &mesh; mb.mesh = &mesh;
@ -1346,7 +1346,7 @@ void R_DrawGAliasModel (entity_t *e)
skin->shader->passes[0].flags &= ~SHADER_PASS_DEPTHWRITE; skin->shader->passes[0].flags &= ~SHADER_PASS_DEPTHWRITE;
} }
mb.entity = &r_worldentity; mb.entity = currententity;
mb.shader = skin->shader; mb.shader = skin->shader;
mb.fog = fog; mb.fog = fog;
mb.mesh = &mesh; mb.mesh = &mesh;

View file

@ -2,6 +2,8 @@
#include "glquake.h" #include "glquake.h"
#include "shader.h" #include "shader.h"
#ifndef NEWBACKEND
#ifdef RGLQUAKE #ifdef RGLQUAKE
#define MAX_TEXTURE_UNITS 8 #define MAX_TEXTURE_UNITS 8
@ -23,6 +25,7 @@ void GL_SetShaderState2D(qboolean is2d)
extern int *lightmap_textures; extern int *lightmap_textures;
extern int *deluxmap_textures; extern int *deluxmap_textures;
extern int gl_filter_max;
void GL_SelectTexture (GLenum target) void GL_SelectTexture (GLenum target)
{ {
@ -310,6 +313,43 @@ void R_FetchBottomColour(int *retred, int *retgreen, int *retblue)
} }
} }
#define FOG_TEXTURE_WIDTH 32
#define FOG_TEXTURE_HEIGHT 32
int r_fogtexture;
void GL_InitFogTexture (void)
{
qbyte data[FOG_TEXTURE_WIDTH*FOG_TEXTURE_HEIGHT];
int x, y;
float tw = 1.0f / ((float)FOG_TEXTURE_WIDTH - 1.0f);
float th = 1.0f / ((float)FOG_TEXTURE_HEIGHT - 1.0f);
float tx, ty, t;
if (r_fogtexture)
return;
//
// fog texture
//
for ( y = 0, ty = 0.0f; y < FOG_TEXTURE_HEIGHT; y++, ty += th )
{
for ( x = 0, tx = 0.0f; x < FOG_TEXTURE_WIDTH; x++, tx += tw )
{
t = (float)(sqrt( tx ) * 255.0);
data[x+y*FOG_TEXTURE_WIDTH] = (qbyte)(min( t, 255.0f ));
}
}
r_fogtexture = GL_AllocNewTexture();
GL_Bind(r_fogtexture);
qglTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, FOG_TEXTURE_WIDTH, FOG_TEXTURE_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data);
qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_max);
qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
void R_InitDynamicLightTexture (void) void R_InitDynamicLightTexture (void)
{ {
int x, y; int x, y;
@ -544,6 +584,8 @@ void R_BackendInit (void)
currentColor = inColorsArray[0]; currentColor = inColorsArray[0];
r_fogtexture = 0;
r_arrays_locked = false; r_arrays_locked = false;
r_blocked = false; r_blocked = false;
@ -577,6 +619,7 @@ void R_BackendInit (void)
} }
R_InitDynamicLightTexture(); R_InitDynamicLightTexture();
GL_InitFogTexture();
} }
qboolean varrayactive; qboolean varrayactive;
@ -2199,7 +2242,6 @@ R_RenderFogOnMesh
================ ================
*/ */
int r_fogtexture;
#define PlaneDiff(point,plane) (((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) - (plane)->dist) #define PlaneDiff(point,plane) (((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) - (plane)->dist)
void R_RenderFogOnMesh ( shader_t *shader, struct mfog_s *fog ) void R_RenderFogOnMesh ( shader_t *shader, struct mfog_s *fog )
{ {
@ -2531,4 +2573,6 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb )
#endif
#endif #endif

View file

@ -713,42 +713,6 @@ void GL_Texturemode2d_Callback (struct cvar_s *var, char *oldvalue)
} }
#ifdef Q3SHADERS #ifdef Q3SHADERS
#define FOG_TEXTURE_WIDTH 32
#define FOG_TEXTURE_HEIGHT 32
extern int r_fogtexture;
void GL_InitFogTexture (void)
{
qbyte data[FOG_TEXTURE_WIDTH*FOG_TEXTURE_HEIGHT];
int x, y;
float tw = 1.0f / ((float)FOG_TEXTURE_WIDTH - 1.0f);
float th = 1.0f / ((float)FOG_TEXTURE_HEIGHT - 1.0f);
float tx, ty, t;
if (r_fogtexture)
return;
//
// fog texture
//
for ( y = 0, ty = 0.0f; y < FOG_TEXTURE_HEIGHT; y++, ty += th )
{
for ( x = 0, tx = 0.0f; x < FOG_TEXTURE_WIDTH; x++, tx += tw )
{
t = (float)(sqrt( tx ) * 255.0);
data[x+y*FOG_TEXTURE_WIDTH] = (qbyte)(min( t, 255.0f ));
}
}
r_fogtexture = GL_AllocNewTexture();
GL_Bind(r_fogtexture);
qglTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, FOG_TEXTURE_WIDTH, FOG_TEXTURE_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data);
qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_max);
qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
#endif #endif
/* /*
=============== ===============
@ -800,9 +764,6 @@ void GLDraw_ReInit (void)
draw_mesh.colors_array = NULL; draw_mesh.colors_array = NULL;
draw_mesh.indexes = r_quad_indexes; draw_mesh.indexes = r_quad_indexes;
#ifdef Q3SHADERS
r_fogtexture=0;
#endif
GL_FlushBackEnd(); GL_FlushBackEnd();
// GL_FlushSkinCache(); // GL_FlushSkinCache();
TRACE(("dbg: GLDraw_ReInit: GL_GAliasFlushSkinCache\n")); TRACE(("dbg: GLDraw_ReInit: GL_GAliasFlushSkinCache\n"));
@ -1198,6 +1159,9 @@ void GLDraw_Init (void)
GLDraw_ReInit(); GLDraw_ReInit();
R_BackendInit(); R_BackendInit();
#ifdef NEWBACKEND
BE_Init();
#endif

View file

@ -193,6 +193,9 @@ typedef struct
vec3_t *svector; vec3_t *svector;
int vbotvector; int vbotvector;
vec3_t *tvector; vec3_t *tvector;
int vbocolours;
byte_vec4_t *colours;
} vbo_t; } vbo_t;
typedef struct texture_s typedef struct texture_s

View file

@ -18,6 +18,7 @@ void R_MirrorChain (msurface_t *s);
void GL_SelectTexture (GLenum target); void GL_SelectTexture (GLenum target);
void R_RenderDynamicLightmaps (msurface_t *fa, int shift); void R_RenderDynamicLightmaps (msurface_t *fa, int shift);
void R_BlendLightmaps (void); void R_BlendLightmaps (void);
void PPL_SchematicsTextureChain(msurface_t *first);
void PPL_BeginShadowMesh(dlight_t *dl); void PPL_BeginShadowMesh(dlight_t *dl);
@ -2299,148 +2300,6 @@ void PPL_BaseBModelTextures(entity_t *e)
R_IBrokeTheArrays(); R_IBrokeTheArrays();
} }
#ifdef Q3SHADERS
void R_DrawLightning(entity_t *e)
{
vec3_t v;
vec3_t dir, cr;
float scale = e->scale;
float length;
vec3_t points[4];
vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
index_t indexarray[6] = {0, 1, 2, 0, 2, 3};
mesh_t mesh;
meshbuffer_t mb;
if (!e->forcedshader)
return;
if (!scale)
scale = 10;
VectorSubtract(e->origin, e->oldorigin, dir);
length = Length(dir);
//this seems to be about right.
texcoords[2][0] = length/128;
texcoords[3][0] = length/128;
VectorSubtract(r_refdef.vieworg, e->origin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->origin, -scale/2, cr, points[0]);
VectorMA(e->origin, scale/2, cr, points[1]);
VectorSubtract(r_refdef.vieworg, e->oldorigin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->oldorigin, scale/2, cr, points[2]);
VectorMA(e->oldorigin, -scale/2, cr, points[3]);
mesh.xyz_array = points;
mesh.indexes = indexarray;
mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]);
mesh.colors_array = NULL;
mesh.lmst_array = NULL;
mesh.normals_array = NULL;
mesh.numvertexes = 4;
mesh.st_array = texcoords;
mb.entity = e;
mb.mesh = &mesh;
mb.shader = e->forcedshader;
mb.infokey = 0;
mb.fog = NULL;
mb.infokey = currententity->keynum;
mb.dlightbits = 0;
R_IBrokeTheArrays();
R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED);
R_RenderMeshBuffer ( &mb, false );
}
void R_DrawRailCore(entity_t *e)
{
vec3_t v;
vec3_t dir, cr;
float scale = e->scale;
float length;
mesh_t mesh;
meshbuffer_t mb;
vec3_t points[4];
vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
index_t indexarray[6] = {0, 1, 2, 0, 2, 3};
int colors[4];
qbyte colorsb[4];
if (!e->forcedshader)
return;
if (!scale)
scale = 10;
VectorSubtract(e->origin, e->oldorigin, dir);
length = Length(dir);
//this seems to be about right.
texcoords[2][0] = length/128;
texcoords[3][0] = length/128;
VectorSubtract(r_refdef.vieworg, e->origin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->origin, -scale/2, cr, points[0]);
VectorMA(e->origin, scale/2, cr, points[1]);
VectorSubtract(r_refdef.vieworg, e->oldorigin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->oldorigin, scale/2, cr, points[2]);
VectorMA(e->oldorigin, -scale/2, cr, points[3]);
colorsb[0] = e->shaderRGBAf[0]*255;
colorsb[1] = e->shaderRGBAf[1]*255;
colorsb[2] = e->shaderRGBAf[2]*255;
colorsb[3] = e->shaderRGBAf[3]*255;
colors[0] = colors[1] = colors[2] = colors[3] = *(int*)colorsb;
mesh.xyz_array = points;
mesh.indexes = indexarray;
mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]);
mesh.colors_array = (byte_vec4_t*)colors;
mesh.lmst_array = NULL;
mesh.normals_array = NULL;
mesh.numvertexes = 4;
mesh.st_array = texcoords;
mb.entity = e;
mb.mesh = &mesh;
mb.shader = e->forcedshader;
mb.infokey = 0;
mb.fog = NULL;
mb.infokey = currententity->keynum;
mb.dlightbits = 0;
R_IBrokeTheArrays();
R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED | MF_COLORS);
R_RenderMeshBuffer ( &mb, false );
}
#endif
void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees );
void PerpendicularVector( vec3_t dst, const vec3_t src ); void PerpendicularVector( vec3_t dst, const vec3_t src );
void R_DrawBeam( entity_t *e ) void R_DrawBeam( entity_t *e )

View file

@ -595,16 +595,18 @@ void R_DrawSpriteModel (entity_t *e)
coloursb[3] = e->shaderRGBAf[3]*255; coloursb[3] = e->shaderRGBAf[3]*255;
*(int*)colours[0] = *(int*)colours[1] = *(int*)colours[2] = *(int*)colours[3] = *(int*)coloursb; *(int*)colours[0] = *(int*)colours[1] = *(int*)colours[2] = *(int*)colours[3] = *(int*)coloursb;
mesh.vbofirstelement = 0;
mesh.vbofirstvert = 0;
mesh.colors_array = colours; mesh.colors_array = colours;
mesh.indexes = indexes; mesh.indexes = indexes;
mesh.lmst_array = NULL; mesh.lmst_array = NULL;
mesh.st_array = texcoords; mesh.st_array = texcoords;
mesh.normals_array = NULL; mesh.normals_array = NULL;
mesh.xyz_array = vertcoords;
mesh.numvertexes = 4; mesh.numvertexes = 4;
mesh.numindexes = 6; mesh.numindexes = 6;
mesh.radius = e->scale; mesh.radius = e->scale;
mesh.xyz_array = vertcoords;
mesh.normals_array = NULL;
R_IBrokeTheArrays(); R_IBrokeTheArrays();
@ -741,8 +743,101 @@ void R_DrawSpriteModel (entity_t *e)
//================================================================================== //==================================================================================
static void R_DrawShadedSpriteModels(int count, void **entlist, void *parm)
{
vec3_t point;
mspriteframe_t *frame;
vec3_t forward, right, up;
msprite_t *psprite;
qbyte coloursb[4];
meshbuffer_t mb;
mesh_t mesh;
vec2_t texcoords[4]={{0, 1},{0,0},{1,0},{1,1}};
vec3_t vertcoords[4];
index_t indexes[6] = {0, 1, 2, 0, 2, 3};
byte_vec4_t colours[4];
float x, y;
int vnum = 0, inum = 0;
shader_t *lastshader = NULL;
mesh.vbofirstelement = 0;
mesh.vbofirstvert = 0;
mesh.colors_array = colours;
mesh.indexes = indexes;
mesh.lmst_array = NULL;
mesh.st_array = texcoords;
mesh.normals_array = NULL;
mesh.xyz_array = vertcoords;
mb.fog = NULL;//fog;
mb.mesh = NULL;
mb.infokey = -1;
mb.dlightbits = 0;
R_IBrokeTheArrays();
while (count--)
{
currententity = *entlist++;
if (currententity->forcedshader != lastshader || 1)
{
if (lastshader)
{
mesh.numvertexes = vnum;
mesh.numindexes = inum;
mesh.radius = currententity->scale;
R_PushMesh(&mesh, lastshader->features | MF_NONBATCHED|MF_COLORS);
mb.entity = currententity;
mb.shader = currententity->forcedshader;
R_RenderMeshBuffer (&mb, false);
}
lastshader = currententity->forcedshader;
}
#define VectorSet(a,b,c,v) {v[0]=a;v[1]=b;v[2]=c;}
x = cos(currententity->rotation+225*M_PI/180)*currententity->scale;
y = sin(currententity->rotation+225*M_PI/180)*currententity->scale;
VectorSet (currententity->origin[0] - y*vright[0] + x*vup[0], currententity->origin[1] - y*vright[1] + x*vup[1], currententity->origin[2] - y*vright[2] + x*vup[2], vertcoords[3]);
VectorSet (currententity->origin[0] - x*vright[0] - y*vup[0], currententity->origin[1] - x*vright[1] - y*vup[1], currententity->origin[2] - x*vright[2] - y*vup[2], vertcoords[2]);
VectorSet (currententity->origin[0] + y*vright[0] - x*vup[0], currententity->origin[1] + y*vright[1] - x*vup[1], currententity->origin[2] + y*vright[2] - x*vup[2], vertcoords[1]);
VectorSet (currententity->origin[0] + x*vright[0] + y*vup[0], currententity->origin[1] + x*vright[1] + y*vup[1], currententity->origin[2] + x*vright[2] + y*vup[2], vertcoords[0]);
coloursb[0] = currententity->shaderRGBAf[0]*255;
coloursb[1] = currententity->shaderRGBAf[1]*255;
coloursb[2] = currententity->shaderRGBAf[2]*255;
coloursb[3] = currententity->shaderRGBAf[3]*255;
*(int*)colours[0] = *(int*)colours[1] = *(int*)colours[2] = *(int*)colours[3] = *(int*)coloursb;
vnum += 4;
inum += 6;
}
if (lastshader)
{
mesh.numvertexes = vnum;
mesh.numindexes = inum;
mesh.radius = currententity->scale;
R_PushMesh(&mesh, lastshader->features | MF_NONBATCHED|MF_COLORS);
mb.entity = currententity;
mb.shader = currententity->forcedshader;
R_RenderMeshBuffer (&mb, false);
}
}
void GLR_DrawSprite(int count, void **e, void *parm) void GLR_DrawSprite(int count, void **e, void *parm)
{ {
// R_DrawShadedSpriteModels(count, e, parm);
// return;
while(count--) while(count--)
{ {
currententity = *e++; currententity = *e++;
@ -751,6 +846,155 @@ void GLR_DrawSprite(int count, void **e, void *parm)
R_DrawSpriteModel (currententity); R_DrawSpriteModel (currententity);
} }
} }
//q3 lightning gun
void R_DrawLightning(entity_t *e)
{
vec3_t v;
vec3_t dir, cr;
float scale = e->scale;
float length;
vec3_t points[4];
vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
index_t indexarray[6] = {0, 1, 2, 0, 2, 3};
mesh_t mesh;
meshbuffer_t mb;
if (!e->forcedshader)
return;
if (!scale)
scale = 10;
VectorSubtract(e->origin, e->oldorigin, dir);
length = Length(dir);
//this seems to be about right.
texcoords[2][0] = length/128;
texcoords[3][0] = length/128;
VectorSubtract(r_refdef.vieworg, e->origin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->origin, -scale/2, cr, points[0]);
VectorMA(e->origin, scale/2, cr, points[1]);
VectorSubtract(r_refdef.vieworg, e->oldorigin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->oldorigin, scale/2, cr, points[2]);
VectorMA(e->oldorigin, -scale/2, cr, points[3]);
mesh.vbofirstelement = 0;
mesh.vbofirstvert = 0;
mesh.xyz_array = points;
mesh.indexes = indexarray;
mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]);
mesh.colors_array = NULL;
mesh.lmst_array = NULL;
mesh.normals_array = NULL;
mesh.numvertexes = 4;
mesh.st_array = texcoords;
mb.entity = e;
mb.mesh = &mesh;
mb.shader = e->forcedshader;
mb.infokey = 0;
mb.fog = NULL;
mb.infokey = currententity->keynum;
mb.dlightbits = 0;
R_IBrokeTheArrays();
R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED);
R_RenderMeshBuffer ( &mb, false );
}
//q3 railgun beam
void R_DrawRailCore(entity_t *e)
{
vec3_t v;
vec3_t dir, cr;
float scale = e->scale;
float length;
mesh_t mesh;
meshbuffer_t mb;
vec3_t points[4];
vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
index_t indexarray[6] = {0, 1, 2, 0, 2, 3};
int colors[4];
qbyte colorsb[4];
if (!e->forcedshader)
return;
if (!scale)
scale = 10;
VectorSubtract(e->origin, e->oldorigin, dir);
length = Length(dir);
//this seems to be about right.
texcoords[2][0] = length/128;
texcoords[3][0] = length/128;
VectorSubtract(r_refdef.vieworg, e->origin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->origin, -scale/2, cr, points[0]);
VectorMA(e->origin, scale/2, cr, points[1]);
VectorSubtract(r_refdef.vieworg, e->oldorigin, v);
CrossProduct(v, dir, cr);
VectorNormalize(cr);
VectorMA(e->oldorigin, scale/2, cr, points[2]);
VectorMA(e->oldorigin, -scale/2, cr, points[3]);
colorsb[0] = e->shaderRGBAf[0]*255;
colorsb[1] = e->shaderRGBAf[1]*255;
colorsb[2] = e->shaderRGBAf[2]*255;
colorsb[3] = e->shaderRGBAf[3]*255;
colors[0] = colors[1] = colors[2] = colors[3] = *(int*)colorsb;
mesh.vbofirstelement = 0;
mesh.vbofirstvert = 0;
mesh.xyz_array = points;
mesh.indexes = indexarray;
mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]);
mesh.colors_array = (byte_vec4_t*)colors;
mesh.lmst_array = NULL;
mesh.normals_array = NULL;
mesh.numvertexes = 4;
mesh.st_array = texcoords;
mb.entity = e;
mb.mesh = &mesh;
mb.shader = e->forcedshader;
mb.infokey = 0;
mb.fog = NULL;
mb.infokey = currententity->keynum;
mb.dlightbits = 0;
R_IBrokeTheArrays();
R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED | MF_COLORS);
R_RenderMeshBuffer ( &mb, false );
}
/* /*
============= =============
R_DrawEntitiesOnList R_DrawEntitiesOnList

View file

@ -3069,6 +3069,8 @@ static void GL_GenBrushModelVBO(model_t *mod)
if (mod->surfaces[i].texinfo->texture != mod->textures[t]) if (mod->surfaces[i].texinfo->texture != mod->textures[t])
continue; continue;
m = mod->surfaces[i].mesh; m = mod->surfaces[i].mesh;
if (!m)
continue;
maxvboelements += m->numindexes; maxvboelements += m->numindexes;
maxvboverts += m->numvertexes; maxvboverts += m->numvertexes;
@ -3105,6 +3107,8 @@ static void GL_GenBrushModelVBO(model_t *mod)
if (mod->surfaces[i].texinfo->texture != mod->textures[t]) if (mod->surfaces[i].texinfo->texture != mod->textures[t])
continue; continue;
m = mod->surfaces[i].mesh; m = mod->surfaces[i].mesh;
if (!m)
continue;
m->vbofirstvert = vcount; m->vbofirstvert = vcount;
m->vbofirstelement = ecount; m->vbofirstelement = ecount;

View file

@ -435,7 +435,7 @@ qboolean VID_SetWindowedMode (rendererstate_t *info)
SetWindowLong(dibwindow, GWL_EXSTYLE, GetWindowLong(dibwindow, GWL_EXSTYLE) | WS_EX_LAYERED); SetWindowLong(dibwindow, GWL_EXSTYLE, GetWindowLong(dibwindow, GWL_EXSTYLE) | WS_EX_LAYERED);
// Make this window 70% alpha // Make this window 70% alpha
pSetLayeredWindowAttributes(dibwindow, 0, av, LWA_ALPHA); pSetLayeredWindowAttributes(dibwindow, 0, (BYTE)av, LWA_ALPHA);
} }
} }
#endif #endif
@ -1031,7 +1031,7 @@ void VID_WndAlpha_Override_Callback(struct cvar_s *var, char *oldvalue)
SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) | WS_EX_LAYERED); SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) | WS_EX_LAYERED);
// Make this window 70% alpha // Make this window 70% alpha
pSetLayeredWindowAttributes(mainwindow, 0, av, LWA_ALPHA); pSetLayeredWindowAttributes(mainwindow, 0, (BYTE)av, LWA_ALPHA);
} }
else else
SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) & ~WS_EX_LAYERED); SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) & ~WS_EX_LAYERED);

View file

@ -390,18 +390,21 @@ void GL_DrawSkyChain (msurface_t *s)
if (r_fastsky.value>0) //this is for visability only... we'd otherwise not stoop this low (and this IS low) if (r_fastsky.value>0) //this is for visability only... we'd otherwise not stoop this low (and this IS low)
{ {
R_IBrokeTheArrays();
qglDisable(GL_BLEND);
qglDisable(GL_TEXTURE_2D); qglDisable(GL_TEXTURE_2D);
qglDisable(GL_ALPHA_TEST);
qglColor3f(glskycolor[0], glskycolor[1], glskycolor[2]); qglColor3f(glskycolor[0], glskycolor[1], glskycolor[2]);
qglDisableClientState( GL_COLOR_ARRAY ); qglDisableClientState( GL_COLOR_ARRAY );
qglEnableClientState( GL_VERTEX_ARRAY );
for (fa=s ; fa ; fa=fa->texturechain) for (fa=s ; fa ; fa=fa->texturechain)
{ {
qglVertexPointer(3, GL_FLOAT, 0, fa->mesh->xyz_array); qglVertexPointer(3, GL_FLOAT, 0, fa->mesh->xyz_array);
qglDrawElements(GL_TRIANGLES, fa->mesh->numindexes, GL_INDEX_TYPE, fa->mesh->indexes); qglDrawElements(GL_TRIANGLES, fa->mesh->numindexes, GL_INDEX_TYPE, fa->mesh->indexes);
} }
R_IBrokeTheArrays();
qglColor3f(1, 1, 1); qglColor3f(1, 1, 1);
qglEnable(GL_TEXTURE_2D); qglEnable(GL_TEXTURE_2D);
R_IBrokeTheArrays();
return; return;
} }
@ -1092,6 +1095,8 @@ static void GL_SkyForceDepth(msurface_t *fa)
qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
R_IBrokeTheArrays();
} }
} }

View file

@ -613,6 +613,8 @@ void SV_Map_f (void)
{ {
if (host_client->protocol == SCP_QUAKE3) if (host_client->protocol == SCP_QUAKE3)
continue; continue;
if (host_client->protocol == SCP_BAD)
continue;
if (ISNQCLIENT(host_client)) if (ISNQCLIENT(host_client))
SVNQ_New_f(); SVNQ_New_f();

View file

@ -7,7 +7,7 @@
float RadiusFromBounds (vec3_t mins, vec3_t maxs); float RadiusFromBounds (vec3_t mins, vec3_t maxs);
//#define USEBOTLIB #define USEBOTLIB
#ifdef USEBOTLIB #ifdef USEBOTLIB