reworked the shader system slightly.
$diffuse can now sample animmaps correctly (although this only makes sense when using glsl or replacement shaders (read: rtlights)). $fullbright now defaults according to the animmap too. added reflectcube and reflectmask (the latter defaults according to map/animmap, the former needs to be explicitly stated). fix d3d9+d3d11 renderers a little. needs much more work. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4868 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
5ecd9cc5dd
commit
2afefb77ca
82 changed files with 1877 additions and 923 deletions
|
@ -2667,7 +2667,7 @@ void CLQ1_AddShadow(entity_t *ent)
|
||||||
"alphagen vertex\n"
|
"alphagen vertex\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
TEXASSIGN(s->defaulttextures.base, balltexture);
|
TEXASSIGN(s->defaulttextures->base, balltexture);
|
||||||
|
|
||||||
tx = ent->model->maxs[0] - ent->model->mins[0];
|
tx = ent->model->maxs[0] - ent->model->mins[0];
|
||||||
ty = ent->model->maxs[1] - ent->model->mins[1];
|
ty = ent->model->maxs[1] - ent->model->mins[1];
|
||||||
|
|
|
@ -288,20 +288,23 @@ void CL_UpdateWindowTitle(void)
|
||||||
{
|
{
|
||||||
if (VID_SetWindowCaption)
|
if (VID_SetWindowCaption)
|
||||||
{
|
{
|
||||||
|
char title[2048];
|
||||||
switch (cls.state)
|
switch (cls.state)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
#ifndef CLIENTONLY
|
#ifndef CLIENTONLY
|
||||||
if (sv.state)
|
if (sv.state)
|
||||||
VID_SetWindowCaption(va("%s: %s", fs_gamename.string, sv.name));
|
Q_snprintfz(title, sizeof(title), "%s: %s", fs_gamename.string, sv.name);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
VID_SetWindowCaption(va("%s: %s", fs_gamename.string, cls.servername));
|
Q_snprintfz(title, sizeof(title), "%s: %s", fs_gamename.string, cls.servername);
|
||||||
break;
|
break;
|
||||||
case ca_disconnected:
|
case ca_disconnected:
|
||||||
VID_SetWindowCaption(va("%s: disconnected", fs_gamename.string));
|
Q_snprintfz(title, sizeof(title), "%s: disconnected", fs_gamename.string);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VID_SetWindowCaption(title);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,16 +111,18 @@ typedef struct serverinfo_s
|
||||||
char name[64]; //hostname.
|
char name[64]; //hostname.
|
||||||
netadr_t adr;
|
netadr_t adr;
|
||||||
|
|
||||||
|
short special; //flags
|
||||||
|
short protocol;
|
||||||
|
|
||||||
unsigned char players;
|
unsigned char players;
|
||||||
unsigned char maxplayers;
|
unsigned char maxplayers;
|
||||||
qbyte special; //flags
|
|
||||||
qbyte sends;
|
qbyte sends;
|
||||||
qbyte insortedlist;
|
qbyte insortedlist;
|
||||||
|
|
||||||
qbyte numhumans;
|
qbyte numhumans;
|
||||||
qbyte numbots;
|
qbyte numbots;
|
||||||
qbyte freeslots;
|
qbyte freeslots;
|
||||||
qbyte protocol;
|
qbyte pad;
|
||||||
|
|
||||||
char modname[8+1];
|
char modname[8+1];
|
||||||
char qcstatus[8+1];
|
char qcstatus[8+1];
|
||||||
|
|
|
@ -1094,6 +1094,7 @@ int CL_LoadModels(int stage, qboolean dontactuallyload)
|
||||||
#define endstage() if (!cls.timedemo && giveuptime<Sys_DoubleTime()) return -1;
|
#define endstage() if (!cls.timedemo && giveuptime<Sys_DoubleTime()) return -1;
|
||||||
|
|
||||||
pmove.numphysent = 0;
|
pmove.numphysent = 0;
|
||||||
|
pmove.physents[0].model = NULL;
|
||||||
|
|
||||||
/*#ifdef PEXT_CSQC
|
/*#ifdef PEXT_CSQC
|
||||||
if (atstage())
|
if (atstage())
|
||||||
|
|
|
@ -2416,7 +2416,19 @@ void CL_Laser (vec3_t start, vec3_t end, int colors)
|
||||||
ex->framerate = 100; // smoother fading
|
ex->framerate = 100; // smoother fading
|
||||||
}
|
}
|
||||||
|
|
||||||
static qbyte splash_color[] = {0x00, 0xe0, 0xb0, 0x50, 0xd0, 0xe0, 0xe8};
|
static struct{
|
||||||
|
qbyte colour;
|
||||||
|
char *name;
|
||||||
|
} q2splash_info[] =
|
||||||
|
{
|
||||||
|
{0x00, "q2part.te_splashunknown"},
|
||||||
|
{0xe0, "q2part.te_splashsparks"},
|
||||||
|
{0xb0, "q2part.te_splashbluewater"},
|
||||||
|
{0x50, "q2part.te_splashbrownwater"},
|
||||||
|
{0xd0, "q2part.te_splashslime"},
|
||||||
|
{0xe0, "q2part.te_splashlava"},
|
||||||
|
{0xe8, "q2part.te_splashblood"}
|
||||||
|
};
|
||||||
|
|
||||||
#define ATTN_NONE 0
|
#define ATTN_NONE 0
|
||||||
#define ATTN_NORM 1
|
#define ATTN_NORM 1
|
||||||
|
@ -2632,16 +2644,10 @@ fixme:
|
||||||
MSG_ReadPos (pos);
|
MSG_ReadPos (pos);
|
||||||
MSG_ReadDir (dir);
|
MSG_ReadDir (dir);
|
||||||
r = MSG_ReadByte ();
|
r = MSG_ReadByte ();
|
||||||
if (r > 6)
|
if (r > sizeof(q2splash_info)/sizeof(q2splash_info[0]))
|
||||||
color = 0x00;
|
r = 0;
|
||||||
else
|
if (P_RunParticleEffectTypeString(pos, dir, cnt, q2splash_info[r].name))
|
||||||
color = splash_color[r];
|
P_RunParticleEffect (pos, dir, q2splash_info[r].colour, cnt);
|
||||||
P_RunParticleEffect (pos, dir, color, cnt);
|
|
||||||
|
|
||||||
if (r == Q2SPLASH_BLUE_WATER || r == Q2SPLASH_BROWN_WATER)
|
|
||||||
{
|
|
||||||
P_RunParticleEffectTypeString(pos, dir, 1, "te_watersplash");
|
|
||||||
}
|
|
||||||
if (r == Q2SPLASH_SPARKS)
|
if (r == Q2SPLASH_SPARKS)
|
||||||
{
|
{
|
||||||
r = rand() & 3;
|
r = rand() & 3;
|
||||||
|
@ -2651,13 +2657,6 @@ fixme:
|
||||||
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark6.wav"), 1, ATTN_NORM, 0);
|
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark6.wav"), 1, ATTN_NORM, 0);
|
||||||
else
|
else
|
||||||
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark7.wav"), 1, ATTN_NORM, 0);
|
Q2S_StartSound (pos, 0, 0, S_PrecacheSound ("world/spark7.wav"), 1, ATTN_NORM, 0);
|
||||||
|
|
||||||
// if (r == 0)
|
|
||||||
// Q2S_StartSound (pos, 0, 0, cl_sfx_spark5, 1, ATTN_STATIC, 0);
|
|
||||||
// else if (r == 1)
|
|
||||||
// Q2S_StartSound (pos, 0, 0, cl_sfx_spark6, 1, ATTN_STATIC, 0);
|
|
||||||
// else
|
|
||||||
// Q2S_StartSound (pos, 0, 0, cl_sfx_spark7, 1, ATTN_STATIC, 0);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -1941,7 +1941,11 @@ void CLQ2_AddEntities (void)
|
||||||
if (cls.state != ca_active)
|
if (cls.state != ca_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cl.time*1000 > cl.q2frame.servertime)
|
cl.lerpfrac = 1.0 - (cl.q2frame.servertime - cl.time*1000) * 0.01;
|
||||||
|
// Con_Printf("%g: %g\n", cl.q2frame.servertime - (cl.time*1000), cl.lerpfrac);
|
||||||
|
cl.lerpfrac = bound(0, cl.lerpfrac, 1);
|
||||||
|
|
||||||
|
/* if (cl.time*1000 > cl.q2frame.servertime)
|
||||||
{
|
{
|
||||||
// if (cl_showclamp.value)
|
// if (cl_showclamp.value)
|
||||||
// Con_Printf ("high clamp %f\n", cl.time - cl.q2frame.servertime);
|
// Con_Printf ("high clamp %f\n", cl.time - cl.q2frame.servertime);
|
||||||
|
@ -1957,7 +1961,7 @@ void CLQ2_AddEntities (void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cl.lerpfrac = 1.0 - (cl.q2frame.servertime - cl.time*1000) * 0.01;
|
cl.lerpfrac = 1.0 - (cl.q2frame.servertime - cl.time*1000) * 0.01;
|
||||||
|
*/
|
||||||
CLQ2_CalcViewValues ();
|
CLQ2_CalcViewValues ();
|
||||||
CLQ2_AddPacketEntities (&cl.q2frame);
|
CLQ2_AddPacketEntities (&cl.q2frame);
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -3688,18 +3688,22 @@ static qboolean Image_GenMip0(struct pendingtextureinfo *mips, unsigned int flag
|
||||||
case PTI_S3RGBA1: //mostly compatible, but I don't want to push it.
|
case PTI_S3RGBA1: //mostly compatible, but I don't want to push it.
|
||||||
case PTI_S3RGBA3:
|
case PTI_S3RGBA3:
|
||||||
case PTI_S3RGBA5:
|
case PTI_S3RGBA5:
|
||||||
|
case PTI_WHOLEFILE:
|
||||||
//erk. meh.
|
//erk. meh.
|
||||||
break;
|
break;
|
||||||
|
case PTI_R8:
|
||||||
|
case PTI_RG8:
|
||||||
case PTI_RGB565:
|
case PTI_RGB565:
|
||||||
case PTI_RGBX8:
|
case PTI_RGBX8:
|
||||||
case PTI_BGRX8:
|
case PTI_BGRX8:
|
||||||
case PTI_S3RGB1:
|
case PTI_S3RGB1:
|
||||||
break;
|
break; //already no alpha in these formats
|
||||||
case PTI_DEPTH16:
|
case PTI_DEPTH16:
|
||||||
case PTI_DEPTH24:
|
case PTI_DEPTH24:
|
||||||
case PTI_DEPTH32:
|
case PTI_DEPTH32:
|
||||||
case PTI_DEPTH24_8:
|
case PTI_DEPTH24_8:
|
||||||
break;
|
break;
|
||||||
|
case PTI_MAX: break; //stfu
|
||||||
}
|
}
|
||||||
//FIXME: fill alpha channel with 255?
|
//FIXME: fill alpha channel with 255?
|
||||||
}
|
}
|
||||||
|
@ -4305,7 +4309,7 @@ image_t *Image_GetTexture(const char *identifier, const char *subpath, unsigned
|
||||||
|
|
||||||
qboolean dontposttoworker = (flags & (IF_NOWORKER | IF_LOADNOW));
|
qboolean dontposttoworker = (flags & (IF_NOWORKER | IF_LOADNOW));
|
||||||
qboolean lowpri = (flags & IF_LOWPRIORITY);
|
qboolean lowpri = (flags & IF_LOWPRIORITY);
|
||||||
qboolean highpri = (flags & IF_HIGHPRIORITY);
|
// qboolean highpri = (flags & IF_HIGHPRIORITY);
|
||||||
flags &= ~(IF_LOADNOW | IF_LOWPRIORITY | IF_HIGHPRIORITY);
|
flags &= ~(IF_LOADNOW | IF_LOWPRIORITY | IF_HIGHPRIORITY);
|
||||||
|
|
||||||
#ifdef LOADERTHREAD
|
#ifdef LOADERTHREAD
|
||||||
|
|
|
@ -91,7 +91,7 @@ static qboolean restore_spi;
|
||||||
static int originalmouseparms[3], newmouseparms[3] = {0, 0, 0};
|
static int originalmouseparms[3], newmouseparms[3] = {0, 0, 0};
|
||||||
qboolean mouseinitialized;
|
qboolean mouseinitialized;
|
||||||
static qboolean mouseparmsvalid, mouseactivatetoggle;
|
static qboolean mouseparmsvalid, mouseactivatetoggle;
|
||||||
static qboolean mouseshowtoggle = 1;
|
qboolean mouseshowtoggle = 1;
|
||||||
static qboolean dinput_acquired;
|
static qboolean dinput_acquired;
|
||||||
unsigned int uiWheelMessage;
|
unsigned int uiWheelMessage;
|
||||||
|
|
||||||
|
@ -2192,7 +2192,7 @@ void INS_TranslateKeyEvent(WPARAM wParam, LPARAM lParam, qboolean down, int qdev
|
||||||
if (!in_nonstandarddeadkeys.ival)
|
if (!in_nonstandarddeadkeys.ival)
|
||||||
{
|
{
|
||||||
for (unicode = 0; unicode < chars-1; unicode++)
|
for (unicode = 0; unicode < chars-1; unicode++)
|
||||||
Key_Event (qdeviceid, 0, wchars[unicode], down);
|
IN_KeyEvent(qdeviceid, down, 0, wchars[unicode]);
|
||||||
}
|
}
|
||||||
unicode = wchars[chars-1];
|
unicode = wchars[chars-1];
|
||||||
}
|
}
|
||||||
|
@ -2204,6 +2204,6 @@ void INS_TranslateKeyEvent(WPARAM wParam, LPARAM lParam, qboolean down, int qdev
|
||||||
if (shift_down && unicode < K_MAX && keyshift[unicode])
|
if (shift_down && unicode < K_MAX && keyshift[unicode])
|
||||||
unicode = keyshift[unicode];
|
unicode = keyshift[unicode];
|
||||||
}
|
}
|
||||||
Key_Event (qdeviceid, qcode, unicode, down);
|
IN_KeyEvent(qdeviceid, down, qcode, unicode);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2126,13 +2126,13 @@ void Key_Event (int devid, int key, unsigned int unicode, qboolean down)
|
||||||
{
|
{
|
||||||
Key_Dest_Remove(kdm_console);
|
Key_Dest_Remove(kdm_console);
|
||||||
Key_Dest_Remove(kdm_cwindows);
|
Key_Dest_Remove(kdm_cwindows);
|
||||||
if (!cls.state && !Key_Dest_Has(~kdm_game))
|
if (!cls.state && !Key_Dest_Has(~kdm_game) && !Media_PlayingFullScreen())
|
||||||
M_ToggleMenu_f ();
|
M_ToggleMenu_f ();
|
||||||
}
|
}
|
||||||
else if (Key_Dest_Has(kdm_cwindows))
|
else if (Key_Dest_Has(kdm_cwindows))
|
||||||
{
|
{
|
||||||
Key_Dest_Remove(kdm_cwindows);
|
Key_Dest_Remove(kdm_cwindows);
|
||||||
if (!cls.state && !Key_Dest_Has(~kdm_game))
|
if (!cls.state && !Key_Dest_Has(~kdm_game) && !Media_PlayingFullScreen())
|
||||||
M_ToggleMenu_f ();
|
M_ToggleMenu_f ();
|
||||||
}
|
}
|
||||||
#ifdef TEXTEDITOR
|
#ifdef TEXTEDITOR
|
||||||
|
|
|
@ -116,7 +116,7 @@ void Draw_Hexen2BigFontString(int x, int y, const char *text)
|
||||||
"}\n"
|
"}\n"
|
||||||
"sort additive\n"
|
"sort additive\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
if (!p->defaulttextures.base)
|
if (!p->defaulttextures->base)
|
||||||
{
|
{
|
||||||
void *file;
|
void *file;
|
||||||
qofs_t fsize = FS_LoadFile("gfx/menu/bigfont.lmp", &file);
|
qofs_t fsize = FS_LoadFile("gfx/menu/bigfont.lmp", &file);
|
||||||
|
@ -125,11 +125,11 @@ void Draw_Hexen2BigFontString(int x, int y, const char *text)
|
||||||
unsigned int w = ((unsigned int*)file)[0];
|
unsigned int w = ((unsigned int*)file)[0];
|
||||||
unsigned int h = ((unsigned int*)file)[1];
|
unsigned int h = ((unsigned int*)file)[1];
|
||||||
if (8+w*h==fsize)
|
if (8+w*h==fsize)
|
||||||
p->defaulttextures.base = R_LoadReplacementTexture("gfx/menu/bigfont.lmp", NULL, IF_NOPCX|IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP, (qbyte*)file+8, w, h, TF_H2_TRANS8_0);
|
p->defaulttextures->base = R_LoadReplacementTexture("gfx/menu/bigfont.lmp", NULL, IF_NOPCX|IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP, (qbyte*)file+8, w, h, TF_H2_TRANS8_0);
|
||||||
FS_FreeFile(file); //got image data
|
FS_FreeFile(file); //got image data
|
||||||
}
|
}
|
||||||
if (!p->defaulttextures.base)
|
if (!p->defaulttextures->base)
|
||||||
p->defaulttextures.base = R_LoadHiResTexture("gfx/menu/bigfont.lmp", NULL, IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP);
|
p->defaulttextures->base = R_LoadHiResTexture("gfx/menu/bigfont.lmp", NULL, IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(*text)
|
while(*text)
|
||||||
|
|
|
@ -680,6 +680,7 @@ const char *presetexec[] =
|
||||||
"seta gl_polyblend 0;"
|
"seta gl_polyblend 0;"
|
||||||
"seta gl_flashblend 0;"
|
"seta gl_flashblend 0;"
|
||||||
"seta gl_specular 0;"
|
"seta gl_specular 0;"
|
||||||
|
"seta r_deluxemapping 0;"
|
||||||
"seta r_loadlit 0;"
|
"seta r_loadlit 0;"
|
||||||
"seta r_fastsky 1;"
|
"seta r_fastsky 1;"
|
||||||
"seta r_drawflame 0;"
|
"seta r_drawflame 0;"
|
||||||
|
@ -779,10 +780,12 @@ const char *presetexec[] =
|
||||||
"r_shadow_realtime_dlight 1;"
|
"r_shadow_realtime_dlight 1;"
|
||||||
// "gl_detail 1;"
|
// "gl_detail 1;"
|
||||||
"r_lightstylesmooth 1;"
|
"r_lightstylesmooth 1;"
|
||||||
|
"r_deluxemapping 1;"
|
||||||
"gl_texture_anisotropic_filtering 4;"
|
"gl_texture_anisotropic_filtering 4;"
|
||||||
|
|
||||||
, // realtime options
|
, // realtime options
|
||||||
"r_bloom 1;"
|
"r_bloom 1;"
|
||||||
|
"r_deluxemapping 0;" //won't be seen anyway
|
||||||
"r_particledesc \"high tsshaft\";"
|
"r_particledesc \"high tsshaft\";"
|
||||||
"r_waterstyle 3;"
|
"r_waterstyle 3;"
|
||||||
"r_glsl_offsetmapping 1;"
|
"r_glsl_offsetmapping 1;"
|
||||||
|
|
|
@ -87,7 +87,7 @@ static void M_Menu_LoadSave_Remove(menu_t *menu)
|
||||||
loadsavemenuinfo_t *info = menu->data;
|
loadsavemenuinfo_t *info = menu->data;
|
||||||
if (info->picshader)
|
if (info->picshader)
|
||||||
{
|
{
|
||||||
Image_UnloadTexture(info->picshader->defaulttextures.base);
|
Image_UnloadTexture(info->picshader->defaulttextures->base);
|
||||||
R_UnloadShader(info->picshader);
|
R_UnloadShader(info->picshader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,7 @@ static void M_Menu_LoadSave_Preview_Draw(int x, int y, menucustom_t *item, menu_
|
||||||
info->picslot = slot;
|
info->picslot = slot;
|
||||||
if (info->picshader)
|
if (info->picshader)
|
||||||
{
|
{
|
||||||
Image_UnloadTexture(info->picshader->defaulttextures.base);
|
Image_UnloadTexture(info->picshader->defaulttextures->base);
|
||||||
R_UnloadShader(info->picshader);
|
R_UnloadShader(info->picshader);
|
||||||
}
|
}
|
||||||
info->picshader = R_RegisterPic(va("saves/s%i/screeny.tga", slot));
|
info->picshader = R_RegisterPic(va("saves/s%i/screeny.tga", slot));
|
||||||
|
|
|
@ -355,6 +355,7 @@ typedef struct
|
||||||
} srect_t;
|
} srect_t;
|
||||||
|
|
||||||
typedef struct texnums_s {
|
typedef struct texnums_s {
|
||||||
|
char mapname[MAX_QPATH]; //the 'official' name of the diffusemap. used to generate filenames for other textures.
|
||||||
texid_t base; //regular diffuse texture. may have alpha if surface is transparent
|
texid_t base; //regular diffuse texture. may have alpha if surface is transparent
|
||||||
texid_t bump; //normalmap. height values packed in alpha.
|
texid_t bump; //normalmap. height values packed in alpha.
|
||||||
texid_t specular; //specular lighting values.
|
texid_t specular; //specular lighting values.
|
||||||
|
@ -362,6 +363,8 @@ typedef struct texnums_s {
|
||||||
texid_t loweroverlay; //diffuse texture for the lower body(trouser colour). no alpha channel. added to base.rgb
|
texid_t loweroverlay; //diffuse texture for the lower body(trouser colour). no alpha channel. added to base.rgb
|
||||||
texid_t paletted; //8bit paletted data, just because.
|
texid_t paletted; //8bit paletted data, just because.
|
||||||
texid_t fullbright;
|
texid_t fullbright;
|
||||||
|
texid_t reflectcube;
|
||||||
|
texid_t reflectmask;
|
||||||
} texnums_t;
|
} texnums_t;
|
||||||
|
|
||||||
//not all modes accept meshes - STENCIL(intentional) and DEPTHONLY(not implemented)
|
//not all modes accept meshes - STENCIL(intentional) and DEPTHONLY(not implemented)
|
||||||
|
@ -414,7 +417,7 @@ typedef struct rendererinfo_s {
|
||||||
/*Draws an entire mesh list from a VBO. vbo can be null, in which case the chain may be drawn without batching.
|
/*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*/
|
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, unsigned int be_flags);
|
void (*BE_DrawMesh_List)(shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags);
|
||||||
void (*BE_DrawMesh_Single)(shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags);
|
void (*BE_DrawMesh_Single)(shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, unsigned int be_flags);
|
||||||
void (*BE_SubmitBatch)(struct batch_s *batch);
|
void (*BE_SubmitBatch)(struct batch_s *batch);
|
||||||
struct batch_s *(*BE_GetTempBatch)(void);
|
struct batch_s *(*BE_GetTempBatch)(void);
|
||||||
//Asks the backend to invoke DrawMeshChain for each surface, and to upload lightmaps as required
|
//Asks the backend to invoke DrawMeshChain for each surface, and to upload lightmaps as required
|
||||||
|
|
|
@ -762,13 +762,21 @@ qboolean Master_ServerIsGreater(serverinfo_t *a, serverinfo_t *b)
|
||||||
case SLKEY_TOOMANY:
|
case SLKEY_TOOMANY:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// warning: enumeration value ‘SLKEY_*’ not handled in switch
|
case SLKEY_ISPROXY:
|
||||||
|
return Master_CompareInteger(a->special & SS_PROXY, b->special & SS_PROXY, SLIST_TEST_LESS);
|
||||||
|
case SLKEY_ISLOCAL:
|
||||||
|
return Master_CompareInteger(a->special & SS_LOCAL, b->special & SS_LOCAL, SLIST_TEST_LESS);
|
||||||
|
case SLKEY_ISFAVORITE:
|
||||||
|
return Master_CompareInteger(a->special & SS_FAVORITE, b->special & SS_FAVORITE, SLIST_TEST_LESS);
|
||||||
|
|
||||||
case SLKEY_MOD:
|
case SLKEY_MOD:
|
||||||
case SLKEY_PROTOCOL:
|
case SLKEY_PROTOCOL:
|
||||||
case SLKEY_NUMBOTS:
|
case SLKEY_NUMBOTS:
|
||||||
case SLKEY_NUMHUMANS:
|
case SLKEY_NUMHUMANS:
|
||||||
case SLKEY_QCSTATUS:
|
case SLKEY_QCSTATUS:
|
||||||
case SLKEY_ISFAVORITE:
|
case SLKEY_SERVERINFO:
|
||||||
|
case SLKEY_PLAYER0:
|
||||||
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3620,7 +3620,7 @@ static void PScript_EffectSpawned(part_type_t *ptype, vec3_t org, vec3_t axis[3]
|
||||||
{
|
{
|
||||||
vec3_t morg, mdir;
|
vec3_t morg, mdir;
|
||||||
PScript_ApplyOrgVel(morg, mdir, org, axis[0], i, count, ptype);
|
PScript_ApplyOrgVel(morg, mdir, org, axis[0], i, count, ptype);
|
||||||
CL_SpawnSpriteEffect(morg, mdir, (mod->rflags&RF_USEORIENTATION)?axis[0]:NULL, mod->model, mod->framestart, (mod->frameend?mod->frameend:(mod->model->numframes - mod->framestart)), mod->framerate?mod->framerate:10, mod->alpha?mod->alpha:1, ptype->rotationmin*180/M_PI, ptype->gravity, mod->traileffect, mod->rflags & ~RF_USEORIENTATION);
|
CL_SpawnSpriteEffect(morg, mdir, (mod->rflags&RF_USEORIENTATION)?axis[2]:NULL, mod->model, mod->framestart, (mod->frameend?mod->frameend:(mod->model->numframes - mod->framestart)), mod->framerate?mod->framerate:10, mod->alpha?mod->alpha:1, ptype->rotationmin*180/M_PI, ptype->gravity, mod->traileffect, mod->rflags & ~RF_USEORIENTATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5110,7 +5110,7 @@ static void GL_DrawTexturedParticle(int count, particle_t **plist, plooks_t *typ
|
||||||
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5168,7 +5168,7 @@ static void GL_DrawTexturedParticle(int count, particle_t **plist, plooks_t *typ
|
||||||
if (pscriptmesh.numvertexes)
|
if (pscriptmesh.numvertexes)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5186,7 +5186,7 @@ static void GL_DrawTrifanParticle(int count, particle_t **plist, plooks_t *type)
|
||||||
if (pscripttmesh.numvertexes >= BUFFERVERTS-3)
|
if (pscripttmesh.numvertexes >= BUFFERVERTS-3)
|
||||||
{
|
{
|
||||||
pscripttmesh.numindexes = pscripttmesh.numvertexes;
|
pscripttmesh.numindexes = pscripttmesh.numvertexes;
|
||||||
BE_DrawMesh_Single(type->shader, &pscripttmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscripttmesh, NULL, 0);
|
||||||
pscripttmesh.numvertexes = 0;
|
pscripttmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5222,7 +5222,7 @@ static void GL_DrawTrifanParticle(int count, particle_t **plist, plooks_t *type)
|
||||||
if (pscripttmesh.numvertexes)
|
if (pscripttmesh.numvertexes)
|
||||||
{
|
{
|
||||||
pscripttmesh.numindexes = pscripttmesh.numvertexes;
|
pscripttmesh.numindexes = pscripttmesh.numvertexes;
|
||||||
BE_DrawMesh_Single(type->shader, &pscripttmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscripttmesh, NULL, 0);
|
||||||
pscripttmesh.numvertexes = 0;
|
pscripttmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5402,7 +5402,7 @@ static void GL_DrawTexturedSparkParticle(int count, particle_t **plist, plooks_t
|
||||||
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5448,7 +5448,7 @@ static void GL_DrawTexturedSparkParticle(int count, particle_t **plist, plooks_t
|
||||||
if (pscriptmesh.numvertexes)
|
if (pscriptmesh.numvertexes)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5470,7 +5470,7 @@ static void GL_DrawParticleBeam(int count, beamseg_t **blist, plooks_t *type)
|
||||||
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
if (pscriptmesh.numvertexes >= BUFFERVERTS-4)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5514,7 +5514,7 @@ static void GL_DrawParticleBeam(int count, beamseg_t **blist, plooks_t *type)
|
||||||
if (pscriptmesh.numvertexes)
|
if (pscriptmesh.numvertexes)
|
||||||
{
|
{
|
||||||
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
pscriptmesh.numindexes = pscriptmesh.numvertexes/4*6;
|
||||||
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, &type->shader->defaulttextures, 0);
|
BE_DrawMesh_Single(type->shader, &pscriptmesh, NULL, 0);
|
||||||
pscriptmesh.numvertexes = 0;
|
pscriptmesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1281,7 +1281,7 @@ void QCBUILTIN PF_R_PolygonEnd(pubprogfuncs_t *prinst, struct globalvars_s *pr_g
|
||||||
cl_numstrisvert = csqc_poly_startvert;
|
cl_numstrisvert = csqc_poly_startvert;
|
||||||
cl_numstrisidx = csqc_poly_startidx;
|
cl_numstrisidx = csqc_poly_startidx;
|
||||||
|
|
||||||
BE_DrawMesh_Single(csqc_poly_shader, &mesh, NULL, &csqc_poly_shader->defaulttextures, 0);
|
BE_DrawMesh_Single(csqc_poly_shader, &mesh, NULL, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -781,7 +781,7 @@ void QCBUILTIN PF_CL_drawline (pubprogfuncs_t *prinst, struct globalvars_s *pr_g
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
|
|
||||||
BE_DrawMesh_Single(shader_draw_line, &mesh, NULL, &shader_draw_line->defaulttextures, flags|BEF_LINES);
|
BE_DrawMesh_Single(shader_draw_line, &mesh, NULL, flags|BEF_LINES);
|
||||||
}
|
}
|
||||||
|
|
||||||
//vector drawgetimagesize(string pic) = #460;
|
//vector drawgetimagesize(string pic) = #460;
|
||||||
|
|
|
@ -147,7 +147,7 @@ void R2D_Init(void)
|
||||||
int i;
|
int i;
|
||||||
unsigned int glossval;
|
unsigned int glossval;
|
||||||
unsigned int normval;
|
unsigned int normval;
|
||||||
extern cvar_t gl_specular_fallback, gl_specular_fallbackexp;
|
extern cvar_t gl_specular_fallback, gl_specular_fallbackexp, gl_texturemode;
|
||||||
conback = NULL;
|
conback = NULL;
|
||||||
|
|
||||||
Shader_Init();
|
Shader_Init();
|
||||||
|
@ -198,13 +198,13 @@ void R2D_Init(void)
|
||||||
"map $diffuse\n"
|
"map $diffuse\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
TEXDOWAIT(draw_backtile->defaulttextures.base);
|
TEXDOWAIT(draw_backtile->defaulttextures->base);
|
||||||
if (!TEXLOADED(draw_backtile->defaulttextures.base))
|
if (!TEXLOADED(draw_backtile->defaulttextures->base))
|
||||||
draw_backtile->defaulttextures.base = R_LoadHiResTexture("gfx/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
draw_backtile->defaulttextures->base = R_LoadHiResTexture("gfx/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
||||||
if (!TEXLOADED(draw_backtile->defaulttextures.base))
|
if (!TEXLOADED(draw_backtile->defaulttextures->base))
|
||||||
draw_backtile->defaulttextures.base = R_LoadHiResTexture("gfx/menu/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
draw_backtile->defaulttextures->base = R_LoadHiResTexture("gfx/menu/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
||||||
if (!TEXLOADED(draw_backtile->defaulttextures.base))
|
if (!TEXLOADED(draw_backtile->defaulttextures->base))
|
||||||
draw_backtile->defaulttextures.base = R_LoadHiResTexture("pics/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
draw_backtile->defaulttextures->base = R_LoadHiResTexture("pics/backtile", NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_NOWORKER);
|
||||||
|
|
||||||
shader_draw_fill = R_RegisterShader("fill_opaque", SUF_NONE,
|
shader_draw_fill = R_RegisterShader("fill_opaque", SUF_NONE,
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -340,6 +340,7 @@ void R2D_Init(void)
|
||||||
Cvar_ForceCallback(&gl_conback);
|
Cvar_ForceCallback(&gl_conback);
|
||||||
Cvar_ForceCallback(&vid_conautoscale);
|
Cvar_ForceCallback(&vid_conautoscale);
|
||||||
Cvar_ForceCallback(&gl_font);
|
Cvar_ForceCallback(&gl_font);
|
||||||
|
Cvar_ForceCallback(&gl_texturemode);
|
||||||
|
|
||||||
Cvar_ForceCallback(&crosshair);
|
Cvar_ForceCallback(&crosshair);
|
||||||
Cvar_ForceCallback(&crosshaircolor);
|
Cvar_ForceCallback(&crosshaircolor);
|
||||||
|
@ -349,6 +350,8 @@ void R2D_Init(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
R2D_Font_Changed();
|
R2D_Font_Changed();
|
||||||
|
|
||||||
|
R_NetgraphInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
mpic_t *R2D_SafeCachePic (const char *path)
|
mpic_t *R2D_SafeCachePic (const char *path)
|
||||||
|
@ -416,7 +419,7 @@ void R2D_Image(float x, float y, float w, float h, float s1, float t1, float s2,
|
||||||
{
|
{
|
||||||
if (pic->passes[i].texgen == T_GEN_SINGLEMAP && pic->passes[i].anim_frames[0] && pic->passes[i].anim_frames[0]->status == TEX_LOADING)
|
if (pic->passes[i].texgen == T_GEN_SINGLEMAP && pic->passes[i].anim_frames[0] && pic->passes[i].anim_frames[0]->status == TEX_LOADING)
|
||||||
return;
|
return;
|
||||||
if (pic->passes[i].texgen == T_GEN_DIFFUSE && pic->defaulttextures.base && pic->defaulttextures.base->status == TEX_LOADING)
|
if (pic->passes[i].texgen == T_GEN_DIFFUSE && pic->defaulttextures->base && pic->defaulttextures->base->status == TEX_LOADING)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,7 +443,7 @@ void R2D_Image(float x, float y, float w, float h, float s1, float t1, float s2,
|
||||||
draw_mesh_st[3][0] = s1;
|
draw_mesh_st[3][0] = s1;
|
||||||
draw_mesh_st[3][1] = t2;
|
draw_mesh_st[3][1] = t2;
|
||||||
|
|
||||||
BE_DrawMesh_Single(pic, &draw_mesh, NULL, &pic->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(pic, &draw_mesh, NULL, r2d_be_flags);
|
||||||
}
|
}
|
||||||
void R2D_Image2dQuad(vec2_t points[], vec2_t texcoords[], mpic_t *pic)
|
void R2D_Image2dQuad(vec2_t points[], vec2_t texcoords[], mpic_t *pic)
|
||||||
{
|
{
|
||||||
|
@ -453,7 +456,7 @@ void R2D_Image2dQuad(vec2_t points[], vec2_t texcoords[], mpic_t *pic)
|
||||||
{
|
{
|
||||||
if (pic->passes[i].texgen == T_GEN_SINGLEMAP && pic->passes[i].anim_frames[0] && pic->passes[i].anim_frames[0]->status == TEX_LOADING)
|
if (pic->passes[i].texgen == T_GEN_SINGLEMAP && pic->passes[i].anim_frames[0] && pic->passes[i].anim_frames[0]->status == TEX_LOADING)
|
||||||
return;
|
return;
|
||||||
if (pic->passes[i].texgen == T_GEN_DIFFUSE && pic->defaulttextures.base && pic->defaulttextures.base->status == TEX_LOADING)
|
if (pic->passes[i].texgen == T_GEN_DIFFUSE && pic->defaulttextures->base && pic->defaulttextures->base->status == TEX_LOADING)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,7 +466,7 @@ void R2D_Image2dQuad(vec2_t points[], vec2_t texcoords[], mpic_t *pic)
|
||||||
Vector2Copy(texcoords[i], draw_mesh_st[i]);
|
Vector2Copy(texcoords[i], draw_mesh_st[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
BE_DrawMesh_Single(pic, &draw_mesh, NULL, &pic->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(pic, &draw_mesh, NULL, r2d_be_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*draws a block of the current colour on the screen*/
|
/*draws a block of the current colour on the screen*/
|
||||||
|
@ -482,9 +485,9 @@ void R2D_FillBlock(float x, float y, float w, float h)
|
||||||
draw_mesh_xyz[3][1] = y+h;
|
draw_mesh_xyz[3][1] = y+h;
|
||||||
|
|
||||||
if (draw_mesh_colors[0][3] != 1)
|
if (draw_mesh_colors[0][3] != 1)
|
||||||
BE_DrawMesh_Single(shader_draw_fill_trans, &draw_mesh, NULL, &shader_draw_fill_trans->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(shader_draw_fill_trans, &draw_mesh, NULL, r2d_be_flags);
|
||||||
else
|
else
|
||||||
BE_DrawMesh_Single(shader_draw_fill, &draw_mesh, NULL, &shader_draw_fill->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(shader_draw_fill, &draw_mesh, NULL, r2d_be_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void R2D_Line(float x1, float y1, float x2, float y2, shader_t *shader)
|
void R2D_Line(float x1, float y1, float x2, float y2, shader_t *shader)
|
||||||
|
@ -505,7 +508,7 @@ void R2D_Line(float x1, float y1, float x2, float y2, shader_t *shader)
|
||||||
|
|
||||||
draw_mesh.numvertexes = 2;
|
draw_mesh.numvertexes = 2;
|
||||||
draw_mesh.numindexes = 2;
|
draw_mesh.numindexes = 2;
|
||||||
BE_DrawMesh_Single(shader, &draw_mesh, NULL, &shader->defaulttextures, BEF_LINES);
|
BE_DrawMesh_Single(shader, &draw_mesh, NULL, BEF_LINES);
|
||||||
draw_mesh.numvertexes = 4;
|
draw_mesh.numvertexes = 4;
|
||||||
draw_mesh.numindexes = 6;
|
draw_mesh.numindexes = 6;
|
||||||
}
|
}
|
||||||
|
@ -559,7 +562,7 @@ void R2D_TransPicTranslate (float x, float y, int width, int height, qbyte *pic,
|
||||||
"alphagen vertex\n"
|
"alphagen vertex\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
translate_shader->defaulttextures.base = translate_texture;
|
translate_shader->defaulttextures->base = translate_texture;
|
||||||
}
|
}
|
||||||
/* could avoid reuploading already translated textures but this func really isn't used enough anyway */
|
/* could avoid reuploading already translated textures but this func really isn't used enough anyway */
|
||||||
Image_Upload(translate_texture, TF_RGBA32, trans, NULL, 64, 64, IF_UIPIC|IF_NOMIPMAP|IF_NOGAMMA);
|
Image_Upload(translate_texture, TF_RGBA32, trans, NULL, 64, 64, IF_UIPIC|IF_NOMIPMAP|IF_NOGAMMA);
|
||||||
|
@ -662,7 +665,7 @@ void R2D_TileClear (float x, float y, float w, float h)
|
||||||
draw_mesh_st[3][0] = newsl;
|
draw_mesh_st[3][0] = newsl;
|
||||||
draw_mesh_st[3][1] = newth;
|
draw_mesh_st[3][1] = newth;
|
||||||
|
|
||||||
BE_DrawMesh_Single(draw_backtile, &draw_mesh, NULL, &draw_backtile->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(draw_backtile, &draw_mesh, NULL, r2d_be_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QDECL R2D_Conback_Callback(struct cvar_s *var, char *oldvalue)
|
void QDECL R2D_Conback_Callback(struct cvar_s *var, char *oldvalue)
|
||||||
|
@ -1249,8 +1252,8 @@ void R2D_Crosshair_Update(void)
|
||||||
return;
|
return;
|
||||||
else if (crosshairimage.string[0] && c == 1)
|
else if (crosshairimage.string[0] && c == 1)
|
||||||
{
|
{
|
||||||
shader_crosshair->defaulttextures.base = R_LoadHiResTexture (crosshairimage.string, "crosshairs", IF_UIPIC|IF_NOMIPMAP|IF_NOGAMMA);
|
shader_crosshair->defaulttextures->base = R_LoadHiResTexture (crosshairimage.string, "crosshairs", IF_UIPIC|IF_NOMIPMAP|IF_NOGAMMA);
|
||||||
if (TEXVALID(shader_crosshair->defaulttextures.base))
|
if (TEXVALID(shader_crosshair->defaulttextures->base))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (c <= 1)
|
else if (c <= 1)
|
||||||
|
@ -1261,7 +1264,7 @@ void R2D_Crosshair_Update(void)
|
||||||
|
|
||||||
if (!TEXVALID(ch_int_texture))
|
if (!TEXVALID(ch_int_texture))
|
||||||
ch_int_texture = Image_CreateTexture("***crosshair***", NULL, IF_UIPIC|IF_NOMIPMAP);
|
ch_int_texture = Image_CreateTexture("***crosshair***", NULL, IF_UIPIC|IF_NOMIPMAP);
|
||||||
shader_crosshair->defaulttextures.base = ch_int_texture;
|
shader_crosshair->defaulttextures->base = ch_int_texture;
|
||||||
|
|
||||||
Q_memset(crossdata, 0, sizeof(crossdata));
|
Q_memset(crossdata, 0, sizeof(crossdata));
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ static void R_Clutter_Insert_Soup(clutter_build_ctx_t *ctx, shader_t *shader, ve
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
shader->defaulttextures = os->defaulttextures;
|
*shader->defaulttextures = *os->defaulttextures;
|
||||||
|
|
||||||
|
|
||||||
for (i = 0, soup = ctx->soups; i < ctx->numsoups; i++, soup++)
|
for (i = 0, soup = ctx->soups; i < ctx->numsoups; i++, soup++)
|
||||||
|
|
|
@ -3263,6 +3263,118 @@ char *particle_set_q2part =
|
||||||
"scalefactor 0.8\n"
|
"scalefactor 0.8\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
|
|
||||||
|
"r_part te_splashsparks\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xe0\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part teq2_sparks\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 6\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xe0\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part te_splashbluewater\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xb0\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part te_splashbrownwater\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0x50\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part te_splashslime\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xd0\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part te_splashlava\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xe0\n"
|
||||||
|
"}\n"
|
||||||
|
"r_part te_splashblood\n"
|
||||||
|
"{\n"
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"count 1\n"
|
||||||
|
"scale 1\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"die 0.3 0.8\n"
|
||||||
|
"randomvel 20\n"
|
||||||
|
"orgadd 0 31\n"
|
||||||
|
"spawnorg 4\n"
|
||||||
|
"gravity 40\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"colorindex 0xe8\n"
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
|
||||||
|
//teq2_shield_sparks
|
||||||
|
//teq2_screen_sparks
|
||||||
|
//teq2_laser_sparks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"r_part q2_smoke\n"
|
"r_part q2_smoke\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -3374,6 +3486,22 @@ char *particle_set_q2part =
|
||||||
"colorindex 0xe0\n"
|
"colorindex 0xe0\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
|
|
||||||
|
|
||||||
|
"r_part teq2_bubbletrail\n"
|
||||||
|
"{\n"
|
||||||
|
/*blue spiral*/
|
||||||
|
"texture \"classicparticle\"\n"
|
||||||
|
"tcoords 0 0 16 16 32\n"
|
||||||
|
"scale 0.5\n"
|
||||||
|
"alpha 1\n"
|
||||||
|
"scalefactor 0.8\n"
|
||||||
|
"step 32\n"
|
||||||
|
"spawnorg 2\n"
|
||||||
|
"spawnvel 5\n"
|
||||||
|
"die 1 1.2\n"
|
||||||
|
"colorindex 4 7\n"
|
||||||
|
"}\n"
|
||||||
|
|
||||||
"r_part TR_RAILTRAIL\n"
|
"r_part TR_RAILTRAIL\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
/*blue spiral*/
|
/*blue spiral*/
|
||||||
|
|
|
@ -281,7 +281,7 @@ void R_LightArraysByte_BGR(const entity_t *entity, vecV_t *coords, byte_vec4_t *
|
||||||
void R_LightArrays(const entity_t *entity, vecV_t *coords, vec4_t *colours, int vertcount, vec3_t *normals, float scale);
|
void R_LightArrays(const entity_t *entity, vecV_t *coords, vec4_t *colours, int vertcount, vec3_t *normals, float scale);
|
||||||
|
|
||||||
void R_DrawSkyChain (struct batch_s *batch); /*called from the backend, and calls back into it*/
|
void R_DrawSkyChain (struct batch_s *batch); /*called from the backend, and calls back into it*/
|
||||||
void R_InitSky (struct texnums_s *tn, const char *skyname, qbyte *src, unsigned int width, unsigned int height); /*generate q1 sky texnums*/
|
void R_InitSky (shader_t *shader, const char *skyname, qbyte *src, unsigned int width, unsigned int height); /*generate q1 sky texnums*/
|
||||||
|
|
||||||
void R_Clutter_Emit(struct batch_s **batches);
|
void R_Clutter_Emit(struct batch_s **batches);
|
||||||
void R_Clutter_Purge(void);
|
void R_Clutter_Purge(void);
|
||||||
|
@ -335,7 +335,6 @@ void R_SetSky(char *skyname); /*override all sky shaders*/
|
||||||
|
|
||||||
#if defined(GLQUAKE)
|
#if defined(GLQUAKE)
|
||||||
void GLR_Init (void);
|
void GLR_Init (void);
|
||||||
void GLR_ReInit (void);
|
|
||||||
void GLR_InitTextures (void);
|
void GLR_InitTextures (void);
|
||||||
void GLR_InitEfrags (void);
|
void GLR_InitEfrags (void);
|
||||||
void GLR_RenderView (void); // must set r_refdef first
|
void GLR_RenderView (void); // must set r_refdef first
|
||||||
|
@ -444,6 +443,15 @@ void *Mod_Extradata (struct model_s *mod); // handles caching
|
||||||
void Mod_TouchModel (const char *name);
|
void Mod_TouchModel (const char *name);
|
||||||
void Mod_RebuildLightmaps (void);
|
void Mod_RebuildLightmaps (void);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int *offsets;
|
||||||
|
unsigned short *extents;
|
||||||
|
unsigned char *styles;
|
||||||
|
unsigned char *shifts;
|
||||||
|
} lightmapoverrides_t;
|
||||||
|
void Mod_LoadLighting (struct model_s *loadmodel, qbyte *mod_base, lump_t *l, qboolean interleaveddeluxe, lightmapoverrides_t *overrides);
|
||||||
|
|
||||||
struct mleaf_s *Mod_PointInLeaf (struct model_s *model, float *p);
|
struct mleaf_s *Mod_PointInLeaf (struct model_s *model, float *p);
|
||||||
|
|
||||||
void Mod_Think (void);
|
void Mod_Think (void);
|
||||||
|
|
|
@ -60,6 +60,7 @@ static cvar_t gl_driver = CVARF ("gl_driver", "",
|
||||||
CVAR_ARCHIVE | CVAR_RENDERERLATCH);
|
CVAR_ARCHIVE | CVAR_RENDERERLATCH);
|
||||||
cvar_t gl_shadeq1_name = CVARD ("gl_shadeq1_name", "*", "Rename all surfaces from quake1 bsps using this pattern for the purposes of shader names.");
|
cvar_t gl_shadeq1_name = CVARD ("gl_shadeq1_name", "*", "Rename all surfaces from quake1 bsps using this pattern for the purposes of shader names.");
|
||||||
extern cvar_t r_vertexlight;
|
extern cvar_t r_vertexlight;
|
||||||
|
extern cvar_t r_forceprogramify;
|
||||||
|
|
||||||
cvar_t mod_md3flags = CVAR ("mod_md3flags", "1");
|
cvar_t mod_md3flags = CVAR ("mod_md3flags", "1");
|
||||||
|
|
||||||
|
@ -490,6 +491,7 @@ void GLRenderer_Init(void)
|
||||||
// Cvar_Register (&gl_schematics, GLRENDEREROPTIONS);
|
// Cvar_Register (&gl_schematics, GLRENDEREROPTIONS);
|
||||||
|
|
||||||
Cvar_Register (&r_vertexlight, GLRENDEREROPTIONS);
|
Cvar_Register (&r_vertexlight, GLRENDEREROPTIONS);
|
||||||
|
Cvar_Register (&r_forceprogramify, GLRENDEREROPTIONS);
|
||||||
|
|
||||||
Cvar_Register (&gl_blend2d, GLRENDEREROPTIONS);
|
Cvar_Register (&gl_blend2d, GLRENDEREROPTIONS);
|
||||||
|
|
||||||
|
@ -1057,6 +1059,7 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr)
|
||||||
TRACE(("dbg: R_ApplyRenderer: old renderer closed\n"));
|
TRACE(("dbg: R_ApplyRenderer: old renderer closed\n"));
|
||||||
|
|
||||||
pmove.numphysent = 0;
|
pmove.numphysent = 0;
|
||||||
|
pmove.physents[0].model = NULL;
|
||||||
|
|
||||||
if (qrenderer != QR_NONE) //graphics stuff only when not dedicated
|
if (qrenderer != QR_NONE) //graphics stuff only when not dedicated
|
||||||
{
|
{
|
||||||
|
@ -1068,6 +1071,8 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr)
|
||||||
if (newr)
|
if (newr)
|
||||||
Con_TPrintf("Setting mode %i*%i*%i*%i %s\n", newr->width, newr->height, newr->bpp, newr->rate, newr->renderer->description);
|
Con_TPrintf("Setting mode %i*%i*%i*%i %s\n", newr->width, newr->height, newr->bpp, newr->rate, newr->renderer->description);
|
||||||
|
|
||||||
|
vid.fullbright=0;
|
||||||
|
|
||||||
if (host_basepal)
|
if (host_basepal)
|
||||||
BZ_Free(host_basepal);
|
BZ_Free(host_basepal);
|
||||||
host_basepal = (qbyte *)FS_LoadMallocFile ("gfx/palette.lmp", &sz);
|
host_basepal = (qbyte *)FS_LoadMallocFile ("gfx/palette.lmp", &sz);
|
||||||
|
@ -1093,11 +1098,7 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr)
|
||||||
|
|
||||||
{
|
{
|
||||||
qbyte *colormap = (qbyte *)FS_LoadMallocFile ("gfx/colormap.lmp", NULL);
|
qbyte *colormap = (qbyte *)FS_LoadMallocFile ("gfx/colormap.lmp", NULL);
|
||||||
if (!colormap)
|
if (colormap)
|
||||||
{
|
|
||||||
vid.fullbright=0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
j = VID_GRADES-1;
|
j = VID_GRADES-1;
|
||||||
data = colormap + j*256;
|
data = colormap + j*256;
|
||||||
|
|
|
@ -236,7 +236,7 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject o
|
||||||
Sys_Printf("Starting up (apk=%s, usr=%s)\n", args[2], parms.basedir);
|
Sys_Printf("Starting up (apk=%s, usr=%s)\n", args[2], parms.basedir);
|
||||||
|
|
||||||
COM_InitArgv(parms.argc, parms.argv);
|
COM_InitArgv(parms.argc, parms.argv);
|
||||||
TL_InitLanguages();
|
TL_InitLanguages(sys_basedir);
|
||||||
#ifdef SERVERONLY
|
#ifdef SERVERONLY
|
||||||
SV_Init(&parms);
|
SV_Init(&parms);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -754,7 +754,6 @@ int main (int c, const char **v)
|
||||||
parms.argc = c;
|
parms.argc = c;
|
||||||
parms.argv = v;
|
parms.argv = v;
|
||||||
COM_InitArgv(parms.argc, parms.argv);
|
COM_InitArgv(parms.argc, parms.argv);
|
||||||
TL_InitLanguages();
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (!COM_CheckParm("-nodumpstack"))
|
if (!COM_CheckParm("-nodumpstack"))
|
||||||
|
@ -789,6 +788,7 @@ int main (int c, const char **v)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
TL_InitLanguages(parms.binarydir);
|
||||||
|
|
||||||
isPlugin = !!COM_CheckParm("-plugin");
|
isPlugin = !!COM_CheckParm("-plugin");
|
||||||
if (isPlugin)
|
if (isPlugin)
|
||||||
|
|
|
@ -343,7 +343,7 @@ int main(int argc, char **argv)
|
||||||
memset(&parms, 0, sizeof(parms));
|
memset(&parms, 0, sizeof(parms));
|
||||||
|
|
||||||
COM_InitArgv(argc, argv);
|
COM_InitArgv(argc, argv);
|
||||||
TL_InitLanguages();
|
TL_InitLanguages("");
|
||||||
|
|
||||||
parms.basedir = "";
|
parms.basedir = "";
|
||||||
parms.argc = argc;
|
parms.argc = argc;
|
||||||
|
|
|
@ -475,7 +475,7 @@ int QDECL main(int argc, char **argv)
|
||||||
|
|
||||||
COM_InitArgv (parms.argc, parms.argv);
|
COM_InitArgv (parms.argc, parms.argv);
|
||||||
|
|
||||||
TL_InitLanguages();
|
TL_InitLanguages(parms.basedir);
|
||||||
|
|
||||||
Sys_Printf ("Host_Init\n");
|
Sys_Printf ("Host_Init\n");
|
||||||
Host_Init (&parms);
|
Host_Init (&parms);
|
||||||
|
|
|
@ -4011,7 +4011,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
|
||||||
Q_snprintfz(sys_language, sizeof(sys_language), "%s", lang);
|
Q_snprintfz(sys_language, sizeof(sys_language), "%s", lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
TL_InitLanguages();
|
TL_InitLanguages(parms.binarydir);
|
||||||
//tprints are now allowed
|
//tprints are now allowed
|
||||||
|
|
||||||
if (*cwd && cwd[strlen(cwd)-1] != '\\' && cwd[strlen(cwd)-1] != '/')
|
if (*cwd && cwd[strlen(cwd)-1] != '\\' && cwd[strlen(cwd)-1] != '/')
|
||||||
|
|
|
@ -148,7 +148,7 @@ static void Headless_BE_SelectMode (backendmode_t mode)
|
||||||
static void Headless_BE_DrawMesh_List (shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags)
|
static void Headless_BE_DrawMesh_List (shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
static void Headless_BE_DrawMesh_Single (shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags)
|
static void Headless_BE_DrawMesh_Single (shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, unsigned int be_flags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
static void Headless_BE_SubmitBatch (struct batch_s *batch)
|
static void Headless_BE_SubmitBatch (struct batch_s *batch)
|
||||||
|
|
|
@ -575,7 +575,7 @@ int version_number(void);
|
||||||
char *version_string(void);
|
char *version_string(void);
|
||||||
|
|
||||||
|
|
||||||
void TL_InitLanguages(void);
|
void TL_InitLanguages(char *langpath); //langpath is where the .po files can be found
|
||||||
void TL_Shutdown(void);
|
void TL_Shutdown(void);
|
||||||
void T_FreeStrings(void);
|
void T_FreeStrings(void);
|
||||||
char *T_GetString(int num);
|
char *T_GetString(int num);
|
||||||
|
|
|
@ -4191,6 +4191,25 @@ ftemanifest_t *FS_ReadDefaultManifest(char *newbasedir, size_t newbasedirsize, q
|
||||||
return man;
|
return man;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qboolean FS_FixPath(char *path, size_t pathsize)
|
||||||
|
{
|
||||||
|
size_t len = strlen(path);
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
if (path[len-1] == '/')
|
||||||
|
return true;
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (path[len-1] == '\\')
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
if (len >= pathsize-1)
|
||||||
|
return false;
|
||||||
|
path[len] = '/';
|
||||||
|
path[len+1] = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//this is potentially unsafe. needs lots of testing.
|
//this is potentially unsafe. needs lots of testing.
|
||||||
qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean allowbasedirchange)
|
qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean allowbasedirchange)
|
||||||
{
|
{
|
||||||
|
@ -4308,7 +4327,7 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean
|
||||||
|
|
||||||
builtingame = true;
|
builtingame = true;
|
||||||
if (!fixedbasedir && !FS_DirHasGame(newbasedir, i))
|
if (!fixedbasedir && !FS_DirHasGame(newbasedir, i))
|
||||||
if (Sys_FindGameData(man->formalname, man->installation, realpath, sizeof(realpath), !man->doinstall) && FS_DirHasGame(realpath, i))
|
if (Sys_FindGameData(man->formalname, man->installation, realpath, sizeof(realpath), !man->doinstall) && FS_FixPath(realpath, sizeof(realpath)) && FS_DirHasGame(realpath, i))
|
||||||
Q_strncpyz (newbasedir, realpath, sizeof(newbasedir));
|
Q_strncpyz (newbasedir, realpath, sizeof(newbasedir));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4319,7 +4338,7 @@ qboolean FS_ChangeGame(ftemanifest_t *man, qboolean allowreloadconfigs, qboolean
|
||||||
{
|
{
|
||||||
if (!builtingame && !fixedbasedir && !FS_DirHasAPackage(newbasedir, man))
|
if (!builtingame && !fixedbasedir && !FS_DirHasAPackage(newbasedir, man))
|
||||||
{
|
{
|
||||||
if (Sys_FindGameData(man->formalname, man->installation, realpath, sizeof(realpath), !man->doinstall) && FS_DirHasAPackage(realpath, man))
|
if (Sys_FindGameData(man->formalname, man->installation, realpath, sizeof(realpath), !man->doinstall) && FS_FixPath(realpath, sizeof(realpath)) && FS_DirHasAPackage(realpath, man))
|
||||||
Q_strncpyz (newbasedir, realpath, sizeof(newbasedir));
|
Q_strncpyz (newbasedir, realpath, sizeof(newbasedir));
|
||||||
#ifndef SERVERONLY
|
#ifndef SERVERONLY
|
||||||
else
|
else
|
||||||
|
|
|
@ -56,7 +56,6 @@ qboolean Mod_LoadVertexNormals (model_t *loadmodel, qbyte *mod_base, lump_t *l);
|
||||||
qboolean Mod_LoadEdges (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm);
|
qboolean Mod_LoadEdges (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm);
|
||||||
qboolean Mod_LoadMarksurfaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm);
|
qboolean Mod_LoadMarksurfaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm);
|
||||||
qboolean Mod_LoadSurfedges (model_t *loadmodel, qbyte *mod_base, lump_t *l);
|
qboolean Mod_LoadSurfedges (model_t *loadmodel, qbyte *mod_base, lump_t *l);
|
||||||
void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean interleaveddeluxe);
|
|
||||||
|
|
||||||
|
|
||||||
static qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean capsule, unsigned int contents, trace_t *trace);
|
static qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t axis[3], vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, qboolean capsule, unsigned int contents, trace_t *trace);
|
||||||
|
@ -3870,7 +3869,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
|
||||||
char loadname[32];
|
char loadname[32];
|
||||||
qbyte *mod_base = (qbyte *)filein;
|
qbyte *mod_base = (qbyte *)filein;
|
||||||
|
|
||||||
void (*buildmeshes)(model_t *mod, msurface_t *surf, void *cookie) = NULL;
|
void (*buildmeshes)(model_t *mod, msurface_t *surf, builddata_t *cookie) = NULL;
|
||||||
qbyte *facedata = NULL;
|
qbyte *facedata = NULL;
|
||||||
unsigned int facesize = 0;
|
unsigned int facesize = 0;
|
||||||
cminfo_t *prv;
|
cminfo_t *prv;
|
||||||
|
@ -4188,7 +4187,7 @@ static cmodel_t *CM_LoadMap (model_t *mod, qbyte *filein, size_t filelen, qboole
|
||||||
noerrors = noerrors && Mod_LoadEdges (mod, mod_base, &header.lumps[Q2LUMP_EDGES], false);
|
noerrors = noerrors && Mod_LoadEdges (mod, mod_base, &header.lumps[Q2LUMP_EDGES], false);
|
||||||
noerrors = noerrors && Mod_LoadSurfedges (mod, mod_base, &header.lumps[Q2LUMP_SURFEDGES]);
|
noerrors = noerrors && Mod_LoadSurfedges (mod, mod_base, &header.lumps[Q2LUMP_SURFEDGES]);
|
||||||
if (noerrors)
|
if (noerrors)
|
||||||
Mod_LoadLighting (mod, mod_base, &header.lumps[Q2LUMP_LIGHTING], header.version == BSPVERSION_Q2W);
|
Mod_LoadLighting (mod, mod_base, &header.lumps[Q2LUMP_LIGHTING], header.version == BSPVERSION_Q2W, NULL);
|
||||||
noerrors = noerrors && CModQ2_LoadSurfaces (mod, mod_base, &header.lumps[Q2LUMP_TEXINFO]);
|
noerrors = noerrors && CModQ2_LoadSurfaces (mod, mod_base, &header.lumps[Q2LUMP_TEXINFO]);
|
||||||
noerrors = noerrors && CModQ2_LoadPlanes (mod, mod_base, &header.lumps[Q2LUMP_PLANES]);
|
noerrors = noerrors && CModQ2_LoadPlanes (mod, mod_base, &header.lumps[Q2LUMP_PLANES]);
|
||||||
noerrors = noerrors && CModQ2_LoadTexInfo (mod, mod_base, &header.lumps[Q2LUMP_TEXINFO], loadname);
|
noerrors = noerrors && CModQ2_LoadTexInfo (mod, mod_base, &header.lumps[Q2LUMP_TEXINFO], loadname);
|
||||||
|
|
|
@ -400,7 +400,7 @@ int PM_StepSlideMove (qboolean in_air)
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME gravitydir
|
//FIXME gravitydir
|
||||||
if (in_air && originalvel[2] < 0)
|
if ((in_air || movevars.slidefix) && originalvel[2] < 0)
|
||||||
VectorMA(pmove.velocity, -DotProduct(pmove.velocity, pmove.gravitydir), pmove.gravitydir, pmove.velocity); //z=0
|
VectorMA(pmove.velocity, -DotProduct(pmove.velocity, pmove.gravitydir), pmove.gravitydir, pmove.velocity); //z=0
|
||||||
|
|
||||||
PM_SlideMove ();
|
PM_SlideMove ();
|
||||||
|
@ -770,7 +770,11 @@ void PM_AirMove (void)
|
||||||
{
|
{
|
||||||
if (movevars.slidefix)
|
if (movevars.slidefix)
|
||||||
{
|
{
|
||||||
pmove.velocity[2] = min(pmove.velocity[2], 0); // bound above by 0
|
if (DotProduct(pmove.velocity, pmove.gravitydir) < 0)
|
||||||
|
{
|
||||||
|
VectorMA(pmove.velocity, -DotProduct(pmove.velocity, pmove.gravitydir), pmove.gravitydir, pmove.velocity); //z=0
|
||||||
|
//pmove.velocity[2] = min(pmove.velocity[2], 0); // bound above by 0
|
||||||
|
}
|
||||||
PM_Accelerate (wishdir, wishspeed, movevars.accelerate);
|
PM_Accelerate (wishdir, wishspeed, movevars.accelerate);
|
||||||
// add gravity
|
// add gravity
|
||||||
VectorMA(pmove.velocity, movevars.entgravity * movevars.gravity * frametime, pmove.gravitydir, pmove.velocity);
|
VectorMA(pmove.velocity, movevars.entgravity * movevars.gravity * frametime, pmove.gravitydir, pmove.velocity);
|
||||||
|
@ -938,6 +942,8 @@ void PM_CategorizePosition (void)
|
||||||
//bsp objects marked as ladders mark regions to stand in to be classed as on a ladder.
|
//bsp objects marked as ladders mark regions to stand in to be classed as on a ladder.
|
||||||
cont = PM_ExtraBoxContents(pmove.origin);
|
cont = PM_ExtraBoxContents(pmove.origin);
|
||||||
|
|
||||||
|
if (pmove.physents[0].model)
|
||||||
|
{
|
||||||
#ifdef Q3BSPS
|
#ifdef Q3BSPS
|
||||||
//q3 has surfaceflag-based ladders
|
//q3 has surfaceflag-based ladders
|
||||||
if (pmove.physents[0].model->fromgame == fg_quake3)
|
if (pmove.physents[0].model->fromgame == fg_quake3)
|
||||||
|
@ -981,6 +987,7 @@ void PM_CategorizePosition (void)
|
||||||
pmove.onground = false; // too steep
|
pmove.onground = false; // too steep
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pmove.onground && pmove.pm_type != PM_FLY && pmove.waterlevel < 2)
|
if (pmove.onground && pmove.pm_type != PM_FLY && pmove.waterlevel < 2)
|
||||||
{
|
{
|
||||||
|
@ -1127,7 +1134,7 @@ void PM_NudgePosition (void)
|
||||||
base[i] = ((int)(base[i]*8)) * 0.125;
|
base[i] = ((int)(base[i]*8)) * 0.125;
|
||||||
|
|
||||||
//if we're moving, allow that spot without snapping to any grid
|
//if we're moving, allow that spot without snapping to any grid
|
||||||
if (pmove.velocity[0] || pmove.velocity[1] || pmove.velocity[2])
|
// if (pmove.velocity[0] || pmove.velocity[1] || pmove.velocity[2])
|
||||||
if (PM_TestPlayerPosition (pmove.origin, false))
|
if (PM_TestPlayerPosition (pmove.origin, false))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1266,8 +1273,8 @@ were contacted during the move.
|
||||||
*/
|
*/
|
||||||
void PM_PlayerMove (float gamespeed)
|
void PM_PlayerMove (float gamespeed)
|
||||||
{
|
{
|
||||||
// int i;
|
int i;
|
||||||
// int tmp; //for rounding
|
int tmp; //for rounding
|
||||||
|
|
||||||
frametime = pmove.cmd.msec * 0.001*gamespeed;
|
frametime = pmove.cmd.msec * 0.001*gamespeed;
|
||||||
pmove.numtouch = 0;
|
pmove.numtouch = 0;
|
||||||
|
@ -1330,6 +1337,16 @@ void PM_PlayerMove (float gamespeed)
|
||||||
else
|
else
|
||||||
PM_AirMove ();
|
PM_AirMove ();
|
||||||
|
|
||||||
|
//round to network precision
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
tmp = floor(pmove.velocity[i]*8 + 0.5);
|
||||||
|
pmove.velocity[i] = tmp/8.0;
|
||||||
|
tmp = floor(pmove.origin[i]*8 + 0.5);
|
||||||
|
pmove.origin[i] = tmp/8.0;
|
||||||
|
}
|
||||||
|
PM_NudgePosition ();
|
||||||
|
|
||||||
// set onground, watertype, and waterlevel for final spot
|
// set onground, watertype, and waterlevel for final spot
|
||||||
PM_CategorizePosition ();
|
PM_CategorizePosition ();
|
||||||
|
|
||||||
|
@ -1340,15 +1357,4 @@ void PM_PlayerMove (float gamespeed)
|
||||||
{
|
{
|
||||||
PM_ClipVelocity (pmove.velocity, groundplane.normal, pmove.velocity, 1);
|
PM_ClipVelocity (pmove.velocity, groundplane.normal, pmove.velocity, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
//round to network precision
|
|
||||||
for (i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
tmp = floor(pmove.velocity[i]*8 + 0.5);
|
|
||||||
pmove.velocity[i] = tmp/8.0;
|
|
||||||
tmp = floor(pmove.origin[i]*8 + 0.5);
|
|
||||||
pmove.origin[i] = tmp/8.0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4869,7 +4869,7 @@ void QCBUILTIN PF_localcmd (pubprogfuncs_t *prinst, struct globalvars_s *pr_glob
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
str = PF_VarString(prinst, 0, pr_globals);
|
str = PF_VarString(prinst, 0, pr_globals);
|
||||||
if (developer.ival)
|
if (developer.ival >= 2)
|
||||||
{
|
{
|
||||||
PR_StackTrace(prinst, false);
|
PR_StackTrace(prinst, false);
|
||||||
Con_Printf("localcmd: %s\n", str);
|
Con_Printf("localcmd: %s\n", str);
|
||||||
|
|
|
@ -1162,7 +1162,6 @@ struct fragmentdecal_s
|
||||||
void (*callback)(void *ctx, vec3_t *fte_restrict points, size_t numpoints, shader_t *shader);
|
void (*callback)(void *ctx, vec3_t *fte_restrict points, size_t numpoints, shader_t *shader);
|
||||||
void *ctx;
|
void *ctx;
|
||||||
};
|
};
|
||||||
typedef struct fragmentdecal_s fragmentdecal_t;
|
|
||||||
|
|
||||||
//#define SHOWCLIPS
|
//#define SHOWCLIPS
|
||||||
//#define FRAGMENTASTRIANGLES //works, but produces more fragments.
|
//#define FRAGMENTASTRIANGLES //works, but produces more fragments.
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
|
|
||||||
char sys_language[64] = "";
|
char sys_language[64] = "";
|
||||||
|
static char langpath[MAX_OSPATH] = "";
|
||||||
struct language_s languages[MAX_LANGUAGES];
|
struct language_s languages[MAX_LANGUAGES];
|
||||||
|
|
||||||
static void QDECL TL_LanguageChanged(struct cvar_s *var, char *oldvalue)
|
static void QDECL TL_LanguageChanged(struct cvar_s *var, char *oldvalue)
|
||||||
|
@ -62,7 +63,7 @@ static int TL_LoadLanguage(char *lang)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (*lang)
|
if (*lang)
|
||||||
f = FS_OpenVFS(va("fteqw.%s.po", lang), "rb", FS_BINARYPATH);
|
f = FS_OpenVFS(va("%sfteqw.%s.po", langpath, lang), "rb", FS_SYSTEM);
|
||||||
else
|
else
|
||||||
f = NULL;
|
f = NULL;
|
||||||
if (!f && *lang)
|
if (!f && *lang)
|
||||||
|
@ -88,11 +89,13 @@ int TL_FindLanguage(const char *lang)
|
||||||
}
|
}
|
||||||
|
|
||||||
//need to set up default languages for any early prints before cvars are inited.
|
//need to set up default languages for any early prints before cvars are inited.
|
||||||
void TL_InitLanguages(void)
|
void TL_InitLanguages(char *newlangpath)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *lang;
|
char *lang;
|
||||||
|
|
||||||
|
Q_strncpyz(langpath, newlangpath, sizeof(langpath));
|
||||||
|
|
||||||
//lang can override any environment or system settings.
|
//lang can override any environment or system settings.
|
||||||
if ((i = COM_CheckParm("-lang")))
|
if ((i = COM_CheckParm("-lang")))
|
||||||
Q_strncpyz(sys_language, com_argv[i+1], sizeof(sys_language));
|
Q_strncpyz(sys_language, com_argv[i+1], sizeof(sys_language));
|
||||||
|
|
|
@ -916,13 +916,13 @@ static void SelectPassTexture(unsigned int tu, const shaderpass_t *pass)
|
||||||
BindTexture(tu, shaderstate.curtexnums->base);
|
BindTexture(tu, shaderstate.curtexnums->base);
|
||||||
break;
|
break;
|
||||||
case T_GEN_NORMALMAP:
|
case T_GEN_NORMALMAP:
|
||||||
if (TEXVALID(shaderstate.curtexnums->bump))
|
if (TEXLOADED(shaderstate.curtexnums->bump))
|
||||||
BindTexture(tu, shaderstate.curtexnums->bump);
|
BindTexture(tu, shaderstate.curtexnums->bump);
|
||||||
else
|
else
|
||||||
BindTexture(tu, missing_texture_normal);
|
BindTexture(tu, missing_texture_normal);
|
||||||
break;
|
break;
|
||||||
case T_GEN_SPECULAR:
|
case T_GEN_SPECULAR:
|
||||||
if (TEXVALID(shaderstate.curtexnums->specular))
|
if (TEXLOADED(shaderstate.curtexnums->specular))
|
||||||
BindTexture(tu, shaderstate.curtexnums->specular);
|
BindTexture(tu, shaderstate.curtexnums->specular);
|
||||||
else
|
else
|
||||||
BindTexture(tu, missing_texture_gloss);
|
BindTexture(tu, missing_texture_gloss);
|
||||||
|
@ -1771,11 +1771,11 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert
|
||||||
|
|
||||||
for (i = 0; i < lastpass; i++)
|
for (i = 0; i < lastpass; i++)
|
||||||
{
|
{
|
||||||
if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay))
|
if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXLOADED(shaderstate.curtexnums->upperoverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay))
|
if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXLOADED(shaderstate.curtexnums->loweroverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[i].texgen == T_GEN_FULLBRIGHT && !TEXVALID(shaderstate.curtexnums->fullbright))
|
if (pass[i].texgen == T_GEN_FULLBRIGHT && !TEXLOADED(shaderstate.curtexnums->fullbright))
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1792,11 +1792,11 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert
|
||||||
/*activate tmus*/
|
/*activate tmus*/
|
||||||
for (passno = 0; passno < lastpass; passno++)
|
for (passno = 0; passno < lastpass; passno++)
|
||||||
{
|
{
|
||||||
if (pass[passno].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay))
|
if (pass[passno].texgen == T_GEN_UPPEROVERLAY && !TEXLOADED(shaderstate.curtexnums->upperoverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[passno].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay))
|
if (pass[passno].texgen == T_GEN_LOWEROVERLAY && !TEXLOADED(shaderstate.curtexnums->loweroverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[passno].texgen == T_GEN_FULLBRIGHT && !TEXVALID(shaderstate.curtexnums->fullbright))
|
if (pass[passno].texgen == T_GEN_FULLBRIGHT && !TEXLOADED(shaderstate.curtexnums->fullbright))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SelectPassTexture(tmu, pass+passno);
|
SelectPassTexture(tmu, pass+passno);
|
||||||
|
@ -1909,15 +1909,15 @@ static void BE_RenderMeshProgram(const shader_t *s, unsigned int vertcount, unsi
|
||||||
|
|
||||||
program_t *p = s->prog;
|
program_t *p = s->prog;
|
||||||
|
|
||||||
if (TEXVALID(shaderstate.curtexnums->bump) && p->permu[perm|PERMUTATION_BUMPMAP].handle.hlsl.vert)
|
if (TEXLOADED(shaderstate.curtexnums->bump) && p->permu[perm|PERMUTATION_BUMPMAP].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_BUMPMAP;
|
perm |= PERMUTATION_BUMPMAP;
|
||||||
if (TEXVALID(shaderstate.curtexnums->fullbright) && p->permu[perm|PERMUTATION_FULLBRIGHT].handle.hlsl.vert)
|
if (TEXLOADED(shaderstate.curtexnums->fullbright) && p->permu[perm|PERMUTATION_FULLBRIGHT].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_FULLBRIGHT;
|
perm |= PERMUTATION_FULLBRIGHT;
|
||||||
if (p->permu[perm|PERMUTATION_UPPERLOWER].handle.hlsl.vert && (TEXVALID(shaderstate.curtexnums->upperoverlay) || TEXVALID(shaderstate.curtexnums->loweroverlay)))
|
if (p->permu[perm|PERMUTATION_UPPERLOWER].handle.hlsl.vert && (TEXLOADED(shaderstate.curtexnums->upperoverlay) || TEXLOADED(shaderstate.curtexnums->loweroverlay)))
|
||||||
perm |= PERMUTATION_UPPERLOWER;
|
perm |= PERMUTATION_UPPERLOWER;
|
||||||
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.hlsl.vert)
|
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_FOG;
|
perm |= PERMUTATION_FOG;
|
||||||
// if (r_glsl_offsetmapping.ival && TEXVALID(shaderstate.curtexnums->bump) && p->handle[perm|PERMUTATION_OFFSET.hlsl.vert)
|
// if (r_glsl_offsetmapping.ival && TEXLOADED(shaderstate.curtexnums->bump) && p->handle[perm|PERMUTATION_OFFSET.hlsl.vert)
|
||||||
// perm |= PERMUTATION_OFFSET;
|
// perm |= PERMUTATION_OFFSET;
|
||||||
|
|
||||||
BE_ApplyUniforms(p, perm);
|
BE_ApplyUniforms(p, perm);
|
||||||
|
@ -2908,19 +2908,25 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod)
|
||||||
|
|
||||||
void D3D11BE_SubmitBatch(batch_t *batch)
|
void D3D11BE_SubmitBatch(batch_t *batch)
|
||||||
{
|
{
|
||||||
|
shader_t *shader = batch->shader;
|
||||||
shaderstate.nummeshes = batch->meshes - batch->firstmesh;
|
shaderstate.nummeshes = batch->meshes - batch->firstmesh;
|
||||||
if (!shaderstate.nummeshes)
|
if (!shaderstate.nummeshes)
|
||||||
return;
|
return;
|
||||||
|
shaderstate.curbatch = batch;
|
||||||
|
shaderstate.batchvbo = batch->vbo;
|
||||||
|
shaderstate.meshlist = batch->mesh + batch->firstmesh;
|
||||||
|
shaderstate.curshader = shader;
|
||||||
if (shaderstate.curentity != batch->ent)
|
if (shaderstate.curentity != batch->ent)
|
||||||
{
|
{
|
||||||
BE_RotateForEntity(batch->ent, batch->ent->model);
|
BE_RotateForEntity(batch->ent, batch->ent->model);
|
||||||
shaderstate.curtime = r_refdef.time - shaderstate.curentity->shaderTime;
|
shaderstate.curtime = r_refdef.time - shaderstate.curentity->shaderTime;
|
||||||
}
|
}
|
||||||
shaderstate.curbatch = batch;
|
if (batch->skin)
|
||||||
shaderstate.batchvbo = batch->vbo;
|
shaderstate.curtexnums = batch->skin;
|
||||||
shaderstate.meshlist = batch->mesh + batch->firstmesh;
|
else if (shader->numdefaulttextures)
|
||||||
shaderstate.curshader = batch->shader;
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
shaderstate.curtexnums = batch->skin?batch->skin:&batch->shader->defaulttextures;
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
shaderstate.flags = batch->flags;
|
shaderstate.flags = batch->flags;
|
||||||
|
|
||||||
if (!shaderstate.batchvbo)
|
if (!shaderstate.batchvbo)
|
||||||
|
@ -2938,7 +2944,12 @@ void D3D11BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, v
|
||||||
shaderstate.curbatch = &shaderstate.dummybatch;
|
shaderstate.curbatch = &shaderstate.dummybatch;
|
||||||
shaderstate.batchvbo = vbo;
|
shaderstate.batchvbo = vbo;
|
||||||
shaderstate.curshader = shader;
|
shaderstate.curshader = shader;
|
||||||
|
if (texnums)
|
||||||
shaderstate.curtexnums = texnums;
|
shaderstate.curtexnums = texnums;
|
||||||
|
else if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
shaderstate.meshlist = meshlist;
|
shaderstate.meshlist = meshlist;
|
||||||
shaderstate.nummeshes = nummeshes;
|
shaderstate.nummeshes = nummeshes;
|
||||||
shaderstate.flags = beflags;
|
shaderstate.flags = beflags;
|
||||||
|
@ -2954,13 +2965,16 @@ void D3D11BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, v
|
||||||
BE_DrawMeshChain_Internal();
|
BE_DrawMeshChain_Internal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D11BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums, unsigned int beflags)
|
void D3D11BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, unsigned int beflags)
|
||||||
{
|
{
|
||||||
shaderstate.curbatch = &shaderstate.dummybatch;
|
shaderstate.curbatch = &shaderstate.dummybatch;
|
||||||
shaderstate.batchvbo = vbo;
|
shaderstate.batchvbo = vbo;
|
||||||
shaderstate.curtime = realtime;
|
shaderstate.curtime = realtime;
|
||||||
shaderstate.curshader = shader;
|
shaderstate.curshader = shader;
|
||||||
shaderstate.curtexnums = texnums?texnums:&shader->defaulttextures;
|
if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
shaderstate.meshlist = &meshchain;
|
shaderstate.meshlist = &meshchain;
|
||||||
shaderstate.nummeshes = 1;
|
shaderstate.nummeshes = 1;
|
||||||
shaderstate.flags = beflags;
|
shaderstate.flags = beflags;
|
||||||
|
|
|
@ -110,6 +110,8 @@ static void Upload_Texture_32(ID3D11Texture2D *tex, unsigned int *data, int data
|
||||||
|
|
||||||
qboolean D3D11_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
qboolean D3D11_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
{
|
{
|
||||||
|
int bytesperpixel = 4;
|
||||||
|
int bcbytes = 0;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
D3D11_TEXTURE2D_DESC tdesc = {0};
|
D3D11_TEXTURE2D_DESC tdesc = {0};
|
||||||
D3D11_SUBRESOURCE_DATA subresdesc[sizeof(mips->mip) / sizeof(mips->mip[0])];
|
D3D11_SUBRESOURCE_DATA subresdesc[sizeof(mips->mip) / sizeof(mips->mip[0])];
|
||||||
|
@ -150,54 +152,69 @@ qboolean D3D11_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
case PTI_DEPTH16:
|
case PTI_DEPTH16:
|
||||||
tdesc.Format = DXGI_FORMAT_D16_UNORM;
|
tdesc.Format = DXGI_FORMAT_D16_UNORM;
|
||||||
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
bytesperpixel = 2;
|
||||||
break;
|
break;
|
||||||
case PTI_DEPTH24:
|
case PTI_DEPTH24:
|
||||||
tdesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
|
tdesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
|
||||||
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
bytesperpixel = 3;
|
||||||
break;
|
break;
|
||||||
case PTI_DEPTH32:
|
case PTI_DEPTH32:
|
||||||
tdesc.Format = DXGI_FORMAT_D32_FLOAT;
|
tdesc.Format = DXGI_FORMAT_D32_FLOAT;
|
||||||
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
bytesperpixel = 4;
|
||||||
break;
|
break;
|
||||||
case PTI_DEPTH24_8:
|
case PTI_DEPTH24_8:
|
||||||
tdesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
|
tdesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
|
||||||
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
tdesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
bytesperpixel = 4;
|
||||||
break;
|
break;
|
||||||
case PTI_RGB565:
|
case PTI_RGB565:
|
||||||
tdesc.Format = DXGI_FORMAT_B5G6R5_UNORM;
|
tdesc.Format = DXGI_FORMAT_B5G6R5_UNORM;
|
||||||
|
bytesperpixel = 2;
|
||||||
break;
|
break;
|
||||||
// case PTI_RGBA5551:
|
// case PTI_RGBA5551:
|
||||||
// tdesc.Format = DXGI_FORMAT_A1B5G5R5_UNORM;
|
// tdesc.Format = DXGI_FORMAT_A1B5G5R5_UNORM;
|
||||||
|
// bytesperpixel = 2;
|
||||||
// break;
|
// break;
|
||||||
case PTI_ARGB1555:
|
case PTI_ARGB1555:
|
||||||
tdesc.Format = DXGI_FORMAT_B5G5R5A1_UNORM;
|
tdesc.Format = DXGI_FORMAT_B5G5R5A1_UNORM;
|
||||||
|
bytesperpixel = 2;
|
||||||
break;
|
break;
|
||||||
case PTI_RGBA4444:
|
case PTI_RGBA4444:
|
||||||
tdesc.Format = DXGI_FORMAT_B4G4R4A4_UNORM;
|
tdesc.Format = DXGI_FORMAT_B4G4R4A4_UNORM;
|
||||||
|
bytesperpixel = 2;
|
||||||
break;
|
break;
|
||||||
// case PTI_ARGB4444:
|
// case PTI_ARGB4444:
|
||||||
// tdesc.Format = DXGI_FORMAT_A4B4G4R4_UNORM;
|
// tdesc.Format = DXGI_FORMAT_A4B4G4R4_UNORM;
|
||||||
|
// bytesperpixel = 2;
|
||||||
// break;
|
// break;
|
||||||
case PTI_RGBA8:
|
case PTI_RGBA8:
|
||||||
case PTI_RGBX8: //d3d11 has no alphaless format. be sure to proprly disable alpha in the shader.
|
case PTI_RGBX8: //d3d11 has no alphaless format. be sure to proprly disable alpha in the shader.
|
||||||
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||||
|
bytesperpixel = 4;
|
||||||
break;
|
break;
|
||||||
case PTI_BGRA8:
|
case PTI_BGRA8:
|
||||||
tdesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
tdesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||||
|
bytesperpixel = 4;
|
||||||
break;
|
break;
|
||||||
case PTI_BGRX8:
|
case PTI_BGRX8:
|
||||||
tdesc.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
|
tdesc.Format = DXGI_FORMAT_B8G8R8X8_UNORM;
|
||||||
|
bytesperpixel = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PTI_S3RGB1: //d3d11 provides no way to disable alpha with dxt1. be sure to proprly disable alpha in the shader.
|
case PTI_S3RGB1: //d3d11 provides no way to disable alpha with dxt1. be sure to proprly disable alpha in the shader.
|
||||||
case PTI_S3RGBA1:
|
case PTI_S3RGBA1:
|
||||||
tdesc.Format = DXGI_FORMAT_BC1_UNORM;
|
tdesc.Format = DXGI_FORMAT_BC1_UNORM;
|
||||||
|
bcbytes = 8;
|
||||||
break;
|
break;
|
||||||
case PTI_S3RGBA3:
|
case PTI_S3RGBA3:
|
||||||
tdesc.Format = DXGI_FORMAT_BC2_UNORM;
|
tdesc.Format = DXGI_FORMAT_BC2_UNORM;
|
||||||
|
bcbytes = 16;
|
||||||
break;
|
break;
|
||||||
case PTI_S3RGBA5:
|
case PTI_S3RGBA5:
|
||||||
tdesc.Format = DXGI_FORMAT_BC3_UNORM;
|
tdesc.Format = DXGI_FORMAT_BC3_UNORM;
|
||||||
|
bcbytes = 16;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,8 +229,16 @@ qboolean D3D11_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
for (i = 0; i < mips->mipcount; i++)
|
for (i = 0; i < mips->mipcount; i++)
|
||||||
{
|
{
|
||||||
subresdesc[i].pSysMem = mips->mip[i].data;
|
subresdesc[i].pSysMem = mips->mip[i].data;
|
||||||
subresdesc[i].SysMemPitch = mips->mip[i].width*4;
|
if (bcbytes)
|
||||||
subresdesc[i].SysMemSlicePitch = mips->mip[i].width*mips->mip[i].height*4;
|
{
|
||||||
|
subresdesc[i].SysMemPitch = ((mips->mip[i].width+3)/4) * bcbytes;
|
||||||
|
subresdesc[i].SysMemSlicePitch = mips->mip[i].datasize;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subresdesc[i].SysMemPitch = mips->mip[i].width*bytesperpixel;
|
||||||
|
subresdesc[i].SysMemSlicePitch = mips->mip[i].datasize;//mips->mip[i].width*mips->mip[i].height*bytesperpixel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tdesc.MipLevels = i/tdesc.ArraySize;
|
tdesc.MipLevels = i/tdesc.ArraySize;
|
||||||
}
|
}
|
||||||
|
|
|
@ -409,6 +409,8 @@ qboolean D3D11Shader_CreateProgram (program_t *prog, const char *name, unsigned
|
||||||
"s_paletted",
|
"s_paletted",
|
||||||
"s_shadowmap",
|
"s_shadowmap",
|
||||||
"s_projectionmap",
|
"s_projectionmap",
|
||||||
|
"s_reflectcube",
|
||||||
|
"s_reflectmask",
|
||||||
"s_lightmap",
|
"s_lightmap",
|
||||||
"s_deluxmap"
|
"s_deluxmap"
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
|
@ -612,7 +614,7 @@ qboolean D3D11Shader_CreateProgram (program_t *prog, const char *name, unsigned
|
||||||
{
|
{
|
||||||
int tmu;
|
int tmu;
|
||||||
D3D11_SHADER_INPUT_BIND_DESC bdesc = {0};
|
D3D11_SHADER_INPUT_BIND_DESC bdesc = {0};
|
||||||
for (i = prog->numsamplers; i < 8; i++)
|
for (i = prog->numsamplers; i < be_maxpasses; i++)
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(freflect->lpVtbl->GetResourceBindingDescByName(freflect, va("t_%i", i), &bdesc)))
|
if (SUCCEEDED(freflect->lpVtbl->GetResourceBindingDescByName(freflect, va("t_%i", i), &bdesc)))
|
||||||
prog->numsamplers = i+1;
|
prog->numsamplers = i+1;
|
||||||
|
|
|
@ -281,17 +281,17 @@ static void BE_ApplyTMUState(unsigned int tu, unsigned int flags)
|
||||||
int *filter = (flags & SHADER_PASS_UIPIC)?shaderstate.picfilter:shaderstate.mipfilter;
|
int *filter = (flags & SHADER_PASS_UIPIC)?shaderstate.picfilter:shaderstate.mipfilter;
|
||||||
|
|
||||||
if ((filter[2] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
if ((filter[2] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
||||||
mag = D3DTEXF_LINEAR;
|
mag = D3DTEXF_ANISOTROPIC;//D3DTEXF_LINEAR;
|
||||||
else
|
else
|
||||||
mag = D3DTEXF_POINT;
|
mag = D3DTEXF_POINT;
|
||||||
if (filter[1] == -1 || (flags & IF_NOMIPMAP))
|
if (filter[1] == -1 || (flags & IF_NOMIPMAP))
|
||||||
mip = D3DTEXF_NONE;
|
mip = D3DTEXF_NONE;
|
||||||
else if ((filter[1] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
else if ((filter[1] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
||||||
mip = D3DTEXF_LINEAR;
|
mip = D3DTEXF_ANISOTROPIC;//D3DTEXF_LINEAR;
|
||||||
else
|
else
|
||||||
mip = D3DTEXF_POINT;
|
mip = D3DTEXF_POINT;
|
||||||
if ((filter[0] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
if ((filter[0] && !(flags & SHADER_PASS_NEAREST)) || (flags & SHADER_PASS_LINEAR))
|
||||||
min = D3DTEXF_LINEAR;
|
min = D3DTEXF_ANISOTROPIC;//D3DTEXF_LINEAR;
|
||||||
else
|
else
|
||||||
min = D3DTEXF_POINT;
|
min = D3DTEXF_POINT;
|
||||||
|
|
||||||
|
@ -313,6 +313,8 @@ void D3D9_UpdateFiltering(image_t *imagelist, int filtermip[3], int filterpic[3]
|
||||||
{
|
{
|
||||||
shaderstate.tmuflags[i] = ~shaderstate.tmuflags[i];
|
shaderstate.tmuflags[i] = ~shaderstate.tmuflags[i];
|
||||||
BE_ApplyTMUState(i, ~shaderstate.tmuflags[i]);
|
BE_ApplyTMUState(i, ~shaderstate.tmuflags[i]);
|
||||||
|
|
||||||
|
IDirect3DDevice9_SetSamplerState(pD3DDev9, i, D3DSAMP_MAXANISOTROPY, anis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1604,11 +1606,11 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert
|
||||||
|
|
||||||
for (i = 0; i < lastpass; i++)
|
for (i = 0; i < lastpass; i++)
|
||||||
{
|
{
|
||||||
if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay))
|
if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXLOADED(shaderstate.curtexnums->upperoverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay))
|
if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXLOADED(shaderstate.curtexnums->loweroverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[i].texgen == T_GEN_FULLBRIGHT && !TEXVALID(shaderstate.curtexnums->fullbright))
|
if (pass[i].texgen == T_GEN_FULLBRIGHT && !TEXLOADED(shaderstate.curtexnums->fullbright))
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1625,11 +1627,11 @@ static qboolean BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vert
|
||||||
/*activate tmus*/
|
/*activate tmus*/
|
||||||
for (passno = 0; passno < lastpass; passno++)
|
for (passno = 0; passno < lastpass; passno++)
|
||||||
{
|
{
|
||||||
if (pass[passno].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay))
|
if (pass[passno].texgen == T_GEN_UPPEROVERLAY && !TEXLOADED(shaderstate.curtexnums->upperoverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[passno].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay))
|
if (pass[passno].texgen == T_GEN_LOWEROVERLAY && !TEXLOADED(shaderstate.curtexnums->loweroverlay))
|
||||||
continue;
|
continue;
|
||||||
if (pass[passno].texgen == T_GEN_FULLBRIGHT && !TEXVALID(shaderstate.curtexnums->fullbright))
|
if (pass[passno].texgen == T_GEN_FULLBRIGHT && !TEXLOADED(shaderstate.curtexnums->fullbright))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SelectPassTexture(tmu, pass+passno);
|
SelectPassTexture(tmu, pass+passno);
|
||||||
|
@ -1841,14 +1843,14 @@ static void BE_RenderMeshProgram(shader_t *s, unsigned int vertcount, unsigned i
|
||||||
perm |= PERMUTATION_BUMPMAP;
|
perm |= PERMUTATION_BUMPMAP;
|
||||||
if (TEXVALID(shaderstate.curtexnums->fullbright) && p->permu[perm|PERMUTATION_FULLBRIGHT].handle.hlsl.vert)
|
if (TEXVALID(shaderstate.curtexnums->fullbright) && p->permu[perm|PERMUTATION_FULLBRIGHT].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_FULLBRIGHT;
|
perm |= PERMUTATION_FULLBRIGHT;
|
||||||
if (p->permu[perm|PERMUTATION_UPPERLOWER].handle.hlsl.vert && (TEXVALID(shaderstate.curtexnums->upperoverlay) || TEXVALID(shaderstate.curtexnums->loweroverlay)))
|
if (p->permu[perm|PERMUTATION_UPPERLOWER].handle.hlsl.vert && (TEXLOADED(shaderstate.curtexnums->upperoverlay) || TEXLOADED(shaderstate.curtexnums->loweroverlay)))
|
||||||
perm |= PERMUTATION_UPPERLOWER;
|
perm |= PERMUTATION_UPPERLOWER;
|
||||||
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.hlsl.vert)
|
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_FOG;
|
perm |= PERMUTATION_FOG;
|
||||||
if (p->permu[perm|PERMUTATION_FRAMEBLEND].handle.hlsl.vert && shaderstate.batchvbo && shaderstate.batchvbo->coord2.d3d.buff)
|
if (p->permu[perm|PERMUTATION_FRAMEBLEND].handle.hlsl.vert && shaderstate.batchvbo && shaderstate.batchvbo->coord2.d3d.buff)
|
||||||
perm |= PERMUTATION_FRAMEBLEND;
|
perm |= PERMUTATION_FRAMEBLEND;
|
||||||
if (p->permu[perm|PERMUTATION_DELUXE].handle.hlsl.vert && TEXVALID(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe)
|
// if (p->permu[perm|PERMUTATION_DELUXE].handle.hlsl.vert && TEXVALID(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe)
|
||||||
perm |= PERMUTATION_DELUXE;
|
// perm |= PERMUTATION_DELUXE;
|
||||||
if (shaderstate.curbatch->lightmap[1] >= 0 && p->permu[perm|PERMUTATION_LIGHTSTYLES].handle.hlsl.vert)
|
if (shaderstate.curbatch->lightmap[1] >= 0 && p->permu[perm|PERMUTATION_LIGHTSTYLES].handle.hlsl.vert)
|
||||||
perm |= PERMUTATION_LIGHTSTYLES;
|
perm |= PERMUTATION_LIGHTSTYLES;
|
||||||
|
|
||||||
|
@ -2740,6 +2742,7 @@ static void BE_RotateForEntity (const entity_t *e, const model_t *mod)
|
||||||
|
|
||||||
void D3D9BE_SubmitBatch(batch_t *batch)
|
void D3D9BE_SubmitBatch(batch_t *batch)
|
||||||
{
|
{
|
||||||
|
shader_t *shader = batch->shader;
|
||||||
shaderstate.nummeshes = batch->meshes - batch->firstmesh;
|
shaderstate.nummeshes = batch->meshes - batch->firstmesh;
|
||||||
if (!shaderstate.nummeshes)
|
if (!shaderstate.nummeshes)
|
||||||
return;
|
return;
|
||||||
|
@ -2750,8 +2753,13 @@ void D3D9BE_SubmitBatch(batch_t *batch)
|
||||||
}
|
}
|
||||||
shaderstate.batchvbo = batch->vbo;
|
shaderstate.batchvbo = batch->vbo;
|
||||||
shaderstate.meshlist = batch->mesh + batch->firstmesh;
|
shaderstate.meshlist = batch->mesh + batch->firstmesh;
|
||||||
shaderstate.curshader = batch->shader;
|
shaderstate.curshader = shader;
|
||||||
shaderstate.curtexnums = batch->skin?batch->skin:&batch->shader->defaulttextures;
|
if (batch->skin)
|
||||||
|
shaderstate.curtexnums = batch->skin;
|
||||||
|
else if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
shaderstate.curbatch = batch;
|
shaderstate.curbatch = batch;
|
||||||
shaderstate.flags = batch->flags;
|
shaderstate.flags = batch->flags;
|
||||||
if ((unsigned)batch->lightmap[0] < (unsigned)numlightmaps)
|
if ((unsigned)batch->lightmap[0] < (unsigned)numlightmaps)
|
||||||
|
@ -2776,12 +2784,15 @@ void D3D9BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vb
|
||||||
BE_DrawMeshChain_Internal();
|
BE_DrawMeshChain_Internal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D9BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums, unsigned int beflags)
|
void D3D9BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, unsigned int beflags)
|
||||||
{
|
{
|
||||||
shaderstate.batchvbo = vbo;
|
shaderstate.batchvbo = vbo;
|
||||||
shaderstate.curtime = realtime;
|
shaderstate.curtime = realtime;
|
||||||
shaderstate.curshader = shader;
|
shaderstate.curshader = shader;
|
||||||
shaderstate.curtexnums = texnums?texnums:&shader->defaulttextures;
|
if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
shaderstate.curlightmap = r_nulltex;
|
shaderstate.curlightmap = r_nulltex;
|
||||||
shaderstate.meshlist = &meshchain;
|
shaderstate.meshlist = &meshchain;
|
||||||
shaderstate.nummeshes = 1;
|
shaderstate.nummeshes = 1;
|
||||||
|
@ -2800,8 +2811,6 @@ static void BE_SubmitMeshesSortList(batch_t *sortlist)
|
||||||
|
|
||||||
if (batch->buildmeshes)
|
if (batch->buildmeshes)
|
||||||
batch->buildmeshes(batch);
|
batch->buildmeshes(batch);
|
||||||
else if (batch->texture)
|
|
||||||
batch->skin = &batch->shader->defaulttextures;
|
|
||||||
|
|
||||||
if (batch->shader->flags & SHADER_NODLIGHT)
|
if (batch->shader->flags & SHADER_NODLIGHT)
|
||||||
if (shaderstate.mode == BEM_LIGHT)
|
if (shaderstate.mode == BEM_LIGHT)
|
||||||
|
|
|
@ -28,6 +28,7 @@ qboolean D3D9_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
IDirect3DTexture9 *dt;
|
IDirect3DTexture9 *dt;
|
||||||
qboolean swap = false;
|
qboolean swap = false;
|
||||||
unsigned int pixelsize = 4;
|
unsigned int pixelsize = 4;
|
||||||
|
unsigned int blocksize = 0;
|
||||||
|
|
||||||
switch(mips->encoding)
|
switch(mips->encoding)
|
||||||
{
|
{
|
||||||
|
@ -67,15 +68,17 @@ qboolean D3D9_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
//too lazy to support these for now
|
//too lazy to support these for now
|
||||||
case PTI_S3RGB1:
|
case PTI_S3RGB1:
|
||||||
case PTI_S3RGBA1: //d3d doesn't distinguish between these
|
case PTI_S3RGBA1: //d3d doesn't distinguish between these
|
||||||
// fmt = D3DFMT_DXT1;
|
fmt = D3DFMT_DXT1;
|
||||||
// break;
|
blocksize = 8;
|
||||||
|
break;
|
||||||
case PTI_S3RGBA3:
|
case PTI_S3RGBA3:
|
||||||
// fmt = D3DFMT_DXT3;
|
fmt = D3DFMT_DXT3;
|
||||||
// break;
|
blocksize = 16;
|
||||||
|
break;
|
||||||
case PTI_S3RGBA5:
|
case PTI_S3RGBA5:
|
||||||
// fmt = D3DFMT_DXT5;
|
fmt = D3DFMT_DXT5;
|
||||||
// break;
|
blocksize = 16;
|
||||||
return false;
|
break;
|
||||||
|
|
||||||
default: //no idea
|
default: //no idea
|
||||||
return false;
|
return false;
|
||||||
|
@ -96,7 +99,13 @@ qboolean D3D9_LoadTextureMips(image_t *tex, struct pendingtextureinfo *mips)
|
||||||
|
|
||||||
IDirect3DTexture9_LockRect(dt, i, &lock, NULL, D3DLOCK_NOSYSLOCK|D3DLOCK_DISCARD);
|
IDirect3DTexture9_LockRect(dt, i, &lock, NULL, D3DLOCK_NOSYSLOCK|D3DLOCK_DISCARD);
|
||||||
//can't do it in one go. pitch might contain padding or be upside down.
|
//can't do it in one go. pitch might contain padding or be upside down.
|
||||||
if (swap)
|
if (blocksize)
|
||||||
|
{
|
||||||
|
if (lock.Pitch == ((mips->mip[i].width+3)/4)*blocksize)
|
||||||
|
//for (y = 0, out = lock.pBits, in = mips->mip[i].data; y < mips->mip[i].height; y++, out += lock.Pitch, in += mips->mip[i].width*pixelsize)
|
||||||
|
memcpy(lock.pBits, mips->mip[i].data, mips->mip[i].datasize);
|
||||||
|
}
|
||||||
|
else if (swap)
|
||||||
{
|
{
|
||||||
for (y = 0, out = lock.pBits, in = mips->mip[i].data; y < mips->mip[i].height; y++, out += lock.Pitch, in += mips->mip[i].width*4)
|
for (y = 0, out = lock.pBits, in = mips->mip[i].data; y < mips->mip[i].height; y++, out += lock.Pitch, in += mips->mip[i].width*4)
|
||||||
{
|
{
|
||||||
|
|
|
@ -264,6 +264,8 @@ static void D3D9Shader_ProgAutoFields(program_t *prog, char **cvarnames, int *cv
|
||||||
"s_paletted",
|
"s_paletted",
|
||||||
"s_shadowmap",
|
"s_shadowmap",
|
||||||
"s_projectionmap",
|
"s_projectionmap",
|
||||||
|
"s_reflectcube",
|
||||||
|
"s_reflectmask",
|
||||||
"s_lightmap",
|
"s_lightmap",
|
||||||
"s_deluxmap"
|
"s_deluxmap"
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
|
@ -275,6 +277,8 @@ static void D3D9Shader_ProgAutoFields(program_t *prog, char **cvarnames, int *cv
|
||||||
,"s_deluxmap3"
|
,"s_deluxmap3"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
#define ALTLIGHTMAPSAMP 13
|
||||||
|
#define ALTDELUXMAPSAMP 16
|
||||||
|
|
||||||
prog->numparams = 0;
|
prog->numparams = 0;
|
||||||
|
|
||||||
|
@ -355,10 +359,10 @@ static void D3D9Shader_ProgAutoFields(program_t *prog, char **cvarnames, int *cv
|
||||||
}
|
}
|
||||||
|
|
||||||
//multiple lightmaps is kinda hacky. if any are set, all must be.
|
//multiple lightmaps is kinda hacky. if any are set, all must be.
|
||||||
if (prog->defaulttextures & ((1u<<11) | (1u<<12) | (1u<<13)))
|
if (prog->defaulttextures & ((1u<<(ALTLIGHTMAPSAMP+0)) | (1u<<(ALTLIGHTMAPSAMP+1)) | (1u<<(ALTLIGHTMAPSAMP+2))))
|
||||||
prog->defaulttextures |=((1u<<11) | (1u<<12) | (1u<<13));
|
prog->defaulttextures |=((1u<<(ALTLIGHTMAPSAMP+0)) | (1u<<(ALTLIGHTMAPSAMP+1)) | (1u<<(ALTLIGHTMAPSAMP+2)));
|
||||||
if (prog->defaulttextures & ((1u<<14) | (1u<<15) | (1u<<16)))
|
if (prog->defaulttextures & ((1u<<(ALTDELUXMAPSAMP+0)) | (1u<<(ALTDELUXMAPSAMP+1)) | (1u<<(ALTDELUXMAPSAMP+2))))
|
||||||
prog->defaulttextures |=((1u<<14) | (1u<<15) | (1u<<16));
|
prog->defaulttextures |=((1u<<(ALTDELUXMAPSAMP+0)) | (1u<<(ALTDELUXMAPSAMP+1)) | (1u<<(ALTDELUXMAPSAMP+2)));
|
||||||
|
|
||||||
if (prog->defaulttextures)
|
if (prog->defaulttextures)
|
||||||
{
|
{
|
||||||
|
|
|
@ -453,6 +453,31 @@ public class FTEDroidActivity extends Activity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* private FTEJoystickInputEvent joystickevent;
|
||||||
|
class FTEJoystickInputEvent
|
||||||
|
{
|
||||||
|
//API level 12+
|
||||||
|
public boolean go(MotionEvent event)
|
||||||
|
{
|
||||||
|
if (event.isFromSource(InputDevice.SOURCE_CLASS_JOYSTICK))
|
||||||
|
{
|
||||||
|
//FIXME: get MotionRange values from the device, so we can query the ideal size of the deadzone
|
||||||
|
FTEDroidEngine.axischange(0, event.getAxisValue(MotionEvent.AXIS_X));
|
||||||
|
FTEDroidEngine.axischange(1, event.getAxisValue(MotionEvent.AXIS_Y));
|
||||||
|
FTEDroidEngine.axischange(2, event.getAxisValue(MotionEvent.AXIS_Z));
|
||||||
|
FTEDroidEngine.axischange(3, event.getAxisValue(MotionEvent.AXIS_RZ));
|
||||||
|
FTEDroidEngine.axischange(4, event.getAxisValue(MotionEvent.AXIS_HAT_X));
|
||||||
|
FTEDroidEngine.axischange(5, event.getAxisValue(MotionEvent.AXIS_HAT_Y));
|
||||||
|
FTEDroidEngine.axischange(6, event.getAxisValue(MotionEvent.AXIS_LTRIGGER));
|
||||||
|
FTEDroidEngine.axischange(7, event.getAxisValue(MotionEvent.AXIS_RTRIGGER));
|
||||||
|
FTEDroidEngine.axischange(8, event.getAxisValue(MotionEvent.AXIS_BREAK));
|
||||||
|
FTEDroidEngine.axischange(9, event.getAxisValue(MotionEvent.AXIS_GAS));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
private FTELegacyInputEvent inputevent;
|
private FTELegacyInputEvent inputevent;
|
||||||
class FTEMultiTouchInputEvent extends FTELegacyInputEvent
|
class FTEMultiTouchInputEvent extends FTELegacyInputEvent
|
||||||
{
|
{
|
||||||
|
@ -538,6 +563,9 @@ public class FTEDroidActivity extends Activity
|
||||||
else
|
else
|
||||||
inputevent = new FTELegacyInputEvent();
|
inputevent = new FTELegacyInputEvent();
|
||||||
|
|
||||||
|
// if (android.os.Build.VERSION.SDK_INT >= 12)
|
||||||
|
// joystickevent = new FTEJoystickInputEvent();
|
||||||
|
|
||||||
rndr = new FTERenderer(this, context);
|
rndr = new FTERenderer(this, context);
|
||||||
setRenderer(rndr);
|
setRenderer(rndr);
|
||||||
setFocusable(true);
|
setFocusable(true);
|
||||||
|
@ -574,6 +602,16 @@ public class FTEDroidActivity extends Activity
|
||||||
private static final int K_SEARCH = 242;
|
private static final int K_SEARCH = 242;
|
||||||
private static final int K_VOLUP = 243;
|
private static final int K_VOLUP = 243;
|
||||||
private static final int K_VOLDOWN = 244;
|
private static final int K_VOLDOWN = 244;
|
||||||
|
|
||||||
|
private static final int K_JOY1 = 203;
|
||||||
|
private static final int K_JOY2 = 204;
|
||||||
|
private static final int K_JOY3 = 205;
|
||||||
|
private static final int K_JOY4 = 206;
|
||||||
|
private static final int K_AUX1 = 207;
|
||||||
|
private static final int K_AUX2 = 208;
|
||||||
|
private static final int K_AUX3 = 209;
|
||||||
|
private static final int K_AUX4 = 210;
|
||||||
|
|
||||||
private int mapKey(int acode, int unicode)
|
private int mapKey(int acode, int unicode)
|
||||||
{
|
{
|
||||||
switch(acode)
|
switch(acode)
|
||||||
|
@ -603,6 +641,24 @@ public class FTEDroidActivity extends Activity
|
||||||
return K_VOLDOWN; //"voldown"
|
return K_VOLDOWN; //"voldown"
|
||||||
case KeyEvent.KEYCODE_VOLUME_UP:
|
case KeyEvent.KEYCODE_VOLUME_UP:
|
||||||
return K_VOLUP; //"volup"
|
return K_VOLUP; //"volup"
|
||||||
|
|
||||||
|
case 99/*KeyEvent.KEYCODE_BUTTON_X*/:
|
||||||
|
return K_JOY1;
|
||||||
|
case 96/*KeyEvent.KEYCODE_BUTTON_A*/:
|
||||||
|
return K_JOY2;
|
||||||
|
case 100/*KeyEvent.KEYCODE_BUTTON_Y*/:
|
||||||
|
return K_JOY3;
|
||||||
|
case 97/*KeyEvent.KEYCODE_BUTTON_B*/:
|
||||||
|
return K_JOY4;
|
||||||
|
case 102/*KeyEvent.KEYCODE_BUTTON_L1*/:
|
||||||
|
return K_AUX1;
|
||||||
|
case 103/*KeyEvent.KEYCODE_BUTTON_R1*/:
|
||||||
|
return K_AUX2;
|
||||||
|
case 106/*KeyEvent.KEYCODE_BUTTON_THUMBL*/:
|
||||||
|
return K_AUX3;
|
||||||
|
case 107/*KeyEvent.KEYCODE_BUTTON_THUMBR*/:
|
||||||
|
return K_AUX4;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (unicode < 128)
|
if (unicode < 128)
|
||||||
return Character.toLowerCase(unicode);
|
return Character.toLowerCase(unicode);
|
||||||
|
@ -625,6 +681,19 @@ public class FTEDroidActivity extends Activity
|
||||||
sendKey(false, mapKey(keyCode, uc), uc);
|
sendKey(false, mapKey(keyCode, uc), uc);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@Override
|
||||||
|
public boolean onGenericMotionEvent(android.view.MotionEvent event)
|
||||||
|
{
|
||||||
|
if (joystickevent)
|
||||||
|
if (joystickevent.go(event))
|
||||||
|
return true;
|
||||||
|
//FIXME: handle mouse and mousewheel
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@Override
|
@Override
|
||||||
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
|
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
|
||||||
|
|
|
@ -261,7 +261,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext)
|
||||||
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
||||||
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
||||||
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
||||||
skin->mappings[skin->nummappings].texnums = skin->mappings[skin->nummappings].shader->defaulttextures;
|
skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures;
|
||||||
skin->nummappings++;
|
skin->nummappings++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext)
|
||||||
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
||||||
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
||||||
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
||||||
skin->mappings[skin->nummappings].texnums = skin->mappings[skin->nummappings].shader->defaulttextures;
|
skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures;
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
@ -351,7 +351,7 @@ skinid_t Mod_ReadSkinFile(const char *skinname, const char *skintext)
|
||||||
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
Q_strncpyz(shadername, com_token, sizeof(shadername));
|
||||||
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
skin->mappings[skin->nummappings].shader = R_RegisterSkin(shadername, skin->skinname);
|
||||||
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
R_BuildDefaultTexnums(NULL, skin->mappings[skin->nummappings].shader);
|
||||||
skin->mappings[skin->nummappings].texnums = skin->mappings[skin->nummappings].shader->defaulttextures;
|
skin->mappings[skin->nummappings].texnums = *skin->mappings[skin->nummappings].shader->defaulttextures;
|
||||||
skin->nummappings++;
|
skin->nummappings++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -596,8 +596,8 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
s = R_RegisterSkin(va("gfx/skin%d.lmp", e->skinnum), NULL);
|
s = R_RegisterSkin(va("gfx/skin%d.lmp", e->skinnum), NULL);
|
||||||
if (s)
|
if (s)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(s->defaulttextures.base))
|
// if (!TEXVALID(s->defaulttextures.base))
|
||||||
s->defaulttextures.base = R_LoadHiResTexture(va("gfx/skin%d.lmp", e->skinnum), NULL, 0);
|
// s->defaulttextures.base = R_LoadHiResTexture(va("gfx/skin%d.lmp", e->skinnum), NULL, 0);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -702,9 +702,10 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
{
|
{
|
||||||
if (!plskin)
|
if (!plskin)
|
||||||
{
|
{
|
||||||
|
texnums_t *tex = shader->defaulttextures;
|
||||||
//do this for the loading case too, in the hope that it'll avoid generating a per-player skin at all
|
//do this for the loading case too, in the hope that it'll avoid generating a per-player skin at all
|
||||||
if ((shader->defaulttextures.loweroverlay && (shader->defaulttextures.loweroverlay->status == TEX_LOADING || shader->defaulttextures.loweroverlay->status == TEX_LOADED)) ||
|
if ((tex->loweroverlay && (tex->loweroverlay->status == TEX_LOADING || tex->loweroverlay->status == TEX_LOADED)) ||
|
||||||
(shader->defaulttextures.upperoverlay && (shader->defaulttextures.upperoverlay->status == TEX_LOADING || shader->defaulttextures.upperoverlay->status == TEX_LOADED)))
|
(tex->upperoverlay && (tex->upperoverlay->status == TEX_LOADING || tex->upperoverlay->status == TEX_LOADED)))
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
if (shader->prog && shader->prog->permu[PERMUTATION_UPPERLOWER].handle.glsl.handle && !h2playertranslations)
|
if (shader->prog && shader->prog->permu[PERMUTATION_UPPERLOWER].handle.glsl.handle && !h2playertranslations)
|
||||||
|
@ -727,7 +728,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
}
|
}
|
||||||
|
|
||||||
//colourmap isn't present yet.
|
//colourmap isn't present yet.
|
||||||
cm = BZ_Malloc(sizeof(*cm));
|
cm = Z_Malloc(sizeof(*cm));
|
||||||
*forcedtex = &cm->texnum;
|
*forcedtex = &cm->texnum;
|
||||||
Q_strncpyz(cm->name, skinname, sizeof(cm->name));
|
Q_strncpyz(cm->name, skinname, sizeof(cm->name));
|
||||||
Hash_Add(&skincolourmapped, cm->name, cm, &cm->bucket);
|
Hash_Add(&skincolourmapped, cm->name, cm, &cm->bucket);
|
||||||
|
@ -736,20 +737,13 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
cm->pclass = pc; //is this needed? surely it'll be baked as part of the modelname?
|
cm->pclass = pc; //is this needed? surely it'll be baked as part of the modelname?
|
||||||
cm->skinnum = e->skinnum;
|
cm->skinnum = e->skinnum;
|
||||||
cm->subframe = subframe;
|
cm->subframe = subframe;
|
||||||
cm->texnum.fullbright = r_nulltex;
|
|
||||||
cm->texnum.base = r_nulltex;
|
|
||||||
cm->texnum.bump = r_nulltex;
|
|
||||||
cm->texnum.specular = r_nulltex;
|
|
||||||
cm->texnum.loweroverlay = r_nulltex;
|
|
||||||
cm->texnum.upperoverlay = r_nulltex;
|
|
||||||
cm->texnum.paletted = r_nulltex;
|
|
||||||
|
|
||||||
//q2 has no surfaces in its player models, so don't crash from that
|
//q2 has no surfaces in its player models, so don't crash from that
|
||||||
//note that q2 should also always have a custom skin set. its not our problem (here) if it doesn't.
|
//note that q2 should also always have a custom skin set. its not our problem (here) if it doesn't.
|
||||||
if (!shader)
|
if (!shader)
|
||||||
shader = R_RegisterSkin(skinname, NULL);
|
shader = R_RegisterSkin(skinname, NULL);
|
||||||
|
|
||||||
cm->texnum.bump = shader->defaulttextures.bump; //can't colour bumpmapping
|
cm->texnum.bump = shader->defaulttextures->bump; //can't colour bumpmapping
|
||||||
if (plskin)
|
if (plskin)
|
||||||
{
|
{
|
||||||
/*q1 only reskins the player model, not gibbed heads (which have the same colourmap)*/
|
/*q1 only reskins the player model, not gibbed heads (which have the same colourmap)*/
|
||||||
|
@ -764,6 +758,9 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
cm->texnum.base = plskin->textures.base;
|
cm->texnum.base = plskin->textures.base;
|
||||||
cm->texnum.fullbright = plskin->textures.fullbright;
|
cm->texnum.fullbright = plskin->textures.fullbright;
|
||||||
cm->texnum.specular = plskin->textures.specular;
|
cm->texnum.specular = plskin->textures.specular;
|
||||||
|
cm->texnum.paletted = r_nulltex;
|
||||||
|
cm->texnum.reflectcube = r_nulltex;
|
||||||
|
cm->texnum.reflectmask = r_nulltex;
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -959,9 +956,11 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
cm->texnum.base = R_LoadTexture(va("base$%x$%x$%i$%i$%i$%s", tc, bc, cm->skinnum, subframe, pc, cm->name),
|
cm->texnum.base = R_LoadTexture(va("base$%x$%x$%i$%i$%i$%s", tc, bc, cm->skinnum, subframe, pc, cm->name),
|
||||||
scaled_width, scaled_height, h2playertranslations?TF_RGBA32:TF_RGBX32, pixels, IF_NOMIPMAP);
|
scaled_width, scaled_height, h2playertranslations?TF_RGBA32:TF_RGBX32, pixels, IF_NOMIPMAP);
|
||||||
|
|
||||||
cm->texnum.bump = shader->defaulttextures.bump;
|
cm->texnum.bump = shader->defaulttextures->bump;
|
||||||
cm->texnum.fullbright = shader->defaulttextures.fullbright;
|
cm->texnum.fullbright = shader->defaulttextures->fullbright;
|
||||||
cm->texnum.specular = shader->defaulttextures.specular;
|
cm->texnum.specular = shader->defaulttextures->specular;
|
||||||
|
cm->texnum.reflectcube = shader->defaulttextures->reflectcube;
|
||||||
|
cm->texnum.reflectmask = shader->defaulttextures->reflectmask;
|
||||||
/*if (!h2playertranslations)
|
/*if (!h2playertranslations)
|
||||||
{
|
{
|
||||||
qboolean valid = false;
|
qboolean valid = false;
|
||||||
|
@ -1044,7 +1043,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*model has no original skin info and thus cannot be reskinned, copy over the default textures so that the skincache doesn't break things when it gets reused*/
|
/*model has no original skin info and thus cannot be reskinned, copy over the default textures so that the skincache doesn't break things when it gets reused*/
|
||||||
cm->texnum = shader->defaulttextures;
|
cm->texnum = *shader->defaulttextures;
|
||||||
}
|
}
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
@ -1058,7 +1057,13 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
|
||||||
skins += e->skinnum;
|
skins += e->skinnum;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Con_DPrintf("Skin number out of range (%u > %u - %s)\n", e->skinnum, inf->numskins, model->name);
|
if (developer.ival)
|
||||||
|
{
|
||||||
|
static int lastframe;
|
||||||
|
if (lastframe != r_framecount && lastframe != r_framecount-1) //patented anti-spam technology!... actually, I wonder if it would actually be eligable for a patent.
|
||||||
|
Con_DPrintf("Skin number out of range (%u >= %u - %s)\n", e->skinnum, inf->numskins, model->name);
|
||||||
|
lastframe = r_framecount;
|
||||||
|
}
|
||||||
if (!inf->numskins)
|
if (!inf->numskins)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1504,7 +1509,7 @@ void R_GAlias_GenerateBatches(entity_t *e, batch_t **batches)
|
||||||
regshader = GL_ChooseSkin(inf, clmodel, surfnum, e, &skin);
|
regshader = GL_ChooseSkin(inf, clmodel, surfnum, e, &skin);
|
||||||
if (!regshader)
|
if (!regshader)
|
||||||
continue;
|
continue;
|
||||||
skin = skin?skin:®shader->defaulttextures;
|
skin = skin?skin:NULL;
|
||||||
shader = e->forcedshader?e->forcedshader:regshader;
|
shader = e->forcedshader?e->forcedshader:regshader;
|
||||||
if (shader)
|
if (shader)
|
||||||
{
|
{
|
||||||
|
@ -2006,7 +2011,7 @@ void GL_GenerateNormals(float *orgs, float *normals, int *indicies, int numtris,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef Q3CLIENT
|
#if defined(Q2CLIENT) || defined(Q3CLIENT)
|
||||||
//q3 lightning gun / q3 railgun / q2 beams
|
//q3 lightning gun / q3 railgun / q2 beams
|
||||||
static void R_Beam_GenerateTrisoup(entity_t *e, int bemode)
|
static void R_Beam_GenerateTrisoup(entity_t *e, int bemode)
|
||||||
{
|
{
|
||||||
|
@ -2020,8 +2025,6 @@ static void R_Beam_GenerateTrisoup(entity_t *e, int bemode)
|
||||||
float scale, length;
|
float scale, length;
|
||||||
vec3_t dir, v, cr;
|
vec3_t dir, v, cr;
|
||||||
|
|
||||||
if (e->forcedshader)
|
|
||||||
{
|
|
||||||
shader = e->forcedshader;
|
shader = e->forcedshader;
|
||||||
if (!shader)
|
if (!shader)
|
||||||
shader = R_RegisterShader("q2beam", SUF_NONE,
|
shader = R_RegisterShader("q2beam", SUF_NONE,
|
||||||
|
@ -2034,9 +2037,6 @@ static void R_Beam_GenerateTrisoup(entity_t *e, int bemode)
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
}
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
batchflags = 0;
|
batchflags = 0;
|
||||||
// if (e->flags & RF_NOSHADOW)
|
// if (e->flags & RF_NOSHADOW)
|
||||||
|
@ -2114,9 +2114,12 @@ static void R_Beam_GenerateTrisoup(entity_t *e, int bemode)
|
||||||
t->numvert += 4;
|
t->numvert += 4;
|
||||||
cl_numstrisvert += 4;
|
cl_numstrisvert += 4;
|
||||||
|
|
||||||
scale = e->scale*10;
|
scale = e->scale*5;
|
||||||
if (!scale)
|
if (!scale)
|
||||||
scale = 10;
|
scale = 5;
|
||||||
|
|
||||||
|
if (shader->flags & SHADER_CULL_FRONT)
|
||||||
|
scale *= -1;
|
||||||
|
|
||||||
VectorSubtract(e->origin, e->oldorigin, dir);
|
VectorSubtract(e->origin, e->oldorigin, dir);
|
||||||
length = Length(dir);
|
length = Length(dir);
|
||||||
|
@ -2452,7 +2455,7 @@ static void BE_GenPolyBatches(batch_t **batches)
|
||||||
b->mesh = NULL;
|
b->mesh = NULL;
|
||||||
b->firstmesh = 0;
|
b->firstmesh = 0;
|
||||||
b->meshes = 1;
|
b->meshes = 1;
|
||||||
b->skin = &shader->defaulttextures;
|
b->skin = NULL;
|
||||||
b->texture = NULL;
|
b->texture = NULL;
|
||||||
b->shader = shader;
|
b->shader = shader;
|
||||||
for (j = 0; j < MAXRLIGHTMAPS; j++)
|
for (j = 0; j < MAXRLIGHTMAPS; j++)
|
||||||
|
@ -2592,14 +2595,14 @@ void BE_GenModelBatches(batch_t **batches, const dlight_t *dl, unsigned int bemo
|
||||||
R_Sprite_GenerateTrisoup(ent, bemode);
|
R_Sprite_GenerateTrisoup(ent, bemode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef Q3CLIENT
|
|
||||||
case RT_BEAM:
|
case RT_BEAM:
|
||||||
case RT_RAIL_RINGS:
|
case RT_RAIL_RINGS:
|
||||||
case RT_LIGHTNING:
|
case RT_LIGHTNING:
|
||||||
case RT_RAIL_CORE:
|
case RT_RAIL_CORE:
|
||||||
|
#if defined(Q2CLIENT) || defined(Q3CLIENT)
|
||||||
R_Beam_GenerateTrisoup(ent, bemode);
|
R_Beam_GenerateTrisoup(ent, bemode);
|
||||||
continue;
|
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
case RT_POLY:
|
case RT_POLY:
|
||||||
/*not implemented*/
|
/*not implemented*/
|
||||||
|
|
|
@ -36,6 +36,10 @@ extern texid_t missing_texture_normal;
|
||||||
extern texid_t scenepp_postproc_cube;
|
extern texid_t scenepp_postproc_cube;
|
||||||
extern texid_t r_whiteimage;
|
extern texid_t r_whiteimage;
|
||||||
|
|
||||||
|
#ifndef GLSLONLY
|
||||||
|
static void GenerateTCMods(const shaderpass_t *pass, int passnum);
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char LIGHTPASS_SHADER[] = "\
|
static const char LIGHTPASS_SHADER[] = "\
|
||||||
{\n\
|
{\n\
|
||||||
program rtlight%s\n\
|
program rtlight%s\n\
|
||||||
|
@ -674,8 +678,8 @@ static void BE_ApplyAttributes(unsigned int bitstochange, unsigned int bitstoend
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case VATTR_TEXCOORD:
|
case VATTR_TEXCOORD:
|
||||||
GL_SelectVBO(shaderstate.sourcevbo->texcoord.gl.vbo);
|
GL_SelectVBO(shaderstate.pendingtexcoordvbo[0]);
|
||||||
qglVertexAttribPointer(VATTR_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, shaderstate.sourcevbo->texcoord.gl.addr);
|
qglVertexAttribPointer(VATTR_TEXCOORD, shaderstate.pendingtexcoordparts[0], GL_FLOAT, GL_FALSE, 0, shaderstate.pendingtexcoordpointer[0]);
|
||||||
break;
|
break;
|
||||||
case VATTR_LMCOORD:
|
case VATTR_LMCOORD:
|
||||||
if (!shaderstate.sourcevbo->lmcoord[0].gl.vbo && !shaderstate.sourcevbo->lmcoord[0].gl.addr)
|
if (!shaderstate.sourcevbo->lmcoord[0].gl.vbo && !shaderstate.sourcevbo->lmcoord[0].gl.addr)
|
||||||
|
@ -1170,6 +1174,12 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass)
|
||||||
case T_GEN_FULLBRIGHT:
|
case T_GEN_FULLBRIGHT:
|
||||||
t = shaderstate.curtexnums->fullbright;
|
t = shaderstate.curtexnums->fullbright;
|
||||||
break;
|
break;
|
||||||
|
case T_GEN_REFLECTCUBE:
|
||||||
|
GL_LazyBind(tmu, GL_TEXTURE_CUBE_MAP_ARB, shaderstate.curtexnums->reflectcube);
|
||||||
|
return;
|
||||||
|
case T_GEN_REFLECTMASK:
|
||||||
|
t = shaderstate.curtexnums->reflectmask;
|
||||||
|
break;
|
||||||
case T_GEN_SHADOWMAP:
|
case T_GEN_SHADOWMAP:
|
||||||
t = shaderstate.curshadowmap;
|
t = shaderstate.curshadowmap;
|
||||||
break;
|
break;
|
||||||
|
@ -3360,8 +3370,10 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
|
||||||
perm |= PERMUTATION_UPPERLOWER;
|
perm |= PERMUTATION_UPPERLOWER;
|
||||||
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.glsl.handle)
|
if (r_refdef.globalfog.density && p->permu[perm|PERMUTATION_FOG].handle.glsl.handle)
|
||||||
perm |= PERMUTATION_FOG;
|
perm |= PERMUTATION_FOG;
|
||||||
if (p->permu[perm|PERMUTATION_DELUXE].handle.glsl.handle && TEXLOADED(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe)
|
// if (p->permu[perm|PERMUTATION_DELUXE].handle.glsl.handle && TEXLOADED(shaderstate.curtexnums->bump) && shaderstate.curbatch->lightmap[0] >= 0 && lightmap[shaderstate.curbatch->lightmap[0]]->hasdeluxe)
|
||||||
perm |= PERMUTATION_DELUXE;
|
// perm |= PERMUTATION_DELUXE;
|
||||||
|
if (TEXLOADED(shaderstate.curtexnums->reflectcube) && p->permu[perm|PERMUTATION_REFLECTCUBEMASK].handle.glsl.handle)
|
||||||
|
perm |= PERMUTATION_REFLECTCUBEMASK;
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
if (shaderstate.curbatch->lightmap[1] >= 0 && p->permu[perm|PERMUTATION_LIGHTSTYLES].handle.glsl.handle)
|
if (shaderstate.curbatch->lightmap[1] >= 0 && p->permu[perm|PERMUTATION_LIGHTSTYLES].handle.glsl.handle)
|
||||||
perm |= PERMUTATION_LIGHTSTYLES;
|
perm |= PERMUTATION_LIGHTSTYLES;
|
||||||
|
@ -3380,7 +3392,7 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
|
||||||
BE_Program_Set_Attributes(p, perm, i);
|
BE_Program_Set_Attributes(p, perm, i);
|
||||||
|
|
||||||
BE_SendPassBlendDepthMask(pass->shaderbits);
|
BE_SendPassBlendDepthMask(pass->shaderbits);
|
||||||
BE_EnableShaderAttributes(p->permu[perm].attrmask, shaderstate.sourcevbo->vao);
|
|
||||||
#ifndef GLSLONLY
|
#ifndef GLSLONLY
|
||||||
if (!p->nofixedcompat)
|
if (!p->nofixedcompat)
|
||||||
{
|
{
|
||||||
|
@ -3399,6 +3411,17 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
#ifndef GLSLONLY
|
||||||
|
if (pass->numtcmods)
|
||||||
|
GenerateTCMods(pass, 0);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
shaderstate.pendingtexcoordparts[0] = 2;
|
||||||
|
shaderstate.pendingtexcoordvbo[0] = shaderstate.sourcevbo->texcoord.gl.vbo;
|
||||||
|
shaderstate.pendingtexcoordpointer[0] = shaderstate.sourcevbo->texcoord.gl.addr;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < pass->numMergedPasses; i++)
|
for (i = 0; i < pass->numMergedPasses; i++)
|
||||||
{
|
{
|
||||||
Shader_BindTextureForPass(i, pass+i);
|
Shader_BindTextureForPass(i, pass+i);
|
||||||
|
@ -3418,6 +3441,7 @@ static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pas
|
||||||
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex);
|
GL_LazyBind(--shaderstate.lastpasstmus, 0, r_nulltex);
|
||||||
shaderstate.lastpasstmus = i; //in case it was already lower
|
shaderstate.lastpasstmus = i; //in case it was already lower
|
||||||
}
|
}
|
||||||
|
BE_EnableShaderAttributes(p->permu[perm].attrmask, shaderstate.sourcevbo->vao);
|
||||||
BE_SubmitMeshChain(p->permu[perm].handle.glsl.usetesselation);
|
BE_SubmitMeshChain(p->permu[perm].handle.glsl.usetesselation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4286,6 +4310,7 @@ void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_
|
||||||
{
|
{
|
||||||
shaderstate.curbatch = &shaderstate.dummybatch;
|
shaderstate.curbatch = &shaderstate.dummybatch;
|
||||||
shaderstate.curshader = shader->remapto;
|
shaderstate.curshader = shader->remapto;
|
||||||
|
|
||||||
if (!vbo)
|
if (!vbo)
|
||||||
{
|
{
|
||||||
mesh_t *m;
|
mesh_t *m;
|
||||||
|
@ -4294,7 +4319,12 @@ void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_
|
||||||
if (shaderstate.curentity != &r_worldentity)
|
if (shaderstate.curentity != &r_worldentity)
|
||||||
GLBE_SelectEntity(&r_worldentity);
|
GLBE_SelectEntity(&r_worldentity);
|
||||||
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + shader->remaptime);
|
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + shader->remaptime);
|
||||||
|
if (texnums)
|
||||||
shaderstate.curtexnums = texnums;
|
shaderstate.curtexnums = texnums;
|
||||||
|
else if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
|
|
||||||
while (nummeshes--)
|
while (nummeshes--)
|
||||||
{
|
{
|
||||||
|
@ -4316,21 +4346,27 @@ void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **meshlist, vbo_
|
||||||
if (shaderstate.curentity != &r_worldentity)
|
if (shaderstate.curentity != &r_worldentity)
|
||||||
GLBE_SelectEntity(&r_worldentity);
|
GLBE_SelectEntity(&r_worldentity);
|
||||||
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + shader->remaptime);
|
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + shader->remaptime);
|
||||||
|
if (texnums)
|
||||||
shaderstate.curtexnums = texnums;
|
shaderstate.curtexnums = texnums;
|
||||||
|
else if (shader->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures + ((int)(shader->defaulttextures_fps * shaderstate.curtime) % shader->numdefaulttextures);
|
||||||
|
else
|
||||||
|
shaderstate.curtexnums = shader->defaulttextures;
|
||||||
|
|
||||||
shaderstate.meshcount = nummeshes;
|
shaderstate.meshcount = nummeshes;
|
||||||
shaderstate.meshes = meshlist;
|
shaderstate.meshes = meshlist;
|
||||||
DrawMeshes();
|
DrawMeshes();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags)
|
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, vbo_t *vbo, unsigned int beflags)
|
||||||
{
|
{
|
||||||
shader->next = NULL;
|
shader->next = NULL;
|
||||||
BE_DrawMesh_List(shader, 1, &mesh, NULL, texnums, beflags);
|
BE_DrawMesh_List(shader, 1, &mesh, NULL, NULL, beflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLBE_SubmitBatch(batch_t *batch)
|
void GLBE_SubmitBatch(batch_t *batch)
|
||||||
{
|
{
|
||||||
|
shader_t *sh;
|
||||||
shaderstate.curbatch = batch;
|
shaderstate.curbatch = batch;
|
||||||
if (batch->vbo)
|
if (batch->vbo)
|
||||||
{
|
{
|
||||||
|
@ -4344,15 +4380,18 @@ void GLBE_SubmitBatch(batch_t *batch)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
shaderstate.curshader = batch->shader->remapto;
|
sh = batch->shader;
|
||||||
|
shaderstate.curshader = sh->remapto;
|
||||||
shaderstate.flags = batch->flags;
|
shaderstate.flags = batch->flags;
|
||||||
if (shaderstate.curentity != batch->ent)
|
if (shaderstate.curentity != batch->ent)
|
||||||
GLBE_SelectEntity(batch->ent);
|
GLBE_SelectEntity(batch->ent);
|
||||||
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + batch->shader->remaptime);
|
shaderstate.curtime = shaderstate.updatetime - (shaderstate.curentity->shaderTime + sh->remaptime);
|
||||||
if (batch->skin)
|
if (batch->skin)
|
||||||
shaderstate.curtexnums = batch->skin;
|
shaderstate.curtexnums = batch->skin;
|
||||||
|
else if (sh->numdefaulttextures)
|
||||||
|
shaderstate.curtexnums = sh->defaulttextures + ((int)(sh->defaulttextures_fps * shaderstate.curtime) % sh->numdefaulttextures);
|
||||||
else
|
else
|
||||||
shaderstate.curtexnums = &batch->shader->defaulttextures;
|
shaderstate.curtexnums = sh->defaulttextures;
|
||||||
|
|
||||||
if (0)
|
if (0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -162,9 +162,9 @@ static void R_SetupBloomTextures(int w, int h)
|
||||||
"map $upperoverlay\n"
|
"map $upperoverlay\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
bloomfinal->defaulttextures.base = pingtex[0][0];
|
bloomfinal->defaulttextures->base = pingtex[0][0];
|
||||||
bloomfinal->defaulttextures.loweroverlay = pingtex[0][1];
|
bloomfinal->defaulttextures->loweroverlay = pingtex[0][1];
|
||||||
bloomfinal->defaulttextures.upperoverlay = pingtex[0][2];
|
bloomfinal->defaulttextures->upperoverlay = pingtex[0][2];
|
||||||
}
|
}
|
||||||
qboolean R_CanBloom(void)
|
qboolean R_CanBloom(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -254,7 +254,7 @@ static void GL_Texturemode_Apply(GLenum targ, unsigned int flags)
|
||||||
if (gl_anisotropy_factor) //0 means driver doesn't support
|
if (gl_anisotropy_factor) //0 means driver doesn't support
|
||||||
{
|
{
|
||||||
//only use anisotrophy when using linear any linear, because of drivers that forces linear sampling when anis is active (annoyingly this is allowed by the spec).
|
//only use anisotrophy when using linear any linear, because of drivers that forces linear sampling when anis is active (annoyingly this is allowed by the spec).
|
||||||
if ((min == GL_LINEAR || min == GL_LINEAR_MIPMAP_LINEAR || min == GL_LINEAR_MIPMAP_NEAREST) && mag == GL_LINEAR)
|
if ((min == GL_LINEAR_MIPMAP_LINEAR || min == GL_LINEAR_MIPMAP_NEAREST) && mag == GL_LINEAR)
|
||||||
qglTexParameterf(targ, GL_TEXTURE_MAX_ANISOTROPY_EXT, gl_anisotropy_factor);
|
qglTexParameterf(targ, GL_TEXTURE_MAX_ANISOTROPY_EXT, gl_anisotropy_factor);
|
||||||
else
|
else
|
||||||
qglTexParameterf(targ, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
|
qglTexParameterf(targ, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
|
||||||
|
@ -327,11 +327,19 @@ qboolean GL_LoadTextureMips(texid_t tex, struct pendingtextureinfo *mips)
|
||||||
//this is available in gles3
|
//this is available in gles3
|
||||||
if (!gl_config.gles)
|
if (!gl_config.gles)
|
||||||
{
|
{
|
||||||
if (targ != GL_TEXTURE_CUBE_MAP_ARB && (tex->flags & IF_MIPCAP))
|
if (targ != GL_TEXTURE_CUBE_MAP_ARB)
|
||||||
|
{
|
||||||
|
if (tex->flags & IF_MIPCAP)
|
||||||
{
|
{
|
||||||
qglTexParameteri(targ, GL_TEXTURE_BASE_LEVEL, min(mips->mipcount-1, gl_mipcap_min));
|
qglTexParameteri(targ, GL_TEXTURE_BASE_LEVEL, min(mips->mipcount-1, gl_mipcap_min));
|
||||||
qglTexParameteri(targ, GL_TEXTURE_MAX_LEVEL, min(mips->mipcount-1, gl_mipcap_max));
|
qglTexParameteri(targ, GL_TEXTURE_MAX_LEVEL, min(mips->mipcount-1, gl_mipcap_max));
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qglTexParameteri(targ, GL_TEXTURE_BASE_LEVEL, 0);
|
||||||
|
qglTexParameteri(targ, GL_TEXTURE_MAX_LEVEL, mips->mipcount-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tex->width = mips->mip[0].width;
|
tex->width = mips->mip[0].width;
|
||||||
|
|
|
@ -384,10 +384,10 @@ static void Font_Flush(void)
|
||||||
font_backmesh.numvertexes = font_foremesh.numvertexes;
|
font_backmesh.numvertexes = font_foremesh.numvertexes;
|
||||||
font_backmesh.istrifan = font_foremesh.istrifan;
|
font_backmesh.istrifan = font_foremesh.istrifan;
|
||||||
|
|
||||||
BE_DrawMesh_Single(fontplanes.backshader, &font_backmesh, NULL, &fontplanes.backshader->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(fontplanes.backshader, &font_backmesh, NULL, r2d_be_flags);
|
||||||
}
|
}
|
||||||
TEXASSIGN(fontplanes.shader->defaulttextures.base, font_texture);
|
TEXASSIGN(fontplanes.shader->defaulttextures->base, font_texture);
|
||||||
BE_DrawMesh_Single(fontplanes.shader, &font_foremesh, NULL, &fontplanes.shader->defaulttextures, r2d_be_flags);
|
BE_DrawMesh_Single(fontplanes.shader, &font_foremesh, NULL, r2d_be_flags);
|
||||||
font_foremesh.numindexes = 0;
|
font_foremesh.numindexes = 0;
|
||||||
font_foremesh.numvertexes = 0;
|
font_foremesh.numvertexes = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3069,7 +3069,7 @@ void Terr_DrawTerrainModel (batch_t **batches, entity_t *e)
|
||||||
b->mesh[0] = &hm->skymesh;
|
b->mesh[0] = &hm->skymesh;
|
||||||
b->meshes = 1;
|
b->meshes = 1;
|
||||||
b->buildmeshes = NULL;
|
b->buildmeshes = NULL;
|
||||||
b->skin = &b->shader->defaulttextures;
|
b->skin = NULL;
|
||||||
b->texture = NULL;
|
b->texture = NULL;
|
||||||
// vbo = b->vbo = hm->vbo[x+y*MAXSECTIONS];
|
// vbo = b->vbo = hm->vbo[x+y*MAXSECTIONS];
|
||||||
b->vbo = NULL;
|
b->vbo = NULL;
|
||||||
|
@ -5171,7 +5171,7 @@ void Terr_Brush_Draw(heightmap_t *hm, batch_t **batches, entity_t *e)
|
||||||
miptex_t *tx = W_GetMipTex(bt->shadername);
|
miptex_t *tx = W_GetMipTex(bt->shadername);
|
||||||
if (tx)
|
if (tx)
|
||||||
{
|
{
|
||||||
R_InitSky (&bt->shader->defaulttextures, bt->shadername, (qbyte*)tx + tx->offsets[0], tx->width, tx->height);
|
R_InitSky (bt->shader, bt->shadername, (qbyte*)tx + tx->offsets[0], tx->width, tx->height);
|
||||||
BZ_Free(tx);
|
BZ_Free(tx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -5302,7 +5302,7 @@ void Terr_Brush_Draw(heightmap_t *hm, batch_t **batches, entity_t *e)
|
||||||
b->mesh = &bb->pmesh;
|
b->mesh = &bb->pmesh;
|
||||||
b->meshes = 1;
|
b->meshes = 1;
|
||||||
b->buildmeshes = NULL;
|
b->buildmeshes = NULL;
|
||||||
b->skin = &b->shader->defaulttextures;
|
b->skin = NULL;
|
||||||
b->texture = NULL;
|
b->texture = NULL;
|
||||||
b->vbo = &bb->vbo;
|
b->vbo = &bb->vbo;
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ cvar_t mod_loadentfiles = CVAR("sv_loadentfiles", "1");
|
||||||
cvar_t mod_external_vis = CVARD("mod_external_vis", "1", "Attempt to load .vis patches for quake maps, allowing transparent water to work properly.");
|
cvar_t mod_external_vis = CVARD("mod_external_vis", "1", "Attempt to load .vis patches for quake maps, allowing transparent water to work properly.");
|
||||||
cvar_t mod_warnmodels = CVARD("mod_warnmodels", "1", "Warn if any models failed to load. Set to 0 if your mod is likely to lack optional models (like its in development)."); //set to 0 for hexen2 and its otherwise-spammy-as-heck demo.
|
cvar_t mod_warnmodels = CVARD("mod_warnmodels", "1", "Warn if any models failed to load. Set to 0 if your mod is likely to lack optional models (like its in development)."); //set to 0 for hexen2 and its otherwise-spammy-as-heck demo.
|
||||||
cvar_t mod_litsprites = CVARD("mod_litsprites", "0", "If set to 1, sprites will be lit according to world lighting (including rtlights), like Tenebrae. Use EF_ADDITIVE or EF_FULLBRIGHT to make emissive sprites instead.");
|
cvar_t mod_litsprites = CVARD("mod_litsprites", "0", "If set to 1, sprites will be lit according to world lighting (including rtlights), like Tenebrae. Use EF_ADDITIVE or EF_FULLBRIGHT to make emissive sprites instead.");
|
||||||
|
cvar_t temp_lit2support = CVARD("temp_mod_lit2support", "0", "Set to 1 to enable lit2 support. This cvar will be removed once the format is finalised.");
|
||||||
#ifdef SERVERONLY
|
#ifdef SERVERONLY
|
||||||
cvar_t gl_overbright, gl_specular, gl_load24bit, r_replacemodels, gl_miptexLevel, r_fb_bmodels; //all of these can/should default to 0
|
cvar_t gl_overbright, gl_specular, gl_load24bit, r_replacemodels, gl_miptexLevel, r_fb_bmodels; //all of these can/should default to 0
|
||||||
cvar_t r_noframegrouplerp = CVARF ("r_noframegrouplerp", "0", CVAR_ARCHIVE);
|
cvar_t r_noframegrouplerp = CVARF ("r_noframegrouplerp", "0", CVAR_ARCHIVE);
|
||||||
|
@ -239,7 +240,7 @@ static void Mod_BlockTextureColour_f (void)
|
||||||
continue; //happens on e1m2
|
continue; //happens on e1m2
|
||||||
|
|
||||||
if (!stricmp(tx->name, match))
|
if (!stricmp(tx->name, match))
|
||||||
tx->shader->defaulttextures.base = Image_GetTexture(texname, NULL, IF_NOMIPMAP|IF_NEAREST, &rgba, NULL, 1, 1, TF_BGRA32);
|
tx->shader->defaulttextures->base = Image_GetTexture(texname, NULL, IF_NOMIPMAP|IF_NEAREST, &rgba, NULL, 1, 1, TF_BGRA32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,6 +556,7 @@ void Mod_Init (qboolean initial)
|
||||||
Cvar_Register(&mod_warnmodels, "Graphical Nicaties");
|
Cvar_Register(&mod_warnmodels, "Graphical Nicaties");
|
||||||
Cvar_Register(&mod_litsprites, "Graphical Nicaties");
|
Cvar_Register(&mod_litsprites, "Graphical Nicaties");
|
||||||
Cvar_Register(&mod_loadentfiles, NULL);
|
Cvar_Register(&mod_loadentfiles, NULL);
|
||||||
|
Cvar_Register(&temp_lit2support, NULL);
|
||||||
Cmd_AddCommand("version_modelformats", Mod_PrintFormats_f);
|
Cmd_AddCommand("version_modelformats", Mod_PrintFormats_f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1283,7 +1285,7 @@ void Mod_FinishTexture(texture_t *tx, const char *loadname)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(tx->name, "sky", 3))
|
if (!strncmp(tx->name, "sky", 3))
|
||||||
R_InitSky (&tx->shader->defaulttextures, shadername, tx->mips[0], tx->width, tx->height);
|
R_InitSky (tx->shader, shadername, tx->mips[0], tx->width, tx->height);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int maps = 0;
|
unsigned int maps = 0;
|
||||||
|
@ -1291,7 +1293,7 @@ void Mod_FinishTexture(texture_t *tx, const char *loadname)
|
||||||
maps |= SHADER_HASDIFFUSE;
|
maps |= SHADER_HASDIFFUSE;
|
||||||
if (r_fb_bmodels.ival)
|
if (r_fb_bmodels.ival)
|
||||||
maps |= SHADER_HASFULLBRIGHT;
|
maps |= SHADER_HASFULLBRIGHT;
|
||||||
if (r_loadbumpmapping || (r_waterstyle.ival > 1 && *tx->name == '*'))
|
if (r_loadbumpmapping || (r_waterstyle.ival > 1 && *tx->name == '*') || tx->shader->defaulttextures->reflectcube)
|
||||||
maps |= SHADER_HASNORMALMAP;
|
maps |= SHADER_HASNORMALMAP;
|
||||||
if (gl_specular.ival)
|
if (gl_specular.ival)
|
||||||
maps |= SHADER_HASGLOSS;
|
maps |= SHADER_HASGLOSS;
|
||||||
|
@ -1578,12 +1580,27 @@ void BuildLightMapGammaTable (float g, float c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int magic; //"QLIT"
|
||||||
|
unsigned int version; //2
|
||||||
|
unsigned int numsurfs;
|
||||||
|
unsigned int lmsize; //samples, not bytes (same size as vanilla lighting lump in a q1 bsp).
|
||||||
|
|
||||||
|
//uint lmoffsets[numsurfs]; //completely overrides the bsp lightmap info
|
||||||
|
//ushort lmextents[numsurfs*2]; //only to avoid precision issues. width+height pairs, actual lightmap sizes on disk (so +1).
|
||||||
|
//byte lmstyles[numsurfs*4]; //completely overrides the bsp lightmap info
|
||||||
|
//byte lmshifts[numsurfs]; //default is 4 (1<<4=16), for 1/16th lightmap-to-texel ratio
|
||||||
|
//byte litdata[lmsize*3]; //rgb data
|
||||||
|
//byte luxdata[lmsize*3]; //stn light dirs (unsigned bytes
|
||||||
|
} qlit2_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
Mod_LoadLighting
|
Mod_LoadLighting
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean interleaveddeluxe)
|
void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean interleaveddeluxe, lightmapoverrides_t *overrides)
|
||||||
{
|
{
|
||||||
qboolean luxtmp = true;
|
qboolean luxtmp = true;
|
||||||
qboolean littmp = true;
|
qboolean littmp = true;
|
||||||
|
@ -1628,6 +1645,145 @@ void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifndef SERVERONLY
|
#ifndef SERVERONLY
|
||||||
|
if (!litdata && r_loadlits.value)
|
||||||
|
{
|
||||||
|
char *litname;
|
||||||
|
char litnamemaps[MAX_QPATH];
|
||||||
|
char litnamelits[MAX_QPATH];
|
||||||
|
int depthmaps;
|
||||||
|
int depthlits;
|
||||||
|
size_t litsize;
|
||||||
|
qboolean inhibitvalidation = false;
|
||||||
|
|
||||||
|
{
|
||||||
|
Q_strncpyz(litnamemaps, loadmodel->name, sizeof(litnamelits));
|
||||||
|
COM_StripExtension(loadmodel->name, litnamemaps, sizeof(litnamemaps));
|
||||||
|
COM_DefaultExtension(litnamemaps, ".lit", sizeof(litnamemaps));
|
||||||
|
depthmaps = COM_FDepthFile(litnamemaps, false);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Q_strncpyz(litnamelits, "lits/", sizeof(litnamelits));
|
||||||
|
COM_StripExtension(COM_SkipPath(loadmodel->name), litnamelits+5, sizeof(litnamelits) - 5);
|
||||||
|
Q_strncatz(litnamelits, ".lit", sizeof(litnamelits));
|
||||||
|
depthlits = COM_FDepthFile(litnamelits, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (depthmaps <= depthlits)
|
||||||
|
litname = litnamemaps; //maps has priority over lits
|
||||||
|
else
|
||||||
|
litname = litnamelits;
|
||||||
|
|
||||||
|
litdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, litname, &litsize);
|
||||||
|
if (litdata)
|
||||||
|
{ //validate it, if we loaded one.
|
||||||
|
if (litdata[0] != 'Q' || litdata[1] != 'L' || litdata[2] != 'I' || litdata[3] != 'T')
|
||||||
|
{
|
||||||
|
litdata = NULL;
|
||||||
|
Con_Printf("lit \"%s\" isn't a lit\n", litname);
|
||||||
|
}
|
||||||
|
else if (LittleLong(*(int *)&litdata[4]) == 1 && l->filelen && samples*3 != (litsize-8))
|
||||||
|
{
|
||||||
|
litdata = NULL;
|
||||||
|
Con_Printf("lit \"%s\" doesn't match level. Ignored.\n", litname);
|
||||||
|
}
|
||||||
|
else if (LittleLong(*(int *)&litdata[4]) == 1)
|
||||||
|
{
|
||||||
|
//header+version
|
||||||
|
litdata += 8;
|
||||||
|
}
|
||||||
|
else if (LittleLong(*(int *)&litdata[4]) == 2 && overrides)
|
||||||
|
{
|
||||||
|
qlit2_t *ql2 = (qlit2_t*)litdata;
|
||||||
|
unsigned int *offsets = (unsigned int*)(ql2+1);
|
||||||
|
unsigned short *extents = (unsigned short*)(offsets+ql2->numsurfs);
|
||||||
|
unsigned char *styles = (unsigned char*)(extents+ql2->numsurfs*2);
|
||||||
|
unsigned char *shifts = (unsigned char*)(styles+ql2->numsurfs*4);
|
||||||
|
if (!temp_lit2support.ival)
|
||||||
|
{
|
||||||
|
litdata = NULL;
|
||||||
|
Con_Printf("lit2 support is disabled, pending format finalisation.\n", litname);
|
||||||
|
}
|
||||||
|
else if (loadmodel->numsurfaces != ql2->numsurfs)
|
||||||
|
{
|
||||||
|
litdata = NULL;
|
||||||
|
Con_Printf("lit \"%s\" doesn't match level. Ignored.\n", litname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inhibitvalidation = true;
|
||||||
|
|
||||||
|
//surface code needs to know the overrides.
|
||||||
|
overrides->offsets = offsets;
|
||||||
|
overrides->extents = extents;
|
||||||
|
overrides->styles = styles;
|
||||||
|
overrides->shifts = shifts;
|
||||||
|
|
||||||
|
//we're now using this amount of data.
|
||||||
|
samples = ql2->lmsize;
|
||||||
|
|
||||||
|
litdata = shifts+ql2->numsurfs;
|
||||||
|
if (r_deluxemapping.ival)
|
||||||
|
luxdata = litdata+samples*3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Con_Printf("lit \"%s\" isn't version 1 or 2.\n", litname);
|
||||||
|
litdata = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
littmp = false;
|
||||||
|
if (!litdata)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
/*FIXME: bspx support for extents+lmscale, may require style+offset lumps too, not sure what to do here*/
|
||||||
|
litdata = Q1BSPX_FindLump("RGBLIGHTING", &size);
|
||||||
|
if (size != samples*3)
|
||||||
|
litdata = NULL;
|
||||||
|
littmp = true;
|
||||||
|
}
|
||||||
|
else if (!inhibitvalidation)
|
||||||
|
{
|
||||||
|
if (lumdata)
|
||||||
|
{
|
||||||
|
float prop;
|
||||||
|
int i;
|
||||||
|
qbyte *lum;
|
||||||
|
qbyte *lit;
|
||||||
|
|
||||||
|
//now some cheat protection.
|
||||||
|
lum = lumdata;
|
||||||
|
lit = litdata;
|
||||||
|
|
||||||
|
for (i = 0; i < samples; i++) //force it to the same intensity. (or less, depending on how you see it...)
|
||||||
|
{
|
||||||
|
#define m(a, b, c) (a>(b>c?b:c)?a:(b>c?b:c))
|
||||||
|
prop = (float)m(lit[0], lit[1], lit[2]);
|
||||||
|
|
||||||
|
if (!prop)
|
||||||
|
{
|
||||||
|
lit[0] = *lum;
|
||||||
|
lit[1] = *lum;
|
||||||
|
lit[2] = *lum;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prop = *lum / prop;
|
||||||
|
lit[0] *= prop;
|
||||||
|
lit[1] *= prop;
|
||||||
|
lit[2] *= prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
lum++;
|
||||||
|
lit+=3;
|
||||||
|
}
|
||||||
|
//end anti-cheat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!luxdata && r_loadlits.ival && r_deluxemapping.ival)
|
if (!luxdata && r_loadlits.ival && r_deluxemapping.ival)
|
||||||
{ //the map util has a '-scalecos X' parameter. use 0 if you're going to use only just lux. without lux scalecos 0 is hideous.
|
{ //the map util has a '-scalecos X' parameter. use 0 if you're going to use only just lux. without lux scalecos 0 is hideous.
|
||||||
char luxname[MAX_QPATH];
|
char luxname[MAX_QPATH];
|
||||||
|
@ -1690,104 +1846,6 @@ void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!litdata && r_loadlits.value)
|
|
||||||
{
|
|
||||||
char *litname;
|
|
||||||
char litnamemaps[MAX_QPATH];
|
|
||||||
char litnamelits[MAX_QPATH];
|
|
||||||
int depthmaps;
|
|
||||||
int depthlits;
|
|
||||||
size_t litsize;
|
|
||||||
|
|
||||||
{
|
|
||||||
Q_strncpyz(litnamemaps, loadmodel->name, sizeof(litnamelits));
|
|
||||||
COM_StripExtension(loadmodel->name, litnamemaps, sizeof(litnamemaps));
|
|
||||||
COM_DefaultExtension(litnamemaps, ".lit", sizeof(litnamemaps));
|
|
||||||
depthmaps = COM_FDepthFile(litnamemaps, false);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Q_strncpyz(litnamelits, "lits/", sizeof(litnamelits));
|
|
||||||
COM_StripExtension(COM_SkipPath(loadmodel->name), litnamelits+5, sizeof(litnamelits) - 5);
|
|
||||||
Q_strncatz(litnamelits, ".lit", sizeof(litnamelits));
|
|
||||||
depthlits = COM_FDepthFile(litnamelits, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (depthmaps <= depthlits)
|
|
||||||
litname = litnamemaps; //maps has priority over lits
|
|
||||||
else
|
|
||||||
litname = litnamelits;
|
|
||||||
|
|
||||||
litdata = FS_LoadMallocGroupFile(&loadmodel->memgroup, litname, &litsize);
|
|
||||||
if (litdata)
|
|
||||||
{ //validate it, if we loaded one.
|
|
||||||
if (litdata[0] != 'Q' || litdata[1] != 'L' || litdata[2] != 'I' || litdata[3] != 'T')
|
|
||||||
{
|
|
||||||
litdata = NULL;
|
|
||||||
Con_Printf("lit \"%s\" isn't a lit\n", litname);
|
|
||||||
}
|
|
||||||
else if (LittleLong(*(int *)&litdata[4]) == 1 && l->filelen && samples*3 != (litsize-8))
|
|
||||||
{
|
|
||||||
litdata = NULL;
|
|
||||||
Con_Printf("lit \"%s\" doesn't match level. Ignored.\n", litname);
|
|
||||||
}
|
|
||||||
else if (LittleLong(*(int *)&litdata[4]) != 1)
|
|
||||||
{
|
|
||||||
Con_Printf("lit \"%s\" isn't version 1.\n", litname);
|
|
||||||
litdata = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
littmp = false;
|
|
||||||
if (!litdata)
|
|
||||||
{
|
|
||||||
int size;
|
|
||||||
litdata = Q1BSPX_FindLump("RGBLIGHTING", &size);
|
|
||||||
if (size != samples*3)
|
|
||||||
litdata = NULL;
|
|
||||||
littmp = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (lumdata)
|
|
||||||
{
|
|
||||||
float prop;
|
|
||||||
int i;
|
|
||||||
qbyte *lum;
|
|
||||||
qbyte *lit;
|
|
||||||
|
|
||||||
litdata += 8;
|
|
||||||
|
|
||||||
//now some cheat protection.
|
|
||||||
lum = lumdata;
|
|
||||||
lit = litdata;
|
|
||||||
|
|
||||||
for (i = 0; i < samples; i++) //force it to the same intensity. (or less, depending on how you see it...)
|
|
||||||
{
|
|
||||||
#define m(a, b, c) (a>(b>c?b:c)?a:(b>c?b:c))
|
|
||||||
prop = (float)m(lit[0], lit[1], lit[2]);
|
|
||||||
|
|
||||||
if (!prop)
|
|
||||||
{
|
|
||||||
lit[0] = *lum;
|
|
||||||
lit[1] = *lum;
|
|
||||||
lit[2] = *lum;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
prop = *lum / prop;
|
|
||||||
lit[0] *= prop;
|
|
||||||
lit[1] *= prop;
|
|
||||||
lit[2] *= prop;
|
|
||||||
}
|
|
||||||
|
|
||||||
lum++;
|
|
||||||
lit+=3;
|
|
||||||
}
|
|
||||||
//end anti-cheat
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RUNTIMELIGHTING
|
#ifdef RUNTIMELIGHTING
|
||||||
|
@ -1865,6 +1923,7 @@ void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
}
|
}
|
||||||
|
|
||||||
/*apply lightmap gamma to the entire lightmap*/
|
/*apply lightmap gamma to the entire lightmap*/
|
||||||
|
loadmodel->lightdatasize = samples;
|
||||||
out = loadmodel->lightdata;
|
out = loadmodel->lightdata;
|
||||||
if (interleaveddeluxe)
|
if (interleaveddeluxe)
|
||||||
{
|
{
|
||||||
|
@ -2302,17 +2361,21 @@ void CalcSurfaceExtents (model_t *mod, msurface_t *s);
|
||||||
Mod_LoadFaces
|
Mod_LoadFaces
|
||||||
=================
|
=================
|
||||||
*/
|
*/
|
||||||
qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean lm)
|
qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, lump_t *lightlump, qboolean lm)
|
||||||
{
|
{
|
||||||
dsface_t *ins;
|
dsface_t *ins;
|
||||||
dlface_t *inl;
|
dlface_t *inl;
|
||||||
msurface_t *out;
|
msurface_t *out;
|
||||||
int count, surfnum;
|
int count, surfnum;
|
||||||
int i, planenum, side;
|
int i, planenum, side;
|
||||||
int tn, lofs;
|
int tn;
|
||||||
|
unsigned int lofs, lend;
|
||||||
|
|
||||||
unsigned short lmshift, lmscale;
|
unsigned short lmshift, lmscale;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
lightmapoverrides_t overrides;
|
||||||
|
|
||||||
|
memset(&overrides, 0, sizeof(overrides));
|
||||||
|
|
||||||
lmscale = atoi(Mod_ParseWorldspawnKey(loadmodel->entities, "lightmap_scale", buf, sizeof(buf)));
|
lmscale = atoi(Mod_ParseWorldspawnKey(loadmodel->entities, "lightmap_scale", buf, sizeof(buf)));
|
||||||
if (!lmscale)
|
if (!lmscale)
|
||||||
|
@ -2350,6 +2413,9 @@ qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
// *meshlist = ZG_Malloc(&loadmodel->memgroup, count*sizeof(**meshlist));
|
// *meshlist = ZG_Malloc(&loadmodel->memgroup, count*sizeof(**meshlist));
|
||||||
loadmodel->surfaces = out;
|
loadmodel->surfaces = out;
|
||||||
loadmodel->numsurfaces = count;
|
loadmodel->numsurfaces = count;
|
||||||
|
|
||||||
|
Mod_LoadLighting (loadmodel, mod_base, lightlump, false, &overrides);
|
||||||
|
|
||||||
for ( surfnum=0 ; surfnum<count ; surfnum++, out++)
|
for ( surfnum=0 ; surfnum<count ; surfnum++, out++)
|
||||||
{
|
{
|
||||||
if (lm)
|
if (lm)
|
||||||
|
@ -2371,7 +2437,7 @@ qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
out->firstedge = LittleLong(ins->firstedge);
|
out->firstedge = LittleLong(ins->firstedge);
|
||||||
out->numedges = LittleShort(ins->numedges);
|
out->numedges = LittleShort(ins->numedges);
|
||||||
tn = LittleShort (ins->texinfo);
|
tn = LittleShort (ins->texinfo);
|
||||||
for (i=0 ; i<MAXQ1LIGHTMAPS ; i++)
|
for (i=0 ; i<MAXRLIGHTMAPS ; i++)
|
||||||
out->styles[i] = ins->styles[i];
|
out->styles[i] = ins->styles[i];
|
||||||
lofs = LittleLong(ins->lightofs);
|
lofs = LittleLong(ins->lightofs);
|
||||||
ins++;
|
ins++;
|
||||||
|
@ -2392,13 +2458,22 @@ qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
}
|
}
|
||||||
out->texinfo = loadmodel->texinfo + tn;
|
out->texinfo = loadmodel->texinfo + tn;
|
||||||
|
|
||||||
|
if (overrides.shifts)
|
||||||
|
out->lmshift = overrides.shifts[surfnum];
|
||||||
|
else
|
||||||
out->lmshift = lmshift;
|
out->lmshift = lmshift;
|
||||||
|
if (overrides.offsets)
|
||||||
|
lofs = overrides.offsets[surfnum];
|
||||||
|
if (overrides.styles)
|
||||||
|
for (i=0 ; i<MAXRLIGHTMAPS ; i++)
|
||||||
|
out->styles[i] = overrides.styles[surfnum*4+i];
|
||||||
|
|
||||||
CalcSurfaceExtents (loadmodel, out);
|
CalcSurfaceExtents (loadmodel, out);
|
||||||
if (lofs == -1)
|
if (lofs != (unsigned int)-1 && (loadmodel->engineflags & MDLF_RGBLIGHTING) && loadmodel->fromgame != fg_halflife)
|
||||||
out->samples = NULL;
|
lofs *= 3;
|
||||||
else if ((loadmodel->engineflags & MDLF_RGBLIGHTING) && loadmodel->fromgame != fg_halflife)
|
lend = lofs+(out->extents[0]+1)*(out->extents[1]+1);
|
||||||
out->samples = loadmodel->lightdata + lofs*3;
|
if (lofs > loadmodel->lightdatasize || lend < lofs)
|
||||||
|
out->samples = NULL; //should includes -1
|
||||||
else
|
else
|
||||||
out->samples = loadmodel->lightdata + lofs;
|
out->samples = loadmodel->lightdata + lofs;
|
||||||
|
|
||||||
|
@ -2447,7 +2522,7 @@ qboolean Mod_LoadFaces (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SERVERONLY
|
#ifndef SERVERONLY
|
||||||
void ModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, void *cookie)
|
void ModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, builddata_t *cookie)
|
||||||
{
|
{
|
||||||
unsigned int vertidx;
|
unsigned int vertidx;
|
||||||
int i, lindex;
|
int i, lindex;
|
||||||
|
@ -2456,6 +2531,7 @@ void ModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, void *cookie)
|
||||||
float *vec;
|
float *vec;
|
||||||
float s, t, d;
|
float s, t, d;
|
||||||
int sty;
|
int sty;
|
||||||
|
int w,h;
|
||||||
|
|
||||||
//output the mesh's indicies
|
//output the mesh's indicies
|
||||||
for (i=0 ; i<mesh->numvertexes-2 ; i++)
|
for (i=0 ; i<mesh->numvertexes-2 ; i++)
|
||||||
|
@ -2485,8 +2561,18 @@ void ModQ1_Batches_BuildQ1Q2Poly(model_t *mod, msurface_t *surf, void *cookie)
|
||||||
t = DotProduct (vec, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3];
|
t = DotProduct (vec, surf->texinfo->vecs[1]) + surf->texinfo->vecs[1][3];
|
||||||
|
|
||||||
VectorCopy (vec, mesh->xyz_array[i]);
|
VectorCopy (vec, mesh->xyz_array[i]);
|
||||||
|
|
||||||
|
/* if (R_GetShaderSizes(surf->texinfo->texture->shader, &w, &h, false) > 0)
|
||||||
|
{
|
||||||
|
mesh->st_array[i][0] = s/w;
|
||||||
|
mesh->st_array[i][1] = t/h;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*/
|
||||||
|
{
|
||||||
mesh->st_array[i][0] = s/surf->texinfo->texture->width;
|
mesh->st_array[i][0] = s/surf->texinfo->texture->width;
|
||||||
mesh->st_array[i][1] = t/surf->texinfo->texture->height;
|
mesh->st_array[i][1] = t/surf->texinfo->texture->height;
|
||||||
|
}
|
||||||
|
|
||||||
if (gl_lightmap_average.ival)
|
if (gl_lightmap_average.ival)
|
||||||
{
|
{
|
||||||
|
@ -4433,9 +4519,6 @@ qboolean QDECL Mod_LoadBrushModel (model_t *mod, void *buffer, size_t fsize)
|
||||||
{
|
{
|
||||||
TRACE(("Loading Textures\n"));
|
TRACE(("Loading Textures\n"));
|
||||||
noerrors = noerrors && Mod_LoadTextures (mod, mod_base, &header->lumps[LUMP_TEXTURES]);
|
noerrors = noerrors && Mod_LoadTextures (mod, mod_base, &header->lumps[LUMP_TEXTURES]);
|
||||||
TRACE(("Loading Lighting\n"));
|
|
||||||
if (noerrors)
|
|
||||||
Mod_LoadLighting (mod, mod_base, &header->lumps[LUMP_LIGHTING], false);
|
|
||||||
}
|
}
|
||||||
TRACE(("Loading Submodels\n"));
|
TRACE(("Loading Submodels\n"));
|
||||||
noerrors = noerrors && Mod_LoadSubmodels (mod, mod_base, &header->lumps[LUMP_MODELS]);
|
noerrors = noerrors && Mod_LoadSubmodels (mod, mod_base, &header->lumps[LUMP_MODELS]);
|
||||||
|
@ -4453,7 +4536,7 @@ qboolean QDECL Mod_LoadBrushModel (model_t *mod, void *buffer, size_t fsize)
|
||||||
TRACE(("Loading Texinfo\n"));
|
TRACE(("Loading Texinfo\n"));
|
||||||
noerrors = noerrors && Mod_LoadTexinfo (mod, mod_base, &header->lumps[LUMP_TEXINFO]);
|
noerrors = noerrors && Mod_LoadTexinfo (mod, mod_base, &header->lumps[LUMP_TEXINFO]);
|
||||||
TRACE(("Loading Faces\n"));
|
TRACE(("Loading Faces\n"));
|
||||||
noerrors = noerrors && Mod_LoadFaces (mod, mod_base, &header->lumps[LUMP_FACES], longm);
|
noerrors = noerrors && Mod_LoadFaces (mod, mod_base, &header->lumps[LUMP_FACES], &header->lumps[LUMP_LIGHTING], longm);
|
||||||
}
|
}
|
||||||
if (!isDedicated)
|
if (!isDedicated)
|
||||||
{
|
{
|
||||||
|
@ -4678,7 +4761,7 @@ void Mod_LoadSpriteFrameShader(model_t *spr, int frame, int subframe, mspritefra
|
||||||
else
|
else
|
||||||
shadertext = SPRITE_SHADER_MAIN SPRITE_SHADER_UNLIT SPRITE_SHADER_FOOTER;
|
shadertext = SPRITE_SHADER_MAIN SPRITE_SHADER_UNLIT SPRITE_SHADER_FOOTER;
|
||||||
frameinfo->shader = R_RegisterShader(name, SUF_NONE, shadertext);
|
frameinfo->shader = R_RegisterShader(name, SUF_NONE, shadertext);
|
||||||
frameinfo->shader->defaulttextures.base = frameinfo->image;
|
frameinfo->shader->defaulttextures->base = frameinfo->image;
|
||||||
frameinfo->shader->width = frameinfo->right-frameinfo->left;
|
frameinfo->shader->width = frameinfo->right-frameinfo->left;
|
||||||
frameinfo->shader->height = frameinfo->up-frameinfo->down;
|
frameinfo->shader->height = frameinfo->up-frameinfo->down;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -929,6 +929,7 @@ typedef struct model_s
|
||||||
void *vis;
|
void *vis;
|
||||||
qbyte *lightdata;
|
qbyte *lightdata;
|
||||||
qbyte *deluxdata;
|
qbyte *deluxdata;
|
||||||
|
unsigned lightdatasize;
|
||||||
q3lightgridinfo_t *lightgrid;
|
q3lightgridinfo_t *lightgrid;
|
||||||
mfog_t *fogs;
|
mfog_t *fogs;
|
||||||
int numfogs;
|
int numfogs;
|
||||||
|
|
|
@ -197,5 +197,5 @@ void R_NetgraphInit(void)
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
netgraphshader->defaulttextures.base = netgraphtexture;
|
netgraphshader->defaulttextures->base = netgraphtexture;
|
||||||
}
|
}
|
||||||
|
|
|
@ -408,7 +408,7 @@ void R_RenderDlights (void)
|
||||||
if (!R_BuildDlightMesh (l, intensity, cscale, coronastyle) && !coronastyle)
|
if (!R_BuildDlightMesh (l, intensity, cscale, coronastyle) && !coronastyle)
|
||||||
AddLightBlend (l->color[0], l->color[1], l->color[2], l->radius * 0.0003);
|
AddLightBlend (l->color[0], l->color[1], l->color[2], l->radius * 0.0003);
|
||||||
else
|
else
|
||||||
BE_DrawMesh_Single(flashblend_shader, &flashblend_mesh, NULL, &flashblend_shader->defaulttextures, (coronastyle?BEF_FORCENODEPTH|BEF_FORCEADDITIVE:0)|beflags);
|
BE_DrawMesh_Single(flashblend_shader, &flashblend_mesh, NULL, (coronastyle?BEF_FORCENODEPTH|BEF_FORCEADDITIVE:0)|beflags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,7 +481,7 @@ void R_GenDlightBatches(batch_t *batches[])
|
||||||
b->mesh = NULL;
|
b->mesh = NULL;
|
||||||
b->firstmesh = 0;
|
b->firstmesh = 0;
|
||||||
b->meshes = 1;
|
b->meshes = 1;
|
||||||
b->skin = &lpplight_shader->defaulttextures;
|
b->skin = NULL;
|
||||||
b->texture = NULL;
|
b->texture = NULL;
|
||||||
b->shader = lpplight_shader;
|
b->shader = lpplight_shader;
|
||||||
for (j = 0; j < MAXRLIGHTMAPS; j++)
|
for (j = 0; j < MAXRLIGHTMAPS; j++)
|
||||||
|
|
|
@ -122,8 +122,8 @@ void GL_InitSceneProcessingShaders_WaterWarp (void)
|
||||||
"}\n"
|
"}\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
scenepp_waterwarp->defaulttextures.upperoverlay = scenepp_texture_warp;
|
scenepp_waterwarp->defaulttextures->upperoverlay = scenepp_texture_warp;
|
||||||
scenepp_waterwarp->defaulttextures.loweroverlay = scenepp_texture_edge;
|
scenepp_waterwarp->defaulttextures->loweroverlay = scenepp_texture_edge;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -236,16 +236,6 @@ texid_t GenerateNormalisationCubeMap(void)
|
||||||
texid_t normalisationCubeMap;
|
texid_t normalisationCubeMap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
===============
|
|
||||||
R_Init
|
|
||||||
===============
|
|
||||||
*/
|
|
||||||
void GLR_ReInit (void)
|
|
||||||
{
|
|
||||||
R_NetgraphInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -473,8 +463,6 @@ void GLR_Init (void)
|
||||||
Cmd_AddCommand ("timerefresh", GLR_TimeRefresh_f);
|
Cmd_AddCommand ("timerefresh", GLR_TimeRefresh_f);
|
||||||
|
|
||||||
// Cmd_AddCommand ("makewad", R_MakeTexWad_f);
|
// Cmd_AddCommand ("makewad", R_MakeTexWad_f);
|
||||||
|
|
||||||
GLR_ReInit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -41,6 +41,7 @@ sh_config_t sh_config;
|
||||||
|
|
||||||
//cvars that affect shader generation
|
//cvars that affect shader generation
|
||||||
cvar_t r_vertexlight = CVARFD("r_vertexlight", "0", CVAR_SHADERSYSTEM, "Hack loaded shaders to remove detail pass and lightmap sampling for faster rendering.");
|
cvar_t r_vertexlight = CVARFD("r_vertexlight", "0", CVAR_SHADERSYSTEM, "Hack loaded shaders to remove detail pass and lightmap sampling for faster rendering.");
|
||||||
|
cvar_t r_forceprogramify = CVARAFD("r_forceprogramify", "0", "dpcompat_makeshitup", CVAR_SHADERSYSTEM, "Reduce the shader to a single texture, and then make stuff up about its mother. The resulting fist fight results in more colour when you shine a light upon its face.\nSet to 2 to ignore 'depthfunc equal' and 'tcmod scale' in order to tolerate bizzare shaders made for a bizzare engine.");
|
||||||
extern cvar_t r_glsl_offsetmapping_reliefmapping;
|
extern cvar_t r_glsl_offsetmapping_reliefmapping;
|
||||||
extern cvar_t r_deluxemapping;
|
extern cvar_t r_deluxemapping;
|
||||||
extern cvar_t r_fastturb, r_fastsky, r_skyboxname, r_softwarebanding;
|
extern cvar_t r_fastturb, r_fastsky, r_skyboxname, r_softwarebanding;
|
||||||
|
@ -633,12 +634,14 @@ static int Shader_SetImageFlags(shader_t *shader, shaderpass_t *pass, char **nam
|
||||||
{
|
{
|
||||||
*name+=9;
|
*name+=9;
|
||||||
flags|= IF_NEAREST;
|
flags|= IF_NEAREST;
|
||||||
|
if (pass)
|
||||||
pass->flags |= SHADER_PASS_NEAREST;
|
pass->flags |= SHADER_PASS_NEAREST;
|
||||||
}
|
}
|
||||||
else if (!Q_strnicmp(*name, "$linear:", 8))
|
else if (!Q_strnicmp(*name, "$linear:", 8))
|
||||||
{
|
{
|
||||||
*name+=8;
|
*name+=8;
|
||||||
flags|= IF_LINEAR;
|
flags|= IF_LINEAR;
|
||||||
|
if (pass)
|
||||||
pass->flags |= SHADER_PASS_LINEAR;
|
pass->flags |= SHADER_PASS_LINEAR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -651,6 +654,7 @@ static int Shader_SetImageFlags(shader_t *shader, shaderpass_t *pass, char **nam
|
||||||
flags |= IF_NOMIPMAP;
|
flags |= IF_NOMIPMAP;
|
||||||
if (shader->flags & SHADER_NOPICMIP)
|
if (shader->flags & SHADER_NOPICMIP)
|
||||||
flags |= IF_NOPICMIP;
|
flags |= IF_NOPICMIP;
|
||||||
|
flags |= IF_MIPCAP;
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
@ -685,6 +689,7 @@ texid_t R_LoadColourmapImage(void)
|
||||||
|
|
||||||
static texid_t Shader_FindImage ( char *name, int flags )
|
static texid_t Shader_FindImage ( char *name, int flags )
|
||||||
{
|
{
|
||||||
|
extern texid_t missing_texture_normal;
|
||||||
if (parsestate.mode == SPM_DOOM3)
|
if (parsestate.mode == SPM_DOOM3)
|
||||||
{
|
{
|
||||||
if (!Q_stricmp (name, "_default"))
|
if (!Q_stricmp (name, "_default"))
|
||||||
|
@ -701,6 +706,13 @@ static texid_t Shader_FindImage ( char *name, int flags )
|
||||||
{
|
{
|
||||||
if (!Q_stricmp (name, "$whiteimage"))
|
if (!Q_stricmp (name, "$whiteimage"))
|
||||||
return r_whiteimage;
|
return r_whiteimage;
|
||||||
|
if (!Q_stricmp (name, "$blackimage"))
|
||||||
|
{
|
||||||
|
int wibuf[16] = {0};
|
||||||
|
return R_LoadTexture("$blackimage", 4, 4, TF_RGBA32, wibuf, IF_NOMIPMAP|IF_NOPICMIP|IF_NEAREST|IF_NOGAMMA);
|
||||||
|
}
|
||||||
|
if (!Q_stricmp (name, "$identitynormal"))
|
||||||
|
return missing_texture_normal;
|
||||||
if (!Q_stricmp (name, "$colourmap"))
|
if (!Q_stricmp (name, "$colourmap"))
|
||||||
return R_LoadColourmapImage();
|
return R_LoadColourmapImage();
|
||||||
}
|
}
|
||||||
|
@ -954,7 +966,7 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip
|
||||||
"#define BUMP\n",
|
"#define BUMP\n",
|
||||||
"#define FULLBRIGHT\n",
|
"#define FULLBRIGHT\n",
|
||||||
"#define UPPERLOWER\n",
|
"#define UPPERLOWER\n",
|
||||||
"#define DELUXE\n",
|
"#define REFLECTCUBEMASK\n",
|
||||||
"#define SKELETAL\n",
|
"#define SKELETAL\n",
|
||||||
"#define FOG\n",
|
"#define FOG\n",
|
||||||
"#define FRAMEBLEND\n",
|
"#define FRAMEBLEND\n",
|
||||||
|
@ -1095,6 +1107,7 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip
|
||||||
{
|
{
|
||||||
//we 'recognise' ones that are force-defined, despite not being actual permutations.
|
//we 'recognise' ones that are force-defined, despite not being actual permutations.
|
||||||
if (strncmp("SPECULAR", script, end - script))
|
if (strncmp("SPECULAR", script, end - script))
|
||||||
|
if (strncmp("DELUXE", script, end - script))
|
||||||
if (strncmp("OFFSETMAPPING", script, end - script))
|
if (strncmp("OFFSETMAPPING", script, end - script))
|
||||||
if (strncmp("RELIEFMAPPING", script, end - script))
|
if (strncmp("RELIEFMAPPING", script, end - script))
|
||||||
Con_DPrintf("Unknown pemutation in glsl program %s\n", name);
|
Con_DPrintf("Unknown pemutation in glsl program %s\n", name);
|
||||||
|
@ -1289,6 +1302,9 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip
|
||||||
if (r_glsl_offsetmapping_reliefmapping.ival && (p & PERMUTATION_BUMPMAP))
|
if (r_glsl_offsetmapping_reliefmapping.ival && (p & PERMUTATION_BUMPMAP))
|
||||||
permutationdefines[pn++] = "#define RELIEFMAPPING\n";
|
permutationdefines[pn++] = "#define RELIEFMAPPING\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r_deluxemapping.ival) //fixme: should be per-model really
|
||||||
|
permutationdefines[pn++] = "#define DELUXE\n";
|
||||||
}
|
}
|
||||||
permutationdefines[pn++] = NULL;
|
permutationdefines[pn++] = NULL;
|
||||||
|
|
||||||
|
@ -1903,41 +1919,54 @@ static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **p
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Shader_ReflectCube(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
|
{
|
||||||
|
char *token = Shader_ParseString(ptr);
|
||||||
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
|
shader->defaulttextures->reflectcube = Shader_FindImage(token, flags|IF_CUBEMAP);
|
||||||
|
}
|
||||||
|
static void Shader_ReflectMask(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
|
{
|
||||||
|
char *token = Shader_ParseString(ptr);
|
||||||
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
|
shader->defaulttextures->reflectmask = Shader_FindImage(token, flags);
|
||||||
|
}
|
||||||
|
|
||||||
static void Shader_DiffuseMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_DiffuseMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.base = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->base = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
static void Shader_SpecularMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_SpecularMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.specular = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->specular = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
static void Shader_BumpMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_NormalMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.bump = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->bump = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
static void Shader_FullbrightMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_FullbrightMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.fullbright = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->fullbright = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
static void Shader_UpperMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_UpperMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.upperoverlay = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->upperoverlay = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
static void Shader_LowerMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
static void Shader_LowerMap(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token = Shader_ParseString(ptr);
|
||||||
token = Shader_ParseString(ptr);
|
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
|
||||||
shader->defaulttextures.loweroverlay = R_LoadHiResTexture(token, NULL, 0);
|
shader->defaulttextures->loweroverlay = Shader_FindImage(token, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static qboolean Shaderpass_MapGen (shader_t *shader, shaderpass_t *pass, char *tname);
|
static qboolean Shaderpass_MapGen (shader_t *shader, shaderpass_t *pass, char *tname);
|
||||||
|
@ -2074,16 +2103,21 @@ static shaderkey_t shaderkeys[] =
|
||||||
|
|
||||||
{"bemode", Shader_BEMode, "fte"},
|
{"bemode", Shader_BEMode, "fte"},
|
||||||
|
|
||||||
|
{"diffusemap", Shader_DiffuseMap, "fte"},
|
||||||
|
{"normalmap", Shader_NormalMap, "fte"},
|
||||||
|
{"specularmap", Shader_SpecularMap, "fte"},
|
||||||
|
{"fullbrightmap", Shader_FullbrightMap, "fte"},
|
||||||
|
{"uppermap", Shader_UpperMap, "fte"},
|
||||||
|
{"lowermap", Shader_LowerMap, "fte"},
|
||||||
|
{"reflectmask", Shader_ReflectMask, "fte"},
|
||||||
|
|
||||||
//dp compat
|
//dp compat
|
||||||
{"camera", Shader_DP_Camera, "dp"},
|
{"camera", Shader_DP_Camera, "dp"},
|
||||||
|
{"reflectcube", Shader_ReflectCube, "dp"},
|
||||||
|
|
||||||
/*doom3 compat*/
|
/*doom3 compat*/
|
||||||
{"diffusemap", Shader_DiffuseMap, "doom3"}, //macro for "{\nstage diffusemap\nmap <map>\n}"
|
{"diffusemap", Shader_DiffuseMap, "doom3"}, //macro for "{\nstage diffusemap\nmap <map>\n}"
|
||||||
{"bumpmap", Shader_BumpMap, "doom3"}, //macro for "{\nstage bumpmap\nmap <map>\n}"
|
{"bumpmap", Shader_NormalMap, "doom3"}, //macro for "{\nstage bumpmap\nmap <map>\n}"
|
||||||
{"specularmap", Shader_SpecularMap, "doom3"},//macro for "{\nstage specularmap\nmap <map>\n}"
|
|
||||||
{"fullbrightmap", Shader_FullbrightMap, "doom3"},//macro for "{\nstage specularmap\nmap <map>\n}"
|
|
||||||
{"uppermap", Shader_UpperMap, "doom3"},//macro for "{\nstage specularmap\nmap <map>\n}"
|
|
||||||
{"lowermap", Shader_LowerMap, "doom3"},//macro for "{\nstage specularmap\nmap <map>\n}"
|
|
||||||
{"discrete", NULL, "doom3"},
|
{"discrete", NULL, "doom3"},
|
||||||
{"nonsolid", NULL, "doom3"},
|
{"nonsolid", NULL, "doom3"},
|
||||||
{"noimpact", NULL, "doom3"},
|
{"noimpact", NULL, "doom3"},
|
||||||
|
@ -2250,8 +2284,8 @@ static void Shaderpass_Map (shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||||
|
|
||||||
if (pass->tcgen == TC_GEN_UNSPECIFIED)
|
if (pass->tcgen == TC_GEN_UNSPECIFIED)
|
||||||
pass->tcgen = TC_GEN_BASE;
|
pass->tcgen = TC_GEN_BASE;
|
||||||
if (!*shader->mapname && *token != '$' && pass->tcgen == TC_GEN_BASE)
|
if (!*shader->defaulttextures->mapname && *token != '$' && pass->tcgen == TC_GEN_BASE)
|
||||||
Q_strncpyz(shader->mapname, token, sizeof(shader->mapname));
|
Q_strncpyz(shader->defaulttextures->mapname, token, sizeof(shader->defaulttextures->mapname));
|
||||||
pass->anim_frames[0] = Shader_FindImage (token, flags);
|
pass->anim_frames[0] = Shader_FindImage (token, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2261,6 +2295,7 @@ static void Shaderpass_AnimMap (shader_t *shader, shaderpass_t *pass, char **ptr
|
||||||
int flags;
|
int flags;
|
||||||
char *token;
|
char *token;
|
||||||
texid_t image;
|
texid_t image;
|
||||||
|
qboolean isdiffuse = false;
|
||||||
|
|
||||||
flags = Shader_SetImageFlags (shader, pass, NULL);
|
flags = Shader_SetImageFlags (shader, pass, NULL);
|
||||||
|
|
||||||
|
@ -2279,10 +2314,27 @@ static void Shaderpass_AnimMap (shader_t *shader, shaderpass_t *pass, char **ptr
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pass->anim_numframes && !*shader->defaulttextures->mapname && *token != '$' && pass->tcgen == TC_GEN_BASE)
|
||||||
|
{
|
||||||
|
isdiffuse = true;
|
||||||
|
shader->defaulttextures_fps = pass->anim_fps;
|
||||||
|
}
|
||||||
|
|
||||||
if (pass->anim_numframes < SHADER_MAX_ANIMFRAMES)
|
if (pass->anim_numframes < SHADER_MAX_ANIMFRAMES)
|
||||||
{
|
{
|
||||||
image = Shader_FindImage (token, flags);
|
image = Shader_FindImage (token, flags);
|
||||||
|
|
||||||
|
if (isdiffuse)
|
||||||
|
{
|
||||||
|
if (shader->numdefaulttextures < pass->anim_numframes+1)
|
||||||
|
{
|
||||||
|
int newmax = pass->anim_numframes+1;
|
||||||
|
shader->defaulttextures = BZ_Realloc(shader->defaulttextures, sizeof(*shader->defaulttextures) * (newmax));
|
||||||
|
memset(shader->defaulttextures+shader->numdefaulttextures, 0, sizeof(*shader->defaulttextures) * (newmax-shader->numdefaulttextures));
|
||||||
|
shader->numdefaulttextures = newmax;
|
||||||
|
}
|
||||||
|
Q_strncpyz(shader->defaulttextures[pass->anim_numframes].mapname, token, sizeof(shader->defaulttextures[pass->anim_numframes].mapname));
|
||||||
|
}
|
||||||
if (!TEXVALID(image))
|
if (!TEXVALID(image))
|
||||||
{
|
{
|
||||||
pass->anim_frames[pass->anim_numframes++] = missing_texture;
|
pass->anim_frames[pass->anim_numframes++] = missing_texture;
|
||||||
|
@ -2975,7 +3027,8 @@ void Shader_Free (shader_t *shader)
|
||||||
}
|
}
|
||||||
shader->uses = 0;
|
shader->uses = 0;
|
||||||
|
|
||||||
memset(&shader->defaulttextures, 0, sizeof(shader->defaulttextures));
|
Z_Free(shader->defaulttextures);
|
||||||
|
shader->defaulttextures = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3188,12 +3241,15 @@ void Shader_Reset(shader_t *s)
|
||||||
int uses = s->uses;
|
int uses = s->uses;
|
||||||
shader_gen_t *defaultgen = s->generator;
|
shader_gen_t *defaultgen = s->generator;
|
||||||
char *genargs = s->genargs;
|
char *genargs = s->genargs;
|
||||||
texnums_t dt = s->defaulttextures;
|
texnums_t *dt = s->defaulttextures;
|
||||||
|
int dtcount = s->numdefaulttextures;
|
||||||
|
float dtrate = s->defaulttextures_fps; //FIXME!
|
||||||
int w = s->width;
|
int w = s->width;
|
||||||
int h = s->height;
|
int h = s->height;
|
||||||
unsigned int uf = s->usageflags;
|
unsigned int uf = s->usageflags;
|
||||||
Q_strncpyz(name, s->name, sizeof(name));
|
Q_strncpyz(name, s->name, sizeof(name));
|
||||||
s->genargs = NULL;
|
s->genargs = NULL;
|
||||||
|
s->defaulttextures = NULL;
|
||||||
Shader_Free(s);
|
Shader_Free(s);
|
||||||
memset(s, 0, sizeof(*s));
|
memset(s, 0, sizeof(*s));
|
||||||
|
|
||||||
|
@ -3204,6 +3260,8 @@ void Shader_Reset(shader_t *s)
|
||||||
s->width = w;
|
s->width = w;
|
||||||
s->height = h;
|
s->height = h;
|
||||||
s->defaulttextures = dt;
|
s->defaulttextures = dt;
|
||||||
|
s->numdefaulttextures = dtcount;
|
||||||
|
s->defaulttextures_fps = dtrate;
|
||||||
s->generator = defaultgen;
|
s->generator = defaultgen;
|
||||||
s->genargs = genargs;
|
s->genargs = genargs;
|
||||||
s->usageflags = uf;
|
s->usageflags = uf;
|
||||||
|
@ -3407,18 +3465,18 @@ void Shader_Readpass (shader_t *shader, char **ptr)
|
||||||
{
|
{
|
||||||
case ST_DIFFUSEMAP:
|
case ST_DIFFUSEMAP:
|
||||||
if (pass->texgen == T_GEN_SINGLEMAP)
|
if (pass->texgen == T_GEN_SINGLEMAP)
|
||||||
shader->defaulttextures.base = pass->anim_frames[0];
|
shader->defaulttextures->base = pass->anim_frames[0];
|
||||||
break;
|
break;
|
||||||
case ST_AMBIENT:
|
case ST_AMBIENT:
|
||||||
break;
|
break;
|
||||||
case ST_BUMPMAP:
|
case ST_BUMPMAP:
|
||||||
if (pass->texgen == T_GEN_SINGLEMAP)
|
if (pass->texgen == T_GEN_SINGLEMAP)
|
||||||
shader->defaulttextures.bump = pass->anim_frames[0];
|
shader->defaulttextures->bump = pass->anim_frames[0];
|
||||||
ignore = true; //fixme: scrolling etc may be important. but we're not doom3.
|
ignore = true; //fixme: scrolling etc may be important. but we're not doom3.
|
||||||
break;
|
break;
|
||||||
case ST_SPECULARMAP:
|
case ST_SPECULARMAP:
|
||||||
if (pass->texgen == T_GEN_SINGLEMAP)
|
if (pass->texgen == T_GEN_SINGLEMAP)
|
||||||
shader->defaulttextures.specular = pass->anim_frames[0];
|
shader->defaulttextures->specular = pass->anim_frames[0];
|
||||||
ignore = true; //fixme: scrolling etc may be important. but we're not doom3.
|
ignore = true; //fixme: scrolling etc may be important. but we're not doom3.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3673,10 +3731,13 @@ void Shader_Programify (shader_t *s)
|
||||||
mask = Shader_AlphaMaskProgArgs(s);
|
mask = Shader_AlphaMaskProgArgs(s);
|
||||||
|
|
||||||
s->prog = Shader_FindGeneric(va("%s%s", prog, mask), qrenderer);
|
s->prog = Shader_FindGeneric(va("%s%s", prog, mask), qrenderer);
|
||||||
|
if (s->prog)
|
||||||
|
{
|
||||||
s->numpasses = 0;
|
s->numpasses = 0;
|
||||||
s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE;
|
s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE;
|
||||||
s->flags |= SHADER_HASDIFFUSE;
|
s->flags |= SHADER_HASDIFFUSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Shader_Finish (shader_t *s)
|
void Shader_Finish (shader_t *s)
|
||||||
{
|
{
|
||||||
|
@ -3733,7 +3794,7 @@ void Shader_Finish (shader_t *s)
|
||||||
pass = &s->passes[s->numpasses++];
|
pass = &s->passes[s->numpasses++];
|
||||||
pass = &s->passes[0];
|
pass = &s->passes[0];
|
||||||
pass->tcgen = TC_GEN_BASE;
|
pass->tcgen = TC_GEN_BASE;
|
||||||
if (TEXVALID(s->defaulttextures.base))
|
if (TEXVALID(s->defaulttextures->base))
|
||||||
pass->texgen = T_GEN_DIFFUSE;
|
pass->texgen = T_GEN_DIFFUSE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3859,17 +3920,17 @@ void Shader_Finish (shader_t *s)
|
||||||
done:;
|
done:;
|
||||||
|
|
||||||
//if we've no specular map, try and find whatever the q3 syntax said. hopefully it'll be compatible...
|
//if we've no specular map, try and find whatever the q3 syntax said. hopefully it'll be compatible...
|
||||||
if (!TEXVALID(s->defaulttextures.specular))
|
if (!TEXVALID(s->defaulttextures->specular))
|
||||||
{
|
{
|
||||||
for (pass = s->passes, i = 0; i < s->numpasses; i++, pass++)
|
for (pass = s->passes, i = 0; i < s->numpasses; i++, pass++)
|
||||||
{
|
{
|
||||||
if (pass->alphagen == ALPHA_GEN_SPECULAR)
|
if (pass->alphagen == ALPHA_GEN_SPECULAR)
|
||||||
if (pass->texgen == T_GEN_ANIMMAP || pass->texgen == T_GEN_SINGLEMAP)
|
if (pass->texgen == T_GEN_ANIMMAP || pass->texgen == T_GEN_SINGLEMAP)
|
||||||
s->defaulttextures.specular = pass->anim_frames[0];
|
s->defaulttextures->specular = pass->anim_frames[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(s->defaulttextures.base))
|
if (!TEXVALID(s->defaulttextures->base))
|
||||||
{
|
{
|
||||||
shaderpass_t *best = NULL;
|
shaderpass_t *best = NULL;
|
||||||
int bestweight = 9999999;
|
int bestweight = 9999999;
|
||||||
|
@ -3903,11 +3964,11 @@ done:;
|
||||||
if (best->texgen == T_GEN_ANIMMAP || best->texgen == T_GEN_SINGLEMAP)
|
if (best->texgen == T_GEN_ANIMMAP || best->texgen == T_GEN_SINGLEMAP)
|
||||||
{
|
{
|
||||||
if (best->anim_frames[0] && *best->anim_frames[0]->ident != '$')
|
if (best->anim_frames[0] && *best->anim_frames[0]->ident != '$')
|
||||||
s->defaulttextures.base = best->anim_frames[0];
|
s->defaulttextures->base = best->anim_frames[0];
|
||||||
}
|
}
|
||||||
#ifndef NOMEDIA
|
#ifndef NOMEDIA
|
||||||
else if (pass->texgen == T_GEN_VIDEOMAP && pass->cin)
|
else if (pass->texgen == T_GEN_VIDEOMAP && pass->cin)
|
||||||
s->defaulttextures.base = Media_UpdateForShader(best->cin);
|
s->defaulttextures->base = Media_UpdateForShader(best->cin);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3948,7 +4009,7 @@ done:;
|
||||||
Shader_SetBlendmode (pass);
|
Shader_SetBlendmode (pass);
|
||||||
|
|
||||||
if (pass->blendmode == PBM_ADD)
|
if (pass->blendmode == PBM_ADD)
|
||||||
s->defaulttextures.fullbright = pass->anim_frames[0];
|
s->defaulttextures->fullbright = pass->anim_frames[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(s->flags & SHADER_SKY ) && !s->sort)
|
if (!(s->flags & SHADER_SKY ) && !s->sort)
|
||||||
|
@ -4035,8 +4096,16 @@ done:;
|
||||||
"}\n");
|
"}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!s->prog && sh_config.progs_required)
|
if (!s->prog && (sh_config.progs_required || (sh_config.progs_supported && r_forceprogramify.ival)))
|
||||||
|
{
|
||||||
Shader_Programify(s);
|
Shader_Programify(s);
|
||||||
|
if (r_forceprogramify.ival >= 2)
|
||||||
|
{
|
||||||
|
if (s->passes[0].numtcmods == 1 && s->passes[0].tcmods[0].type == SHADER_TCMOD_SCALE)
|
||||||
|
s->passes[0].numtcmods = 0; //DP sucks and doesn't use normalized texture coords *if* there's a shader specified. so lets ignore any extra scaling that this imposes.
|
||||||
|
s->passes[0].shaderbits &= ~SBITS_MISC_DEPTHEQUALONLY; //DP ignores this too.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (s->prog)
|
if (s->prog)
|
||||||
{
|
{
|
||||||
|
@ -4055,6 +4124,8 @@ done:;
|
||||||
{T_GEN_PALETTED, SHADER_HASPALETTED},
|
{T_GEN_PALETTED, SHADER_HASPALETTED},
|
||||||
{T_GEN_SHADOWMAP, 0},
|
{T_GEN_SHADOWMAP, 0},
|
||||||
{T_GEN_LIGHTCUBEMAP, 0},
|
{T_GEN_LIGHTCUBEMAP, 0},
|
||||||
|
{T_GEN_REFLECTCUBE, 0},
|
||||||
|
{T_GEN_REFLECTMASK, 0},
|
||||||
// {T_GEN_REFLECTION, SHADER_HASREFLECT},
|
// {T_GEN_REFLECTION, SHADER_HASREFLECT},
|
||||||
// {T_GEN_REFRACTION, SHADER_HASREFRACT},
|
// {T_GEN_REFRACTION, SHADER_HASREFRACT},
|
||||||
// {T_GEN_REFRACTIONDEPTH, SHADER_HASREFRACTDEPTH},
|
// {T_GEN_REFRACTIONDEPTH, SHADER_HASREFRACTDEPTH},
|
||||||
|
@ -4062,18 +4133,36 @@ done:;
|
||||||
{T_GEN_LIGHTMAP, SHADER_HASLIGHTMAP},
|
{T_GEN_LIGHTMAP, SHADER_HASLIGHTMAP},
|
||||||
{T_GEN_DELUXMAP, 0},
|
{T_GEN_DELUXMAP, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cin_t *cin = R_ShaderGetCinematic(s);
|
||||||
|
|
||||||
//if the glsl doesn't specify all samplers, just trim them.
|
//if the glsl doesn't specify all samplers, just trim them.
|
||||||
s->numpasses = s->prog->numsamplers;
|
s->numpasses = s->prog->numsamplers;
|
||||||
|
|
||||||
|
if (cin && R_ShaderGetCinematic(s) == cin)
|
||||||
|
cin = NULL;
|
||||||
|
|
||||||
//if the glsl has specific textures listed, be sure to provide a pass for them.
|
//if the glsl has specific textures listed, be sure to provide a pass for them.
|
||||||
for (i = 0; i < sizeof(defaulttgen)/sizeof(defaulttgen[0]); i++)
|
for (i = 0; i < sizeof(defaulttgen)/sizeof(defaulttgen[0]); i++)
|
||||||
{
|
{
|
||||||
if (s->prog->defaulttextures & (1u<<i))
|
if (s->prog->defaulttextures & (1u<<i))
|
||||||
{
|
{
|
||||||
|
if (s->numpasses >= SHADER_PASS_MAX)
|
||||||
|
break; //panic...
|
||||||
s->passes[s->numpasses].flags &= ~SHADER_PASS_DEPTHCMP;
|
s->passes[s->numpasses].flags &= ~SHADER_PASS_DEPTHCMP;
|
||||||
if (defaulttgen[i].gen == T_GEN_SHADOWMAP)
|
if (defaulttgen[i].gen == T_GEN_SHADOWMAP)
|
||||||
s->passes[s->numpasses].flags |= SHADER_PASS_DEPTHCMP;
|
s->passes[s->numpasses].flags |= SHADER_PASS_DEPTHCMP;
|
||||||
|
if (!i && cin)
|
||||||
|
{
|
||||||
|
s->passes[s->numpasses].texgen = T_GEN_VIDEOMAP;
|
||||||
|
s->passes[s->numpasses].cin = cin;
|
||||||
|
cin = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
s->passes[s->numpasses].texgen = defaulttgen[i].gen;
|
s->passes[s->numpasses].texgen = defaulttgen[i].gen;
|
||||||
|
s->passes[s->numpasses].cin = NULL;
|
||||||
|
}
|
||||||
s->numpasses++;
|
s->numpasses++;
|
||||||
s->flags |= defaulttgen[i].flags;
|
s->flags |= defaulttgen[i].flags;
|
||||||
}
|
}
|
||||||
|
@ -4082,9 +4171,12 @@ done:;
|
||||||
//must have at least one texture.
|
//must have at least one texture.
|
||||||
if (!s->numpasses)
|
if (!s->numpasses)
|
||||||
{
|
{
|
||||||
s->passes[0].texgen = T_GEN_DIFFUSE;
|
s->passes[0].texgen = cin?T_GEN_VIDEOMAP:T_GEN_DIFFUSE;
|
||||||
|
s->passes[0].cin = cin;
|
||||||
s->numpasses = 1;
|
s->numpasses = 1;
|
||||||
}
|
}
|
||||||
|
else if (cin)
|
||||||
|
Media_ShutdownCin(cin);
|
||||||
s->passes->numMergedPasses = s->numpasses;
|
s->passes->numMergedPasses = s->numpasses;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4151,11 +4243,14 @@ void Shader_UpdateRegistration (void)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
void Shader_DefaultSkin(const char *shortname, shader_t *s, const void *args);
|
void Shader_DefaultSkin(const char *shortname, shader_t *s, const void *args);
|
||||||
void QDECL R_BuildDefaultTexnums(texnums_t *tn, shader_t *shader)
|
void QDECL R_BuildDefaultTexnums(texnums_t *src, shader_t *shader)
|
||||||
{
|
{
|
||||||
char *h;
|
char *h;
|
||||||
char imagename[MAX_QPATH];
|
char imagename[MAX_QPATH];
|
||||||
|
char mapname[MAX_QPATH];
|
||||||
char *subpath = NULL;
|
char *subpath = NULL;
|
||||||
|
texnums_t *tex;
|
||||||
|
unsigned int a, aframes;
|
||||||
unsigned int imageflags = 0;
|
unsigned int imageflags = 0;
|
||||||
strcpy(imagename, shader->name);
|
strcpy(imagename, shader->name);
|
||||||
h = strchr(imagename, '#');
|
h = strchr(imagename, '#');
|
||||||
|
@ -4171,94 +4266,131 @@ void QDECL R_BuildDefaultTexnums(texnums_t *tn, shader_t *shader)
|
||||||
if (shader->generator == Shader_DefaultSkin)
|
if (shader->generator == Shader_DefaultSkin)
|
||||||
subpath = shader->genargs;
|
subpath = shader->genargs;
|
||||||
|
|
||||||
if (!tn)
|
tex = shader->defaulttextures;
|
||||||
tn = &shader->defaulttextures;
|
aframes = max(1, shader->numdefaulttextures);
|
||||||
if (!TEXVALID(shader->defaulttextures.base))
|
//if any were specified explicitly, replicate that into all.
|
||||||
|
//this means animmap can be used, with any explicit textures overriding all.
|
||||||
|
if (!shader->numdefaulttextures && src)
|
||||||
|
{
|
||||||
|
//only do this if there wasn't an animmap thing to break everything.
|
||||||
|
if (!TEXVALID(tex->base))
|
||||||
|
tex->base = src->base;
|
||||||
|
if (!TEXVALID(tex->bump))
|
||||||
|
tex->bump = src->bump;
|
||||||
|
if (!TEXVALID(tex->fullbright))
|
||||||
|
tex->fullbright = src->fullbright;
|
||||||
|
if (!TEXVALID(tex->specular))
|
||||||
|
tex->specular = src->specular;
|
||||||
|
if (!TEXVALID(tex->loweroverlay))
|
||||||
|
tex->loweroverlay = src->loweroverlay;
|
||||||
|
if (!TEXVALID(tex->upperoverlay))
|
||||||
|
tex->upperoverlay = src->upperoverlay;
|
||||||
|
if (!TEXVALID(tex->reflectmask))
|
||||||
|
tex->reflectmask = src->reflectmask;
|
||||||
|
if (!TEXVALID(tex->reflectcube))
|
||||||
|
tex->reflectcube = src->reflectcube;
|
||||||
|
}
|
||||||
|
for (a = 1; a < aframes; a++)
|
||||||
|
{
|
||||||
|
if (!TEXVALID(tex[a].base))
|
||||||
|
tex[a].base = tex[0].base;
|
||||||
|
if (!TEXVALID(tex[a].bump))
|
||||||
|
tex[a].bump = tex[0].bump;
|
||||||
|
if (!TEXVALID(tex[a].fullbright))
|
||||||
|
tex[a].fullbright = tex[0].fullbright;
|
||||||
|
if (!TEXVALID(tex[a].specular))
|
||||||
|
tex[a].specular = tex[0].specular;
|
||||||
|
if (!TEXVALID(tex[a].loweroverlay))
|
||||||
|
tex[a].loweroverlay = tex[0].loweroverlay;
|
||||||
|
if (!TEXVALID(tex[a].upperoverlay))
|
||||||
|
tex[a].upperoverlay = tex[0].upperoverlay;
|
||||||
|
if (!TEXVALID(tex[a].reflectmask))
|
||||||
|
tex[a].reflectmask = tex[0].reflectmask;
|
||||||
|
if (!TEXVALID(tex[a].reflectcube))
|
||||||
|
tex[a].reflectcube = tex[0].reflectcube;
|
||||||
|
}
|
||||||
|
for (a = 0; a < aframes; a++, tex++)
|
||||||
|
{
|
||||||
|
COM_StripExtension(tex->mapname, mapname, sizeof(mapname));
|
||||||
|
|
||||||
|
if (!TEXVALID(tex->base))
|
||||||
{
|
{
|
||||||
/*dlights/realtime lighting needs some stuff*/
|
/*dlights/realtime lighting needs some stuff*/
|
||||||
if (!TEXVALID(tn->base) && *shader->mapname)// && (shader->flags & SHADER_HASDIFFUSE))
|
if (!TEXVALID(tex->base) && *tex->mapname)// && (shader->flags & SHADER_HASDIFFUSE))
|
||||||
tn->base = R_LoadHiResTexture(shader->mapname, NULL, 0);
|
tex->base = R_LoadHiResTexture(tex->mapname, NULL, 0);
|
||||||
if (!TEXVALID(tn->base))
|
if (!TEXVALID(tex->base))
|
||||||
tn->base = R_LoadHiResTexture(imagename, subpath, (*imagename=='{')?0:IF_NOALPHA);
|
tex->base = R_LoadHiResTexture(imagename, subpath, (*imagename=='{')?0:IF_NOALPHA);
|
||||||
|
|
||||||
TEXASSIGN(shader->defaulttextures.base, tn->base);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.paletted))
|
if (!TEXVALID(tex->paletted))
|
||||||
{
|
{
|
||||||
/*dlights/realtime lighting needs some stuff*/
|
/*dlights/realtime lighting needs some stuff*/
|
||||||
// if (!TEXVALID(tn->paletted) && *shader->mapname)// && (shader->flags & SHADER_HASDIFFUSE))
|
// if (!TEXVALID(tn->paletted) && *shader->mapname)// && (shader->flags & SHADER_HASDIFFUSE))
|
||||||
// tn->paletted = R_LoadHiResTexture(shader->mapname, NULL, 0);
|
// tn->paletted = R_LoadHiResTexture(shader->mapname, NULL, 0);
|
||||||
// if (!TEXVALID(tn->paletted))
|
// if (!TEXVALID(tn->paletted))
|
||||||
// tn->paletted = R_LoadHiResTexture(imagename, subpath, (*imagename=='{')?0:IF_NOALPHA);
|
// tn->paletted = R_LoadHiResTexture(imagename, subpath, (*imagename=='{')?0:IF_NOALPHA);
|
||||||
|
|
||||||
TEXASSIGN(shader->defaulttextures.paletted, tn->paletted);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
imageflags |= IF_LOWPRIORITY;
|
imageflags |= IF_LOWPRIORITY;
|
||||||
|
|
||||||
COM_StripExtension(imagename, imagename, sizeof(imagename));
|
COM_StripExtension(imagename, imagename, sizeof(imagename));
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.bump))
|
if (!TEXVALID(tex->bump))
|
||||||
{
|
{
|
||||||
if (r_loadbumpmapping || (shader->flags & SHADER_HASNORMALMAP))
|
if (r_loadbumpmapping || (shader->flags & SHADER_HASNORMALMAP))
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tn->bump) && *shader->mapname && (shader->flags & SHADER_HASNORMALMAP))
|
if (!TEXVALID(tex->bump) && *mapname && (shader->flags & SHADER_HASNORMALMAP))
|
||||||
tn->bump = R_LoadHiResTexture(va("%s_norm", shader->mapname), NULL, imageflags|IF_TRYBUMP);
|
tex->bump = R_LoadHiResTexture(va("%s_norm", mapname), NULL, imageflags|IF_TRYBUMP);
|
||||||
if (!TEXVALID(tn->bump))
|
if (!TEXVALID(tex->bump))
|
||||||
tn->bump = R_LoadHiResTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP);
|
tex->bump = R_LoadHiResTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP);
|
||||||
}
|
}
|
||||||
TEXASSIGN(shader->defaulttextures.bump, tn->bump);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.loweroverlay))
|
if (!TEXVALID(tex->loweroverlay))
|
||||||
{
|
{
|
||||||
if (shader->flags & SHADER_HASTOPBOTTOM)
|
if (shader->flags & SHADER_HASTOPBOTTOM)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tn->loweroverlay) && *shader->mapname)
|
if (!TEXVALID(tex->loweroverlay) && *mapname)
|
||||||
tn->loweroverlay = R_LoadHiResTexture(va("%s_pants", shader->mapname), NULL, imageflags);
|
tex->loweroverlay = R_LoadHiResTexture(va("%s_pants", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tn->loweroverlay))
|
if (!TEXVALID(tex->loweroverlay))
|
||||||
tn->loweroverlay = R_LoadHiResTexture(va("%s_pants", imagename), subpath, imageflags); /*how rude*/
|
tex->loweroverlay = R_LoadHiResTexture(va("%s_pants", imagename), subpath, imageflags); /*how rude*/
|
||||||
}
|
}
|
||||||
TEXASSIGN(shader->defaulttextures.loweroverlay, tn->loweroverlay);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.upperoverlay))
|
if (!TEXVALID(tex->upperoverlay))
|
||||||
{
|
{
|
||||||
if (shader->flags & SHADER_HASTOPBOTTOM)
|
if (shader->flags & SHADER_HASTOPBOTTOM)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tn->upperoverlay) && *shader->mapname)
|
if (!TEXVALID(tex->upperoverlay) && *mapname)
|
||||||
tn->upperoverlay = R_LoadHiResTexture(va("%s_shirt", shader->mapname), NULL, imageflags);
|
tex->upperoverlay = R_LoadHiResTexture(va("%s_shirt", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tn->upperoverlay))
|
if (!TEXVALID(tex->upperoverlay))
|
||||||
tn->upperoverlay = R_LoadHiResTexture(va("%s_shirt", imagename), subpath, imageflags);
|
tex->upperoverlay = R_LoadHiResTexture(va("%s_shirt", imagename), subpath, imageflags);
|
||||||
}
|
}
|
||||||
TEXASSIGN(shader->defaulttextures.upperoverlay, tn->upperoverlay);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.specular))
|
if (!TEXVALID(tex->specular))
|
||||||
{
|
{
|
||||||
extern cvar_t gl_specular;
|
extern cvar_t gl_specular;
|
||||||
if ((shader->flags & SHADER_HASGLOSS) && gl_specular.value && gl_load24bit.value)
|
if ((shader->flags & SHADER_HASGLOSS) && gl_specular.value && gl_load24bit.value)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tn->specular) && *shader->mapname)
|
if (!TEXVALID(tex->specular) && *mapname)
|
||||||
tn->specular = R_LoadHiResTexture(va("%s_gloss", shader->mapname), NULL, imageflags);
|
tex->specular = R_LoadHiResTexture(va("%s_gloss", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tn->specular))
|
if (!TEXVALID(tex->specular))
|
||||||
tn->specular = R_LoadHiResTexture(va("%s_gloss", imagename), subpath, imageflags);
|
tex->specular = R_LoadHiResTexture(va("%s_gloss", imagename), subpath, imageflags);
|
||||||
}
|
}
|
||||||
TEXASSIGN(shader->defaulttextures.specular, tn->specular);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TEXVALID(shader->defaulttextures.fullbright))
|
if (!TEXVALID(tex->fullbright))
|
||||||
{
|
{
|
||||||
extern cvar_t r_fb_bmodels;
|
extern cvar_t r_fb_bmodels;
|
||||||
if ((shader->flags & SHADER_HASFULLBRIGHT) && r_fb_bmodels.value && gl_load24bit.value)
|
if ((shader->flags & SHADER_HASFULLBRIGHT) && r_fb_bmodels.value && gl_load24bit.value)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tn->fullbright) && *shader->mapname)
|
if (!TEXVALID(tex->fullbright) && *mapname)
|
||||||
tn->fullbright = R_LoadHiResTexture(va("%s_luma", shader->mapname), NULL, imageflags);
|
tex->fullbright = R_LoadHiResTexture(va("%s_luma", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tn->fullbright))
|
if (!TEXVALID(tex->fullbright))
|
||||||
tn->fullbright = R_LoadHiResTexture(va("%s_luma", imagename), subpath, imageflags);
|
tex->fullbright = R_LoadHiResTexture(va("%s_luma", imagename), subpath, imageflags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
TEXASSIGN(shader->defaulttextures.fullbright, tn->fullbright);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4267,8 +4399,10 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
{
|
{
|
||||||
char *h;
|
char *h;
|
||||||
char imagename[MAX_QPATH];
|
char imagename[MAX_QPATH];
|
||||||
|
char mapname[MAX_QPATH]; //as specified by the shader.
|
||||||
//extern cvar_t gl_miptexLevel;
|
//extern cvar_t gl_miptexLevel;
|
||||||
texnums_t *tex = &shader->defaulttextures;
|
texnums_t *tex = shader->defaulttextures;
|
||||||
|
int a, aframes;
|
||||||
unsigned int imageflags;
|
unsigned int imageflags;
|
||||||
qbyte *dontcrashme[4] = {NULL};
|
qbyte *dontcrashme[4] = {NULL};
|
||||||
if (!mipdata)
|
if (!mipdata)
|
||||||
|
@ -4310,11 +4444,37 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
|
|
||||||
COM_StripExtension(imagename, imagename, sizeof(imagename));
|
COM_StripExtension(imagename, imagename, sizeof(imagename));
|
||||||
|
|
||||||
|
aframes = max(1, shader->numdefaulttextures);
|
||||||
|
//if any were specified explicitly, replicate that into all.
|
||||||
|
//this means animmap can be used, with any explicit textures overriding all.
|
||||||
|
for (a = 1; a < aframes; a++)
|
||||||
|
{
|
||||||
|
if (!TEXVALID(tex[a].base))
|
||||||
|
tex[a].base = tex[0].base;
|
||||||
|
if (!TEXVALID(tex[a].bump))
|
||||||
|
tex[a].bump = tex[0].bump;
|
||||||
|
if (!TEXVALID(tex[a].fullbright))
|
||||||
|
tex[a].fullbright = tex[0].fullbright;
|
||||||
|
if (!TEXVALID(tex[a].specular))
|
||||||
|
tex[a].specular = tex[0].specular;
|
||||||
|
if (!TEXVALID(tex[a].loweroverlay))
|
||||||
|
tex[a].loweroverlay = tex[0].loweroverlay;
|
||||||
|
if (!TEXVALID(tex[a].upperoverlay))
|
||||||
|
tex[a].upperoverlay = tex[0].upperoverlay;
|
||||||
|
if (!TEXVALID(tex[a].reflectmask))
|
||||||
|
tex[a].reflectmask = tex[0].reflectmask;
|
||||||
|
if (!TEXVALID(tex[a].reflectcube))
|
||||||
|
tex[a].reflectcube = tex[0].reflectcube;
|
||||||
|
}
|
||||||
|
for (a = 0; a < aframes; a++, tex++)
|
||||||
|
{
|
||||||
|
COM_StripExtension(tex->mapname, mapname, sizeof(mapname));
|
||||||
|
|
||||||
/*dlights/realtime lighting needs some stuff*/
|
/*dlights/realtime lighting needs some stuff*/
|
||||||
if (loadflags & SHADER_HASDIFFUSE)
|
if (loadflags & SHADER_HASDIFFUSE)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->base) && *shader->mapname)
|
if (!TEXVALID(tex->base) && *mapname)
|
||||||
tex->base = R_LoadHiResTexture(shader->mapname, NULL, imageflags);
|
tex->base = R_LoadHiResTexture(mapname, NULL, imageflags);
|
||||||
if (!TEXVALID(tex->base) && fallbackname)
|
if (!TEXVALID(tex->base) && fallbackname)
|
||||||
{
|
{
|
||||||
if (gl_load24bit.ival)
|
if (gl_load24bit.ival)
|
||||||
|
@ -4336,8 +4496,8 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
|
|
||||||
if (loadflags & SHADER_HASPALETTED)
|
if (loadflags & SHADER_HASPALETTED)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->paletted) && *shader->mapname)
|
if (!TEXVALID(tex->paletted) && *mapname)
|
||||||
tex->paletted = R_LoadHiResTexture(va("%s_pal", shader->mapname), NULL, imageflags|IF_NEAREST);
|
tex->paletted = R_LoadHiResTexture(va("%s_pal", mapname), NULL, imageflags|IF_NEAREST);
|
||||||
if (!TEXVALID(tex->paletted))
|
if (!TEXVALID(tex->paletted))
|
||||||
tex->paletted = Image_GetTexture(va("%s_pal", imagename), subpath, imageflags|IF_NEAREST, mipdata[0], palette, width, height, (basefmt==TF_MIP4_SOLID8)?TF_MIP4_LUM8:TF_LUM8);
|
tex->paletted = Image_GetTexture(va("%s_pal", imagename), subpath, imageflags|IF_NEAREST, mipdata[0], palette, width, height, (basefmt==TF_MIP4_SOLID8)?TF_MIP4_LUM8:TF_LUM8);
|
||||||
}
|
}
|
||||||
|
@ -4350,39 +4510,48 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
if (loadflags & SHADER_HASNORMALMAP)
|
if (loadflags & SHADER_HASNORMALMAP)
|
||||||
{
|
{
|
||||||
extern cvar_t r_shadow_bumpscale_basetexture;
|
extern cvar_t r_shadow_bumpscale_basetexture;
|
||||||
if (!TEXVALID(tex->bump) && *shader->mapname)
|
if (!TEXVALID(tex->bump) && *mapname)
|
||||||
tex->bump = R_LoadHiResTexture(va("%s_norm", shader->mapname), NULL, imageflags|IF_TRYBUMP);
|
tex->bump = R_LoadHiResTexture(va("%s_norm", mapname), NULL, imageflags|IF_TRYBUMP);
|
||||||
if (!TEXVALID(tex->bump) && (r_shadow_bumpscale_basetexture.ival||*imagename=='*'||gl_load24bit.ival))
|
if (!TEXVALID(tex->bump) && (r_shadow_bumpscale_basetexture.ival||*imagename=='*'||gl_load24bit.ival))
|
||||||
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP, (r_shadow_bumpscale_basetexture.ival||*imagename=='*')?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
tex->bump = Image_GetTexture(va("%s_norm", imagename), subpath, imageflags|IF_TRYBUMP, (r_shadow_bumpscale_basetexture.ival||*imagename=='*')?mipdata[0]:NULL, palette, width, height, TF_HEIGHT8PAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadflags & SHADER_HASTOPBOTTOM)
|
if (loadflags & SHADER_HASTOPBOTTOM)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->loweroverlay) && *shader->mapname)
|
if (!TEXVALID(tex->loweroverlay) && *mapname)
|
||||||
tex->loweroverlay = R_LoadHiResTexture(va("%s_pants", shader->mapname), NULL, imageflags);
|
tex->loweroverlay = R_LoadHiResTexture(va("%s_pants", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tex->loweroverlay))
|
if (!TEXVALID(tex->loweroverlay))
|
||||||
tex->loweroverlay = Image_GetTexture(va("%s_pants", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
tex->loweroverlay = Image_GetTexture(va("%s_pants", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
||||||
}
|
}
|
||||||
if (loadflags & SHADER_HASTOPBOTTOM)
|
if (loadflags & SHADER_HASTOPBOTTOM)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->upperoverlay) && *shader->mapname)
|
if (!TEXVALID(tex->upperoverlay) && *mapname)
|
||||||
tex->upperoverlay = R_LoadHiResTexture(va("%s_shirt", shader->mapname), NULL, imageflags);
|
tex->upperoverlay = R_LoadHiResTexture(va("%s_shirt", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tex->upperoverlay))
|
if (!TEXVALID(tex->upperoverlay))
|
||||||
tex->upperoverlay = Image_GetTexture(va("%s_shirt", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
tex->upperoverlay = Image_GetTexture(va("%s_shirt", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loadflags & SHADER_HASGLOSS)
|
if (loadflags & SHADER_HASGLOSS)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->specular) && *shader->mapname)
|
if (!TEXVALID(tex->specular) && *mapname)
|
||||||
tex->specular = R_LoadHiResTexture(va("%s_gloss", shader->mapname), NULL, imageflags);
|
tex->specular = R_LoadHiResTexture(va("%s_gloss", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tex->specular))
|
if (!TEXVALID(tex->specular))
|
||||||
tex->specular = Image_GetTexture(va("%s_gloss", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
tex->specular = Image_GetTexture(va("%s_gloss", imagename), subpath, imageflags, NULL, palette, width, height, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tex->reflectcube)
|
||||||
|
{
|
||||||
|
extern cvar_t r_shadow_bumpscale_basetexture;
|
||||||
|
if (!TEXVALID(tex->reflectmask) && *mapname)
|
||||||
|
tex->reflectmask = R_LoadHiResTexture(va("%s_reflect", mapname), NULL, imageflags);
|
||||||
|
if (!TEXVALID(tex->reflectmask))
|
||||||
|
tex->reflectmask = Image_GetTexture(va("%s_reflect", imagename), subpath, imageflags, NULL, NULL, width, height, TF_INVALID);
|
||||||
|
}
|
||||||
|
|
||||||
if (loadflags & SHADER_HASFULLBRIGHT)
|
if (loadflags & SHADER_HASFULLBRIGHT)
|
||||||
{
|
{
|
||||||
if (!TEXVALID(tex->fullbright) && *shader->mapname)
|
if (!TEXVALID(tex->fullbright) && *mapname)
|
||||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma", shader->mapname), NULL, imageflags);
|
tex->fullbright = R_LoadHiResTexture(va("%s_luma", mapname), NULL, imageflags);
|
||||||
if (!TEXVALID(tex->fullbright))
|
if (!TEXVALID(tex->fullbright))
|
||||||
{
|
{
|
||||||
int s=-1;
|
int s=-1;
|
||||||
|
@ -4396,6 +4565,7 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Shader_DefaultScript(const char *shortname, shader_t *s, const void *args)
|
void Shader_DefaultScript(const char *shortname, shader_t *s, const void *args)
|
||||||
{
|
{
|
||||||
|
@ -4935,9 +5105,9 @@ void Shader_DefaultBSPVertex(const char *shortname, shader_t *s, const void *arg
|
||||||
}
|
}
|
||||||
else*/
|
else*/
|
||||||
{
|
{
|
||||||
s->defaulttextures.base = R_LoadHiResTexture(shortname, NULL, 0);
|
s->defaulttextures->base = R_LoadHiResTexture(shortname, NULL, 0);
|
||||||
pass->texgen = T_GEN_DIFFUSE;
|
pass->texgen = T_GEN_DIFFUSE;
|
||||||
if (!TEXVALID(s->defaulttextures.base))
|
if (!TEXVALID(s->defaulttextures->base))
|
||||||
Con_DPrintf (CON_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname );
|
Con_DPrintf (CON_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5059,7 +5229,7 @@ void Shader_Default2D(const char *shortname, shader_t *s, const void *genargs)
|
||||||
"sort additive\n"
|
"sort additive\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
TEXASSIGN(s->defaulttextures.base, R_LoadHiResTexture(s->name, NULL, IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP));
|
TEXASSIGN(s->defaulttextures->base, R_LoadHiResTexture(s->name, NULL, IF_PREMULTIPLYALPHA|IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5076,7 +5246,7 @@ void Shader_Default2D(const char *shortname, shader_t *s, const void *genargs)
|
||||||
"sort additive\n"
|
"sort additive\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
TEXASSIGN(s->defaulttextures.base, R_LoadHiResTexture(s->name, NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP));
|
TEXASSIGN(s->defaulttextures->base, R_LoadHiResTexture(s->name, NULL, IF_UIPIC|IF_NOPICMIP|IF_NOMIPMAP|IF_CLAMP));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5327,11 +5497,18 @@ static shader_t *R_LoadShader (const char *name, unsigned int usageflags, shader
|
||||||
|
|
||||||
s = r_shaders[f];
|
s = r_shaders[f];
|
||||||
if (!s)
|
if (!s)
|
||||||
|
{
|
||||||
s = r_shaders[f] = Z_Malloc(sizeof(*s));
|
s = r_shaders[f] = Z_Malloc(sizeof(*s));
|
||||||
|
}
|
||||||
s->id = f;
|
s->id = f;
|
||||||
if (r_numshaders < f+1)
|
if (r_numshaders < f+1)
|
||||||
r_numshaders = f+1;
|
r_numshaders = f+1;
|
||||||
|
|
||||||
|
if (!s->defaulttextures)
|
||||||
|
{
|
||||||
|
s->defaulttextures = Z_Malloc(sizeof(*s->defaulttextures));
|
||||||
|
s->numdefaulttextures = 0;
|
||||||
|
}
|
||||||
Q_strncpyz(s->name, cleanname, sizeof(s->name));
|
Q_strncpyz(s->name, cleanname, sizeof(s->name));
|
||||||
s->usageflags = usageflags;
|
s->usageflags = usageflags;
|
||||||
s->generator = defaultgen;
|
s->generator = defaultgen;
|
||||||
|
@ -5673,11 +5850,11 @@ int R_GetShaderSizes(shader_t *shader, int *width, int *height, qboolean blockti
|
||||||
return -1;
|
return -1;
|
||||||
COM_WorkerPartialSync(shader->passes[i].anim_frames[0], &shader->passes[i].anim_frames[0]->status, TEX_LOADING);
|
COM_WorkerPartialSync(shader->passes[i].anim_frames[0], &shader->passes[i].anim_frames[0]->status, TEX_LOADING);
|
||||||
}
|
}
|
||||||
if (shader->passes[i].texgen == T_GEN_DIFFUSE && (shader->defaulttextures.base && shader->defaulttextures.base->status == TEX_LOADING))
|
if (shader->passes[i].texgen == T_GEN_DIFFUSE && (shader->defaulttextures->base && shader->defaulttextures->base->status == TEX_LOADING))
|
||||||
{
|
{
|
||||||
if (!blocktillloaded)
|
if (!blocktillloaded)
|
||||||
return -1;
|
return -1;
|
||||||
COM_WorkerPartialSync(shader->defaulttextures.base, &shader->defaulttextures.base->status, TEX_LOADING);
|
COM_WorkerPartialSync(shader->defaulttextures->base, &shader->defaulttextures->base->status, TEX_LOADING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5693,12 +5870,12 @@ int R_GetShaderSizes(shader_t *shader, int *width, int *height, qboolean blockti
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (shader->passes[i].texgen == T_GEN_DIFFUSE && shader->defaulttextures.base)
|
if (shader->passes[i].texgen == T_GEN_DIFFUSE && shader->defaulttextures->base)
|
||||||
{
|
{
|
||||||
if (shader->defaulttextures.base->status == TEX_LOADED)
|
if (shader->defaulttextures->base->status == TEX_LOADED)
|
||||||
{
|
{
|
||||||
shader->width = shader->defaulttextures.base->width;
|
shader->width = shader->defaulttextures->base->width;
|
||||||
shader->height = shader->defaulttextures.base->height;
|
shader->height = shader->defaulttextures->base->height;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2230,7 +2230,7 @@ static void Sh_GenShadowFace(dlight_t *l, vec3_t axis[3], shadowmesh_t *smesh, i
|
||||||
tex = cl.worldmodel->shadowbatches[tno].tex;
|
tex = cl.worldmodel->shadowbatches[tno].tex;
|
||||||
if (tex->shader->flags & SHADER_NODLIGHT) //FIXME: shadows not lights
|
if (tex->shader->flags & SHADER_NODLIGHT) //FIXME: shadows not lights
|
||||||
continue;
|
continue;
|
||||||
BE_DrawMesh_List(tex->shader, smesh->batches[tno].count, smesh->batches[tno].s, cl.worldmodel->shadowbatches[tno].vbo, &tex->shader->defaulttextures, 0);
|
BE_DrawMesh_List(tex->shader, smesh->batches[tno].count, smesh->batches[tno].s, cl.worldmodel->shadowbatches[tno].vbo, NULL, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2606,7 +2606,7 @@ static void Sh_DrawEntLighting(dlight_t *light, vec3_t colour)
|
||||||
if (shader->flags & SHADER_NODLIGHT)
|
if (shader->flags & SHADER_NODLIGHT)
|
||||||
continue;
|
continue;
|
||||||
//FIXME: it may be worth building a dedicated ebo
|
//FIXME: it may be worth building a dedicated ebo
|
||||||
BE_DrawMesh_List(shader, sm->batches[tno].count, sm->batches[tno].s, cl.worldmodel->shadowbatches[tno].vbo, &shader->defaulttextures, 0);
|
BE_DrawMesh_List(shader, sm->batches[tno].count, sm->batches[tno].s, cl.worldmodel->shadowbatches[tno].vbo, NULL, 0);
|
||||||
RQuantAdd(RQUANT_LITFACES, sm->batches[tno].count);
|
RQuantAdd(RQUANT_LITFACES, sm->batches[tno].count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3226,7 +3226,7 @@ void Sh_DrawCrepuscularLight(dlight_t *dl, float *colours)
|
||||||
|
|
||||||
BE_SelectMode(BEM_STANDARD);
|
BE_SelectMode(BEM_STANDARD);
|
||||||
|
|
||||||
GLBE_DrawMesh_Single(crepuscular_shader, &mesh, NULL, &crepuscular_shader->defaulttextures, 0);
|
BE_DrawMesh_Single(crepuscular_shader, &mesh, NULL, 0);
|
||||||
|
|
||||||
GLBE_FBO_Sources(oldsrccol, NULL);
|
GLBE_FBO_Sources(oldsrccol, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1002,6 +1002,9 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
||||||
gl_config.arb_shadow = GL_CheckExtension("GL_ARB_shadow");
|
gl_config.arb_shadow = GL_CheckExtension("GL_ARB_shadow");
|
||||||
//gl_config.arb_shadow |= GL_CheckExtension("GL_EXT_shadow_samplers"); //gles2. nvidia fucks up. depend on brute-force. :s
|
//gl_config.arb_shadow |= GL_CheckExtension("GL_EXT_shadow_samplers"); //gles2. nvidia fucks up. depend on brute-force. :s
|
||||||
|
|
||||||
|
if (GL_CheckExtension("GL_ARB_seamless_cube_map"))
|
||||||
|
qglEnable(0x884F); //TEXTURE_CUBE_MAP_SEAMLESS 0x884F
|
||||||
|
|
||||||
#ifdef GL_STATIC
|
#ifdef GL_STATIC
|
||||||
gl_config.ext_framebuffer_objects = true; //exists as core in gles2
|
gl_config.ext_framebuffer_objects = true; //exists as core in gles2
|
||||||
#else
|
#else
|
||||||
|
@ -1124,6 +1127,8 @@ static const char *glsl_hdrs[] =
|
||||||
"uniform sampler2D s_paletted;\n"
|
"uniform sampler2D s_paletted;\n"
|
||||||
"uniform sampler2D s_shadowmap;\n"
|
"uniform sampler2D s_shadowmap;\n"
|
||||||
"uniform samplerCube s_projectionmap;\n"
|
"uniform samplerCube s_projectionmap;\n"
|
||||||
|
"uniform samplerCube s_reflectcube;\n"
|
||||||
|
"uniform sampler2D s_reflectmask;\n"
|
||||||
"uniform sampler2D s_lightmap;\n"
|
"uniform sampler2D s_lightmap;\n"
|
||||||
"uniform sampler2D s_deluxmap;\n"
|
"uniform sampler2D s_deluxmap;\n"
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
|
@ -2206,6 +2211,8 @@ static void GLSlang_ProgAutoFields(program_t *prog, char **cvarnames, int *cvart
|
||||||
"s_paletted",
|
"s_paletted",
|
||||||
"s_shadowmap",
|
"s_shadowmap",
|
||||||
"s_projectionmap",
|
"s_projectionmap",
|
||||||
|
"s_reflectcube",
|
||||||
|
"s_reflectmask",
|
||||||
"s_lightmap",
|
"s_lightmap",
|
||||||
"s_deluxmap"
|
"s_deluxmap"
|
||||||
#if MAXRLIGHTMAPS > 1
|
#if MAXRLIGHTMAPS > 1
|
||||||
|
@ -2217,6 +2224,8 @@ static void GLSlang_ProgAutoFields(program_t *prog, char **cvarnames, int *cvart
|
||||||
,"s_deluxmap3"
|
,"s_deluxmap3"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
#define ALTLIGHTMAPSAMP 13
|
||||||
|
#define ALTDELUXMAPSAMP 16
|
||||||
|
|
||||||
unsigned int i, p;
|
unsigned int i, p;
|
||||||
qboolean found;
|
qboolean found;
|
||||||
|
@ -2348,10 +2357,10 @@ static void GLSlang_ProgAutoFields(program_t *prog, char **cvarnames, int *cvart
|
||||||
}
|
}
|
||||||
|
|
||||||
//multiple lightmaps is kinda hacky. if any are set, all must be.
|
//multiple lightmaps is kinda hacky. if any are set, all must be.
|
||||||
if (prog->defaulttextures & ((1u<<11) | (1u<<12) | (1u<<13)))
|
if (prog->defaulttextures & ((1u<<(ALTLIGHTMAPSAMP+0)) | (1u<<(ALTLIGHTMAPSAMP+1)) | (1u<<(ALTLIGHTMAPSAMP+2))))
|
||||||
prog->defaulttextures |=((1u<<11) | (1u<<12) | (1u<<13));
|
prog->defaulttextures |=((1u<<(ALTLIGHTMAPSAMP+0)) | (1u<<(ALTLIGHTMAPSAMP+1)) | (1u<<(ALTLIGHTMAPSAMP+2)));
|
||||||
if (prog->defaulttextures & ((1u<<14) | (1u<<15) | (1u<<16)))
|
if (prog->defaulttextures & ((1u<<(ALTDELUXMAPSAMP+0)) | (1u<<(ALTDELUXMAPSAMP+1)) | (1u<<(ALTDELUXMAPSAMP+2))))
|
||||||
prog->defaulttextures |=((1u<<14) | (1u<<15) | (1u<<16));
|
prog->defaulttextures |=((1u<<(ALTDELUXMAPSAMP+0)) | (1u<<(ALTDELUXMAPSAMP+1)) | (1u<<(ALTDELUXMAPSAMP+2)));
|
||||||
|
|
||||||
if (prog->defaulttextures)
|
if (prog->defaulttextures)
|
||||||
{
|
{
|
||||||
|
|
|
@ -107,6 +107,12 @@ qboolean VID_SetFullDIBMode (rendererstate_t *info); //-1 on bpp or hz for defau
|
||||||
|
|
||||||
qboolean scr_skipupdate;
|
qboolean scr_skipupdate;
|
||||||
|
|
||||||
|
//#define WTHREAD
|
||||||
|
#ifdef WTHREAD
|
||||||
|
static HANDLE windowthread;
|
||||||
|
static void *windowmutex;
|
||||||
|
#endif
|
||||||
|
|
||||||
static DEVMODE gdevmode;
|
static DEVMODE gdevmode;
|
||||||
static qboolean vid_initialized = false;
|
static qboolean vid_initialized = false;
|
||||||
static qboolean vid_canalttab = false;
|
static qboolean vid_canalttab = false;
|
||||||
|
@ -1013,12 +1019,43 @@ static qboolean CreateMainWindow(rendererstate_t *info)
|
||||||
|
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WTHREAD
|
||||||
|
rendererstate_t *rs;
|
||||||
|
int GLVID_WindowThread(void *cond)
|
||||||
|
{
|
||||||
|
extern qboolean mouseshowtoggle;
|
||||||
|
int cursor = 1;
|
||||||
|
MSG msg;
|
||||||
|
HWND wnd;
|
||||||
|
CreateMainWindow(rs);
|
||||||
|
wnd = mainwindow;
|
||||||
|
Sys_ConditionSignal(cond);
|
||||||
|
|
||||||
|
while (GetMessage(&msg, NULL, 0, 0))
|
||||||
|
{
|
||||||
|
TranslateMessage (&msg);
|
||||||
|
DispatchMessage (&msg);
|
||||||
|
|
||||||
|
//ShowCursor is thread-local.
|
||||||
|
if (cursor != mouseshowtoggle)
|
||||||
|
{
|
||||||
|
cursor = mouseshowtoggle;
|
||||||
|
ShowCursor(cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DestroyWindow(wnd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
BOOL CheckForcePixelFormat(rendererstate_t *info);
|
BOOL CheckForcePixelFormat(rendererstate_t *info);
|
||||||
void VID_UnSetMode (void);
|
void VID_UnSetMode (void);
|
||||||
int GLVID_SetMode (rendererstate_t *info, unsigned char *palette)
|
int GLVID_SetMode (rendererstate_t *info, unsigned char *palette)
|
||||||
{
|
{
|
||||||
int temp;
|
int temp;
|
||||||
qboolean stat;
|
qboolean stat;
|
||||||
|
void *cond;
|
||||||
#ifndef NPFTE
|
#ifndef NPFTE
|
||||||
MSG msg;
|
MSG msg;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1035,7 +1072,22 @@ int GLVID_SetMode (rendererstate_t *info, unsigned char *palette)
|
||||||
// Set either the fullscreen or windowed mode
|
// Set either the fullscreen or windowed mode
|
||||||
qwglChoosePixelFormatARB = NULL;
|
qwglChoosePixelFormatARB = NULL;
|
||||||
qwglCreateContextAttribsARB = NULL;
|
qwglCreateContextAttribsARB = NULL;
|
||||||
|
|
||||||
|
#ifdef WTHREAD
|
||||||
|
cond = Sys_CreateConditional();
|
||||||
|
Sys_LockConditional(cond);
|
||||||
|
rs = info;
|
||||||
|
windowthread = Sys_CreateThread("windowthread", GLVID_WindowThread, cond, 0, 0);
|
||||||
|
if (!Sys_ConditionWait(cond))
|
||||||
|
Con_SafePrintf ("Looks like the window thread isn't starting up\n");
|
||||||
|
Sys_UnlockConditional(cond);
|
||||||
|
Sys_DestroyConditional(cond);
|
||||||
|
|
||||||
|
stat = !!mainwindow;
|
||||||
|
#else
|
||||||
stat = CreateMainWindow(info);
|
stat = CreateMainWindow(info);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (stat)
|
if (stat)
|
||||||
{
|
{
|
||||||
stat = VID_AttachGL(info);
|
stat = VID_AttachGL(info);
|
||||||
|
@ -1168,6 +1220,15 @@ void VID_UnSetMode (void)
|
||||||
// ShowWindow(mainwindow, SW_HIDE);
|
// ShowWindow(mainwindow, SW_HIDE);
|
||||||
// SetWindowLongPtr(mainwindow, GWL_WNDPROC, DefWindowProc);
|
// SetWindowLongPtr(mainwindow, GWL_WNDPROC, DefWindowProc);
|
||||||
// PostMessage(mainwindow, WM_CLOSE, 0, 0);
|
// PostMessage(mainwindow, WM_CLOSE, 0, 0);
|
||||||
|
#ifdef WTHREAD
|
||||||
|
if (windowthread)
|
||||||
|
{
|
||||||
|
SendMessage(mainwindow, WM_USER+4, 0, 0);
|
||||||
|
CloseHandle((HANDLE)windowthread);
|
||||||
|
windowthread = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
DestroyWindow(mainwindow);
|
DestroyWindow(mainwindow);
|
||||||
mainwindow = NULL;
|
mainwindow = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2087,8 +2148,40 @@ static void Win_Touch_Event(int points, HTOUCHINPUT ti)
|
||||||
pCloseTouchInputHandle(ti);
|
pCloseTouchInputHandle(ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WTHREAD
|
||||||
|
void MainThreadWndProc(void *ctx, void *data, size_t msg, size_t ex)
|
||||||
|
{
|
||||||
|
switch(msg)
|
||||||
|
{
|
||||||
|
case WM_COPYDATA:
|
||||||
|
Host_RunFile(data, ex, NULL);
|
||||||
|
Z_Free(data);
|
||||||
|
break;
|
||||||
|
case WM_SIZE:
|
||||||
|
case WM_MOVE:
|
||||||
|
Cvar_ForceCallback(&vid_conautoscale); //FIXME: thread
|
||||||
|
break;
|
||||||
|
case WM_KILLFOCUS:
|
||||||
|
GLAppActivate(FALSE, Minimized);//FIXME: thread
|
||||||
|
if (modestate == MS_FULLDIB)
|
||||||
|
ShowWindow(mainwindow, SW_SHOWMINNOACTIVE);
|
||||||
|
ClearAllStates (); //FIXME: thread
|
||||||
|
break;
|
||||||
|
case WM_SETFOCUS:
|
||||||
|
if (!GLAppActivate(TRUE, Minimized))//FIXME: thread
|
||||||
|
break;
|
||||||
|
ClearAllStates (); //FIXME: thread
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* main window procedure */
|
/* main window procedure
|
||||||
|
due to moving the main window over to a different thread, we gain access to input timestamps (as well as video refreshes when dragging etc)
|
||||||
|
however, we have to tread carefully. the main/render thread will be running the whole time, and may trigger messages that we need to respond to _now_.
|
||||||
|
this means that the main and window thread cannot be allowed to contest any mutexes where anything but memory is touched before its unlocked.
|
||||||
|
(or in other words, we can't have the main thread near-perma-lock any mutexes that can be locked-to-sync here)
|
||||||
|
*/
|
||||||
LONG WINAPI GLMainWndProc (
|
LONG WINAPI GLMainWndProc (
|
||||||
HWND hWnd,
|
HWND hWnd,
|
||||||
UINT uMsg,
|
UINT uMsg,
|
||||||
|
@ -2108,20 +2201,32 @@ LONG WINAPI GLMainWndProc (
|
||||||
case WM_COPYDATA:
|
case WM_COPYDATA:
|
||||||
{
|
{
|
||||||
COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
|
COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
|
||||||
|
#ifdef WTHREAD
|
||||||
|
COM_AddWork(0, MainThreadWndProc, NULL, memcpy(Z_Malloc(cds->cbData), cds->lpData, cds->cbData), uMsg, cds->cbData);
|
||||||
|
#else
|
||||||
Host_RunFile(cds->lpData, cds->cbData, NULL);
|
Host_RunFile(cds->lpData, cds->cbData, NULL);
|
||||||
|
#endif
|
||||||
lRet = 1;
|
lRet = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
GLAppActivate(FALSE, Minimized);
|
#ifdef WTHREAD
|
||||||
|
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0);
|
||||||
|
#else
|
||||||
|
GLAppActivate(FALSE, Minimized);//FIXME: thread
|
||||||
if (modestate == MS_FULLDIB)
|
if (modestate == MS_FULLDIB)
|
||||||
ShowWindow(mainwindow, SW_SHOWMINNOACTIVE);
|
ShowWindow(mainwindow, SW_SHOWMINNOACTIVE);
|
||||||
ClearAllStates ();
|
ClearAllStates (); //FIXME: thread
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case WM_SETFOCUS:
|
case WM_SETFOCUS:
|
||||||
if (!GLAppActivate(TRUE, Minimized))
|
#ifdef WTHREAD
|
||||||
|
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0);
|
||||||
|
#else
|
||||||
|
if (!GLAppActivate(TRUE, Minimized))//FIXME: thread
|
||||||
break;
|
break;
|
||||||
ClearAllStates ();
|
ClearAllStates (); //FIXME: thread
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_TOUCH:
|
case WM_TOUCH:
|
||||||
|
@ -2133,7 +2238,11 @@ LONG WINAPI GLMainWndProc (
|
||||||
|
|
||||||
case WM_MOVE:
|
case WM_MOVE:
|
||||||
VID_UpdateWindowStatus (hWnd);
|
VID_UpdateWindowStatus (hWnd);
|
||||||
|
#ifdef WTHREAD
|
||||||
|
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0);
|
||||||
|
#else
|
||||||
Cvar_ForceCallback(&vid_conautoscale);
|
Cvar_ForceCallback(&vid_conautoscale);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN:
|
||||||
|
@ -2209,7 +2318,7 @@ LONG WINAPI GLMainWndProc (
|
||||||
temp |= 512;
|
temp |= 512;
|
||||||
|
|
||||||
if (!vid_initializing)
|
if (!vid_initializing)
|
||||||
INS_MouseEvent (temp);
|
INS_MouseEvent (temp); //FIXME: thread (halflife)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2221,13 +2330,13 @@ LONG WINAPI GLMainWndProc (
|
||||||
{
|
{
|
||||||
if ((short) HIWORD(wParam&0xffffffff) > 0)
|
if ((short) HIWORD(wParam&0xffffffff) > 0)
|
||||||
{
|
{
|
||||||
Key_Event(0, K_MWHEELUP, 0, true);
|
IN_KeyEvent(0, true, K_MWHEELUP, 0);
|
||||||
Key_Event(0, K_MWHEELUP, 0, false);
|
IN_KeyEvent(0, false, K_MWHEELUP, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Key_Event(0, K_MWHEELDOWN, 0, true);
|
IN_KeyEvent(0, true, K_MWHEELDOWN, 0);
|
||||||
Key_Event(0, K_MWHEELDOWN, 0, false);
|
IN_KeyEvent(0, false, K_MWHEELDOWN, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2241,6 +2350,9 @@ LONG WINAPI GLMainWndProc (
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_USER+4:
|
||||||
|
PostQuitMessage(0);
|
||||||
|
break;
|
||||||
case WM_USER:
|
case WM_USER:
|
||||||
#ifndef NOMEDIA
|
#ifndef NOMEDIA
|
||||||
STT_Event();
|
STT_Event();
|
||||||
|
@ -2265,13 +2377,17 @@ LONG WINAPI GLMainWndProc (
|
||||||
if (!vid_initializing)
|
if (!vid_initializing)
|
||||||
{
|
{
|
||||||
VID_UpdateWindowStatus (hWnd);
|
VID_UpdateWindowStatus (hWnd);
|
||||||
|
#ifdef WTHREAD
|
||||||
|
COM_AddWork(0, MainThreadWndProc, NULL, NULL, uMsg, 0);
|
||||||
|
#else
|
||||||
Cvar_ForceCallback(&vid_conautoscale);
|
Cvar_ForceCallback(&vid_conautoscale);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
if (!vid_initializing)
|
if (!vid_initializing)
|
||||||
if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit",
|
if (MessageBox (hWnd, "Are you sure you want to quit?", "Confirm Exit",
|
||||||
MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES)
|
MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES)
|
||||||
{
|
{
|
||||||
Cbuf_AddText("\nquit\n", RESTRICT_LOCAL);
|
Cbuf_AddText("\nquit\n", RESTRICT_LOCAL);
|
||||||
|
@ -2280,24 +2396,28 @@ LONG WINAPI GLMainWndProc (
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
lRet = TRUE;
|
||||||
|
break;
|
||||||
|
/*
|
||||||
case WM_ACTIVATE:
|
case WM_ACTIVATE:
|
||||||
// fActive = LOWORD(wParam);
|
// fActive = LOWORD(wParam);
|
||||||
// fMinimized = (BOOL) HIWORD(wParam);
|
// fMinimized = (BOOL) HIWORD(wParam);
|
||||||
// if (!GLAppActivate(!(fActive == WA_INACTIVE), fMinimized))
|
// if (!GLAppActivate(!(fActive == WA_INACTIVE), fMinimized))
|
||||||
break;//so, urm, tell me microsoft, what changed?
|
break;//so, urm, tell me microsoft, what changed?
|
||||||
if (modestate == MS_FULLDIB)
|
if (modestate == MS_FULLDIB)
|
||||||
ShowWindow(mainwindow, SW_SHOWNORMAL);
|
ShowWindow(hWnd, SW_SHOWNORMAL);
|
||||||
|
|
||||||
|
#ifdef WTHREAD
|
||||||
|
#else
|
||||||
// fix the leftover Alt from any Alt-Tab or the like that switched us away
|
// fix the leftover Alt from any Alt-Tab or the like that switched us away
|
||||||
ClearAllStates ();
|
ClearAllStates (); //FIXME: thread
|
||||||
|
|
||||||
Cvar_ForceCallback(&vid_conautoscale);
|
|
||||||
|
|
||||||
|
Cvar_ForceCallback(&vid_conautoscale); //FIXME: thread
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
*/
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
if (dibwindow)
|
|
||||||
DestroyWindow (dibwindow);
|
|
||||||
break;
|
break;
|
||||||
case WM_SETCURSOR:
|
case WM_SETCURSOR:
|
||||||
//only use a custom cursor if the cursor is inside the client area
|
//only use a custom cursor if the cursor is inside the client area
|
||||||
|
@ -2318,9 +2438,11 @@ LONG WINAPI GLMainWndProc (
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifndef WTHREAD
|
||||||
case MM_MCINOTIFY:
|
case MM_MCINOTIFY:
|
||||||
lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam);
|
lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); //FIXME: thread
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* pass all unhandled messages to DefWindowProc */
|
/* pass all unhandled messages to DefWindowProc */
|
||||||
|
|
|
@ -90,7 +90,7 @@ void R_DrawSkyChain (batch_t *batch)
|
||||||
if (skyshader->numpasses)
|
if (skyshader->numpasses)
|
||||||
{
|
{
|
||||||
#if defined(GLQUAKE) && !defined(ANDROID)
|
#if defined(GLQUAKE) && !defined(ANDROID)
|
||||||
if (*r_fastsky.string && qrenderer == QR_OPENGL && TEXVALID(batch->shader->defaulttextures.base) && TEXVALID(batch->shader->defaulttextures.fullbright))
|
if (*r_fastsky.string && qrenderer == QR_OPENGL && TEXVALID(batch->shader->defaulttextures->base) && TEXVALID(batch->shader->defaulttextures->fullbright))
|
||||||
{
|
{
|
||||||
R_CalcSkyChainBounds(batch);
|
R_CalcSkyChainBounds(batch);
|
||||||
|
|
||||||
|
@ -459,7 +459,7 @@ static void GL_SkyForceDepth(batch_t *batch)
|
||||||
if (!cls.allow_skyboxes && batch->texture) //allow a little extra fps.
|
if (!cls.allow_skyboxes && batch->texture) //allow a little extra fps.
|
||||||
{
|
{
|
||||||
BE_SelectMode(BEM_DEPTHONLY);
|
BE_SelectMode(BEM_DEPTHONLY);
|
||||||
BE_DrawMesh_List(batch->shader, batch->meshes-batch->firstmesh, batch->mesh+batch->firstmesh, batch->vbo, &batch->shader->defaulttextures, batch->flags);
|
BE_DrawMesh_List(batch->shader, batch->meshes-batch->firstmesh, batch->mesh+batch->firstmesh, batch->vbo, NULL, batch->flags);
|
||||||
BE_SelectMode(BEM_STANDARD); /*skys only render in standard mode anyway, so this is safe*/
|
BE_SelectMode(BEM_STANDARD); /*skys only render in standard mode anyway, so this is safe*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -494,7 +494,7 @@ static void R_DrawSkyMesh(batch_t *batch, mesh_t *m, shader_t *shader)
|
||||||
b.mesh = &m;
|
b.mesh = &m;
|
||||||
b.ent = &skyent;
|
b.ent = &skyent;
|
||||||
b.shader = shader;
|
b.shader = shader;
|
||||||
b.skin = &shader->defaulttextures;
|
b.skin = NULL;
|
||||||
b.texture = NULL;
|
b.texture = NULL;
|
||||||
b.vbo = NULL;
|
b.vbo = NULL;
|
||||||
BE_SubmitBatch(&b);
|
BE_SubmitBatch(&b);
|
||||||
|
@ -643,7 +643,7 @@ static void GL_DrawSkyGrid (texture_t *tex)
|
||||||
int i;
|
int i;
|
||||||
float time = cl.gametime+realtime-cl.gametimemark;
|
float time = cl.gametime+realtime-cl.gametimemark;
|
||||||
|
|
||||||
GL_LazyBind(0, GL_TEXTURE_2D, tex->shader->defaulttextures.base);
|
GL_LazyBind(0, GL_TEXTURE_2D, tex->shader->defaulttextures->base);
|
||||||
|
|
||||||
speedscale = time*8;
|
speedscale = time*8;
|
||||||
speedscale -= (int)speedscale & ~127;
|
speedscale -= (int)speedscale & ~127;
|
||||||
|
@ -656,7 +656,7 @@ static void GL_DrawSkyGrid (texture_t *tex)
|
||||||
}
|
}
|
||||||
|
|
||||||
qglEnable (GL_BLEND);
|
qglEnable (GL_BLEND);
|
||||||
GL_LazyBind(0, GL_TEXTURE_2D, tex->shader->defaulttextures.fullbright);
|
GL_LazyBind(0, GL_TEXTURE_2D, tex->shader->defaulttextures->fullbright);
|
||||||
|
|
||||||
speedscale = time*16;
|
speedscale = time*16;
|
||||||
speedscale -= (int)speedscale & ~127;
|
speedscale -= (int)speedscale & ~127;
|
||||||
|
@ -730,7 +730,7 @@ static void GL_DrawSkyBox (texid_t *texnums, batch_t *s)
|
||||||
GL_MakeSkyVec (skymaxs[0][i], skymaxs[1][i], i, skyface_vertex[2], skyface_texcoord[2]);
|
GL_MakeSkyVec (skymaxs[0][i], skymaxs[1][i], i, skyface_vertex[2], skyface_texcoord[2]);
|
||||||
GL_MakeSkyVec (skymaxs[0][i], skymins[1][i], i, skyface_vertex[3], skyface_texcoord[3]);
|
GL_MakeSkyVec (skymaxs[0][i], skymins[1][i], i, skyface_vertex[3], skyface_texcoord[3]);
|
||||||
|
|
||||||
skyboxface->defaulttextures.base = texnums[skytexorder[i]];
|
skyboxface->defaulttextures->base = texnums[skytexorder[i]];
|
||||||
R_DrawSkyMesh(s, &skyfacemesh, skyboxface);
|
R_DrawSkyMesh(s, &skyfacemesh, skyboxface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -744,7 +744,7 @@ R_InitSky
|
||||||
A sky texture is 256*128, with the right side being a masked overlay
|
A sky texture is 256*128, with the right side being a masked overlay
|
||||||
==============
|
==============
|
||||||
*/
|
*/
|
||||||
void R_InitSky (struct texnums_s *tn, const char *skyname, qbyte *src, unsigned int width, unsigned int height)
|
void R_InitSky (shader_t *shader, const char *skyname, qbyte *src, unsigned int width, unsigned int height)
|
||||||
{
|
{
|
||||||
int i, j, p;
|
int i, j, p;
|
||||||
unsigned trans[128*128];
|
unsigned trans[128*128];
|
||||||
|
@ -756,8 +756,6 @@ void R_InitSky (struct texnums_s *tn, const char *skyname, qbyte *src, unsigned
|
||||||
unsigned int stride = width;
|
unsigned int stride = width;
|
||||||
width /= 2;
|
width /= 2;
|
||||||
|
|
||||||
memset(tn, 0, sizeof(*tn));
|
|
||||||
|
|
||||||
if (width < 1 || height < 1 || stride != width*2)
|
if (width < 1 || height < 1 || stride != width*2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -776,10 +774,15 @@ void R_InitSky (struct texnums_s *tn, const char *skyname, qbyte *src, unsigned
|
||||||
b += ((qbyte *)rgba)[2];
|
b += ((qbyte *)rgba)[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!shader->defaulttextures->base)
|
||||||
|
{
|
||||||
Q_snprintfz(name, sizeof(name), "%s_solid", skyname);
|
Q_snprintfz(name, sizeof(name), "%s_solid", skyname);
|
||||||
Q_strlwr(name);
|
Q_strlwr(name);
|
||||||
tn->base = R_LoadReplacementTexture(name, NULL, IF_NOALPHA, trans, width, height, TF_RGBX32);
|
shader->defaulttextures->base = R_LoadReplacementTexture(name, NULL, IF_NOALPHA, trans, width, height, TF_RGBX32);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shader->defaulttextures->fullbright)
|
||||||
|
{
|
||||||
((qbyte *)&transpix)[0] = r/(width*height);
|
((qbyte *)&transpix)[0] = r/(width*height);
|
||||||
((qbyte *)&transpix)[1] = g/(width*height);
|
((qbyte *)&transpix)[1] = g/(width*height);
|
||||||
((qbyte *)&transpix)[2] = b/(width*height);
|
((qbyte *)&transpix)[2] = b/(width*height);
|
||||||
|
@ -798,6 +801,7 @@ void R_InitSky (struct texnums_s *tn, const char *skyname, qbyte *src, unsigned
|
||||||
//FIXME: support _trans
|
//FIXME: support _trans
|
||||||
Q_snprintfz(name, sizeof(name), "%s_alpha", skyname);
|
Q_snprintfz(name, sizeof(name), "%s_alpha", skyname);
|
||||||
Q_strlwr(name);
|
Q_strlwr(name);
|
||||||
tn->fullbright = R_LoadReplacementTexture(name, NULL, 0, trans, width, height, TF_RGBA32);
|
shader->defaulttextures->fullbright = R_LoadReplacementTexture(name, NULL, 0, trans, width, height, TF_RGBA32);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -390,17 +390,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"struct a2v\n"
|
"struct a2v\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float4 pos: POSITION;\n"
|
"float4 pos: POSITION;\n"
|
||||||
"float3 normal: NORMAL;\n"
|
|
||||||
"#ifdef MASK\n"
|
|
||||||
"float4 tc: TEXCOORD0;\n"
|
|
||||||
"#endif\n"
|
|
||||||
"};\n"
|
"};\n"
|
||||||
"struct v2f\n"
|
"struct v2f\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
"float3 col: TEXCOORD;\n"
|
||||||
"float4 pos: SV_POSITION;\n"
|
"float4 pos: SV_POSITION;\n"
|
||||||
"#ifdef MASK\n"
|
|
||||||
"float2 tc: TEXCOORD0;\n"
|
|
||||||
"#endif\n"
|
|
||||||
"};\n"
|
"};\n"
|
||||||
|
|
||||||
"#include <ftedefs.h>\n"
|
"#include <ftedefs.h>\n"
|
||||||
|
@ -412,44 +406,25 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"outp.pos = mul(m_model, inp.pos);\n"
|
"outp.pos = mul(m_model, inp.pos);\n"
|
||||||
"outp.pos = mul(m_view, outp.pos);\n"
|
"outp.pos = mul(m_view, outp.pos);\n"
|
||||||
"outp.pos = mul(m_projection, outp.pos);\n"
|
"outp.pos = mul(m_projection, outp.pos);\n"
|
||||||
|
"outp.col = inp.pos.xyz - l_lightposition;\n"
|
||||||
"#ifdef MASK\n"
|
|
||||||
"outp.tc = inp.tc.xy;\n"
|
|
||||||
"#endif\n"
|
|
||||||
|
|
||||||
"return outp;\n"
|
"return outp;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
|
||||||
"#ifdef MASK\n"
|
|
||||||
"Texture2D shaderTexture[1];\n"
|
|
||||||
"SamplerState SampleType[1];\n"
|
|
||||||
"#endif\n"
|
|
||||||
|
|
||||||
"#if LEVEL < 1000\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
|
"#if LEVEL < 0x10000\n"
|
||||||
//pre dx10 requires that we ALWAYS write to a target.
|
//pre dx10 requires that we ALWAYS write to a target.
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
|
"{\n"
|
||||||
|
"return float4(0, 0, 0, 1);\n"
|
||||||
|
"}\n"
|
||||||
"#else\n"
|
"#else\n"
|
||||||
//but on 10, it'll write depth automatically and we don't care about colour.
|
//but on 10, it'll write depth automatically and we don't care about colour.
|
||||||
"void main (v2f inp) //dx10-level\n"
|
"void main (v2f inp)\n"
|
||||||
"#endif\n"
|
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
||||||
"#ifdef MASK\n"
|
|
||||||
"float alpha = shaderTexture[0].Sample(SampleType[0], inp.tc).a;\n"
|
|
||||||
"#ifndef MASKOP\n"
|
|
||||||
"#define MASKOP >= //drawn if (alpha OP ref) is true.\n"
|
|
||||||
"#endif\n"
|
|
||||||
//support for alpha masking
|
|
||||||
"if (!(alpha MASKOP MASK))\n"
|
|
||||||
"discard;\n"
|
|
||||||
"#endif\n"
|
|
||||||
|
|
||||||
"#if LEVEL < 1000\n"
|
|
||||||
"return float4(0, 0, 0, 1);\n"
|
|
||||||
"#endif\n"
|
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
"#endif\n"
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef GLQUAKE
|
#ifdef GLQUAKE
|
||||||
|
@ -507,9 +482,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"v2f main (a2v inp)\n"
|
"v2f main (a2v inp)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"v2f outp;\n"
|
"v2f outp;\n"
|
||||||
"outp.pos = mul(m_model, inp.pos);\n"
|
"outp.pos = mul(m_projection, inp.pos);\n"
|
||||||
"outp.pos = mul(m_view, outp.pos);\n"
|
|
||||||
"outp.pos = mul(m_projection, outp.pos);\n"
|
|
||||||
"outp.tc = inp.tc;\n"
|
"outp.tc = inp.tc;\n"
|
||||||
"outp.vcol = inp.vcol;\n"
|
"outp.vcol = inp.vcol;\n"
|
||||||
"return outp;\n"
|
"return outp;\n"
|
||||||
|
@ -517,11 +490,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture;\n"
|
"Texture2D t_t0;\n"
|
||||||
"SamplerState SampleType;\n"
|
"SamplerState s_t0;\n"
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"return shaderTexture.Sample(SampleType, inp.tc) * inp.vcol;\n"
|
"return t_t0.Sample(s_t0, inp.tc) * inp.vcol;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
@ -693,14 +666,22 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture[4]; //diffuse, lower, upper, fullbright\n"
|
"Texture2D t_diffuse : register(t0);\n"
|
||||||
|
"#ifdef UPPER\n"
|
||||||
|
"Texture2D t_upper : register(t1);\n"
|
||||||
|
"Texture2D t_lower : register(t2);\n"
|
||||||
|
"Texture2D t_fullbright : register(t3);\n"
|
||||||
|
"#else\n"
|
||||||
|
"Texture2D t_fullbright : register(t1);\n"
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
"SamplerState SampleType;\n"
|
"SamplerState SampleType;\n"
|
||||||
|
|
||||||
//uniform vec4 e_colourident;
|
//uniform vec4 e_colourident;
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float4 col;\n"
|
"float4 col;\n"
|
||||||
"col = shaderTexture[0].Sample(SampleType, inp.tc);\n"
|
"col = t_diffuse.Sample(SampleType, inp.tc);\n"
|
||||||
|
|
||||||
"#ifdef MASK\n"
|
"#ifdef MASK\n"
|
||||||
"#ifndef MASKOP\n"
|
"#ifndef MASKOP\n"
|
||||||
|
@ -712,18 +693,18 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef UPPER\n"
|
"#ifdef UPPER\n"
|
||||||
"float4 uc = shaderTexture[2].Sample(SampleType, inp.tc);\n"
|
"float4 uc = t_upper.Sample(SampleType, inp.tc);\n"
|
||||||
"col.rgb = mix(col.rgb, uc.rgb*e_uppercolour, uc.a);\n"
|
"col.rgb = lerp(col.rgb, uc.rgb*e_uppercolour, uc.a);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef LOWER\n"
|
"#ifdef LOWER\n"
|
||||||
"float4 lc = shaderTexture[1].Sample(SampleType, inp.tc);\n"
|
"float4 lc = t_lower.Sample(SampleType, inp.tc);\n"
|
||||||
"col.rgb = mix(col.rgb, lc.rgb*e_lowercolour, lc.a);\n"
|
"col.rgb = lerp(col.rgb, lc.rgb*e_lowercolour, lc.a);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"col.rgb *= inp.light;\n"
|
"col.rgb *= inp.light;\n"
|
||||||
"#ifdef FULLBRIGHT\n"
|
//#ifdef FULLBRIGHT
|
||||||
"float4 fb = shaderTexture[3].Sample(SampleType, inp.tc);\n"
|
"float4 fb = t_fullbright.Sample(SampleType, inp.tc);\n"
|
||||||
"col.rgb = mix(col.rgb, fb.rgb, fb.a);\n"
|
"col.rgb = lerp(col.rgb, fb.rgb, fb.a);\n"
|
||||||
"#endif\n"
|
//#endif
|
||||||
"return col;\n"
|
"return col;\n"
|
||||||
// return fog4(col * e_colourident);
|
// return fog4(col * e_colourident);
|
||||||
"}\n"
|
"}\n"
|
||||||
|
@ -852,8 +833,10 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture[2];\n"
|
"Texture2D t_diffuse : register(t0);\n"
|
||||||
"SamplerState SampleType;\n"
|
"Texture2D t_fullbright : register(t1);\n"
|
||||||
|
"SamplerState s_diffuse : register(s0);\n"
|
||||||
|
"SamplerState s_fullbright : register(s1);\n"
|
||||||
|
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -862,10 +845,10 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"dir.z *= 3.0;\n"
|
"dir.z *= 3.0;\n"
|
||||||
"dir.xy /= 0.5*length(dir);\n"
|
"dir.xy /= 0.5*length(dir);\n"
|
||||||
"tccoord = (dir.xy + e_time*0.03125);\n"
|
"tccoord = (dir.xy + e_time*0.03125);\n"
|
||||||
"float4 solid = shaderTexture[0].Sample(SampleType, tccoord);\n"
|
"float4 solid = t_diffuse.Sample(s_diffuse, tccoord);\n"
|
||||||
"tccoord = (dir.xy + e_time*0.0625);\n"
|
"tccoord = (dir.xy + e_time*0.0625);\n"
|
||||||
"float4 clouds = shaderTexture[1].Sample(SampleType, tccoord);\n"
|
"float4 clouds = t_fullbright.Sample(s_fullbright, tccoord);\n"
|
||||||
"return (solid*(1.0-clouds.a)) + (clouds.a*clouds);\n"
|
"return lerp(solid, clouds, clouds.a);\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
@ -992,11 +975,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture;\n"
|
"Texture2D t_diffuse : register(t0);\n"
|
||||||
"SamplerState SampleType;\n"
|
"SamplerState s_diffuse : register(s0);\n"
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float4 tex = shaderTexture.Sample(SampleType, inp.tc);\n"
|
"float4 tex = t_diffuse.Sample(s_diffuse, inp.tc);\n"
|
||||||
"#ifdef MASK\n"
|
"#ifdef MASK\n"
|
||||||
"if (tex.a < float(MASK))\n"
|
"if (tex.a < float(MASK))\n"
|
||||||
"discard;\n"
|
"discard;\n"
|
||||||
|
@ -1015,6 +998,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"!!permu LIGHTSTYLED\n"
|
"!!permu LIGHTSTYLED\n"
|
||||||
"!!permu BUMP\n"
|
"!!permu BUMP\n"
|
||||||
"!!permu SPECULAR\n"
|
"!!permu SPECULAR\n"
|
||||||
|
"!!permu REFLECTCUBEMASK\n"
|
||||||
"!!cvarf r_glsl_offsetmapping_scale\n"
|
"!!cvarf r_glsl_offsetmapping_scale\n"
|
||||||
"!!cvarf gl_specular\n"
|
"!!cvarf gl_specular\n"
|
||||||
|
|
||||||
|
@ -1024,10 +1008,14 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
//note that the '286' preset uses drawflat_walls instead.
|
//note that the '286' preset uses drawflat_walls instead.
|
||||||
|
|
||||||
"#include \"sys/fog.h\"\n"
|
"#include \"sys/fog.h\"\n"
|
||||||
"#if defined(OFFSETMAPPING) || defined(SPECULAR)\n"
|
"#if defined(OFFSETMAPPING) || defined(SPECULAR) || defined(REFLECTCUBEMASK)\n"
|
||||||
"varying vec3 eyevector;\n"
|
"varying vec3 eyevector;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"varying mat3 invsurface;\n"
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
"varying vec2 tc;\n"
|
"varying vec2 tc;\n"
|
||||||
"#ifdef LIGHTSTYLED\n"
|
"#ifdef LIGHTSTYLED\n"
|
||||||
//we could use an offset, but that would still need to be per-surface which would break batches
|
//we could use an offset, but that would still need to be per-surface which would break batches
|
||||||
|
@ -1040,12 +1028,17 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"void main ()\n"
|
"void main ()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"#if defined(OFFSETMAPPING) || defined(SPECULAR)\n"
|
"#if defined(OFFSETMAPPING) || defined(SPECULAR) || defined(REFLECTCUBEMASK)\n"
|
||||||
"vec3 eyeminusvertex = e_eyepos - v_position.xyz;\n"
|
"vec3 eyeminusvertex = e_eyepos - v_position.xyz;\n"
|
||||||
"eyevector.x = dot(eyeminusvertex, v_svector.xyz);\n"
|
"eyevector.x = dot(eyeminusvertex, v_svector.xyz);\n"
|
||||||
"eyevector.y = dot(eyeminusvertex, v_tvector.xyz);\n"
|
"eyevector.y = dot(eyeminusvertex, v_tvector.xyz);\n"
|
||||||
"eyevector.z = dot(eyeminusvertex, v_normal.xyz);\n"
|
"eyevector.z = dot(eyeminusvertex, v_normal.xyz);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"invsurface[0] = v_svector;\n"
|
||||||
|
"invsurface[1] = v_tvector;\n"
|
||||||
|
"invsurface[2] = v_normal;\n"
|
||||||
|
"#endif\n"
|
||||||
"tc = v_texcoord;\n"
|
"tc = v_texcoord;\n"
|
||||||
"lm0 = v_lmcoord;\n"
|
"lm0 = v_lmcoord;\n"
|
||||||
"#ifdef LIGHTSTYLED\n"
|
"#ifdef LIGHTSTYLED\n"
|
||||||
|
@ -1090,9 +1083,9 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
//yay, regular texture!
|
//yay, regular texture!
|
||||||
"gl_FragColor = texture2D(s_diffuse, tc);\n"
|
"gl_FragColor = texture2D(s_diffuse, tc);\n"
|
||||||
|
|
||||||
"#if defined(BUMP) && (defined(DELUXE) || defined(SPECULAR))\n"
|
"#if defined(BUMP) && (defined(DELUXE) || defined(SPECULAR) || defined(REFLECTCUBEMASK))\n"
|
||||||
"vec3 norm = normalize(texture2D(s_normalmap, tc).rgb - 0.5);\n"
|
"vec3 norm = normalize(texture2D(s_normalmap, tc).rgb - 0.5);\n"
|
||||||
"#elif defined(SPECULAR) || defined(DELUXE)\n"
|
"#elif defined(SPECULAR) || defined(DELUXE) || defined(REFLECTCUBEMASK)\n"
|
||||||
"vec3 norm = vec3(0, 0, 1); //specular lighting expects this to exist.\n"
|
"vec3 norm = vec3(0, 0, 1); //specular lighting expects this to exist.\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
@ -1138,6 +1131,13 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"gl_FragColor.rgb += spec * specs.rgb;\n"
|
"gl_FragColor.rgb += spec * specs.rgb;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"vec3 rtc = reflect(-eyevector, norm);\n"
|
||||||
|
"rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2];\n"
|
||||||
|
"rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;\n"
|
||||||
|
"gl_FragColor.rgb += texture2D(s_reflectmask, tc).rgb * textureCube(s_reflectcube, rtc).rgb;\n"
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef EIGHTBIT //FIXME: with this extra flag, half the permutations are redundant.\n"
|
"#ifdef EIGHTBIT //FIXME: with this extra flag, half the permutations are redundant.\n"
|
||||||
"lightmaps *= 0.5; //counter the fact that the colourmap contains overbright values and logically ranges from 0 to 2 intead of to 1.\n"
|
"lightmaps *= 0.5; //counter the fact that the colourmap contains overbright values and logically ranges from 0 to 2 intead of to 1.\n"
|
||||||
"float pal = texture2D(s_paletted, tc).r; //the palette index. hopefully not interpolated.\n"
|
"float pal = texture2D(s_paletted, tc).r; //the palette index. hopefully not interpolated.\n"
|
||||||
|
@ -1155,7 +1155,6 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
|
||||||
//entity modifiers
|
//entity modifiers
|
||||||
"gl_FragColor = gl_FragColor * e_colourident;\n"
|
"gl_FragColor = gl_FragColor * e_colourident;\n"
|
||||||
|
|
||||||
|
@ -1197,24 +1196,23 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture[2];\n"
|
"Texture2D t_lightmap : register(t2);\n"
|
||||||
"SamplerState SampleType[2];\n"
|
"SamplerState s_lightmap : register(s2);\n"
|
||||||
|
|
||||||
|
"Texture2D t_diffuse : register(s0);\n"
|
||||||
|
"SamplerState s_diffuse : register(s0);\n"
|
||||||
|
|
||||||
|
"Texture2D t_fullbright : register(s1);\n"
|
||||||
|
"SamplerState s_fullbright : register(s1);\n"
|
||||||
|
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float4 tex = shaderTexture[0].Sample(SampleType[0], inp.tc);\n"
|
"float4 result;\n"
|
||||||
"float4 lm = shaderTexture[1].Sample(SampleType[1], inp.lmtc);\n"
|
"result = t_diffuse.Sample(s_diffuse, inp.tc);\n"
|
||||||
|
"result.rgb *= t_lightmap.Sample(s_lightmap, inp.lmtc).bgr * e_lmscale[0].rgb;\n"
|
||||||
"#ifdef MASK\n"
|
"float4 fb = t_fullbright.Sample(s_fullbright, inp.tc);\n"
|
||||||
"#ifndef MASKOP\n"
|
"result.rgb += fb.rgb * fb.a;//lerp(result.rgb, fb.rgb, fb.a);\n"
|
||||||
"#define MASKOP >= //drawn if (alpha OP ref) is true.\n"
|
"return result;\n"
|
||||||
"#endif\n"
|
|
||||||
//support for alpha masking
|
|
||||||
"if (!(tex.a MASKOP MASK))\n"
|
|
||||||
"discard;\n"
|
|
||||||
"#endif\n"
|
|
||||||
|
|
||||||
"return tex * lm.bgra;\n"
|
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
@ -1331,15 +1329,14 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
// float cvar_r_wateralpha;
|
// float cvar_r_wateralpha;
|
||||||
// float e_time;
|
// float e_time;
|
||||||
// sampler s_t0;
|
"SamplerState s_diffuse;\n"
|
||||||
"Texture2D shaderTexture;\n"
|
"Texture2D t_diffuse;\n"
|
||||||
"SamplerState SampleType;\n"
|
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"float2 ntc;\n"
|
"float2 ntc;\n"
|
||||||
"ntc.x = inp.tc.x + sin(inp.tc.y+e_time)*0.125;\n"
|
"ntc.x = inp.tc.x + sin(inp.tc.y+e_time)*0.125;\n"
|
||||||
"ntc.y = inp.tc.y + sin(inp.tc.x+e_time)*0.125;\n"
|
"ntc.y = inp.tc.y + sin(inp.tc.x+e_time)*0.125;\n"
|
||||||
"return shaderTexture.Sample(SampleType, ntc);\n"
|
"return t_diffuse.Sample(s_diffuse, ntc);\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
@ -1437,12 +1434,12 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"Texture2D shaderTexture;\n"
|
"Texture2D t_lightmap : register(t0);\n"
|
||||||
"SamplerState SampleType;\n"
|
"SamplerState s_lightmap : register(s0);\n"
|
||||||
|
|
||||||
"float4 main (v2f inp) : SV_TARGET\n"
|
"float4 main (v2f inp) : SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"return inp.col * shaderTexture.Sample(SampleType, inp.lmtc);\n"
|
"return inp.col * t_lightmap.Sample(s_lightmap, inp.lmtc);\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
|
@ -1664,6 +1661,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"!!permu SKELETAL\n"
|
"!!permu SKELETAL\n"
|
||||||
"!!permu UPPERLOWER\n"
|
"!!permu UPPERLOWER\n"
|
||||||
"!!permu FOG\n"
|
"!!permu FOG\n"
|
||||||
|
"!!permu REFLECTCUBEMASK\n"
|
||||||
"!!cvarf r_glsl_offsetmapping_scale\n"
|
"!!cvarf r_glsl_offsetmapping_scale\n"
|
||||||
"!!cvardf r_glsl_pcf\n"
|
"!!cvardf r_glsl_pcf\n"
|
||||||
|
|
||||||
|
@ -1691,11 +1689,8 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#define r_glsl_pcf 9\n"
|
"#define r_glsl_pcf 9\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
"#if 0 && defined(GL_ARB_texture_gather) && defined(PCF) \n"
|
||||||
//texturegather is a gl4 feature, but these shaders are gl2.0 or something
|
|
||||||
"#if #include \"cvar/texgather\" && defined(GL_ARB_texture_gather) && defined(PCF) \n"
|
|
||||||
"#extension GL_ARB_texture_gather : enable\n"
|
"#extension GL_ARB_texture_gather : enable\n"
|
||||||
"#define DOTEXTUREGATHER\n"
|
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef UPPERLOWER\n"
|
"#ifdef UPPERLOWER\n"
|
||||||
|
@ -1714,9 +1709,13 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
|
|
||||||
"varying vec2 tcbase;\n"
|
"varying vec2 tcbase;\n"
|
||||||
"varying vec3 lightvector;\n"
|
"varying vec3 lightvector;\n"
|
||||||
"#if defined(SPECULAR) || defined(OFFSETMAPPING)\n"
|
"#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)\n"
|
||||||
"varying vec3 eyevector;\n"
|
"varying vec3 eyevector;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"varying mat3 invsurface;\n"
|
||||||
|
"uniform mat4 m_model;\n"
|
||||||
|
"#endif\n"
|
||||||
"#if defined(PCF) || defined(CUBE) || defined(SPOT)\n"
|
"#if defined(PCF) || defined(CUBE) || defined(SPOT)\n"
|
||||||
"varying vec4 vtexprojcoord;\n"
|
"varying vec4 vtexprojcoord;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
@ -1729,7 +1728,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#include \"sys/skeletal.h\"\n"
|
"#include \"sys/skeletal.h\"\n"
|
||||||
"uniform vec3 l_lightposition;\n"
|
"uniform vec3 l_lightposition;\n"
|
||||||
"attribute vec2 v_texcoord;\n"
|
"attribute vec2 v_texcoord;\n"
|
||||||
"#if defined(SPECULAR) || defined(OFFSETMAPPING)\n"
|
"#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)\n"
|
||||||
"uniform vec3 e_eyepos;\n"
|
"uniform vec3 e_eyepos;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"void main ()\n"
|
"void main ()\n"
|
||||||
|
@ -1747,12 +1746,17 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"lightvector.y = dot(lightminusvertex, t.xyz);\n"
|
"lightvector.y = dot(lightminusvertex, t.xyz);\n"
|
||||||
"lightvector.z = dot(lightminusvertex, n.xyz);\n"
|
"lightvector.z = dot(lightminusvertex, n.xyz);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#if defined(SPECULAR)||defined(OFFSETMAPPING)\n"
|
"#if defined(SPECULAR)||defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)\n"
|
||||||
"vec3 eyeminusvertex = e_eyepos - w.xyz;\n"
|
"vec3 eyeminusvertex = e_eyepos - w.xyz;\n"
|
||||||
"eyevector.x = dot(eyeminusvertex, s.xyz);\n"
|
"eyevector.x = dot(eyeminusvertex, s.xyz);\n"
|
||||||
"eyevector.y = dot(eyeminusvertex, t.xyz);\n"
|
"eyevector.y = dot(eyeminusvertex, t.xyz);\n"
|
||||||
"eyevector.z = dot(eyeminusvertex, n.xyz);\n"
|
"eyevector.z = dot(eyeminusvertex, n.xyz);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"invsurface[0] = v_svector;\n"
|
||||||
|
"invsurface[1] = v_tvector;\n"
|
||||||
|
"invsurface[2] = v_normal;\n"
|
||||||
|
"#endif\n"
|
||||||
"#if defined(PCF) || defined(SPOT) || defined(CUBE)\n"
|
"#if defined(PCF) || defined(SPOT) || defined(CUBE)\n"
|
||||||
//for texture projections/shadowmapping on dlights
|
//for texture projections/shadowmapping on dlights
|
||||||
"vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));\n"
|
"vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));\n"
|
||||||
|
@ -1767,7 +1771,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#include \"sys/fog.h\"\n"
|
"#include \"sys/fog.h\"\n"
|
||||||
"uniform sampler2D s_t0; //diffuse\n"
|
"uniform sampler2D s_t0; //diffuse\n"
|
||||||
|
|
||||||
"#if defined(BUMP) || defined(SPECULAR) || defined(OFFSETMAPPING)\n"
|
"#if defined(BUMP) || defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)\n"
|
||||||
"uniform sampler2D s_t1; //normalmap\n"
|
"uniform sampler2D s_t1; //normalmap\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef SPECULAR\n"
|
"#ifdef SPECULAR\n"
|
||||||
|
@ -1796,6 +1800,11 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"uniform vec3 e_uppercolour;\n"
|
"uniform vec3 e_uppercolour;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"uniform sampler2D s_reflectmask;\n"
|
||||||
|
"uniform samplerCube s_reflectcube;\n"
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
|
|
||||||
"uniform float l_lightradius;\n"
|
"uniform float l_lightradius;\n"
|
||||||
"uniform vec3 l_lightcolour;\n"
|
"uniform vec3 l_lightcolour;\n"
|
||||||
|
@ -1854,7 +1863,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"{\n"
|
"{\n"
|
||||||
"vec3 shadowcoord = ShadowmapCoord();\n"
|
"vec3 shadowcoord = ShadowmapCoord();\n"
|
||||||
|
|
||||||
"#ifdef DOTEXTUREGATHER\n"
|
"#if 0//def GL_ARB_texture_gather\n"
|
||||||
"vec2 ipart, fpart;\n"
|
"vec2 ipart, fpart;\n"
|
||||||
"#define dosamp(x,y) textureGatherOffset(s_t4, ipart.xy, vec2(x,y)))\n"
|
"#define dosamp(x,y) textureGatherOffset(s_t4, ipart.xy, vec2(x,y)))\n"
|
||||||
"vec4 tl = step(shadowcoord.z, dosamp(-1.0, -1.0));\n"
|
"vec4 tl = step(shadowcoord.z, dosamp(-1.0, -1.0));\n"
|
||||||
|
@ -1924,8 +1933,10 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"vec4 lc = texture2D(s_t5, tcbase);\n"
|
"vec4 lc = texture2D(s_t5, tcbase);\n"
|
||||||
"bases.rgb += lc.rgb*e_lowercolour*lc.a;\n"
|
"bases.rgb += lc.rgb*e_lowercolour*lc.a;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#if defined(BUMP) || defined(SPECULAR)\n"
|
"#if defined(BUMP) || defined(SPECULAR) || defined(REFLECTCUBEMASK)\n"
|
||||||
"vec3 bumps = normalize(vec3(texture2D(s_t1, tcbase)) - 0.5);\n"
|
"vec3 bumps = normalize(vec3(texture2D(s_t1, tcbase)) - 0.5);\n"
|
||||||
|
"#elif defined(REFLECTCUBEMASK)\n"
|
||||||
|
"vec3 bumps = vec3(0.0,0.0,1.0);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef SPECULAR\n"
|
"#ifdef SPECULAR\n"
|
||||||
"vec4 specs = texture2D(s_t2, tcbase);\n"
|
"vec4 specs = texture2D(s_t2, tcbase);\n"
|
||||||
|
@ -1953,7 +1964,12 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"diff += l_lightcolourscale.z * spec * specs.rgb;\n"
|
"diff += l_lightcolourscale.z * spec * specs.rgb;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
"#ifdef REFLECTCUBEMASK\n"
|
||||||
|
"vec3 rtc = reflect(-eyevector, bumps);\n"
|
||||||
|
"rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2];\n"
|
||||||
|
"rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;\n"
|
||||||
|
"diff += texture2D(s_reflectmask, tcbase).rgb * textureCube(s_reflectcube, rtc).rgb;\n"
|
||||||
|
"#endif\n"
|
||||||
|
|
||||||
"#ifdef CUBE\n"
|
"#ifdef CUBE\n"
|
||||||
/*filter the colour by the cubemap projection*/
|
/*filter the colour by the cubemap projection*/
|
||||||
|
@ -1979,6 +1995,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
"gl_FragColor.rgb = fog3additive(diff*colorscale*l_lightcolour);\n"
|
"gl_FragColor.rgb = fog3additive(diff*colorscale*l_lightcolour);\n"
|
||||||
|
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
@ -2130,21 +2147,22 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
|
|
||||||
"Texture2D tx_base : register(t0);\n"
|
"Texture2D t_diffuse : register(t0);\n"
|
||||||
"Texture2D tx_bump : register(t1);\n"
|
"Texture2D t_normalmap : register(t1);\n"
|
||||||
"Texture2D tx_spec : register(t2);\n"
|
"Texture2D t_specular : register(t2);\n"
|
||||||
"TextureCube tx_cube : register(t3);\n"
|
"Texture2D t_upper : register(t3);\n"
|
||||||
"Texture2D tx_smap : register(t4);\n"
|
"Texture2D t_lower : register(t4);\n"
|
||||||
"Texture2D tx_lower : register(t5);\n"
|
"Texture2D t_shadowmap : register(t5);\n"
|
||||||
"Texture2D tx_upper : register(t6);\n"
|
"TextureCube t_projectionmap : register(t6);\n"
|
||||||
|
|
||||||
|
"SamplerState s_diffuse : register(s0);\n"
|
||||||
|
"SamplerState s_normalmap : register(s1);\n"
|
||||||
|
"SamplerState s_specular : register(s2);\n"
|
||||||
|
"SamplerState s_upper : register(s3);\n"
|
||||||
|
"SamplerState s_lower : register(s4);\n"
|
||||||
|
"SamplerComparisonState s_shadowmap : register(s5);\n"
|
||||||
|
"SamplerState s_projectionmap : register(s6);\n"
|
||||||
|
|
||||||
"SamplerState ss_base : register(s0);\n"
|
|
||||||
"SamplerState ss_bump : register(s1);\n"
|
|
||||||
"SamplerState ss_spec : register(s2);\n"
|
|
||||||
"SamplerState ss_cube : register(s3);\n"
|
|
||||||
"SamplerComparisonState ss_smap : register(s4);\n"
|
|
||||||
"SamplerState ss_lower : register(s5);\n"
|
|
||||||
"SamplerState ss_upper : register(s6);\n"
|
|
||||||
|
|
||||||
"#ifdef PCF\n"
|
"#ifdef PCF\n"
|
||||||
"float3 ShadowmapCoord(float3 vtexprojcoord)\n"
|
"float3 ShadowmapCoord(float3 vtexprojcoord)\n"
|
||||||
|
@ -2201,9 +2219,8 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
|
|
||||||
// #define dosamp(x,y) shadow2D(s_t4, shadowcoord.xyz + (vec3(x,y,0.0)*l_shadowmapscale.xyx)).r
|
// #define dosamp(x,y) shadow2D(s_t4, shadowcoord.xyz + (vec3(x,y,0.0)*l_shadowmapscale.xyx)).r
|
||||||
|
|
||||||
// #define dosamp(x,y) (tx_smap.Sample(ss_smap, shadowcoord.xy + (float2(x,y)*l_shadowmapscale.xy)).r < shadowcoord.z)
|
// #define dosamp(x,y) (t_shadowmap.Sample(s_shadowmap, shadowcoord.xy + (float2(x,y)*l_shadowmapscale.xy)).r < shadowcoord.z)
|
||||||
"#define dosamp(x,y) (tx_smap.SampleCmpLevelZero(ss_smap, shadowcoord.xy+(float2(x,y)*l_shadowmapscale.xy), shadowcoord.z))\n"
|
"#define dosamp(x,y) (t_shadowmap.SampleCmpLevelZero(s_shadowmap, shadowcoord.xy+(float2(x,y)*l_shadowmapscale.xy), shadowcoord.z))\n"
|
||||||
|
|
||||||
|
|
||||||
"float s = 0.0;\n"
|
"float s = 0.0;\n"
|
||||||
"#if r_glsl_pcf >= 1 && r_glsl_pcf < 5\n"
|
"#if r_glsl_pcf >= 1 && r_glsl_pcf < 5\n"
|
||||||
|
@ -2215,7 +2232,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"s += dosamp(0.0, 0.0);\n"
|
"s += dosamp(0.0, 0.0);\n"
|
||||||
"s += dosamp(0.0, 1.0);\n"
|
"s += dosamp(0.0, 1.0);\n"
|
||||||
"s += dosamp(1.0, 0.0);\n"
|
"s += dosamp(1.0, 0.0);\n"
|
||||||
"return s/5.0;\n"
|
"return s * (1.0/5.0);\n"
|
||||||
"#else\n"
|
"#else\n"
|
||||||
"s += dosamp(-1.0, -1.0);\n"
|
"s += dosamp(-1.0, -1.0);\n"
|
||||||
"s += dosamp(-1.0, 0.0);\n"
|
"s += dosamp(-1.0, 0.0);\n"
|
||||||
|
@ -2226,7 +2243,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"s += dosamp(1.0, -1.0);\n"
|
"s += dosamp(1.0, -1.0);\n"
|
||||||
"s += dosamp(1.0, 0.0);\n"
|
"s += dosamp(1.0, 0.0);\n"
|
||||||
"s += dosamp(1.0, 1.0);\n"
|
"s += dosamp(1.0, 1.0);\n"
|
||||||
"return s/9.0;\n"
|
"return s * (1.0/9.0);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
@ -2236,23 +2253,23 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
||||||
"{\n"
|
"{\n"
|
||||||
"float2 tc = inp.tc; //TODO: offsetmapping.\n"
|
"float2 tc = inp.tc; //TODO: offsetmapping.\n"
|
||||||
|
|
||||||
"float4 base = tx_base.Sample(ss_base, tc);\n"
|
"float4 base = t_diffuse.Sample(s_diffuse, tc);\n"
|
||||||
"#ifdef BUMP\n"
|
"#ifdef BUMP\n"
|
||||||
"float4 bump = tx_bump.Sample(ss_bump, tc);\n"
|
"float4 bump = t_normalmap.Sample(s_normalmap, tc);\n"
|
||||||
"bump.rgb = normalize(bump.rgb - 0.5);\n"
|
"bump.rgb = normalize(bump.rgb - 0.5);\n"
|
||||||
"#else\n"
|
"#else\n"
|
||||||
"float4 bump = float4(0, 0, 1, 0);\n"
|
"float4 bump = float4(0, 0, 1, 0);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"float4 spec = tx_spec.Sample(ss_spec, tc);\n"
|
"float4 spec = t_specular.Sample(s_specular, tc);\n"
|
||||||
"#ifdef CUBE\n"
|
"#ifdef CUBE\n"
|
||||||
"float4 cubemap = tx_cube.Sample(ss_cube, inp.vtexprojcoord);\n"
|
"float4 cubemap = t_projectionmap.Sample(s_projectionmap, inp.vtexprojcoord);\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef LOWER\n"
|
"#ifdef LOWER\n"
|
||||||
"float4 lower = tx_lower.Sample(ss_lower, tc);\n"
|
"float4 lower = t_lower.Sample(s_lower, tc);\n"
|
||||||
"base += lower;\n"
|
"base += lower;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef UPPER\n"
|
"#ifdef UPPER\n"
|
||||||
"float4 upper = tx_upper.Sample(ss_upper, tc);\n"
|
"float4 upper = t_upper.Sample(s_upper, tc);\n"
|
||||||
"base += upper;\n"
|
"base += upper;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ lights are then added over the top based upon the diffusemap, bumpmap and specul
|
||||||
typedef void (shader_gen_t)(const char *name, shader_t*, const void *args);
|
typedef void (shader_gen_t)(const char *name, shader_t*, const void *args);
|
||||||
|
|
||||||
#define SHADER_TMU_MAX 16
|
#define SHADER_TMU_MAX 16
|
||||||
#define SHADER_PASS_MAX 8
|
#define SHADER_PASS_MAX 16
|
||||||
#define SHADER_MAX_TC_MODS 8
|
#define SHADER_MAX_TC_MODS 8
|
||||||
#define SHADER_DEFORM_MAX 8
|
#define SHADER_DEFORM_MAX 8
|
||||||
#define SHADER_MAX_ANIMFRAMES 16
|
#define SHADER_MAX_ANIMFRAMES 16
|
||||||
|
@ -256,6 +256,8 @@ typedef struct shaderpass_s {
|
||||||
T_GEN_LOWEROVERLAY, //texture's default team colour
|
T_GEN_LOWEROVERLAY, //texture's default team colour
|
||||||
T_GEN_FULLBRIGHT, //texture's default fullbright overlay
|
T_GEN_FULLBRIGHT, //texture's default fullbright overlay
|
||||||
T_GEN_PALETTED, //texture's original paletted data (8bit)
|
T_GEN_PALETTED, //texture's original paletted data (8bit)
|
||||||
|
T_GEN_REFLECTCUBE, //dpreflectcube
|
||||||
|
T_GEN_REFLECTMASK, //dpreflectcube mask
|
||||||
|
|
||||||
T_GEN_CURRENTRENDER,//copy the current screen to a texture, and draw that
|
T_GEN_CURRENTRENDER,//copy the current screen to a texture, and draw that
|
||||||
|
|
||||||
|
@ -316,7 +318,7 @@ enum{
|
||||||
PERMUTATION_BUMPMAP = 1,
|
PERMUTATION_BUMPMAP = 1,
|
||||||
PERMUTATION_FULLBRIGHT = 2,
|
PERMUTATION_FULLBRIGHT = 2,
|
||||||
PERMUTATION_UPPERLOWER = 4,
|
PERMUTATION_UPPERLOWER = 4,
|
||||||
PERMUTATION_DELUXE = 8,
|
PERMUTATION_REFLECTCUBEMASK = 8,
|
||||||
PERMUTATION_SKELETAL = 16,
|
PERMUTATION_SKELETAL = 16,
|
||||||
PERMUTATION_FOG = 32,
|
PERMUTATION_FOG = 32,
|
||||||
PERMUTATION_FRAMEBLEND = 64,
|
PERMUTATION_FRAMEBLEND = 64,
|
||||||
|
@ -489,7 +491,6 @@ enum
|
||||||
struct shader_s
|
struct shader_s
|
||||||
{
|
{
|
||||||
char name[MAX_QPATH];
|
char name[MAX_QPATH];
|
||||||
char mapname[MAX_QPATH];
|
|
||||||
enum {
|
enum {
|
||||||
SUF_NONE = 0,
|
SUF_NONE = 0,
|
||||||
SUF_LIGHTMAP = 1<<0, //$lightmap passes are valid. otherwise collapsed to an rgbgen
|
SUF_LIGHTMAP = 1<<0, //$lightmap passes are valid. otherwise collapsed to an rgbgen
|
||||||
|
@ -499,7 +500,9 @@ struct shader_s
|
||||||
int width; //when used as an image, this is the logical 'width' of the image. FIXME.
|
int width; //when used as an image, this is the logical 'width' of the image. FIXME.
|
||||||
int height;
|
int height;
|
||||||
int numpasses;
|
int numpasses;
|
||||||
texnums_t defaulttextures;
|
unsigned int numdefaulttextures; //0 is effectively 1.
|
||||||
|
float defaulttextures_fps;
|
||||||
|
texnums_t *defaulttextures; //must always have at least one entry. multiple will only appear if the diffuse texture was animmapped.
|
||||||
struct shader_s *next;
|
struct shader_s *next;
|
||||||
int id;
|
int id;
|
||||||
//end of shared fields.
|
//end of shared fields.
|
||||||
|
@ -694,7 +697,7 @@ void GLBE_Init(void);
|
||||||
void GLBE_Shutdown(void);
|
void GLBE_Shutdown(void);
|
||||||
void GLBE_SelectMode(backendmode_t mode);
|
void GLBE_SelectMode(backendmode_t mode);
|
||||||
void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void GLBE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
||||||
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void GLBE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, unsigned int beflags);
|
||||||
void GLBE_SubmitBatch(batch_t *batch);
|
void GLBE_SubmitBatch(batch_t *batch);
|
||||||
batch_t *GLBE_GetTempBatch(void);
|
batch_t *GLBE_GetTempBatch(void);
|
||||||
void GLBE_GenBrushModelVBO(model_t *mod);
|
void GLBE_GenBrushModelVBO(model_t *mod);
|
||||||
|
@ -724,7 +727,7 @@ void D3D9BE_Init(void);
|
||||||
void D3D9BE_Shutdown(void);
|
void D3D9BE_Shutdown(void);
|
||||||
void D3D9BE_SelectMode(backendmode_t mode);
|
void D3D9BE_SelectMode(backendmode_t mode);
|
||||||
void D3D9BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void D3D9BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
||||||
void D3D9BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void D3D9BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, unsigned int beflags);
|
||||||
void D3D9BE_SubmitBatch(batch_t *batch);
|
void D3D9BE_SubmitBatch(batch_t *batch);
|
||||||
batch_t *D3D9BE_GetTempBatch(void);
|
batch_t *D3D9BE_GetTempBatch(void);
|
||||||
void D3D9BE_GenBrushModelVBO(model_t *mod);
|
void D3D9BE_GenBrushModelVBO(model_t *mod);
|
||||||
|
@ -748,7 +751,7 @@ void D3D11BE_Init(void);
|
||||||
void D3D11BE_Shutdown(void);
|
void D3D11BE_Shutdown(void);
|
||||||
void D3D11BE_SelectMode(backendmode_t mode);
|
void D3D11BE_SelectMode(backendmode_t mode);
|
||||||
void D3D11BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void D3D11BE_DrawMesh_List(shader_t *shader, int nummeshes, mesh_t **mesh, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
||||||
void D3D11BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums, unsigned int beflags);
|
void D3D11BE_DrawMesh_Single(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, unsigned int beflags);
|
||||||
void D3D11BE_SubmitBatch(batch_t *batch);
|
void D3D11BE_SubmitBatch(batch_t *batch);
|
||||||
batch_t *D3D11BE_GetTempBatch(void);
|
batch_t *D3D11BE_GetTempBatch(void);
|
||||||
void D3D11BE_GenBrushModelVBO(model_t *mod);
|
void D3D11BE_GenBrushModelVBO(model_t *mod);
|
||||||
|
|
|
@ -15,6 +15,118 @@ r_part pe_default
|
||||||
scalefactor 0.8
|
scalefactor 0.8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r_part te_splashsparks
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xe0
|
||||||
|
}
|
||||||
|
r_part teq2_sparks
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 6
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xe0
|
||||||
|
}
|
||||||
|
r_part te_splashbluewater
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xb0
|
||||||
|
}
|
||||||
|
r_part te_splashbrownwater
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0x50
|
||||||
|
}
|
||||||
|
r_part te_splashslime
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xd0
|
||||||
|
}
|
||||||
|
r_part te_splashlava
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xe0
|
||||||
|
}
|
||||||
|
r_part te_splashblood
|
||||||
|
{
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
count 1
|
||||||
|
scale 1
|
||||||
|
alpha 1
|
||||||
|
die 0.3 0.8
|
||||||
|
randomvel 20
|
||||||
|
orgadd 0 31
|
||||||
|
spawnorg 4
|
||||||
|
gravity 40
|
||||||
|
scalefactor 0.8
|
||||||
|
colorindex 0xe8
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//teq2_shield_sparks
|
||||||
|
//teq2_screen_sparks
|
||||||
|
//teq2_laser_sparks
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
r_part q2_smoke
|
r_part q2_smoke
|
||||||
{
|
{
|
||||||
|
@ -126,6 +238,22 @@ r_part TR_BLASTERTRAIL
|
||||||
colorindex 0xe0
|
colorindex 0xe0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
r_part teq2_bubbletrail
|
||||||
|
{
|
||||||
|
/*blue spiral*/
|
||||||
|
texture "classicparticle"
|
||||||
|
tcoords 0 0 16 16 32
|
||||||
|
scale 0.5
|
||||||
|
alpha 1
|
||||||
|
scalefactor 0.8
|
||||||
|
step 32
|
||||||
|
spawnorg 2
|
||||||
|
spawnvel 5
|
||||||
|
die 1 1.2
|
||||||
|
colorindex 4 7
|
||||||
|
}
|
||||||
|
|
||||||
r_part TR_RAILTRAIL
|
r_part TR_RAILTRAIL
|
||||||
{
|
{
|
||||||
/*blue spiral*/
|
/*blue spiral*/
|
||||||
|
|
|
@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
extern int total_loading_size, current_loading_size, loading_stage;
|
extern int total_loading_size, current_loading_size, loading_stage;
|
||||||
char *T_GetString(int num);
|
char *T_GetString(int num);
|
||||||
|
|
||||||
|
void SVQ2_Ents_Shutdown(void);
|
||||||
#define Q2EDICT_NUM(i) (q2edict_t*)((char *)ge->edicts+(i)*ge->edict_size)
|
#define Q2EDICT_NUM(i) (q2edict_t*)((char *)ge->edicts+(i)*ge->edict_size)
|
||||||
|
|
||||||
server_static_t svs; // persistant server info
|
server_static_t svs; // persistant server info
|
||||||
|
@ -597,6 +598,7 @@ void SV_UnspawnServer (void) //terminate the running server.
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q2SERVER
|
#ifdef Q2SERVER
|
||||||
SVQ2_ShutdownGameProgs();
|
SVQ2_ShutdownGameProgs();
|
||||||
|
SVQ2_Ents_Shutdown();
|
||||||
#endif
|
#endif
|
||||||
#ifdef HLSERVER
|
#ifdef HLSERVER
|
||||||
SVHL_ShutdownGame();
|
SVHL_ShutdownGame();
|
||||||
|
|
|
@ -478,6 +478,10 @@ void SV_DropClient (client_t *drop)
|
||||||
#ifdef SVCHAT
|
#ifdef SVCHAT
|
||||||
SV_WipeChat(drop);
|
SV_WipeChat(drop);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (sv.world.worldmodel->loadstate != MLS_LOADED)
|
||||||
|
Con_Printf(CON_WARNING "Warning: not notifying gamecode about client disconnection due to invalid worldmodel\n");
|
||||||
|
else
|
||||||
switch(svs.gametype)
|
switch(svs.gametype)
|
||||||
{
|
{
|
||||||
case GT_MAX:
|
case GT_MAX:
|
||||||
|
|
|
@ -694,7 +694,6 @@ int main(int argc, char *argv[])
|
||||||
memset (&parms, 0, sizeof(parms));
|
memset (&parms, 0, sizeof(parms));
|
||||||
|
|
||||||
COM_InitArgv (argc, (const char **)argv);
|
COM_InitArgv (argc, (const char **)argv);
|
||||||
TL_InitLanguages();
|
|
||||||
parms.argc = com_argc;
|
parms.argc = com_argc;
|
||||||
parms.argv = com_argv;
|
parms.argv = com_argv;
|
||||||
|
|
||||||
|
@ -713,6 +712,7 @@ int main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
parms.basedir = "./";
|
parms.basedir = "./";
|
||||||
|
TL_InitLanguages(parms.basedir);
|
||||||
|
|
||||||
SV_Init (&parms);
|
SV_Init (&parms);
|
||||||
|
|
||||||
|
|
|
@ -1369,8 +1369,6 @@ void StartQuakeServer(void)
|
||||||
|
|
||||||
memset(&parms, 0, sizeof(parms));
|
memset(&parms, 0, sizeof(parms));
|
||||||
|
|
||||||
TL_InitLanguages();
|
|
||||||
|
|
||||||
parms.argc = com_argc;
|
parms.argc = com_argc;
|
||||||
parms.argv = com_argv;
|
parms.argv = com_argv;
|
||||||
|
|
||||||
|
@ -1380,6 +1378,8 @@ void StartQuakeServer(void)
|
||||||
|
|
||||||
parms.basedir = "./";
|
parms.basedir = "./";
|
||||||
|
|
||||||
|
TL_InitLanguages(parms.basedir);
|
||||||
|
|
||||||
SV_Init (&parms);
|
SV_Init (&parms);
|
||||||
|
|
||||||
// run one frame immediately for first heartbeat
|
// run one frame immediately for first heartbeat
|
||||||
|
|
|
@ -777,6 +777,15 @@ void SVQ2_Ents_Init(void)
|
||||||
svs_client_entities = Z_Malloc (sizeof(entity_state_t)*svs_num_client_entities);
|
svs_client_entities = Z_Malloc (sizeof(entity_state_t)*svs_num_client_entities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void SVQ2_Ents_Shutdown(void)
|
||||||
|
{
|
||||||
|
if (svs_client_entities)
|
||||||
|
{
|
||||||
|
Z_Free(svs_client_entities);
|
||||||
|
svs_client_entities = NULL;
|
||||||
|
svs_num_client_entities = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -80,7 +80,7 @@ struct shadertype_s
|
||||||
} shadertype[] =
|
} shadertype[] =
|
||||||
{
|
{
|
||||||
{"glsl/%s.glsl", "GLQUAKE", "QR_OPENGL", 110}, //gl2+
|
{"glsl/%s.glsl", "GLQUAKE", "QR_OPENGL", 110}, //gl2+
|
||||||
{"gles/%s.glsl", "GLQUAKE", "QR_OPENGL", 100}, //gles
|
//{"gles/%s.glsl", "GLQUAKE", "QR_OPENGL", 100}, //gles
|
||||||
{"hlsl9/%s.hlsl", "D3D9QUAKE", "QR_DIRECT3D9", 9}, //d3d9
|
{"hlsl9/%s.hlsl", "D3D9QUAKE", "QR_DIRECT3D9", 9}, //d3d9
|
||||||
{"hlsl11/%s.hlsl", "D3D11QUAKE", "QR_DIRECT3D11", 11}, //d3d11
|
{"hlsl11/%s.hlsl", "D3D11QUAKE", "QR_DIRECT3D11", 11}, //d3d11
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
!!permu LIGHTSTYLED
|
!!permu LIGHTSTYLED
|
||||||
!!permu BUMP
|
!!permu BUMP
|
||||||
!!permu SPECULAR
|
!!permu SPECULAR
|
||||||
|
!!permu REFLECTCUBEMASK
|
||||||
!!cvarf r_glsl_offsetmapping_scale
|
!!cvarf r_glsl_offsetmapping_scale
|
||||||
!!cvarf gl_specular
|
!!cvarf gl_specular
|
||||||
|
|
||||||
|
@ -13,10 +14,14 @@
|
||||||
//note that the '286' preset uses drawflat_walls instead.
|
//note that the '286' preset uses drawflat_walls instead.
|
||||||
|
|
||||||
#include "sys/fog.h"
|
#include "sys/fog.h"
|
||||||
#if defined(OFFSETMAPPING) || defined(SPECULAR)
|
#if defined(OFFSETMAPPING) || defined(SPECULAR) || defined(REFLECTCUBEMASK)
|
||||||
varying vec3 eyevector;
|
varying vec3 eyevector;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
varying mat3 invsurface;
|
||||||
|
#endif
|
||||||
|
|
||||||
varying vec2 tc;
|
varying vec2 tc;
|
||||||
#ifdef LIGHTSTYLED
|
#ifdef LIGHTSTYLED
|
||||||
//we could use an offset, but that would still need to be per-surface which would break batches
|
//we could use an offset, but that would still need to be per-surface which would break batches
|
||||||
|
@ -29,11 +34,16 @@ varying vec2 lm0;
|
||||||
#ifdef VERTEX_SHADER
|
#ifdef VERTEX_SHADER
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
#if defined(OFFSETMAPPING) || defined(SPECULAR)
|
#if defined(OFFSETMAPPING) || defined(SPECULAR) || defined(REFLECTCUBEMASK)
|
||||||
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
|
vec3 eyeminusvertex = e_eyepos - v_position.xyz;
|
||||||
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
|
eyevector.x = dot(eyeminusvertex, v_svector.xyz);
|
||||||
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
|
eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
|
||||||
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
|
eyevector.z = dot(eyeminusvertex, v_normal.xyz);
|
||||||
|
#endif
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
invsurface[0] = v_svector;
|
||||||
|
invsurface[1] = v_tvector;
|
||||||
|
invsurface[2] = v_normal;
|
||||||
#endif
|
#endif
|
||||||
tc = v_texcoord;
|
tc = v_texcoord;
|
||||||
lm0 = v_lmcoord;
|
lm0 = v_lmcoord;
|
||||||
|
@ -79,9 +89,9 @@ void main ()
|
||||||
//yay, regular texture!
|
//yay, regular texture!
|
||||||
gl_FragColor = texture2D(s_diffuse, tc);
|
gl_FragColor = texture2D(s_diffuse, tc);
|
||||||
|
|
||||||
#if defined(BUMP) && (defined(DELUXE) || defined(SPECULAR))
|
#if defined(BUMP) && (defined(DELUXE) || defined(SPECULAR) || defined(REFLECTCUBEMASK))
|
||||||
vec3 norm = normalize(texture2D(s_normalmap, tc).rgb - 0.5);
|
vec3 norm = normalize(texture2D(s_normalmap, tc).rgb - 0.5);
|
||||||
#elif defined(SPECULAR) || defined(DELUXE)
|
#elif defined(SPECULAR) || defined(DELUXE) || defined(REFLECTCUBEMASK)
|
||||||
vec3 norm = vec3(0, 0, 1); //specular lighting expects this to exist.
|
vec3 norm = vec3(0, 0, 1); //specular lighting expects this to exist.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -127,6 +137,13 @@ void main ()
|
||||||
gl_FragColor.rgb += spec * specs.rgb;
|
gl_FragColor.rgb += spec * specs.rgb;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
vec3 rtc = reflect(-eyevector, norm);
|
||||||
|
rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2];
|
||||||
|
rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;
|
||||||
|
gl_FragColor.rgb += texture2D(s_reflectmask, tc).rgb * textureCube(s_reflectcube, rtc).rgb;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef EIGHTBIT //FIXME: with this extra flag, half the permutations are redundant.
|
#ifdef EIGHTBIT //FIXME: with this extra flag, half the permutations are redundant.
|
||||||
lightmaps *= 0.5; //counter the fact that the colourmap contains overbright values and logically ranges from 0 to 2 intead of to 1.
|
lightmaps *= 0.5; //counter the fact that the colourmap contains overbright values and logically ranges from 0 to 2 intead of to 1.
|
||||||
float pal = texture2D(s_paletted, tc).r; //the palette index. hopefully not interpolated.
|
float pal = texture2D(s_paletted, tc).r; //the palette index. hopefully not interpolated.
|
||||||
|
@ -144,7 +161,6 @@ void main ()
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//entity modifiers
|
//entity modifiers
|
||||||
gl_FragColor = gl_FragColor * e_colourident;
|
gl_FragColor = gl_FragColor * e_colourident;
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
!!permu SKELETAL
|
!!permu SKELETAL
|
||||||
!!permu UPPERLOWER
|
!!permu UPPERLOWER
|
||||||
!!permu FOG
|
!!permu FOG
|
||||||
|
!!permu REFLECTCUBEMASK
|
||||||
!!cvarf r_glsl_offsetmapping_scale
|
!!cvarf r_glsl_offsetmapping_scale
|
||||||
!!cvardf r_glsl_pcf
|
!!cvardf r_glsl_pcf
|
||||||
|
|
||||||
|
@ -50,9 +51,13 @@
|
||||||
|
|
||||||
varying vec2 tcbase;
|
varying vec2 tcbase;
|
||||||
varying vec3 lightvector;
|
varying vec3 lightvector;
|
||||||
#if defined(SPECULAR) || defined(OFFSETMAPPING)
|
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
|
||||||
varying vec3 eyevector;
|
varying vec3 eyevector;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
varying mat3 invsurface;
|
||||||
|
uniform mat4 m_model;
|
||||||
|
#endif
|
||||||
#if defined(PCF) || defined(CUBE) || defined(SPOT)
|
#if defined(PCF) || defined(CUBE) || defined(SPOT)
|
||||||
varying vec4 vtexprojcoord;
|
varying vec4 vtexprojcoord;
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,7 +70,7 @@ uniform mat4 l_cubematrix;
|
||||||
#include "sys/skeletal.h"
|
#include "sys/skeletal.h"
|
||||||
uniform vec3 l_lightposition;
|
uniform vec3 l_lightposition;
|
||||||
attribute vec2 v_texcoord;
|
attribute vec2 v_texcoord;
|
||||||
#if defined(SPECULAR) || defined(OFFSETMAPPING)
|
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
|
||||||
uniform vec3 e_eyepos;
|
uniform vec3 e_eyepos;
|
||||||
#endif
|
#endif
|
||||||
void main ()
|
void main ()
|
||||||
|
@ -83,12 +88,17 @@ void main ()
|
||||||
lightvector.y = dot(lightminusvertex, t.xyz);
|
lightvector.y = dot(lightminusvertex, t.xyz);
|
||||||
lightvector.z = dot(lightminusvertex, n.xyz);
|
lightvector.z = dot(lightminusvertex, n.xyz);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPECULAR)||defined(OFFSETMAPPING)
|
#if defined(SPECULAR)||defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
|
||||||
vec3 eyeminusvertex = e_eyepos - w.xyz;
|
vec3 eyeminusvertex = e_eyepos - w.xyz;
|
||||||
eyevector.x = dot(eyeminusvertex, s.xyz);
|
eyevector.x = dot(eyeminusvertex, s.xyz);
|
||||||
eyevector.y = dot(eyeminusvertex, t.xyz);
|
eyevector.y = dot(eyeminusvertex, t.xyz);
|
||||||
eyevector.z = dot(eyeminusvertex, n.xyz);
|
eyevector.z = dot(eyeminusvertex, n.xyz);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
invsurface[0] = v_svector;
|
||||||
|
invsurface[1] = v_tvector;
|
||||||
|
invsurface[2] = v_normal;
|
||||||
|
#endif
|
||||||
#if defined(PCF) || defined(SPOT) || defined(CUBE)
|
#if defined(PCF) || defined(SPOT) || defined(CUBE)
|
||||||
//for texture projections/shadowmapping on dlights
|
//for texture projections/shadowmapping on dlights
|
||||||
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
|
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
|
||||||
|
@ -103,7 +113,7 @@ void main ()
|
||||||
#include "sys/fog.h"
|
#include "sys/fog.h"
|
||||||
uniform sampler2D s_t0; //diffuse
|
uniform sampler2D s_t0; //diffuse
|
||||||
|
|
||||||
#if defined(BUMP) || defined(SPECULAR) || defined(OFFSETMAPPING)
|
#if defined(BUMP) || defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
|
||||||
uniform sampler2D s_t1; //normalmap
|
uniform sampler2D s_t1; //normalmap
|
||||||
#endif
|
#endif
|
||||||
#ifdef SPECULAR
|
#ifdef SPECULAR
|
||||||
|
@ -132,6 +142,11 @@ uniform sampler2D s_t6; //shirt colours
|
||||||
uniform vec3 e_uppercolour;
|
uniform vec3 e_uppercolour;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
uniform sampler2D s_reflectmask;
|
||||||
|
uniform samplerCube s_reflectcube;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
uniform float l_lightradius;
|
uniform float l_lightradius;
|
||||||
uniform vec3 l_lightcolour;
|
uniform vec3 l_lightcolour;
|
||||||
|
@ -260,8 +275,10 @@ void main ()
|
||||||
vec4 lc = texture2D(s_t5, tcbase);
|
vec4 lc = texture2D(s_t5, tcbase);
|
||||||
bases.rgb += lc.rgb*e_lowercolour*lc.a;
|
bases.rgb += lc.rgb*e_lowercolour*lc.a;
|
||||||
#endif
|
#endif
|
||||||
#if defined(BUMP) || defined(SPECULAR)
|
#if defined(BUMP) || defined(SPECULAR) || defined(REFLECTCUBEMASK)
|
||||||
vec3 bumps = normalize(vec3(texture2D(s_t1, tcbase)) - 0.5);
|
vec3 bumps = normalize(vec3(texture2D(s_t1, tcbase)) - 0.5);
|
||||||
|
#elif defined(REFLECTCUBEMASK)
|
||||||
|
vec3 bumps = vec3(0.0,0.0,1.0);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SPECULAR
|
#ifdef SPECULAR
|
||||||
vec4 specs = texture2D(s_t2, tcbase);
|
vec4 specs = texture2D(s_t2, tcbase);
|
||||||
|
@ -289,7 +306,12 @@ void main ()
|
||||||
diff += l_lightcolourscale.z * spec * specs.rgb;
|
diff += l_lightcolourscale.z * spec * specs.rgb;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef REFLECTCUBEMASK
|
||||||
|
vec3 rtc = reflect(-eyevector, bumps);
|
||||||
|
rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2];
|
||||||
|
rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;
|
||||||
|
diff += texture2D(s_reflectmask, tcbase).rgb * textureCube(s_reflectcube, rtc).rgb;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CUBE
|
#ifdef CUBE
|
||||||
/*filter the colour by the cubemap projection*/
|
/*filter the colour by the cubemap projection*/
|
||||||
|
@ -315,6 +337,7 @@ void main ()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gl_FragColor.rgb = fog3additive(diff*colorscale*l_lightcolour);
|
gl_FragColor.rgb = fog3additive(diff*colorscale*l_lightcolour);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,7 @@ struct v2f
|
||||||
v2f main (a2v inp)
|
v2f main (a2v inp)
|
||||||
{
|
{
|
||||||
v2f outp;
|
v2f outp;
|
||||||
outp.pos = mul(m_model, inp.pos);
|
outp.pos = mul(m_projection, inp.pos);
|
||||||
outp.pos = mul(m_view, outp.pos);
|
|
||||||
outp.pos = mul(m_projection, outp.pos);
|
|
||||||
outp.tc = inp.tc;
|
outp.tc = inp.tc;
|
||||||
outp.vcol = inp.vcol;
|
outp.vcol = inp.vcol;
|
||||||
return outp;
|
return outp;
|
||||||
|
@ -27,10 +25,10 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture;
|
Texture2D t_t0;
|
||||||
SamplerState SampleType;
|
SamplerState s_t0;
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
return shaderTexture.Sample(SampleType, inp.tc) * inp.vcol;
|
return t_t0.Sample(s_t0, inp.tc) * inp.vcol;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -30,14 +30,22 @@ struct v2f
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture[4]; //diffuse, lower, upper, fullbright
|
Texture2D t_diffuse : register(t0);
|
||||||
|
#ifdef UPPER
|
||||||
|
Texture2D t_upper : register(t1);
|
||||||
|
Texture2D t_lower : register(t2);
|
||||||
|
Texture2D t_fullbright : register(t3);
|
||||||
|
#else
|
||||||
|
Texture2D t_fullbright : register(t1);
|
||||||
|
#endif
|
||||||
|
|
||||||
SamplerState SampleType;
|
SamplerState SampleType;
|
||||||
|
|
||||||
//uniform vec4 e_colourident;
|
//uniform vec4 e_colourident;
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
float4 col;
|
float4 col;
|
||||||
col = shaderTexture[0].Sample(SampleType, inp.tc);
|
col = t_diffuse.Sample(SampleType, inp.tc);
|
||||||
|
|
||||||
#ifdef MASK
|
#ifdef MASK
|
||||||
#ifndef MASKOP
|
#ifndef MASKOP
|
||||||
|
@ -49,18 +57,18 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef UPPER
|
#ifdef UPPER
|
||||||
float4 uc = shaderTexture[2].Sample(SampleType, inp.tc);
|
float4 uc = t_upper.Sample(SampleType, inp.tc);
|
||||||
col.rgb = mix(col.rgb, uc.rgb*e_uppercolour, uc.a);
|
col.rgb = lerp(col.rgb, uc.rgb*e_uppercolour, uc.a);
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOWER
|
#ifdef LOWER
|
||||||
float4 lc = shaderTexture[1].Sample(SampleType, inp.tc);
|
float4 lc = t_lower.Sample(SampleType, inp.tc);
|
||||||
col.rgb = mix(col.rgb, lc.rgb*e_lowercolour, lc.a);
|
col.rgb = lerp(col.rgb, lc.rgb*e_lowercolour, lc.a);
|
||||||
#endif
|
#endif
|
||||||
col.rgb *= inp.light;
|
col.rgb *= inp.light;
|
||||||
#ifdef FULLBRIGHT
|
//#ifdef FULLBRIGHT
|
||||||
float4 fb = shaderTexture[3].Sample(SampleType, inp.tc);
|
float4 fb = t_fullbright.Sample(SampleType, inp.tc);
|
||||||
col.rgb = mix(col.rgb, fb.rgb, fb.a);
|
col.rgb = lerp(col.rgb, fb.rgb, fb.a);
|
||||||
#endif
|
//#endif
|
||||||
return col;
|
return col;
|
||||||
// return fog4(col * e_colourident);
|
// return fog4(col * e_colourident);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,10 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture[2];
|
Texture2D t_diffuse : register(t0);
|
||||||
SamplerState SampleType;
|
Texture2D t_fullbright : register(t1);
|
||||||
|
SamplerState s_diffuse : register(s0);
|
||||||
|
SamplerState s_fullbright : register(s1);
|
||||||
|
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
|
@ -39,9 +41,9 @@ struct v2f
|
||||||
dir.z *= 3.0;
|
dir.z *= 3.0;
|
||||||
dir.xy /= 0.5*length(dir);
|
dir.xy /= 0.5*length(dir);
|
||||||
tccoord = (dir.xy + e_time*0.03125);
|
tccoord = (dir.xy + e_time*0.03125);
|
||||||
float4 solid = shaderTexture[0].Sample(SampleType, tccoord);
|
float4 solid = t_diffuse.Sample(s_diffuse, tccoord);
|
||||||
tccoord = (dir.xy + e_time*0.0625);
|
tccoord = (dir.xy + e_time*0.0625);
|
||||||
float4 clouds = shaderTexture[1].Sample(SampleType, tccoord);
|
float4 clouds = t_fullbright.Sample(s_fullbright, tccoord);
|
||||||
return (solid*(1.0-clouds.a)) + (clouds.a*clouds);
|
return lerp(solid, clouds, clouds.a);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -27,11 +27,11 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture;
|
Texture2D t_diffuse : register(t0);
|
||||||
SamplerState SampleType;
|
SamplerState s_diffuse : register(s0);
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
float4 tex = shaderTexture.Sample(SampleType, inp.tc);
|
float4 tex = t_diffuse.Sample(s_diffuse, inp.tc);
|
||||||
#ifdef MASK
|
#ifdef MASK
|
||||||
if (tex.a < float(MASK))
|
if (tex.a < float(MASK))
|
||||||
discard;
|
discard;
|
||||||
|
|
|
@ -26,23 +26,22 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture[2];
|
Texture2D t_lightmap : register(t2);
|
||||||
SamplerState SampleType[2];
|
SamplerState s_lightmap : register(s2);
|
||||||
|
|
||||||
|
Texture2D t_diffuse : register(s0);
|
||||||
|
SamplerState s_diffuse : register(s0);
|
||||||
|
|
||||||
|
Texture2D t_fullbright : register(s1);
|
||||||
|
SamplerState s_fullbright : register(s1);
|
||||||
|
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
float4 tex = shaderTexture[0].Sample(SampleType[0], inp.tc);
|
float4 result;
|
||||||
float4 lm = shaderTexture[1].Sample(SampleType[1], inp.lmtc);
|
result = t_diffuse.Sample(s_diffuse, inp.tc);
|
||||||
|
result.rgb *= t_lightmap.Sample(s_lightmap, inp.lmtc).bgr * e_lmscale[0].rgb;
|
||||||
#ifdef MASK
|
float4 fb = t_fullbright.Sample(s_fullbright, inp.tc);
|
||||||
#ifndef MASKOP
|
result.rgb += fb.rgb * fb.a;//lerp(result.rgb, fb.rgb, fb.a);
|
||||||
#define MASKOP >= //drawn if (alpha OP ref) is true.
|
return result;
|
||||||
#endif
|
|
||||||
//support for alpha masking
|
|
||||||
if (!(tex.a MASKOP MASK))
|
|
||||||
discard;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return tex * lm.bgra;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -28,14 +28,13 @@ struct v2f
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
// float cvar_r_wateralpha;
|
// float cvar_r_wateralpha;
|
||||||
// float e_time;
|
// float e_time;
|
||||||
// sampler s_t0;
|
SamplerState s_diffuse;
|
||||||
Texture2D shaderTexture;
|
Texture2D t_diffuse;
|
||||||
SamplerState SampleType;
|
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
float2 ntc;
|
float2 ntc;
|
||||||
ntc.x = inp.tc.x + sin(inp.tc.y+e_time)*0.125;
|
ntc.x = inp.tc.x + sin(inp.tc.y+e_time)*0.125;
|
||||||
ntc.y = inp.tc.y + sin(inp.tc.x+e_time)*0.125;
|
ntc.y = inp.tc.y + sin(inp.tc.x+e_time)*0.125;
|
||||||
return shaderTexture.Sample(SampleType, ntc);
|
return t_diffuse.Sample(s_diffuse, ntc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -3,17 +3,11 @@
|
||||||
struct a2v
|
struct a2v
|
||||||
{
|
{
|
||||||
float4 pos: POSITION;
|
float4 pos: POSITION;
|
||||||
float3 normal: NORMAL;
|
|
||||||
#ifdef MASK
|
|
||||||
float4 tc: TEXCOORD0;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
struct v2f
|
struct v2f
|
||||||
{
|
{
|
||||||
|
float3 col: TEXCOORD;
|
||||||
float4 pos: SV_POSITION;
|
float4 pos: SV_POSITION;
|
||||||
#ifdef MASK
|
|
||||||
float2 tc: TEXCOORD0;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <ftedefs.h>
|
#include <ftedefs.h>
|
||||||
|
@ -25,41 +19,22 @@ struct v2f
|
||||||
outp.pos = mul(m_model, inp.pos);
|
outp.pos = mul(m_model, inp.pos);
|
||||||
outp.pos = mul(m_view, outp.pos);
|
outp.pos = mul(m_view, outp.pos);
|
||||||
outp.pos = mul(m_projection, outp.pos);
|
outp.pos = mul(m_projection, outp.pos);
|
||||||
|
outp.col = inp.pos.xyz - l_lightposition;
|
||||||
#ifdef MASK
|
|
||||||
outp.tc = inp.tc.xy;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return outp;
|
return outp;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef FRAGMENT_SHADER
|
|
||||||
#ifdef MASK
|
|
||||||
Texture2D shaderTexture[1];
|
|
||||||
SamplerState SampleType[1];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LEVEL < 1000
|
#ifdef FRAGMENT_SHADER
|
||||||
|
#if LEVEL < 0x10000
|
||||||
//pre dx10 requires that we ALWAYS write to a target.
|
//pre dx10 requires that we ALWAYS write to a target.
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
|
{
|
||||||
|
return float4(0, 0, 0, 1);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
//but on 10, it'll write depth automatically and we don't care about colour.
|
//but on 10, it'll write depth automatically and we don't care about colour.
|
||||||
void main (v2f inp) //dx10-level
|
void main (v2f inp)
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef MASK
|
|
||||||
float alpha = shaderTexture[0].Sample(SampleType[0], inp.tc).a;
|
|
||||||
#ifndef MASKOP
|
|
||||||
#define MASKOP >= //drawn if (alpha OP ref) is true.
|
|
||||||
#endif
|
|
||||||
//support for alpha masking
|
|
||||||
if (!(alpha MASKOP MASK))
|
|
||||||
discard;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LEVEL < 1000
|
|
||||||
return float4(0, 0, 0, 1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -29,11 +29,11 @@ struct v2f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
Texture2D shaderTexture;
|
Texture2D t_lightmap : register(t0);
|
||||||
SamplerState SampleType;
|
SamplerState s_lightmap : register(s0);
|
||||||
|
|
||||||
float4 main (v2f inp) : SV_TARGET
|
float4 main (v2f inp) : SV_TARGET
|
||||||
{
|
{
|
||||||
return inp.col * shaderTexture.Sample(SampleType, inp.lmtc);
|
return inp.col * t_lightmap.Sample(s_lightmap, inp.lmtc);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -77,21 +77,22 @@ struct v2f
|
||||||
|
|
||||||
#ifdef FRAGMENT_SHADER
|
#ifdef FRAGMENT_SHADER
|
||||||
|
|
||||||
Texture2D tx_base : register(t0);
|
Texture2D t_diffuse : register(t0);
|
||||||
Texture2D tx_bump : register(t1);
|
Texture2D t_normalmap : register(t1);
|
||||||
Texture2D tx_spec : register(t2);
|
Texture2D t_specular : register(t2);
|
||||||
TextureCube tx_cube : register(t3);
|
Texture2D t_upper : register(t3);
|
||||||
Texture2D tx_smap : register(t4);
|
Texture2D t_lower : register(t4);
|
||||||
Texture2D tx_lower : register(t5);
|
Texture2D t_shadowmap : register(t5);
|
||||||
Texture2D tx_upper : register(t6);
|
TextureCube t_projectionmap : register(t6);
|
||||||
|
|
||||||
|
SamplerState s_diffuse : register(s0);
|
||||||
|
SamplerState s_normalmap : register(s1);
|
||||||
|
SamplerState s_specular : register(s2);
|
||||||
|
SamplerState s_upper : register(s3);
|
||||||
|
SamplerState s_lower : register(s4);
|
||||||
|
SamplerComparisonState s_shadowmap : register(s5);
|
||||||
|
SamplerState s_projectionmap : register(s6);
|
||||||
|
|
||||||
SamplerState ss_base : register(s0);
|
|
||||||
SamplerState ss_bump : register(s1);
|
|
||||||
SamplerState ss_spec : register(s2);
|
|
||||||
SamplerState ss_cube : register(s3);
|
|
||||||
SamplerComparisonState ss_smap : register(s4);
|
|
||||||
SamplerState ss_lower : register(s5);
|
|
||||||
SamplerState ss_upper : register(s6);
|
|
||||||
|
|
||||||
#ifdef PCF
|
#ifdef PCF
|
||||||
float3 ShadowmapCoord(float3 vtexprojcoord)
|
float3 ShadowmapCoord(float3 vtexprojcoord)
|
||||||
|
@ -148,9 +149,8 @@ float ShadowmapFilter(float3 vtexprojcoord)
|
||||||
|
|
||||||
// #define dosamp(x,y) shadow2D(s_t4, shadowcoord.xyz + (vec3(x,y,0.0)*l_shadowmapscale.xyx)).r
|
// #define dosamp(x,y) shadow2D(s_t4, shadowcoord.xyz + (vec3(x,y,0.0)*l_shadowmapscale.xyx)).r
|
||||||
|
|
||||||
// #define dosamp(x,y) (tx_smap.Sample(ss_smap, shadowcoord.xy + (float2(x,y)*l_shadowmapscale.xy)).r < shadowcoord.z)
|
// #define dosamp(x,y) (t_shadowmap.Sample(s_shadowmap, shadowcoord.xy + (float2(x,y)*l_shadowmapscale.xy)).r < shadowcoord.z)
|
||||||
#define dosamp(x,y) (tx_smap.SampleCmpLevelZero(ss_smap, shadowcoord.xy+(float2(x,y)*l_shadowmapscale.xy), shadowcoord.z))
|
#define dosamp(x,y) (t_shadowmap.SampleCmpLevelZero(s_shadowmap, shadowcoord.xy+(float2(x,y)*l_shadowmapscale.xy), shadowcoord.z))
|
||||||
|
|
||||||
|
|
||||||
float s = 0.0;
|
float s = 0.0;
|
||||||
#if r_glsl_pcf >= 1 && r_glsl_pcf < 5
|
#if r_glsl_pcf >= 1 && r_glsl_pcf < 5
|
||||||
|
@ -162,7 +162,7 @@ float ShadowmapFilter(float3 vtexprojcoord)
|
||||||
s += dosamp(0.0, 0.0);
|
s += dosamp(0.0, 0.0);
|
||||||
s += dosamp(0.0, 1.0);
|
s += dosamp(0.0, 1.0);
|
||||||
s += dosamp(1.0, 0.0);
|
s += dosamp(1.0, 0.0);
|
||||||
return s/5.0;
|
return s * (1.0/5.0);
|
||||||
#else
|
#else
|
||||||
s += dosamp(-1.0, -1.0);
|
s += dosamp(-1.0, -1.0);
|
||||||
s += dosamp(-1.0, 0.0);
|
s += dosamp(-1.0, 0.0);
|
||||||
|
@ -173,7 +173,7 @@ float ShadowmapFilter(float3 vtexprojcoord)
|
||||||
s += dosamp(1.0, -1.0);
|
s += dosamp(1.0, -1.0);
|
||||||
s += dosamp(1.0, 0.0);
|
s += dosamp(1.0, 0.0);
|
||||||
s += dosamp(1.0, 1.0);
|
s += dosamp(1.0, 1.0);
|
||||||
return s/9.0;
|
return s * (1.0/9.0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -183,23 +183,23 @@ float ShadowmapFilter(float3 vtexprojcoord)
|
||||||
{
|
{
|
||||||
float2 tc = inp.tc; //TODO: offsetmapping.
|
float2 tc = inp.tc; //TODO: offsetmapping.
|
||||||
|
|
||||||
float4 base = tx_base.Sample(ss_base, tc);
|
float4 base = t_diffuse.Sample(s_diffuse, tc);
|
||||||
#ifdef BUMP
|
#ifdef BUMP
|
||||||
float4 bump = tx_bump.Sample(ss_bump, tc);
|
float4 bump = t_normalmap.Sample(s_normalmap, tc);
|
||||||
bump.rgb = normalize(bump.rgb - 0.5);
|
bump.rgb = normalize(bump.rgb - 0.5);
|
||||||
#else
|
#else
|
||||||
float4 bump = float4(0, 0, 1, 0);
|
float4 bump = float4(0, 0, 1, 0);
|
||||||
#endif
|
#endif
|
||||||
float4 spec = tx_spec.Sample(ss_spec, tc);
|
float4 spec = t_specular.Sample(s_specular, tc);
|
||||||
#ifdef CUBE
|
#ifdef CUBE
|
||||||
float4 cubemap = tx_cube.Sample(ss_cube, inp.vtexprojcoord);
|
float4 cubemap = t_projectionmap.Sample(s_projectionmap, inp.vtexprojcoord);
|
||||||
#endif
|
#endif
|
||||||
#ifdef LOWER
|
#ifdef LOWER
|
||||||
float4 lower = tx_lower.Sample(ss_lower, tc);
|
float4 lower = t_lower.Sample(s_lower, tc);
|
||||||
base += lower;
|
base += lower;
|
||||||
#endif
|
#endif
|
||||||
#ifdef UPPER
|
#ifdef UPPER
|
||||||
float4 upper = tx_upper.Sample(ss_upper, tc);
|
float4 upper = t_upper.Sample(s_upper, tc);
|
||||||
base += upper;
|
base += upper;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ void SW_DestroyTexture (texid_t tex);
|
||||||
|
|
||||||
void SWBE_SelectMode(backendmode_t mode);
|
void SWBE_SelectMode(backendmode_t mode);
|
||||||
void SWBE_DrawMesh_List(shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags);
|
void SWBE_DrawMesh_List(shader_t *shader, int nummeshes, struct mesh_s **mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags);
|
||||||
void SWBE_DrawMesh_Single(shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags);
|
void SWBE_DrawMesh_Single(shader_t *shader, struct mesh_s *meshchain, struct vbo_s *vbo, unsigned int be_flags);
|
||||||
void SWBE_SubmitBatch(struct batch_s *batch);
|
void SWBE_SubmitBatch(struct batch_s *batch);
|
||||||
struct batch_s *SWBE_GetTempBatch(void);
|
struct batch_s *SWBE_GetTempBatch(void);
|
||||||
void SWBE_DrawWorld(qboolean drawworld, qbyte *vis);
|
void SWBE_DrawWorld(qboolean drawworld, qbyte *vis);
|
||||||
|
|
|
@ -421,10 +421,18 @@ void SWBE_TransformVerticies(swvert_t *v, mesh_t *mesh)
|
||||||
// v->colour[3] = mesh->colors4b_array[i][3];
|
// v->colour[3] = mesh->colors4b_array[i][3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void SWBE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags)
|
static void SWBE_DrawMesh_Internal(shader_t *shader, mesh_t *mesh, struct vbo_s *vbo, struct texnums_s *texnums, unsigned int be_flags)
|
||||||
{
|
{
|
||||||
wqcom_t *com;
|
wqcom_t *com;
|
||||||
|
|
||||||
|
if (!texnums)
|
||||||
|
{
|
||||||
|
// if (shader->numdefaulttextures)
|
||||||
|
// texnums = shader->defaulttextures + ;
|
||||||
|
// else
|
||||||
|
texnums = shader->defaulttextures;
|
||||||
|
}
|
||||||
|
|
||||||
shaderstate.curshader = shader;
|
shaderstate.curshader = shader;
|
||||||
|
|
||||||
if (mesh->istrifan)
|
if (mesh->istrifan)
|
||||||
|
@ -456,16 +464,20 @@ void SWBE_DrawMesh_List(shader_t *shader, int nummeshes, struct mesh_s **mesh, s
|
||||||
{
|
{
|
||||||
while(nummeshes-->0)
|
while(nummeshes-->0)
|
||||||
{
|
{
|
||||||
SWBE_DrawMesh_Single(shader, *mesh++, vbo, texnums, be_flags);
|
SWBE_DrawMesh_Internal(shader, *mesh++, vbo, texnums, be_flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void SWBE_DrawMesh_Single(shader_t *shader, mesh_t *mesh, struct vbo_s *vbo, unsigned int be_flags)
|
||||||
|
{
|
||||||
|
SWBE_DrawMesh_Internal(shader, mesh, vbo, NULL, be_flags);
|
||||||
|
}
|
||||||
void SWBE_SubmitBatch(struct batch_s *batch)
|
void SWBE_SubmitBatch(struct batch_s *batch)
|
||||||
{
|
{
|
||||||
int m;
|
int m;
|
||||||
SWBE_SelectEntity(batch->ent);
|
SWBE_SelectEntity(batch->ent);
|
||||||
for (m = 0; m < batch->meshes; m++)
|
for (m = 0; m < batch->meshes; m++)
|
||||||
{
|
{
|
||||||
SWBE_DrawMesh_Single(batch->shader, batch->mesh[m], batch->vbo, batch->skin?batch->skin:&batch->shader->defaulttextures, batch->flags);
|
SWBE_DrawMesh_Internal(batch->shader, batch->mesh[m], batch->vbo, batch->skin, batch->flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
struct batch_s *SWBE_GetTempBatch(void)
|
struct batch_s *SWBE_GetTempBatch(void)
|
||||||
|
|
|
@ -202,7 +202,7 @@ int QDECL main(int argc, char **argv)
|
||||||
|
|
||||||
COM_InitArgv (parms.argc, parms.argv);
|
COM_InitArgv (parms.argc, parms.argv);
|
||||||
|
|
||||||
TL_InitLanguages();
|
TL_InitLanguages("");
|
||||||
|
|
||||||
Sys_Printf ("Host_Init\n");
|
Sys_Printf ("Host_Init\n");
|
||||||
Host_Init (&parms);
|
Host_Init (&parms);
|
||||||
|
|
Loading…
Reference in a new issue