Fix a couple of splitscreen bugs.

Fix Quake3 connectivity issues.
Prepare for displacement maps.
More tweaks for 'quake15'.
Fix vulkan double-free.


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5398 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2019-02-01 08:29:14 +00:00
parent aee6767e7d
commit de20b1e587
25 changed files with 673 additions and 140 deletions

View file

@ -1032,8 +1032,10 @@ void CL_CheckForResend (void)
#ifdef HAVE_DTLS
if (connectinfo.dtlsupgrade != DTLS_ACTIVE)
#endif
//FIXME: this is switching ports far too much
NET_InitClient(false);
{
if (!cls.sockets) //only if its needed... we don't want to keep using a new port unless we have to
NET_InitClient(false);
}
t1 = Sys_DoubleTime ();
if (!connectinfo.istransfer)
@ -1112,9 +1114,13 @@ void CL_CheckForResend (void)
contype |= 1; /*always try qw type connections*/
// if ((connect_tries&3)==3) || (connect_defaultport==26000))
#ifdef VM_UI
if (!UI_IsRunning()) //don't try to connect to nq servers when running a q3ui. I was getting annoying error messages from q3 servers due to this.
#endif
contype |= 2; /*try nq connections periodically (or if its the default nq port)*/
/*DP, QW, Q2, Q3*/
/*NOTE: ioq3 has <challenge> <gamename> args. yes, a challenge to get a challenge.*/
if (contype & 1)
{
Q_snprintfz (data, sizeof(data), "%c%c%c%cgetchallenge\n", 255, 255, 255, 255);
@ -1221,6 +1227,8 @@ void CL_BeginServerReconnect(void)
connectinfo.trying = true;
connectinfo.istransfer = false;
connectinfo.time = 0;
NET_InitClient(false);
}
void CL_Transfer_f(void)
@ -2661,6 +2669,10 @@ void CL_Packet_f (void)
}
*out = 0;
if (!cls.sockets)
NET_InitClient(false);
if (!NET_EnsureRoute(cls.sockets, "packet", Cmd_Argv(1), &adr))
return;
NET_SendPacket (cls.sockets, out-send, send, &adr);
if (Cmd_FromGamecode())
@ -3265,6 +3277,7 @@ void CL_ConnectionlessPacket (void)
{
if (NET_CompareAdr(&net_from, &cls.netchan.remote_address))
{
Cvar_Set(&cl_disconnectreason, "Disconnect request from server");
Con_Printf ("disconnect\n");
CL_Disconnect_f();
return;
@ -3363,7 +3376,17 @@ void CL_ConnectionlessPacket (void)
{
s = MSG_ReadString ();
COM_Parse(s);
if (!strcmp(com_token, "tlsopened"))
if (!strcmp(com_token, "isconnect"))
{
Con_Printf("Disconnect\n");
if (NET_CompareAdr(&connectinfo.adr, &net_from))
{
Cvar_Set(&cl_disconnectreason, "Disconnect request from server");
CL_Disconnect_f();
}
}
else if (!strcmp(com_token, "tlsopened"))
{ //server is letting us know that its now listening for a dtls handshake.
#ifdef HAVE_DTLS
Con_Printf ("dtlsopened\n");

View file

@ -278,7 +278,11 @@ char *Get_Q2ConfigString(int i);
#define MAX_PINGREQUESTS 32
netadr_t ui_pings[MAX_PINGREQUESTS];
struct
{
unsigned int startms;
netadr_t adr;
} ui_pings[MAX_PINGREQUESTS];
#define UITAGNUM 2452
@ -816,13 +820,14 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
{
int i;
for (i = 0; i < MAX_PINGREQUESTS; i++)
if (ui_pings[i].type == NA_INVALID)
if (ui_pings[i].adr.type == NA_INVALID)
{
serverinfo_t *info;
COM_Parse(cmdtext + 5);
if (NET_StringToAdr(com_token, 0, &ui_pings[i]))
ui_pings[i].startms = Sys_Milliseconds();
if (NET_StringToAdr(com_token, 0, &ui_pings[i].adr))
{
info = Master_InfoForServer(&ui_pings[i]);
info = Master_InfoForServer(&ui_pings[i].adr);
if (info)
{
info->special |= SS_KEEPINFO;
@ -833,15 +838,6 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
break;
}
}
else if (!strncmp(cmdtext, "localservers", 12))
{
extern qboolean NET_SendPollPacket(int len, void *data, netadr_t to);
netadr_t na;
MasterInfo_Refresh(false);
if (NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na))
NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na);
}
else
#endif
Cbuf_AddText(cmdtext, RESTRICT_SERVER);
@ -1084,14 +1080,14 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
{
int i;
for (i = 0; i < MAX_PINGREQUESTS; i++)
if (ui_pings[i].type != NA_INVALID)
if (ui_pings[i].adr.type != NA_INVALID)
VM_LONG(ret)++;
}
break;
case UI_LAN_CLEARPING: //clear ping
//void (int pingnum)
if (VM_LONG(arg[0])>= 0 && VM_LONG(arg[0]) < MAX_PINGREQUESTS)
ui_pings[VM_LONG(arg[0])].type = NA_INVALID;
ui_pings[VM_LONG(arg[0])].adr.type = NA_INVALID;
break;
case UI_LAN_GETPING:
//void (int pingnum, char *buffer, int buflen, int *ping)
@ -1103,25 +1099,27 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
Master_CheckPollSockets();
if (VM_LONG(arg[0])>= 0 && VM_LONG(arg[0]) < MAX_PINGREQUESTS)
{
int i = VM_LONG(arg[0]);
char *buf = VM_POINTER(arg[1]);
char *adr;
serverinfo_t *info = Master_InfoForServer(&ui_pings[VM_LONG(arg[0])]);
if (info && info->ping != 0xffff)
size_t bufsize = VM_LONG(arg[2]);
int *ping = VM_POINTER(arg[3]);
serverinfo_t *info = Master_InfoForServer(&ui_pings[i].adr);
NET_AdrToString(buf, bufsize, &ui_pings[i].adr);
if (info && (info->status & SRVSTATUS_ALIVE) && info->moreinfo)
{
adr = NET_AdrToString(adrbuf, sizeof(adrbuf), &info->adr);
if (strlen(adr) < VM_LONG(arg[2]))
{
strcpy(buf, adr);
VM_LONG(ret) = true;
*(int *)VM_POINTER(arg[3]) = info->ping;
}
VM_LONG(ret) = true;
*ping = info->ping;
break;
}
else
strcpy(buf, "");
i = Sys_Milliseconds()-ui_pings[i].startms;
if (i < 999)
i = 0; //don't time out yet.
*ping = i;
}
break;
case UI_LAN_GETPINGINFO:
//void (int pingnum, char *buffer, int buflen, )
//void (int pingnum, char *buffer, int buflen)
if ((int)arg[1] + VM_LONG(arg[2]) >= mask || VM_POINTER(arg[1]) < offset)
break; //out of bounds.
if ((int)arg[3] + sizeof(int) >= mask || VM_POINTER(arg[3]) < offset)
@ -1130,24 +1128,30 @@ static qintptr_t UI_SystemCalls(void *offset, quintptr_t mask, qintptr_t fn, con
Master_CheckPollSockets();
if (VM_LONG(arg[0])>= 0 && VM_LONG(arg[0]) < MAX_PINGREQUESTS)
{
int i = VM_LONG(arg[0]);
char *buf = VM_POINTER(arg[1]);
size_t bufsize = VM_LONG(arg[2]);
char *adr;
serverinfo_t *info = Master_InfoForServer(&ui_pings[VM_LONG(arg[0])]);
if (info && info->ping != 0xffff)
serverinfo_t *info = Master_InfoForServer(&ui_pings[i].adr);
if (info && (info->status & SRVSTATUS_ALIVE) && info->moreinfo)
{
adr = info->moreinfo->info;
if (!adr)
adr = "";
if (strlen(adr) < VM_LONG(arg[2]))
if (strlen(adr) < bufsize)
{
strcpy(buf, adr);
if (!*Info_ValueForKey(buf, "mapname"))
{
Info_SetValueForKey(buf, "mapname", Info_ValueForKey(buf, "map"), VM_LONG(arg[2]));
Info_RemoveKey(buf, "map");
}
Info_SetValueForKey(buf, "sv_maxclients", va("%i", info->maxplayers), VM_LONG(arg[2]));
Info_SetValueForKey(buf, "clients", va("%i", info->players), VM_LONG(arg[2]));
Info_SetValueForKey(buf, "mapname", info->map, bufsize);
Info_SetValueForKey(buf, "hostname", info->name, bufsize);
Info_SetValueForKey(buf, "g_humanplayers", va("%i", info->numhumans), bufsize);
Info_SetValueForKey(buf, "sv_maxclients", va("%i", info->maxplayers), bufsize);
Info_SetValueForKey(buf, "clients", va("%i", info->players), bufsize);
if (info->adr.type == NA_IPV6 && info->adr.prot == NP_DGRAM)
Info_SetValueForKey(buf, "nettype", "2", bufsize);
else if (info->adr.type == NA_IP && info->adr.prot == NP_DGRAM)
Info_SetValueForKey(buf, "nettype", "1", bufsize);
else
Info_SetValueForKey(buf, "nettype", "", bufsize);
VM_LONG(ret) = true;
}
}
@ -1633,7 +1637,7 @@ void UI_Start (void)
UI_Stop();
for (i = 0; i < MAX_PINGREQUESTS; i++)
ui_pings[i].type = NA_INVALID;
ui_pings[i].adr.type = NA_INVALID;
ui_width = vid.width;
ui_height = vid.height;
@ -1692,6 +1696,13 @@ qboolean UI_Command(void)
return false;
}
qboolean UI_IsRunning(void)
{
if (uivm)
return true;
return false;
}
void UI_Init (void)
{
Cmd_AddCommand("ui_restart", UI_Restart_f);

View file

@ -3003,6 +3003,8 @@ qboolean Image_WriteKTXFile(const char *filename, enum fs_relative fsroot, struc
case PTI_L8A8_SRGB: header.glinternalformat = 0x8C45/*GL_SLUMINANCE8_ALPHA8*/; header.glbaseinternalformat = 0x190A/*GL_LUMINANCE_ALPHA*/; header.glformat = 0x190A/*GL_LUMINANCE_ALPHA*/; header.gltype = 0x1401/*GL_UNSIGNED_BYTE*/; header.gltypesize = 1; break;
case PTI_RGB8: header.glinternalformat = 0x8051/*GL_RGB8*/; header.glbaseinternalformat = 0x1907/*GL_RGB*/; header.glformat = 0x1907/*GL_RGB*/; header.gltype = 0x1401/*GL_UNSIGNED_BYTE*/; header.gltypesize = 1; break;
case PTI_BGR8: header.glinternalformat = 0x8051/*GL_RGB8*/; header.glbaseinternalformat = 0x1907/*GL_RGB*/; header.glformat = 0x80E0/*GL_BGR*/; header.gltype = 0x1401/*GL_UNSIGNED_BYTE*/; header.gltypesize = 1; break;
case PTI_R16F: header.glinternalformat = 0x822D/*GL_R16F*/; header.glbaseinternalformat = 0x1903/*GL_RED*/; header.glformat = 0x1903/*GL_RED*/; header.gltype = 0x140B/*GL_HALF_FLOAT*/; header.gltypesize = 2; break;
case PTI_R32F: header.glinternalformat = 0x822E/*GL_R32F*/; header.glbaseinternalformat = 0x1903/*GL_RED*/; header.glformat = 0x1903/*GL_RED*/; header.gltype = 0x1406/*GL_FLOAT*/; header.gltypesize = 4; break;
case PTI_RGBA16F: header.glinternalformat = 0x881A/*GL_RGBA16F*/; header.glbaseinternalformat = 0x1908/*GL_RGBA*/; header.glformat = 0x1908/*GL_RGBA*/; header.gltype = 0x140B/*GL_HALF_FLOAT*/; header.gltypesize = 2; break;
case PTI_RGBA32F: header.glinternalformat = 0x8814/*GL_RGBA32F*/; header.glbaseinternalformat = 0x1908/*GL_RGBA*/; header.glformat = 0x1908/*GL_RGBA*/; header.gltype = 0x1406/*GL_FLOAT*/; header.gltypesize = 4; break;
case PTI_A2BGR10: header.glinternalformat = 0x8059/*GL_RGB10_A2*/; header.glbaseinternalformat = 0x1908/*GL_RGBA*/; header.glformat = 0x1908/*GL_RGBA*/; header.gltype = 0x8368/*GL_UNSIGNED_INT_2_10_10_10_REV*/; header.gltypesize = 4; break;
@ -3174,6 +3176,8 @@ static struct pendingtextureinfo *Image_ReadKTXFile(unsigned int flags, const ch
case 0x81A6/*GL_DEPTH_COMPONENT24*/: encoding = PTI_DEPTH24; break;
case 0x81A7/*GL_DEPTH_COMPONENT32*/: encoding = PTI_DEPTH32; break;
case 0x88F0/*GL_DEPTH24_STENCIL8*/: encoding = PTI_DEPTH24_8; break;
case 0x822D/*GL_R16F*/: encoding = PTI_R16F; break;
case 0x822E/*GL_R32F*/: encoding = PTI_R32F; break;
case 0x8C40/*GL_SRGB*/:
case 0x8C41/*GL_SRGB8*/:
@ -3790,6 +3794,8 @@ qboolean Image_WriteDDSFile(const char *filename, enum fs_relative fsroot, struc
case PTI_L8A8_SRGB: return false; //unsupported
case PTI_RGB8: return false; //unsupported
case PTI_BGR8: return false; //unsupported
case PTI_R16F: h10.dxgiformat = 54/*DXGI_FORMAT_R16_FLOAT*/; break;
case PTI_R32F: h10.dxgiformat = 41/*DXGI_FORMAT_R32_FLOAT*/; break;
case PTI_RGBA16F: h10.dxgiformat = 10/*DXGI_FORMAT_R16G16B16A16_FLOAT*/; break;
case PTI_RGBA32F: h10.dxgiformat = 2/*DXGI_FORMAT_R32G32B32A32_FLOAT*/; break;
case PTI_A2BGR10: h10.dxgiformat = 24/*DXGI_FORMAT_R10G10B10A2_UNORM*/; break;
@ -5714,6 +5720,12 @@ void Image_BlockSizeForEncoding(uploadfmt_t encoding, unsigned int *blockbytes,
b = 4;
break;
case PTI_R16F:
b = 1*2;
break;
case PTI_R32F:
b = 1*4;
break;
case PTI_RGBA16F:
b = 4*2;
break;
@ -5851,6 +5863,8 @@ const char *Image_FormatName(uploadfmt_t fmt)
case PTI_BGRX8_SRGB: return "RGBX8_SRGB";
case PTI_A2BGR10: return "A2BGR10";
case PTI_E5BGR9: return "E5BGR9";
case PTI_R16F: return "R16F";
case PTI_R32F: return "R32F";
case PTI_RGBA16F: return "RGBA16F";
case PTI_RGBA32F: return "RGBA32F";
case PTI_R8: return "R8";
@ -6867,6 +6881,8 @@ static qboolean Image_GenMip0(struct pendingtextureinfo *mips, unsigned int flag
case PTI_EAC_R11_SNORM:
case PTI_EAC_RG11:
case PTI_EAC_RG11_SNORM:
case PTI_R16F:
case PTI_R32F:
break; //already no alpha in these formats
case PTI_DEPTH16:
case PTI_DEPTH24:

View file

@ -377,6 +377,7 @@ typedef struct texnums_s {
texid_t fullbright;
texid_t reflectcube;
texid_t reflectmask;
texid_t displacement;
//the material's pushconstants. vulkan guarentees only 128 bytes. so 8 vec4s. note that lmscales should want 4 of them...
/*struct

View file

@ -210,17 +210,8 @@ qboolean Net_AddressIsMaster(netadr_t *adr)
}
return false;
}
void Net_Master_Init(void)
{
int i;
for (i = 0; net_masterlist[i].cv.name; i++)
Cvar_Register(&net_masterlist[i].cv, "master servers");
#ifndef CLIENTONLY
Cmd_AddCommand ("setmaster", SV_SetMaster_f);
#endif
}
#ifndef CLIENTONLY
#ifdef HAVE_SERVER
static void QDECL Net_Masterlist_Callback(struct cvar_s *var, char *oldvalue)
{
@ -2552,7 +2543,7 @@ void MasterInfo_Request(master_t *mast)
case MP_QUAKE3:
{
char *str;
str = va("%c%c%c%cgetservers %u empty full\x0A\n", 255, 255, 255, 255, 68);
str = va("%c%c%c%cgetservers %u empty full\n", 255, 255, 255, 255, 68);
NET_SendPollPacket (strlen(str), str, mast->adr);
}
break;
@ -3575,9 +3566,66 @@ void CL_Connect_c(int argn, const char *partial, struct xcommandargcompletioncb_
}
}
}
#else
void CL_Connect_c(int argn, const char *partial, struct xcommandargcompletioncb_s *ctx)
{
}
#endif
#ifdef Q3CLIENT
static void NetQ3_LocalServers_f(void)
{
netadr_t na;
MasterInfo_Refresh(true);
if (NET_StringToAdr("255.255.255.255", PORT_Q3SERVER, &na))
NET_SendPollPacket (14, va("%c%c%c%cgetstatus\n", 255, 255, 255, 255), na);
}
static void NetQ3_GlobalServers_f(void)
{
size_t masternum = atoi(Cmd_Argv(1));
int protocol = atoi(Cmd_Argv(2));
char *keywords;
size_t i;
MasterInfo_Refresh(true);
Cmd_ShiftArgs(2, false);
keywords = Cmd_Args();
if (!masternum)
{
for (i = 0; i < countof(net_masterlist); i++)
Cbuf_AddText(va("globalservers %u %i %s\n", (unsigned)(i+1), protocol, keywords), Cmd_ExecLevel);
}
masternum--;
if (masternum >= countof(net_masterlist))
return; //erk
if (net_masterlist[masternum].protocol == MP_QUAKE3)
{
netadr_t adr[16];
char *str;
size_t n;
COM_Parse(net_masterlist[masternum].cv.string); //only want the first one
n = NET_StringToAdr2(com_token, 0, adr, countof(adr));
str = va("%c%c%c%cgetservers %u empty full\n", 255, 255, 255, 255, 68);
for (i = 0; i < n; i++)
NET_SendPollPacket (strlen(str), str, adr[i]);
}
}
#endif
void Net_Master_Init(void)
{
int i;
for (i = 0; net_masterlist[i].cv.name; i++)
Cvar_Register(&net_masterlist[i].cv, "master servers");
#ifdef HAVE_SERVER
Cmd_AddCommand ("setmaster", SV_SetMaster_f);
#endif
#ifdef Q3CLIENT
Cmd_AddCommand ("localservers", NetQ3_LocalServers_f);
Cmd_AddCommand ("globalservers", NetQ3_GlobalServers_f);
#endif
}

View file

@ -5577,7 +5577,13 @@ static void P_ParticleTrailSpawn (vec3_t startpos, vec3_t end, part_type_t *ptyp
step = ptype->countspacing; //particles per qu
step /= r_part_density.value; //scaled...
//FIXME: countextra
if (ptype->countextra)
{
count = ptype->countextra;
if (step>0)
count += len/step;
step = len/count;
}
}
else
{
@ -5660,9 +5666,6 @@ static void P_ParticleTrailSpawn (vec3_t startpos, vec3_t end, part_type_t *ptyp
}
// count += ptype->countextra;
if (count > 1000)
count = 1000;
while (count-->0)//len < stop)
{
len += step;

View file

@ -85,6 +85,7 @@ enum fs_relative;
typedef enum uploadfmt
{
//NOTE: these values are exposed to native plugins but not QC.
PTI_INVALID,
//these formats are specified as direct byte access (listed in byte order, aka big-endian 0xrrggbbaa order)
@ -108,6 +109,8 @@ typedef enum uploadfmt
PTI_R8_SNORM,
PTI_RG8_SNORM, //might be useful for normalmaps
//floating point formats
PTI_R16F,
PTI_R32F,
PTI_RGBA16F,
PTI_RGBA32F,
//packed/misaligned formats: these are specified in native endian order (high bits listed first because that's how things are represented in hex), so may need byte swapping...

View file

@ -19,10 +19,9 @@ We also have no doppler with WebAudio.
qboolean firefoxstaticsounds; //FireFox bugs out with static sounds. they all end up full volume AND THIS IS REALLY LOUD AND REALLY ANNOYING.
#else
#define SDRVNAME "OpenAL"
// #define USEEFX
#endif
#define USEEFX
#ifdef OPENAL_STATIC
#include <AL/al.h> //output
#include <AL/alc.h> //context+input
@ -296,7 +295,9 @@ extern sfx_t *known_sfx;
extern int loaded_sfx;
extern int num_sfx;
#ifdef USEEFX
static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb);
#endif
static void OpenAL_Shutdown (soundcardinfo_t *sc);
static void QDECL OnChangeALSettings (cvar_t *var, char *value);
/*
@ -1179,6 +1180,7 @@ static unsigned int OpenAL_GetDMAPos (soundcardinfo_t *sc)
return 0;
}
#ifdef USEEFX
static void OpenAL_SetReverb (soundcardinfo_t *sc, size_t reverbeffect)
{
#ifdef USEEFX
@ -1222,6 +1224,7 @@ static void OpenAL_SetReverb (soundcardinfo_t *sc, size_t reverbeffect)
//Con_Printf("OpenAL: SetUnderWater %i\n", underwater);
#endif
}
#endif
static void OpenAL_Shutdown (soundcardinfo_t *sc)
{
@ -1262,6 +1265,7 @@ static void OpenAL_Shutdown (soundcardinfo_t *sc)
Z_Free(oali);
}
#ifdef USEEFX
static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb)
{
ALuint effect = 0;
@ -1323,6 +1327,7 @@ static ALuint OpenAL_LoadEffect(const struct reverbproperties_s *reverb)
}
return effect;
}
#endif
static qboolean QDECL OpenAL_InitCard(soundcardinfo_t *sc, const char *devname)
{

View file

@ -1340,6 +1340,8 @@ qboolean Cvar_Command (int level)
return true;
}
olev = Cmd_ExecLevel;
Cmd_ExecLevel = level;
#ifdef HAVE_CLIENT
if (v->flags & CVAR_USERINFO)
{
@ -1354,6 +1356,7 @@ qboolean Cvar_Command (int level)
}
else
CL_SetInfo(seat, v->name, str);
Cmd_ExecLevel = olev;
return true;
}
@ -1370,6 +1373,7 @@ qboolean Cvar_Command (int level)
else
{
Cvar_LockFromServer(v, str);
Cmd_ExecLevel = olev;
return true;
}
}
@ -1380,12 +1384,12 @@ qboolean Cvar_Command (int level)
if (v->defaultstr && strcmp(v->defaultstr, str))
{ //lock the cvar, unless it's going to it's default value.
Cvar_LockFromServer(v, str);
Cmd_ExecLevel = olev;
return true;
}
}
#endif
olev = Cmd_ExecLevel;
Cmd_ExecLevel = 0;//just to try to detect any bugs that could happen from this
Cvar_Set (v, str); //will use all, quote included
Cmd_ExecLevel = olev;

View file

@ -3319,7 +3319,10 @@ neterr_t FTENET_Datagram_SendPacket(ftenet_generic_connection_t *con, int length
size = NetadrToSockadr (to, &addr);
}
ret = sendto (con->thesocket, data, length, 0, (struct sockaddr*)&addr, size );
if (!data)
ret = 0; //don't send a runt, but pretend we did... yes, this'll confuse EnsureRoute, but at least it'll ensure there's a udp socket open, somewhere.
else
ret = sendto (con->thesocket, data, length, 0, (struct sockaddr*)&addr, size );
if (ret == -1)
{
const char *prot;

View file

@ -59,6 +59,7 @@ int VMQ3_StringToHandle(char *str);
void VMQ3_FlushStringHandles(void);
#ifdef VM_UI
qboolean UI_IsRunning(void);
qboolean UI_Command(void);
void UI_Init (void);
void UI_Start (void);

View file

@ -826,6 +826,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
cm->texnum.paletted = r_nulltex;
cm->texnum.reflectcube = r_nulltex;
cm->texnum.reflectmask = r_nulltex;
cm->texnum.displacement = r_nulltex;
return shader;
}
}
@ -1027,6 +1028,7 @@ static shader_t *GL_ChooseSkin(galiasinfo_t *inf, model_t *model, int surfnum, e
cm->texnum.reflectcube = shader->defaulttextures->reflectcube;
cm->texnum.reflectmask = shader->defaulttextures->reflectmask;
cm->texnum.paletted = shader->defaulttextures->paletted;
cm->texnum.displacement = shader->defaulttextures->displacement;
#ifdef HEXEN2 //too lazy to do this
if (h2playertranslations && pc)
@ -2526,9 +2528,9 @@ static void R_Sprite_GenerateTrisoup(entity_t *e, int bemode)
VectorMA(sprorigin, e->origin[0], r_refdef.playerview->vw_axis[0], sprorigin);
VectorMA(sprorigin, e->origin[1], r_refdef.playerview->vw_axis[1], sprorigin);
VectorMA(sprorigin, e->origin[2], r_refdef.playerview->vw_axis[2], sprorigin);
VectorMA(sprorigin, 12, vpn, sprorigin);
// VectorMA(sprorigin, 12, vpn, sprorigin);
batchflags |= BEF_FORCENODEPTH;
// batchflags |= BEF_FORCENODEPTH;
}
else
VectorCopy(e->origin, sprorigin);

View file

@ -1274,6 +1274,12 @@ static void Shader_BindTextureForPass(int tmu, const shaderpass_t *pass)
else
t = r_whiteimage;
break;
case T_GEN_DISPLACEMENT:
if (shaderstate.curtexnums && TEXLOADED(shaderstate.curtexnums->displacement))
t = shaderstate.curtexnums->displacement;
else
t = r_whiteimage;
break;
case T_GEN_SHADOWMAP:
t = shaderstate.curshadowmap;
break;

View file

@ -146,7 +146,7 @@ void GL_SetupFormats(void)
// glfmtc(PTI_RGBA4444,GL_RGBA, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, tc_rgba8);
// glfmtc(PTI_RGBA5551,GL_RGBA, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, tc_rgba1);
}
if (GL_CheckExtension("GL_OES_texture_half_float"))
if (GL_CheckExtension("GL_OES_texture_half_float"))
glfmtc(PTI_RGBA16F, GL_RGBA, GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES, 0); //not to be confused with GL_HALF_FLOAT[_ARB] which has a different value
if (GL_CheckExtension("GL_OES_texture_float"))
glfmtc(PTI_RGBA32F, GL_RGBA, GL_RGBA, GL_RGBA, GL_FLOAT, 0);
@ -229,8 +229,11 @@ void GL_SetupFormats(void)
if (ver >= 3.0)
{
glfmtc(PTI_RGBA16F, GL_RGBA16F_ARB, GL_RGBA, GL_RGBA, GL_HALF_FLOAT, 0);
glfmtc(PTI_RGBA32F, GL_RGBA32F_ARB, GL_RGBA, GL_RGBA, GL_FLOAT, 0);
glfmtc(PTI_R16F, GL_R16F, GL_RED, GL_RED, GL_HALF_FLOAT, 0);
glfmtc(PTI_R32F, GL_R32F, GL_RED, GL_RED, GL_FLOAT, 0);
glfmtc(PTI_RGBA16F, GL_RGBA16F_ARB, GL_RGBA, GL_RGBA, GL_HALF_FLOAT, 0);
glfmtc(PTI_RGBA32F, GL_RGBA32F_ARB, GL_RGBA, GL_RGBA, GL_FLOAT, 0);
}
if (ver >= 1.2 && !gl_config_gles)
{

View file

@ -1156,15 +1156,16 @@ const struct sh_defaultsamplers_s sh_defaultsamplers[] =
{"s_paletted", 1u<<8},
{"s_reflectcube", 1u<<9},
{"s_reflectmask", 1u<<10},
{"s_lightmap", 1u<<11},
{"s_deluxemap", 1u<<12},
{"s_displacement", 1u<<11},
{"s_lightmap", 1u<<12},
{"s_deluxemap", 1u<<13},
#if MAXRLIGHTMAPS > 1
{"s_lightmap1", 1u<<13},
{"s_lightmap2", 1u<<14},
{"s_lightmap3", 1u<<15},
{"s_deluxemap1", 1u<<16},
{"s_deluxemap2", 1u<<17},
{"s_deluxemap3", 1u<<18},
{"s_lightmap1", 1u<<14},
{"s_lightmap2", 1u<<15},
{"s_lightmap3", 1u<<16},
{"s_deluxemap1", 1u<<17},
{"s_deluxemap2", 1u<<18},
{"s_deluxemap3", 1u<<19},
#else
{"s_lightmap1", 0},
{"s_lightmap2", 0},
@ -2177,6 +2178,12 @@ static void Shader_LowerMap(shader_t *shader, shaderpass_t *pass, char **ptr)
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
shader->defaulttextures->loweroverlay = Shader_FindImage(token, flags);
}
static void Shader_DisplacementMap(shader_t *shader, shaderpass_t *pass, char **ptr)
{
char *token = Shader_ParseString(ptr);
unsigned int flags = Shader_SetImageFlags (shader, NULL, &token);
shader->defaulttextures->displacement = Shader_FindImage(token, flags|IF_NOSRGB);
}
static void Shaderpass_QF_Material(shader_t *shader, shaderpass_t *pass, char **ptr)
{
@ -2430,6 +2437,7 @@ static shaderkey_t shaderkeys[] =
{"uppermap", Shader_UpperMap, "fte"},
{"lowermap", Shader_LowerMap, "fte"},
{"reflectmask", Shader_ReflectMask, "fte"},
{"displacementmap", Shader_DisplacementMap, "fte"},
{"portalfboscale", Shader_PortalFBOScale, "fte"}, //portal/mirror/refraction/reflection FBOs are resized by this scale
{"basefactor", NULL, "fte"}, //material scalers for glsl
@ -2581,6 +2589,11 @@ static qboolean Shaderpass_MapGen (shader_t *shader, shaderpass_t *pass, char *t
{
pass->texgen = T_GEN_REFLECTMASK;
}
else if (!Q_stricmp (tname, "$displacement"))
{
shader->flags |= SHADER_HASDISPLACEMENT;
pass->texgen = T_GEN_DISPLACEMENT;
}
else if (!Q_stricmp (tname, "$shadowmap"))
{
pass->texgen = T_GEN_SHADOWMAP;
@ -4043,19 +4056,20 @@ void Shader_FixupProgPasses(shader_t *shader, shaderpass_t *pass)
} defaulttgen[] =
{
//light
{T_GEN_SHADOWMAP, 0}, //1
{T_GEN_LIGHTCUBEMAP, 0}, //2
{T_GEN_SHADOWMAP, 0}, //0
{T_GEN_LIGHTCUBEMAP, 0}, //1
//material
{T_GEN_DIFFUSE, SHADER_HASDIFFUSE}, //3
{T_GEN_NORMALMAP, SHADER_HASNORMALMAP}, //4
{T_GEN_SPECULAR, SHADER_HASGLOSS}, //5
{T_GEN_UPPEROVERLAY, SHADER_HASTOPBOTTOM}, //6
{T_GEN_LOWEROVERLAY, SHADER_HASTOPBOTTOM}, //7
{T_GEN_FULLBRIGHT, SHADER_HASFULLBRIGHT}, //8
{T_GEN_PALETTED, SHADER_HASPALETTED}, //9
{T_GEN_REFLECTCUBE, 0}, //10
{T_GEN_REFLECTMASK, 0}, //11
{T_GEN_DIFFUSE, SHADER_HASDIFFUSE}, //2
{T_GEN_NORMALMAP, SHADER_HASNORMALMAP}, //3
{T_GEN_SPECULAR, SHADER_HASGLOSS}, //4
{T_GEN_UPPEROVERLAY, SHADER_HASTOPBOTTOM}, //5
{T_GEN_LOWEROVERLAY, SHADER_HASTOPBOTTOM}, //6
{T_GEN_FULLBRIGHT, SHADER_HASFULLBRIGHT}, //7
{T_GEN_PALETTED, SHADER_HASPALETTED}, //8
{T_GEN_REFLECTCUBE, 0}, //9
{T_GEN_REFLECTMASK, 0}, //10
{T_GEN_DISPLACEMENT, SHADER_HASDISPLACEMENT},//11
// {T_GEN_REFLECTION, SHADER_HASREFLECT}, //
// {T_GEN_REFRACTION, SHADER_HASREFRACT}, //
// {T_GEN_REFRACTIONDEPTH, SHADER_HASREFRACTDEPTH},//
@ -5156,19 +5170,20 @@ done:;
} defaulttgen[] =
{
//light
{T_GEN_SHADOWMAP, 0}, //1
{T_GEN_LIGHTCUBEMAP, 0}, //2
{T_GEN_SHADOWMAP, 0}, //0
{T_GEN_LIGHTCUBEMAP, 0}, //1
//material
{T_GEN_DIFFUSE, SHADER_HASDIFFUSE}, //3
{T_GEN_NORMALMAP, SHADER_HASNORMALMAP}, //4
{T_GEN_SPECULAR, SHADER_HASGLOSS}, //5
{T_GEN_UPPEROVERLAY, SHADER_HASTOPBOTTOM}, //6
{T_GEN_LOWEROVERLAY, SHADER_HASTOPBOTTOM}, //7
{T_GEN_FULLBRIGHT, SHADER_HASFULLBRIGHT}, //8
{T_GEN_PALETTED, SHADER_HASPALETTED}, //9
{T_GEN_REFLECTCUBE, 0}, //10
{T_GEN_REFLECTMASK, 0}, //11
{T_GEN_DIFFUSE, SHADER_HASDIFFUSE}, //2
{T_GEN_NORMALMAP, SHADER_HASNORMALMAP}, //3
{T_GEN_SPECULAR, SHADER_HASGLOSS}, //4
{T_GEN_UPPEROVERLAY, SHADER_HASTOPBOTTOM}, //5
{T_GEN_LOWEROVERLAY, SHADER_HASTOPBOTTOM}, //6
{T_GEN_FULLBRIGHT, SHADER_HASFULLBRIGHT}, //7
{T_GEN_PALETTED, SHADER_HASPALETTED}, //8
{T_GEN_REFLECTCUBE, 0}, //9
{T_GEN_REFLECTMASK, 0}, //10
{T_GEN_DISPLACEMENT, SHADER_HASDISPLACEMENT},//11
// {T_GEN_REFLECTION, SHADER_HASREFLECT}, //
// {T_GEN_REFRACTION, SHADER_HASREFRACT}, //
// {T_GEN_REFRACTIONDEPTH, SHADER_HASREFRACTDEPTH},//
@ -5376,6 +5391,8 @@ void QDECL R_BuildDefaultTexnums(texnums_t *src, shader_t *shader, unsigned int
tex->reflectmask = src->reflectmask;
if (!TEXVALID(tex->reflectcube))
tex->reflectcube = src->reflectcube;
if (!TEXVALID(tex->displacement))
tex->displacement = src->displacement;
}
for (a = 1; a < aframes; a++)
{
@ -5395,6 +5412,8 @@ void QDECL R_BuildDefaultTexnums(texnums_t *src, shader_t *shader, unsigned int
tex[a].reflectmask = tex[0].reflectmask;
if (!TEXVALID(tex[a].reflectcube))
tex[a].reflectcube = tex[0].reflectcube;
if (!TEXVALID(tex[a].displacement))
tex[a].displacement = tex[0].displacement;
}
for (a = 0; a < aframes; a++, tex++)
{
@ -5612,6 +5631,8 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
tex[a].reflectmask = tex[0].reflectmask;
if (!TEXVALID(tex[a].reflectcube))
tex[a].reflectcube = tex[0].reflectcube;
if (!TEXVALID(tex[a].displacement))
tex[a].displacement = tex[0].displacement;
}
for (a = 0; a < aframes; a++, tex++)
{
@ -7088,6 +7109,7 @@ static char *Shader_DecomposeSubPass(char *o, shaderpass_t *p, qboolean simple)
case T_GEN_PALETTED: sprintf(o, "paletted "); break;
case T_GEN_REFLECTCUBE: sprintf(o, "reflectcube "); break;
case T_GEN_REFLECTMASK: sprintf(o, "reflectmask "); break;
case T_GEN_DISPLACEMENT: sprintf(o, "displacementmap "); break;
case T_GEN_CURRENTRENDER: sprintf(o, "currentrender "); break;
case T_GEN_SOURCECOLOUR: sprintf(o, "sourcecolour "); break;
case T_GEN_SOURCEDEPTH: sprintf(o, "sourcedepth "); break;

View file

@ -2175,6 +2175,7 @@ static GLhandleARB GLSlang_CreateShader (program_t *prog, const char *name, int
"uniform sampler2D s_paletted;\n",
"uniform samplerCube s_reflectcube;\n",
"uniform sampler2D s_reflectmask;\n",
"uniform sampler2D s_displacement;\n",
"uniform sampler2D s_lightmap;\n#define s_lightmap0 s_lightmap\n",
"uniform sampler2D s_deluxemap;\n#define s_deluxemap0 s_deluxemap\n",

View file

@ -892,9 +892,13 @@ typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void);
#define GL_TEXTURE_MAX_LEVEL 0x813d
#endif
#ifndef GL_RGBA16F_ARB
#define GL_RGBA16F_ARB 0x881A
#define GL_RGBA32F_ARB 0x8814
#ifndef GL_RGBA16F
#define GL_RGBA16F 0x881A
#define GL_RGBA32F 0x8814
#endif
#ifndef GL_R16F
#define GL_R16F 0x822D
#define GL_R32F 0x822E
#endif
#ifndef GL_RED

View file

@ -2665,6 +2665,282 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
"#endif\n"
},
#endif
#ifdef VKQUAKE
{QR_VULKAN, -1, "defaultadditivesprite",
"\xFF\x53\x50\x56\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x20\x00\x00\x00\x2C\x00\x00\x00\x20\x00\x00\x00\x4C\x00\x00\x00"
"\x7C\x0F\x00\x00\xC8\x0F\x00\x00\x54\x12\x00\x00\x01\x00\x46\x31\x4D\x41\x53\x4B\x00\x00\x00\x00\x00\x01\x01\x62\x31\x72\x5F\x66"
"\x6F\x67\x5F\x65\x78\x70\x32\x00\x00\x00\x00\x00\x03\x02\x23\x07\x00\x00\x01\x00\x06\x00\x08\x00\x51\x00\x00\x00\x00\x00\x00\x00"
"\x11\x00\x02\x00\x01\x00\x00\x00\x0B\x00\x06\x00\x01\x00\x00\x00\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30\x00\x00\x00\x00"
"\x0E\x00\x03\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x0F\x00\x00\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00"
"\x1C\x00\x00\x00\x39\x00\x00\x00\x3B\x00\x00\x00\x3E\x00\x00\x00\x40\x00\x00\x00\x44\x00\x00\x00\x4D\x00\x00\x00\x4E\x00\x00\x00"
"\x4F\x00\x00\x00\x50\x00\x00\x00\x03\x00\x03\x00\x02\x00\x00\x00\xC2\x01\x00\x00\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E"
"\x00\x00\x00\x00\x05\x00\x06\x00\x09\x00\x00\x00\x66\x74\x65\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x28\x00\x00\x00\x05\x00\x04\x00"
"\x0C\x00\x00\x00\x70\x72\x6F\x6A\x00\x00\x00\x00\x05\x00\x05\x00\x13\x00\x00\x00\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00"
"\x06\x00\x07\x00\x13\x00\x00\x00\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00"
"\x13\x00\x00\x00\x01\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00\x13\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F"
"\x64\x65\x6C\x69\x6E\x76\x00\x00\x06\x00\x06\x00\x13\x00\x00\x00\x03\x00\x00\x00\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00"
"\x06\x00\x05\x00\x13\x00\x00\x00\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00\x06\x00\x07\x00\x13\x00\x00\x00\x05\x00\x00\x00"
"\x65\x5F\x6C\x69\x67\x68\x74\x5F\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00\x13\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64"
"\x31\x00\x00\x00\x06\x00\x06\x00\x13\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00"
"\x13\x00\x00\x00\x08\x00\x00\x00\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00\x13\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69"
"\x67\x68\x74\x5F\x6D\x75\x6C\x00\x06\x00\x05\x00\x13\x00\x00\x00\x0A\x00\x00\x00\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00"
"\x13\x00\x00\x00\x0B\x00\x00\x00\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00\x06\x00\x07\x00\x13\x00\x00\x00\x0C\x00\x00\x00"
"\x65\x5F\x75\x70\x70\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x13\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64"
"\x34\x00\x00\x00\x06\x00\x07\x00\x13\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00"
"\x06\x00\x05\x00\x13\x00\x00\x00\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00\x06\x00\x06\x00\x13\x00\x00\x00\x10\x00\x00\x00"
"\x65\x5F\x67\x6C\x6F\x77\x6D\x6F\x64\x00\x00\x00\x06\x00\x05\x00\x13\x00\x00\x00\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00"
"\x06\x00\x07\x00\x13\x00\x00\x00\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00"
"\x13\x00\x00\x00\x13\x00\x00\x00\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73\x00\x00\x00\x00\x06\x00\x07\x00\x13\x00\x00\x00"
"\x14\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00\x06\x00\x07\x00\x13\x00\x00\x00\x15\x00\x00\x00"
"\x77\x5F\x66\x6F\x67\x64\x65\x70\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00\x13\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64"
"\x37\x00\x00\x00\x05\x00\x03\x00\x15\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x1C\x00\x00\x00\x76\x5F\x70\x6F\x73\x69\x74\x69"
"\x6F\x6E\x00\x00\x05\x00\x03\x00\x39\x00\x00\x00\x74\x63\x00\x00\x05\x00\x05\x00\x3B\x00\x00\x00\x76\x5F\x74\x65\x78\x63\x6F\x6F"
"\x72\x64\x00\x00\x05\x00\x03\x00\x3E\x00\x00\x00\x76\x63\x00\x00\x05\x00\x05\x00\x40\x00\x00\x00\x76\x5F\x63\x6F\x6C\x6F\x75\x72"
"\x00\x00\x00\x00\x05\x00\x06\x00\x42\x00\x00\x00\x67\x6C\x5F\x50\x65\x72\x56\x65\x72\x74\x65\x78\x00\x00\x00\x00\x06\x00\x06\x00"
"\x42\x00\x00\x00\x00\x00\x00\x00\x67\x6C\x5F\x50\x6F\x73\x69\x74\x69\x6F\x6E\x00\x05\x00\x03\x00\x44\x00\x00\x00\x00\x00\x00\x00"
"\x05\x00\x05\x00\x47\x00\x00\x00\x61\x72\x67\x5F\x4D\x41\x53\x4B\x00\x00\x00\x00\x05\x00\x07\x00\x48\x00\x00\x00\x5F\x63\x76\x61"
"\x72\x5F\x72\x5F\x66\x6F\x67\x5F\x65\x78\x70\x32\x00\x00\x00\x00\x05\x00\x04\x00\x49\x00\x00\x00\x5F\x46\x4F\x47\x00\x00\x00\x00"
"\x05\x00\x05\x00\x4A\x00\x00\x00\x6C\x69\x67\x68\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x4A\x00\x00\x00\x00\x00\x00\x00"
"\x6C\x5F\x63\x75\x62\x65\x6D\x61\x74\x72\x69\x78\x00\x00\x00\x00\x06\x00\x07\x00\x4A\x00\x00\x00\x01\x00\x00\x00\x6C\x5F\x6C\x69"
"\x67\x68\x74\x70\x6F\x73\x69\x74\x69\x6F\x6E\x00\x06\x00\x05\x00\x4A\x00\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64\x31\x00\x00\x00"
"\x06\x00\x07\x00\x4A\x00\x00\x00\x03\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00"
"\x4A\x00\x00\x00\x04\x00\x00\x00\x6C\x70\x61\x64\x32\x00\x00\x00\x06\x00\x08\x00\x4A\x00\x00\x00\x05\x00\x00\x00\x6C\x5F\x6C\x69"
"\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x73\x63\x61\x6C\x65\x00\x00\x06\x00\x07\x00\x4A\x00\x00\x00\x06\x00\x00\x00\x6C\x5F\x6C\x69"
"\x67\x68\x74\x72\x61\x64\x69\x75\x73\x00\x00\x00\x06\x00\x07\x00\x4A\x00\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77"
"\x6D\x61\x70\x70\x72\x6F\x6A\x00\x06\x00\x08\x00\x4A\x00\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x73"
"\x63\x61\x6C\x65\x00\x00\x00\x00\x06\x00\x05\x00\x4A\x00\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00\x05\x00\x03\x00"
"\x4C\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x4D\x00\x00\x00\x76\x5F\x6C\x6D\x63\x6F\x6F\x72\x64\x00\x00\x00\x05\x00\x05\x00"
"\x4E\x00\x00\x00\x76\x5F\x6E\x6F\x72\x6D\x61\x6C\x00\x00\x00\x00\x05\x00\x05\x00\x4F\x00\x00\x00\x76\x5F\x73\x76\x65\x63\x74\x6F"
"\x72\x00\x00\x00\x05\x00\x05\x00\x50\x00\x00\x00\x76\x5F\x74\x76\x65\x63\x74\x6F\x72\x00\x00\x00\x47\x00\x04\x00\x11\x00\x00\x00"
"\x06\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x13\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00"
"\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00"
"\x48\x00\x04\x00\x13\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00"
"\x40\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x13\x00\x00\x00"
"\x02\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00"
"\x13\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00"
"\xC0\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\xCC\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00"
"\x05\x00\x00\x00\x23\x00\x00\x00\xD0\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\xDC\x00\x00\x00"
"\x48\x00\x05\x00\x13\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\xE0\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x08\x00\x00\x00"
"\x23\x00\x00\x00\xEC\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\xF0\x00\x00\x00\x48\x00\x05\x00"
"\x13\x00\x00\x00\x0A\x00\x00\x00\x23\x00\x00\x00\xFC\x00\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x0B\x00\x00\x00\x23\x00\x00\x00"
"\x00\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x0C\x00\x00\x00\x23\x00\x00\x00\x40\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00"
"\x0D\x00\x00\x00\x23\x00\x00\x00\x4C\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x0E\x00\x00\x00\x23\x00\x00\x00\x50\x01\x00\x00"
"\x48\x00\x05\x00\x13\x00\x00\x00\x0F\x00\x00\x00\x23\x00\x00\x00\x5C\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x10\x00\x00\x00"
"\x23\x00\x00\x00\x60\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x11\x00\x00\x00\x23\x00\x00\x00\x6C\x01\x00\x00\x48\x00\x05\x00"
"\x13\x00\x00\x00\x12\x00\x00\x00\x23\x00\x00\x00\x70\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x13\x00\x00\x00\x23\x00\x00\x00"
"\x80\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x14\x00\x00\x00\x23\x00\x00\x00\x90\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00"
"\x15\x00\x00\x00\x23\x00\x00\x00\x94\x01\x00\x00\x48\x00\x05\x00\x13\x00\x00\x00\x16\x00\x00\x00\x23\x00\x00\x00\x98\x01\x00\x00"
"\x47\x00\x03\x00\x13\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x15\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00"
"\x15\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x1C\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00"
"\x39\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x3B\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00"
"\x3E\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00\x47\x00\x04\x00\x40\x00\x00\x00\x1E\x00\x00\x00\x02\x00\x00\x00\x48\x00\x05\x00"
"\x42\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00\x47\x00\x03\x00\x42\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00"
"\x47\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x47\x00\x04\x00\x48\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x47\x00\x04\x00"
"\x49\x00\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x48\x00\x04\x00\x4A\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00"
"\x4A\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00"
"\x10\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00"
"\x02\x00\x00\x00\x23\x00\x00\x00\x4C\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\x50\x00\x00\x00"
"\x48\x00\x05\x00\x4A\x00\x00\x00\x04\x00\x00\x00\x23\x00\x00\x00\x5C\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x05\x00\x00\x00"
"\x23\x00\x00\x00\x60\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\x6C\x00\x00\x00\x48\x00\x05\x00"
"\x4A\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00"
"\x80\x00\x00\x00\x48\x00\x05\x00\x4A\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\x88\x00\x00\x00\x47\x00\x03\x00\x4A\x00\x00\x00"
"\x02\x00\x00\x00\x47\x00\x04\x00\x4C\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x4C\x00\x00\x00\x21\x00\x00\x00"
"\x01\x00\x00\x00\x47\x00\x04\x00\x4D\x00\x00\x00\x1E\x00\x00\x00\x03\x00\x00\x00\x47\x00\x04\x00\x4E\x00\x00\x00\x1E\x00\x00\x00"
"\x04\x00\x00\x00\x47\x00\x04\x00\x4F\x00\x00\x00\x1E\x00\x00\x00\x05\x00\x00\x00\x47\x00\x04\x00\x50\x00\x00\x00\x1E\x00\x00\x00"
"\x06\x00\x00\x00\x13\x00\x02\x00\x02\x00\x00\x00\x21\x00\x03\x00\x03\x00\x00\x00\x02\x00\x00\x00\x16\x00\x03\x00\x06\x00\x00\x00"
"\x20\x00\x00\x00\x17\x00\x04\x00\x07\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x21\x00\x03\x00\x08\x00\x00\x00\x07\x00\x00\x00"
"\x20\x00\x04\x00\x0B\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x18\x00\x04\x00\x0D\x00\x00\x00\x07\x00\x00\x00\x04\x00\x00\x00"
"\x17\x00\x04\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x15\x00\x04\x00\x0F\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00"
"\x2B\x00\x04\x00\x0F\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00\x11\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00"
"\x17\x00\x04\x00\x12\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x19\x00\x13\x00\x00\x00\x0D\x00\x00\x00\x0D\x00\x00\x00"
"\x0D\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00"
"\x06\x00\x00\x00\x11\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00"
"\x07\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x12\x00\x00\x00\x20\x00\x04\x00\x14\x00\x00\x00\x02\x00\x00\x00"
"\x13\x00\x00\x00\x3B\x00\x04\x00\x14\x00\x00\x00\x15\x00\x00\x00\x02\x00\x00\x00\x15\x00\x04\x00\x16\x00\x00\x00\x20\x00\x00\x00"
"\x01\x00\x00\x00\x2B\x00\x04\x00\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x20\x00\x04\x00\x18\x00\x00\x00\x02\x00\x00\x00"
"\x0D\x00\x00\x00\x20\x00\x04\x00\x1B\x00\x00\x00\x01\x00\x00\x00\x0E\x00\x00\x00\x3B\x00\x04\x00\x1B\x00\x00\x00\x1C\x00\x00\x00"
"\x01\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x80\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x24\x00\x00\x00"
"\x00\x00\x80\xBF\x2B\x00\x04\x00\x0F\x00\x00\x00\x25\x00\x00\x00\x01\x00\x00\x00\x20\x00\x04\x00\x26\x00\x00\x00\x07\x00\x00\x00"
"\x06\x00\x00\x00\x2B\x00\x04\x00\x0F\x00\x00\x00\x2B\x00\x00\x00\x02\x00\x00\x00\x2B\x00\x04\x00\x0F\x00\x00\x00\x2E\x00\x00\x00"
"\x03\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x40\x20\x00\x04\x00\x38\x00\x00\x00\x03\x00\x00\x00"
"\x12\x00\x00\x00\x3B\x00\x04\x00\x38\x00\x00\x00\x39\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x3A\x00\x00\x00\x01\x00\x00\x00"
"\x12\x00\x00\x00\x3B\x00\x04\x00\x3A\x00\x00\x00\x3B\x00\x00\x00\x01\x00\x00\x00\x20\x00\x04\x00\x3D\x00\x00\x00\x03\x00\x00\x00"
"\x07\x00\x00\x00\x3B\x00\x04\x00\x3D\x00\x00\x00\x3E\x00\x00\x00\x03\x00\x00\x00\x20\x00\x04\x00\x3F\x00\x00\x00\x01\x00\x00\x00"
"\x07\x00\x00\x00\x3B\x00\x04\x00\x3F\x00\x00\x00\x40\x00\x00\x00\x01\x00\x00\x00\x1E\x00\x03\x00\x42\x00\x00\x00\x07\x00\x00\x00"
"\x20\x00\x04\x00\x43\x00\x00\x00\x03\x00\x00\x00\x42\x00\x00\x00\x3B\x00\x04\x00\x43\x00\x00\x00\x44\x00\x00\x00\x03\x00\x00\x00"
"\x32\x00\x04\x00\x06\x00\x00\x00\x47\x00\x00\x00\x00\x00\x80\x43\x32\x00\x04\x00\x16\x00\x00\x00\x48\x00\x00\x00\x01\x01\x00\x00"
"\x32\x00\x04\x00\x16\x00\x00\x00\x49\x00\x00\x00\x15\x00\x00\x00\x1E\x00\x0C\x00\x4A\x00\x00\x00\x0D\x00\x00\x00\x0E\x00\x00\x00"
"\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x0E\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x12\x00\x00\x00\x12\x00\x00\x00"
"\x20\x00\x04\x00\x4B\x00\x00\x00\x02\x00\x00\x00\x4A\x00\x00\x00\x3B\x00\x04\x00\x4B\x00\x00\x00\x4C\x00\x00\x00\x02\x00\x00\x00"
"\x3B\x00\x04\x00\x3A\x00\x00\x00\x4D\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x1B\x00\x00\x00\x4E\x00\x00\x00\x01\x00\x00\x00"
"\x3B\x00\x04\x00\x1B\x00\x00\x00\x4F\x00\x00\x00\x01\x00\x00\x00\x3B\x00\x04\x00\x1B\x00\x00\x00\x50\x00\x00\x00\x01\x00\x00\x00"
"\x36\x00\x05\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xF8\x00\x02\x00\x05\x00\x00\x00\x3D\x00\x04\x00"
"\x12\x00\x00\x00\x3C\x00\x00\x00\x3B\x00\x00\x00\x3E\x00\x03\x00\x39\x00\x00\x00\x3C\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00"
"\x41\x00\x00\x00\x40\x00\x00\x00\x3E\x00\x03\x00\x3E\x00\x00\x00\x41\x00\x00\x00\x39\x00\x04\x00\x07\x00\x00\x00\x45\x00\x00\x00"
"\x09\x00\x00\x00\x41\x00\x05\x00\x3D\x00\x00\x00\x46\x00\x00\x00\x44\x00\x00\x00\x17\x00\x00\x00\x3E\x00\x03\x00\x46\x00\x00\x00"
"\x45\x00\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00\x36\x00\x05\x00\x07\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00"
"\xF8\x00\x02\x00\x0A\x00\x00\x00\x3B\x00\x04\x00\x0B\x00\x00\x00\x0C\x00\x00\x00\x07\x00\x00\x00\x41\x00\x05\x00\x18\x00\x00\x00"
"\x19\x00\x00\x00\x15\x00\x00\x00\x17\x00\x00\x00\x3D\x00\x04\x00\x0D\x00\x00\x00\x1A\x00\x00\x00\x19\x00\x00\x00\x3D\x00\x04\x00"
"\x0E\x00\x00\x00\x1D\x00\x00\x00\x1C\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x1F\x00\x00\x00\x1D\x00\x00\x00\x00\x00\x00\x00"
"\x51\x00\x05\x00\x06\x00\x00\x00\x20\x00\x00\x00\x1D\x00\x00\x00\x01\x00\x00\x00\x51\x00\x05\x00\x06\x00\x00\x00\x21\x00\x00\x00"
"\x1D\x00\x00\x00\x02\x00\x00\x00\x50\x00\x07\x00\x07\x00\x00\x00\x22\x00\x00\x00\x1F\x00\x00\x00\x20\x00\x00\x00\x21\x00\x00\x00"
"\x1E\x00\x00\x00\x91\x00\x05\x00\x07\x00\x00\x00\x23\x00\x00\x00\x1A\x00\x00\x00\x22\x00\x00\x00\x3E\x00\x03\x00\x0C\x00\x00\x00"
"\x23\x00\x00\x00\x41\x00\x05\x00\x26\x00\x00\x00\x27\x00\x00\x00\x0C\x00\x00\x00\x25\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00"
"\x28\x00\x00\x00\x27\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x29\x00\x00\x00\x28\x00\x00\x00\x24\x00\x00\x00\x41\x00\x05\x00"
"\x26\x00\x00\x00\x2A\x00\x00\x00\x0C\x00\x00\x00\x25\x00\x00\x00\x3E\x00\x03\x00\x2A\x00\x00\x00\x29\x00\x00\x00\x41\x00\x05\x00"
"\x26\x00\x00\x00\x2C\x00\x00\x00\x0C\x00\x00\x00\x2B\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x2D\x00\x00\x00\x2C\x00\x00\x00"
"\x41\x00\x05\x00\x26\x00\x00\x00\x2F\x00\x00\x00\x0C\x00\x00\x00\x2E\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x30\x00\x00\x00"
"\x2F\x00\x00\x00\x81\x00\x05\x00\x06\x00\x00\x00\x31\x00\x00\x00\x2D\x00\x00\x00\x30\x00\x00\x00\x88\x00\x05\x00\x06\x00\x00\x00"
"\x33\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x41\x00\x05\x00\x26\x00\x00\x00\x34\x00\x00\x00\x0C\x00\x00\x00\x2B\x00\x00\x00"
"\x3E\x00\x03\x00\x34\x00\x00\x00\x33\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x35\x00\x00\x00\x0C\x00\x00\x00\xFE\x00\x02\x00"
"\x35\x00\x00\x00\x38\x00\x01\x00\x03\x02\x23\x07\x00\x00\x01\x00\x06\x00\x08\x00\x7D\x00\x00\x00\x00\x00\x00\x00\x11\x00\x02\x00"
"\x01\x00\x00\x00\x0B\x00\x06\x00\x01\x00\x00\x00\x47\x4C\x53\x4C\x2E\x73\x74\x64\x2E\x34\x35\x30\x00\x00\x00\x00\x0E\x00\x03\x00"
"\x00\x00\x00\x00\x01\x00\x00\x00\x0F\x00\x09\x00\x04\x00\x00\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x27\x00\x00\x00"
"\x5F\x00\x00\x00\x6E\x00\x00\x00\x70\x00\x00\x00\x10\x00\x03\x00\x04\x00\x00\x00\x07\x00\x00\x00\x03\x00\x03\x00\x02\x00\x00\x00"
"\xC2\x01\x00\x00\x05\x00\x04\x00\x04\x00\x00\x00\x6D\x61\x69\x6E\x00\x00\x00\x00\x05\x00\x07\x00\x0B\x00\x00\x00\x66\x6F\x67\x34"
"\x61\x64\x64\x69\x74\x69\x76\x65\x28\x76\x66\x34\x3B\x00\x00\x00\x05\x00\x06\x00\x0A\x00\x00\x00\x72\x65\x67\x75\x6C\x61\x72\x63"
"\x6F\x6C\x6F\x75\x72\x00\x00\x00\x05\x00\x04\x00\x0E\x00\x00\x00\x5F\x46\x4F\x47\x00\x00\x00\x00\x05\x00\x03\x00\x18\x00\x00\x00"
"\x7A\x00\x00\x00\x05\x00\x05\x00\x1F\x00\x00\x00\x65\x6E\x74\x69\x74\x79\x62\x6C\x6F\x63\x6B\x00\x06\x00\x07\x00\x1F\x00\x00\x00"
"\x00\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x76\x69\x65\x77\x70\x72\x6F\x6A\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x01\x00\x00\x00"
"\x6D\x5F\x6D\x6F\x64\x65\x6C\x00\x06\x00\x06\x00\x1F\x00\x00\x00\x02\x00\x00\x00\x6D\x5F\x6D\x6F\x64\x65\x6C\x69\x6E\x76\x00\x00"
"\x06\x00\x06\x00\x1F\x00\x00\x00\x03\x00\x00\x00\x65\x5F\x65\x79\x65\x70\x6F\x73\x00\x00\x00\x00\x06\x00\x05\x00\x1F\x00\x00\x00"
"\x04\x00\x00\x00\x65\x5F\x74\x69\x6D\x65\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00\x05\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F"
"\x61\x6D\x62\x69\x65\x6E\x74\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x06\x00\x00\x00\x65\x70\x61\x64\x31\x00\x00\x00\x06\x00\x06\x00"
"\x1F\x00\x00\x00\x07\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x64\x69\x72\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x08\x00\x00\x00"
"\x65\x70\x61\x64\x32\x00\x00\x00\x06\x00\x06\x00\x1F\x00\x00\x00\x09\x00\x00\x00\x65\x5F\x6C\x69\x67\x68\x74\x5F\x6D\x75\x6C\x00"
"\x06\x00\x05\x00\x1F\x00\x00\x00\x0A\x00\x00\x00\x65\x70\x61\x64\x33\x00\x00\x00\x06\x00\x06\x00\x1F\x00\x00\x00\x0B\x00\x00\x00"
"\x65\x5F\x6C\x6D\x73\x63\x61\x6C\x65\x73\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00\x0C\x00\x00\x00\x65\x5F\x75\x70\x70\x65\x72\x63"
"\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x0D\x00\x00\x00\x65\x70\x61\x64\x34\x00\x00\x00\x06\x00\x07\x00"
"\x1F\x00\x00\x00\x0E\x00\x00\x00\x65\x5F\x6C\x6F\x77\x65\x72\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x1F\x00\x00\x00"
"\x0F\x00\x00\x00\x65\x70\x61\x64\x35\x00\x00\x00\x06\x00\x06\x00\x1F\x00\x00\x00\x10\x00\x00\x00\x65\x5F\x67\x6C\x6F\x77\x6D\x6F"
"\x64\x00\x00\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x11\x00\x00\x00\x65\x70\x61\x64\x36\x00\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00"
"\x12\x00\x00\x00\x65\x5F\x63\x6F\x6C\x6F\x75\x72\x69\x64\x65\x6E\x74\x00\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00\x13\x00\x00\x00"
"\x77\x5F\x66\x6F\x67\x63\x6F\x6C\x6F\x75\x72\x73\x00\x00\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00\x14\x00\x00\x00\x77\x5F\x66\x6F"
"\x67\x64\x65\x6E\x73\x69\x74\x79\x00\x00\x00\x00\x06\x00\x07\x00\x1F\x00\x00\x00\x15\x00\x00\x00\x77\x5F\x66\x6F\x67\x64\x65\x70"
"\x74\x68\x62\x69\x61\x73\x00\x00\x06\x00\x05\x00\x1F\x00\x00\x00\x16\x00\x00\x00\x65\x70\x61\x64\x37\x00\x00\x00\x05\x00\x03\x00"
"\x21\x00\x00\x00\x00\x00\x00\x00\x05\x00\x06\x00\x27\x00\x00\x00\x67\x6C\x5F\x46\x72\x61\x67\x43\x6F\x6F\x72\x64\x00\x00\x00\x00"
"\x05\x00\x07\x00\x38\x00\x00\x00\x5F\x63\x76\x61\x72\x5F\x72\x5F\x66\x6F\x67\x5F\x65\x78\x70\x32\x00\x00\x00\x00\x05\x00\x03\x00"
"\x3F\x00\x00\x00\x66\x61\x63\x00\x05\x00\x03\x00\x58\x00\x00\x00\x63\x6F\x6C\x00\x05\x00\x04\x00\x5C\x00\x00\x00\x73\x5F\x74\x30"
"\x00\x00\x00\x00\x05\x00\x03\x00\x5F\x00\x00\x00\x74\x63\x00\x00\x05\x00\x05\x00\x62\x00\x00\x00\x61\x72\x67\x5F\x4D\x41\x53\x4B"
"\x00\x00\x00\x00\x05\x00\x05\x00\x6E\x00\x00\x00\x6F\x75\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x05\x00\x03\x00\x70\x00\x00\x00"
"\x76\x63\x00\x00\x05\x00\x04\x00\x78\x00\x00\x00\x70\x61\x72\x61\x6D\x00\x00\x00\x05\x00\x05\x00\x7A\x00\x00\x00\x6C\x69\x67\x68"
"\x74\x62\x6C\x6F\x63\x6B\x00\x00\x06\x00\x07\x00\x7A\x00\x00\x00\x00\x00\x00\x00\x6C\x5F\x63\x75\x62\x65\x6D\x61\x74\x72\x69\x78"
"\x00\x00\x00\x00\x06\x00\x07\x00\x7A\x00\x00\x00\x01\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x70\x6F\x73\x69\x74\x69\x6F\x6E\x00"
"\x06\x00\x05\x00\x7A\x00\x00\x00\x02\x00\x00\x00\x6C\x70\x61\x64\x31\x00\x00\x00\x06\x00\x07\x00\x7A\x00\x00\x00\x03\x00\x00\x00"
"\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x00\x00\x00\x06\x00\x05\x00\x7A\x00\x00\x00\x04\x00\x00\x00\x6C\x70\x61\x64"
"\x32\x00\x00\x00\x06\x00\x08\x00\x7A\x00\x00\x00\x05\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x63\x6F\x6C\x6F\x75\x72\x73\x63\x61"
"\x6C\x65\x00\x00\x06\x00\x07\x00\x7A\x00\x00\x00\x06\x00\x00\x00\x6C\x5F\x6C\x69\x67\x68\x74\x72\x61\x64\x69\x75\x73\x00\x00\x00"
"\x06\x00\x07\x00\x7A\x00\x00\x00\x07\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x70\x72\x6F\x6A\x00\x06\x00\x08\x00"
"\x7A\x00\x00\x00\x08\x00\x00\x00\x6C\x5F\x73\x68\x61\x64\x6F\x77\x6D\x61\x70\x73\x63\x61\x6C\x65\x00\x00\x00\x00\x06\x00\x05\x00"
"\x7A\x00\x00\x00\x09\x00\x00\x00\x6C\x70\x61\x64\x33\x00\x00\x00\x05\x00\x03\x00\x7C\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00"
"\x0E\x00\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x47\x00\x04\x00\x1D\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00"
"\x1F\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00"
"\x48\x00\x05\x00\x1F\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x1F\x00\x00\x00\x01\x00\x00\x00"
"\x05\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00"
"\x01\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x04\x00\x1F\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00"
"\x1F\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00"
"\x10\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\xC0\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00"
"\x04\x00\x00\x00\x23\x00\x00\x00\xCC\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\xD0\x00\x00\x00"
"\x48\x00\x05\x00\x1F\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\xDC\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x07\x00\x00\x00"
"\x23\x00\x00\x00\xE0\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\xEC\x00\x00\x00\x48\x00\x05\x00"
"\x1F\x00\x00\x00\x09\x00\x00\x00\x23\x00\x00\x00\xF0\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x0A\x00\x00\x00\x23\x00\x00\x00"
"\xFC\x00\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x0B\x00\x00\x00\x23\x00\x00\x00\x00\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00"
"\x0C\x00\x00\x00\x23\x00\x00\x00\x40\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x0D\x00\x00\x00\x23\x00\x00\x00\x4C\x01\x00\x00"
"\x48\x00\x05\x00\x1F\x00\x00\x00\x0E\x00\x00\x00\x23\x00\x00\x00\x50\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x0F\x00\x00\x00"
"\x23\x00\x00\x00\x5C\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00\x60\x01\x00\x00\x48\x00\x05\x00"
"\x1F\x00\x00\x00\x11\x00\x00\x00\x23\x00\x00\x00\x6C\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x12\x00\x00\x00\x23\x00\x00\x00"
"\x70\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x13\x00\x00\x00\x23\x00\x00\x00\x80\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00"
"\x14\x00\x00\x00\x23\x00\x00\x00\x90\x01\x00\x00\x48\x00\x05\x00\x1F\x00\x00\x00\x15\x00\x00\x00\x23\x00\x00\x00\x94\x01\x00\x00"
"\x48\x00\x05\x00\x1F\x00\x00\x00\x16\x00\x00\x00\x23\x00\x00\x00\x98\x01\x00\x00\x47\x00\x03\x00\x1F\x00\x00\x00\x02\x00\x00\x00"
"\x47\x00\x04\x00\x21\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x21\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00"
"\x47\x00\x04\x00\x27\x00\x00\x00\x0B\x00\x00\x00\x0F\x00\x00\x00\x47\x00\x04\x00\x38\x00\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00"
"\x47\x00\x04\x00\x5C\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x5C\x00\x00\x00\x21\x00\x00\x00\x02\x00\x00\x00"
"\x47\x00\x04\x00\x5F\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x62\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00"
"\x47\x00\x04\x00\x6E\x00\x00\x00\x1E\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x70\x00\x00\x00\x1E\x00\x00\x00\x01\x00\x00\x00"
"\x48\x00\x04\x00\x7A\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00"
"\x00\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00"
"\x01\x00\x00\x00\x23\x00\x00\x00\x40\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x4C\x00\x00\x00"
"\x48\x00\x05\x00\x7A\x00\x00\x00\x03\x00\x00\x00\x23\x00\x00\x00\x50\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x04\x00\x00\x00"
"\x23\x00\x00\x00\x5C\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x05\x00\x00\x00\x23\x00\x00\x00\x60\x00\x00\x00\x48\x00\x05\x00"
"\x7A\x00\x00\x00\x06\x00\x00\x00\x23\x00\x00\x00\x6C\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x07\x00\x00\x00\x23\x00\x00\x00"
"\x70\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00\x08\x00\x00\x00\x23\x00\x00\x00\x80\x00\x00\x00\x48\x00\x05\x00\x7A\x00\x00\x00"
"\x09\x00\x00\x00\x23\x00\x00\x00\x88\x00\x00\x00\x47\x00\x03\x00\x7A\x00\x00\x00\x02\x00\x00\x00\x47\x00\x04\x00\x7C\x00\x00\x00"
"\x22\x00\x00\x00\x00\x00\x00\x00\x47\x00\x04\x00\x7C\x00\x00\x00\x21\x00\x00\x00\x01\x00\x00\x00\x13\x00\x02\x00\x02\x00\x00\x00"
"\x21\x00\x03\x00\x03\x00\x00\x00\x02\x00\x00\x00\x16\x00\x03\x00\x06\x00\x00\x00\x20\x00\x00\x00\x17\x00\x04\x00\x07\x00\x00\x00"
"\x06\x00\x00\x00\x04\x00\x00\x00\x20\x00\x04\x00\x08\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x21\x00\x04\x00\x09\x00\x00\x00"
"\x07\x00\x00\x00\x08\x00\x00\x00\x15\x00\x04\x00\x0D\x00\x00\x00\x20\x00\x00\x00\x01\x00\x00\x00\x32\x00\x04\x00\x0D\x00\x00\x00"
"\x0E\x00\x00\x00\x15\x00\x00\x00\x2B\x00\x04\x00\x0D\x00\x00\x00\x0F\x00\x00\x00\x00\x00\x00\x00\x14\x00\x02\x00\x10\x00\x00\x00"
"\x34\x00\x06\x00\x10\x00\x00\x00\x11\x00\x00\x00\xAB\x00\x00\x00\x0E\x00\x00\x00\x0F\x00\x00\x00\x34\x00\x05\x00\x10\x00\x00\x00"
"\x12\x00\x00\x00\xA8\x00\x00\x00\x11\x00\x00\x00\x20\x00\x04\x00\x17\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x18\x00\x04\x00"
"\x19\x00\x00\x00\x07\x00\x00\x00\x04\x00\x00\x00\x17\x00\x04\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x15\x00\x04\x00"
"\x1B\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x2B\x00\x04\x00\x1B\x00\x00\x00\x1C\x00\x00\x00\x04\x00\x00\x00\x1C\x00\x04\x00"
"\x1D\x00\x00\x00\x07\x00\x00\x00\x1C\x00\x00\x00\x17\x00\x04\x00\x1E\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1E\x00\x19\x00"
"\x1F\x00\x00\x00\x19\x00\x00\x00\x19\x00\x00\x00\x19\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00"
"\x1A\x00\x00\x00\x06\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x1D\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x1A\x00\x00\x00"
"\x06\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x1E\x00\x00\x00"
"\x20\x00\x04\x00\x20\x00\x00\x00\x02\x00\x00\x00\x1F\x00\x00\x00\x3B\x00\x04\x00\x20\x00\x00\x00\x21\x00\x00\x00\x02\x00\x00\x00"
"\x2B\x00\x04\x00\x0D\x00\x00\x00\x22\x00\x00\x00\x14\x00\x00\x00\x20\x00\x04\x00\x23\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00"
"\x20\x00\x04\x00\x26\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x26\x00\x00\x00\x27\x00\x00\x00\x01\x00\x00\x00"
"\x2B\x00\x04\x00\x1B\x00\x00\x00\x28\x00\x00\x00\x02\x00\x00\x00\x20\x00\x04\x00\x29\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00"
"\x2B\x00\x04\x00\x1B\x00\x00\x00\x2D\x00\x00\x00\x03\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00"
"\x2B\x00\x04\x00\x0D\x00\x00\x00\x33\x00\x00\x00\x15\x00\x00\x00\x32\x00\x04\x00\x0D\x00\x00\x00\x38\x00\x00\x00\x01\x01\x00\x00"
"\x34\x00\x06\x00\x10\x00\x00\x00\x39\x00\x00\x00\xAB\x00\x00\x00\x38\x00\x00\x00\x0F\x00\x00\x00\x2B\x00\x04\x00\x06\x00\x00\x00"
"\x41\x00\x00\x00\x3B\xAA\xB8\x3F\x2B\x00\x04\x00\x06\x00\x00\x00\x45\x00\x00\x00\x00\x00\x80\x3F\x2B\x00\x04\x00\x0D\x00\x00\x00"
"\x46\x00\x00\x00\x13\x00\x00\x00\x19\x00\x09\x00\x59\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x1B\x00\x03\x00\x5A\x00\x00\x00\x59\x00\x00\x00\x20\x00\x04\x00\x5B\x00\x00\x00"
"\x00\x00\x00\x00\x5A\x00\x00\x00\x3B\x00\x04\x00\x5B\x00\x00\x00\x5C\x00\x00\x00\x00\x00\x00\x00\x20\x00\x04\x00\x5E\x00\x00\x00"
"\x01\x00\x00\x00\x1E\x00\x00\x00\x3B\x00\x04\x00\x5E\x00\x00\x00\x5F\x00\x00\x00\x01\x00\x00\x00\x32\x00\x04\x00\x06\x00\x00\x00"
"\x62\x00\x00\x00\x00\x00\x80\x43\x20\x00\x04\x00\x6D\x00\x00\x00\x03\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x6D\x00\x00\x00"
"\x6E\x00\x00\x00\x03\x00\x00\x00\x3B\x00\x04\x00\x26\x00\x00\x00\x70\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x04\x00\x0D\x00\x00\x00"
"\x73\x00\x00\x00\x12\x00\x00\x00\x20\x00\x04\x00\x74\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x1E\x00\x0C\x00\x7A\x00\x00\x00"
"\x19\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x1A\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00"
"\x1E\x00\x00\x00\x1E\x00\x00\x00\x20\x00\x04\x00\x7B\x00\x00\x00\x02\x00\x00\x00\x7A\x00\x00\x00\x3B\x00\x04\x00\x7B\x00\x00\x00"
"\x7C\x00\x00\x00\x02\x00\x00\x00\x36\x00\x05\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\xF8\x00\x02\x00"
"\x05\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\x58\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x08\x00\x00\x00\x78\x00\x00\x00"
"\x07\x00\x00\x00\x3D\x00\x04\x00\x5A\x00\x00\x00\x5D\x00\x00\x00\x5C\x00\x00\x00\x3D\x00\x04\x00\x1E\x00\x00\x00\x60\x00\x00\x00"
"\x5F\x00\x00\x00\x57\x00\x05\x00\x07\x00\x00\x00\x61\x00\x00\x00\x5D\x00\x00\x00\x60\x00\x00\x00\x3E\x00\x03\x00\x58\x00\x00\x00"
"\x61\x00\x00\x00\xB6\x00\x05\x00\x10\x00\x00\x00\x63\x00\x00\x00\x62\x00\x00\x00\x31\x00\x00\x00\xF7\x00\x03\x00\x65\x00\x00\x00"
"\x00\x00\x00\x00\xFA\x00\x04\x00\x63\x00\x00\x00\x64\x00\x00\x00\x65\x00\x00\x00\xF8\x00\x02\x00\x64\x00\x00\x00\x41\x00\x05\x00"
"\x17\x00\x00\x00\x66\x00\x00\x00\x58\x00\x00\x00\x2D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x67\x00\x00\x00\x66\x00\x00\x00"
"\xB8\x00\x05\x00\x10\x00\x00\x00\x68\x00\x00\x00\x67\x00\x00\x00\x62\x00\x00\x00\xF9\x00\x02\x00\x65\x00\x00\x00\xF8\x00\x02\x00"
"\x65\x00\x00\x00\xF5\x00\x07\x00\x10\x00\x00\x00\x69\x00\x00\x00\x63\x00\x00\x00\x05\x00\x00\x00\x68\x00\x00\x00\x64\x00\x00\x00"
"\xF7\x00\x03\x00\x6B\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x69\x00\x00\x00\x6A\x00\x00\x00\x6B\x00\x00\x00\xF8\x00\x02\x00"
"\x6A\x00\x00\x00\xFC\x00\x01\x00\xF8\x00\x02\x00\x6B\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00\x6F\x00\x00\x00\x58\x00\x00\x00"
"\x3D\x00\x04\x00\x07\x00\x00\x00\x71\x00\x00\x00\x70\x00\x00\x00\x85\x00\x05\x00\x07\x00\x00\x00\x72\x00\x00\x00\x6F\x00\x00\x00"
"\x71\x00\x00\x00\x41\x00\x05\x00\x74\x00\x00\x00\x75\x00\x00\x00\x21\x00\x00\x00\x73\x00\x00\x00\x3D\x00\x04\x00\x07\x00\x00\x00"
"\x76\x00\x00\x00\x75\x00\x00\x00\x85\x00\x05\x00\x07\x00\x00\x00\x77\x00\x00\x00\x72\x00\x00\x00\x76\x00\x00\x00\x3E\x00\x03\x00"
"\x78\x00\x00\x00\x77\x00\x00\x00\x39\x00\x05\x00\x07\x00\x00\x00\x79\x00\x00\x00\x0B\x00\x00\x00\x78\x00\x00\x00\x3E\x00\x03\x00"
"\x6E\x00\x00\x00\x79\x00\x00\x00\xFD\x00\x01\x00\x38\x00\x01\x00\x36\x00\x05\x00\x07\x00\x00\x00\x0B\x00\x00\x00\x00\x00\x00\x00"
"\x09\x00\x00\x00\x37\x00\x03\x00\x08\x00\x00\x00\x0A\x00\x00\x00\xF8\x00\x02\x00\x0C\x00\x00\x00\x3B\x00\x04\x00\x17\x00\x00\x00"
"\x18\x00\x00\x00\x07\x00\x00\x00\x3B\x00\x04\x00\x17\x00\x00\x00\x3F\x00\x00\x00\x07\x00\x00\x00\xF7\x00\x03\x00\x14\x00\x00\x00"
"\x00\x00\x00\x00\xFA\x00\x04\x00\x12\x00\x00\x00\x13\x00\x00\x00\x14\x00\x00\x00\xF8\x00\x02\x00\x13\x00\x00\x00\x3D\x00\x04\x00"
"\x07\x00\x00\x00\x15\x00\x00\x00\x0A\x00\x00\x00\xFE\x00\x02\x00\x15\x00\x00\x00\xF8\x00\x02\x00\x14\x00\x00\x00\x41\x00\x05\x00"
"\x23\x00\x00\x00\x24\x00\x00\x00\x21\x00\x00\x00\x22\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x25\x00\x00\x00\x24\x00\x00\x00"
"\x41\x00\x05\x00\x29\x00\x00\x00\x2A\x00\x00\x00\x27\x00\x00\x00\x28\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x2B\x00\x00\x00"
"\x2A\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x2C\x00\x00\x00\x25\x00\x00\x00\x2B\x00\x00\x00\x41\x00\x05\x00\x29\x00\x00\x00"
"\x2E\x00\x00\x00\x27\x00\x00\x00\x2D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x2F\x00\x00\x00\x2E\x00\x00\x00\x88\x00\x05\x00"
"\x06\x00\x00\x00\x30\x00\x00\x00\x2C\x00\x00\x00\x2F\x00\x00\x00\x3E\x00\x03\x00\x18\x00\x00\x00\x30\x00\x00\x00\x3D\x00\x04\x00"
"\x06\x00\x00\x00\x32\x00\x00\x00\x18\x00\x00\x00\x41\x00\x05\x00\x23\x00\x00\x00\x34\x00\x00\x00\x21\x00\x00\x00\x33\x00\x00\x00"
"\x3D\x00\x04\x00\x06\x00\x00\x00\x35\x00\x00\x00\x34\x00\x00\x00\x83\x00\x05\x00\x06\x00\x00\x00\x36\x00\x00\x00\x32\x00\x00\x00"
"\x35\x00\x00\x00\x0C\x00\x07\x00\x06\x00\x00\x00\x37\x00\x00\x00\x01\x00\x00\x00\x28\x00\x00\x00\x31\x00\x00\x00\x36\x00\x00\x00"
"\x3E\x00\x03\x00\x18\x00\x00\x00\x37\x00\x00\x00\xF7\x00\x03\x00\x3B\x00\x00\x00\x00\x00\x00\x00\xFA\x00\x04\x00\x39\x00\x00\x00"
"\x3A\x00\x00\x00\x3B\x00\x00\x00\xF8\x00\x02\x00\x3A\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x3C\x00\x00\x00\x18\x00\x00\x00"
"\x3D\x00\x04\x00\x06\x00\x00\x00\x3D\x00\x00\x00\x18\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x3E\x00\x00\x00\x3D\x00\x00\x00"
"\x3C\x00\x00\x00\x3E\x00\x03\x00\x18\x00\x00\x00\x3E\x00\x00\x00\xF9\x00\x02\x00\x3B\x00\x00\x00\xF8\x00\x02\x00\x3B\x00\x00\x00"
"\x3D\x00\x04\x00\x06\x00\x00\x00\x40\x00\x00\x00\x18\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x42\x00\x00\x00\x40\x00\x00\x00"
"\x41\x00\x00\x00\x7F\x00\x04\x00\x06\x00\x00\x00\x43\x00\x00\x00\x42\x00\x00\x00\x0C\x00\x06\x00\x06\x00\x00\x00\x44\x00\x00\x00"
"\x01\x00\x00\x00\x1D\x00\x00\x00\x43\x00\x00\x00\x3E\x00\x03\x00\x3F\x00\x00\x00\x44\x00\x00\x00\x41\x00\x06\x00\x23\x00\x00\x00"
"\x47\x00\x00\x00\x21\x00\x00\x00\x46\x00\x00\x00\x2D\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x48\x00\x00\x00\x47\x00\x00\x00"
"\x83\x00\x05\x00\x06\x00\x00\x00\x49\x00\x00\x00\x45\x00\x00\x00\x48\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x4A\x00\x00\x00"
"\x3F\x00\x00\x00\x0C\x00\x08\x00\x06\x00\x00\x00\x4B\x00\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\x4A\x00\x00\x00\x31\x00\x00\x00"
"\x45\x00\x00\x00\x41\x00\x06\x00\x23\x00\x00\x00\x4C\x00\x00\x00\x21\x00\x00\x00\x46\x00\x00\x00\x2D\x00\x00\x00\x3D\x00\x04\x00"
"\x06\x00\x00\x00\x4D\x00\x00\x00\x4C\x00\x00\x00\x85\x00\x05\x00\x06\x00\x00\x00\x4E\x00\x00\x00\x4B\x00\x00\x00\x4D\x00\x00\x00"
"\x81\x00\x05\x00\x06\x00\x00\x00\x4F\x00\x00\x00\x49\x00\x00\x00\x4E\x00\x00\x00\x3E\x00\x03\x00\x3F\x00\x00\x00\x4F\x00\x00\x00"
"\x3D\x00\x04\x00\x07\x00\x00\x00\x50\x00\x00\x00\x0A\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x51\x00\x00\x00\x3F\x00\x00\x00"
"\x3D\x00\x04\x00\x06\x00\x00\x00\x52\x00\x00\x00\x3F\x00\x00\x00\x3D\x00\x04\x00\x06\x00\x00\x00\x53\x00\x00\x00\x3F\x00\x00\x00"
"\x50\x00\x07\x00\x07\x00\x00\x00\x54\x00\x00\x00\x51\x00\x00\x00\x52\x00\x00\x00\x53\x00\x00\x00\x45\x00\x00\x00\x85\x00\x05\x00"
"\x07\x00\x00\x00\x55\x00\x00\x00\x50\x00\x00\x00\x54\x00\x00\x00\xFE\x00\x02\x00\x55\x00\x00\x00\x38\x00\x01\x00"},
#endif
#ifdef GLQUAKE
{QR_OPENGL, 110, "defaultskin",
"!!ver 100 150\n"
@ -5563,7 +5839,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
#endif
#ifdef VKQUAKE
{QR_VULKAN, -1, "defaultwall",
"\xFF\x53\x50\x56\x01\x00\x00\x00\x9C\x1F\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\x2C\x00\x00\x00\xA6\x00\x00\x00\xD4\x00\x00\x00"
"\xFF\x53\x50\x56\x01\x00\x00\x00\x9C\x37\x00\x00\x01\x00\x00\x00\x2B\x00\x00\x00\x2C\x00\x00\x00\xA6\x00\x00\x00\xD4\x00\x00\x00"
"\x48\x16\x00\x00\x1C\x17\x00\x00\x20\x3D\x00\x00\x01\x00\x66\x31\x72\x5F\x67\x6C\x73\x6C\x5F\x6F\x66\x66\x73\x65\x74\x6D\x61\x70"
"\x70\x69\x6E\x67\x00\x00\x00\x00\x00\x01\x01\x66\x31\x72\x5F\x67\x6C\x73\x6C\x5F\x6F\x66\x66\x73\x65\x74\x6D\x61\x70\x70\x69\x6E"
"\x67\x5F\x73\x63\x61\x6C\x65\x00\x3D\x23\xD7\x0A\x01\x02\x66\x31\x67\x6C\x5F\x73\x70\x65\x63\x75\x6C\x61\x72\x00\x3E\x99\x99\x9A"

View file

@ -269,6 +269,7 @@ typedef struct shaderpass_s {
T_GEN_PALETTED, //texture's original paletted data (8bit)
T_GEN_REFLECTCUBE, //dpreflectcube
T_GEN_REFLECTMASK, //dpreflectcube mask
T_GEN_DISPLACEMENT, //displacement texture (probably half-float or something so higher precision than normalmap.a)
T_GEN_CURRENTRENDER,//copy the current screen to a texture, and draw that
@ -647,6 +648,7 @@ struct shader_s
SHADER_HASPALETTED = 1 << 28, //has a T_GEN_PALETTED pass
SHADER_HASCURRENTRENDER = 1 << 29, //has a $currentrender pass
SHADER_HASPORTAL = 1 << 30, //reflection image is actually a portal rather than a simple reflection (must be paired with SHADER_HASREFRACT)
SHADER_HASDISPLACEMENT = (int)(1u << 31)
} flags;
program_t *prog;

View file

@ -3505,43 +3505,50 @@ void SV_Snapshot_BuildQ1(client_t *client, packet_entities_t *pack, pvscamera_t
int pvsflags;
int limit;
int c, maxc = cameras?cameras->numents:0;
client_t *seat;
//this entity is watching from outside themselves. The client is tricked into thinking that they themselves are in the view ent, and a new dummy ent (the old them) must be spawned.
if (client->viewent && ISQWCLIENT(client))
if (clent && ISQWCLIENT(client))
{
for (seat = client; seat; seat = seat->controlled)
{
edict_t *clent = seat->edict;
if (!client->viewent)
continue;
//FIXME: this hack needs cleaning up
#ifdef DEPTHOPTIMISE
distances[0] = 0;
distances[pack->num_entities] = 0;
#endif
state = &pack->entities[pack->num_entities];
pack->num_entities++;
state = &pack->entities[pack->num_entities];
pack->num_entities++;
SV_Snapshot_BuildStateQ1(state, clent, client, pack);
SV_Snapshot_BuildStateQ1(state, clent, seat, pack);
state->number = client - svs.clients + 1;
state->number = seat - svs.clients + 1;
//yeah, I doubt anyone will need this
if (progstype == PROG_QW)
{
if ((int)clent->v->effects & QWEF_FLAG1)
//yeah, I doubt anyone will need this
if (progstype == PROG_QW)
{
memcpy(&pack->entities[pack->num_entities], state, sizeof(*state));
state = &pack->entities[pack->num_entities];
pack->num_entities++;
state->modelindex = SV_ModelIndex("progs/flag.mdl");
state->frame = 0;
state->number++; //yeek
state->skinnum = 0;
}
else if ((int)clent->v->effects & QWEF_FLAG2)
{
memcpy(&pack->entities[pack->num_entities], state, sizeof(*state));
state = &pack->entities[pack->num_entities];
pack->num_entities++;
state->modelindex = SV_ModelIndex("progs/flag.mdl");
state->frame = 0;
state->number++; //yeek
state->skinnum = 1;
if ((int)clent->v->effects & QWEF_FLAG1)
{
memcpy(&pack->entities[pack->num_entities], state, sizeof(*state));
state = &pack->entities[pack->num_entities];
pack->num_entities++;
state->modelindex = SV_ModelIndex("progs/flag.mdl");
state->frame = 0;
state->number++; //yeek
state->skinnum = 0;
}
else if ((int)clent->v->effects & QWEF_FLAG2)
{
memcpy(&pack->entities[pack->num_entities], state, sizeof(*state));
state = &pack->entities[pack->num_entities];
pack->num_entities++;
state->modelindex = SV_ModelIndex("progs/flag.mdl");
state->frame = 0;
state->number++; //yeek
state->skinnum = 1;
}
}
}
}

View file

@ -229,16 +229,18 @@ int generatevulkanblobs(struct blobheader *blob, size_t maxblobsize, const char
blob->defaulttextures |= 1u<<9;
else if (!strcasecmp(arg, "reflectmask"))
blob->defaulttextures |= 1u<<10;
else if (!strcasecmp(arg, "displacement"))
blob->defaulttextures |= 1u<<11;
//batch
else if (!strcasecmp(arg, "lightmap"))
blob->defaulttextures |= 1u<<11;
else if (!strcasecmp(arg, "deluxmap"))
blob->defaulttextures |= 1u<<12;
else if (!strcasecmp(arg, "deluxmap"))
blob->defaulttextures |= 1u<<13;
else if (!strcasecmp(arg, "lightmaps"))
blob->defaulttextures |= 1u<<11 | 1u<<13 | 1u<<14 | 1u<<15;
blob->defaulttextures |= 1u<<12 | 1u<<14 | 1u<<15 | 1u<<16;
else if (!strcasecmp(arg, "deluxmaps"))
blob->defaulttextures |= 1u<<12 | 1u<<16 | 1u<<17 | 1u<<18;
blob->defaulttextures |= 1u<<13 | 1u<<17 | 1u<<18 | 1u<<19;
//shader pass
else if (atoi(arg))
@ -269,6 +271,7 @@ int generatevulkanblobs(struct blobheader *blob, size_t maxblobsize, const char
"uniform sampler2D s_paletted;\n",
"uniform samplerCube s_reflectcube;\n",
"uniform sampler2D s_reflectmask;\n",
"uniform sampler2D s_displacement;\n",
//batch
"uniform sampler2D s_lightmap;\n#define s_lightmap0 s_lightmap\n",

View file

@ -0,0 +1,31 @@
!!permu FOG
!!samps 1
!!argf MASK=0
!!cvarb r_fog_exp2=true
//used by both particles and sprites.
//note the fog blending mode is all that differs from defaultadditivesprite
#include "sys/defs.h"
#include "sys/fog.h"
layout(location=0) varying vec2 tc;
layout(location=1) varying vec4 vc;
#ifdef VERTEX_SHADER
void main ()
{
tc = v_texcoord;
vc = v_colour;
gl_Position = ftetransform();
}
#endif
#ifdef FRAGMENT_SHADER
void main ()
{
vec4 col = texture2D(s_t0, tc);
if (arg_MASK!=0.0 && col.a < float(arg_MASK))
discard;
gl_FragColor = fog4additive(col * vc * e_colourident);
}
#endif

View file

@ -4,6 +4,7 @@
#include "glquake.h"
#include "gl_draw.h"
#include "shader.h"
#include "renderque.h"
//FIXME: instead of switching rendertargets and back, we should be using an alternative queue.
@ -1096,7 +1097,7 @@ qboolean VK_LoadBlob(program_t *prog, void *blobdata, const char *name)
for (cvardata = prog->cvardata; cvardata < prog->cvardata + prog->cvardatasize; )
{
unsigned char type = cvardata[2], size = cvardata[3]-'0';
char *cvarname;
const char *cvarname;
cvar_t *var;
cvardata += 4;
@ -1105,6 +1106,7 @@ qboolean VK_LoadBlob(program_t *prog, void *blobdata, const char *name)
if (type >= 'A' && type <= 'Z')
{ //args will be handled by the blob loader.
//the blob contains default values, overwrite them with the user's preferences...
VK_ShaderReadArgument(name, cvarname, type, size, cvardata);
}
else
@ -1173,6 +1175,7 @@ void VKBE_DeleteProg(program_t *prog)
//clear stuff out so that the caller doesn't get confused.
Z_Free(prog->cvardata);
prog->cvardata = NULL;
prog->pipelines = NULL;
prog->layout = VK_NULL_HANDLE;
prog->desclayout = VK_NULL_HANDLE;
@ -3164,14 +3167,16 @@ static qboolean BE_SetupMeshProgram(program_t *p, shaderpass_t *pass, unsigned i
BE_SetupTextureDescriptor(shaderstate.curtexnums->reflectcube, r_blackimage, set, descs, desc++, img++);
if (p->defaulttextures & (1u<<10))
BE_SetupTextureDescriptor(shaderstate.curtexnums->reflectmask, r_whiteimage, set, descs, desc++, img++);
if (p->defaulttextures & (1u<<11))
BE_SetupTextureDescriptor(shaderstate.curtexnums->displacement, r_whiteimage, set, descs, desc++, img++);
//batch
if (p->defaulttextures & (1u<<11))
if (p->defaulttextures & (1u<<12))
{
unsigned int lmi = shaderstate.curbatch->lightmap[0];
BE_SetupTextureDescriptor((lmi<numlightmaps)?lightmap[lmi]->lightmap_texture:NULL, r_whiteimage, set, descs, desc++, img++);
}
if (p->defaulttextures & (1u<<12))
if (p->defaulttextures & (1u<<13))
{
texid_t delux = NULL;
unsigned int lmi = shaderstate.curbatch->lightmap[0];
@ -3180,7 +3185,7 @@ static qboolean BE_SetupMeshProgram(program_t *p, shaderpass_t *pass, unsigned i
BE_SetupTextureDescriptor(delux, r_whiteimage, set, descs, desc++, img++);
}
#if MAXRLIGHTMAPS > 1
if (p->defaulttextures & ((1u<<13)|(1u<<14)|(1u<<15)))
if (p->defaulttextures & ((1u<<14)|(1u<<15)|(1u<<16)))
{
int lmi = shaderstate.curbatch->lightmap[1];
BE_SetupTextureDescriptor((lmi<numlightmaps)?lightmap[lmi]->lightmap_texture:NULL, r_whiteimage, set, descs, desc++, img++);
@ -3189,7 +3194,7 @@ static qboolean BE_SetupMeshProgram(program_t *p, shaderpass_t *pass, unsigned i
lmi = shaderstate.curbatch->lightmap[3];
BE_SetupTextureDescriptor((lmi<numlightmaps)?lightmap[lmi]->lightmap_texture:NULL, r_whiteimage, set, descs, desc++, img++);
}
if (p->defaulttextures & ((1u<<16)|(1u<<17)|(1u<<18)))
if (p->defaulttextures & ((1u<<17)|(1u<<18)|(1u<<19)))
{
int lmi = shaderstate.curbatch->lightmap[1];
if (lmi<numlightmaps && lightmap[lmi]->hasdeluxe)
@ -6303,6 +6308,10 @@ void VKBE_DrawWorld (batch_t **worldbatches)
}
R_RenderDlights ();
if (r_refdef.recurse)
RQ_RenderBatch();
else
RQ_RenderBatchClear();
shaderstate.identitylighting = 1;

View file

@ -103,6 +103,51 @@ do { \
#define DOBACKTRACE()
#endif
char *VK_VKErrorToString(VkResult err)
{
switch(err)
{
//positive codes
case VK_SUCCESS: return "VK_SUCCESS";
case VK_NOT_READY: return "VK_NOT_READY";
case VK_TIMEOUT: return "VK_TIMEOUT";
case VK_EVENT_SET: return "VK_EVENT_SET";
case VK_EVENT_RESET: return "VK_EVENT_RESET";
case VK_INCOMPLETE: return "VK_INCOMPLETE";
//core errors
case VK_ERROR_OUT_OF_HOST_MEMORY: return "VK_ERROR_OUT_OF_HOST_MEMORY";
case VK_ERROR_OUT_OF_DEVICE_MEMORY: return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
case VK_ERROR_INITIALIZATION_FAILED: return "VK_ERROR_INITIALIZATION_FAILED";
case VK_ERROR_DEVICE_LOST: return "VK_ERROR_DEVICE_LOST"; //by far the most common.
case VK_ERROR_MEMORY_MAP_FAILED: return "VK_ERROR_MEMORY_MAP_FAILED";
case VK_ERROR_LAYER_NOT_PRESENT: return "VK_ERROR_LAYER_NOT_PRESENT";
case VK_ERROR_EXTENSION_NOT_PRESENT: return "VK_ERROR_EXTENSION_NOT_PRESENT";
case VK_ERROR_FEATURE_NOT_PRESENT: return "VK_ERROR_FEATURE_NOT_PRESENT";
case VK_ERROR_INCOMPATIBLE_DRIVER: return "VK_ERROR_INCOMPATIBLE_DRIVER";
case VK_ERROR_TOO_MANY_OBJECTS: return "VK_ERROR_TOO_MANY_OBJECTS";
case VK_ERROR_FORMAT_NOT_SUPPORTED: return "VK_ERROR_FORMAT_NOT_SUPPORTED";
case VK_ERROR_FRAGMENTED_POOL: return "VK_ERROR_FRAGMENTED_POOL";
case VK_ERROR_SURFACE_LOST_KHR: return "VK_ERROR_SURFACE_LOST_KHR";
case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
case VK_SUBOPTIMAL_KHR: return "VK_SUBOPTIMAL_KHR";
case VK_ERROR_OUT_OF_DATE_KHR: return "VK_ERROR_OUT_OF_DATE_KHR";
case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
case VK_ERROR_VALIDATION_FAILED_EXT: return "VK_ERROR_VALIDATION_FAILED_EXT";
case VK_ERROR_INVALID_SHADER_NV: return "VK_ERROR_INVALID_SHADER_NV";
case VK_ERROR_OUT_OF_POOL_MEMORY_KHR: return "VK_ERROR_OUT_OF_POOL_MEMORY_KHR";
case VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR: return "VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR";
//irrelevant parts of the enum
case VK_RESULT_RANGE_SIZE:
case VK_RESULT_MAX_ENUM:
//default:
break;
}
return va("%d", (int)err);
}
#ifdef VK_EXT_debug_utils
static void DebugSetName(VkObjectType objtype, uint64_t handle, const char *name)
{
@ -1256,6 +1301,8 @@ vk_image_t VK_CreateTexture2DArray(uint32_t width, uint32_t height, uint32_t lay
case PTI_RGBA5551: format = VK_FORMAT_R5G5B5A1_UNORM_PACK16; break;
case PTI_ARGB1555: format = VK_FORMAT_A1R5G5B5_UNORM_PACK16; break;
//float formats
case PTI_R16F: format = VK_FORMAT_R16_SFLOAT; break;
case PTI_R32F: format = VK_FORMAT_R32_SFLOAT; break;
case PTI_RGBA16F: format = VK_FORMAT_R16G16B16A16_SFLOAT; break;
case PTI_RGBA32F: format = VK_FORMAT_R32G32B32A32_SFLOAT; break;
//weird formats
@ -3651,7 +3698,7 @@ void VK_DoPresent(struct vkframe *theframe)
err = vkAcquireNextImageKHR(vk.device, vk.swapchain, 0, vk.acquiresemaphores[vk.aquirelast%ACQUIRELIMIT], vk.acquirefences[vk.aquirelast%ACQUIRELIMIT], &vk.acquirebufferidx[vk.aquirelast%ACQUIRELIMIT]);
if (err)
{
Con_Printf("ERROR: vkAcquireNextImageKHR: %i\n", err);
Con_Printf("ERROR: vkAcquireNextImageKHR: %s\n", VK_VKErrorToString(err));
vk.neednewswapchain = true;
vk.devicelost |= (err == VK_ERROR_DEVICE_LOST);
}
@ -3715,7 +3762,8 @@ static void VK_Submit_DoWork(void)
err = vkQueueSubmit(subqueue, subcount, subinfo, waitfence);
if (err)
{
Con_Printf("ERROR: vkQueueSubmit: %i\n", err);
if (!vk.devicelost)
Con_Printf(CON_ERROR "ERROR: vkQueueSubmit: %s\n", VK_VKErrorToString(err));
errored = vk.neednewswapchain = true;
vk.devicelost |= (err==VK_ERROR_DEVICE_LOST);
}

View file

@ -196,8 +196,8 @@
#define vkallocationcb NULL
#ifdef _DEBUG
#define VkAssert(f) do {VkResult err = f; if (err) Sys_Error("%s == %i", #f, err); } while(0)
#define VkWarnAssert(f) do {VkResult err = f; if (err) Con_Printf("%s == %i\n", #f, err); } while(0)
#define VkAssert(f) do {VkResult err = f; if (err) Sys_Error("%s == %s", #f, VK_VKErrorToString(err)); } while(0)
#define VkWarnAssert(f) do {VkResult err = f; if (err) Con_Printf("%s == %s\n", #f, VK_VKErrorToString(err)); } while(0)
#else
#define VkAssert(f) f
#define VkWarnAssert(f) f
@ -481,6 +481,7 @@ void VKBE_RT_Begin(struct vk_rendertarg *targ);
void VKBE_RT_End(struct vk_rendertarg *targ);
void VKBE_RT_Destroy(struct vk_rendertarg *targ);
char *VK_VKErrorToString(VkResult err); //helper for converting vulkan error codes to strings, if we get something unexpected.
qboolean VK_AllocatePoolMemory(uint32_t pooltype, VkDeviceSize memsize, VkDeviceSize poolalignment, vk_poolmem_t *mem);
void VK_ReleasePoolMemory(vk_poolmem_t *mem);