diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index b357f246a..ce755cce0 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -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 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"); diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index bd1085f83..fec8032e8 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -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); diff --git a/engine/client/image.c b/engine/client/image.c index f90dafbb0..823585498 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -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: diff --git a/engine/client/merged.h b/engine/client/merged.h index 8fc080c08..88417d04c 100644 --- a/engine/client/merged.h +++ b/engine/client/merged.h @@ -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 diff --git a/engine/client/net_master.c b/engine/client/net_master.c index 5032433ab..3d1b09663 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -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 +} + diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 2ba22f00f..6badb3f72 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -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; diff --git a/engine/client/screen.h b/engine/client/screen.h index 0d91e8097..13d9a3fb0 100644 --- a/engine/client/screen.h +++ b/engine/client/screen.h @@ -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... diff --git a/engine/client/snd_al.c b/engine/client/snd_al.c index 5f2a6be11..860af245a 100644 --- a/engine/client/snd_al.c +++ b/engine/client/snd_al.c @@ -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 //output #include //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) { diff --git a/engine/common/cvar.c b/engine/common/cvar.c index 0643e7d0a..27e748f06 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -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; diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c index 5b9041206..46b63c212 100644 --- a/engine/common/net_wins.c +++ b/engine/common/net_wins.c @@ -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; diff --git a/engine/common/vm.h b/engine/common/vm.h index 43ca712d1..e0752e738 100644 --- a/engine/common/vm.h +++ b/engine/common/vm.h @@ -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); diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 811dba067..ac1d49579 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -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); diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 32fe75b9e..11df59237 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -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; diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 59a241d10..1adaa57ff 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -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) { diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index d696d5bf7..b379a06f5 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -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; diff --git a/engine/gl/gl_vidcommon.c b/engine/gl/gl_vidcommon.c index 609ae36f7..99d3a062d 100644 --- a/engine/gl/gl_vidcommon.c +++ b/engine/gl/gl_vidcommon.c @@ -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", diff --git a/engine/gl/glsupp.h b/engine/gl/glsupp.h index a26630a9d..4aeb8147a 100644 --- a/engine/gl/glsupp.h +++ b/engine/gl/glsupp.h @@ -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 diff --git a/engine/gl/r_bishaders.h b/engine/gl/r_bishaders.h index 6c0bdc890..21e13fc61 100644 --- a/engine/gl/r_bishaders.h +++ b/engine/gl/r_bishaders.h @@ -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" diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 4ca644326..133ce57be 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -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; diff --git a/engine/server/sv_ents.c b/engine/server/sv_ents.c index c254995dd..fc2bb5369 100644 --- a/engine/server/sv_ents.c +++ b/engine/server/sv_ents.c @@ -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; + } } } } diff --git a/engine/shaders/makevulkanblob.c b/engine/shaders/makevulkanblob.c index 4d4d8a192..e97976d30 100644 --- a/engine/shaders/makevulkanblob.c +++ b/engine/shaders/makevulkanblob.c @@ -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", diff --git a/engine/shaders/vulkan/defaultadditivesprite.glsl b/engine/shaders/vulkan/defaultadditivesprite.glsl new file mode 100644 index 000000000..9731000d8 --- /dev/null +++ b/engine/shaders/vulkan/defaultadditivesprite.glsl @@ -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 diff --git a/engine/vk/vk_backend.c b/engine/vk/vk_backend.c index ce9127840..8af6cc757 100644 --- a/engine/vk/vk_backend.c +++ b/engine/vk/vk_backend.c @@ -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((lmilightmap_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((lmilightmap_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((lmilightmap_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 (lmihasdeluxe) @@ -6303,6 +6308,10 @@ void VKBE_DrawWorld (batch_t **worldbatches) } R_RenderDlights (); + if (r_refdef.recurse) + RQ_RenderBatch(); + else + RQ_RenderBatchClear(); shaderstate.identitylighting = 1; diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index b1e10ed0a..81b50c382 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -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); } diff --git a/engine/vk/vkrenderer.h b/engine/vk/vkrenderer.h index 43820bc90..01cf5623e 100644 --- a/engine/vk/vkrenderer.h +++ b/engine/vk/vkrenderer.h @@ -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);