Fix for recent timing issues, hopefully.

Fixed a couple of warnings.
Added voip options to menus.
GL+D3D merged builds compile, but d3d is probably broken still.
Added vid_gl_context_es2 cvar to attempt to init a gles context. Note that you also need to set the requested gl version correctly.
Changed qtv's webpage view slightly, for slightly updated npfte usage.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3714 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2011-01-04 02:56:16 +00:00
parent 253ef7b817
commit 9b6ea1c114
32 changed files with 524 additions and 233 deletions

View File

@ -3319,6 +3319,8 @@ float Host_Frame (double time)
// float fps;
double realframetime;
static double spare;
float maxfps;
qboolean maxfpsignoreserver;
RSpeedLocals();
@ -3371,23 +3373,25 @@ float Host_Frame (double time)
*/
Mod_Think(); //think even on idle (which means small walls and a fast cpu can get more surfaces done.
if ((cl_netfps.value>0 || cls.demoplayback || cl_indepphysics.ival))
{ //limit the fps freely, and expect the netfps to cope.
if (cl_maxfps.ival > 0)
{
realtime += spare/1000; //don't use it all!
spare = CL_FilterTime((realtime - oldrealtime)*1000, cl_maxfps.value, true);
if (!spare)
return 1;
realtime -= spare/1000; //don't use it all!
}
maxfpsignoreserver = true;
maxfps = cl_maxfps.ival;
}
else
{
float maxfps = (cl_maxfps.ival>0||cls.protocol!=CP_QUAKEWORLD)?cl_maxfps.value:cl_netfps.value;
maxfpsignoreserver = false;
maxfps = (cl_maxfps.ival>0||cls.protocol!=CP_QUAKEWORLD)?cl_maxfps.value:cl_netfps.value;
/*gets buggy at times longer than 250ms (and 0/negative, obviously)*/
if (maxfps < 4)
maxfps = 4;
}
if (maxfps > 0)
{
realtime += spare/1000; //don't use it all!
spare = CL_FilterTime((realtime - oldrealtime)*1000, maxfps, false);
spare = CL_FilterTime((realtime - oldrealtime)*1000, maxfps, maxfpsignoreserver);
if (!spare)
return 1;
if (spare < 0 || cls.state < ca_onserver)
@ -3397,6 +3401,8 @@ float Host_Frame (double time)
realtime -= spare/1000; //don't use it all!
}
else
spare = 0;
host_frametime = (realtime - oldrealtime)*cl.gamespeed;
if (!cl.paused)

View File

@ -349,7 +349,6 @@ void CL_ShutdownTEnts (void)
void P_LoadedModel(model_t *mod)
{
struct associatedeffect *ae;
int j;
mod->particleeffect = P_INVALID;
mod->particletrail = P_INVALID;

View File

@ -620,10 +620,6 @@ void VQ3_RenderView(const q3refdef_t *ref)
qglEnable(GL_BLEND);
}
#endif
#ifdef D3DQUAKE
if (qrenderer == QR_DIRECT3D)
D3D9_Set2D();
#endif
vid.recalc_refdef = 1;
r_refdef.time = 0;

View File

@ -261,6 +261,7 @@ void M_Menu_Audio_f (void)
menu_t *menu;
int cursorpositionY;
extern cvar_t nosound, precache, snd_leftisright, snd_khz, snd_eax, snd_speakers, ambient_level, bgmvolume, snd_playersoundvolume, ambient_fade, cl_staticsounds, snd_inactive, _snd_mixahead, snd_usemultipledevices, snd_noextraupdate, snd_show, bgmbuffer;
extern cvar_t cl_voip_play, cl_voip_send;
static const char *soundqualityoptions[] = {
"11025 Hz",
@ -303,6 +304,10 @@ void M_Menu_Audio_f (void)
MC_AddWhiteText(menu, 16, y, "<><E282AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ", false); y+=8;
y+=8;
#ifdef VOICECHAT
MC_AddCheckBox(menu, 16, y, " Voice Chat", &cl_voip_play,0);y+=8;
MC_AddCheckBox(menu, 16, y, " VOIP Voice Activation", &cl_voip_send,0);y+=8;
#endif
MC_AddSlider(menu, 16, y, " CD Music Volume", &bgmvolume, 0, 1, 0.1);y+=8;
MC_AddSlider(menu, 16, y, " CD Music Buffer", &bgmbuffer, 0, 10240, 1024);y+=8;
MC_AddSlider(menu, 16, y, " Sound Volume", &volume, 0, 1, 0.1);y+=8;

View File

@ -271,6 +271,9 @@ bindnames_t qwbindnames[] =
{"+klook", "keyboard look "},
{"+moveup", "swim up "},
{"+movedown", "swim down "},
#ifdef VOICECHAT
{"+voip", "voice chat "},
#endif
{NULL}
};
@ -352,6 +355,9 @@ bindnames_t h2bindnames[] =
{"impulse 112", "inv:flight "},
{"impulse 113", "inv:force cube"},
{"impulse 114", "inv:icon defn "},
#ifdef VOICECHAT
{"+voip", "voice chat "},
#endif
{NULL}
};

View File

@ -155,7 +155,8 @@ typedef union {
void *ptr;
#endif
} texid_t;
enum uploadfmt;
typedef enum uploadfmt uploadfmt_t;
typedef enum backendmode_e backendmode_t;
typedef struct rendererinfo_s {
char *description;
@ -182,13 +183,13 @@ typedef struct rendererinfo_s {
void (*Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); //gl-style scaled/coloured/subpic
void (*Draw_ImageColours) (float r, float g, float b, float a);
texid_t (*IMG_LoadTexture) (char *identifier, int width, int height, enum uploadfmt fmt, void *data, unsigned int flags);
texid_t (*IMG_LoadTexture) (char *identifier, int width, int height, uploadfmt_t fmt, void *data, unsigned int flags);
texid_t (*IMG_LoadTexture8Pal24) (char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags);
texid_t (*IMG_LoadTexture8Pal32) (char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags);
texid_t (*IMG_LoadCompressed) (char *name);
texid_t (*IMG_FindTexture) (char *identifier);
texid_t (*IMG_AllocNewTexture) (int w, int h);
void (*IMG_Upload) (texid_t tex, char *name, enum uploadfmt fmt, void *data, void *palette, int width, int height, unsigned int flags);
void (*IMG_Upload) (texid_t tex, char *name, uploadfmt_t fmt, void *data, void *palette, int width, int height, unsigned int flags);
void (*IMG_DestroyTexture) (texid_t tex);
void (*R_Init) (void);
@ -227,6 +228,29 @@ typedef struct rendererinfo_s {
void (*SCR_UpdateScreen) (void);
//Select the current render mode and modifier flags
void (*BE_SelectMode)(backendmode_t mode, unsigned int flags);
/*Draws an entire mesh list from a VBO. vbo can be null, in which case the chain may be drawn without batching.
Rules for using a list: Every mesh must be part of the same VBO, shader, lightmap, and must have the same pointers set*/
void (*BE_DrawMesh_List)(shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums);
void (*BE_DrawMesh_Single)(shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, struct texnums_s *texnums);
void (*BE_SubmitBatch)(struct batch_s *batch);
struct batch_s *(*BE_GetTempBatch)(void);
//Asks the backend to invoke DrawMeshChain for each surface, and to upload lightmaps as required
void (*BE_DrawWorld) (qbyte *vis);
//called at init, force the display to the right defaults etc
void (*BE_Init)(void);
//Generates an optimised VBO, one for each texture on the map
void (*BE_GenBrushModelVBO)(struct model_s *mod);
//Destroys the given vbo
void (*BE_ClearVBO)(struct vbo_s *vbo);
//Uploads all modified lightmaps
void (*BE_UploadAllLightmaps)(void);
void (*BE_SelectEntity)(struct entity_s *ent);
/*check to see if an ent should be drawn for the selected light*/
qboolean (*BE_LightCullModel)(vec3_t org, struct model_s *model);
char *alignment;
} rendererinfo_t;
@ -240,3 +264,17 @@ typedef struct rendererinfo_s {
#define R_AllocNewTexture rf->IMG_AllocNewTexture
#define R_Upload rf->IMG_Upload
#define R_DestroyTexture rf->IMG_DestroyTexture
#define BE_Init rf->BE_Init
#define BE_SelectMode rf->BE_SelectMode
#define BE_GenBrushModelVBO rf->BE_GenBrushModelVBO
#define BE_ClearVBO rf->BE_ClearVBO
#define BE_UploadAllLightmaps rf->BE_UploadAllLightmaps
#define BE_LightCullModel rf->BE_LightCullModel
#define BE_SelectEntity rf->BE_SelectEntity
#define BE_GetTempBatch rf->BE_GetTempBatch
#define BE_SubmitBatch rf->BE_SubmitBatch
#define BE_DrawMesh_List rf->BE_DrawMesh_List
#define BE_DrawMesh_Single rf->BE_DrawMesh_Single
#define BE_SubimtMeshes rf->BE_SubimtMeshes
#define BE_DrawWorld rf->BE_DrawWorld

View File

@ -165,7 +165,7 @@ void R_LightArraysByte_BGR(vecV_t *coords, byte_vec4_t *colours, int vertcount,
void R_LightArrays(vecV_t *coords, vec4_t *colours, int vertcount, vec3_t *normals);
void R_DrawSkyChain (struct batch_s *batch); /*called from the backend, and calls back into it*/
struct texnums_s R_InitSky (struct texture_s *mt, qbyte *src); /*generate q1 sky texnums*/
void R_InitSky (struct texnums_s *ret, struct texture_s *mt, qbyte *src); /*generate q1 sky texnums*/
//r_surf.c
void Surf_DrawWorld(void);
@ -219,7 +219,7 @@ void GLR_InitTextures (void);
void GLR_InitEfrags (void);
void GLR_RenderView (void); // must set r_refdef first
// called whenever r_refdef or vid change
void R_DrawPortal(struct batch_s *batch, struct batch_s **blist);
void GLR_DrawPortal(struct batch_s *batch, struct batch_s **blist);
void GLR_PreNewMap(void);
void GLR_NewMap (void);
@ -288,15 +288,14 @@ texid_t GL_LoadTextureFmt (char *identifier, int width, int height, enum uploadf
void GL_DestroyTexture(texid_t tex);
#endif
#ifdef D3DQUAKE
texid_t D3D_AllocNewTexture(int width, int height);
void D3D_UploadFmt(texid_t tex, char *name, enum uploadfmt fmt, void *data, int width, int height, unsigned int flags);
texid_t D3D_LoadTextureFmt (char *identifier, int width, int height, enum uploadfmt fmt, void *data, unsigned int flags);
texid_t D3D_LoadCompressed(char *name);
texid_t D3D_FindTexture (char *identifier);
texid_t D3D_LoadTexture8Pal32 (char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags);
texid_t D3D_LoadTexture8Pal24 (char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags);
texid_t D3D9_LoadTexture (char *identifier, int width, int height, enum uploadfmt fmt, void *data, unsigned int flags);
texid_t D3D9_LoadTexture8Pal24 (char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags);
texid_t D3D9_LoadTexture8Pal32 (char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags);
texid_t D3D9_LoadCompressed (char *name);
texid_t D3D9_FindTexture (char *identifier);
texid_t D3D9_AllocNewTexture(int width, int height);
void D3D9_Upload (texid_t tex, char *name, enum uploadfmt fmt, void *data, void *palette, int width, int height, unsigned int flags);
void D3D9_DestroyTexture (texid_t tex);
#endif
extern int image_width, image_height;

View File

@ -237,6 +237,7 @@ cvar_t vid_gl_context_version = SCVAR ("vid_gl_context_version", "");
cvar_t vid_gl_context_forwardcompatible = SCVAR ("vid_gl_context_forwardcompatible", "0");
cvar_t vid_gl_context_compatibility = SCVAR ("vid_gl_context_compatibility", "1");
cvar_t vid_gl_context_debug = SCVAR ("vid_gl_context_debug", "0"); //for my ati drivers, debug 1 only works if version >= 3
cvar_t vid_gl_context_es2 = SCVAR ("vid_gl_context_es2", "0"); //requires version set correctly, no debug, no compat
#endif
#if defined(GLQUAKE) || defined(D3DQUAKE)
@ -359,6 +360,7 @@ void GLRenderer_Init(void)
Cvar_Register (&vid_gl_context_debug, GLRENDEREROPTIONS);
Cvar_Register (&vid_gl_context_forwardcompatible, GLRENDEREROPTIONS);
Cvar_Register (&vid_gl_context_compatibility, GLRENDEREROPTIONS);
Cvar_Register (&vid_gl_context_es2, GLRENDEREROPTIONS);
//screen
Cvar_Register (&gl_triplebuffer, GLRENDEREROPTIONS);
@ -827,14 +829,28 @@ rendererinfo_t dedicatedrendererinfo = {
NULL, //SCR_UpdateScreen;
/*backend*/
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
""
};
rendererinfo_t *pdedicatedrendererinfo = &dedicatedrendererinfo;
rendererinfo_t openglrendererinfo;
rendererinfo_t d3dfglrendererinfo;
rendererinfo_t d3drendererinfo;
rendererinfo_t d3d7rendererinfo;
rendererinfo_t d3d9rendererinfo;
rendererinfo_t *rendererinfo[] =
{
@ -843,12 +859,10 @@ rendererinfo_t *rendererinfo[] =
#endif
#ifdef GLQUAKE
&openglrendererinfo,
&d3drendererinfo,
&d3dfglrendererinfo,
#endif
#ifdef D3DQUAKE
&d3drendererinfo,
&d3d7rendererinfo,
&d3d9rendererinfo,
#endif
};

View File

@ -21,7 +21,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "winquake.h"
#include <dsound.h>
#ifndef DECLSPEC_SELECTANY
#define DECLSPEC_SELECTANY
#endif
#define FORCE_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }

View File

@ -112,7 +112,7 @@ cvar_t cl_voip_send = CVARD("cl_voip_send", "0", "Sends voice-over-ip data to th
cvar_t cl_voip_vad_threshhold = CVARD("cl_voip_vad_threshhold", "15", "This is the threshhold for voice-activation-detection when sending voip data");
cvar_t cl_voip_vad_delay = CVARD("cl_voip_vad_delay", "0.3", "Keeps sending voice data for this many seconds after voice activation would normally stop");
cvar_t cl_voip_capturingvol = CVARD("cl_voip_capturingvol", "0.5", "Volume multiplier applied while capturing, to avoid your audio from being heard by others");
cvar_t cl_voip_showmeter = CVARD("cl_voip_showmeter", "1", "Shows your speach volume above the hud. 0=hide, 1=show when transmitting, 2=ignore voice-activation disable");
cvar_t cl_voip_showmeter = CVARD("cl_voip_showmeter", "1", "Shows your speech volume above the hud. 0=hide, 1=show when transmitting, 2=ignore voice-activation disable");
cvar_t cl_voip_play = CVARCD("cl_voip_play", "1", S_Voip_Play_Callback, "Enables voip playback.");
cvar_t cl_voip_micamp = CVARD("cl_voip_micamp", "2", "Amplifies your microphone when using voip.");

View File

@ -1500,7 +1500,7 @@ static void Mod_ClampModelSize(model_t *mod)
}
#ifdef GLQUAKE
static int R_FindTriangleWithEdge ( int *indexes, int numtris, int start, int end, int ignore)
static int R_FindTriangleWithEdge (index_t *indexes, int numtris, int start, int end, int ignore)
{
int i;
int match, count;
@ -1532,7 +1532,7 @@ static int R_FindTriangleWithEdge ( int *indexes, int numtris, int start, int en
static void Mod_BuildTriangleNeighbours ( int *neighbours, index_t *indexes, int numtris )
{
int i, *n;
int *index;
index_t *index;
for (i = 0, index = indexes, n = neighbours; i < numtris; i++, index += 3, n += 3)
{

View File

@ -3118,7 +3118,7 @@ void COM_Version_f (void)
#endif
// Don't print both as a 64bit MinGW built client
#ifdef __MINGW32__ && !defined(__MINGW64__)
#if defined(__MINGW32__) && !defined(__MINGW64__)
Con_Printf("Compiled with MinGW32 version: %i.%i\n",__MINGW32_MAJOR_VERSION, __MINGW32_MINOR_VERSION);
#endif

View File

@ -36,7 +36,7 @@
{
u_char s6_addr[16]; /* IPv6 address */
};
#if _MSC_VER > 1200
#define sockaddr_in6 sockaddr_in6_fixed /*earlier versions of msvc have a sockaddr_in6 which does _not_ match windows, so this *must* be redefined for any non-final msvc releases or it won't work at all*/
typedef struct sockaddr_in6
{
short sin6_family;
@ -49,7 +49,6 @@
struct ip6_scope_id sin6_scope_struct;
};
};
#endif
struct addrinfo
{
int ai_flags;

View File

@ -1,13 +1,15 @@
#include "quakedef.h"
#ifdef D3DQUAKE
#include "shader.h"
#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500)
#define HMONITOR_DECLARED
DECLARE_HANDLE(HMONITOR);
#endif
#include <d3d9.h>
#ifndef GLQUAKE
/*shaders have a few GL_FOO constants in them. they shouldn't, but they do.*/
#include <GL/gl.h>
#include "glsupp.h"
#endif
extern LPDIRECT3DDEVICE9 pD3DDev9;
@ -178,7 +180,7 @@ enum
IDirect3DVertexDeclaration9 *vertexdecls[D3D_VDEC_MAX];
void BE_D3D_Reset(qboolean before)
void D3DBE_Reset(qboolean before)
{
int i, tmu;
if (before)
@ -461,7 +463,7 @@ static void D3DBE_ApplyShaderBits(unsigned int bits)
}
}
void BE_Init(void)
void D3DBE_Init(void)
{
unsigned int i;
be_maxpasses = MAX_TMUS;
@ -475,7 +477,7 @@ void BE_Init(void)
shaderstate.dynst_size = sizeof(vec2_t) * DYNVBUFFSIZE;
shaderstate.dynidx_size = sizeof(index_t) * DYNIBUFFSIZE;
BE_D3D_Reset(false);
D3DBE_Reset(false);
/*force all state to change, thus setting a known state*/
shaderstate.shaderbits = ~0;
@ -1578,16 +1580,14 @@ static void BE_DrawMeshChain_Internal(void)
}
}
void BE_SelectMode(backendmode_t mode, unsigned int flags)
void D3DBE_SelectMode(backendmode_t mode, unsigned int flags)
{
shaderstate.mode = mode;
shaderstate.flags = flags;
}
void _CrtCheckMemory(void);
/*Generates an optimised vbo for each of the given model's textures*/
void BE_GenBrushModelVBO(model_t *mod)
void D3DBE_GenBrushModelVBO(model_t *mod)
{
unsigned int maxvboverts;
unsigned int maxvboelements;
@ -1737,7 +1737,7 @@ void BE_GenBrushModelVBO(model_t *mod)
//}
}
/*Wipes a vbo*/
void BE_ClearVBO(vbo_t *vbo)
void D3DBE_ClearVBO(vbo_t *vbo)
{
}
@ -1791,12 +1791,12 @@ void BE_UploadLightmaps(qboolean force)
}
}
void BE_UploadAllLightmaps(void)
void D3DBE_UploadAllLightmaps(void)
{
BE_UploadLightmaps(true);
}
qboolean BE_LightCullModel(vec3_t org, model_t *model)
qboolean D3DBE_LightCullModel(vec3_t org, model_t *model)
{
#ifdef RTLIGHTS
if ((shaderstate.mode == BEM_LIGHT || shaderstate.mode == BEM_STENCIL))
@ -1808,7 +1808,7 @@ qboolean BE_LightCullModel(vec3_t org, model_t *model)
return false;
}
batch_t *BE_GetTempBatch(void)
batch_t *D3DBE_GetTempBatch(void)
{
if (shaderstate.wbatch >= shaderstate.maxwbatches)
{
@ -1925,7 +1925,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod)
}
}
void BE_SubmitBatch(batch_t *batch)
void D3DBE_SubmitBatch(batch_t *batch)
{
shaderstate.nummeshes = batch->meshes - batch->firstmesh;
if (!shaderstate.nummeshes)
@ -1947,7 +1947,7 @@ void BE_SubmitBatch(batch_t *batch)
BE_DrawMeshChain_Internal();
}
void BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t *vbo, texnums_t *texnums)
void D3DBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t *vbo, texnums_t *texnums)
{
shaderstate.curshader = shader;
shaderstate.curtexnums = texnums;
@ -1958,7 +1958,7 @@ void BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t
BE_DrawMeshChain_Internal();
}
void BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums)
void D3DBE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums)
{
shaderstate.curtime = realtime;
shaderstate.curshader = shader;
@ -2510,7 +2510,7 @@ void BE_SubmitMeshes (qboolean drawworld, batch_t **blist)
}
}
void BE_DrawWorld (qbyte *vis)
void D3DBE_DrawWorld (qbyte *vis)
{
batch_t *batches[SHADER_SORT_COUNT];
RSpeedLocals();

View File

@ -1,5 +1,9 @@
#include "quakedef.h"
#ifdef D3DQUAKE
#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500)
#define HMONITOR_DECLARED
DECLARE_HANDLE(HMONITOR);
#endif
#include <d3d9.h>
LPDIRECT3DDEVICE9 pD3DDev9;

View File

@ -5,9 +5,13 @@
#ifdef D3DQUAKE
#include "winquake.h"
#include "d3d9quake.h"
#include "d3d9.h"
#if !defined(HMONITOR_DECLARED) && (WINVER < 0x0500)
#define HMONITOR_DECLARED
DECLARE_HANDLE(HMONITOR);
#endif
#include <d3d9.h>
//#pragma comment(lib, "../libs/dxsdk9/lib/d3d9.lib")
@ -350,11 +354,11 @@ static LRESULT WINAPI D3D9_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
//vid.pixelheight = window_rect.bottom - window_rect.top;
D3DVID_UpdateWindowStatus(hWnd);
BE_D3D_Reset(true);
D3DBE_Reset(true);
vid.pixelwidth = d3dpp.BackBufferWidth = window_rect.right - window_rect.left;
vid.pixelheight = d3dpp.BackBufferHeight = window_rect.bottom - window_rect.top;
resetD3D9();
BE_D3D_Reset(false);
D3DBE_Reset(false);
Cvar_ForceCallback(&vid_conautoscale);
Cvar_ForceCallback(&vid_conwidth);
@ -836,7 +840,7 @@ static void (D3D9_SCR_UpdateScreen) (void)
//the user has task switched away from us or something, don't do anything.
return;
case D3DERR_DEVICENOTRESET:
BE_D3D_Reset(true);
D3DBE_Reset(true);
resetD3D9();
if (FAILED(IDirect3DDevice9_TestCooperativeLevel(pD3DDev9)))
{
@ -844,7 +848,7 @@ static void (D3D9_SCR_UpdateScreen) (void)
Cmd_ExecuteString("vid_restart", RESTRICT_LOCAL);
return;
}
BE_D3D_Reset(false);
D3DBE_Reset(false);
VID_ShiftPalette (NULL);
break;

View File

@ -320,14 +320,14 @@ static const char PCFPASS_SHADER[] = "\
extern cvar_t r_glsl_offsetmapping, r_noportals;
#if 0//def _DEBUG
#ifdef _DEBUG
#define checkerror() if (qglGetError()) Con_Printf("Error detected at line %s:%i\n", __FILE__, __LINE__)
#else
#define checkerror()
#endif
static void BE_SendPassBlendAndDepth(unsigned int sbits);
void BE_SubmitBatch(batch_t *batch);
void GLBE_SubmitBatch(batch_t *batch);
struct {
//internal state
@ -840,11 +840,13 @@ void Shader_LightPass_Spot(char *shortname, shader_t *s, const void *args)
Shader_DefaultScript(shortname, s, shadertext);
}
void BE_Init(void)
void GLBE_Init(void)
{
int i;
double t;
checkerror();
be_maxpasses = gl_mtexarbable;
for (i = 0; i < FTABLE_SIZE; i++)
@ -2251,7 +2253,7 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
}
#ifdef RTLIGHTS
qboolean BE_LightCullModel(vec3_t org, model_t *model)
qboolean GLBE_LightCullModel(vec3_t org, model_t *model)
{
if ((shaderstate.mode == BEM_LIGHT || shaderstate.mode == BEM_STENCIL))
{
@ -2282,7 +2284,7 @@ qboolean BE_LightCullModel(vec3_t org, model_t *model)
#endif
//Note: Be cautious about using BEM_LIGHT here.
void BE_SelectMode(backendmode_t mode, unsigned int flags)
void GLBE_SelectMode(backendmode_t mode, unsigned int flags)
{
extern int gldepthfunc;
@ -2368,7 +2370,7 @@ void BE_SelectMode(backendmode_t mode, unsigned int flags)
shaderstate.flags = flags;
}
void BE_SelectEntity(entity_t *ent)
void GLBE_SelectEntity(entity_t *ent)
{
if (shaderstate.curentity && shaderstate.curentity->flags & Q2RF_DEPTHHACK)
qglDepthRange (gldepthmin, gldepthmax);
@ -2575,7 +2577,7 @@ static void DrawMeshes(void)
}
}
void BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t *vbo, texnums_t *texnums)
void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t *vbo, texnums_t *texnums)
{
if (!vbo)
{
@ -2626,7 +2628,7 @@ void BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_t
DrawMeshes();
}
}
void BE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, vbo_t *vbo, texnums_t *texnums)
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, vbo_t *vbo, texnums_t *texnums)
{
shader->next = NULL;
BE_DrawMesh_List(shader, 1, &mesh, NULL, texnums);
@ -2655,7 +2657,7 @@ void BE_DrawPolys(qboolean decalsset)
BE_DrawMesh_Single(cl_stris[i].shader, &m, NULL, &cl_stris[i].shader->defaulttextures);
}
}
void BE_SubmitBatch(batch_t *batch)
void GLBE_SubmitBatch(batch_t *batch)
{
model_t *model = cl.worldmodel;
int lm;
@ -2758,7 +2760,7 @@ static void BE_SubmitMeshesPortals(batch_t **worldlist, batch_t *dynamiclist)
}
BE_SelectMode(BEM_STANDARD, 0);
R_DrawPortal(batch, worldlist);
GLR_DrawPortal(batch, worldlist);
/*clear depth again*/
GL_ForceDepthWritable();
@ -2797,7 +2799,7 @@ static void BE_SubmitMeshesSortList(batch_t *sortlist)
}
}
void BE_SubmitMeshes (qboolean drawworld, batch_t **blist)
void GLBE_SubmitMeshes (qboolean drawworld, batch_t **blist)
{
model_t *model = cl.worldmodel;
int i;
@ -2872,7 +2874,7 @@ static void BE_UpdateLightmaps(void)
}
}
batch_t *BE_GetTempBatch(void)
batch_t *GLBE_GetTempBatch(void)
{
if (shaderstate.wbatch >= shaderstate.maxwbatches)
{
@ -2926,12 +2928,12 @@ void BE_BaseEntTextures(void)
{
batch_t *batches[SHADER_SORT_COUNT];
BE_GenModelBatches(batches);
BE_SubmitMeshes(false, batches);
GLBE_SubmitMeshes(false, batches);
BE_SelectEntity(&r_worldentity);
}
#endif
void BE_DrawWorld (qbyte *vis)
void GLBE_DrawWorld (qbyte *vis)
{
extern cvar_t r_shadow_realtime_world, r_shadow_realtime_world_lightmaps;
batch_t *batches[SHADER_SORT_COUNT];
@ -2996,7 +2998,7 @@ void BE_DrawWorld (qbyte *vis)
checkerror();
RSpeedRemark();
BE_SubmitMeshes(true, batches);
GLBE_SubmitMeshes(true, batches);
RSpeedEnd(RSPEED_WORLD);
#ifdef RTLIGHTS
@ -3038,7 +3040,7 @@ void BE_DrawNonWorld (void)
shaderstate.curentity = NULL;
shaderstate.updatetime = cl.servertime;
BE_SubmitMeshes(false, batches);
GLBE_SubmitMeshes(false, batches);
BE_SelectEntity(&r_worldentity);
shaderstate.updatetime = realtime;

View File

@ -1082,7 +1082,7 @@ TRACE(("dbg: RMod_LoadTextures: inittexturedescs\n"));
if (!Q_strncmp(mt->name,"sky",3))
{
tn = R_InitSky (tx, (char *)mt + mt->offsets[0]);
R_InitSky (&tn, tx, (char *)mt + mt->offsets[0]);
}
else
#ifdef PEXT_BULLETENS

View File

@ -27,6 +27,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "shader.h"
#include "gl_draw.h"
#ifdef _DEBUG
#define checkerror() if (qglGetError()) Con_Printf("Error detected at line %s:%i\n", __FILE__, __LINE__)
#else
#define checkerror()
#endif
void R_RenderBrushPoly (msurface_t *fa);
#define PROJECTION_DISTANCE 200
@ -1272,7 +1278,7 @@ static void TransformDir(vec3_t in, vec3_t planea[3], vec3_t viewa[3], vec3_t re
VectorMA(result, d, viewa[i], result);
}
}
void R_DrawPortal(batch_t *batch, batch_t **blist)
void GLR_DrawPortal(batch_t *batch, batch_t **blist)
{
entity_t *view;
GLdouble glplane[4];

View File

@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
extern cvar_t gl_bump;
void BE_ClearVBO(vbo_t *vbo)
void GLBE_ClearVBO(vbo_t *vbo)
{
int vboh[7];
int i, j;
@ -128,7 +128,7 @@ static qboolean GL_BuildVBO(vbo_t *vbo, void *vdata, int vsize, void *edata, int
return true;
}
void BE_GenBrushModelVBO(model_t *mod)
void GLBE_GenBrushModelVBO(model_t *mod)
{
unsigned int maxvboverts;
unsigned int maxvboelements;
@ -278,7 +278,7 @@ void BE_GenBrushModelVBO(model_t *mod)
}*/
}
void BE_UploadAllLightmaps(void)
void GLBE_UploadAllLightmaps(void)
{
int i;
//

View File

@ -2,6 +2,13 @@
#ifdef GLQUAKE
#include "glquake.h"
#include "gl_draw.h"
#include "shader.h"
#ifdef _DEBUG
#define checkerror() if (qglGetError()) Con_Printf("Error detected at line %s:%i\n", __FILE__, __LINE__)
#else
#define checkerror()
#endif
//standard 1.1 opengl calls
void (APIENTRY *qglAlphaFunc) (GLenum func, GLclampf ref);
@ -912,7 +919,11 @@ void GL_Init(void *(*getglfunction) (char *name))
{
Con_Printf ("GL_EXTENSIONS:");
for (i = 0; i < gl_num_extensions; i++)
{
Con_Printf (" %s", qglGetStringi(GL_EXTENSIONS, i));
if ((i & 15) == 15)
Con_Printf("\n");
}
Con_Printf ("\n");
}
else
@ -942,16 +953,20 @@ void GL_Init(void *(*getglfunction) (char *name))
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
checkerror();
#ifdef DEBUG
if (qglDebugMessageEnableAMD)
qglDebugMessageEnableAMD(0, 0, 0, NULL, true);
if (qglDebugMessageCallbackAMD)
qglDebugMessageCallbackAMD(myGLDEBUGPROCAMD, NULL);
qglGetError(); /*suck up the invalid operation error for non-debug contexts*/
#endif
#if HASHPROGRAMS
Hash_InitTable(&compiledshaderstable, sizeof(compiledshadersbuckets)/Hash_BytesForBuckets(1), compiledshadersbuckets);
#endif
checkerror();
}
unsigned int d_8to24rgbtable[256];
@ -1039,6 +1054,19 @@ rendererinfo_t openglrendererinfo = {
GLSCR_UpdateScreen,
GLBE_SelectMode,
GLBE_DrawMesh_List,
GLBE_DrawMesh_Single,
GLBE_SubmitBatch,
GLBE_GetTempBatch,
GLBE_DrawWorld,
GLBE_Init,
GLBE_GenBrushModelVBO,
GLBE_ClearVBO,
GLBE_UploadAllLightmaps,
GLBE_SelectEntity,
GLBE_LightCullModel,
""
};

View File

@ -152,6 +152,12 @@ void ClearAllStates (void);
void VID_UpdateWindowStatus (HWND hWnd);
void GL_Init(void *(*getglfunction) (char *name));
#ifdef _DEBUG
#define checkerror() if (qglGetError()) Con_Printf("Error detected at line %s:%i\n", __FILE__, __LINE__)
#else
#define checkerror()
#endif
typedef void (APIENTRY *lp3DFXFUNC) (int, int, int, int, int, const void*);
lp3DFXFUNC qglColorTableEXT;
qboolean is8bit = false;
@ -170,6 +176,7 @@ extern cvar_t vid_preservegamma;
extern cvar_t vid_gl_context_version;
extern cvar_t vid_gl_context_debug;
extern cvar_t vid_gl_context_es2;
extern cvar_t vid_gl_context_forwardcompatible;
extern cvar_t vid_gl_context_compatibility;
@ -237,11 +244,12 @@ HGLRC (APIENTRY *qwglCreateContextAttribsARB)(HDC hDC, HGLRC hShareContext, cons
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
#define WGL_CONTEXT_FLAGS_ARB 0x2094
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 /*WGL_CONTEXT_ES2_PROFILE_BIT_EXT*/
#define ERROR_INVALID_VERSION_ARB 0x2095
#define ERROR_INVALID_PROFILE_ARB 0x2096
@ -938,7 +946,20 @@ qboolean VID_AttachGL (rendererstate_t *info)
Con_SafePrintf(CON_ERROR "wglMakeCurrent failed\n"); //green to make it show.
return false;
}
/*
if (developer.ival)
{
char *(WINAPI *wglGetExtensionsString)(void) = NULL;
if (!wglGetExtensionsString)
wglGetExtensionsString = getglfunc("wglGetExtensionsString");
if (!wglGetExtensionsString)
wglGetExtensionsString = getglfunc("wglGetExtensionsStringARB");
if (!wglGetExtensionsString)
wglGetExtensionsString = getglfunc("wglGetExtensionsStringEXT");
if (wglGetExtensionsString)
Con_SafePrintf("WGL extensions: %s\n", wglGetExtensionsString());
}
*/
qwglCreateContextAttribsARB = getglfunc("wglCreateContextAttribsARB");
#ifdef _DEBUG
//attempt to promote that to opengl3.
@ -981,10 +1002,12 @@ qboolean VID_AttachGL (rendererstate_t *info)
}
/*only switch contexts if there's actually a point*/
if (i || !vid_gl_context_compatibility.ival)
if (i || !vid_gl_context_compatibility.ival || vid_gl_context_es2.ival)
{
attribs[i+1] = 0;
if (vid_gl_context_compatibility.ival)
if (vid_gl_context_es2.ival)
attribs[i+1] |= WGL_CONTEXT_ES2_PROFILE_BIT_EXT;
else if (vid_gl_context_compatibility.ival)
attribs[i+1] |= WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
else
attribs[i+1] |= WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
@ -1020,6 +1043,8 @@ qboolean VID_AttachGL (rendererstate_t *info)
TRACE(("dbg: VID_AttachGL: GL_Init\n"));
GL_Init(getglfunc);
checkerror();
qwglChoosePixelFormatARB = getglfunc("wglChoosePixelFormatARB");
qwglSwapIntervalEXT = getglfunc("wglSwapIntervalEXT");
@ -1036,6 +1061,8 @@ qboolean VID_AttachGL (rendererstate_t *info)
if (!qGetDeviceGammaRamp) qGetDeviceGammaRamp = (void*)GetDeviceGammaRamp;
if (!qSetDeviceGammaRamp) qSetDeviceGammaRamp = (void*)SetDeviceGammaRamp;
checkerror();
return true;
}

View File

@ -735,7 +735,7 @@ R_InitSky
A sky texture is 256*128, with the right side being a masked overlay
==============
*/
texnums_t R_InitSky (texture_t *mt, qbyte *src)
void R_InitSky (struct texnums_s *tn, texture_t *mt, qbyte *src)
{
int i, j, p;
unsigned trans[128*128];
@ -743,9 +743,8 @@ texnums_t R_InitSky (texture_t *mt, qbyte *src)
int r, g, b;
unsigned *rgba;
char name[MAX_QPATH];
texnums_t tn;
memset(&tn, 0, sizeof(tn));
memset(tn, 0, sizeof(*tn));
// make an average value for the back to avoid
// a fringe on the top level
@ -769,9 +768,9 @@ texnums_t R_InitSky (texture_t *mt, qbyte *src)
Q_snprintfz(name, sizeof(name), "%s_solid", mt->name);
Q_strlwr(name);
tn.base = R_LoadReplacementTexture(name, NULL, IF_NOALPHA);
if (!TEXVALID(tn.base))
tn.base = R_LoadTexture32(name, 128, 128, trans, IF_NOALPHA|IF_NOGAMMA);
tn->base = R_LoadReplacementTexture(name, NULL, IF_NOALPHA);
if (!TEXVALID(tn->base))
tn->base = R_LoadTexture32(name, 128, 128, trans, IF_NOALPHA|IF_NOGAMMA);
alphamask = LittleLong(0x7fffffff);
for (i=0 ; i<128 ; i++)
@ -786,10 +785,8 @@ texnums_t R_InitSky (texture_t *mt, qbyte *src)
Q_snprintfz(name, sizeof(name), "%s_trans", mt->name);
Q_strlwr(name);
tn.fullbright = R_LoadReplacementTexture(name, NULL, 0);
if (!TEXVALID(tn.fullbright))
tn.fullbright = R_LoadTexture32(name, 128, 128, trans, IF_NOGAMMA);
return tn;
tn->fullbright = R_LoadReplacementTexture(name, NULL, 0);
if (!TEXVALID(tn->fullbright))
tn->fullbright = R_LoadTexture32(name, 128, 128, trans, IF_NOGAMMA);
}
#endif

View File

@ -4060,7 +4060,7 @@ d3dglfunc_t glfuncs[] = {
};
qboolean D3DVID_Init(rendererstate_t *info, unsigned char *palette)
static qboolean D3DVID_Init(rendererstate_t *info, unsigned char *palette)
{
strcpy(info->glrenderer, "D3D");
return GLVID_Init(info, palette);
@ -4070,98 +4070,104 @@ extern "C" {
#include "gl_draw.h"
}
rendererinfo_t d3drendererinfo = {
"Direct3D",
rendererinfo_t d3dfglrendererinfo = {
"Direct3D Wrapper",
{
"faked3d",
"crap"
},
QR_OPENGL,
QR_OPENGL,
GLDraw_SafePicFromWad,
GLDraw_CachePic,
GLDraw_SafeCachePic,
GLDraw_Init,
GLDraw_ReInit,
GLDraw_Character,
GLDraw_ColouredCharacter,
GLDraw_TinyCharacter,
GLDraw_String,
GLDraw_Alt_String,
GLDraw_Crosshair,
GLDraw_DebugChar,
GLDraw_Pic,
GLDraw_ScalePic,
GLDraw_SubPic,
GLDraw_TransPic,
GLDraw_TransPicTranslate,
GLDraw_ConsoleBackground,
GLDraw_EditorBackground,
GLDraw_TileClear,
GLDraw_Fill,
GLDraw_FillRGB,
GLDraw_FadeScreen,
GLDraw_BeginDisc,
GLDraw_EndDisc,
R2D_SafePicFromWad,
R2D_SafeCachePic,
GLDraw_Init,
GLDraw_ReInit,
GLDraw_Crosshair,
R2D_ScalePic,
R2D_SubPic,
GLDraw_TransPicTranslate,
R2D_ConsoleBackground,
R2D_EditorBackground,
R2D_TileClear,
GLDraw_Fill,
GLDraw_FillRGB,
GLDraw_FadeScreen,
GLDraw_BeginDisc,
GLDraw_EndDisc,
GLDraw_Image,
GLDraw_ImageColours,
R2D_Image,
R2D_ImageColours,
GLR_Init,
GLR_DeInit,
GLR_ReInit,
GLR_RenderView,
GL_LoadTextureFmt,
GL_LoadTexture8Pal24,
GL_LoadTexture8Pal32,
GL_LoadCompressed,
GL_FindTexture,
GL_AllocNewTexture,
GL_UploadFmt,
GL_DestroyTexture,
GLR_Init,
GLR_DeInit,
GLR_RenderView,
NULL,
NULL,
GLR_NewMap,
GLR_PreNewMap,
GLR_LightPoint,
GLR_PushDlights,
GLR_NewMap,
GLR_PreNewMap,
GLR_LightPoint,
Surf_AddStain,
Surf_LessenStains,
Surf_AddStain,
Surf_LessenStains,
MediaGL_ShowFrameBGR_24_Flip,
MediaGL_ShowFrameRGBA_32,
MediaGL_ShowFrame8bit,
RMod_Init,
RMod_ClearAll,
RMod_ForName,
RMod_FindName,
RMod_Extradata,
RMod_TouchModel,
RMod_NowLoadExternal,
RMod_Think,
Mod_GetTag,
Mod_TagNumForName,
Mod_SkinNumForName,
Mod_FrameNumForName,
Mod_FrameDuration,
D3DVID_Init,
GLVID_DeInit,
GLVID_SetPalette,
GLVID_ShiftPalette,
GLVID_GetRGBInfo,
GLVID_SetCaption, //setcaption
GLMod_Init,
GLMod_ClearAll,
GLMod_ForName,
GLMod_FindName,
GLMod_Extradata,
GLMod_TouchModel,
GLSCR_UpdateScreen,
GLMod_NowLoadExternal,
GLMod_Think,
/*backend*/
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
Mod_GetTag,
Mod_TagNumForName,
Mod_SkinForName,
Mod_FrameForName,
Mod_GetFrameDuration,
D3DVID_Init,
GLVID_DeInit,
GLVID_SetPalette,
GLVID_ShiftPalette,
GLVID_GetRGBInfo,
NULL, //setcaption
GLSCR_UpdateScreen,
""
""
};
extern "C" {
rendererinfo_t *pd3drendererinfo = &d3drendererinfo;
rendererinfo_t *pd3dfglrendererinfo = &d3dfglrendererinfo;
}
#endif

View File

@ -376,7 +376,7 @@ void Shader_NeedReload(void);
mfog_t *CM_FogForOrigin(vec3_t org);
//not all modes accept meshes - STENCIL(intentional) and DEPTHONLY(not implemented)
typedef enum
enum backendmode_e
{
BEM_STANDARD, //regular mode to draw surfaces akin to q3 (aka: legacy mode). lightmaps+delux+ambient
BEM_DEPTHONLY, //just a quick depth pass. textures used only for alpha test (shadowmaps).
@ -385,7 +385,7 @@ typedef enum
BEM_LIGHT, //we have a valid light
BEM_SMAPLIGHTSPOT, //we have a spot light using a shadowmap
BEM_SMAPLIGHT //we have a light using a shadowmap
} backendmode_t;
};
#define BEF_FORCEDEPTHWRITE 1
#define BEF_FORCEDEPTHTEST 2
@ -394,31 +394,40 @@ typedef enum
#define BEF_FORCENODEPTH 16 //disables any and all depth.
#define BEF_PUSHDEPTH 32 //additional polygon offset
//Select the current render mode and modifier flags
void BE_SelectMode(backendmode_t mode, unsigned int flags);
/*Draws an entire mesh list from a VBO. vbo can be null, in which case the chain may be drawn without batching.
Rules for using a list: Every mesh must be part of the same VBO, shader, lightmap, and must have the same pointers set*/
void BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums);
void BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums);
void BE_SubmitBatch(batch_t *batch);
batch_t *BE_GetTempBatch(void);
#ifdef GLQUAKE
void GLBE_Init(void);
void GLBE_SelectMode(backendmode_t mode, unsigned int flags);
void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums);
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums);
void GLBE_SubmitBatch(batch_t *batch);
batch_t *GLBE_GetTempBatch(void);
void GLBE_GenBrushModelVBO(model_t *mod);
void GLBE_ClearVBO(vbo_t *vbo);
void GLBE_UploadAllLightmaps(void);
void GLBE_DrawWorld (qbyte *vis);
qboolean GLBE_LightCullModel(vec3_t org, model_t *model);
void GLBE_SelectEntity(entity_t *ent);
#endif
#ifdef D3DQUAKE
void D3DBE_Init(void);
void D3DBE_SelectMode(backendmode_t mode, unsigned int flags);
void D3DBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums);
void D3DBE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums);
void D3DBE_SubmitBatch(batch_t *batch);
batch_t *D3DBE_GetTempBatch(void);
void D3DBE_GenBrushModelVBO(model_t *mod);
void D3DBE_ClearVBO(vbo_t *vbo);
void D3DBE_UploadAllLightmaps(void);
void D3DBE_DrawWorld (qbyte *vis);
qboolean D3DBE_LightCullModel(vec3_t org, model_t *model);
void D3DBE_SelectEntity(entity_t *ent);
#endif
//Asks the backend to invoke DrawMeshChain for each surface, and to upload lightmaps as required
void BE_DrawWorld (qbyte *vis);
void BE_DrawNonWorld (void);
//called at init, force the display to the right defaults etc
void BE_Init(void);
void D3DBE_Reset(qboolean before);
void BE_D3D_Reset(qboolean before);
//Generates an optimised VBO, one for each texture on the map
void BE_GenBrushModelVBO(model_t *mod);
//Destroys the given vbo
void BE_ClearVBO(vbo_t *vbo);
//Uploads all modified lightmaps
void BE_UploadAllLightmaps(void);
//Builds a hardware shader from the software representation
void BE_GenerateProgram(shader_t *shader);
@ -435,8 +444,5 @@ void Sh_Shutdown(void);
void BE_BaseEntShadowDepth(void);
//Sets the given light+colour to be the current one that everything is to be lit/culled by.
void BE_SelectDLight(dlight_t *dl, vec3_t colour);
//Returns true if the mesh is not lit by the current light
qboolean BE_LightCullModel(vec3_t org, model_t *model);
#endif
void BE_SelectEntity(entity_t *ent);
#endif

View File

@ -3475,10 +3475,11 @@ SV_Frame
void SV_Frame (void)
{
extern cvar_t pr_imitatemvdsv;
static double start, end;
static double start, end, idletime;
float oldtime;
qboolean isidle;
static int oldpaused;
float timedelta;
start = Sys_DoubleTime ();
svs.stats.idle += start - end;
@ -3508,8 +3509,12 @@ void SV_Frame (void)
{
oldtime = sv.time;
sv.time = (Sys_DoubleTime() - sv.starttime)*sv.gamespeed;
timedelta = sv.time - oldtime;
if (sv.time < oldtime)
{
sv.time = oldtime; //urm
timedelta = 0;
}
if (sv.paused && sv.time > 1.5)
{
@ -3602,7 +3607,7 @@ void SV_MVDStream_Poll(void);
}
}
if (!isidle)
if (!isidle || idletime > 0.1)
{
#ifdef SQL
@ -3656,7 +3661,9 @@ void SV_MVDStream_Poll(void);
if (ge && ge->edicts)
SVQ2_ClearEvents();
#endif
idletime = 0;
}
idletime += timedelta;
// collect timing statistics
end = Sys_DoubleTime ();

View File

@ -2121,7 +2121,7 @@ struct
void SV_VoiceReadPacket(void)
{
unsigned int vt = host_client->voice_target;
unsigned int j, cln;
unsigned int j;
struct voice_ring_s *ring;
unsigned short bytes;
client_t *cl;
@ -2227,7 +2227,6 @@ void SV_VoiceSendPacket(client_t *client, sizebuf_t *buf)
unsigned int clno;
qboolean send;
struct voice_ring_s *ring;
client_t *split;
if (client->controller)
client = client->controller;

View File

@ -239,8 +239,11 @@ void Net_ProxySend(cluster_t *cluster, oproxy_t *prox, void *buffer, int length)
Net_TryFlushProxyBuffer(cluster, prox); //try flushing
if (prox->buffersize-prox->bufferpos + length > MAX_PROXY_BUFFER) //damn, still too big.
{ //they're too slow. hopefully it was just momentary lag
printf("QTV client is too lagged\n");
prox->flushing = true;
if (!prox->flushing)
{
printf("QTV client is too lagged\n");
prox->flushing = true;
}
return;
}
}
@ -648,11 +651,27 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend)
if (pend->flushing)
{
if (pend->bufferpos == pend->buffersize)
if (pend->srcfile)
{
if (pend->srcfile)
#if 0
//bufferend = transmit point
//buffersize = write point
if (bufferend < buffersize)
space = (MAX_PROXY_BUFFER - pend->buffersize) + pend->bufferend;
else
space = pend->bufferend - pend->buffersize;
if (space < 256) /*don't bother reading if we're dribbling*/
return false;
if (space > 0) /*never fully saturate so as to not confuse the ring*/
space--;
if (space > MAX_PROXY_BUFFER -
fread(prox->buffer + pend->buffersize, 1, space, pend->srcfile);
#else
if (pend->bufferpos == pend->buffersize)
{
char buffer[4096];
char buffer[MAX_PROXY_BUFFER/2];
len = fread(buffer, 1, sizeof(buffer), pend->srcfile);
if (!len)
{
@ -660,13 +679,15 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend)
pend->srcfile = NULL;
}
Net_ProxySend(cluster, pend, buffer, len);
return false; //don't try reading anything yet
}
else
{
pend->drop = true;
return false;
}
#endif
return false; //don't try reading anything yet
}
if (pend->bufferpos == pend->buffersize)
{
pend->drop = true;
return false;
}
else
return false;

View File

@ -1,5 +1,6 @@
#include "qtv.h"
#define MINPLUGVER "4239"
//main reason to use connection close is because we're lazy and don't want to give sizes in advance (yes, we could use chunks..)
@ -166,6 +167,30 @@ static void HTTPSV_SendHTMLHeader(cluster_t *cluster, oproxy_t *dest, char *titl
);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
if (plugin)
{
s =
"<script>"
"if (!parent.getplug || parent.getplug().plugver == undefined || parent.getplug().plugver < "MINPLUGVER")"
"{"
"if (!parent.getplug || parent.getplug().plugver == undefined)"
"{"
"document.write(\"You need a plugin! Get one here!\");"
"}"
"else"
"{"
"document.write(\"Update your plugin!\");"
"}"
"document.write(\"<br/>"
"<a href=\\\"npfte.xpi\\\">Firefox (open with firefox itself)</a><br/>"
"<a href=\\\"iefte.exe\\\">Internet Explorer</a><br/>"
"<a href=\\\"npfte.exe\\\">Others</a><br/>"
"\");"
"}"
"</script>";
Net_ProxySend(cluster, dest, s, strlen(s));
}
}
static void HTTPSV_SendHTMLFooter(cluster_t *cluster, oproxy_t *dest)
@ -173,9 +198,15 @@ static void HTTPSV_SendHTMLFooter(cluster_t *cluster, oproxy_t *dest)
char *s;
char buffer[2048];
snprintf(buffer, sizeof(buffer), "<br/>QTV Version: %i <a href=\"http://www.fteqw.com\" target=\"_blank\">www.fteqw.com</a><br />", cluster->buildnumber);
/*Proxy version*/
snprintf(buffer, sizeof(buffer), "<br/>Server Version: %i <a href=\"http://www.fteqw.com\" target=\"_blank\">www.fteqw.com</a>", cluster->buildnumber);
Net_ProxySend(cluster, dest, buffer, strlen(buffer));
/*Plugin version*/
s = "<script>if (parent.getplug != null) document.write(\"<br/>Plugin Version: \" + parent.getplug().build + parent.getplug().server);</script>";
Net_ProxySend(cluster, dest, s, strlen(s));
/*terminate html page*/
s = "</body>\n"
"</html>\n";
Net_ProxySend(cluster, dest, s, strlen(s));
@ -289,8 +320,6 @@ static void HTTPSV_GenerateCSSFile(cluster_t *cluster, oproxy_t *dest)
HTMLPRINT("dl.nowplaying ul { margin: 0 0 0 1em; padding: 0; }");
HTMLPRINT("#navigation { background-color: #eef; }");
HTMLPRINT("#navigation li { display: inline; list-style: none; margin: 0 3em; }");
HTMLPRINT("div.optdiv { margin: 0px 0px 0px 0px; position: fixed; left: 0%; width: 50%; top: 0%; height: 100%; }");
HTMLPRINT("div.plugdiv { margin: 0px 0px 0px 0px; position: fixed; left: 50%; width: 50%; top: 0%; height: 100%; }");
}
static qboolean HTTPSV_GetHeaderField(char *s, char *field, char *buffer, int buffersize)
@ -721,12 +750,12 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest)
"<HTML><HEAD><TITLE>QuakeTV With Plugin</TITLE>"
" <link rel=\"StyleSheet\" href=\"/style.css\" type=\"text/css\" />\n"
"</HEAD><body>"
"<div class=\"optdiv\">"
"<div id=optdiv style='position:fixed; left:0%; width:50%; top:0%; height:100%;'>"
"<iframe frameborder=0 src=\"nowplaying.html?p\" width=\"100%\" height=\"100%\">"
"oh dear. your browser doesn't support this site"
"</iframe>"
"</div>"
"<div class=\"plugdiv\">"
"<div id=plugdiv style='position:fixed; left:50%; width:50%; top:0%; height:100%;'>"
/*once for IE*/
"<object name=\"ieplug\""
" type=\"text/x-quaketvident\""
@ -741,8 +770,13 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest)
Net_ProxySend(cluster, dest, hostname, strlen(hostname));
html =
"/qtvsplash.jpg\">"
"<param name=\"availver\" value=\""MINPLUGVER"\">"
"<param name=\"game\" value=\"q1\">"
"<param name=\"dataDownload\" value=\"id1/pak0.pak:http://random.nquake.com/qsw106.zip\">"
"<param name=\"dataDownload\" value='";
Net_ProxySend(cluster, dest, html, strlen(html));
Net_ProxySend(cluster, dest, cluster->plugindatasource, strlen(cluster->plugindatasource));
html =
"'>"
/*once again for firefox and similar friends*/
"<object name=\"npplug\""
" type=\"text/x-quaketvident\""
@ -755,21 +789,27 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest)
Net_ProxySend(cluster, dest, hostname, strlen(hostname));
html =
"/qtvsplash.jpg\">"
"<param name=\"availver\" value=\""MINPLUGVER"\">"
"<param name=\"game\" value=\"q1\">"
"<param name=\"dataDownload\" value=\"id1/pak0.pak:http://random.nquake.com/qsw106.zip\">"
"It looks like you either don't have the required plugin or its not supported by your browser.<br/>"
"<a href=\"npfte.xpi\">You can download one for firefox here (open with firefox itself).</a><br/>"
"<a href=\"iefte.exe\">You can download one for internet explorer here.</a><br/>"
"<a href=\"npfte.exe\">You can download one for other browsers here.</a><br/>"
"<param name=\"dataDownload\" value='";
Net_ProxySend(cluster, dest, html, strlen(html));
Net_ProxySend(cluster, dest, cluster->plugindatasource, strlen(cluster->plugindatasource));
html =
"'>"
"Plugin failed to load"
"</object>"
"</object>"
"</div>"
"<script>"
"function getplug(d)\n"
"function getplugnp(d)\n"
"{\n"
"return document.npplug;\n"
"}\n"
"function getplugie(d)\n"
"{\n"
"return document.ieplug;\n"
"}\n"
"parent.host = \""
;
Net_ProxySend(cluster, dest, html, strlen(html));
@ -780,7 +820,12 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest)
"function joinserver(d)\n"
"{\n"
"getplug().mapsrc = \"http://bigfoot.morphos-team.net/misc/quakemaps/\";\n"
"getplug().mapsrc = \""
;
Net_ProxySend(cluster, dest, html, strlen(html));
Net_ProxySend(cluster, dest, cluster->plugindatasource, strlen(cluster->plugindatasource));
html =
"\";\n"
"getplug().server = d;\n"
"getplug().running = 1;\n"
"}\n"
@ -800,6 +845,18 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest)
"parent.joinserver = joinserver;\n"
"parent.playdemo = playdemo;\n"
"if (getplugie() != undefined && getplugie().plugver != undefined)\n"
"{\nparent.getplug = getplugie;\n}\n"
"else\n"
"{\nparent.getplug = getplugnp;\n}\n"
/* "if (getplug().plugver == undefined)"
"{"
"document.getElementById('plugdiv').style.left = '75%';"
"document.getElementById('optdiv').style.width = '25%';"
"document.getElementById('plugdiv').style.width = '0';"
"parent.getplug = null;"
"}"
*/
"</script>"
"</body></HTML>";
@ -1065,11 +1122,17 @@ void HTTPSV_GetMethod(cluster_t *cluster, oproxy_t *pend)
{
HTTPSV_GenerateAdmin(cluster, pend, 0, NULL, args);
}
#if defined(_DEBUG) || defined(DEBUG)
else REDIRECTIF("/", "/plugin.html")
#endif
else REDIRECTIF("/", "/nowplaying.html")
else REDIRECTIF("/about.html", "http://www.fteqw.com/")
else REDIRECTIF("/qtvsplash.jpg", "/file/qtvsplash.jpg") /*lame, very lame*/
#if defined(_DEBUG) || defined(DEBUG)
else REDIRECTIF("/npfte.xpi", "/file/npfte_dbg.xpi") /*lame, very lame*/
#else
else REDIRECTIF("/npfte.xpi", "/file/npfte.xpi") /*lame, very lame*/
#endif
else REDIRECTIF("/npfte.exe", "/file/npfte.exe") /*lame, very lame*/
else REDIRECTIF("/iefte.exe", "/file/iefte.exe") /*lame, very lame*/
else if (uriargmatch(uri, "/demos.html", urilen, &args))

View File

@ -693,6 +693,8 @@ struct cluster_s {
char master[MAX_QPATH];
char demodir[MAX_QPATH];
char downloaddir[MAX_QPATH]; //must be slash terminated, or empty.
char plugindatasource[256]; //sued by the http server for use with npfte
char mapsource[256]; //sued by the http server for use with npfte
qboolean chokeonnotupdated;
qboolean lateforward;
qboolean notalking;

View File

@ -2574,7 +2574,7 @@ void QTV_SayCommand(cluster_t *cluster, sv_t *qtv, viewer_t *v, char *fullcomman
QW_StuffcmdToViewer(v, "bind pause \"say proxy:menu\"\n");
QW_StuffcmdToViewer(v, "bind backspace \"say proxy:menu back\"\n");
QW_PrintfToViewer(v, "All keys bound not recognised\n");
QW_PrintfToViewer(v, "All keys bound\n");
}
else if (!*command)
{

View File

@ -857,6 +857,8 @@ void Cmd_Streams(cmdctxt_t *ctx)
case ERR_NONE:
if (qtv->controller)
status = " (player controlled)";
else if (qtv->autodisconnect == AD_STATUSPOLL)
status = " (polling)";
else if (qtv->parsingconnectiondata)
status = " (connecting)";
else
@ -1150,6 +1152,56 @@ void Cmd_DLDir(cmdctxt_t *ctx)
}
}
void Cmd_PluginDataSource(cmdctxt_t *ctx)
{
char *val;
val = Cmd_Argv(ctx, 1);
if (!Cmd_IsLocal(ctx))
{
Cmd_Printf(ctx, "plugindatasource may not be used remotely\n");
return;
}
if (*val)
{
while (*val > 0 &&*val <= ' ')
val++;
strlcpy(ctx->cluster->plugindatasource, val, sizeof(ctx->cluster->plugindatasource));
Cmd_Printf(ctx, "Changed plugindatasource to \"%s\"\n", ctx->cluster->plugindatasource);
}
else
{
Cmd_Printf(ctx, "Current plugindatasource is \"%s\"\n", ctx->cluster->plugindatasource);
}
}
void Cmd_MapSource(cmdctxt_t *ctx)
{
char *val;
val = Cmd_Argv(ctx, 1);
if (!Cmd_IsLocal(ctx))
{
Cmd_Printf(ctx, "mapsource may not be used remotely\n");
return;
}
if (*val)
{
while (*val > 0 &&*val <= ' ')
val++;
strlcpy(ctx->cluster->mapsource, val, sizeof(ctx->cluster->mapsource));
Cmd_Printf(ctx, "Changed mapsource url to \"%s\"\n", ctx->cluster->mapsource);
}
else
{
Cmd_Printf(ctx, "Current mapsource url is \"%s\"\n", ctx->cluster->mapsource);
}
}
void Cmd_MuteStream(cmdctxt_t *ctx)
{
char *val;
@ -1245,7 +1297,6 @@ const rconcommands_t rconcommands[] =
{"maxproxies", 0, 1, Cmd_MaxProxies, "sets a limit on tcp/qtv client connections"},
{"demodir", 0, 1, Cmd_DemoDir, "specifies where to get the demo list from"},
{"basedir", 0, 1, Cmd_BaseDir, "specifies where to get any files required by the game. this is prefixed to the server-specified game dir."},
{"dldir", 0, 1, Cmd_DLDir, "specifies the path to download stuff from (http://server/file/ maps here)"},
{"ping", 0, 1, Cmd_Ping, "sends a udp ping to a qtv proxy or server"},
{"reconnect", 0, 1, Cmd_Reconnect, "forces a stream to reconnect to its server (restarts demos)"},
{"echo", 0, 1, Cmd_Echo, "a useless command that echos a string"},
@ -1269,6 +1320,10 @@ const rconcommands_t rconcommands[] =
{"tcpport", 0, 1, Cmd_MVDPort, "specifies which port to listen on for tcp/qtv connections"},
{"mvdport", 0, 1, Cmd_MVDPort},
{"dldir", 0, 1, Cmd_DLDir, "specifies the path to download stuff from (http://server/file/ maps to this native path)"},
{"plugindatasource",0,1,Cmd_PluginDataSource, "Specifies the dataDownload property for plugins in the web server"},
{"mapsource", 0, 1, Cmd_MapSource,"Public URL for where to download missing maps from"},
#ifdef VIEWER
{"watch", 1, 0, Cmd_Watch, "specifies to watch that stream in the built-in viewer"},
#endif